@hypersoniclabs/helix-cli 0.1.7 → 0.1.24-helix3.438

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1715) hide show
  1. package/README.md +631 -8
  2. package/assets/bridge/metahuman-eye-baked.png +0 -0
  3. package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
  4. package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
  5. package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
  6. package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
  7. package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
  8. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
  9. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
  10. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
  11. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
  12. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
  13. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
  14. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
  15. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
  16. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
  17. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
  18. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
  19. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
  20. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
  21. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
  22. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
  23. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
  24. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
  25. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
  26. package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
  27. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
  28. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
  29. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
  30. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
  31. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
  32. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
  33. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
  34. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
  35. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
  36. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
  37. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
  38. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
  39. package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
  40. package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
  41. package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
  42. package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
  43. package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
  44. package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
  45. package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
  46. package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
  47. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
  48. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
  49. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
  50. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
  51. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
  52. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
  53. package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
  54. package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
  55. package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
  56. package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
  57. package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
  58. package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
  59. package/bridge-recipes/sims4/README.md +43 -0
  60. package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
  61. package/bridge-recipes/unreal/character-customizer/README.md +58 -0
  62. package/bridge-recipes/unreal/character-customizer/all.json +13 -0
  63. package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
  64. package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
  65. package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
  66. package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
  67. package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
  68. package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
  69. package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
  70. package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
  71. package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
  72. package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
  73. package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
  74. package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
  75. package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
  76. package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
  77. package/bridge-recipes/unreal/character-customizer/top.json +6 -0
  78. package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
  79. package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
  80. package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
  81. package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
  82. package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
  83. package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
  84. package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
  85. package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
  86. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
  87. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
  88. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
  89. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
  90. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
  91. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
  92. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
  93. package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
  94. package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
  95. package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
  96. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
  97. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
  98. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
  99. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
  100. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
  101. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
  102. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
  103. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
  104. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
  105. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
  106. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
  107. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
  108. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
  109. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
  110. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
  111. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
  112. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
  113. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
  114. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
  115. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
  116. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
  117. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
  118. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
  119. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
  120. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
  121. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
  122. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
  123. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
  124. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
  125. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
  126. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
  127. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
  128. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
  129. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
  130. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
  131. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
  132. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
  133. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
  134. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
  135. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
  136. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
  137. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
  138. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
  139. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
  140. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
  141. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
  142. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
  143. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
  144. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
  145. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
  146. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
  147. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
  148. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
  149. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
  150. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
  151. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
  152. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
  153. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
  154. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
  155. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
  156. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
  157. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
  158. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
  159. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
  160. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
  161. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
  162. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
  163. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
  164. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
  165. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
  166. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
  167. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
  168. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
  169. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
  170. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
  171. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
  172. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
  173. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
  174. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
  175. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
  176. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
  177. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
  178. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
  179. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
  180. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
  181. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
  182. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
  183. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
  184. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
  185. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
  186. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
  187. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
  188. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
  189. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
  190. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
  191. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
  192. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
  193. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
  194. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
  195. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
  196. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
  197. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
  198. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
  199. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
  200. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
  201. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
  202. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
  203. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
  204. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
  205. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
  206. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
  207. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
  208. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
  209. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
  210. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
  211. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
  212. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
  213. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
  214. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
  215. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
  216. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
  217. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
  218. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
  219. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
  220. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
  221. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
  222. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
  223. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
  224. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
  225. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
  226. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
  227. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
  228. package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
  229. package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
  230. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
  231. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
  232. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
  233. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
  234. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
  235. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
  236. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
  237. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
  238. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
  239. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
  240. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
  241. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
  242. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
  243. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
  244. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
  245. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
  246. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
  247. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
  248. package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
  249. package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
  250. package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
  251. package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
  252. package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
  253. package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
  254. package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
  255. package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
  256. package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
  257. package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
  258. package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
  259. package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
  260. package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
  261. package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
  262. package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
  263. package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
  264. package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
  265. package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
  266. package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
  267. package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
  268. package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
  269. package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
  270. package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
  271. package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
  272. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
  273. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
  274. package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
  275. package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
  276. package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
  277. package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
  278. package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
  279. package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
  280. package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
  281. package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
  282. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
  283. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
  284. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
  285. package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
  286. package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
  287. package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
  288. package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
  289. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
  290. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
  291. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
  292. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
  293. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
  294. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
  295. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
  296. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
  297. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
  298. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
  299. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
  300. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
  301. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
  302. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
  303. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
  304. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
  305. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
  306. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
  307. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
  308. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
  309. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
  310. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
  311. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
  312. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
  313. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
  314. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
  315. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
  316. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
  317. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
  318. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
  319. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
  320. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
  321. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
  322. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
  323. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
  324. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
  325. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
  326. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
  327. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
  328. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
  329. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
  330. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
  331. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
  332. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
  333. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
  334. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
  335. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
  336. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
  337. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
  338. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
  339. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
  340. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
  341. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
  342. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
  343. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
  344. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
  345. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
  346. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
  347. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
  348. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
  349. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
  350. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
  351. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
  352. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
  353. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
  354. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
  355. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
  356. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
  357. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
  358. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
  359. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
  360. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
  361. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
  362. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
  363. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
  364. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
  365. package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
  366. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
  367. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
  368. package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
  369. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
  370. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
  371. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
  372. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
  373. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
  374. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
  375. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
  376. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
  377. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
  378. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
  379. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
  380. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
  381. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
  382. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
  383. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
  384. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
  385. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
  386. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
  387. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
  388. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
  389. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
  390. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
  391. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
  392. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
  393. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
  394. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
  395. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
  396. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
  397. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
  398. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
  399. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
  400. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
  401. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
  402. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
  403. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
  404. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
  405. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
  406. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
  407. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
  408. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
  409. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
  410. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
  411. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
  412. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
  413. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
  414. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
  415. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
  416. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
  417. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
  418. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
  419. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
  420. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
  421. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
  422. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
  423. package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
  424. package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
  425. package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
  426. package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
  427. package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
  428. package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
  429. package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
  430. package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
  431. package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
  432. package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
  433. package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
  434. package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
  435. package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
  436. package/dist/ability.d.ts +2 -2
  437. package/dist/ability.js +6 -5
  438. package/dist/ability.js.map +1 -1
  439. package/dist/achievement.d.ts +123 -0
  440. package/dist/achievement.js +400 -0
  441. package/dist/achievement.js.map +1 -0
  442. package/dist/api.d.ts +19 -1
  443. package/dist/api.js +80 -6
  444. package/dist/api.js.map +1 -1
  445. package/dist/assets.d.ts +595 -0
  446. package/dist/assets.js +1121 -0
  447. package/dist/assets.js.map +1 -0
  448. package/dist/audioCommand.d.ts +65 -0
  449. package/dist/audioCommand.js +181 -0
  450. package/dist/audioCommand.js.map +1 -0
  451. package/dist/bakeBodyRegionsCli.d.ts +19 -0
  452. package/dist/bakeBodyRegionsCli.js +25 -0
  453. package/dist/bakeBodyRegionsCli.js.map +1 -0
  454. package/dist/bakeLighting.d.ts +173 -0
  455. package/dist/bakeLighting.js +452 -0
  456. package/dist/bakeLighting.js.map +1 -0
  457. package/dist/bridge/bridge.testutil.d.ts +105 -0
  458. package/dist/bridge/bridge.testutil.js +259 -0
  459. package/dist/bridge/bridge.testutil.js.map +1 -0
  460. package/dist/bridge/characterAddon.d.ts +47 -0
  461. package/dist/bridge/characterAddon.js +146 -0
  462. package/dist/bridge/characterAddon.js.map +1 -0
  463. package/dist/bridge/detect.d.ts +4 -0
  464. package/dist/bridge/detect.js +154 -0
  465. package/dist/bridge/detect.js.map +1 -0
  466. package/dist/bridge/execute.d.ts +3 -0
  467. package/dist/bridge/execute.js +206 -0
  468. package/dist/bridge/execute.js.map +1 -0
  469. package/dist/bridge/glb.d.ts +60 -0
  470. package/dist/bridge/glb.js +81 -0
  471. package/dist/bridge/glb.js.map +1 -0
  472. package/dist/bridge/hash.d.ts +6 -0
  473. package/dist/bridge/hash.js +40 -0
  474. package/dist/bridge/hash.js.map +1 -0
  475. package/dist/bridge/index.d.ts +11 -0
  476. package/dist/bridge/index.js +28 -0
  477. package/dist/bridge/index.js.map +1 -0
  478. package/dist/bridge/internal/artifacts.d.ts +5 -0
  479. package/dist/bridge/internal/artifacts.js +31 -0
  480. package/dist/bridge/internal/artifacts.js.map +1 -0
  481. package/dist/bridge/internal/builtInExecution.d.ts +4 -0
  482. package/dist/bridge/internal/builtInExecution.js +514 -0
  483. package/dist/bridge/internal/builtInExecution.js.map +1 -0
  484. package/dist/bridge/internal/externalExecution.d.ts +12 -0
  485. package/dist/bridge/internal/externalExecution.js +261 -0
  486. package/dist/bridge/internal/externalExecution.js.map +1 -0
  487. package/dist/bridge/internal/outputReservation.d.ts +13 -0
  488. package/dist/bridge/internal/outputReservation.js +151 -0
  489. package/dist/bridge/internal/outputReservation.js.map +1 -0
  490. package/dist/bridge/internal/snapshots.d.ts +32 -0
  491. package/dist/bridge/internal/snapshots.js +562 -0
  492. package/dist/bridge/internal/snapshots.js.map +1 -0
  493. package/dist/bridge/management.d.ts +40 -0
  494. package/dist/bridge/management.js +333 -0
  495. package/dist/bridge/management.js.map +1 -0
  496. package/dist/bridge/manifest.d.ts +8 -0
  497. package/dist/bridge/manifest.js +192 -0
  498. package/dist/bridge/manifest.js.map +1 -0
  499. package/dist/bridge/metahuman.d.ts +26 -0
  500. package/dist/bridge/metahuman.js +332 -0
  501. package/dist/bridge/metahuman.js.map +1 -0
  502. package/dist/bridge/planner.d.ts +9 -0
  503. package/dist/bridge/planner.js +246 -0
  504. package/dist/bridge/planner.js.map +1 -0
  505. package/dist/bridge/plugins.d.ts +17 -0
  506. package/dist/bridge/plugins.js +307 -0
  507. package/dist/bridge/plugins.js.map +1 -0
  508. package/dist/bridge/resolution.d.ts +8 -0
  509. package/dist/bridge/resolution.js +55 -0
  510. package/dist/bridge/resolution.js.map +1 -0
  511. package/dist/bridge/types.d.ts +247 -0
  512. package/dist/bridge/types.js +60 -0
  513. package/dist/bridge/types.js.map +1 -0
  514. package/dist/bridge/validate.d.ts +12 -0
  515. package/dist/bridge/validate.js +370 -0
  516. package/dist/bridge/validate.js.map +1 -0
  517. package/dist/bridge/zipSource.d.ts +27 -0
  518. package/dist/bridge/zipSource.js +90 -0
  519. package/dist/bridge/zipSource.js.map +1 -0
  520. package/dist/browser/hostSlots.d.ts +57 -0
  521. package/dist/browser/hostSlots.js +371 -0
  522. package/dist/browser/hostSlots.js.map +1 -0
  523. package/dist/browser/launch.d.ts +25 -0
  524. package/dist/browser/launch.js +74 -0
  525. package/dist/browser/launch.js.map +1 -0
  526. package/dist/browser/nonSystemChrome.d.ts +15 -0
  527. package/dist/browser/nonSystemChrome.js +91 -0
  528. package/dist/browser/nonSystemChrome.js.map +1 -0
  529. package/dist/builds/index.d.ts +54 -0
  530. package/dist/builds/index.js +215 -0
  531. package/dist/builds/index.js.map +1 -0
  532. package/dist/bundle.d.ts +35 -2
  533. package/dist/bundle.js +437 -20
  534. package/dist/bundle.js.map +1 -1
  535. package/dist/canary/cli.d.ts +17 -0
  536. package/dist/canary/cli.js +95 -0
  537. package/dist/canary/cli.js.map +1 -0
  538. package/dist/canary/index.d.ts +4 -0
  539. package/dist/canary/index.js +21 -0
  540. package/dist/canary/index.js.map +1 -0
  541. package/dist/canary/inventory.d.ts +46 -0
  542. package/dist/canary/inventory.js +499 -0
  543. package/dist/canary/inventory.js.map +1 -0
  544. package/dist/canary/pacifica.d.ts +51 -0
  545. package/dist/canary/pacifica.js +247 -0
  546. package/dist/canary/pacifica.js.map +1 -0
  547. package/dist/canary/plan.d.ts +115 -0
  548. package/dist/canary/plan.js +479 -0
  549. package/dist/canary/plan.js.map +1 -0
  550. package/dist/character/addonPushOut.d.ts +66 -0
  551. package/dist/character/addonPushOut.js +211 -0
  552. package/dist/character/addonPushOut.js.map +1 -0
  553. package/dist/character/avatarPreflight.d.ts +92 -0
  554. package/dist/character/avatarPreflight.js +261 -0
  555. package/dist/character/avatarPreflight.js.map +1 -0
  556. package/dist/character/bakeBodyRegions.d.ts +80 -0
  557. package/dist/character/bakeBodyRegions.js +190 -0
  558. package/dist/character/bakeBodyRegions.js.map +1 -0
  559. package/dist/character/baseColorGuard.d.ts +62 -0
  560. package/dist/character/baseColorGuard.js +141 -0
  561. package/dist/character/baseColorGuard.js.map +1 -0
  562. package/dist/character/bodyGeometryGuard.d.ts +243 -0
  563. package/dist/character/bodyGeometryGuard.js +417 -0
  564. package/dist/character/bodyGeometryGuard.js.map +1 -0
  565. package/dist/character/bodyRegionHide.d.ts +57 -0
  566. package/dist/character/bodyRegionHide.js +97 -0
  567. package/dist/character/bodyRegionHide.js.map +1 -0
  568. package/dist/character/composeBaseMale.d.ts +25 -0
  569. package/dist/character/composeBaseMale.js +712 -0
  570. package/dist/character/composeBaseMale.js.map +1 -0
  571. package/dist/character/esm.js +3 -1
  572. package/dist/character/esm.js.map +1 -1
  573. package/dist/character/faceManifest.d.ts +53 -0
  574. package/dist/character/faceManifest.js +256 -0
  575. package/dist/character/faceManifest.js.map +1 -0
  576. package/dist/character/fbx.d.ts +70 -0
  577. package/dist/character/fbx.js +396 -0
  578. package/dist/character/fbx.js.map +1 -0
  579. package/dist/character/fitGarmentFile.d.ts +39 -0
  580. package/dist/character/fitGarmentFile.js +53 -0
  581. package/dist/character/fitGarmentFile.js.map +1 -0
  582. package/dist/character/helixPalette.d.ts +68 -0
  583. package/dist/character/helixPalette.js +183 -0
  584. package/dist/character/helixPalette.js.map +1 -0
  585. package/dist/character/hideCoverage.d.ts +135 -0
  586. package/dist/character/hideCoverage.js +450 -0
  587. package/dist/character/hideCoverage.js.map +1 -0
  588. package/dist/character/imageLimits.d.ts +3 -0
  589. package/dist/character/imageLimits.js +7 -0
  590. package/dist/character/imageLimits.js.map +1 -0
  591. package/dist/character/importCharacter.d.ts +188 -10
  592. package/dist/character/importCharacter.js +854 -76
  593. package/dist/character/importCharacter.js.map +1 -1
  594. package/dist/character/importTrust.d.ts +11 -0
  595. package/dist/character/importTrust.js +56 -0
  596. package/dist/character/importTrust.js.map +1 -0
  597. package/dist/character/ktx2Decode.d.ts +11 -0
  598. package/dist/character/ktx2Decode.js +87 -0
  599. package/dist/character/ktx2Decode.js.map +1 -0
  600. package/dist/character/mat4.d.ts +7 -0
  601. package/dist/character/mat4.js +25 -2
  602. package/dist/character/mat4.js.map +1 -1
  603. package/dist/character/meshyToHelixMap.d.ts +14 -0
  604. package/dist/character/meshyToHelixMap.js +155 -3
  605. package/dist/character/meshyToHelixMap.js.map +1 -1
  606. package/dist/character/metahumanToHelixMap.d.ts +2 -0
  607. package/dist/character/metahumanToHelixMap.js +34 -0
  608. package/dist/character/metahumanToHelixMap.js.map +1 -0
  609. package/dist/character/normalMapGuard.d.ts +59 -0
  610. package/dist/character/normalMapGuard.js +139 -0
  611. package/dist/character/normalMapGuard.js.map +1 -0
  612. package/dist/character/quat.js +2 -2
  613. package/dist/character/quat.js.map +1 -1
  614. package/dist/character/reframeSkeletonFile.d.ts +19 -0
  615. package/dist/character/reframeSkeletonFile.js +45 -0
  616. package/dist/character/reframeSkeletonFile.js.map +1 -0
  617. package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
  618. package/dist/character/repairLodSkeletonsFile.js +49 -0
  619. package/dist/character/repairLodSkeletonsFile.js.map +1 -0
  620. package/dist/character/restFrameGuard.d.ts +52 -0
  621. package/dist/character/restFrameGuard.js +90 -0
  622. package/dist/character/restFrameGuard.js.map +1 -0
  623. package/dist/character/slotBudgets.d.ts +37 -0
  624. package/dist/character/slotBudgets.generated.d.ts +15 -0
  625. package/dist/character/slotBudgets.generated.js +110 -0
  626. package/dist/character/slotBudgets.generated.js.map +1 -0
  627. package/dist/character/slotBudgets.js +45 -0
  628. package/dist/character/slotBudgets.js.map +1 -0
  629. package/dist/character/stages/atlasMaterials.d.ts +53 -0
  630. package/dist/character/stages/atlasMaterials.js +246 -0
  631. package/dist/character/stages/atlasMaterials.js.map +1 -0
  632. package/dist/character/stages/bakeTexture.d.ts +28 -7
  633. package/dist/character/stages/bakeTexture.js +586 -108
  634. package/dist/character/stages/bakeTexture.js.map +1 -1
  635. package/dist/character/stages/conform.d.ts +54 -9
  636. package/dist/character/stages/conform.js +686 -113
  637. package/dist/character/stages/conform.js.map +1 -1
  638. package/dist/character/stages/earClearance.d.ts +105 -0
  639. package/dist/character/stages/earClearance.js +480 -0
  640. package/dist/character/stages/earClearance.js.map +1 -0
  641. package/dist/character/stages/faceRegion.d.ts +55 -0
  642. package/dist/character/stages/faceRegion.js +183 -0
  643. package/dist/character/stages/faceRegion.js.map +1 -0
  644. package/dist/character/stages/firstPersonHide.d.ts +42 -0
  645. package/dist/character/stages/firstPersonHide.js +140 -0
  646. package/dist/character/stages/firstPersonHide.js.map +1 -0
  647. package/dist/character/stages/joinPerMesh.d.ts +18 -0
  648. package/dist/character/stages/joinPerMesh.js +46 -0
  649. package/dist/character/stages/joinPerMesh.js.map +1 -0
  650. package/dist/character/stages/ktx2.d.ts +6 -4
  651. package/dist/character/stages/ktx2.js +81 -29
  652. package/dist/character/stages/ktx2.js.map +1 -1
  653. package/dist/character/stages/limbBridge.d.ts +114 -0
  654. package/dist/character/stages/limbBridge.js +1286 -0
  655. package/dist/character/stages/limbBridge.js.map +1 -0
  656. package/dist/character/stages/mergeLods.d.ts +19 -0
  657. package/dist/character/stages/mergeLods.js +58 -2
  658. package/dist/character/stages/mergeLods.js.map +1 -1
  659. package/dist/character/stages/poseAwareFit.d.ts +192 -0
  660. package/dist/character/stages/poseAwareFit.js +417 -0
  661. package/dist/character/stages/poseAwareFit.js.map +1 -0
  662. package/dist/character/stages/poseFit/math.d.ts +141 -0
  663. package/dist/character/stages/poseFit/math.js +514 -0
  664. package/dist/character/stages/poseFit/math.js.map +1 -0
  665. package/dist/character/stages/poseFit/measure.d.ts +88 -0
  666. package/dist/character/stages/poseFit/measure.js +148 -0
  667. package/dist/character/stages/poseFit/measure.js.map +1 -0
  668. package/dist/character/stages/poseFit/model.d.ts +46 -0
  669. package/dist/character/stages/poseFit/model.js +147 -0
  670. package/dist/character/stages/poseFit/model.js.map +1 -0
  671. package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
  672. package/dist/character/stages/poseFit/offsetField.js +249 -0
  673. package/dist/character/stages/poseFit/offsetField.js.map +1 -0
  674. package/dist/character/stages/poseFit/posing.d.ts +52 -0
  675. package/dist/character/stages/poseFit/posing.js +330 -0
  676. package/dist/character/stages/poseFit/posing.js.map +1 -0
  677. package/dist/character/stages/poseFit/testRig.d.ts +31 -0
  678. package/dist/character/stages/poseFit/testRig.js +85 -0
  679. package/dist/character/stages/poseFit/testRig.js.map +1 -0
  680. package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
  681. package/dist/character/stages/reframeSkeletonToHost.js +111 -0
  682. package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
  683. package/dist/character/stages/report.js +0 -2
  684. package/dist/character/stages/report.js.map +1 -1
  685. package/dist/character/stages/resizeTextures.js +4 -4
  686. package/dist/character/stages/resizeTextures.js.map +1 -1
  687. package/dist/character/stages/retarget.d.ts +26 -2
  688. package/dist/character/stages/retarget.js +52 -4
  689. package/dist/character/stages/retarget.js.map +1 -1
  690. package/dist/character/stages/retargetClip.d.ts +6 -2
  691. package/dist/character/stages/retargetClip.js +109 -17
  692. package/dist/character/stages/retargetClip.js.map +1 -1
  693. package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
  694. package/dist/character/stages/sanitizeMaterials.js +136 -0
  695. package/dist/character/stages/sanitizeMaterials.js.map +1 -0
  696. package/dist/character/stages/simplifyMesh.js +6 -3
  697. package/dist/character/stages/simplifyMesh.js.map +1 -1
  698. package/dist/character/stages/splitFacePrimitive.js +0 -2
  699. package/dist/character/stages/splitFacePrimitive.js.map +1 -1
  700. package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
  701. package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
  702. package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
  703. package/dist/character/stages/unifyMaterial.d.ts +66 -0
  704. package/dist/character/stages/unifyMaterial.js +136 -0
  705. package/dist/character/stages/unifyMaterial.js.map +1 -0
  706. package/dist/character/stages/vrmDynamics.d.ts +144 -0
  707. package/dist/character/stages/vrmDynamics.js +421 -0
  708. package/dist/character/stages/vrmDynamics.js.map +1 -0
  709. package/dist/character/stages/vrmFace.d.ts +82 -0
  710. package/dist/character/stages/vrmFace.js +280 -0
  711. package/dist/character/stages/vrmFace.js.map +1 -0
  712. package/dist/character/stages/weldedSimplify.d.ts +15 -1
  713. package/dist/character/stages/weldedSimplify.js +90 -9
  714. package/dist/character/stages/weldedSimplify.js.map +1 -1
  715. package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
  716. package/dist/character/testutil/meshyBridgeFixture.js +219 -0
  717. package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
  718. package/dist/character/testutil/meshyHead.d.ts +19 -0
  719. package/dist/character/testutil/meshyHead.js +99 -0
  720. package/dist/character/testutil/meshyHead.js.map +1 -0
  721. package/dist/character/testutil/meshyRig.d.ts +17 -0
  722. package/dist/character/testutil/meshyRig.js +117 -0
  723. package/dist/character/testutil/meshyRig.js.map +1 -0
  724. package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
  725. package/dist/character/testutil/slotBudgetExpectations.js +21 -0
  726. package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
  727. package/dist/character/testutil/syntheticRig.d.ts +12 -1
  728. package/dist/character/testutil/syntheticRig.js +88 -3
  729. package/dist/character/testutil/syntheticRig.js.map +1 -1
  730. package/dist/character/unrealMaterialSidecar.d.ts +94 -0
  731. package/dist/character/unrealMaterialSidecar.js +879 -0
  732. package/dist/character/unrealMaterialSidecar.js.map +1 -0
  733. package/dist/character/untrustedSource.d.ts +54 -0
  734. package/dist/character/untrustedSource.js +181 -0
  735. package/dist/character/untrustedSource.js.map +1 -0
  736. package/dist/character/vrmCharacter.d.ts +156 -0
  737. package/dist/character/vrmCharacter.js +678 -0
  738. package/dist/character/vrmCharacter.js.map +1 -0
  739. package/dist/config.d.ts +5 -0
  740. package/dist/config.js +72 -24
  741. package/dist/config.js.map +1 -1
  742. package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
  743. package/dist/continuum/adminPackagePinCommand.js +46 -0
  744. package/dist/continuum/adminPackagePinCommand.js.map +1 -0
  745. package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
  746. package/dist/continuum/adminPackagePublishCommand.js +22 -0
  747. package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
  748. package/dist/continuum/authoring.d.ts +52 -0
  749. package/dist/continuum/authoring.js +143 -0
  750. package/dist/continuum/authoring.js.map +1 -0
  751. package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
  752. package/dist/continuum/characterMigrationGenerator.js +242 -0
  753. package/dist/continuum/characterMigrationGenerator.js.map +1 -0
  754. package/dist/continuum/cli.d.ts +69 -0
  755. package/dist/continuum/cli.js +145 -0
  756. package/dist/continuum/cli.js.map +1 -0
  757. package/dist/continuum/cliAuthority.d.ts +17 -0
  758. package/dist/continuum/cliAuthority.js +28 -0
  759. package/dist/continuum/cliAuthority.js.map +1 -0
  760. package/dist/continuum/client.d.ts +103 -0
  761. package/dist/continuum/client.js +190 -0
  762. package/dist/continuum/client.js.map +1 -0
  763. package/dist/continuum/homeScenePackage.d.ts +159 -0
  764. package/dist/continuum/homeScenePackage.js +267 -0
  765. package/dist/continuum/homeScenePackage.js.map +1 -0
  766. package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
  767. package/dist/continuum/homeScenePackageCommand.js +107 -0
  768. package/dist/continuum/homeScenePackageCommand.js.map +1 -0
  769. package/dist/continuum/identity.d.ts +4 -0
  770. package/dist/continuum/identity.js +20 -0
  771. package/dist/continuum/identity.js.map +1 -0
  772. package/dist/continuum/index.d.ts +11 -0
  773. package/dist/continuum/index.js +28 -0
  774. package/dist/continuum/index.js.map +1 -0
  775. package/dist/continuum/missingNormals.d.ts +48 -0
  776. package/dist/continuum/missingNormals.js +99 -0
  777. package/dist/continuum/missingNormals.js.map +1 -0
  778. package/dist/continuum/objectUpload.d.ts +64 -0
  779. package/dist/continuum/objectUpload.js +375 -0
  780. package/dist/continuum/objectUpload.js.map +1 -0
  781. package/dist/continuum/pull.d.ts +22 -0
  782. package/dist/continuum/pull.js +47 -0
  783. package/dist/continuum/pull.js.map +1 -0
  784. package/dist/continuum/sourceBundle.d.ts +18 -0
  785. package/dist/continuum/sourceBundle.js +160 -0
  786. package/dist/continuum/sourceBundle.js.map +1 -0
  787. package/dist/continuum/state.d.ts +41 -0
  788. package/dist/continuum/state.js +198 -0
  789. package/dist/continuum/state.js.map +1 -0
  790. package/dist/continuum/types.d.ts +156 -0
  791. package/dist/continuum/types.js +6 -0
  792. package/dist/continuum/types.js.map +1 -0
  793. package/dist/continuum/workflow.d.ts +62 -0
  794. package/dist/continuum/workflow.js +592 -0
  795. package/dist/continuum/workflow.js.map +1 -0
  796. package/dist/cs2/areas.d.ts +41 -0
  797. package/dist/cs2/areas.js +82 -0
  798. package/dist/cs2/areas.js.map +1 -0
  799. package/dist/cs2/binary.d.ts +10 -0
  800. package/dist/cs2/binary.js +59 -0
  801. package/dist/cs2/binary.js.map +1 -0
  802. package/dist/cs2/cityLegacy.d.ts +29 -0
  803. package/dist/cs2/cityLegacy.js +48 -0
  804. package/dist/cs2/cityLegacy.js.map +1 -0
  805. package/dist/cs2/convert/areas.d.ts +32 -0
  806. package/dist/cs2/convert/areas.js +96 -0
  807. package/dist/cs2/convert/areas.js.map +1 -0
  808. package/dist/cs2/convert/glb.d.ts +48 -0
  809. package/dist/cs2/convert/glb.js +178 -0
  810. package/dist/cs2/convert/glb.js.map +1 -0
  811. package/dist/cs2/convert/markings.d.ts +96 -0
  812. package/dist/cs2/convert/markings.js +329 -0
  813. package/dist/cs2/convert/markings.js.map +1 -0
  814. package/dist/cs2/convert/nodeSeams.d.ts +20 -0
  815. package/dist/cs2/convert/nodeSeams.js +164 -0
  816. package/dist/cs2/convert/nodeSeams.js.map +1 -0
  817. package/dist/cs2/convert/roadBake.d.ts +112 -0
  818. package/dist/cs2/convert/roadBake.js +290 -0
  819. package/dist/cs2/convert/roadBake.js.map +1 -0
  820. package/dist/cs2/convert/roads.d.ts +110 -0
  821. package/dist/cs2/convert/roads.js +419 -0
  822. package/dist/cs2/convert/roads.js.map +1 -0
  823. package/dist/cs2/convert/terrain.d.ts +67 -0
  824. package/dist/cs2/convert/terrain.js +141 -0
  825. package/dist/cs2/convert/terrain.js.map +1 -0
  826. package/dist/cs2/convert/terrainConform.d.ts +58 -0
  827. package/dist/cs2/convert/terrainConform.js +284 -0
  828. package/dist/cs2/convert/terrainConform.js.map +1 -0
  829. package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
  830. package/dist/cs2/convert/treeRoadClearance.js +78 -0
  831. package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
  832. package/dist/cs2/convert/trees.d.ts +33 -0
  833. package/dist/cs2/convert/trees.js +68 -0
  834. package/dist/cs2/convert/trees.js.map +1 -0
  835. package/dist/cs2/csm2.d.ts +58 -0
  836. package/dist/cs2/csm2.js +188 -0
  837. package/dist/cs2/csm2.js.map +1 -0
  838. package/dist/cs2/fixtures.d.ts +5 -0
  839. package/dist/cs2/fixtures.js +15 -0
  840. package/dist/cs2/fixtures.js.map +1 -0
  841. package/dist/cs2/impostors.d.ts +31 -0
  842. package/dist/cs2/impostors.js +42 -0
  843. package/dist/cs2/impostors.js.map +1 -0
  844. package/dist/cs2/index.d.ts +22 -0
  845. package/dist/cs2/index.js +191 -0
  846. package/dist/cs2/index.js.map +1 -0
  847. package/dist/cs2/inspect.d.ts +81 -0
  848. package/dist/cs2/inspect.js +181 -0
  849. package/dist/cs2/inspect.js.map +1 -0
  850. package/dist/cs2/lods.d.ts +22 -0
  851. package/dist/cs2/lods.js +136 -0
  852. package/dist/cs2/lods.js.map +1 -0
  853. package/dist/cs2/materials.d.ts +43 -0
  854. package/dist/cs2/materials.js +137 -0
  855. package/dist/cs2/materials.js.map +1 -0
  856. package/dist/cs2/placements.d.ts +57 -0
  857. package/dist/cs2/placements.js +116 -0
  858. package/dist/cs2/placements.js.map +1 -0
  859. package/dist/cs2/roadPieces.d.ts +79 -0
  860. package/dist/cs2/roadPieces.js +263 -0
  861. package/dist/cs2/roadPieces.js.map +1 -0
  862. package/dist/cs2/roads.d.ts +92 -0
  863. package/dist/cs2/roads.js +329 -0
  864. package/dist/cs2/roads.js.map +1 -0
  865. package/dist/cs2/terrain.d.ts +37 -0
  866. package/dist/cs2/terrain.js +91 -0
  867. package/dist/cs2/terrain.js.map +1 -0
  868. package/dist/cs2/types.d.ts +444 -0
  869. package/dist/cs2/types.js +22 -0
  870. package/dist/cs2/types.js.map +1 -0
  871. package/dist/cs2/water.d.ts +26 -0
  872. package/dist/cs2/water.js +58 -0
  873. package/dist/cs2/water.js.map +1 -0
  874. package/dist/currency.d.ts +94 -0
  875. package/dist/currency.js +425 -0
  876. package/dist/currency.js.map +1 -0
  877. package/dist/dev/devServer.d.ts +53 -0
  878. package/dist/dev/devServer.js +228 -0
  879. package/dist/dev/devServer.js.map +1 -0
  880. package/dist/dev/shellPage.d.ts +3 -0
  881. package/dist/dev/shellPage.js +297 -0
  882. package/dist/dev/shellPage.js.map +1 -0
  883. package/dist/dev/state.d.ts +84 -0
  884. package/dist/dev/state.js +265 -0
  885. package/dist/dev/state.js.map +1 -0
  886. package/dist/device.d.ts +104 -0
  887. package/dist/device.js +2744 -0
  888. package/dist/device.js.map +1 -0
  889. package/dist/deviceActionValidation.d.ts +21 -0
  890. package/dist/deviceActionValidation.js +460 -0
  891. package/dist/deviceActionValidation.js.map +1 -0
  892. package/dist/distribution.d.ts +69 -0
  893. package/dist/distribution.js +138 -0
  894. package/dist/distribution.js.map +1 -0
  895. package/dist/enginePins.d.ts +45 -0
  896. package/dist/enginePins.js +134 -0
  897. package/dist/enginePins.js.map +1 -0
  898. package/dist/gesture/axisReference.d.ts +22 -0
  899. package/dist/gesture/axisReference.js +32 -0
  900. package/dist/gesture/axisReference.js.map +1 -0
  901. package/dist/gesture/capture.d.ts +84 -0
  902. package/dist/gesture/capture.js +303 -0
  903. package/dist/gesture/capture.js.map +1 -0
  904. package/dist/gesture/harnessPage.d.ts +23 -0
  905. package/dist/gesture/harnessPage.js +153 -0
  906. package/dist/gesture/harnessPage.js.map +1 -0
  907. package/dist/gesture/inspect.d.ts +189 -0
  908. package/dist/gesture/inspect.js +678 -0
  909. package/dist/gesture/inspect.js.map +1 -0
  910. package/dist/gesture/rig.d.ts +12 -0
  911. package/dist/gesture/rig.js +111 -0
  912. package/dist/gesture/rig.js.map +1 -0
  913. package/dist/gesture/worldRuntime.d.ts +65 -0
  914. package/dist/gesture/worldRuntime.js +110 -0
  915. package/dist/gesture/worldRuntime.js.map +1 -0
  916. package/dist/glb/draw-calls.d.ts +60 -0
  917. package/dist/glb/draw-calls.js +160 -0
  918. package/dist/glb/draw-calls.js.map +1 -0
  919. package/dist/glb/glb-summary.d.ts +68 -0
  920. package/dist/glb/glb-summary.js +450 -0
  921. package/dist/glb/glb-summary.js.map +1 -0
  922. package/dist/glb/index.d.ts +12 -0
  923. package/dist/glb/index.js +24 -0
  924. package/dist/glb/index.js.map +1 -0
  925. package/dist/glb/smooth-normals.d.ts +98 -0
  926. package/dist/glb/smooth-normals.js +395 -0
  927. package/dist/glb/smooth-normals.js.map +1 -0
  928. package/dist/index.d.ts +1 -1
  929. package/dist/index.js +6786 -128
  930. package/dist/index.js.map +1 -1
  931. package/dist/init.d.ts +35 -1
  932. package/dist/init.js +1115 -47
  933. package/dist/init.js.map +1 -1
  934. package/dist/install.d.ts +16 -5
  935. package/dist/install.js +123 -23
  936. package/dist/install.js.map +1 -1
  937. package/dist/interactable.d.ts +154 -0
  938. package/dist/interactable.js +1219 -0
  939. package/dist/interactable.js.map +1 -0
  940. package/dist/item.d.ts +217 -0
  941. package/dist/item.js +892 -0
  942. package/dist/item.js.map +1 -0
  943. package/dist/itemDef/distribute.d.ts +17 -0
  944. package/dist/itemDef/distribute.js +29 -0
  945. package/dist/itemDef/distribute.js.map +1 -0
  946. package/dist/itemDef/emoteRules.d.ts +85 -0
  947. package/dist/itemDef/emoteRules.js +368 -0
  948. package/dist/itemDef/emoteRules.js.map +1 -0
  949. package/dist/itemDef/gunConfigRules.d.ts +24 -0
  950. package/dist/itemDef/gunConfigRules.js +300 -0
  951. package/dist/itemDef/gunConfigRules.js.map +1 -0
  952. package/dist/itemDef/inspect.d.ts +19 -0
  953. package/dist/itemDef/inspect.js +144 -0
  954. package/dist/itemDef/inspect.js.map +1 -0
  955. package/dist/itemDef/scaffold.d.ts +41 -0
  956. package/dist/itemDef/scaffold.js +303 -0
  957. package/dist/itemDef/scaffold.js.map +1 -0
  958. package/dist/itemDef/tables.d.ts +81 -0
  959. package/dist/itemDef/tables.js +226 -0
  960. package/dist/itemDef/tables.js.map +1 -0
  961. package/dist/itemDef/validate.d.ts +30 -0
  962. package/dist/itemDef/validate.js +175 -0
  963. package/dist/itemDef/validate.js.map +1 -0
  964. package/dist/itemPublishVersion.d.ts +46 -0
  965. package/dist/itemPublishVersion.js +242 -0
  966. package/dist/itemPublishVersion.js.map +1 -0
  967. package/dist/itemSearch.d.ts +128 -0
  968. package/dist/itemSearch.js +140 -0
  969. package/dist/itemSearch.js.map +1 -0
  970. package/dist/itemSetVersion.d.ts +77 -0
  971. package/dist/itemSetVersion.js +170 -0
  972. package/dist/itemSetVersion.js.map +1 -0
  973. package/dist/itemThumbnail.d.ts +40 -0
  974. package/dist/itemThumbnail.js +116 -0
  975. package/dist/itemThumbnail.js.map +1 -0
  976. package/dist/lib.d.ts +571 -7
  977. package/dist/lib.js +1178 -15
  978. package/dist/lib.js.map +1 -1
  979. package/dist/looks.d.ts +103 -0
  980. package/dist/looks.js +102 -0
  981. package/dist/looks.js.map +1 -0
  982. package/dist/materials/availability.d.ts +8 -0
  983. package/dist/materials/availability.js +22 -0
  984. package/dist/materials/availability.js.map +1 -0
  985. package/dist/materials/identity.d.ts +30 -0
  986. package/dist/materials/identity.js +68 -0
  987. package/dist/materials/identity.js.map +1 -0
  988. package/dist/materials/pins.d.ts +23 -0
  989. package/dist/materials/pins.js +93 -0
  990. package/dist/materials/pins.js.map +1 -0
  991. package/dist/mesh/surfaceBvh.d.ts +13 -0
  992. package/dist/mesh/surfaceBvh.js +197 -0
  993. package/dist/mesh/surfaceBvh.js.map +1 -0
  994. package/dist/module-validation.d.ts +2 -0
  995. package/dist/module-validation.js +24 -0
  996. package/dist/module-validation.js.map +1 -0
  997. package/dist/money.d.ts +183 -0
  998. package/dist/money.js +299 -0
  999. package/dist/money.js.map +1 -0
  1000. package/dist/npc/capture.d.ts +41 -0
  1001. package/dist/npc/capture.js +99 -0
  1002. package/dist/npc/capture.js.map +1 -0
  1003. package/dist/npc/format.d.ts +2 -0
  1004. package/dist/npc/format.js +102 -0
  1005. package/dist/npc/format.js.map +1 -0
  1006. package/dist/npc/inspect.d.ts +23 -0
  1007. package/dist/npc/inspect.js +54 -0
  1008. package/dist/npc/inspect.js.map +1 -0
  1009. package/dist/npc/metrics.d.ts +132 -0
  1010. package/dist/npc/metrics.js +214 -0
  1011. package/dist/npc/metrics.js.map +1 -0
  1012. package/dist/npc/session.d.ts +35 -0
  1013. package/dist/npc/session.js +172 -0
  1014. package/dist/npc/session.js.map +1 -0
  1015. package/dist/pack/locomotionReference.d.ts +40 -0
  1016. package/dist/pack/locomotionReference.js +132 -0
  1017. package/dist/pack/locomotionReference.js.map +1 -0
  1018. package/dist/pack/scaffold.d.ts +15 -0
  1019. package/dist/pack/scaffold.js +144 -0
  1020. package/dist/pack/scaffold.js.map +1 -0
  1021. package/dist/pack/validate.d.ts +67 -0
  1022. package/dist/pack/validate.js +317 -0
  1023. package/dist/pack/validate.js.map +1 -0
  1024. package/dist/package.d.ts +14 -1
  1025. package/dist/package.js +106 -7
  1026. package/dist/package.js.map +1 -1
  1027. package/dist/paletteShowcase.d.ts +183 -0
  1028. package/dist/paletteShowcase.js +454 -0
  1029. package/dist/paletteShowcase.js.map +1 -0
  1030. package/dist/paletteShowcaseProfiles.d.ts +112 -0
  1031. package/dist/paletteShowcaseProfiles.js +121 -0
  1032. package/dist/paletteShowcaseProfiles.js.map +1 -0
  1033. package/dist/paths.d.ts +4 -0
  1034. package/dist/paths.js +11 -0
  1035. package/dist/paths.js.map +1 -0
  1036. package/dist/placementRequest.d.ts +37 -0
  1037. package/dist/placementRequest.js +220 -0
  1038. package/dist/placementRequest.js.map +1 -0
  1039. package/dist/placements/assets.d.ts +7 -0
  1040. package/dist/placements/assets.js +114 -0
  1041. package/dist/placements/assets.js.map +1 -0
  1042. package/dist/placements/attachFoliageLods.d.ts +4 -0
  1043. package/dist/placements/attachFoliageLods.js +70 -0
  1044. package/dist/placements/attachFoliageLods.js.map +1 -0
  1045. package/dist/placements/attachImpostors.d.ts +3 -0
  1046. package/dist/placements/attachImpostors.js +51 -0
  1047. package/dist/placements/attachImpostors.js.map +1 -0
  1048. package/dist/placements/authored.d.ts +11 -0
  1049. package/dist/placements/authored.js +65 -0
  1050. package/dist/placements/authored.js.map +1 -0
  1051. package/dist/placements/bake.d.ts +2 -0
  1052. package/dist/placements/bake.js +235 -0
  1053. package/dist/placements/bake.js.map +1 -0
  1054. package/dist/placements/captureHost.d.ts +4 -0
  1055. package/dist/placements/captureHost.js +125 -0
  1056. package/dist/placements/captureHost.js.map +1 -0
  1057. package/dist/placements/foliageCapture.d.ts +2 -0
  1058. package/dist/placements/foliageCapture.js +98 -0
  1059. package/dist/placements/foliageCapture.js.map +1 -0
  1060. package/dist/placements/foliageCards.d.ts +17 -0
  1061. package/dist/placements/foliageCards.js +120 -0
  1062. package/dist/placements/foliageCards.js.map +1 -0
  1063. package/dist/placements/foliageLods.d.ts +8 -0
  1064. package/dist/placements/foliageLods.js +240 -0
  1065. package/dist/placements/foliageLods.js.map +1 -0
  1066. package/dist/placements/foliageTexture.d.ts +4 -0
  1067. package/dist/placements/foliageTexture.js +91 -0
  1068. package/dist/placements/foliageTexture.js.map +1 -0
  1069. package/dist/placements/impostorCapture.d.ts +2 -0
  1070. package/dist/placements/impostorCapture.js +111 -0
  1071. package/dist/placements/impostorCapture.js.map +1 -0
  1072. package/dist/placements/impostors.d.ts +18 -0
  1073. package/dist/placements/impostors.js +279 -0
  1074. package/dist/placements/impostors.js.map +1 -0
  1075. package/dist/placements/source.d.ts +53 -0
  1076. package/dist/placements/source.js +111 -0
  1077. package/dist/placements/source.js.map +1 -0
  1078. package/dist/product.d.ts +84 -0
  1079. package/dist/product.js +285 -0
  1080. package/dist/product.js.map +1 -0
  1081. package/dist/publications.d.ts +116 -0
  1082. package/dist/publications.js +180 -0
  1083. package/dist/publications.js.map +1 -0
  1084. package/dist/publishDuplicateGuard.d.ts +92 -0
  1085. package/dist/publishDuplicateGuard.js +128 -0
  1086. package/dist/publishDuplicateGuard.js.map +1 -0
  1087. package/dist/realizability.d.ts +36 -0
  1088. package/dist/realizability.js +269 -0
  1089. package/dist/realizability.js.map +1 -0
  1090. package/dist/resolve.d.ts +7 -1
  1091. package/dist/resolve.js +77 -11
  1092. package/dist/resolve.js.map +1 -1
  1093. package/dist/sceneElements/compiler.d.ts +21 -0
  1094. package/dist/sceneElements/compiler.js +976 -0
  1095. package/dist/sceneElements/compiler.js.map +1 -0
  1096. package/dist/sceneElements/continuum.d.ts +54 -0
  1097. package/dist/sceneElements/continuum.js +451 -0
  1098. package/dist/sceneElements/continuum.js.map +1 -0
  1099. package/dist/sceneElements/devices.d.ts +12 -0
  1100. package/dist/sceneElements/devices.js +212 -0
  1101. package/dist/sceneElements/devices.js.map +1 -0
  1102. package/dist/sceneElements/meshCells.d.ts +49 -0
  1103. package/dist/sceneElements/meshCells.js +174 -0
  1104. package/dist/sceneElements/meshCells.js.map +1 -0
  1105. package/dist/sceneElements/types.d.ts +261 -0
  1106. package/dist/sceneElements/types.js +3 -0
  1107. package/dist/sceneElements/types.js.map +1 -0
  1108. package/dist/sceneHlod/approximate.d.ts +23 -0
  1109. package/dist/sceneHlod/approximate.js +171 -0
  1110. package/dist/sceneHlod/approximate.js.map +1 -0
  1111. package/dist/sceneHlod/artifact.d.ts +3 -0
  1112. package/dist/sceneHlod/artifact.js +29 -0
  1113. package/dist/sceneHlod/artifact.js.map +1 -0
  1114. package/dist/sceneHlod/bakeSurface.d.ts +2 -0
  1115. package/dist/sceneHlod/bakeSurface.js +59 -0
  1116. package/dist/sceneHlod/bakeSurface.js.map +1 -0
  1117. package/dist/sceneHlod/basisEncoder.d.ts +3 -0
  1118. package/dist/sceneHlod/basisEncoder.js +68 -0
  1119. package/dist/sceneHlod/basisEncoder.js.map +1 -0
  1120. package/dist/sceneHlod/cellArtifact.d.ts +17 -0
  1121. package/dist/sceneHlod/cellArtifact.js +78 -0
  1122. package/dist/sceneHlod/cellArtifact.js.map +1 -0
  1123. package/dist/sceneHlod/commands.d.ts +2 -0
  1124. package/dist/sceneHlod/commands.js +114 -0
  1125. package/dist/sceneHlod/commands.js.map +1 -0
  1126. package/dist/sceneHlod/complete.d.ts +78 -0
  1127. package/dist/sceneHlod/complete.js +261 -0
  1128. package/dist/sceneHlod/complete.js.map +1 -0
  1129. package/dist/sceneHlod/completePrototype.d.ts +39 -0
  1130. package/dist/sceneHlod/completePrototype.js +121 -0
  1131. package/dist/sceneHlod/completePrototype.js.map +1 -0
  1132. package/dist/sceneHlod/geometry.d.ts +6 -0
  1133. package/dist/sceneHlod/geometry.js +101 -0
  1134. package/dist/sceneHlod/geometry.js.map +1 -0
  1135. package/dist/sceneHlod/imageSampling.d.ts +11 -0
  1136. package/dist/sceneHlod/imageSampling.js +100 -0
  1137. package/dist/sceneHlod/imageSampling.js.map +1 -0
  1138. package/dist/sceneHlod/refinement.d.ts +46 -0
  1139. package/dist/sceneHlod/refinement.js +204 -0
  1140. package/dist/sceneHlod/refinement.js.map +1 -0
  1141. package/dist/sceneHlod/scene.d.ts +80 -0
  1142. package/dist/sceneHlod/scene.js +264 -0
  1143. package/dist/sceneHlod/scene.js.map +1 -0
  1144. package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
  1145. package/dist/sceneHlod/sharedAtlas.js +84 -0
  1146. package/dist/sceneHlod/sharedAtlas.js.map +1 -0
  1147. package/dist/sceneHlod/source.d.ts +17 -0
  1148. package/dist/sceneHlod/source.js +241 -0
  1149. package/dist/sceneHlod/source.js.map +1 -0
  1150. package/dist/sceneHlod/textureCodec.d.ts +4 -0
  1151. package/dist/sceneHlod/textureCodec.js +66 -0
  1152. package/dist/sceneHlod/textureCodec.js.map +1 -0
  1153. package/dist/sceneHlod/transfer.d.ts +8 -0
  1154. package/dist/sceneHlod/transfer.js +147 -0
  1155. package/dist/sceneHlod/transfer.js.map +1 -0
  1156. package/dist/sceneHlod/types.d.ts +69 -0
  1157. package/dist/sceneHlod/types.js +3 -0
  1158. package/dist/sceneHlod/types.js.map +1 -0
  1159. package/dist/sceneImport/archive.d.ts +30 -0
  1160. package/dist/sceneImport/archive.js +336 -0
  1161. package/dist/sceneImport/archive.js.map +1 -0
  1162. package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
  1163. package/dist/sceneImport/bistroMaterialBake.js +169 -0
  1164. package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
  1165. package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
  1166. package/dist/sceneImport/bistroTexturePlan.js +23 -0
  1167. package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
  1168. package/dist/sceneImport/compiler.d.ts +36 -0
  1169. package/dist/sceneImport/compiler.js +251 -0
  1170. package/dist/sceneImport/compiler.js.map +1 -0
  1171. package/dist/sceneImport/composeMounts.d.ts +159 -0
  1172. package/dist/sceneImport/composeMounts.js +687 -0
  1173. package/dist/sceneImport/composeMounts.js.map +1 -0
  1174. package/dist/sceneImport/defaultMaterials.d.ts +45 -0
  1175. package/dist/sceneImport/defaultMaterials.js +121 -0
  1176. package/dist/sceneImport/defaultMaterials.js.map +1 -0
  1177. package/dist/sceneImport/externalTextures.d.ts +44 -0
  1178. package/dist/sceneImport/externalTextures.js +146 -0
  1179. package/dist/sceneImport/externalTextures.js.map +1 -0
  1180. package/dist/sceneImport/fbx.d.ts +101 -0
  1181. package/dist/sceneImport/fbx.js +307 -0
  1182. package/dist/sceneImport/fbx.js.map +1 -0
  1183. package/dist/sceneImport/glbSplit.d.ts +24 -0
  1184. package/dist/sceneImport/glbSplit.js +95 -0
  1185. package/dist/sceneImport/glbSplit.js.map +1 -0
  1186. package/dist/sceneImport/gltfIo.d.ts +32 -0
  1187. package/dist/sceneImport/gltfIo.js +39 -0
  1188. package/dist/sceneImport/gltfIo.js.map +1 -0
  1189. package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
  1190. package/dist/sceneImport/helsinkiTiles.js +52 -0
  1191. package/dist/sceneImport/helsinkiTiles.js.map +1 -0
  1192. package/dist/sceneImport/materials/binding.d.ts +16 -0
  1193. package/dist/sceneImport/materials/binding.js +42 -0
  1194. package/dist/sceneImport/materials/binding.js.map +1 -0
  1195. package/dist/sceneImport/materials/catalog.d.ts +36 -0
  1196. package/dist/sceneImport/materials/catalog.js +233 -0
  1197. package/dist/sceneImport/materials/catalog.js.map +1 -0
  1198. package/dist/sceneImport/materials/index.d.ts +4 -0
  1199. package/dist/sceneImport/materials/index.js +21 -0
  1200. package/dist/sceneImport/materials/index.js.map +1 -0
  1201. package/dist/sceneImport/materials/matcher.d.ts +33 -0
  1202. package/dist/sceneImport/materials/matcher.js +127 -0
  1203. package/dist/sceneImport/materials/matcher.js.map +1 -0
  1204. package/dist/sceneImport/materials/recipe.d.ts +30 -0
  1205. package/dist/sceneImport/materials/recipe.js +134 -0
  1206. package/dist/sceneImport/materials/recipe.js.map +1 -0
  1207. package/dist/sceneImport/multiAsset.d.ts +79 -0
  1208. package/dist/sceneImport/multiAsset.js +535 -0
  1209. package/dist/sceneImport/multiAsset.js.map +1 -0
  1210. package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
  1211. package/dist/sceneImport/multiAssetSpawn.js +98 -0
  1212. package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
  1213. package/dist/sceneImport/obj.d.ts +41 -0
  1214. package/dist/sceneImport/obj.js +276 -0
  1215. package/dist/sceneImport/obj.js.map +1 -0
  1216. package/dist/sceneImport/package.d.ts +104 -0
  1217. package/dist/sceneImport/package.js +1004 -0
  1218. package/dist/sceneImport/package.js.map +1 -0
  1219. package/dist/sceneImport/packageReader.d.ts +10 -0
  1220. package/dist/sceneImport/packageReader.js +250 -0
  1221. package/dist/sceneImport/packageReader.js.map +1 -0
  1222. package/dist/sceneImport/proxy.d.ts +100 -0
  1223. package/dist/sceneImport/proxy.js +334 -0
  1224. package/dist/sceneImport/proxy.js.map +1 -0
  1225. package/dist/sceneImport/publish.d.ts +47 -0
  1226. package/dist/sceneImport/publish.js +98 -0
  1227. package/dist/sceneImport/publish.js.map +1 -0
  1228. package/dist/sceneImport/semantic.d.ts +75 -0
  1229. package/dist/sceneImport/semantic.js +296 -0
  1230. package/dist/sceneImport/semantic.js.map +1 -0
  1231. package/dist/sceneImport/spawnProbe.d.ts +55 -0
  1232. package/dist/sceneImport/spawnProbe.js +159 -0
  1233. package/dist/sceneImport/spawnProbe.js.map +1 -0
  1234. package/dist/sceneImport/streamLayout.d.ts +96 -0
  1235. package/dist/sceneImport/streamLayout.js +203 -0
  1236. package/dist/sceneImport/streamLayout.js.map +1 -0
  1237. package/dist/sceneImport/textureDecode.d.ts +21 -0
  1238. package/dist/sceneImport/textureDecode.js +292 -0
  1239. package/dist/sceneImport/textureDecode.js.map +1 -0
  1240. package/dist/sceneImport/types.d.ts +84 -0
  1241. package/dist/sceneImport/types.js +58 -0
  1242. package/dist/sceneImport/types.js.map +1 -0
  1243. package/dist/scenePerformance.d.ts +162 -0
  1244. package/dist/scenePerformance.js +905 -0
  1245. package/dist/scenePerformance.js.map +1 -0
  1246. package/dist/screenshot/captureScreenshots.d.ts +36 -0
  1247. package/dist/screenshot/captureScreenshots.js +229 -0
  1248. package/dist/screenshot/captureScreenshots.js.map +1 -0
  1249. package/dist/screenshot/encodeImagePreview.d.ts +5 -0
  1250. package/dist/screenshot/encodeImagePreview.js +42 -0
  1251. package/dist/screenshot/encodeImagePreview.js.map +1 -0
  1252. package/dist/screenshot/publishThumbnail.d.ts +4 -0
  1253. package/dist/screenshot/publishThumbnail.js +56 -0
  1254. package/dist/screenshot/publishThumbnail.js.map +1 -0
  1255. package/dist/screenshot/staticServe.d.ts +14 -0
  1256. package/dist/screenshot/staticServe.js +120 -0
  1257. package/dist/screenshot/staticServe.js.map +1 -0
  1258. package/dist/source-archive.d.ts +101 -0
  1259. package/dist/source-archive.js +309 -0
  1260. package/dist/source-archive.js.map +1 -0
  1261. package/dist/stdioBlocking.d.ts +1 -0
  1262. package/dist/stdioBlocking.js +9 -0
  1263. package/dist/stdioBlocking.js.map +1 -0
  1264. package/dist/terrain/bake.d.ts +40 -0
  1265. package/dist/terrain/bake.js +318 -0
  1266. package/dist/terrain/bake.js.map +1 -0
  1267. package/dist/terrain/generate.d.ts +21 -0
  1268. package/dist/terrain/generate.js +239 -0
  1269. package/dist/terrain/generate.js.map +1 -0
  1270. package/dist/terrain/grid.d.ts +48 -0
  1271. package/dist/terrain/grid.js +133 -0
  1272. package/dist/terrain/grid.js.map +1 -0
  1273. package/dist/terrain/import.d.ts +40 -0
  1274. package/dist/terrain/import.js +252 -0
  1275. package/dist/terrain/import.js.map +1 -0
  1276. package/dist/terrain/index.d.ts +11 -0
  1277. package/dist/terrain/index.js +88 -0
  1278. package/dist/terrain/index.js.map +1 -0
  1279. package/dist/terrain/inspect.d.ts +35 -0
  1280. package/dist/terrain/inspect.js +115 -0
  1281. package/dist/terrain/inspect.js.map +1 -0
  1282. package/dist/terrain/island.d.ts +31 -0
  1283. package/dist/terrain/island.js +128 -0
  1284. package/dist/terrain/island.js.map +1 -0
  1285. package/dist/terrain/noise.d.ts +79 -0
  1286. package/dist/terrain/noise.js +162 -0
  1287. package/dist/terrain/noise.js.map +1 -0
  1288. package/dist/terrain/normals.d.ts +21 -0
  1289. package/dist/terrain/normals.js +55 -0
  1290. package/dist/terrain/normals.js.map +1 -0
  1291. package/dist/terrain/presets/alpine.json +20 -0
  1292. package/dist/terrain/presets/coast.json +20 -0
  1293. package/dist/terrain/presets/desert.json +22 -0
  1294. package/dist/terrain/presets/forest.json +20 -0
  1295. package/dist/terrain/presets/meadow.json +20 -0
  1296. package/dist/terrain/presets/volcanic.json +22 -0
  1297. package/dist/terrain/presets.d.ts +29 -0
  1298. package/dist/terrain/presets.js +128 -0
  1299. package/dist/terrain/presets.js.map +1 -0
  1300. package/dist/terrain/source.d.ts +42 -0
  1301. package/dist/terrain/source.js +241 -0
  1302. package/dist/terrain/source.js.map +1 -0
  1303. package/dist/terrain/tile.d.ts +92 -0
  1304. package/dist/terrain/tile.js +268 -0
  1305. package/dist/terrain/tile.js.map +1 -0
  1306. package/dist/textureAudit.d.ts +23 -0
  1307. package/dist/textureAudit.js +192 -0
  1308. package/dist/textureAudit.js.map +1 -0
  1309. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1310. package/dist/unreal/avatarMode.d.ts +21 -0
  1311. package/dist/unreal/avatarMode.js +33 -0
  1312. package/dist/unreal/avatarMode.js.map +1 -0
  1313. package/dist/unreal/delivery.d.ts +46 -0
  1314. package/dist/unreal/delivery.js +89 -0
  1315. package/dist/unreal/delivery.js.map +1 -0
  1316. package/dist/unreal/doctor.d.ts +50 -0
  1317. package/dist/unreal/doctor.js +102 -0
  1318. package/dist/unreal/doctor.js.map +1 -0
  1319. package/dist/unreal/package.d.ts +80 -0
  1320. package/dist/unreal/package.js +273 -0
  1321. package/dist/unreal/package.js.map +1 -0
  1322. package/dist/unreal/release.d.ts +41 -0
  1323. package/dist/unreal/release.js +122 -0
  1324. package/dist/unreal/release.js.map +1 -0
  1325. package/dist/unreal.d.ts +30 -0
  1326. package/dist/unreal.js +362 -0
  1327. package/dist/unreal.js.map +1 -0
  1328. package/dist/unrealCandidate.d.ts +213 -0
  1329. package/dist/unrealCandidate.js +765 -0
  1330. package/dist/unrealCandidate.js.map +1 -0
  1331. package/dist/unrealManifest.d.ts +74 -0
  1332. package/dist/unrealManifest.js +354 -0
  1333. package/dist/unrealManifest.js.map +1 -0
  1334. package/dist/unrealPublish.d.ts +111 -0
  1335. package/dist/unrealPublish.js +331 -0
  1336. package/dist/unrealPublish.js.map +1 -0
  1337. package/dist/vault.d.ts +121 -0
  1338. package/dist/vault.js +136 -0
  1339. package/dist/vault.js.map +1 -0
  1340. package/dist/vehicle/addOnDefinition.d.ts +19 -0
  1341. package/dist/vehicle/addOnDefinition.js +21 -0
  1342. package/dist/vehicle/addOnDefinition.js.map +1 -0
  1343. package/dist/vehicle/addon.d.ts +158 -0
  1344. package/dist/vehicle/addon.js +441 -0
  1345. package/dist/vehicle/addon.js.map +1 -0
  1346. package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
  1347. package/dist/vehicle/addonDefinitionGuard.js +206 -0
  1348. package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
  1349. package/dist/vehicle/addonPublished.d.ts +80 -0
  1350. package/dist/vehicle/addonPublished.js +221 -0
  1351. package/dist/vehicle/addonPublished.js.map +1 -0
  1352. package/dist/vehicle/audio.d.ts +259 -0
  1353. package/dist/vehicle/audio.js +1069 -0
  1354. package/dist/vehicle/audio.js.map +1 -0
  1355. package/dist/vehicle/audioDefects.d.ts +125 -0
  1356. package/dist/vehicle/audioDefects.js +591 -0
  1357. package/dist/vehicle/audioDefects.js.map +1 -0
  1358. package/dist/vehicle/audioDistinct.d.ts +62 -0
  1359. package/dist/vehicle/audioDistinct.js +479 -0
  1360. package/dist/vehicle/audioDistinct.js.map +1 -0
  1361. package/dist/vehicle/audioImport.d.ts +217 -0
  1362. package/dist/vehicle/audioImport.js +610 -0
  1363. package/dist/vehicle/audioImport.js.map +1 -0
  1364. package/dist/vehicle/audioProvenance.d.ts +47 -0
  1365. package/dist/vehicle/audioProvenance.js +364 -0
  1366. package/dist/vehicle/audioProvenance.js.map +1 -0
  1367. package/dist/vehicle/audioReference.d.ts +36 -0
  1368. package/dist/vehicle/audioReference.js +176 -0
  1369. package/dist/vehicle/audioReference.js.map +1 -0
  1370. package/dist/vehicle/audioSlots.d.ts +27 -0
  1371. package/dist/vehicle/audioSlots.js +43 -0
  1372. package/dist/vehicle/audioSlots.js.map +1 -0
  1373. package/dist/vehicle/audioSpectral.d.ts +71 -0
  1374. package/dist/vehicle/audioSpectral.js +534 -0
  1375. package/dist/vehicle/audioSpectral.js.map +1 -0
  1376. package/dist/vehicle/cabinCheck.d.ts +209 -0
  1377. package/dist/vehicle/cabinCheck.js +799 -0
  1378. package/dist/vehicle/cabinCheck.js.map +1 -0
  1379. package/dist/vehicle/drive.d.ts +66 -0
  1380. package/dist/vehicle/drive.js +228 -0
  1381. package/dist/vehicle/drive.js.map +1 -0
  1382. package/dist/vehicle/enginePolicy.d.ts +68 -0
  1383. package/dist/vehicle/enginePolicy.js +209 -0
  1384. package/dist/vehicle/enginePolicy.js.map +1 -0
  1385. package/dist/vehicle/hostFrame.d.ts +78 -0
  1386. package/dist/vehicle/hostFrame.js +136 -0
  1387. package/dist/vehicle/hostFrame.js.map +1 -0
  1388. package/dist/vehicle/inspectionSheets.d.ts +42 -0
  1389. package/dist/vehicle/inspectionSheets.js +173 -0
  1390. package/dist/vehicle/inspectionSheets.js.map +1 -0
  1391. package/dist/vehicle/keyboardLaunch.d.ts +189 -0
  1392. package/dist/vehicle/keyboardLaunch.js +340 -0
  1393. package/dist/vehicle/keyboardLaunch.js.map +1 -0
  1394. package/dist/vehicle/lampCoverage.d.ts +49 -0
  1395. package/dist/vehicle/lampCoverage.js +252 -0
  1396. package/dist/vehicle/lampCoverage.js.map +1 -0
  1397. package/dist/vehicle/mintAddOn.d.ts +110 -0
  1398. package/dist/vehicle/mintAddOn.js +321 -0
  1399. package/dist/vehicle/mintAddOn.js.map +1 -0
  1400. package/dist/vehicle/mintVehicle.d.ts +189 -0
  1401. package/dist/vehicle/mintVehicle.js +417 -0
  1402. package/dist/vehicle/mintVehicle.js.map +1 -0
  1403. package/dist/vehicle/paintHue.d.ts +89 -0
  1404. package/dist/vehicle/paintHue.js +248 -0
  1405. package/dist/vehicle/paintHue.js.map +1 -0
  1406. package/dist/vehicle/panelCoverage.d.ts +37 -0
  1407. package/dist/vehicle/panelCoverage.js +93 -0
  1408. package/dist/vehicle/panelCoverage.js.map +1 -0
  1409. package/dist/vehicle/platform.d.ts +71 -0
  1410. package/dist/vehicle/platform.js +144 -0
  1411. package/dist/vehicle/platform.js.map +1 -0
  1412. package/dist/vehicle/preview.d.ts +339 -0
  1413. package/dist/vehicle/preview.js +854 -0
  1414. package/dist/vehicle/preview.js.map +1 -0
  1415. package/dist/vehicle/previewAddon.d.ts +197 -0
  1416. package/dist/vehicle/previewAddon.js +520 -0
  1417. package/dist/vehicle/previewAddon.js.map +1 -0
  1418. package/dist/vehicle/previewSeats.d.ts +102 -0
  1419. package/dist/vehicle/previewSeats.js +190 -0
  1420. package/dist/vehicle/previewSeats.js.map +1 -0
  1421. package/dist/vehicle/publish.d.ts +78 -0
  1422. package/dist/vehicle/publish.js +111 -0
  1423. package/dist/vehicle/publish.js.map +1 -0
  1424. package/dist/vehicle/recheckListed.d.ts +87 -0
  1425. package/dist/vehicle/recheckListed.js +200 -0
  1426. package/dist/vehicle/recheckListed.js.map +1 -0
  1427. package/dist/vehicle/renditionManifest.d.ts +10 -0
  1428. package/dist/vehicle/renditionManifest.js +56 -0
  1429. package/dist/vehicle/renditionManifest.js.map +1 -0
  1430. package/dist/vehicle/sealCheck.d.ts +30 -0
  1431. package/dist/vehicle/sealCheck.js +59 -0
  1432. package/dist/vehicle/sealCheck.js.map +1 -0
  1433. package/dist/vehicle/simulate.d.ts +219 -0
  1434. package/dist/vehicle/simulate.js +536 -0
  1435. package/dist/vehicle/simulate.js.map +1 -0
  1436. package/dist/vehicle/simulateRuntime.d.ts +76 -0
  1437. package/dist/vehicle/simulateRuntime.js +252 -0
  1438. package/dist/vehicle/simulateRuntime.js.map +1 -0
  1439. package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
  1440. package/dist/vehicle/testutil/sourcedAudio.js +96 -0
  1441. package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
  1442. package/dist/vehicle/validate.d.ts +225 -0
  1443. package/dist/vehicle/validate.js +956 -0
  1444. package/dist/vehicle/validate.js.map +1 -0
  1445. package/dist/vehicle/wheelDesign.d.ts +98 -0
  1446. package/dist/vehicle/wheelDesign.js +276 -0
  1447. package/dist/vehicle/wheelDesign.js.map +1 -0
  1448. package/dist/verifySubPath.d.ts +69 -0
  1449. package/dist/verifySubPath.js +458 -0
  1450. package/dist/verifySubPath.js.map +1 -0
  1451. package/dist/visualQa/animation.d.ts +57 -0
  1452. package/dist/visualQa/animation.js +503 -0
  1453. package/dist/visualQa/animation.js.map +1 -0
  1454. package/dist/visualQa/avatar.d.ts +3 -0
  1455. package/dist/visualQa/avatar.js +443 -0
  1456. package/dist/visualQa/avatar.js.map +1 -0
  1457. package/dist/visualQa/avatarMath.d.ts +180 -0
  1458. package/dist/visualQa/avatarMath.js +318 -0
  1459. package/dist/visualQa/avatarMath.js.map +1 -0
  1460. package/dist/visualQa/avatarPreview.d.ts +26 -0
  1461. package/dist/visualQa/avatarPreview.js +167 -0
  1462. package/dist/visualQa/avatarPreview.js.map +1 -0
  1463. package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
  1464. package/dist/visualQa/avatarPreviewMath.js +696 -0
  1465. package/dist/visualQa/avatarPreviewMath.js.map +1 -0
  1466. package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
  1467. package/dist/visualQa/avatarPreviewProbe.js +181 -0
  1468. package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
  1469. package/dist/visualQa/avatarProbe.d.ts +1 -0
  1470. package/dist/visualQa/avatarProbe.js +264 -0
  1471. package/dist/visualQa/avatarProbe.js.map +1 -0
  1472. package/dist/visualQa/browser.d.ts +116 -0
  1473. package/dist/visualQa/browser.js +817 -0
  1474. package/dist/visualQa/browser.js.map +1 -0
  1475. package/dist/visualQa/candidate.d.ts +116 -0
  1476. package/dist/visualQa/candidate.js +265 -0
  1477. package/dist/visualQa/candidate.js.map +1 -0
  1478. package/dist/visualQa/checklists.d.ts +31 -0
  1479. package/dist/visualQa/checklists.js +160 -0
  1480. package/dist/visualQa/checklists.js.map +1 -0
  1481. package/dist/visualQa/command.d.ts +110 -0
  1482. package/dist/visualQa/command.js +521 -0
  1483. package/dist/visualQa/command.js.map +1 -0
  1484. package/dist/visualQa/commonAsserts.d.ts +68 -0
  1485. package/dist/visualQa/commonAsserts.js +239 -0
  1486. package/dist/visualQa/commonAsserts.js.map +1 -0
  1487. package/dist/visualQa/contactSheet.d.ts +32 -0
  1488. package/dist/visualQa/contactSheet.js +153 -0
  1489. package/dist/visualQa/contactSheet.js.map +1 -0
  1490. package/dist/visualQa/critic.d.ts +18 -0
  1491. package/dist/visualQa/critic.js +179 -0
  1492. package/dist/visualQa/critic.js.map +1 -0
  1493. package/dist/visualQa/emotePage.d.ts +10 -0
  1494. package/dist/visualQa/emotePage.js +249 -0
  1495. package/dist/visualQa/emotePage.js.map +1 -0
  1496. package/dist/visualQa/evidenceOverlay.d.ts +74 -0
  1497. package/dist/visualQa/evidenceOverlay.js +268 -0
  1498. package/dist/visualQa/evidenceOverlay.js.map +1 -0
  1499. package/dist/visualQa/harness.d.ts +57 -0
  1500. package/dist/visualQa/harness.js +3 -0
  1501. package/dist/visualQa/harness.js.map +1 -0
  1502. package/dist/visualQa/hosted.d.ts +152 -0
  1503. package/dist/visualQa/hosted.js +367 -0
  1504. package/dist/visualQa/hosted.js.map +1 -0
  1505. package/dist/visualQa/labelLimit.d.ts +12 -0
  1506. package/dist/visualQa/labelLimit.js +31 -0
  1507. package/dist/visualQa/labelLimit.js.map +1 -0
  1508. package/dist/visualQa/mirror.d.ts +36 -0
  1509. package/dist/visualQa/mirror.js +98 -0
  1510. package/dist/visualQa/mirror.js.map +1 -0
  1511. package/dist/visualQa/moveUx.d.ts +44 -0
  1512. package/dist/visualQa/moveUx.js +103 -0
  1513. package/dist/visualQa/moveUx.js.map +1 -0
  1514. package/dist/visualQa/pinnedChrome.d.ts +63 -0
  1515. package/dist/visualQa/pinnedChrome.js +214 -0
  1516. package/dist/visualQa/pinnedChrome.js.map +1 -0
  1517. package/dist/visualQa/resolve.d.ts +88 -0
  1518. package/dist/visualQa/resolve.js +248 -0
  1519. package/dist/visualQa/resolve.js.map +1 -0
  1520. package/dist/visualQa/scene.d.ts +14 -0
  1521. package/dist/visualQa/scene.js +688 -0
  1522. package/dist/visualQa/scene.js.map +1 -0
  1523. package/dist/visualQa/shot.d.ts +2 -0
  1524. package/dist/visualQa/shot.js +27 -0
  1525. package/dist/visualQa/shot.js.map +1 -0
  1526. package/dist/visualQa/signIn.d.ts +35 -0
  1527. package/dist/visualQa/signIn.js +144 -0
  1528. package/dist/visualQa/signIn.js.map +1 -0
  1529. package/dist/visualQa/submitBudget.d.ts +25 -0
  1530. package/dist/visualQa/submitBudget.js +82 -0
  1531. package/dist/visualQa/submitBudget.js.map +1 -0
  1532. package/dist/visualQa/types.d.ts +195 -0
  1533. package/dist/visualQa/types.js +12 -0
  1534. package/dist/visualQa/types.js.map +1 -0
  1535. package/dist/visualQa/vehicle.d.ts +130 -0
  1536. package/dist/visualQa/vehicle.js +2002 -0
  1537. package/dist/visualQa/vehicle.js.map +1 -0
  1538. package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
  1539. package/dist/visualQa/vehicleAddonProbe.js +115 -0
  1540. package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
  1541. package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
  1542. package/dist/visualQa/vehicleCabinFit.js +55 -0
  1543. package/dist/visualQa/vehicleCabinFit.js.map +1 -0
  1544. package/dist/visualQa/vehicleClearance.d.ts +135 -0
  1545. package/dist/visualQa/vehicleClearance.js +299 -0
  1546. package/dist/visualQa/vehicleClearance.js.map +1 -0
  1547. package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
  1548. package/dist/visualQa/vehicleDriveAlive.js +103 -0
  1549. package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
  1550. package/dist/visualQa/vehicleGrip.d.ts +156 -0
  1551. package/dist/visualQa/vehicleGrip.js +439 -0
  1552. package/dist/visualQa/vehicleGrip.js.map +1 -0
  1553. package/dist/visualQa/vehicleInspection.d.ts +70 -0
  1554. package/dist/visualQa/vehicleInspection.js +318 -0
  1555. package/dist/visualQa/vehicleInspection.js.map +1 -0
  1556. package/dist/visualQa/vehicleLamps.d.ts +120 -0
  1557. package/dist/visualQa/vehicleLamps.js +377 -0
  1558. package/dist/visualQa/vehicleLamps.js.map +1 -0
  1559. package/dist/visualQa/vehicleMath.d.ts +440 -0
  1560. package/dist/visualQa/vehicleMath.js +967 -0
  1561. package/dist/visualQa/vehicleMath.js.map +1 -0
  1562. package/dist/visualQa/vehicleOccupants.d.ts +66 -0
  1563. package/dist/visualQa/vehicleOccupants.js +448 -0
  1564. package/dist/visualQa/vehicleOccupants.js.map +1 -0
  1565. package/dist/visualQa/vehiclePenetration.d.ts +172 -0
  1566. package/dist/visualQa/vehiclePenetration.js +1157 -0
  1567. package/dist/visualQa/vehiclePenetration.js.map +1 -0
  1568. package/dist/visualQa/vehiclePoses.d.ts +25 -0
  1569. package/dist/visualQa/vehiclePoses.js +56 -0
  1570. package/dist/visualQa/vehiclePoses.js.map +1 -0
  1571. package/dist/visualQa/vehiclePosture.d.ts +78 -0
  1572. package/dist/visualQa/vehiclePosture.js +263 -0
  1573. package/dist/visualQa/vehiclePosture.js.map +1 -0
  1574. package/dist/visualQa/vehiclePreview.d.ts +103 -0
  1575. package/dist/visualQa/vehiclePreview.js +312 -0
  1576. package/dist/visualQa/vehiclePreview.js.map +1 -0
  1577. package/dist/visualQa/vehicleProbe.d.ts +3 -0
  1578. package/dist/visualQa/vehicleProbe.js +670 -0
  1579. package/dist/visualQa/vehicleProbe.js.map +1 -0
  1580. package/dist/visualQa/vehicleStance.d.ts +108 -0
  1581. package/dist/visualQa/vehicleStance.js +200 -0
  1582. package/dist/visualQa/vehicleStance.js.map +1 -0
  1583. package/dist/visualQa/viewer.d.ts +6 -0
  1584. package/dist/visualQa/viewer.js +750 -0
  1585. package/dist/visualQa/viewer.js.map +1 -0
  1586. package/dist/visualQa/viewerGeometry.d.ts +116 -0
  1587. package/dist/visualQa/viewerGeometry.js +476 -0
  1588. package/dist/visualQa/viewerGeometry.js.map +1 -0
  1589. package/dist/visualQa/viewerPage.d.ts +11 -0
  1590. package/dist/visualQa/viewerPage.js +414 -0
  1591. package/dist/visualQa/viewerPage.js.map +1 -0
  1592. package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
  1593. package/dist/visualQa/webgpuSelfTest.js +113 -0
  1594. package/dist/visualQa/webgpuSelfTest.js.map +1 -0
  1595. package/dist/visualQa/winChrome.d.ts +92 -0
  1596. package/dist/visualQa/winChrome.js +445 -0
  1597. package/dist/visualQa/winChrome.js.map +1 -0
  1598. package/dist/visualQa/worldWalk.d.ts +59 -0
  1599. package/dist/visualQa/worldWalk.js +523 -0
  1600. package/dist/visualQa/worldWalk.js.map +1 -0
  1601. package/dist/visualQa/worldWalkMath.d.ts +263 -0
  1602. package/dist/visualQa/worldWalkMath.js +873 -0
  1603. package/dist/visualQa/worldWalkMath.js.map +1 -0
  1604. package/dist/visualQa/worldWalkProbe.d.ts +1 -0
  1605. package/dist/visualQa/worldWalkProbe.js +206 -0
  1606. package/dist/visualQa/worldWalkProbe.js.map +1 -0
  1607. package/dist/visualsConfig.d.ts +65 -0
  1608. package/dist/visualsConfig.js +1333 -0
  1609. package/dist/visualsConfig.js.map +1 -0
  1610. package/dist/voiceCommand.d.ts +11 -0
  1611. package/dist/voiceCommand.js +101 -0
  1612. package/dist/voiceCommand.js.map +1 -0
  1613. package/dist/world/analyze.d.ts +51 -0
  1614. package/dist/world/analyze.js +767 -0
  1615. package/dist/world/analyze.js.map +1 -0
  1616. package/dist/world/baseline.d.ts +33 -0
  1617. package/dist/world/baseline.js +111 -0
  1618. package/dist/world/baseline.js.map +1 -0
  1619. package/dist/world/canonicalize.d.ts +7 -0
  1620. package/dist/world/canonicalize.js +110 -0
  1621. package/dist/world/canonicalize.js.map +1 -0
  1622. package/dist/world/diff.d.ts +18 -0
  1623. package/dist/world/diff.js +58 -0
  1624. package/dist/world/diff.js.map +1 -0
  1625. package/dist/world/focus.d.ts +11 -0
  1626. package/dist/world/focus.js +161 -0
  1627. package/dist/world/focus.js.map +1 -0
  1628. package/dist/world/format.d.ts +6 -0
  1629. package/dist/world/format.js +125 -0
  1630. package/dist/world/format.js.map +1 -0
  1631. package/dist/world/readWorldMetrics.d.ts +10 -0
  1632. package/dist/world/readWorldMetrics.js +31 -0
  1633. package/dist/world/readWorldMetrics.js.map +1 -0
  1634. package/dist/world/snapshotTypes.d.ts +59 -0
  1635. package/dist/world/snapshotTypes.js +8 -0
  1636. package/dist/world/snapshotTypes.js.map +1 -0
  1637. package/dist/world/snapshotWorld.d.ts +16 -0
  1638. package/dist/world/snapshotWorld.js +142 -0
  1639. package/dist/world/snapshotWorld.js.map +1 -0
  1640. package/dist/world/wiring.d.ts +21 -0
  1641. package/dist/world/wiring.js +73 -0
  1642. package/dist/world/wiring.js.map +1 -0
  1643. package/dist/world/zones.d.ts +23 -0
  1644. package/dist/world/zones.js +134 -0
  1645. package/dist/world/zones.js.map +1 -0
  1646. package/docs/bridge.md +304 -0
  1647. package/docs/device-hand-reach.md +44 -0
  1648. package/docs/scene-hlod.md +139 -0
  1649. package/docs/vehicle-audio-import.md +299 -0
  1650. package/docs/vehicle-simulate.md +165 -0
  1651. package/docs/visual-qa-candidate-versions.md +71 -0
  1652. package/docs/visual-qa.md +462 -0
  1653. package/package.json +69 -4
  1654. package/plugins/beamng-vehicle/README.md +129 -0
  1655. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  1656. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  1657. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  1658. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  1659. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  1660. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  1661. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  1662. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  1663. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  1664. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  1665. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  1666. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  1667. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  1668. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  1669. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
  1670. package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
  1671. package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
  1672. package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
  1673. package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
  1674. package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
  1675. package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
  1676. package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
  1677. package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
  1678. package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
  1679. package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
  1680. package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
  1681. package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
  1682. package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
  1683. package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
  1684. package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
  1685. package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
  1686. package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
  1687. package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
  1688. package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
  1689. package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
  1690. package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
  1691. package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
  1692. package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
  1693. package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
  1694. package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
  1695. package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
  1696. package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
  1697. package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
  1698. package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
  1699. package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
  1700. package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
  1701. package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
  1702. package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
  1703. package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
  1704. package/vendor/README.md +63 -0
  1705. package/vendor/ability-manifest.mjs +527 -6
  1706. package/vendor/audits/asset-credits.mjs +96 -0
  1707. package/vendor/audits/check-loaders.mjs +80 -0
  1708. package/vendor/audits/perf-gate.mjs +759 -0
  1709. package/vendor/audits/prove-live.mjs +307 -0
  1710. package/vendor/audits/source-audit.mjs +530 -0
  1711. package/vendor/audits/world-audit.mjs +439 -0
  1712. package/vendor/capture-body.glb +0 -0
  1713. package/vendor/capture-face.glb +0 -0
  1714. package/vendor/installed-index.mjs +1 -1
  1715. package/vendor/vehicle-package-v2.mjs +6451 -0
@@ -0,0 +1,1069 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultFetch = exports.PENDING_AUDIO_ORIGIN = exports.FIRING_COMB_OCTAVE_OFF = exports.FIRING_COMB_PASS = exports.QUIET_RMS_DBFS = exports.SILENT_PEAK_DBFS = void 0;
4
+ exports.measureWav = measureWav;
5
+ exports.judgeWav = judgeWav;
6
+ exports.judgeRungSpectral = judgeRungSpectral;
7
+ exports.judgeClipDc = judgeClipDc;
8
+ exports.judgeHornRow = judgeHornRow;
9
+ exports.collectLadders = collectLadders;
10
+ exports.judgeLadders = judgeLadders;
11
+ exports.judgeRevLimiterRow = judgeRevLimiterRow;
12
+ exports.sourceRepitchTake = sourceRepitchTake;
13
+ exports.sourcedRecordingKey = sourcedRecordingKey;
14
+ exports.judgeNearDuplicates = judgeNearDuplicates;
15
+ exports.rungClips = rungClips;
16
+ exports.judgeAgainstReference = judgeAgainstReference;
17
+ exports.audioPitchMeta = audioPitchMeta;
18
+ exports.judgeRungPitch = judgeRungPitch;
19
+ exports.collectAudioRows = collectAudioRows;
20
+ exports.runtimeRowIssues = runtimeRowIssues;
21
+ exports.sha256OfCid = sha256OfCid;
22
+ exports.sealedClosureSha256s = sealedClosureSha256s;
23
+ exports.unconsumedAudioRows = unconsumedAudioRows;
24
+ exports.closureMembershipIssues = closureMembershipIssues;
25
+ exports.localFileFor = localFileFor;
26
+ exports.provisionalAudio = provisionalAudio;
27
+ exports.checkAudioLocal = checkAudioLocal;
28
+ exports.checkAudioReadBack = checkAudioReadBack;
29
+ exports.formatAudioReport = formatAudioReport;
30
+ /**
31
+ * `helix vehicle audio-check` — does every sound a vehicle package declares actually play?
32
+ *
33
+ * WHY. A vehicle's audio fails SILENTLY. The engine's PortableVehicleAudioAdapter (helix-web-engine-new
34
+ * systems/engine-core/src/audio/vehicle/PortableVehicleAudioAdapter.ts) loads an asset row only when it carries a
35
+ * non-empty `url`, a hex `checksumSha256`, positive `bytes` and `mediaType: "audio/wav"`; it then fetches the url and
36
+ * refuses any body whose size or digest differs. A `cid`-only row, a url that 404s, a re-encoded file or an MP3 all
37
+ * end the same way: no error anywhere, a car that makes no sound, and a visual-QA pass (the gate never plays audio).
38
+ *
39
+ * This mirrors the adapter's selection rules exactly:
40
+ * - bank samples: every rung named by the `engineBlend` / `exhaustBlend` blends must be a `bank.assets` row by name;
41
+ * - slot one-shots: a slot row's asset is used when its `name` is one of that slot's `buffers`.
42
+ * and then goes one step further than the adapter: it decodes the WAV and measures it, because a digest-correct file
43
+ * of digital silence plays "successfully" and is still a silent car.
44
+ *
45
+ * Two modes share one report: PRE-SEAL (local files beside the package, before any upload) and READ-BACK (the
46
+ * published item's package, every url fetched over the network exactly as the engine will).
47
+ */
48
+ const node_crypto_1 = require("node:crypto");
49
+ const node_fs_1 = require("node:fs");
50
+ const node_path_1 = require("node:path");
51
+ const audioDefects_1 = require("./audioDefects");
52
+ const audioDistinct_1 = require("./audioDistinct");
53
+ const audioReference_1 = require("./audioReference");
54
+ const audioSpectral_1 = require("./audioSpectral");
55
+ const audioProvenance_1 = require("./audioProvenance");
56
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
57
+ /** Below this peak a sample is treated as silent. −60 dBFS is ~0.1 % of full scale. */
58
+ exports.SILENT_PEAK_DBFS = -60;
59
+ /** Below this RMS a sample is "very quiet": audible only with gain, flagged as a warning. */
60
+ exports.QUIET_RMS_DBFS = -50;
61
+ const dbfs = (linear) => (linear > 0 ? 20 * Math.log10(linear) : Number.NEGATIVE_INFINITY);
62
+ const round1 = (n) => (Number.isFinite(n) ? Math.round(n * 10) / 10 : n);
63
+ /**
64
+ * Parse a RIFF/WAVE file and measure it. Throws with a plain reason on anything the engine's decoder would not take.
65
+ * Handles PCM 8/16/24/32-bit and IEEE float 32/64, plus WAVE_FORMAT_EXTENSIBLE carrying either.
66
+ */
67
+ function measureWav(bytes) {
68
+ const buf = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
69
+ if (buf.length < 12 || buf.toString('ascii', 0, 4) !== 'RIFF' || buf.toString('ascii', 8, 12) !== 'WAVE') {
70
+ const head = buf.toString('ascii', 0, 4);
71
+ const hint = head.startsWith('ID3') || (buf[0] === 0xff && (buf[1] & 0xe0) === 0xe0) ? ' (this looks like an MP3)'
72
+ : head === 'OggS' ? ' (this is an OGG)' : head === 'fLaC' ? ' (this is a FLAC)' : '';
73
+ throw new Error(`not a RIFF/WAVE file${hint}`);
74
+ }
75
+ let offset = 12;
76
+ let fmt;
77
+ let data;
78
+ while (offset + 8 <= buf.length) {
79
+ const id = buf.toString('ascii', offset, offset + 4);
80
+ const size = buf.readUInt32LE(offset + 4);
81
+ const body = offset + 8;
82
+ if (id === 'fmt ') {
83
+ if (size < 16)
84
+ throw new Error('WAV fmt chunk is truncated');
85
+ let tag = buf.readUInt16LE(body);
86
+ if (tag === 0xfffe && size >= 40)
87
+ tag = buf.readUInt16LE(body + 24); // EXTENSIBLE: the real tag is in the sub-format GUID
88
+ fmt = {
89
+ tag,
90
+ channels: buf.readUInt16LE(body + 2),
91
+ rate: buf.readUInt32LE(body + 4),
92
+ blockAlign: buf.readUInt16LE(body + 12),
93
+ bits: buf.readUInt16LE(body + 14),
94
+ };
95
+ }
96
+ else if (id === 'data') {
97
+ data = buf.subarray(body, Math.min(buf.length, body + size));
98
+ }
99
+ offset = body + size + (size % 2);
100
+ }
101
+ if (!fmt)
102
+ throw new Error('WAV has no fmt chunk');
103
+ if (!data)
104
+ throw new Error('WAV has no data chunk');
105
+ if (fmt.channels < 1 || fmt.rate < 1 || fmt.blockAlign < 1)
106
+ throw new Error('WAV fmt chunk is malformed');
107
+ const format = fmt.tag === 1 ? 'pcm' : fmt.tag === 3 ? 'float' : 'other';
108
+ const frames = Math.floor(data.length / fmt.blockAlign);
109
+ const bytesPerSample = fmt.bits / 8;
110
+ let peak = 0;
111
+ let sumSquares = 0;
112
+ let count = 0;
113
+ if (format !== 'other' && Number.isInteger(bytesPerSample) && bytesPerSample >= 1) {
114
+ const read = (at) => {
115
+ if (format === 'float')
116
+ return bytesPerSample === 8 ? data.readDoubleLE(at) : data.readFloatLE(at);
117
+ switch (bytesPerSample) {
118
+ case 1: return (data.readUInt8(at) - 128) / 128;
119
+ case 2: return data.readInt16LE(at) / 32768;
120
+ case 3: return data.readIntLE(at, 3) / 8388608;
121
+ case 4: return data.readInt32LE(at) / 2147483648;
122
+ default: return 0;
123
+ }
124
+ };
125
+ const total = frames * fmt.channels;
126
+ // Large ladders are ~1-3 MB; a stride keeps a 100 MB file from stalling the CLI while staying statistically exact
127
+ // enough for a silence verdict (peak is still taken over every visited sample).
128
+ const stride = total > 4_000_000 ? Math.ceil(total / 4_000_000) : 1;
129
+ for (let i = 0; i < total; i += stride) {
130
+ const at = i * bytesPerSample;
131
+ if (at + bytesPerSample > data.length)
132
+ break;
133
+ const v = read(at);
134
+ const a = Math.abs(v);
135
+ if (a > peak)
136
+ peak = a;
137
+ sumSquares += v * v;
138
+ count += 1;
139
+ }
140
+ }
141
+ return {
142
+ format,
143
+ formatTag: fmt.tag,
144
+ channels: fmt.channels,
145
+ sampleRate: fmt.rate,
146
+ bitsPerSample: fmt.bits,
147
+ frames,
148
+ durationS: frames / fmt.rate,
149
+ peakDbfs: round1(dbfs(peak)),
150
+ rmsDbfs: round1(dbfs(count > 0 ? Math.sqrt(sumSquares / count) : 0)),
151
+ };
152
+ }
153
+ /** Judge one decoded sample. Returns issues; empty means it will play and is audible. */
154
+ function judgeWav(path, label, m) {
155
+ const issues = [];
156
+ if (m.format === 'other') {
157
+ issues.push({ code: 'AUDIO_NOT_PCM', level: 'error', path, message: `${label} is WAV format tag ${m.formatTag}, not PCM or float`,
158
+ fix: 'transcode to PCM: ffmpeg -i in.wav -ac 1 -ar 48000 -c:a pcm_s16le out.wav' });
159
+ return issues;
160
+ }
161
+ if (m.frames === 0 || m.durationS < 0.01) {
162
+ issues.push({ code: 'AUDIO_EMPTY', level: 'error', path, message: `${label} has no audio frames`, fix: 'replace it with the real recording' });
163
+ return issues;
164
+ }
165
+ if (m.peakDbfs < exports.SILENT_PEAK_DBFS) {
166
+ issues.push({ code: 'AUDIO_SILENT', level: 'error', path,
167
+ message: `${label} is silent (peak ${m.peakDbfs} dBFS over ${m.durationS.toFixed(2)} s)`,
168
+ fix: 'the file decodes but carries no sound: re-export the recording (check the source track and any fade/gain stage)' });
169
+ }
170
+ else if (m.rmsDbfs < exports.QUIET_RMS_DBFS) {
171
+ issues.push({ code: 'AUDIO_VERY_QUIET', level: 'warn', path,
172
+ message: `${label} is very quiet (RMS ${m.rmsDbfs} dBFS, peak ${m.peakDbfs} dBFS)`,
173
+ fix: 'normalise it (ladder rungs to each other) and set the level with engineGainDb / exhaustGainDb' });
174
+ }
175
+ return issues;
176
+ }
177
+ /** A bank rung must be a real broadband engine sound, not a near-pure synthetic tone (round 5's biggest regression). */
178
+ function judgeRungSpectral(path, label, bytes) {
179
+ let rich;
180
+ try {
181
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes);
182
+ rich = (0, audioSpectral_1.spectralRichness)(samples, sampleRate);
183
+ }
184
+ catch {
185
+ return []; // a malformed/undecodable WAV is already named by judgeWav/measureWav; nothing more to add here
186
+ }
187
+ if (!rich.isNearPureTone)
188
+ return [];
189
+ return [{
190
+ code: 'AUDIO_NEAR_PURE_TONE', level: 'error', path,
191
+ message: `${label} is a near-pure synthetic tone, not an engine recording: ${rich.why} (autocorr ${rich.autocorrMax.toFixed(4)}, flatness ${rich.flatness.toFixed(3)}, ${rich.nLines20} line(s))`,
192
+ fix: 'replace the rung with the recording from the most accurate sim mod of the car (`helix vehicle audio-import`), else a mod of the same engine family; vehicle audio is never synthesised',
193
+ }];
194
+ }
195
+ /**
196
+ * Clipping and DC offset, measured on the decoded samples of any row. Flat-topped runs (>= 3 consecutive samples) at
197
+ * the converter's rails, or at the file's own peak after it was clipped and turned down, are hard distortion the ear
198
+ * hears on a sustained engine note; the calibration set of real recordings (993, F355, platform pack, 41 field recordings) peaks at 0.04 % of samples,
199
+ * the F40's limited rungs sit at 0.1-0.7 %. DC offset
200
+ * clicks when a one-shot starts or a loop wraps; real recordings measured up to 0.0045 full scale (0.0143 on the worst of 41 field recordings).
201
+ */
202
+ function judgeClipDc(path, label, bytes, use) {
203
+ let stats;
204
+ try {
205
+ stats = (0, audioDefects_1.clipDcStats)((0, audioSpectral_1.decodeWavMono)(bytes, true).samples);
206
+ }
207
+ catch {
208
+ return []; // an undecodable WAV is already named by measureWav
209
+ }
210
+ const issues = [];
211
+ if (stats.peak < 1e-3)
212
+ return issues; // silent: AUDIO_SILENT says it
213
+ const pct = (stats.clipFraction * 100).toFixed(2);
214
+ const severe = stats.clipFraction >= (use === 'bank' ? 0.005 : 0.02);
215
+ if (stats.clipSamples >= 12 && (severe || stats.clipFraction >= 0.001)) {
216
+ const where = stats.clipKind === 'full-scale' ? 'at full scale' : `at the file's own peak (${(20 * Math.log10(stats.peak)).toFixed(1)} dBFS), i.e. clipped and then turned down`;
217
+ issues.push({ code: 'AUDIO_CLIPPED', level: severe ? 'error' : 'warn', path,
218
+ message: `${label} is clipped: ${pct}% of its samples (${stats.clipSamples}, longest flat run ${stats.clipRun}) sit in flat-topped runs ${where}`,
219
+ fix: 'render or normalise with headroom (peak at -3 dBFS or lower, no hard limiter or tanh drive pushed past the rails) before exporting; a recording that clips at capture needs re-gaining and re-recording, turning a clipped file down does not unclip it' });
220
+ }
221
+ const adc = Math.abs(stats.dc);
222
+ const ratio = stats.rms > 0 ? adc / stats.rms : 0;
223
+ if (adc >= 0.02) {
224
+ const bad = adc >= 0.05 || ratio >= 0.5;
225
+ issues.push({ code: 'AUDIO_DC_OFFSET', level: bad ? 'error' : 'warn', path,
226
+ message: `${label} has a DC offset of ${stats.dc >= 0 ? '+' : ''}${stats.dc.toFixed(4)} full scale (${(ratio * 100).toFixed(0)}% of its RMS): it clicks when the sample starts or the loop wraps`,
227
+ fix: 'remove it before export: subtract the mean, or high-pass at 20-30 Hz (ffmpeg -i in.wav -af highpass=f=25 out.wav); a synthesis chain with an asymmetric limiter or waveshaper adds it, so remove the mean after the nonlinearity' });
228
+ }
229
+ return issues;
230
+ }
231
+ /** A horn recorded from a real car has jitter and a noise floor; an exactly periodic synthetic tone is a beep. */
232
+ function judgeHornRow(path, label, bytes) {
233
+ try {
234
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes, true);
235
+ let peak = 0;
236
+ for (let i = 0; i < samples.length; i += 1)
237
+ peak = Math.max(peak, Math.abs(samples[i]));
238
+ if (peak < 1e-3)
239
+ return [];
240
+ const verdict = (0, audioDefects_1.judgeHorn)(samples, sampleRate);
241
+ if (!verdict.periodic)
242
+ return [];
243
+ return [{ code: 'AUDIO_HORN_SYNTHETIC', level: 'warn', path,
244
+ message: `${label} is a perfectly periodic synthetic tone: ${verdict.why}`,
245
+ fix: 'use a recording of a real horn, or add what a real horn has: slow pitch jitter (+-0.3-1 %), amplitude shimmer, a faint broadband floor and a short attack and release; a two-tone horn is fine, an exact two-sine sum is not' }];
246
+ }
247
+ catch {
248
+ return [];
249
+ }
250
+ }
251
+ /** Every distinct rung ladder the package's engine and exhaust blends drive. */
252
+ function collectLadders(pkg) {
253
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : undefined;
254
+ const bank = audio && isRecord(audio.bank) ? audio.bank : undefined;
255
+ if (!audio || !bank)
256
+ return [];
257
+ const blends = isRecord(bank.blends) ? bank.blends : {};
258
+ const seen = new Set();
259
+ const out = [];
260
+ for (const key of ['engineBlend', 'exhaustBlend']) {
261
+ const name = audio[key];
262
+ if (typeof name !== 'string')
263
+ continue;
264
+ const blend = blends[name];
265
+ if (!isRecord(blend) || !Array.isArray(blend.samples))
266
+ continue;
267
+ blend.samples.forEach((ladder, index) => {
268
+ if (!Array.isArray(ladder))
269
+ return;
270
+ const rungs = ladder
271
+ .filter((r) => Array.isArray(r) && typeof r[0] === 'string' && typeof r[1] === 'number' && r[1] > 0)
272
+ .map((r) => ({ name: r[0], rpm: r[1] }));
273
+ const id = rungs.map((r) => `${r.name}@${r.rpm}`).join('|');
274
+ if (rungs.length === 0 || seen.has(id))
275
+ return;
276
+ seen.add(id);
277
+ out.push({ path: `audio.bank.blends.${name}.samples[${index}]`, blend: name, rungs });
278
+ });
279
+ }
280
+ return out;
281
+ }
282
+ /** Ladder-level content defects: a copied rung, a fixed formant stack, a fixed tone. Needs each rung's decoded bytes. */
283
+ function judgeLadders(pkg, bytesByName) {
284
+ const meta = audioPitchMeta(pkg);
285
+ const issues = [];
286
+ for (const ladder of collectLadders(pkg)) {
287
+ const rungs = [];
288
+ for (const r of ladder.rungs) {
289
+ const bytes = bytesByName.get(r.name);
290
+ if (!bytes)
291
+ continue;
292
+ try {
293
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes, true);
294
+ rungs.push({ rpm: r.rpm, f0: (0, audioSpectral_1.firingFundamental)(r.rpm, meta.cylinderCount, meta.strokes, meta.crankLayout), samples, sampleRate });
295
+ }
296
+ catch {
297
+ // named by judgeWav
298
+ }
299
+ }
300
+ if (rungs.length < 3)
301
+ continue;
302
+ const where = `ladder ${ladder.blend} (${ladder.path})`;
303
+ const formants = (0, audioDefects_1.ladderFormantConstancy)(rungs);
304
+ if (formants && formants.meanFarCorrelation >= 0.3) {
305
+ const err = formants.meanFarCorrelation >= 0.5;
306
+ issues.push({ code: 'AUDIO_LADDER_FIXED_FORMANTS', level: err ? 'error' : 'warn', path: ladder.path,
307
+ message: `${where}: every rung carries the same spectral peaks and notches at the same absolute frequencies regardless of rpm (harmonic-envelope correlation ${formants.meanFarCorrelation.toFixed(2)} across ${formants.pairs} rung pairs; real recordings measure <= 0.1): a fixed resonator stack, which reads as a synthetic voice`,
308
+ fix: 'a fixed resonator stack is a synthesis artefact: take the ladder from a sim mod\'s own recordings (`helix vehicle audio-import`), where the dominant bands move with rpm and load as a real engine\'s do' });
309
+ }
310
+ const tone = (0, audioDefects_1.ladderFixedTone)(rungs);
311
+ if (tone && tone.rungs >= 5 && tone.rungs >= 0.55 * tone.total) {
312
+ const err = tone.rungs >= 6 && tone.rungs >= 0.75 * tone.total;
313
+ issues.push({ code: 'AUDIO_LADDER_FIXED_TONE', level: err ? 'error' : 'warn', path: ladder.path,
314
+ message: `${where}: a narrowband line at ~${Math.round(tone.hz)} Hz sits at the same frequency in ${tone.rungs} of ${tone.total} rungs while the firing fundamental moves (real recordings reach at most 6 of 15): a fixed oscillator or resonator ring mixed into every rung`,
315
+ fix: 'take the ladder from a sim mod\'s recordings (`helix vehicle audio-import`); a fixed tone in every rung is a synthesis artefact, and engine tones must track rpm' });
316
+ }
317
+ const bankAssets = (() => {
318
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : {};
319
+ return isRecord(audio.bank) && Array.isArray(audio.bank.assets) ? audio.bank.assets.filter(isRecord) : [];
320
+ })();
321
+ const takeAt = new Map(ladder.rungs.map((r) => [r.rpm, sourceRepitchTake(bankAssets.find((a) => a.name === r.name))]));
322
+ for (const copy of (0, audioDefects_1.ladderResampledCopies)(rungs)) {
323
+ if (copy.score < 0.65)
324
+ continue;
325
+ const take = takeAt.get(copy.lowRpm);
326
+ if (take && take === takeAt.get(copy.highRpm))
327
+ continue; // the source plays this one take at both rpms
328
+ const err = copy.score >= 0.8;
329
+ issues.push({ code: 'AUDIO_LADDER_RUNG_COPY', level: err ? 'error' : 'warn', path: ladder.path,
330
+ message: `${where}: the ${copy.highRpm} rpm rung is a resampled copy of the ${copy.lowRpm} rpm rung (aperiodic residual correlation ${copy.score.toFixed(2)} at playback ratio ${copy.ratio.toFixed(3)}; independent rungs measure <= 0.5): one recording stretched to two pitches`,
331
+ fix: 'do not resample one rung into its neighbours: use a sim mod\'s independently recorded rungs (`helix vehicle audio-import`); the runtime already pitch-shifts between rungs' });
332
+ }
333
+ }
334
+ return issues;
335
+ }
336
+ /** The rev limiter slot is re-fired every 60 ms by the runtime, so it has to be a short crack: a long clip stacks into a held tone. */
337
+ function judgeRevLimiterRow(path, label, bytes) {
338
+ try {
339
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes, true);
340
+ let peak = 0;
341
+ for (let i = 0; i < samples.length; i += 1)
342
+ peak = Math.max(peak, Math.abs(samples[i]));
343
+ if (peak < 1e-3)
344
+ return [];
345
+ const v = (0, audioDefects_1.judgeRevLimiter)(samples, sampleRate);
346
+ if (v.level === 'ok')
347
+ return [];
348
+ const cut = v.cutHz > 0 && v.cutDepthDb >= 6 ? ` (it carries its own ${v.cutHz.toFixed(1)} Hz cut ${v.cutDepthDb.toFixed(0)} dB deep, which the overlap smears away)` : '';
349
+ return [{ code: 'AUDIO_REV_LIMITER_HELD', level: v.level, path,
350
+ message: `${label} is ${v.durationS.toFixed(2)} s long, but the runtime fires the rev-limiter slot every ${(audioDefects_1.REV_LIMITER_INTERVAL_S * 1000).toFixed(0)} ms while the car sits on its limiter, so about ${v.stackedVoices.toFixed(0)} copies play at once: that is a held tone, not a fuel-cut stutter${cut}`,
351
+ fix: 'use a real recording of this car (or a BeamNG mod of it) cut down to one fuel-cut crack of 0.05-0.2 s with its natural decay: the stutter is the 60 ms retrigger, so a long recording of the car held on its limiter is not the sample' }];
352
+ }
353
+ catch {
354
+ return [];
355
+ }
356
+ }
357
+ /**
358
+ * The identity of the sourced recording a row cites: two roles citing the same take of the same source file are the
359
+ * sim's own choice to play one recording for both (BeamNG drives tyre squeal and scrub from one skid loop; the idle
360
+ * slot names the ladder's own idle rung), not lazy reuse. Undefined for an unsourced row.
361
+ */
362
+ /**
363
+ * A rung the SOURCE itself re-pitched (Assetto Corsa auto-pitch, an FMOD event's RPM pitch automation): the take it
364
+ * plays, without the rate. Rungs sharing it are the sim playing one recording at several rpms — what the source does,
365
+ * not a resampled copy passed off as independent recordings. Undefined for any other row.
366
+ */
367
+ function sourceRepitchTake(row) {
368
+ const p = row && isRecord(row.provenance) ? row.provenance : undefined;
369
+ if (!p || !['sim-mod', 'sim-official'].includes(String(p.kind)) || typeof p.sourceSha256 !== 'string')
370
+ return undefined;
371
+ const transforms = Array.isArray(p.transforms) ? p.transforms : [];
372
+ if (!transforms.some((t) => isRecord(t) && /^fmod-(autopitch|pitch-automation)-varispeed$/.test(String(t.kind))))
373
+ return undefined;
374
+ return JSON.stringify([p.sourceSha256, p.sourceFile ?? null, p.sample ?? null, p.subsong ?? null]);
375
+ }
376
+ function sourcedRecordingKey(row) {
377
+ const p = isRecord(row.provenance) ? row.provenance : undefined;
378
+ if (!p || !['sim-mod', 'sim-official', 'recording'].includes(String(p.kind)))
379
+ return undefined;
380
+ if (typeof p.sourceSha256 !== 'string' || !p.sourceSha256)
381
+ return undefined;
382
+ return JSON.stringify([p.sourceSha256, p.sourceFile ?? null, p.sample ?? null, p.subsong ?? null, p.transforms ?? null]);
383
+ }
384
+ /**
385
+ * Near-duplicate SLOTS across roles: one take, one random seed or one resampled recording used under two names that are
386
+ * meant to sound different (shift up vs shift down, horn vs an engine rung, an engine rung vs an exhaust rung, a door
387
+ * open vs close). Same-ladder clusters are an error once they take half the ladder (or three rungs), a warning below.
388
+ */
389
+ function judgeNearDuplicates(clips) {
390
+ const distinct = [];
391
+ const byId = new Map();
392
+ for (const c of clips) {
393
+ try {
394
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(c.bytes, true);
395
+ let peak = 0;
396
+ for (let i = 0; i < samples.length; i += 1)
397
+ peak = Math.max(peak, Math.abs(samples[i]));
398
+ if (peak < 1e-3)
399
+ continue;
400
+ const id = `${c.use === 'bank' ? `rung ${c.name}@${c.rpm} rpm` : `slot ${c.role} "${c.name}"`} [${c.role}]`;
401
+ byId.set(id, c);
402
+ distinct.push({ id, samples, sampleRate, role: c.role, rpm: c.rpm });
403
+ }
404
+ catch {
405
+ // named by measureWav
406
+ }
407
+ }
408
+ if (distinct.length < 2)
409
+ return [];
410
+ const { clusters } = (0, audioDistinct_1.findNearDuplicates)(distinct);
411
+ const issues = [];
412
+ const ladderSize = new Map();
413
+ for (const d of distinct)
414
+ if (d.rpm !== undefined)
415
+ ladderSize.set(d.role, (ladderSize.get(d.role) ?? 0) + 1);
416
+ for (const cl of clusters) {
417
+ const refs = cl.ids.map((id) => byId.get(id));
418
+ const names = refs.map((r) => (r.use === 'bank' ? `${r.name} (${r.rpm} rpm)` : `slot ${r.role}`));
419
+ const roles = [...new Set(refs.map((r) => (r.use === 'bank' ? `ladder ${r.role}` : `slot ${r.role}`)))];
420
+ const top = cl.pairs.reduce((m, p) => (p.envNcc > m.envNcc ? p : m), cl.pairs[0] ?? { envNcc: 0, ratio: 1, lineNcc: 0 });
421
+ const best = top.envNcc;
422
+ const keys = new Set(refs.map((r) => r.source));
423
+ if ((cl.crossRole || cl.exact) && keys.size === 1 && refs[0].source)
424
+ continue; // one sourced take, by the sim's own choice
425
+ const takes = new Set(refs.map((r) => r.take));
426
+ if (!cl.crossRole && takes.size === 1 && refs[0].take)
427
+ continue; // one take the source itself plays at several rpms
428
+ const evidence = cl.exact
429
+ ? 'the samples are identical'
430
+ : `band-envelope correlation ${best.toFixed(2)} after undoing a ${top.ratio.toFixed(3)} playback ratio (line-pattern correlation ${top.lineNcc.toFixed(2)}); independent recordings measure <= 0.66, a resampled copy 0.93-1.0`;
431
+ const first = refs[0];
432
+ const proof = cl.confirmed ? '' : ' (the match is below copy strength and the line pattern does not corroborate it, so this is a suspicion: check by ear and by spectrogram)';
433
+ if (cl.crossRole || cl.exact) {
434
+ issues.push({ code: cl.confirmed ? 'AUDIO_NEAR_DUPLICATE_SOUNDS' : 'AUDIO_POSSIBLE_DUPLICATE_SOUNDS', level: cl.confirmed ? 'error' : 'warn', path: first.path,
435
+ message: `${names.join(', ')} are one recording under different roles (${roles.join('; ')}): ${evidence}${proof}`,
436
+ fix: 'use a distinct real recording for each role (a BeamNG mod of the car usually ships separate ones); a shift-down is not the shift-up retimed, a horn is not an engine rung, an exhaust rung is not an engine rung resampled' });
437
+ continue;
438
+ }
439
+ const total = ladderSize.get(first.role) ?? cl.ids.length;
440
+ const heavy = cl.confirmed && (cl.ids.length >= 3 || cl.ids.length >= total / 2);
441
+ issues.push({ code: 'AUDIO_NEAR_DUPLICATE_RUNGS', level: heavy ? 'error' : 'warn', path: first.path,
442
+ message: `${cl.ids.length} rungs of ladder ${first.role} (${names.join(', ')}) are one recording resampled to different pitches: ${evidence}${proof}`,
443
+ fix: 'use a distinct real recording for every rung (own take, own cycle-to-cycle variation); the runtime already pitch-shifts between rungs' });
444
+ }
445
+ return issues;
446
+ }
447
+ /** Every (ladder, rung) pair that has decoded bytes, as clips with the ladder as their role. */
448
+ function rungClips(pkg, rungBytes) {
449
+ const out = [];
450
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : {};
451
+ const bankAssets = isRecord(audio.bank) && Array.isArray(audio.bank.assets) ? audio.bank.assets.filter(isRecord) : [];
452
+ for (const ladder of collectLadders(pkg)) {
453
+ for (const r of ladder.rungs) {
454
+ const bytes = rungBytes.get(r.name);
455
+ const asset = bankAssets.find((a) => a.name === r.name);
456
+ if (bytes)
457
+ out.push({ use: 'bank', path: ladder.path, role: ladder.path, name: r.name, rpm: r.rpm, label: `${r.name} (${r.rpm} rpm)`, bytes, source: asset ? sourcedRecordingKey(asset) : undefined, take: sourceRepitchTake(asset) });
458
+ }
459
+ }
460
+ return out;
461
+ }
462
+ /** Compare the candidate's idle voice (and any named slot) with real-car reference clips. */
463
+ function judgeAgainstReference(pkg, clips, reference) {
464
+ const issues = [];
465
+ const rows = [];
466
+ const bySlot = (slot) => clips.find((c) => c.use === 'slot' && c.role === slot);
467
+ const lowestRung = () => {
468
+ const ladders = collectLadders(pkg);
469
+ for (const ladder of ladders) {
470
+ const rung = [...ladder.rungs].sort((a, b) => a.rpm - b.rpm)[0];
471
+ const hit = rung && clips.find((c) => c.use === 'bank' && c.name === rung.name);
472
+ if (hit)
473
+ return hit;
474
+ }
475
+ return undefined;
476
+ };
477
+ for (const [slot, refs] of reference.bySlot) {
478
+ const target = slot === 'idle' ? (bySlot('idle') ?? lowestRung()) : bySlot(slot);
479
+ if (!target) {
480
+ issues.push({ code: 'AUDIO_REFERENCE_SLOT_MISSING', level: 'warn', path: `audio.slots[${slot}]`,
481
+ message: `a reference clip was supplied for "${slot}" but the package ships no ${slot === 'idle' ? 'idle sample or engine-ladder rung' : `consumed ${slot} sample`} to compare it with`,
482
+ fix: slot === 'idle' ? 'ship the engine ladder, or drop the reference' : `ship a ${slot} sample, or drop the reference` });
483
+ continue;
484
+ }
485
+ let cand;
486
+ try {
487
+ const d = (0, audioSpectral_1.decodeWavMono)(target.bytes, true);
488
+ cand = (0, audioReference_1.timbreMetrics)(d.samples, d.sampleRate);
489
+ }
490
+ catch {
491
+ continue;
492
+ }
493
+ const refMetrics = refs.map((r) => (0, audioReference_1.timbreMetrics)(r.samples, r.sampleRate));
494
+ const comparisons = (0, audioReference_1.compareToReference)(cand, refMetrics);
495
+ rows.push({ slot, candidate: target.label, references: refs.map((r) => r.source), comparisons });
496
+ const spread = refMetrics.length > 1 ? ` (${refMetrics.length} reference clips, median)` : '';
497
+ for (const c of comparisons) {
498
+ if (c.level === 'ok')
499
+ continue;
500
+ const unit = c.metric === 'roughness' ? '' : ' Hz';
501
+ const dir = c.ratio > 1 ? 'higher' : 'lower';
502
+ issues.push({ code: 'AUDIO_REFERENCE_TIMBRE', level: c.level, path: target.path,
503
+ message: `${slot === 'idle' ? 'idle voice' : `slot ${slot}`} (${target.label}): ${c.label} ${c.candidate.toFixed(c.metric === 'roughness' ? 2 : 0)}${unit} against ${c.reference.toFixed(c.metric === 'roughness' ? 2 : 0)}${unit} in the reference${spread}: x${c.ratio.toFixed(2)}, ${dir} than the real sound by more than a recording alone explains`,
504
+ fix: c.ratio > 1
505
+ ? 'the sample is far brighter or rougher than the real car: source this sound from a real recording of the car (or a BeamNG mod of it) made close to the engine, not a different engine or a recording with heavy added noise'
506
+ : 'the sample is far duller or smoother than the real car: source this sound from a real recording of the car (or a BeamNG mod of it) with the mechanical and exhaust content intact, not a different engine, a low-passed recording or a heavily processed one' });
507
+ }
508
+ }
509
+ return { issues, rows };
510
+ }
511
+ /**
512
+ * Comb ratio (the better of the firing series and its half-order series) at or above which a rung is pitched at its
513
+ * label. Measured on real sim-mod/official F40 ladders (Kunos AC, euan / Gabry BeamNG mods; 130 rungs): 0 below 1.5,
514
+ * 11 between 1.5 and 3, the rest above.
515
+ */
516
+ exports.FIRING_COMB_PASS = 3;
517
+ /**
518
+ * Below this the rung is off its label: two-octaves-down copies of those ladders measured below it on 128 of 130 rungs,
519
+ * one-octave-down copies on 74; a synthesised rung at the crank order (round 7's fault) measures about 0.6.
520
+ */
521
+ exports.FIRING_COMB_OCTAVE_OFF = 1.5;
522
+ function audioPitchMeta(pkg) {
523
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : {};
524
+ const cylinderCount = typeof audio.sampleCylinderCount === 'number' && Number.isFinite(audio.sampleCylinderCount) && audio.sampleCylinderCount > 0 ? audio.sampleCylinderCount : 4;
525
+ const strokes = typeof audio.strokes === 'number' && audio.strokes > 0 ? audio.strokes : 4;
526
+ const crankLayout = typeof audio.crankLayout === 'string' ? audio.crankLayout : undefined;
527
+ return { cylinderCount, strokes, crankLayout, electric: (0, audioProvenance_1.isElectricCar)(pkg) };
528
+ }
529
+ /**
530
+ * A ladder rung's pitch must match its rpm label against the firing fundamental for the declared cylinder count,
531
+ * strokes and crank layout. Rejects a rung an octave or more off (round 7 synthesised a flat-plane V8 at the crank
532
+ * order — two octaves low); a rung that merely shows no clear comb is a warning, not a fail (its pitch is unverifiable).
533
+ */
534
+ function judgeRungPitch(path, label, bytes, rpm, meta) {
535
+ if (meta.electric)
536
+ return []; // a motor whine has no firing series to judge a label against
537
+ const expected = (0, audioSpectral_1.firingFundamental)(rpm, meta.cylinderCount, meta.strokes, meta.crankLayout);
538
+ const layout = meta.crankLayout ?? 'flat-plane';
539
+ let est = null;
540
+ let comb = null;
541
+ try {
542
+ const { samples, sampleRate } = (0, audioSpectral_1.decodeWavMono)(bytes);
543
+ // A silent rung has no pitch to judge; judgeWav's AUDIO_SILENT already names it, so say nothing here.
544
+ let peak = 0;
545
+ for (let i = 0; i < samples.length; i += 1)
546
+ peak = Math.max(peak, Math.abs(samples[i]));
547
+ if (peak < 1e-3)
548
+ return [];
549
+ // The firing-comb cross-check decides first: a rung whose energy sits on the labelled firing comb is pitched at its
550
+ // label, whatever sub-harmonic a periodicity tracker locks onto (it did on every real F40 sim-mod ladder).
551
+ // Real flat-plane V8 and flat-six recordings carry the half-order series (each bank's collector) as strongly as
552
+ // the firing series, so the rung may sit on either comb: take the better of the two.
553
+ const onFiring = (0, audioSpectral_1.firingCombRatio)(samples, sampleRate, expected);
554
+ const onHalf = (0, audioSpectral_1.firingCombRatio)(samples, sampleRate, expected / 2);
555
+ comb = onFiring === null && onHalf === null ? null : Math.max(onFiring ?? 0, onHalf ?? 0);
556
+ if (comb !== null && comb >= exports.FIRING_COMB_PASS)
557
+ return [];
558
+ est = (0, audioSpectral_1.estimateFundamental)(samples, sampleRate, { fHi: Math.max(60, Math.min(1500, expected * 1.4)) });
559
+ }
560
+ catch {
561
+ return []; // a malformed/undecodable WAV is already named by judgeWav/measureWav
562
+ }
563
+ const combNote = comb === null ? '' : `; comb ratio ${comb.toFixed(2)} (energy on the firing series k×${expected.toFixed(0)} Hz, or its half-order series k×${(expected / 2).toFixed(0)} Hz, over the comb between them; a rung at its label measures >= ${exports.FIRING_COMB_PASS})`;
564
+ if (comb !== null && comb < exports.FIRING_COMB_OCTAVE_OFF) {
565
+ // As much energy between the comb's teeth as on them: the rung sits an octave (or more) below its label.
566
+ return [{ code: 'AUDIO_RUNG_PITCH_OCTAVE_OFF', level: 'error', path,
567
+ message: `${label} (${rpm} rpm): its energy sits between the teeth of the ${expected.toFixed(1)} Hz ${layout} firing comb and of its half-order comb${combNote}${est ? `; measured fundamental ${est.f0.toFixed(1)} Hz` : ''} — an octave or more off its label, or mislabelled`,
568
+ fix: `relabel the rung to the rpm its pitch really is, or correct sampleCylinderCount/strokes/crankLayout (expected ${expected.toFixed(0)} Hz: the ${meta.cylinderCount}-cyl/${meta.strokes}-stroke ${layout} firing fundamental for ${rpm} rpm)` }];
569
+ }
570
+ if (comb !== null) {
571
+ // Between the thresholds: the comb neither confirms nor refutes the label. Say so, never fail on the tracker alone.
572
+ return [{ code: 'AUDIO_RUNG_PITCH_OFF', level: 'warn', path,
573
+ message: `${label} (${rpm} rpm): ambiguous against the ${expected.toFixed(1)} Hz ${layout} firing fundamental${combNote}${est ? `; the periodicity tracker reads ${est.f0.toFixed(1)} Hz` : ''}`,
574
+ fix: `check the rung by ear and spectrogram against its ${rpm} rpm label (expected ${expected.toFixed(0)} Hz), and sampleCylinderCount/strokes/crankLayout` }];
575
+ }
576
+ if (est === null) {
577
+ return [{ code: 'AUDIO_RUNG_PITCH_UNVERIFIABLE', level: 'warn', path,
578
+ message: `${label} (${rpm} rpm): no clear harmonic comb, so its pitch cannot be verified against the ${expected.toFixed(0)} Hz ${layout} firing fundamental`,
579
+ fix: 're-export the rung as a clean steady-state loop so the comb estimator can lock a fundamental' }];
580
+ }
581
+ const ratio = est.f0 / expected;
582
+ const octaves = Math.log2(ratio);
583
+ const cents = Math.round(1200 * octaves);
584
+ if (Math.abs(octaves) >= 1) {
585
+ return [{ code: 'AUDIO_RUNG_PITCH_OCTAVE_OFF', level: 'error', path,
586
+ message: `${label} (${rpm} rpm): measured fundamental ${est.f0.toFixed(1)} Hz is ${cents >= 0 ? '+' : ''}${cents} cents (${ratio.toFixed(2)}x) from the ${expected.toFixed(1)} Hz ${layout} firing fundamental — ${octaves >= 0 ? 'an octave or more high' : 'an octave or more low'}`,
587
+ fix: `relabel the rung to the rpm its pitch really is, or correct sampleCylinderCount/strokes/crankLayout (expected ${expected.toFixed(0)} Hz: the ${meta.cylinderCount}-cyl/${meta.strokes}-stroke ${layout} firing fundamental for ${rpm} rpm)` }];
588
+ }
589
+ if (Math.abs(octaves) > 0.25) {
590
+ return [{ code: 'AUDIO_RUNG_PITCH_OFF', level: 'warn', path,
591
+ message: `${label} (${rpm} rpm): measured fundamental ${est.f0.toFixed(1)} Hz is ${cents >= 0 ? '+' : ''}${cents} cents (${ratio.toFixed(2)}x) from the ${expected.toFixed(1)} Hz ${layout} firing fundamental`,
592
+ fix: `relabel the rung to the rpm its pitch really is (expected ${expected.toFixed(0)} Hz), or correct sampleCylinderCount/strokes/crankLayout` }];
593
+ }
594
+ return [];
595
+ }
596
+ /**
597
+ * Every audio row the runtime would try to load, selected exactly as PortableVehicleAudioAdapter selects them.
598
+ * `includeUnconsumed` also returns the assets of `consumed: false` slots: they are part of the Package's runtime
599
+ * closure (the engine validator requires their url/checksum/bytes), so upload, provisioning and sealing need them even
600
+ * though the runtime does not play them today.
601
+ */
602
+ function collectAudioRows(pkg, opts = {}) {
603
+ const rows = [];
604
+ const issues = [];
605
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : undefined;
606
+ if (!audio)
607
+ return { rows, issues };
608
+ const bank = isRecord(audio.bank) ? audio.bank : undefined;
609
+ if (bank) {
610
+ const assets = Array.isArray(bank.assets) ? bank.assets : [];
611
+ const byName = new Map();
612
+ assets.forEach((row, index) => {
613
+ if (isRecord(row) && typeof row.name === 'string')
614
+ byName.set(row.name, { row, index });
615
+ });
616
+ const blends = isRecord(bank.blends) ? bank.blends : {};
617
+ const rungRpm = new Map();
618
+ for (const key of ['engineBlend', 'exhaustBlend']) {
619
+ const name = audio[key];
620
+ if (typeof name !== 'string')
621
+ continue;
622
+ const blend = blends[name];
623
+ if (!isRecord(blend) || !Array.isArray(blend.samples)) {
624
+ issues.push({ code: 'AUDIO_BLEND_MISSING', level: 'error', path: `audio.${key}`,
625
+ message: `${key} names blend "${name}", which audio.bank.blends does not define`,
626
+ fix: `add audio.bank.blends.${name} or point ${key} at an existing blend` });
627
+ continue;
628
+ }
629
+ for (const ladder of blend.samples) {
630
+ if (!Array.isArray(ladder))
631
+ continue;
632
+ for (const rung of ladder) {
633
+ if (!Array.isArray(rung) || typeof rung[0] !== 'string')
634
+ continue;
635
+ if (typeof rung[1] === 'number' && Number.isFinite(rung[1]) && rung[1] > 0)
636
+ rungRpm.set(rung[0], rung[1]);
637
+ }
638
+ }
639
+ }
640
+ for (const name of rungRpm.keys()) {
641
+ const hit = byName.get(name);
642
+ if (!hit) {
643
+ issues.push({ code: 'AUDIO_BANK_SAMPLE_MISSING', level: 'error', path: 'audio.bank.assets',
644
+ message: `blend rung "${name}" has no audio.bank.assets row with that name, so the ladder has a hole`,
645
+ fix: `add a bank.assets row { name: "${name}", file, ... } or remove the rung` });
646
+ continue;
647
+ }
648
+ rows.push({ path: `audio.bank.assets[${hit.index}]`, use: 'bank', rpm: rungRpm.get(name), row: hit.row });
649
+ }
650
+ }
651
+ const slots = Array.isArray(audio.slots) ? audio.slots : [];
652
+ for (const slot of slots) {
653
+ if (!isRecord(slot) || typeof slot.slot !== 'string')
654
+ continue;
655
+ if (slot.consumed === false && !opts.includeUnconsumed)
656
+ continue;
657
+ const slotName = slot.slot;
658
+ const buffers = new Set(Array.isArray(slot.buffers) ? slot.buffers.filter((b) => typeof b === 'string') : []);
659
+ const assets = Array.isArray(slot.assets) ? slot.assets : [];
660
+ assets.forEach((row, index) => {
661
+ if (!isRecord(row))
662
+ return;
663
+ const path = `audio.slots[${slotName}].assets[${index}]`;
664
+ if (typeof row.name !== 'string' || !buffers.has(row.name)) {
665
+ issues.push({ code: 'AUDIO_SLOT_ASSET_UNREFERENCED', level: 'error', path,
666
+ message: `slot ${slotName} ships asset "${String(row.name)}" but its buffers ${JSON.stringify([...buffers])} never name it, so the runtime never loads it`,
667
+ fix: `put "${String(row.name)}" in audio.slots[${slotName}].buffers (or rename the asset to the buffer it plays)` });
668
+ return;
669
+ }
670
+ rows.push({ path, use: 'slot', slot: slotName, row });
671
+ });
672
+ }
673
+ // Engine and exhaust are two voices: the engine note behind the block and the exhaust note behind the car differ.
674
+ // A single shared blend (round 5 shipped engineBlend == exhaustBlend) reads as one thin voice, not a twin-turbo V8.
675
+ const engineBlend = typeof audio.engineBlend === 'string' ? audio.engineBlend : '';
676
+ const exhaustBlend = typeof audio.exhaustBlend === 'string' ? audio.exhaustBlend : '';
677
+ if (engineBlend && exhaustBlend) {
678
+ const blend = (name) => {
679
+ const blends = bank && isRecord(bank.blends) ? bank.blends : {};
680
+ const b = isRecord(blends[name]) ? blends[name] : undefined;
681
+ const files = new Set();
682
+ if (b && Array.isArray(b.samples)) {
683
+ for (const ladder of b.samples)
684
+ if (Array.isArray(ladder))
685
+ for (const rung of ladder)
686
+ if (Array.isArray(rung) && typeof rung[0] === 'string')
687
+ files.add(rung[0]);
688
+ }
689
+ return files;
690
+ };
691
+ const engineFiles = blend(engineBlend);
692
+ const exhaustFiles = blend(exhaustBlend);
693
+ const same = engineBlend === exhaustBlend
694
+ || (engineFiles.size > 0 && engineFiles.size === exhaustFiles.size && [...engineFiles].every((f) => exhaustFiles.has(f)));
695
+ if (same && (0, audioProvenance_1.blendIsSourced)(pkg, engineBlend) && (0, audioProvenance_1.blendIsSourced)(pkg, exhaustBlend)) {
696
+ // A sim mod that records engine and exhaust as ONE combined set (the mmbng 993: exhaust sampleName "0") is a
697
+ // real recording, not synthesis; doubling it adds nothing, so say how to drop the duplicate layer.
698
+ issues.push({ code: 'AUDIO_ENGINE_EXHAUST_SHARED_RECORDING', level: 'warn', path: 'audio.exhaustBlend',
699
+ message: `engineBlend "${engineBlend}" and exhaustBlend "${exhaustBlend}" play the same sourced recording on both layers (the source ships one combined engine+exhaust set)`,
700
+ fix: 'omit exhaustBlend and give the exhaustLadder slot a reason ("the source records engine and exhaust as one combined set; it plays on the engine layer") — `helix vehicle audio-import` writes it that way' });
701
+ }
702
+ else if (engineBlend === exhaustBlend) {
703
+ issues.push({ code: 'AUDIO_ENGINE_EXHAUST_SAME_BLEND', level: 'error', path: 'audio.exhaustBlend',
704
+ message: `engineBlend and exhaustBlend both name "${engineBlend}": one recording drives both layers`,
705
+ fix: 'take a distinct exhaust ladder from the sim mod if it has one; if the mod records one combined set, omit exhaustBlend and say so in the exhaustLadder slot reason' });
706
+ }
707
+ else if (same) {
708
+ issues.push({ code: 'AUDIO_ENGINE_EXHAUST_SAME_BLEND', level: 'error', path: 'audio.exhaustBlend',
709
+ message: `engineBlend "${engineBlend}" and exhaustBlend "${exhaustBlend}" resolve to the same rung set: one recording drives both layers`,
710
+ fix: 'take distinct engine and exhaust ladders from the sim mod, or omit exhaustBlend when the source records one combined set' });
711
+ }
712
+ }
713
+ return { rows, issues };
714
+ }
715
+ /** The adapter's own shape test (`normalizedAsset`): fields a row must carry for the runtime to even request it. */
716
+ function runtimeRowIssues(r) {
717
+ const row = r.row;
718
+ const label = `${r.use === 'bank' ? 'bank sample' : `slot ${r.slot}`} "${String(row.name)}"`;
719
+ const missing = [];
720
+ if (typeof row.url !== 'string' || row.url.length === 0)
721
+ missing.push('url');
722
+ if (typeof row.checksumSha256 !== 'string' || !/^[a-f0-9]{64}$/i.test(row.checksumSha256))
723
+ missing.push('checksumSha256');
724
+ if (!Number.isSafeInteger(row.bytes) || Number(row.bytes) <= 0)
725
+ missing.push('bytes');
726
+ if (row.mediaType !== 'audio/wav')
727
+ missing.push('mediaType "audio/wav"');
728
+ if (missing.length === 0)
729
+ return [];
730
+ return [{ code: 'AUDIO_ROW_NOT_LOADABLE', level: 'error', path: r.path,
731
+ message: `${label} lacks ${missing.join(', ')}; the engine skips it without an error (silent ${r.use === 'bank' ? 'engine' : 'slot'})`,
732
+ fix: missing.includes('url')
733
+ ? 'upload each WAV as a verified Continuum object and record its public url, checksum and bytes before Package seal'
734
+ : 'fill the field from the exact WAV bytes the url serves' }];
735
+ }
736
+ /**
737
+ * Bare lowercase sha256 of a Continuum object id: `cid:sha256:<hex>` → `<hex>`, or a bare 64-hex sha unchanged.
738
+ * Undefined for anything that is neither (a malformed or absent cid/checksum), so the membership check can skip it.
739
+ */
740
+ function sha256OfCid(value) {
741
+ if (typeof value !== 'string')
742
+ return undefined;
743
+ const hex = value.startsWith('cid:sha256:') ? value.slice('cid:sha256:'.length) : value;
744
+ return /^[a-f0-9]{64}$/i.test(hex) ? hex.toLowerCase() : undefined;
745
+ }
746
+ /**
747
+ * The sha256s a Package Version SEALS, normalized to bare hex. The closure is the manifest's `root` and every
748
+ * `variants[].object` — the same set the publisher enforces and the runtime resolves audio from. Accepts a Package
749
+ * Version manifest, a publication intent (`{ packageVersion, objects }`), or a publication receipt
750
+ * (`{ objectCids }`), so the check works both before sealing (what we are about to seal) and after (what was sealed).
751
+ */
752
+ function sealedClosureSha256s(source) {
753
+ const shas = new Set();
754
+ const add = (value) => {
755
+ const sha = sha256OfCid(value);
756
+ if (sha)
757
+ shas.add(sha);
758
+ };
759
+ if (!isRecord(source))
760
+ return shas;
761
+ const version = isRecord(source.packageVersion) ? source.packageVersion : source;
762
+ if (isRecord(version.root))
763
+ add(version.root.cid);
764
+ for (const variant of Array.isArray(version.variants) ? version.variants : []) {
765
+ if (isRecord(variant) && isRecord(variant.object))
766
+ add(variant.object.cid);
767
+ }
768
+ for (const object of Array.isArray(source.objects) ? source.objects : []) {
769
+ if (isRecord(object) && isRecord(object.reference))
770
+ add(object.reference.cid);
771
+ }
772
+ for (const cid of Array.isArray(source.objectCids) ? source.objectCids : [])
773
+ add(cid);
774
+ return shas;
775
+ }
776
+ /**
777
+ * Membership: every loadable row's object must be sealed into the Package closure. The runtime resolves a vehicle's
778
+ * audio from the closure, not from an arbitrary public URL — a row whose cid (or the sha256 of its bytes) is not in
779
+ * the closure plays nothing and 404s, exactly as a missing url does, and it does so WITHOUT any error at the URL
780
+ * itself (the object is public; it is simply not one the Package owns). A missing reference is a hard error.
781
+ */
782
+ /**
783
+ * The assets of `consumed: false` slots that still ship a recording (idle, intake, transmissionWhine, tyreSqueal on an
784
+ * audio-import package). The runtime does not play them today, but they are in the Package's closure and the engine's
785
+ * package validator requires each one to be a complete, loadable row — a broken one stops the car being presented.
786
+ * So the checks verify they load (file or url, digest, size, a decodable WAV) without judging them as played sounds.
787
+ */
788
+ function unconsumedAudioRows(pkg) {
789
+ const played = new Set(collectAudioRows(pkg).rows.map((r) => r.path));
790
+ return collectAudioRows(pkg, { includeUnconsumed: true }).rows.filter((r) => !played.has(r.path));
791
+ }
792
+ function closureMembershipIssues(rows, closure) {
793
+ const issues = [];
794
+ for (const r of rows) {
795
+ const declared = typeof r.row.cid === 'string' && r.row.cid ? r.row.cid : r.row.checksumSha256;
796
+ const sha = sha256OfCid(declared);
797
+ if (!sha)
798
+ continue; // no cid and no usable sha256: AUDIO_ROW_NOT_LOADABLE / AUDIO_SOURCE_MISSING already names it
799
+ if (closure.has(sha))
800
+ continue;
801
+ const label = `${r.use === 'bank' ? 'bank sample' : `slot ${r.slot}`} "${String(r.row.name)}"`;
802
+ issues.push({ code: 'AUDIO_NOT_IN_CLOSURE', level: 'error', path: r.path,
803
+ message: `${label} references ${declared} (sha256 ${sha.slice(0, 12)}…), which is NOT a member of the sealed Package closure; the runtime loads a vehicle's audio from the closure and 404s this file`,
804
+ fix: 'seal this WAV into the package before publishing; a slot referencing an unsealed cid 404s at runtime (put the WAV beside the package so `vehicle publish` uploads and seals it, then re-publish — or add it to the Package closure)' });
805
+ }
806
+ return issues;
807
+ }
808
+ const sha256 = (bytes) => (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex');
809
+ /** Where a row's local file is: `file`, then `path`, then `name`, each beside the package and under `audio/`. */
810
+ function localFileFor(row, dir) {
811
+ const names = [row.file, row.path, row.name].filter((v) => typeof v === 'string' && v.length > 0);
812
+ for (const name of names) {
813
+ for (const candidate of [(0, node_path_1.resolve)(dir, name), (0, node_path_1.join)(dir, 'audio', (0, node_path_1.basename)(name)), (0, node_path_1.join)(dir, (0, node_path_1.basename)(name))]) {
814
+ if (candidate.startsWith((0, node_path_1.resolve)(dir)) && (0, node_fs_1.existsSync)(candidate))
815
+ return candidate;
816
+ }
817
+ }
818
+ return undefined;
819
+ }
820
+ /** Placeholder origin for local preflight; replace it with a verified public object URL before sealing. */
821
+ exports.PENDING_AUDIO_ORIGIN = 'https://pending-upload.invalid';
822
+ /**
823
+ * Fill each loadable row that has a LOCAL file but no url with the file's checksum/bytes/cid/mediaType and a
824
+ * placeholder url, so the engine's own package validator (which requires a complete runtime closure) can judge the
825
+ * rest of the package before anything is uploaded. Returns the copy and how many rows were filled.
826
+ */
827
+ function provisionalAudio(pkg, dir) {
828
+ if (!isRecord(pkg))
829
+ return { pkg, filled: 0 };
830
+ const out = JSON.parse(JSON.stringify(pkg));
831
+ const { rows } = collectAudioRows(out, { includeUnconsumed: true });
832
+ let filled = 0;
833
+ for (const r of rows) {
834
+ if (typeof r.row.url === 'string' && r.row.url)
835
+ continue;
836
+ const file = localFileFor(r.row, dir);
837
+ if (!file)
838
+ continue;
839
+ const bytes = new Uint8Array((0, node_fs_1.readFileSync)(file));
840
+ const sha = sha256(bytes);
841
+ Object.assign(r.row, { url: `${exports.PENDING_AUDIO_ORIGIN}/content/sha256/${sha.slice(0, 2)}/${sha}`, checksumSha256: sha, bytes: bytes.length, cid: `cid:sha256:${sha}`, mediaType: 'audio/wav' });
842
+ filled += 1;
843
+ }
844
+ return { pkg: out, filled };
845
+ }
846
+ const defaultFetch = async (url) => {
847
+ const response = await fetch(url, { redirect: 'follow', signal: AbortSignal.timeout(60_000), headers: { 'user-agent': 'helix-cli audio-check' } });
848
+ return { status: response.status, bytes: response.ok ? new Uint8Array(await response.arrayBuffer()) : new Uint8Array() };
849
+ };
850
+ exports.defaultFetch = defaultFetch;
851
+ function finish(mode, pkg, rows, issues, reference) {
852
+ const audio = isRecord(pkg) && isRecord(pkg.audio) ? pkg.audio : undefined;
853
+ // Provenance and the no-synthesis rule: a car without a recorded engine ladder (the runtime's synthesised fallback
854
+ // engine) is AUDIO_ENGINE_UNSOURCED, an error; it replaces the old AUDIO_FALLBACK_ENGINE warning.
855
+ const provenance = (0, audioProvenance_1.provenanceReport)(pkg);
856
+ issues.push(...provenance.issues);
857
+ const fallbackEngine = provenance.engineUnsourced || (!audio || !isRecord(audio.bank)) && audio?.drivetrain !== 'electric';
858
+ const errors = issues.filter((i) => i.level === 'error').length;
859
+ return { ok: errors === 0, mode, errors, warnings: issues.length - errors, fallbackEngine, rows, issues, ...(reference ? { reference } : {}), provenance: provenance.rows };
860
+ }
861
+ /**
862
+ * PRE-SEAL: every row that will be loaded must resolve to either a local WAV beside the Package or an already-public
863
+ * URL; local files are decoded and measured, and URLs are fetched. Exact object pins and public URLs are required
864
+ * before sealing, so these fields are optional only during local preflight.
865
+ */
866
+ async function checkAudioLocal(pkg, dir, fetchImpl = exports.defaultFetch, closure, options = {}) {
867
+ const { rows, issues } = collectAudioRows(pkg);
868
+ const unconsumed = unconsumedAudioRows(pkg);
869
+ if (closure)
870
+ issues.push(...closureMembershipIssues([...rows, ...unconsumed], closure));
871
+ const meta = audioPitchMeta(pkg);
872
+ const reports = [];
873
+ const rungBytes = new Map();
874
+ const slotClips = [];
875
+ for (const r of rows) {
876
+ const name = String(r.row.name);
877
+ const label = `${r.use === 'bank' ? 'bank sample' : `slot ${r.slot}`} "${name}"`;
878
+ const file = localFileFor(r.row, dir);
879
+ if (file) {
880
+ const bytes = new Uint8Array((0, node_fs_1.readFileSync)(file));
881
+ const report = { path: r.path, use: r.use, slot: r.slot, name, source: 'local', file, bytes: bytes.length, checksumSha256: sha256(bytes) };
882
+ try {
883
+ report.measure = measureWav(bytes);
884
+ issues.push(...judgeWav(r.path, label, report.measure));
885
+ issues.push(...judgeClipDc(r.path, label, bytes, r.use));
886
+ if (r.slot === 'horn')
887
+ issues.push(...judgeHornRow(r.path, label, bytes));
888
+ if (r.slot === 'revLimiter')
889
+ issues.push(...judgeRevLimiterRow(r.path, label, bytes));
890
+ if (r.use === 'slot' && r.slot)
891
+ slotClips.push({ use: 'slot', path: r.path, role: r.slot, name, label, bytes, source: sourcedRecordingKey(r.row) });
892
+ if (r.use === 'bank') {
893
+ rungBytes.set(name, bytes);
894
+ issues.push(...judgeRungSpectral(r.path, label, bytes));
895
+ if (r.rpm !== undefined)
896
+ issues.push(...judgeRungPitch(r.path, label, bytes, r.rpm, meta));
897
+ }
898
+ }
899
+ catch (error) {
900
+ issues.push({ code: 'AUDIO_NOT_WAV', level: 'error', path: r.path, message: `${label} (${file}): ${error.message}`,
901
+ fix: 'only PCM WAV plays: ffmpeg -i in.mp3 -ac 1 -ar 48000 -c:a pcm_s16le out.wav' });
902
+ }
903
+ reports.push(report);
904
+ continue;
905
+ }
906
+ if (typeof r.row.url === 'string' && r.row.url) {
907
+ reports.push(await checkRemoteRow(r, label, fetchImpl, issues, meta, rungBytes, slotClips));
908
+ continue;
909
+ }
910
+ issues.push({ code: 'AUDIO_SOURCE_MISSING', level: 'error', path: r.path,
911
+ message: `${label} has neither a local file beside the package (looked for file/path/name in the package dir and audio/) nor a url`,
912
+ fix: `put ${typeof r.row.file === 'string' ? String(r.row.file) : `${name}.wav`} in the package dir (or audio/), or give the row the public url of a platform sample` });
913
+ }
914
+ for (const r of unconsumed) {
915
+ const name = String(r.row.name);
916
+ const label = `slot ${r.slot} "${name}" (consumed: false, still in the closure)`;
917
+ const file = localFileFor(r.row, dir);
918
+ if (file) {
919
+ const bytes = new Uint8Array((0, node_fs_1.readFileSync)(file));
920
+ const report = { path: r.path, use: r.use, slot: r.slot, name, source: 'local', file, bytes: bytes.length, checksumSha256: sha256(bytes) };
921
+ try {
922
+ report.measure = measureWav(bytes);
923
+ }
924
+ catch (error) {
925
+ issues.push({ code: 'AUDIO_NOT_WAV', level: 'error', path: r.path, message: `${label} (${file}): ${error.message}`,
926
+ fix: 'only PCM WAV loads: ffmpeg -i in.mp3 -ac 1 -ar 48000 -c:a pcm_s16le out.wav' });
927
+ }
928
+ reports.push(report);
929
+ }
930
+ else if (typeof r.row.url === 'string' && r.row.url) {
931
+ reports.push(await checkRemoteRow(r, label, fetchImpl, issues, meta, undefined, undefined, { loadOnly: true }));
932
+ }
933
+ else {
934
+ issues.push({ code: 'AUDIO_SOURCE_MISSING', level: 'error', path: r.path,
935
+ message: `${label} has neither a local file beside the package nor a url; the engine's package validator refuses the car`,
936
+ fix: `put ${typeof r.row.file === 'string' ? String(r.row.file) : `${name}.wav`} in the package dir (or audio/), or empty the slot ({ consumed: false, buffers: [], reason })` });
937
+ }
938
+ }
939
+ issues.push(...judgeLadders(pkg, rungBytes));
940
+ const clips = [...slotClips, ...rungClips(pkg, rungBytes)];
941
+ issues.push(...judgeNearDuplicates(clips));
942
+ const ref = options.reference ? judgeAgainstReference(pkg, clips, options.reference) : undefined;
943
+ if (ref)
944
+ issues.push(...ref.issues);
945
+ return finish('local', pkg, reports, issues, ref?.rows);
946
+ }
947
+ async function checkRemoteRow(r, label, fetchImpl, issues, meta, rungBytes, slotClips, opts = {}) {
948
+ const url = String(r.row.url);
949
+ const report = { path: r.path, use: r.use, slot: r.slot, name: String(r.row.name), source: 'url', url };
950
+ let fetched;
951
+ try {
952
+ fetched = await fetchImpl(url);
953
+ }
954
+ catch (error) {
955
+ issues.push({ code: 'AUDIO_URL_UNREACHABLE', level: 'error', path: r.path, message: `${label}: ${url} could not be fetched (${error.message})`,
956
+ fix: 'use the public content url of a sealed public object (Package publication records it)' });
957
+ return report;
958
+ }
959
+ report.httpStatus = fetched.status;
960
+ if (fetched.status !== 200) {
961
+ issues.push({ code: 'AUDIO_URL_NOT_FOUND', level: 'error', path: r.path, message: `${label}: ${url} returned HTTP ${fetched.status}; the engine plays nothing`,
962
+ fix: 'the object is not public at that address: upload and verify its exact bytes, then seal a Package Version with the valid content URL' });
963
+ return report;
964
+ }
965
+ report.bytes = fetched.bytes.length;
966
+ report.checksumSha256 = sha256(fetched.bytes);
967
+ if (typeof r.row.checksumSha256 === 'string' && r.row.checksumSha256.toLowerCase() !== report.checksumSha256) {
968
+ issues.push({ code: 'AUDIO_CHECKSUM_MISMATCH', level: 'error', path: r.path,
969
+ message: `${label}: ${url} serves sha256 ${report.checksumSha256}, the row declares ${r.row.checksumSha256}; the engine rejects the body`,
970
+ fix: 'make checksumSha256 the digest of the exact bytes at the url' });
971
+ }
972
+ if (Number.isSafeInteger(r.row.bytes) && Number(r.row.bytes) !== fetched.bytes.length) {
973
+ issues.push({ code: 'AUDIO_BYTES_MISMATCH', level: 'error', path: r.path,
974
+ message: `${label}: ${url} serves ${fetched.bytes.length} bytes, the row declares ${String(r.row.bytes)}; the engine rejects the body`,
975
+ fix: 'make bytes the exact length of the file at the url' });
976
+ }
977
+ try {
978
+ report.measure = measureWav(fetched.bytes);
979
+ if (opts.loadOnly)
980
+ return report; // loads and decodes: all an unplayed closure member owes the runtime
981
+ issues.push(...judgeWav(r.path, label, report.measure));
982
+ issues.push(...judgeClipDc(r.path, label, fetched.bytes, r.use));
983
+ if (r.slot === 'horn')
984
+ issues.push(...judgeHornRow(r.path, label, fetched.bytes));
985
+ if (r.slot === 'revLimiter')
986
+ issues.push(...judgeRevLimiterRow(r.path, label, fetched.bytes));
987
+ if (r.use === 'slot' && r.slot)
988
+ slotClips?.push({ use: 'slot', path: r.path, role: r.slot, name: String(r.row.name), label, bytes: fetched.bytes, source: sourcedRecordingKey(r.row) });
989
+ if (r.use === 'bank') {
990
+ rungBytes?.set(String(r.row.name), fetched.bytes);
991
+ issues.push(...judgeRungSpectral(r.path, label, fetched.bytes));
992
+ if (r.rpm !== undefined)
993
+ issues.push(...judgeRungPitch(r.path, label, fetched.bytes, r.rpm, meta));
994
+ }
995
+ }
996
+ catch (error) {
997
+ issues.push({ code: 'AUDIO_NOT_WAV', level: 'error', path: r.path, message: `${label}: ${url}: ${error.message}`,
998
+ fix: 'only PCM WAV plays; publish the WAV, not an MP3/OGG' });
999
+ }
1000
+ return report;
1001
+ }
1002
+ /**
1003
+ * READ-BACK: the package as the runtime receives it. Every selected row must pass the adapter's shape test AND
1004
+ * fetch 200 with the declared size and digest AND decode to an audible WAV. Identical urls are fetched once.
1005
+ */
1006
+ async function checkAudioReadBack(pkg, fetchImpl = exports.defaultFetch, closure, options = {}) {
1007
+ const { rows, issues } = collectAudioRows(pkg);
1008
+ const unconsumed = unconsumedAudioRows(pkg);
1009
+ if (closure)
1010
+ issues.push(...closureMembershipIssues([...rows, ...unconsumed], closure));
1011
+ const meta = audioPitchMeta(pkg);
1012
+ const reports = [];
1013
+ const rungBytes = new Map();
1014
+ const slotClips = [];
1015
+ const cache = new Map();
1016
+ const cached = (url) => {
1017
+ let hit = cache.get(url);
1018
+ if (!hit) {
1019
+ hit = fetchImpl(url);
1020
+ cache.set(url, hit);
1021
+ }
1022
+ return hit;
1023
+ };
1024
+ for (const r of rows) {
1025
+ const shape = runtimeRowIssues(r);
1026
+ issues.push(...shape);
1027
+ const label = `${r.use === 'bank' ? 'bank sample' : `slot ${r.slot}`} "${String(r.row.name)}"`;
1028
+ if (typeof r.row.url !== 'string' || !r.row.url) {
1029
+ reports.push({ path: r.path, use: r.use, slot: r.slot, name: String(r.row.name), source: 'url' });
1030
+ continue;
1031
+ }
1032
+ reports.push(await checkRemoteRow(r, label, cached, issues, meta, rungBytes, slotClips));
1033
+ }
1034
+ for (const r of unconsumed) {
1035
+ issues.push(...runtimeRowIssues(r));
1036
+ const label = `slot ${r.slot} "${String(r.row.name)}" (consumed: false, still in the closure)`;
1037
+ if (typeof r.row.url !== 'string' || !r.row.url) {
1038
+ reports.push({ path: r.path, use: r.use, slot: r.slot, name: String(r.row.name), source: 'url' });
1039
+ continue;
1040
+ }
1041
+ reports.push(await checkRemoteRow(r, label, cached, issues, meta, undefined, undefined, { loadOnly: true }));
1042
+ }
1043
+ issues.push(...judgeLadders(pkg, rungBytes));
1044
+ const clips = [...slotClips, ...rungClips(pkg, rungBytes)];
1045
+ issues.push(...judgeNearDuplicates(clips));
1046
+ const ref = options.reference ? judgeAgainstReference(pkg, clips, options.reference) : undefined;
1047
+ if (ref)
1048
+ issues.push(...ref.issues);
1049
+ return finish('read-back', pkg, reports, issues, ref?.rows);
1050
+ }
1051
+ function formatAudioReport(report) {
1052
+ const lines = [];
1053
+ for (const row of report.rows) {
1054
+ const m = row.measure;
1055
+ const where = row.source === 'local' ? row.file : row.url;
1056
+ const level = m ? `${m.durationS.toFixed(2)} s ${m.sampleRate} Hz ${m.channels}ch peak ${m.peakDbfs} dBFS rms ${m.rmsDbfs} dBFS` : row.httpStatus ? `HTTP ${row.httpStatus}` : 'not fetched';
1057
+ lines.push(` ${row.use === 'bank' ? 'bank' : `slot ${row.slot}`} ${row.name} ${level} ${where ?? ''}`);
1058
+ }
1059
+ for (const row of report.reference ?? []) {
1060
+ lines.push(` reference ${row.slot} (${row.candidate} vs ${row.references.join(', ')}): ${row.comparisons.map((c) => `${c.metric} x${c.ratio.toFixed(2)} (${c.candidate.toFixed(c.metric === 'roughness' ? 2 : 0)} vs ${c.reference.toFixed(c.metric === 'roughness' ? 2 : 0)}) ${c.level}`).join(', ')}`);
1061
+ }
1062
+ lines.push(...(0, audioProvenance_1.formatProvenance)(report.provenance ?? []));
1063
+ for (const issue of report.issues) {
1064
+ lines.push(`${issue.level === 'error' ? '✖' : '⚠'} [${issue.code}] ${issue.path}: ${issue.message}\n fix: ${issue.fix}`);
1065
+ }
1066
+ lines.push(`${report.ok ? '✔' : '✖'} audio (${report.mode}): ${report.rows.length} sample${report.rows.length === 1 ? '' : 's'} checked, ${report.errors} error${report.errors === 1 ? '' : 's'}, ${report.warnings} warning${report.warnings === 1 ? '' : 's'}${report.fallbackEngine ? ' — no recorded engine (synthesised fallback)' : ''}`);
1067
+ return lines.join('\n');
1068
+ }
1069
+ //# sourceMappingURL=audio.js.map