@hypersoniclabs/helix-cli 0.1.6 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1715) hide show
  1. package/README.md +627 -6
  2. package/assets/bridge/metahuman-eye-baked.png +0 -0
  3. package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
  4. package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
  5. package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
  6. package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
  7. package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
  8. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
  9. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
  10. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
  11. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
  12. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
  13. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
  14. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
  15. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
  16. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
  17. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
  18. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
  19. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
  20. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
  21. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
  22. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
  23. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
  24. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
  25. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
  26. package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
  27. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
  28. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
  29. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
  30. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
  31. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
  32. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
  33. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
  34. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
  35. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
  36. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
  37. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
  38. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
  39. package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
  40. package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
  41. package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
  42. package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
  43. package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
  44. package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
  45. package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
  46. package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
  47. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
  48. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
  49. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
  50. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
  51. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
  52. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
  53. package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
  54. package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
  55. package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
  56. package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
  57. package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
  58. package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
  59. package/bridge-recipes/sims4/README.md +43 -0
  60. package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
  61. package/bridge-recipes/unreal/character-customizer/README.md +58 -0
  62. package/bridge-recipes/unreal/character-customizer/all.json +13 -0
  63. package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
  64. package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
  65. package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
  66. package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
  67. package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
  68. package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
  69. package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
  70. package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
  71. package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
  72. package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
  73. package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
  74. package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
  75. package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
  76. package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
  77. package/bridge-recipes/unreal/character-customizer/top.json +6 -0
  78. package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
  79. package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
  80. package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
  81. package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
  82. package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
  83. package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
  84. package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
  85. package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
  86. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
  87. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
  88. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
  89. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
  90. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
  91. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
  92. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
  93. package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
  94. package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
  95. package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
  96. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
  97. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
  98. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
  99. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
  100. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
  101. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
  102. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
  103. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
  104. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
  105. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
  106. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
  107. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
  108. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
  109. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
  110. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
  111. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
  112. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
  113. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
  114. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
  115. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
  116. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
  117. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
  118. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
  119. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
  120. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
  121. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
  122. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
  123. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
  124. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
  125. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
  126. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
  127. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
  128. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
  129. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
  130. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
  131. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
  132. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
  133. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
  134. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
  135. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
  136. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
  137. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
  138. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
  139. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
  140. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
  141. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
  142. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
  143. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
  144. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
  145. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
  146. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
  147. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
  148. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
  149. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
  150. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
  151. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
  152. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
  153. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
  154. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
  155. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
  156. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
  157. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
  158. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
  159. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
  160. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
  161. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
  162. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
  163. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
  164. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
  165. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
  166. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
  167. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
  168. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
  169. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
  170. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
  171. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
  172. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
  173. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
  174. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
  175. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
  176. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
  177. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
  178. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
  179. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
  180. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
  181. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
  182. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
  183. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
  184. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
  185. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
  186. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
  187. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
  188. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
  189. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
  190. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
  191. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
  192. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
  193. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
  194. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
  195. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
  196. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
  197. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
  198. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
  199. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
  200. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
  201. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
  202. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
  203. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
  204. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
  205. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
  206. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
  207. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
  208. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
  209. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
  210. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
  211. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
  212. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
  213. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
  214. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
  215. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
  216. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
  217. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
  218. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
  219. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
  220. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
  221. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
  222. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
  223. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
  224. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
  225. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
  226. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
  227. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
  228. package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
  229. package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
  230. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
  231. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
  232. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
  233. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
  234. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
  235. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
  236. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
  237. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
  238. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
  239. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
  240. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
  241. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
  242. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
  243. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
  244. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
  245. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
  246. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
  247. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
  248. package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
  249. package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
  250. package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
  251. package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
  252. package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
  253. package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
  254. package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
  255. package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
  256. package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
  257. package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
  258. package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
  259. package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
  260. package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
  261. package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
  262. package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
  263. package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
  264. package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
  265. package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
  266. package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
  267. package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
  268. package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
  269. package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
  270. package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
  271. package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
  272. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
  273. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
  274. package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
  275. package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
  276. package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
  277. package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
  278. package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
  279. package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
  280. package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
  281. package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
  282. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
  283. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
  284. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
  285. package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
  286. package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
  287. package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
  288. package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
  289. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
  290. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
  291. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
  292. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
  293. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
  294. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
  295. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
  296. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
  297. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
  298. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
  299. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
  300. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
  301. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
  302. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
  303. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
  304. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
  305. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
  306. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
  307. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
  308. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
  309. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
  310. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
  311. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
  312. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
  313. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
  314. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
  315. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
  316. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
  317. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
  318. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
  319. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
  320. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
  321. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
  322. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
  323. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
  324. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
  325. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
  326. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
  327. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
  328. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
  329. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
  330. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
  331. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
  332. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
  333. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
  334. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
  335. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
  336. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
  337. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
  338. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
  339. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
  340. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
  341. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
  342. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
  343. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
  344. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
  345. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
  346. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
  347. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
  348. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
  349. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
  350. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
  351. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
  352. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
  353. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
  354. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
  355. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
  356. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
  357. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
  358. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
  359. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
  360. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
  361. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
  362. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
  363. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
  364. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
  365. package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
  366. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
  367. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
  368. package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
  369. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
  370. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
  371. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
  372. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
  373. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
  374. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
  375. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
  376. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
  377. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
  378. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
  379. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
  380. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
  381. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
  382. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
  383. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
  384. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
  385. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
  386. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
  387. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
  388. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
  389. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
  390. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
  391. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
  392. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
  393. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
  394. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
  395. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
  396. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
  397. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
  398. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
  399. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
  400. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
  401. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
  402. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
  403. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
  404. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
  405. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
  406. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
  407. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
  408. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
  409. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
  410. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
  411. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
  412. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
  413. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
  414. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
  415. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
  416. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
  417. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
  418. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
  419. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
  420. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
  421. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
  422. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
  423. package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
  424. package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
  425. package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
  426. package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
  427. package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
  428. package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
  429. package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
  430. package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
  431. package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
  432. package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
  433. package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
  434. package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
  435. package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
  436. package/dist/ability.d.ts +2 -2
  437. package/dist/ability.js +6 -5
  438. package/dist/ability.js.map +1 -1
  439. package/dist/achievement.d.ts +123 -0
  440. package/dist/achievement.js +400 -0
  441. package/dist/achievement.js.map +1 -0
  442. package/dist/api.d.ts +19 -1
  443. package/dist/api.js +80 -6
  444. package/dist/api.js.map +1 -1
  445. package/dist/assets.d.ts +595 -0
  446. package/dist/assets.js +1121 -0
  447. package/dist/assets.js.map +1 -0
  448. package/dist/audioCommand.d.ts +65 -0
  449. package/dist/audioCommand.js +181 -0
  450. package/dist/audioCommand.js.map +1 -0
  451. package/dist/bakeBodyRegionsCli.d.ts +19 -0
  452. package/dist/bakeBodyRegionsCli.js +25 -0
  453. package/dist/bakeBodyRegionsCli.js.map +1 -0
  454. package/dist/bakeLighting.d.ts +173 -0
  455. package/dist/bakeLighting.js +452 -0
  456. package/dist/bakeLighting.js.map +1 -0
  457. package/dist/bridge/bridge.testutil.d.ts +105 -0
  458. package/dist/bridge/bridge.testutil.js +259 -0
  459. package/dist/bridge/bridge.testutil.js.map +1 -0
  460. package/dist/bridge/characterAddon.d.ts +47 -0
  461. package/dist/bridge/characterAddon.js +146 -0
  462. package/dist/bridge/characterAddon.js.map +1 -0
  463. package/dist/bridge/detect.d.ts +4 -0
  464. package/dist/bridge/detect.js +154 -0
  465. package/dist/bridge/detect.js.map +1 -0
  466. package/dist/bridge/execute.d.ts +3 -0
  467. package/dist/bridge/execute.js +206 -0
  468. package/dist/bridge/execute.js.map +1 -0
  469. package/dist/bridge/glb.d.ts +60 -0
  470. package/dist/bridge/glb.js +81 -0
  471. package/dist/bridge/glb.js.map +1 -0
  472. package/dist/bridge/hash.d.ts +6 -0
  473. package/dist/bridge/hash.js +40 -0
  474. package/dist/bridge/hash.js.map +1 -0
  475. package/dist/bridge/index.d.ts +11 -0
  476. package/dist/bridge/index.js +28 -0
  477. package/dist/bridge/index.js.map +1 -0
  478. package/dist/bridge/internal/artifacts.d.ts +5 -0
  479. package/dist/bridge/internal/artifacts.js +31 -0
  480. package/dist/bridge/internal/artifacts.js.map +1 -0
  481. package/dist/bridge/internal/builtInExecution.d.ts +4 -0
  482. package/dist/bridge/internal/builtInExecution.js +514 -0
  483. package/dist/bridge/internal/builtInExecution.js.map +1 -0
  484. package/dist/bridge/internal/externalExecution.d.ts +12 -0
  485. package/dist/bridge/internal/externalExecution.js +261 -0
  486. package/dist/bridge/internal/externalExecution.js.map +1 -0
  487. package/dist/bridge/internal/outputReservation.d.ts +13 -0
  488. package/dist/bridge/internal/outputReservation.js +151 -0
  489. package/dist/bridge/internal/outputReservation.js.map +1 -0
  490. package/dist/bridge/internal/snapshots.d.ts +32 -0
  491. package/dist/bridge/internal/snapshots.js +562 -0
  492. package/dist/bridge/internal/snapshots.js.map +1 -0
  493. package/dist/bridge/management.d.ts +40 -0
  494. package/dist/bridge/management.js +333 -0
  495. package/dist/bridge/management.js.map +1 -0
  496. package/dist/bridge/manifest.d.ts +8 -0
  497. package/dist/bridge/manifest.js +192 -0
  498. package/dist/bridge/manifest.js.map +1 -0
  499. package/dist/bridge/metahuman.d.ts +26 -0
  500. package/dist/bridge/metahuman.js +332 -0
  501. package/dist/bridge/metahuman.js.map +1 -0
  502. package/dist/bridge/planner.d.ts +9 -0
  503. package/dist/bridge/planner.js +246 -0
  504. package/dist/bridge/planner.js.map +1 -0
  505. package/dist/bridge/plugins.d.ts +17 -0
  506. package/dist/bridge/plugins.js +307 -0
  507. package/dist/bridge/plugins.js.map +1 -0
  508. package/dist/bridge/resolution.d.ts +8 -0
  509. package/dist/bridge/resolution.js +55 -0
  510. package/dist/bridge/resolution.js.map +1 -0
  511. package/dist/bridge/types.d.ts +247 -0
  512. package/dist/bridge/types.js +60 -0
  513. package/dist/bridge/types.js.map +1 -0
  514. package/dist/bridge/validate.d.ts +12 -0
  515. package/dist/bridge/validate.js +370 -0
  516. package/dist/bridge/validate.js.map +1 -0
  517. package/dist/bridge/zipSource.d.ts +27 -0
  518. package/dist/bridge/zipSource.js +90 -0
  519. package/dist/bridge/zipSource.js.map +1 -0
  520. package/dist/browser/hostSlots.d.ts +57 -0
  521. package/dist/browser/hostSlots.js +371 -0
  522. package/dist/browser/hostSlots.js.map +1 -0
  523. package/dist/browser/launch.d.ts +25 -0
  524. package/dist/browser/launch.js +74 -0
  525. package/dist/browser/launch.js.map +1 -0
  526. package/dist/browser/nonSystemChrome.d.ts +15 -0
  527. package/dist/browser/nonSystemChrome.js +91 -0
  528. package/dist/browser/nonSystemChrome.js.map +1 -0
  529. package/dist/builds/index.d.ts +54 -0
  530. package/dist/builds/index.js +215 -0
  531. package/dist/builds/index.js.map +1 -0
  532. package/dist/bundle.d.ts +35 -2
  533. package/dist/bundle.js +437 -20
  534. package/dist/bundle.js.map +1 -1
  535. package/dist/canary/cli.d.ts +17 -0
  536. package/dist/canary/cli.js +95 -0
  537. package/dist/canary/cli.js.map +1 -0
  538. package/dist/canary/index.d.ts +4 -0
  539. package/dist/canary/index.js +21 -0
  540. package/dist/canary/index.js.map +1 -0
  541. package/dist/canary/inventory.d.ts +46 -0
  542. package/dist/canary/inventory.js +499 -0
  543. package/dist/canary/inventory.js.map +1 -0
  544. package/dist/canary/pacifica.d.ts +51 -0
  545. package/dist/canary/pacifica.js +247 -0
  546. package/dist/canary/pacifica.js.map +1 -0
  547. package/dist/canary/plan.d.ts +115 -0
  548. package/dist/canary/plan.js +479 -0
  549. package/dist/canary/plan.js.map +1 -0
  550. package/dist/character/addonPushOut.d.ts +66 -0
  551. package/dist/character/addonPushOut.js +211 -0
  552. package/dist/character/addonPushOut.js.map +1 -0
  553. package/dist/character/avatarPreflight.d.ts +92 -0
  554. package/dist/character/avatarPreflight.js +261 -0
  555. package/dist/character/avatarPreflight.js.map +1 -0
  556. package/dist/character/bakeBodyRegions.d.ts +80 -0
  557. package/dist/character/bakeBodyRegions.js +190 -0
  558. package/dist/character/bakeBodyRegions.js.map +1 -0
  559. package/dist/character/baseColorGuard.d.ts +62 -0
  560. package/dist/character/baseColorGuard.js +141 -0
  561. package/dist/character/baseColorGuard.js.map +1 -0
  562. package/dist/character/bodyGeometryGuard.d.ts +243 -0
  563. package/dist/character/bodyGeometryGuard.js +417 -0
  564. package/dist/character/bodyGeometryGuard.js.map +1 -0
  565. package/dist/character/bodyRegionHide.d.ts +57 -0
  566. package/dist/character/bodyRegionHide.js +97 -0
  567. package/dist/character/bodyRegionHide.js.map +1 -0
  568. package/dist/character/composeBaseMale.d.ts +25 -0
  569. package/dist/character/composeBaseMale.js +712 -0
  570. package/dist/character/composeBaseMale.js.map +1 -0
  571. package/dist/character/esm.js +3 -1
  572. package/dist/character/esm.js.map +1 -1
  573. package/dist/character/faceManifest.d.ts +53 -0
  574. package/dist/character/faceManifest.js +256 -0
  575. package/dist/character/faceManifest.js.map +1 -0
  576. package/dist/character/fbx.d.ts +61 -0
  577. package/dist/character/fbx.js +360 -0
  578. package/dist/character/fbx.js.map +1 -0
  579. package/dist/character/fitGarmentFile.d.ts +39 -0
  580. package/dist/character/fitGarmentFile.js +53 -0
  581. package/dist/character/fitGarmentFile.js.map +1 -0
  582. package/dist/character/helixPalette.d.ts +68 -0
  583. package/dist/character/helixPalette.js +183 -0
  584. package/dist/character/helixPalette.js.map +1 -0
  585. package/dist/character/hideCoverage.d.ts +135 -0
  586. package/dist/character/hideCoverage.js +450 -0
  587. package/dist/character/hideCoverage.js.map +1 -0
  588. package/dist/character/imageLimits.d.ts +3 -0
  589. package/dist/character/imageLimits.js +7 -0
  590. package/dist/character/imageLimits.js.map +1 -0
  591. package/dist/character/importCharacter.d.ts +188 -10
  592. package/dist/character/importCharacter.js +853 -76
  593. package/dist/character/importCharacter.js.map +1 -1
  594. package/dist/character/importTrust.d.ts +11 -0
  595. package/dist/character/importTrust.js +56 -0
  596. package/dist/character/importTrust.js.map +1 -0
  597. package/dist/character/ktx2Decode.d.ts +11 -0
  598. package/dist/character/ktx2Decode.js +87 -0
  599. package/dist/character/ktx2Decode.js.map +1 -0
  600. package/dist/character/mat4.d.ts +7 -0
  601. package/dist/character/mat4.js +25 -2
  602. package/dist/character/mat4.js.map +1 -1
  603. package/dist/character/meshyToHelixMap.d.ts +10 -0
  604. package/dist/character/meshyToHelixMap.js +92 -3
  605. package/dist/character/meshyToHelixMap.js.map +1 -1
  606. package/dist/character/metahumanToHelixMap.d.ts +2 -0
  607. package/dist/character/metahumanToHelixMap.js +34 -0
  608. package/dist/character/metahumanToHelixMap.js.map +1 -0
  609. package/dist/character/normalMapGuard.d.ts +59 -0
  610. package/dist/character/normalMapGuard.js +139 -0
  611. package/dist/character/normalMapGuard.js.map +1 -0
  612. package/dist/character/quat.js +2 -2
  613. package/dist/character/quat.js.map +1 -1
  614. package/dist/character/reframeSkeletonFile.d.ts +19 -0
  615. package/dist/character/reframeSkeletonFile.js +45 -0
  616. package/dist/character/reframeSkeletonFile.js.map +1 -0
  617. package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
  618. package/dist/character/repairLodSkeletonsFile.js +49 -0
  619. package/dist/character/repairLodSkeletonsFile.js.map +1 -0
  620. package/dist/character/restFrameGuard.d.ts +52 -0
  621. package/dist/character/restFrameGuard.js +90 -0
  622. package/dist/character/restFrameGuard.js.map +1 -0
  623. package/dist/character/slotBudgets.d.ts +37 -0
  624. package/dist/character/slotBudgets.generated.d.ts +15 -0
  625. package/dist/character/slotBudgets.generated.js +110 -0
  626. package/dist/character/slotBudgets.generated.js.map +1 -0
  627. package/dist/character/slotBudgets.js +45 -0
  628. package/dist/character/slotBudgets.js.map +1 -0
  629. package/dist/character/stages/atlasMaterials.d.ts +53 -0
  630. package/dist/character/stages/atlasMaterials.js +246 -0
  631. package/dist/character/stages/atlasMaterials.js.map +1 -0
  632. package/dist/character/stages/bakeTexture.d.ts +28 -7
  633. package/dist/character/stages/bakeTexture.js +586 -108
  634. package/dist/character/stages/bakeTexture.js.map +1 -1
  635. package/dist/character/stages/conform.d.ts +54 -9
  636. package/dist/character/stages/conform.js +686 -113
  637. package/dist/character/stages/conform.js.map +1 -1
  638. package/dist/character/stages/earClearance.d.ts +105 -0
  639. package/dist/character/stages/earClearance.js +480 -0
  640. package/dist/character/stages/earClearance.js.map +1 -0
  641. package/dist/character/stages/faceRegion.d.ts +55 -0
  642. package/dist/character/stages/faceRegion.js +183 -0
  643. package/dist/character/stages/faceRegion.js.map +1 -0
  644. package/dist/character/stages/firstPersonHide.d.ts +42 -0
  645. package/dist/character/stages/firstPersonHide.js +140 -0
  646. package/dist/character/stages/firstPersonHide.js.map +1 -0
  647. package/dist/character/stages/joinPerMesh.d.ts +18 -0
  648. package/dist/character/stages/joinPerMesh.js +46 -0
  649. package/dist/character/stages/joinPerMesh.js.map +1 -0
  650. package/dist/character/stages/ktx2.d.ts +6 -4
  651. package/dist/character/stages/ktx2.js +81 -29
  652. package/dist/character/stages/ktx2.js.map +1 -1
  653. package/dist/character/stages/limbBridge.d.ts +114 -0
  654. package/dist/character/stages/limbBridge.js +1286 -0
  655. package/dist/character/stages/limbBridge.js.map +1 -0
  656. package/dist/character/stages/mergeLods.d.ts +19 -0
  657. package/dist/character/stages/mergeLods.js +58 -2
  658. package/dist/character/stages/mergeLods.js.map +1 -1
  659. package/dist/character/stages/poseAwareFit.d.ts +192 -0
  660. package/dist/character/stages/poseAwareFit.js +417 -0
  661. package/dist/character/stages/poseAwareFit.js.map +1 -0
  662. package/dist/character/stages/poseFit/math.d.ts +141 -0
  663. package/dist/character/stages/poseFit/math.js +514 -0
  664. package/dist/character/stages/poseFit/math.js.map +1 -0
  665. package/dist/character/stages/poseFit/measure.d.ts +88 -0
  666. package/dist/character/stages/poseFit/measure.js +148 -0
  667. package/dist/character/stages/poseFit/measure.js.map +1 -0
  668. package/dist/character/stages/poseFit/model.d.ts +46 -0
  669. package/dist/character/stages/poseFit/model.js +147 -0
  670. package/dist/character/stages/poseFit/model.js.map +1 -0
  671. package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
  672. package/dist/character/stages/poseFit/offsetField.js +249 -0
  673. package/dist/character/stages/poseFit/offsetField.js.map +1 -0
  674. package/dist/character/stages/poseFit/posing.d.ts +52 -0
  675. package/dist/character/stages/poseFit/posing.js +330 -0
  676. package/dist/character/stages/poseFit/posing.js.map +1 -0
  677. package/dist/character/stages/poseFit/testRig.d.ts +31 -0
  678. package/dist/character/stages/poseFit/testRig.js +85 -0
  679. package/dist/character/stages/poseFit/testRig.js.map +1 -0
  680. package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
  681. package/dist/character/stages/reframeSkeletonToHost.js +111 -0
  682. package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
  683. package/dist/character/stages/report.js +0 -2
  684. package/dist/character/stages/report.js.map +1 -1
  685. package/dist/character/stages/resizeTextures.js +4 -4
  686. package/dist/character/stages/resizeTextures.js.map +1 -1
  687. package/dist/character/stages/retarget.d.ts +8 -2
  688. package/dist/character/stages/retarget.js +52 -4
  689. package/dist/character/stages/retarget.js.map +1 -1
  690. package/dist/character/stages/retargetClip.d.ts +6 -2
  691. package/dist/character/stages/retargetClip.js +53 -16
  692. package/dist/character/stages/retargetClip.js.map +1 -1
  693. package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
  694. package/dist/character/stages/sanitizeMaterials.js +136 -0
  695. package/dist/character/stages/sanitizeMaterials.js.map +1 -0
  696. package/dist/character/stages/simplifyMesh.js +6 -3
  697. package/dist/character/stages/simplifyMesh.js.map +1 -1
  698. package/dist/character/stages/splitFacePrimitive.js +0 -2
  699. package/dist/character/stages/splitFacePrimitive.js.map +1 -1
  700. package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
  701. package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
  702. package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
  703. package/dist/character/stages/unifyMaterial.d.ts +66 -0
  704. package/dist/character/stages/unifyMaterial.js +136 -0
  705. package/dist/character/stages/unifyMaterial.js.map +1 -0
  706. package/dist/character/stages/vrmDynamics.d.ts +144 -0
  707. package/dist/character/stages/vrmDynamics.js +421 -0
  708. package/dist/character/stages/vrmDynamics.js.map +1 -0
  709. package/dist/character/stages/vrmFace.d.ts +82 -0
  710. package/dist/character/stages/vrmFace.js +280 -0
  711. package/dist/character/stages/vrmFace.js.map +1 -0
  712. package/dist/character/stages/weldedSimplify.d.ts +15 -1
  713. package/dist/character/stages/weldedSimplify.js +90 -9
  714. package/dist/character/stages/weldedSimplify.js.map +1 -1
  715. package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
  716. package/dist/character/testutil/meshyBridgeFixture.js +219 -0
  717. package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
  718. package/dist/character/testutil/meshyHead.d.ts +19 -0
  719. package/dist/character/testutil/meshyHead.js +99 -0
  720. package/dist/character/testutil/meshyHead.js.map +1 -0
  721. package/dist/character/testutil/meshyRig.d.ts +17 -0
  722. package/dist/character/testutil/meshyRig.js +117 -0
  723. package/dist/character/testutil/meshyRig.js.map +1 -0
  724. package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
  725. package/dist/character/testutil/slotBudgetExpectations.js +21 -0
  726. package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
  727. package/dist/character/testutil/syntheticRig.d.ts +12 -1
  728. package/dist/character/testutil/syntheticRig.js +88 -3
  729. package/dist/character/testutil/syntheticRig.js.map +1 -1
  730. package/dist/character/unrealMaterialSidecar.d.ts +94 -0
  731. package/dist/character/unrealMaterialSidecar.js +879 -0
  732. package/dist/character/unrealMaterialSidecar.js.map +1 -0
  733. package/dist/character/untrustedSource.d.ts +54 -0
  734. package/dist/character/untrustedSource.js +181 -0
  735. package/dist/character/untrustedSource.js.map +1 -0
  736. package/dist/character/vrmCharacter.d.ts +156 -0
  737. package/dist/character/vrmCharacter.js +678 -0
  738. package/dist/character/vrmCharacter.js.map +1 -0
  739. package/dist/config.d.ts +5 -0
  740. package/dist/config.js +72 -16
  741. package/dist/config.js.map +1 -1
  742. package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
  743. package/dist/continuum/adminPackagePinCommand.js +46 -0
  744. package/dist/continuum/adminPackagePinCommand.js.map +1 -0
  745. package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
  746. package/dist/continuum/adminPackagePublishCommand.js +22 -0
  747. package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
  748. package/dist/continuum/authoring.d.ts +52 -0
  749. package/dist/continuum/authoring.js +143 -0
  750. package/dist/continuum/authoring.js.map +1 -0
  751. package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
  752. package/dist/continuum/characterMigrationGenerator.js +242 -0
  753. package/dist/continuum/characterMigrationGenerator.js.map +1 -0
  754. package/dist/continuum/cli.d.ts +69 -0
  755. package/dist/continuum/cli.js +145 -0
  756. package/dist/continuum/cli.js.map +1 -0
  757. package/dist/continuum/cliAuthority.d.ts +17 -0
  758. package/dist/continuum/cliAuthority.js +28 -0
  759. package/dist/continuum/cliAuthority.js.map +1 -0
  760. package/dist/continuum/client.d.ts +103 -0
  761. package/dist/continuum/client.js +190 -0
  762. package/dist/continuum/client.js.map +1 -0
  763. package/dist/continuum/homeScenePackage.d.ts +159 -0
  764. package/dist/continuum/homeScenePackage.js +267 -0
  765. package/dist/continuum/homeScenePackage.js.map +1 -0
  766. package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
  767. package/dist/continuum/homeScenePackageCommand.js +107 -0
  768. package/dist/continuum/homeScenePackageCommand.js.map +1 -0
  769. package/dist/continuum/identity.d.ts +4 -0
  770. package/dist/continuum/identity.js +20 -0
  771. package/dist/continuum/identity.js.map +1 -0
  772. package/dist/continuum/index.d.ts +11 -0
  773. package/dist/continuum/index.js +28 -0
  774. package/dist/continuum/index.js.map +1 -0
  775. package/dist/continuum/missingNormals.d.ts +48 -0
  776. package/dist/continuum/missingNormals.js +99 -0
  777. package/dist/continuum/missingNormals.js.map +1 -0
  778. package/dist/continuum/objectUpload.d.ts +64 -0
  779. package/dist/continuum/objectUpload.js +375 -0
  780. package/dist/continuum/objectUpload.js.map +1 -0
  781. package/dist/continuum/pull.d.ts +22 -0
  782. package/dist/continuum/pull.js +47 -0
  783. package/dist/continuum/pull.js.map +1 -0
  784. package/dist/continuum/sourceBundle.d.ts +18 -0
  785. package/dist/continuum/sourceBundle.js +160 -0
  786. package/dist/continuum/sourceBundle.js.map +1 -0
  787. package/dist/continuum/state.d.ts +41 -0
  788. package/dist/continuum/state.js +198 -0
  789. package/dist/continuum/state.js.map +1 -0
  790. package/dist/continuum/types.d.ts +156 -0
  791. package/dist/continuum/types.js +6 -0
  792. package/dist/continuum/types.js.map +1 -0
  793. package/dist/continuum/workflow.d.ts +62 -0
  794. package/dist/continuum/workflow.js +592 -0
  795. package/dist/continuum/workflow.js.map +1 -0
  796. package/dist/cs2/areas.d.ts +41 -0
  797. package/dist/cs2/areas.js +82 -0
  798. package/dist/cs2/areas.js.map +1 -0
  799. package/dist/cs2/binary.d.ts +10 -0
  800. package/dist/cs2/binary.js +59 -0
  801. package/dist/cs2/binary.js.map +1 -0
  802. package/dist/cs2/cityLegacy.d.ts +29 -0
  803. package/dist/cs2/cityLegacy.js +48 -0
  804. package/dist/cs2/cityLegacy.js.map +1 -0
  805. package/dist/cs2/convert/areas.d.ts +32 -0
  806. package/dist/cs2/convert/areas.js +96 -0
  807. package/dist/cs2/convert/areas.js.map +1 -0
  808. package/dist/cs2/convert/glb.d.ts +48 -0
  809. package/dist/cs2/convert/glb.js +178 -0
  810. package/dist/cs2/convert/glb.js.map +1 -0
  811. package/dist/cs2/convert/markings.d.ts +96 -0
  812. package/dist/cs2/convert/markings.js +329 -0
  813. package/dist/cs2/convert/markings.js.map +1 -0
  814. package/dist/cs2/convert/nodeSeams.d.ts +20 -0
  815. package/dist/cs2/convert/nodeSeams.js +164 -0
  816. package/dist/cs2/convert/nodeSeams.js.map +1 -0
  817. package/dist/cs2/convert/roadBake.d.ts +112 -0
  818. package/dist/cs2/convert/roadBake.js +290 -0
  819. package/dist/cs2/convert/roadBake.js.map +1 -0
  820. package/dist/cs2/convert/roads.d.ts +110 -0
  821. package/dist/cs2/convert/roads.js +419 -0
  822. package/dist/cs2/convert/roads.js.map +1 -0
  823. package/dist/cs2/convert/terrain.d.ts +67 -0
  824. package/dist/cs2/convert/terrain.js +141 -0
  825. package/dist/cs2/convert/terrain.js.map +1 -0
  826. package/dist/cs2/convert/terrainConform.d.ts +58 -0
  827. package/dist/cs2/convert/terrainConform.js +284 -0
  828. package/dist/cs2/convert/terrainConform.js.map +1 -0
  829. package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
  830. package/dist/cs2/convert/treeRoadClearance.js +78 -0
  831. package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
  832. package/dist/cs2/convert/trees.d.ts +33 -0
  833. package/dist/cs2/convert/trees.js +68 -0
  834. package/dist/cs2/convert/trees.js.map +1 -0
  835. package/dist/cs2/csm2.d.ts +58 -0
  836. package/dist/cs2/csm2.js +188 -0
  837. package/dist/cs2/csm2.js.map +1 -0
  838. package/dist/cs2/fixtures.d.ts +5 -0
  839. package/dist/cs2/fixtures.js +15 -0
  840. package/dist/cs2/fixtures.js.map +1 -0
  841. package/dist/cs2/impostors.d.ts +31 -0
  842. package/dist/cs2/impostors.js +42 -0
  843. package/dist/cs2/impostors.js.map +1 -0
  844. package/dist/cs2/index.d.ts +22 -0
  845. package/dist/cs2/index.js +191 -0
  846. package/dist/cs2/index.js.map +1 -0
  847. package/dist/cs2/inspect.d.ts +81 -0
  848. package/dist/cs2/inspect.js +181 -0
  849. package/dist/cs2/inspect.js.map +1 -0
  850. package/dist/cs2/lods.d.ts +22 -0
  851. package/dist/cs2/lods.js +136 -0
  852. package/dist/cs2/lods.js.map +1 -0
  853. package/dist/cs2/materials.d.ts +43 -0
  854. package/dist/cs2/materials.js +137 -0
  855. package/dist/cs2/materials.js.map +1 -0
  856. package/dist/cs2/placements.d.ts +57 -0
  857. package/dist/cs2/placements.js +116 -0
  858. package/dist/cs2/placements.js.map +1 -0
  859. package/dist/cs2/roadPieces.d.ts +79 -0
  860. package/dist/cs2/roadPieces.js +263 -0
  861. package/dist/cs2/roadPieces.js.map +1 -0
  862. package/dist/cs2/roads.d.ts +92 -0
  863. package/dist/cs2/roads.js +329 -0
  864. package/dist/cs2/roads.js.map +1 -0
  865. package/dist/cs2/terrain.d.ts +37 -0
  866. package/dist/cs2/terrain.js +91 -0
  867. package/dist/cs2/terrain.js.map +1 -0
  868. package/dist/cs2/types.d.ts +444 -0
  869. package/dist/cs2/types.js +22 -0
  870. package/dist/cs2/types.js.map +1 -0
  871. package/dist/cs2/water.d.ts +26 -0
  872. package/dist/cs2/water.js +58 -0
  873. package/dist/cs2/water.js.map +1 -0
  874. package/dist/currency.d.ts +94 -0
  875. package/dist/currency.js +425 -0
  876. package/dist/currency.js.map +1 -0
  877. package/dist/dev/devServer.d.ts +53 -0
  878. package/dist/dev/devServer.js +228 -0
  879. package/dist/dev/devServer.js.map +1 -0
  880. package/dist/dev/shellPage.d.ts +3 -0
  881. package/dist/dev/shellPage.js +297 -0
  882. package/dist/dev/shellPage.js.map +1 -0
  883. package/dist/dev/state.d.ts +84 -0
  884. package/dist/dev/state.js +265 -0
  885. package/dist/dev/state.js.map +1 -0
  886. package/dist/device.d.ts +104 -0
  887. package/dist/device.js +2744 -0
  888. package/dist/device.js.map +1 -0
  889. package/dist/deviceActionValidation.d.ts +21 -0
  890. package/dist/deviceActionValidation.js +460 -0
  891. package/dist/deviceActionValidation.js.map +1 -0
  892. package/dist/distribution.d.ts +69 -0
  893. package/dist/distribution.js +138 -0
  894. package/dist/distribution.js.map +1 -0
  895. package/dist/enginePins.d.ts +45 -0
  896. package/dist/enginePins.js +134 -0
  897. package/dist/enginePins.js.map +1 -0
  898. package/dist/gesture/axisReference.d.ts +22 -0
  899. package/dist/gesture/axisReference.js +32 -0
  900. package/dist/gesture/axisReference.js.map +1 -0
  901. package/dist/gesture/capture.d.ts +84 -0
  902. package/dist/gesture/capture.js +303 -0
  903. package/dist/gesture/capture.js.map +1 -0
  904. package/dist/gesture/harnessPage.d.ts +23 -0
  905. package/dist/gesture/harnessPage.js +153 -0
  906. package/dist/gesture/harnessPage.js.map +1 -0
  907. package/dist/gesture/inspect.d.ts +189 -0
  908. package/dist/gesture/inspect.js +678 -0
  909. package/dist/gesture/inspect.js.map +1 -0
  910. package/dist/gesture/rig.d.ts +12 -0
  911. package/dist/gesture/rig.js +111 -0
  912. package/dist/gesture/rig.js.map +1 -0
  913. package/dist/gesture/worldRuntime.d.ts +65 -0
  914. package/dist/gesture/worldRuntime.js +110 -0
  915. package/dist/gesture/worldRuntime.js.map +1 -0
  916. package/dist/glb/draw-calls.d.ts +60 -0
  917. package/dist/glb/draw-calls.js +160 -0
  918. package/dist/glb/draw-calls.js.map +1 -0
  919. package/dist/glb/glb-summary.d.ts +68 -0
  920. package/dist/glb/glb-summary.js +450 -0
  921. package/dist/glb/glb-summary.js.map +1 -0
  922. package/dist/glb/index.d.ts +12 -0
  923. package/dist/glb/index.js +24 -0
  924. package/dist/glb/index.js.map +1 -0
  925. package/dist/glb/smooth-normals.d.ts +98 -0
  926. package/dist/glb/smooth-normals.js +395 -0
  927. package/dist/glb/smooth-normals.js.map +1 -0
  928. package/dist/index.d.ts +1 -1
  929. package/dist/index.js +6786 -128
  930. package/dist/index.js.map +1 -1
  931. package/dist/init.d.ts +35 -1
  932. package/dist/init.js +1115 -47
  933. package/dist/init.js.map +1 -1
  934. package/dist/install.d.ts +16 -5
  935. package/dist/install.js +123 -23
  936. package/dist/install.js.map +1 -1
  937. package/dist/interactable.d.ts +154 -0
  938. package/dist/interactable.js +1219 -0
  939. package/dist/interactable.js.map +1 -0
  940. package/dist/item.d.ts +217 -0
  941. package/dist/item.js +892 -0
  942. package/dist/item.js.map +1 -0
  943. package/dist/itemDef/distribute.d.ts +17 -0
  944. package/dist/itemDef/distribute.js +29 -0
  945. package/dist/itemDef/distribute.js.map +1 -0
  946. package/dist/itemDef/emoteRules.d.ts +85 -0
  947. package/dist/itemDef/emoteRules.js +368 -0
  948. package/dist/itemDef/emoteRules.js.map +1 -0
  949. package/dist/itemDef/gunConfigRules.d.ts +24 -0
  950. package/dist/itemDef/gunConfigRules.js +300 -0
  951. package/dist/itemDef/gunConfigRules.js.map +1 -0
  952. package/dist/itemDef/inspect.d.ts +19 -0
  953. package/dist/itemDef/inspect.js +144 -0
  954. package/dist/itemDef/inspect.js.map +1 -0
  955. package/dist/itemDef/scaffold.d.ts +41 -0
  956. package/dist/itemDef/scaffold.js +303 -0
  957. package/dist/itemDef/scaffold.js.map +1 -0
  958. package/dist/itemDef/tables.d.ts +81 -0
  959. package/dist/itemDef/tables.js +226 -0
  960. package/dist/itemDef/tables.js.map +1 -0
  961. package/dist/itemDef/validate.d.ts +30 -0
  962. package/dist/itemDef/validate.js +175 -0
  963. package/dist/itemDef/validate.js.map +1 -0
  964. package/dist/itemPublishVersion.d.ts +46 -0
  965. package/dist/itemPublishVersion.js +242 -0
  966. package/dist/itemPublishVersion.js.map +1 -0
  967. package/dist/itemSearch.d.ts +128 -0
  968. package/dist/itemSearch.js +140 -0
  969. package/dist/itemSearch.js.map +1 -0
  970. package/dist/itemSetVersion.d.ts +42 -0
  971. package/dist/itemSetVersion.js +94 -0
  972. package/dist/itemSetVersion.js.map +1 -0
  973. package/dist/itemThumbnail.d.ts +40 -0
  974. package/dist/itemThumbnail.js +116 -0
  975. package/dist/itemThumbnail.js.map +1 -0
  976. package/dist/lib.d.ts +571 -7
  977. package/dist/lib.js +1178 -15
  978. package/dist/lib.js.map +1 -1
  979. package/dist/looks.d.ts +103 -0
  980. package/dist/looks.js +102 -0
  981. package/dist/looks.js.map +1 -0
  982. package/dist/materials/availability.d.ts +8 -0
  983. package/dist/materials/availability.js +22 -0
  984. package/dist/materials/availability.js.map +1 -0
  985. package/dist/materials/identity.d.ts +30 -0
  986. package/dist/materials/identity.js +68 -0
  987. package/dist/materials/identity.js.map +1 -0
  988. package/dist/materials/pins.d.ts +23 -0
  989. package/dist/materials/pins.js +93 -0
  990. package/dist/materials/pins.js.map +1 -0
  991. package/dist/mesh/surfaceBvh.d.ts +13 -0
  992. package/dist/mesh/surfaceBvh.js +197 -0
  993. package/dist/mesh/surfaceBvh.js.map +1 -0
  994. package/dist/module-validation.d.ts +2 -0
  995. package/dist/module-validation.js +24 -0
  996. package/dist/module-validation.js.map +1 -0
  997. package/dist/money.d.ts +183 -0
  998. package/dist/money.js +299 -0
  999. package/dist/money.js.map +1 -0
  1000. package/dist/npc/capture.d.ts +41 -0
  1001. package/dist/npc/capture.js +99 -0
  1002. package/dist/npc/capture.js.map +1 -0
  1003. package/dist/npc/format.d.ts +2 -0
  1004. package/dist/npc/format.js +102 -0
  1005. package/dist/npc/format.js.map +1 -0
  1006. package/dist/npc/inspect.d.ts +23 -0
  1007. package/dist/npc/inspect.js +54 -0
  1008. package/dist/npc/inspect.js.map +1 -0
  1009. package/dist/npc/metrics.d.ts +132 -0
  1010. package/dist/npc/metrics.js +214 -0
  1011. package/dist/npc/metrics.js.map +1 -0
  1012. package/dist/npc/session.d.ts +35 -0
  1013. package/dist/npc/session.js +172 -0
  1014. package/dist/npc/session.js.map +1 -0
  1015. package/dist/pack/locomotionReference.d.ts +40 -0
  1016. package/dist/pack/locomotionReference.js +132 -0
  1017. package/dist/pack/locomotionReference.js.map +1 -0
  1018. package/dist/pack/scaffold.d.ts +15 -0
  1019. package/dist/pack/scaffold.js +144 -0
  1020. package/dist/pack/scaffold.js.map +1 -0
  1021. package/dist/pack/validate.d.ts +67 -0
  1022. package/dist/pack/validate.js +317 -0
  1023. package/dist/pack/validate.js.map +1 -0
  1024. package/dist/package.d.ts +14 -1
  1025. package/dist/package.js +106 -7
  1026. package/dist/package.js.map +1 -1
  1027. package/dist/paletteShowcase.d.ts +183 -0
  1028. package/dist/paletteShowcase.js +454 -0
  1029. package/dist/paletteShowcase.js.map +1 -0
  1030. package/dist/paletteShowcaseProfiles.d.ts +112 -0
  1031. package/dist/paletteShowcaseProfiles.js +121 -0
  1032. package/dist/paletteShowcaseProfiles.js.map +1 -0
  1033. package/dist/paths.d.ts +4 -0
  1034. package/dist/paths.js +11 -0
  1035. package/dist/paths.js.map +1 -0
  1036. package/dist/placementRequest.d.ts +37 -0
  1037. package/dist/placementRequest.js +220 -0
  1038. package/dist/placementRequest.js.map +1 -0
  1039. package/dist/placements/assets.d.ts +7 -0
  1040. package/dist/placements/assets.js +114 -0
  1041. package/dist/placements/assets.js.map +1 -0
  1042. package/dist/placements/attachFoliageLods.d.ts +4 -0
  1043. package/dist/placements/attachFoliageLods.js +70 -0
  1044. package/dist/placements/attachFoliageLods.js.map +1 -0
  1045. package/dist/placements/attachImpostors.d.ts +3 -0
  1046. package/dist/placements/attachImpostors.js +51 -0
  1047. package/dist/placements/attachImpostors.js.map +1 -0
  1048. package/dist/placements/authored.d.ts +11 -0
  1049. package/dist/placements/authored.js +65 -0
  1050. package/dist/placements/authored.js.map +1 -0
  1051. package/dist/placements/bake.d.ts +2 -0
  1052. package/dist/placements/bake.js +235 -0
  1053. package/dist/placements/bake.js.map +1 -0
  1054. package/dist/placements/captureHost.d.ts +4 -0
  1055. package/dist/placements/captureHost.js +125 -0
  1056. package/dist/placements/captureHost.js.map +1 -0
  1057. package/dist/placements/foliageCapture.d.ts +2 -0
  1058. package/dist/placements/foliageCapture.js +98 -0
  1059. package/dist/placements/foliageCapture.js.map +1 -0
  1060. package/dist/placements/foliageCards.d.ts +17 -0
  1061. package/dist/placements/foliageCards.js +120 -0
  1062. package/dist/placements/foliageCards.js.map +1 -0
  1063. package/dist/placements/foliageLods.d.ts +8 -0
  1064. package/dist/placements/foliageLods.js +240 -0
  1065. package/dist/placements/foliageLods.js.map +1 -0
  1066. package/dist/placements/foliageTexture.d.ts +4 -0
  1067. package/dist/placements/foliageTexture.js +91 -0
  1068. package/dist/placements/foliageTexture.js.map +1 -0
  1069. package/dist/placements/impostorCapture.d.ts +2 -0
  1070. package/dist/placements/impostorCapture.js +111 -0
  1071. package/dist/placements/impostorCapture.js.map +1 -0
  1072. package/dist/placements/impostors.d.ts +18 -0
  1073. package/dist/placements/impostors.js +279 -0
  1074. package/dist/placements/impostors.js.map +1 -0
  1075. package/dist/placements/source.d.ts +53 -0
  1076. package/dist/placements/source.js +111 -0
  1077. package/dist/placements/source.js.map +1 -0
  1078. package/dist/product.d.ts +84 -0
  1079. package/dist/product.js +285 -0
  1080. package/dist/product.js.map +1 -0
  1081. package/dist/publications.d.ts +116 -0
  1082. package/dist/publications.js +180 -0
  1083. package/dist/publications.js.map +1 -0
  1084. package/dist/publishDuplicateGuard.d.ts +92 -0
  1085. package/dist/publishDuplicateGuard.js +128 -0
  1086. package/dist/publishDuplicateGuard.js.map +1 -0
  1087. package/dist/realizability.d.ts +36 -0
  1088. package/dist/realizability.js +269 -0
  1089. package/dist/realizability.js.map +1 -0
  1090. package/dist/resolve.d.ts +7 -1
  1091. package/dist/resolve.js +77 -11
  1092. package/dist/resolve.js.map +1 -1
  1093. package/dist/sceneElements/compiler.d.ts +21 -0
  1094. package/dist/sceneElements/compiler.js +976 -0
  1095. package/dist/sceneElements/compiler.js.map +1 -0
  1096. package/dist/sceneElements/continuum.d.ts +54 -0
  1097. package/dist/sceneElements/continuum.js +451 -0
  1098. package/dist/sceneElements/continuum.js.map +1 -0
  1099. package/dist/sceneElements/devices.d.ts +12 -0
  1100. package/dist/sceneElements/devices.js +212 -0
  1101. package/dist/sceneElements/devices.js.map +1 -0
  1102. package/dist/sceneElements/meshCells.d.ts +49 -0
  1103. package/dist/sceneElements/meshCells.js +174 -0
  1104. package/dist/sceneElements/meshCells.js.map +1 -0
  1105. package/dist/sceneElements/types.d.ts +261 -0
  1106. package/dist/sceneElements/types.js +3 -0
  1107. package/dist/sceneElements/types.js.map +1 -0
  1108. package/dist/sceneHlod/approximate.d.ts +23 -0
  1109. package/dist/sceneHlod/approximate.js +171 -0
  1110. package/dist/sceneHlod/approximate.js.map +1 -0
  1111. package/dist/sceneHlod/artifact.d.ts +3 -0
  1112. package/dist/sceneHlod/artifact.js +29 -0
  1113. package/dist/sceneHlod/artifact.js.map +1 -0
  1114. package/dist/sceneHlod/bakeSurface.d.ts +2 -0
  1115. package/dist/sceneHlod/bakeSurface.js +59 -0
  1116. package/dist/sceneHlod/bakeSurface.js.map +1 -0
  1117. package/dist/sceneHlod/basisEncoder.d.ts +3 -0
  1118. package/dist/sceneHlod/basisEncoder.js +68 -0
  1119. package/dist/sceneHlod/basisEncoder.js.map +1 -0
  1120. package/dist/sceneHlod/cellArtifact.d.ts +17 -0
  1121. package/dist/sceneHlod/cellArtifact.js +78 -0
  1122. package/dist/sceneHlod/cellArtifact.js.map +1 -0
  1123. package/dist/sceneHlod/commands.d.ts +2 -0
  1124. package/dist/sceneHlod/commands.js +114 -0
  1125. package/dist/sceneHlod/commands.js.map +1 -0
  1126. package/dist/sceneHlod/complete.d.ts +78 -0
  1127. package/dist/sceneHlod/complete.js +261 -0
  1128. package/dist/sceneHlod/complete.js.map +1 -0
  1129. package/dist/sceneHlod/completePrototype.d.ts +39 -0
  1130. package/dist/sceneHlod/completePrototype.js +121 -0
  1131. package/dist/sceneHlod/completePrototype.js.map +1 -0
  1132. package/dist/sceneHlod/geometry.d.ts +6 -0
  1133. package/dist/sceneHlod/geometry.js +101 -0
  1134. package/dist/sceneHlod/geometry.js.map +1 -0
  1135. package/dist/sceneHlod/imageSampling.d.ts +11 -0
  1136. package/dist/sceneHlod/imageSampling.js +100 -0
  1137. package/dist/sceneHlod/imageSampling.js.map +1 -0
  1138. package/dist/sceneHlod/refinement.d.ts +46 -0
  1139. package/dist/sceneHlod/refinement.js +204 -0
  1140. package/dist/sceneHlod/refinement.js.map +1 -0
  1141. package/dist/sceneHlod/scene.d.ts +80 -0
  1142. package/dist/sceneHlod/scene.js +264 -0
  1143. package/dist/sceneHlod/scene.js.map +1 -0
  1144. package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
  1145. package/dist/sceneHlod/sharedAtlas.js +84 -0
  1146. package/dist/sceneHlod/sharedAtlas.js.map +1 -0
  1147. package/dist/sceneHlod/source.d.ts +17 -0
  1148. package/dist/sceneHlod/source.js +241 -0
  1149. package/dist/sceneHlod/source.js.map +1 -0
  1150. package/dist/sceneHlod/textureCodec.d.ts +4 -0
  1151. package/dist/sceneHlod/textureCodec.js +66 -0
  1152. package/dist/sceneHlod/textureCodec.js.map +1 -0
  1153. package/dist/sceneHlod/transfer.d.ts +8 -0
  1154. package/dist/sceneHlod/transfer.js +147 -0
  1155. package/dist/sceneHlod/transfer.js.map +1 -0
  1156. package/dist/sceneHlod/types.d.ts +69 -0
  1157. package/dist/sceneHlod/types.js +3 -0
  1158. package/dist/sceneHlod/types.js.map +1 -0
  1159. package/dist/sceneImport/archive.d.ts +30 -0
  1160. package/dist/sceneImport/archive.js +336 -0
  1161. package/dist/sceneImport/archive.js.map +1 -0
  1162. package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
  1163. package/dist/sceneImport/bistroMaterialBake.js +169 -0
  1164. package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
  1165. package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
  1166. package/dist/sceneImport/bistroTexturePlan.js +23 -0
  1167. package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
  1168. package/dist/sceneImport/compiler.d.ts +36 -0
  1169. package/dist/sceneImport/compiler.js +251 -0
  1170. package/dist/sceneImport/compiler.js.map +1 -0
  1171. package/dist/sceneImport/composeMounts.d.ts +159 -0
  1172. package/dist/sceneImport/composeMounts.js +687 -0
  1173. package/dist/sceneImport/composeMounts.js.map +1 -0
  1174. package/dist/sceneImport/defaultMaterials.d.ts +45 -0
  1175. package/dist/sceneImport/defaultMaterials.js +121 -0
  1176. package/dist/sceneImport/defaultMaterials.js.map +1 -0
  1177. package/dist/sceneImport/externalTextures.d.ts +44 -0
  1178. package/dist/sceneImport/externalTextures.js +146 -0
  1179. package/dist/sceneImport/externalTextures.js.map +1 -0
  1180. package/dist/sceneImport/fbx.d.ts +101 -0
  1181. package/dist/sceneImport/fbx.js +307 -0
  1182. package/dist/sceneImport/fbx.js.map +1 -0
  1183. package/dist/sceneImport/glbSplit.d.ts +24 -0
  1184. package/dist/sceneImport/glbSplit.js +95 -0
  1185. package/dist/sceneImport/glbSplit.js.map +1 -0
  1186. package/dist/sceneImport/gltfIo.d.ts +32 -0
  1187. package/dist/sceneImport/gltfIo.js +39 -0
  1188. package/dist/sceneImport/gltfIo.js.map +1 -0
  1189. package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
  1190. package/dist/sceneImport/helsinkiTiles.js +52 -0
  1191. package/dist/sceneImport/helsinkiTiles.js.map +1 -0
  1192. package/dist/sceneImport/materials/binding.d.ts +16 -0
  1193. package/dist/sceneImport/materials/binding.js +42 -0
  1194. package/dist/sceneImport/materials/binding.js.map +1 -0
  1195. package/dist/sceneImport/materials/catalog.d.ts +36 -0
  1196. package/dist/sceneImport/materials/catalog.js +233 -0
  1197. package/dist/sceneImport/materials/catalog.js.map +1 -0
  1198. package/dist/sceneImport/materials/index.d.ts +4 -0
  1199. package/dist/sceneImport/materials/index.js +21 -0
  1200. package/dist/sceneImport/materials/index.js.map +1 -0
  1201. package/dist/sceneImport/materials/matcher.d.ts +33 -0
  1202. package/dist/sceneImport/materials/matcher.js +127 -0
  1203. package/dist/sceneImport/materials/matcher.js.map +1 -0
  1204. package/dist/sceneImport/materials/recipe.d.ts +30 -0
  1205. package/dist/sceneImport/materials/recipe.js +134 -0
  1206. package/dist/sceneImport/materials/recipe.js.map +1 -0
  1207. package/dist/sceneImport/multiAsset.d.ts +79 -0
  1208. package/dist/sceneImport/multiAsset.js +535 -0
  1209. package/dist/sceneImport/multiAsset.js.map +1 -0
  1210. package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
  1211. package/dist/sceneImport/multiAssetSpawn.js +98 -0
  1212. package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
  1213. package/dist/sceneImport/obj.d.ts +41 -0
  1214. package/dist/sceneImport/obj.js +276 -0
  1215. package/dist/sceneImport/obj.js.map +1 -0
  1216. package/dist/sceneImport/package.d.ts +104 -0
  1217. package/dist/sceneImport/package.js +1004 -0
  1218. package/dist/sceneImport/package.js.map +1 -0
  1219. package/dist/sceneImport/packageReader.d.ts +10 -0
  1220. package/dist/sceneImport/packageReader.js +250 -0
  1221. package/dist/sceneImport/packageReader.js.map +1 -0
  1222. package/dist/sceneImport/proxy.d.ts +100 -0
  1223. package/dist/sceneImport/proxy.js +334 -0
  1224. package/dist/sceneImport/proxy.js.map +1 -0
  1225. package/dist/sceneImport/publish.d.ts +47 -0
  1226. package/dist/sceneImport/publish.js +98 -0
  1227. package/dist/sceneImport/publish.js.map +1 -0
  1228. package/dist/sceneImport/semantic.d.ts +75 -0
  1229. package/dist/sceneImport/semantic.js +296 -0
  1230. package/dist/sceneImport/semantic.js.map +1 -0
  1231. package/dist/sceneImport/spawnProbe.d.ts +55 -0
  1232. package/dist/sceneImport/spawnProbe.js +159 -0
  1233. package/dist/sceneImport/spawnProbe.js.map +1 -0
  1234. package/dist/sceneImport/streamLayout.d.ts +96 -0
  1235. package/dist/sceneImport/streamLayout.js +203 -0
  1236. package/dist/sceneImport/streamLayout.js.map +1 -0
  1237. package/dist/sceneImport/textureDecode.d.ts +21 -0
  1238. package/dist/sceneImport/textureDecode.js +292 -0
  1239. package/dist/sceneImport/textureDecode.js.map +1 -0
  1240. package/dist/sceneImport/types.d.ts +84 -0
  1241. package/dist/sceneImport/types.js +58 -0
  1242. package/dist/sceneImport/types.js.map +1 -0
  1243. package/dist/scenePerformance.d.ts +162 -0
  1244. package/dist/scenePerformance.js +905 -0
  1245. package/dist/scenePerformance.js.map +1 -0
  1246. package/dist/screenshot/captureScreenshots.d.ts +36 -0
  1247. package/dist/screenshot/captureScreenshots.js +229 -0
  1248. package/dist/screenshot/captureScreenshots.js.map +1 -0
  1249. package/dist/screenshot/encodeImagePreview.d.ts +5 -0
  1250. package/dist/screenshot/encodeImagePreview.js +42 -0
  1251. package/dist/screenshot/encodeImagePreview.js.map +1 -0
  1252. package/dist/screenshot/publishThumbnail.d.ts +4 -0
  1253. package/dist/screenshot/publishThumbnail.js +56 -0
  1254. package/dist/screenshot/publishThumbnail.js.map +1 -0
  1255. package/dist/screenshot/staticServe.d.ts +14 -0
  1256. package/dist/screenshot/staticServe.js +120 -0
  1257. package/dist/screenshot/staticServe.js.map +1 -0
  1258. package/dist/source-archive.d.ts +101 -0
  1259. package/dist/source-archive.js +309 -0
  1260. package/dist/source-archive.js.map +1 -0
  1261. package/dist/stdioBlocking.d.ts +1 -0
  1262. package/dist/stdioBlocking.js +9 -0
  1263. package/dist/stdioBlocking.js.map +1 -0
  1264. package/dist/terrain/bake.d.ts +40 -0
  1265. package/dist/terrain/bake.js +318 -0
  1266. package/dist/terrain/bake.js.map +1 -0
  1267. package/dist/terrain/generate.d.ts +21 -0
  1268. package/dist/terrain/generate.js +239 -0
  1269. package/dist/terrain/generate.js.map +1 -0
  1270. package/dist/terrain/grid.d.ts +48 -0
  1271. package/dist/terrain/grid.js +133 -0
  1272. package/dist/terrain/grid.js.map +1 -0
  1273. package/dist/terrain/import.d.ts +40 -0
  1274. package/dist/terrain/import.js +252 -0
  1275. package/dist/terrain/import.js.map +1 -0
  1276. package/dist/terrain/index.d.ts +11 -0
  1277. package/dist/terrain/index.js +88 -0
  1278. package/dist/terrain/index.js.map +1 -0
  1279. package/dist/terrain/inspect.d.ts +35 -0
  1280. package/dist/terrain/inspect.js +115 -0
  1281. package/dist/terrain/inspect.js.map +1 -0
  1282. package/dist/terrain/island.d.ts +31 -0
  1283. package/dist/terrain/island.js +128 -0
  1284. package/dist/terrain/island.js.map +1 -0
  1285. package/dist/terrain/noise.d.ts +79 -0
  1286. package/dist/terrain/noise.js +162 -0
  1287. package/dist/terrain/noise.js.map +1 -0
  1288. package/dist/terrain/normals.d.ts +21 -0
  1289. package/dist/terrain/normals.js +55 -0
  1290. package/dist/terrain/normals.js.map +1 -0
  1291. package/dist/terrain/presets/alpine.json +20 -0
  1292. package/dist/terrain/presets/coast.json +20 -0
  1293. package/dist/terrain/presets/desert.json +22 -0
  1294. package/dist/terrain/presets/forest.json +20 -0
  1295. package/dist/terrain/presets/meadow.json +20 -0
  1296. package/dist/terrain/presets/volcanic.json +22 -0
  1297. package/dist/terrain/presets.d.ts +29 -0
  1298. package/dist/terrain/presets.js +128 -0
  1299. package/dist/terrain/presets.js.map +1 -0
  1300. package/dist/terrain/source.d.ts +42 -0
  1301. package/dist/terrain/source.js +241 -0
  1302. package/dist/terrain/source.js.map +1 -0
  1303. package/dist/terrain/tile.d.ts +92 -0
  1304. package/dist/terrain/tile.js +268 -0
  1305. package/dist/terrain/tile.js.map +1 -0
  1306. package/dist/textureAudit.d.ts +23 -0
  1307. package/dist/textureAudit.js +192 -0
  1308. package/dist/textureAudit.js.map +1 -0
  1309. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1310. package/dist/unreal/avatarMode.d.ts +21 -0
  1311. package/dist/unreal/avatarMode.js +33 -0
  1312. package/dist/unreal/avatarMode.js.map +1 -0
  1313. package/dist/unreal/delivery.d.ts +46 -0
  1314. package/dist/unreal/delivery.js +89 -0
  1315. package/dist/unreal/delivery.js.map +1 -0
  1316. package/dist/unreal/doctor.d.ts +50 -0
  1317. package/dist/unreal/doctor.js +102 -0
  1318. package/dist/unreal/doctor.js.map +1 -0
  1319. package/dist/unreal/package.d.ts +80 -0
  1320. package/dist/unreal/package.js +273 -0
  1321. package/dist/unreal/package.js.map +1 -0
  1322. package/dist/unreal/release.d.ts +41 -0
  1323. package/dist/unreal/release.js +122 -0
  1324. package/dist/unreal/release.js.map +1 -0
  1325. package/dist/unreal.d.ts +30 -0
  1326. package/dist/unreal.js +362 -0
  1327. package/dist/unreal.js.map +1 -0
  1328. package/dist/unrealCandidate.d.ts +213 -0
  1329. package/dist/unrealCandidate.js +765 -0
  1330. package/dist/unrealCandidate.js.map +1 -0
  1331. package/dist/unrealManifest.d.ts +74 -0
  1332. package/dist/unrealManifest.js +354 -0
  1333. package/dist/unrealManifest.js.map +1 -0
  1334. package/dist/unrealPublish.d.ts +111 -0
  1335. package/dist/unrealPublish.js +331 -0
  1336. package/dist/unrealPublish.js.map +1 -0
  1337. package/dist/vault.d.ts +121 -0
  1338. package/dist/vault.js +136 -0
  1339. package/dist/vault.js.map +1 -0
  1340. package/dist/vehicle/addOnDefinition.d.ts +19 -0
  1341. package/dist/vehicle/addOnDefinition.js +21 -0
  1342. package/dist/vehicle/addOnDefinition.js.map +1 -0
  1343. package/dist/vehicle/addon.d.ts +158 -0
  1344. package/dist/vehicle/addon.js +441 -0
  1345. package/dist/vehicle/addon.js.map +1 -0
  1346. package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
  1347. package/dist/vehicle/addonDefinitionGuard.js +206 -0
  1348. package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
  1349. package/dist/vehicle/addonPublished.d.ts +80 -0
  1350. package/dist/vehicle/addonPublished.js +221 -0
  1351. package/dist/vehicle/addonPublished.js.map +1 -0
  1352. package/dist/vehicle/audio.d.ts +259 -0
  1353. package/dist/vehicle/audio.js +1069 -0
  1354. package/dist/vehicle/audio.js.map +1 -0
  1355. package/dist/vehicle/audioDefects.d.ts +125 -0
  1356. package/dist/vehicle/audioDefects.js +591 -0
  1357. package/dist/vehicle/audioDefects.js.map +1 -0
  1358. package/dist/vehicle/audioDistinct.d.ts +62 -0
  1359. package/dist/vehicle/audioDistinct.js +479 -0
  1360. package/dist/vehicle/audioDistinct.js.map +1 -0
  1361. package/dist/vehicle/audioImport.d.ts +217 -0
  1362. package/dist/vehicle/audioImport.js +610 -0
  1363. package/dist/vehicle/audioImport.js.map +1 -0
  1364. package/dist/vehicle/audioProvenance.d.ts +47 -0
  1365. package/dist/vehicle/audioProvenance.js +364 -0
  1366. package/dist/vehicle/audioProvenance.js.map +1 -0
  1367. package/dist/vehicle/audioReference.d.ts +36 -0
  1368. package/dist/vehicle/audioReference.js +176 -0
  1369. package/dist/vehicle/audioReference.js.map +1 -0
  1370. package/dist/vehicle/audioSlots.d.ts +27 -0
  1371. package/dist/vehicle/audioSlots.js +43 -0
  1372. package/dist/vehicle/audioSlots.js.map +1 -0
  1373. package/dist/vehicle/audioSpectral.d.ts +71 -0
  1374. package/dist/vehicle/audioSpectral.js +534 -0
  1375. package/dist/vehicle/audioSpectral.js.map +1 -0
  1376. package/dist/vehicle/cabinCheck.d.ts +209 -0
  1377. package/dist/vehicle/cabinCheck.js +799 -0
  1378. package/dist/vehicle/cabinCheck.js.map +1 -0
  1379. package/dist/vehicle/drive.d.ts +66 -0
  1380. package/dist/vehicle/drive.js +228 -0
  1381. package/dist/vehicle/drive.js.map +1 -0
  1382. package/dist/vehicle/enginePolicy.d.ts +68 -0
  1383. package/dist/vehicle/enginePolicy.js +209 -0
  1384. package/dist/vehicle/enginePolicy.js.map +1 -0
  1385. package/dist/vehicle/hostFrame.d.ts +78 -0
  1386. package/dist/vehicle/hostFrame.js +136 -0
  1387. package/dist/vehicle/hostFrame.js.map +1 -0
  1388. package/dist/vehicle/inspectionSheets.d.ts +42 -0
  1389. package/dist/vehicle/inspectionSheets.js +173 -0
  1390. package/dist/vehicle/inspectionSheets.js.map +1 -0
  1391. package/dist/vehicle/keyboardLaunch.d.ts +189 -0
  1392. package/dist/vehicle/keyboardLaunch.js +340 -0
  1393. package/dist/vehicle/keyboardLaunch.js.map +1 -0
  1394. package/dist/vehicle/lampCoverage.d.ts +49 -0
  1395. package/dist/vehicle/lampCoverage.js +252 -0
  1396. package/dist/vehicle/lampCoverage.js.map +1 -0
  1397. package/dist/vehicle/mintAddOn.d.ts +110 -0
  1398. package/dist/vehicle/mintAddOn.js +321 -0
  1399. package/dist/vehicle/mintAddOn.js.map +1 -0
  1400. package/dist/vehicle/mintVehicle.d.ts +189 -0
  1401. package/dist/vehicle/mintVehicle.js +417 -0
  1402. package/dist/vehicle/mintVehicle.js.map +1 -0
  1403. package/dist/vehicle/paintHue.d.ts +89 -0
  1404. package/dist/vehicle/paintHue.js +248 -0
  1405. package/dist/vehicle/paintHue.js.map +1 -0
  1406. package/dist/vehicle/panelCoverage.d.ts +37 -0
  1407. package/dist/vehicle/panelCoverage.js +93 -0
  1408. package/dist/vehicle/panelCoverage.js.map +1 -0
  1409. package/dist/vehicle/platform.d.ts +71 -0
  1410. package/dist/vehicle/platform.js +144 -0
  1411. package/dist/vehicle/platform.js.map +1 -0
  1412. package/dist/vehicle/preview.d.ts +339 -0
  1413. package/dist/vehicle/preview.js +854 -0
  1414. package/dist/vehicle/preview.js.map +1 -0
  1415. package/dist/vehicle/previewAddon.d.ts +197 -0
  1416. package/dist/vehicle/previewAddon.js +520 -0
  1417. package/dist/vehicle/previewAddon.js.map +1 -0
  1418. package/dist/vehicle/previewSeats.d.ts +102 -0
  1419. package/dist/vehicle/previewSeats.js +190 -0
  1420. package/dist/vehicle/previewSeats.js.map +1 -0
  1421. package/dist/vehicle/publish.d.ts +78 -0
  1422. package/dist/vehicle/publish.js +111 -0
  1423. package/dist/vehicle/publish.js.map +1 -0
  1424. package/dist/vehicle/recheckListed.d.ts +87 -0
  1425. package/dist/vehicle/recheckListed.js +200 -0
  1426. package/dist/vehicle/recheckListed.js.map +1 -0
  1427. package/dist/vehicle/renditionManifest.d.ts +10 -0
  1428. package/dist/vehicle/renditionManifest.js +56 -0
  1429. package/dist/vehicle/renditionManifest.js.map +1 -0
  1430. package/dist/vehicle/sealCheck.d.ts +30 -0
  1431. package/dist/vehicle/sealCheck.js +59 -0
  1432. package/dist/vehicle/sealCheck.js.map +1 -0
  1433. package/dist/vehicle/simulate.d.ts +219 -0
  1434. package/dist/vehicle/simulate.js +536 -0
  1435. package/dist/vehicle/simulate.js.map +1 -0
  1436. package/dist/vehicle/simulateRuntime.d.ts +76 -0
  1437. package/dist/vehicle/simulateRuntime.js +252 -0
  1438. package/dist/vehicle/simulateRuntime.js.map +1 -0
  1439. package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
  1440. package/dist/vehicle/testutil/sourcedAudio.js +96 -0
  1441. package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
  1442. package/dist/vehicle/validate.d.ts +225 -0
  1443. package/dist/vehicle/validate.js +956 -0
  1444. package/dist/vehicle/validate.js.map +1 -0
  1445. package/dist/vehicle/wheelDesign.d.ts +98 -0
  1446. package/dist/vehicle/wheelDesign.js +276 -0
  1447. package/dist/vehicle/wheelDesign.js.map +1 -0
  1448. package/dist/verifySubPath.d.ts +69 -0
  1449. package/dist/verifySubPath.js +458 -0
  1450. package/dist/verifySubPath.js.map +1 -0
  1451. package/dist/visualQa/animation.d.ts +57 -0
  1452. package/dist/visualQa/animation.js +503 -0
  1453. package/dist/visualQa/animation.js.map +1 -0
  1454. package/dist/visualQa/avatar.d.ts +3 -0
  1455. package/dist/visualQa/avatar.js +443 -0
  1456. package/dist/visualQa/avatar.js.map +1 -0
  1457. package/dist/visualQa/avatarMath.d.ts +180 -0
  1458. package/dist/visualQa/avatarMath.js +318 -0
  1459. package/dist/visualQa/avatarMath.js.map +1 -0
  1460. package/dist/visualQa/avatarPreview.d.ts +26 -0
  1461. package/dist/visualQa/avatarPreview.js +167 -0
  1462. package/dist/visualQa/avatarPreview.js.map +1 -0
  1463. package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
  1464. package/dist/visualQa/avatarPreviewMath.js +696 -0
  1465. package/dist/visualQa/avatarPreviewMath.js.map +1 -0
  1466. package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
  1467. package/dist/visualQa/avatarPreviewProbe.js +181 -0
  1468. package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
  1469. package/dist/visualQa/avatarProbe.d.ts +1 -0
  1470. package/dist/visualQa/avatarProbe.js +264 -0
  1471. package/dist/visualQa/avatarProbe.js.map +1 -0
  1472. package/dist/visualQa/browser.d.ts +116 -0
  1473. package/dist/visualQa/browser.js +817 -0
  1474. package/dist/visualQa/browser.js.map +1 -0
  1475. package/dist/visualQa/candidate.d.ts +116 -0
  1476. package/dist/visualQa/candidate.js +265 -0
  1477. package/dist/visualQa/candidate.js.map +1 -0
  1478. package/dist/visualQa/checklists.d.ts +31 -0
  1479. package/dist/visualQa/checklists.js +160 -0
  1480. package/dist/visualQa/checklists.js.map +1 -0
  1481. package/dist/visualQa/command.d.ts +110 -0
  1482. package/dist/visualQa/command.js +521 -0
  1483. package/dist/visualQa/command.js.map +1 -0
  1484. package/dist/visualQa/commonAsserts.d.ts +68 -0
  1485. package/dist/visualQa/commonAsserts.js +239 -0
  1486. package/dist/visualQa/commonAsserts.js.map +1 -0
  1487. package/dist/visualQa/contactSheet.d.ts +32 -0
  1488. package/dist/visualQa/contactSheet.js +153 -0
  1489. package/dist/visualQa/contactSheet.js.map +1 -0
  1490. package/dist/visualQa/critic.d.ts +18 -0
  1491. package/dist/visualQa/critic.js +179 -0
  1492. package/dist/visualQa/critic.js.map +1 -0
  1493. package/dist/visualQa/emotePage.d.ts +10 -0
  1494. package/dist/visualQa/emotePage.js +249 -0
  1495. package/dist/visualQa/emotePage.js.map +1 -0
  1496. package/dist/visualQa/evidenceOverlay.d.ts +74 -0
  1497. package/dist/visualQa/evidenceOverlay.js +268 -0
  1498. package/dist/visualQa/evidenceOverlay.js.map +1 -0
  1499. package/dist/visualQa/harness.d.ts +57 -0
  1500. package/dist/visualQa/harness.js +3 -0
  1501. package/dist/visualQa/harness.js.map +1 -0
  1502. package/dist/visualQa/hosted.d.ts +152 -0
  1503. package/dist/visualQa/hosted.js +367 -0
  1504. package/dist/visualQa/hosted.js.map +1 -0
  1505. package/dist/visualQa/labelLimit.d.ts +12 -0
  1506. package/dist/visualQa/labelLimit.js +31 -0
  1507. package/dist/visualQa/labelLimit.js.map +1 -0
  1508. package/dist/visualQa/mirror.d.ts +36 -0
  1509. package/dist/visualQa/mirror.js +98 -0
  1510. package/dist/visualQa/mirror.js.map +1 -0
  1511. package/dist/visualQa/moveUx.d.ts +44 -0
  1512. package/dist/visualQa/moveUx.js +103 -0
  1513. package/dist/visualQa/moveUx.js.map +1 -0
  1514. package/dist/visualQa/pinnedChrome.d.ts +63 -0
  1515. package/dist/visualQa/pinnedChrome.js +214 -0
  1516. package/dist/visualQa/pinnedChrome.js.map +1 -0
  1517. package/dist/visualQa/resolve.d.ts +88 -0
  1518. package/dist/visualQa/resolve.js +248 -0
  1519. package/dist/visualQa/resolve.js.map +1 -0
  1520. package/dist/visualQa/scene.d.ts +14 -0
  1521. package/dist/visualQa/scene.js +688 -0
  1522. package/dist/visualQa/scene.js.map +1 -0
  1523. package/dist/visualQa/shot.d.ts +2 -0
  1524. package/dist/visualQa/shot.js +27 -0
  1525. package/dist/visualQa/shot.js.map +1 -0
  1526. package/dist/visualQa/signIn.d.ts +35 -0
  1527. package/dist/visualQa/signIn.js +144 -0
  1528. package/dist/visualQa/signIn.js.map +1 -0
  1529. package/dist/visualQa/submitBudget.d.ts +25 -0
  1530. package/dist/visualQa/submitBudget.js +82 -0
  1531. package/dist/visualQa/submitBudget.js.map +1 -0
  1532. package/dist/visualQa/types.d.ts +195 -0
  1533. package/dist/visualQa/types.js +12 -0
  1534. package/dist/visualQa/types.js.map +1 -0
  1535. package/dist/visualQa/vehicle.d.ts +130 -0
  1536. package/dist/visualQa/vehicle.js +2001 -0
  1537. package/dist/visualQa/vehicle.js.map +1 -0
  1538. package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
  1539. package/dist/visualQa/vehicleAddonProbe.js +115 -0
  1540. package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
  1541. package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
  1542. package/dist/visualQa/vehicleCabinFit.js +55 -0
  1543. package/dist/visualQa/vehicleCabinFit.js.map +1 -0
  1544. package/dist/visualQa/vehicleClearance.d.ts +135 -0
  1545. package/dist/visualQa/vehicleClearance.js +299 -0
  1546. package/dist/visualQa/vehicleClearance.js.map +1 -0
  1547. package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
  1548. package/dist/visualQa/vehicleDriveAlive.js +103 -0
  1549. package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
  1550. package/dist/visualQa/vehicleGrip.d.ts +156 -0
  1551. package/dist/visualQa/vehicleGrip.js +439 -0
  1552. package/dist/visualQa/vehicleGrip.js.map +1 -0
  1553. package/dist/visualQa/vehicleInspection.d.ts +30 -0
  1554. package/dist/visualQa/vehicleInspection.js +189 -0
  1555. package/dist/visualQa/vehicleInspection.js.map +1 -0
  1556. package/dist/visualQa/vehicleLamps.d.ts +118 -0
  1557. package/dist/visualQa/vehicleLamps.js +374 -0
  1558. package/dist/visualQa/vehicleLamps.js.map +1 -0
  1559. package/dist/visualQa/vehicleMath.d.ts +440 -0
  1560. package/dist/visualQa/vehicleMath.js +967 -0
  1561. package/dist/visualQa/vehicleMath.js.map +1 -0
  1562. package/dist/visualQa/vehicleOccupants.d.ts +66 -0
  1563. package/dist/visualQa/vehicleOccupants.js +448 -0
  1564. package/dist/visualQa/vehicleOccupants.js.map +1 -0
  1565. package/dist/visualQa/vehiclePenetration.d.ts +172 -0
  1566. package/dist/visualQa/vehiclePenetration.js +1157 -0
  1567. package/dist/visualQa/vehiclePenetration.js.map +1 -0
  1568. package/dist/visualQa/vehiclePoses.d.ts +25 -0
  1569. package/dist/visualQa/vehiclePoses.js +56 -0
  1570. package/dist/visualQa/vehiclePoses.js.map +1 -0
  1571. package/dist/visualQa/vehiclePosture.d.ts +78 -0
  1572. package/dist/visualQa/vehiclePosture.js +263 -0
  1573. package/dist/visualQa/vehiclePosture.js.map +1 -0
  1574. package/dist/visualQa/vehiclePreview.d.ts +103 -0
  1575. package/dist/visualQa/vehiclePreview.js +312 -0
  1576. package/dist/visualQa/vehiclePreview.js.map +1 -0
  1577. package/dist/visualQa/vehicleProbe.d.ts +3 -0
  1578. package/dist/visualQa/vehicleProbe.js +670 -0
  1579. package/dist/visualQa/vehicleProbe.js.map +1 -0
  1580. package/dist/visualQa/vehicleStance.d.ts +108 -0
  1581. package/dist/visualQa/vehicleStance.js +200 -0
  1582. package/dist/visualQa/vehicleStance.js.map +1 -0
  1583. package/dist/visualQa/viewer.d.ts +6 -0
  1584. package/dist/visualQa/viewer.js +750 -0
  1585. package/dist/visualQa/viewer.js.map +1 -0
  1586. package/dist/visualQa/viewerGeometry.d.ts +116 -0
  1587. package/dist/visualQa/viewerGeometry.js +476 -0
  1588. package/dist/visualQa/viewerGeometry.js.map +1 -0
  1589. package/dist/visualQa/viewerPage.d.ts +11 -0
  1590. package/dist/visualQa/viewerPage.js +414 -0
  1591. package/dist/visualQa/viewerPage.js.map +1 -0
  1592. package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
  1593. package/dist/visualQa/webgpuSelfTest.js +113 -0
  1594. package/dist/visualQa/webgpuSelfTest.js.map +1 -0
  1595. package/dist/visualQa/winChrome.d.ts +92 -0
  1596. package/dist/visualQa/winChrome.js +445 -0
  1597. package/dist/visualQa/winChrome.js.map +1 -0
  1598. package/dist/visualQa/worldWalk.d.ts +59 -0
  1599. package/dist/visualQa/worldWalk.js +523 -0
  1600. package/dist/visualQa/worldWalk.js.map +1 -0
  1601. package/dist/visualQa/worldWalkMath.d.ts +263 -0
  1602. package/dist/visualQa/worldWalkMath.js +873 -0
  1603. package/dist/visualQa/worldWalkMath.js.map +1 -0
  1604. package/dist/visualQa/worldWalkProbe.d.ts +1 -0
  1605. package/dist/visualQa/worldWalkProbe.js +206 -0
  1606. package/dist/visualQa/worldWalkProbe.js.map +1 -0
  1607. package/dist/visualsConfig.d.ts +65 -0
  1608. package/dist/visualsConfig.js +1333 -0
  1609. package/dist/visualsConfig.js.map +1 -0
  1610. package/dist/voiceCommand.d.ts +11 -0
  1611. package/dist/voiceCommand.js +101 -0
  1612. package/dist/voiceCommand.js.map +1 -0
  1613. package/dist/world/analyze.d.ts +51 -0
  1614. package/dist/world/analyze.js +767 -0
  1615. package/dist/world/analyze.js.map +1 -0
  1616. package/dist/world/baseline.d.ts +33 -0
  1617. package/dist/world/baseline.js +111 -0
  1618. package/dist/world/baseline.js.map +1 -0
  1619. package/dist/world/canonicalize.d.ts +7 -0
  1620. package/dist/world/canonicalize.js +110 -0
  1621. package/dist/world/canonicalize.js.map +1 -0
  1622. package/dist/world/diff.d.ts +18 -0
  1623. package/dist/world/diff.js +58 -0
  1624. package/dist/world/diff.js.map +1 -0
  1625. package/dist/world/focus.d.ts +11 -0
  1626. package/dist/world/focus.js +161 -0
  1627. package/dist/world/focus.js.map +1 -0
  1628. package/dist/world/format.d.ts +6 -0
  1629. package/dist/world/format.js +125 -0
  1630. package/dist/world/format.js.map +1 -0
  1631. package/dist/world/readWorldMetrics.d.ts +10 -0
  1632. package/dist/world/readWorldMetrics.js +31 -0
  1633. package/dist/world/readWorldMetrics.js.map +1 -0
  1634. package/dist/world/snapshotTypes.d.ts +59 -0
  1635. package/dist/world/snapshotTypes.js +8 -0
  1636. package/dist/world/snapshotTypes.js.map +1 -0
  1637. package/dist/world/snapshotWorld.d.ts +16 -0
  1638. package/dist/world/snapshotWorld.js +142 -0
  1639. package/dist/world/snapshotWorld.js.map +1 -0
  1640. package/dist/world/wiring.d.ts +21 -0
  1641. package/dist/world/wiring.js +73 -0
  1642. package/dist/world/wiring.js.map +1 -0
  1643. package/dist/world/zones.d.ts +23 -0
  1644. package/dist/world/zones.js +134 -0
  1645. package/dist/world/zones.js.map +1 -0
  1646. package/docs/bridge.md +304 -0
  1647. package/docs/device-hand-reach.md +44 -0
  1648. package/docs/scene-hlod.md +139 -0
  1649. package/docs/vehicle-audio-import.md +299 -0
  1650. package/docs/vehicle-simulate.md +165 -0
  1651. package/docs/visual-qa-candidate-versions.md +71 -0
  1652. package/docs/visual-qa.md +462 -0
  1653. package/package.json +69 -4
  1654. package/plugins/beamng-vehicle/README.md +129 -0
  1655. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  1656. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  1657. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  1658. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  1659. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  1660. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  1661. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  1662. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  1663. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  1664. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  1665. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  1666. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  1667. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  1668. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  1669. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
  1670. package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
  1671. package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
  1672. package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
  1673. package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
  1674. package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
  1675. package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
  1676. package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
  1677. package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
  1678. package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
  1679. package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
  1680. package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
  1681. package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
  1682. package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
  1683. package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
  1684. package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
  1685. package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
  1686. package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
  1687. package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
  1688. package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
  1689. package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
  1690. package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
  1691. package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
  1692. package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
  1693. package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
  1694. package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
  1695. package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
  1696. package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
  1697. package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
  1698. package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
  1699. package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
  1700. package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
  1701. package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
  1702. package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
  1703. package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
  1704. package/vendor/README.md +63 -0
  1705. package/vendor/ability-manifest.mjs +527 -6
  1706. package/vendor/audits/asset-credits.mjs +96 -0
  1707. package/vendor/audits/check-loaders.mjs +80 -0
  1708. package/vendor/audits/perf-gate.mjs +759 -0
  1709. package/vendor/audits/prove-live.mjs +307 -0
  1710. package/vendor/audits/source-audit.mjs +530 -0
  1711. package/vendor/audits/world-audit.mjs +439 -0
  1712. package/vendor/capture-body.glb +0 -0
  1713. package/vendor/capture-face.glb +0 -0
  1714. package/vendor/installed-index.mjs +1 -1
  1715. package/vendor/vehicle-package-v2.mjs +6451 -0
@@ -0,0 +1,1333 @@
1
+ "use strict";
2
+ // Vendored `helix.visuals.json` v1 validator — the per-world visual contract the engine's visual runtime
3
+ // parses at boot. A world authors its LOOK here — mode, time of day, the sun/sky/environment/shadows transport
4
+ // knobs, grade, exposure, bloom, fog, AO, practicals, local post-processing volumes, and the bake's probe volume
5
+ // with its budget and bounces — while tier ladders, face sizes and pass order stay engine internals (quality
6
+ // tiers may DROP a pass on weak hardware; they never re-author these values).
7
+ // SYNC OBLIGATION: mirrors `parseVisualsConfig` + `bakedLightingPointerOf` / `BAKED_LIGHTING_VERSION` in
8
+ // helix-web-engine-new/systems/visual/src/runtime/visualsConfig.ts — plus the `AgxLookName` vocabulary from
9
+ // .../src/color/agxLook.ts, DEFAULT_SUN_PATH / wrapHours from .../src/tod/sunPath.ts, and the baked artifact's
10
+ // shape from .../src/tod/keyframes.ts (`ProbeKeyframeStore.fromJSON`) + .../src/runtime/bakedField.ts
11
+ // (`createBakedField`, where a missing `volume` is fatal and a missing `geometry` only degrades visibility).
12
+ // Fix bugs there first, then mirror here; do not diverge. The parser THROWS on the first bad field, so
13
+ // everything it throws on is an ERROR here (a world whose config the runtime rejects does not boot); everything
14
+ // it tolerates — unknown top-level keys, wrapped hours, a clamped cycle, angles outside any range — is at most
15
+ // a WARNING.
16
+ // The AgX presets' CDL numbers are deliberately NOT mirrored: no rule reads them, only the preset names.
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.BAKED_LIGHTING_VERSION = exports.AGX_LOOK_NAMES = exports.VISUALS_MODES = exports.VISUALS_CONFIG_VERSION = exports.VISUALS_CONFIG_SOURCE_PATH = exports.VISUALS_CONFIG_FILE = void 0;
19
+ exports.auditVisualsConfig = auditVisualsConfig;
20
+ exports.auditVisualsConfigText = auditVisualsConfigText;
21
+ exports.auditBakedArtifact = auditBakedArtifact;
22
+ exports.auditBakedArtifactText = auditBakedArtifactText;
23
+ /** The document's filename. A world SOURCE keeps it in `public/`; a built bundle serves it from the root. */
24
+ exports.VISUALS_CONFIG_FILE = 'helix.visuals.json';
25
+ exports.VISUALS_CONFIG_SOURCE_PATH = `public/${exports.VISUALS_CONFIG_FILE}`;
26
+ exports.VISUALS_CONFIG_VERSION = 1;
27
+ /** `baked` = a keyframed probe field shipped as publish-time data; `dynamic` = zero-bake, lit at runtime. */
28
+ exports.VISUALS_MODES = ['baked', 'dynamic'];
29
+ /** The calibrated AgX look presets `grade.look` may name. */
30
+ exports.AGX_LOOK_NAMES = ['none', 'needle', 'daylight', 'punchy'];
31
+ /** Contract version of the `bakedLighting` block the bake step writes into the document. */
32
+ exports.BAKED_LIGHTING_VERSION = 1;
33
+ /** The scaffold default: zero-bake, static noon sun on the default path, the calibrated daylight grade. */
34
+ const DEFAULT_MODE = 'dynamic';
35
+ const DEFAULT_HOURS = 12;
36
+ const DEFAULT_LOOK = 'daylight';
37
+ const DEFAULT_SUN_PATH = { latitudeDeg: 45, declinationDeg: 0, noonAzimuthDeg: 180 };
38
+ // The authored post-stack blocks' calibrated defaults and bounds — mirrored from the engine's
39
+ // DEFAULT_EXPOSURE / DEFAULT_BLOOM / DEFAULT_FOG / DEFAULT_AO + EXPOSURE_COMPENSATION_LIMIT.
40
+ const EXPOSURE_COMPENSATION_LIMIT = 5;
41
+ const DEFAULT_EXPOSURE = { compensation: 0, min: 0.4, max: 40, postGain: 1 };
42
+ // `key` IS the auto-exposure target, verbatim at every hour — absent (or null) is the day/night schedule the
43
+ // calibration was derived under. `postGain` is the tone mapper's own multiplier, applied past bloom.
44
+ const EXPOSURE_KEY_BAND = { min: 0.005, max: 1 };
45
+ const EXPOSURE_POST_GAIN_BAND = { min: 0.1, max: 4 };
46
+ // The LIGHT TRANSPORT blocks' calibrated defaults and bounds — mirrored from the engine's DEFAULT_SUN /
47
+ // DEFAULT_ENVIRONMENT / DEFAULT_SHADOWS. Unlike the post stack these feed the probe BAKE, not the frame.
48
+ const DEFAULT_SUN_INTENSITY_SCALE = 1;
49
+ const SUN_INTENSITY_SCALE_BAND = { min: 0.05, max: 20 };
50
+ /** How `sun.tint` meets the elevation warm ramp: `multiply` colours the ramp, `replace` hands the tint over
51
+ * verbatim at every hour — the only way to author an exact sun colour, a pure white one included. */
52
+ const SUN_TINT_MODES = ['multiply', 'replace'];
53
+ const DEFAULT_SUN_TINT_MODE = 'multiply';
54
+ const DEFAULT_ENVIRONMENT_INTENSITY = 0.05;
55
+ const ENVIRONMENT_INTENSITY_BAND = { min: 0, max: 4 };
56
+ const DEFAULT_SHADOW_OPACITY = 1;
57
+ const SHADOW_OPACITY_BAND = { min: 0, max: 1 };
58
+ // The sun's square ortho shadow box, half-extent in metres. Absent is the fit the rig derives from the probe
59
+ // volume; an authored one buys COVERAGE with resolution, the texel being 2·extent/mapSize on the tier's map.
60
+ const SHADOW_EXTENT_BAND = { min: 4, max: 200 };
61
+ // The sky model — mirrored from the engine's DEFAULT_SKY + SKY_TURBIDITY_* / SKY_IRRADIANCE_SCALE_*. TL is
62
+ // Linke's turbidity: 2.5 is a clear day, and past 4 the sky out-lights the sun.
63
+ const DEFAULT_SKY_TURBIDITY = 2.5;
64
+ const SKY_TURBIDITY_BAND = { min: 1, max: 10 };
65
+ const DEFAULT_SKY_IRRADIANCE_SCALE = 1;
66
+ const SKY_IRRADIANCE_SCALE_BAND = { min: 0.1, max: 4 };
67
+ // What is left of the frozen-sunset dome once the sun is 6° under — mirrored from DEFAULT_TWILIGHT_FLOOR /
68
+ // SKY_TWILIGHT_FLOOR_*. Runtime-blended, never baked: the keys photograph the sun above the horizon.
69
+ const DEFAULT_SKY_TWILIGHT_FLOOR = 0.001;
70
+ const SKY_TWILIGHT_FLOOR_BAND = { min: 0.0001, max: 1 };
71
+ // The probe field's own shape — mirrored from DEFAULT_PROBE_BUDGET / PROBE_BUDGET_PRESETS / PROBE_BOUNCES_*.
72
+ // A budget outside its band is refused WHOLE and falls back to the default: a per-axis clamp would hand back a
73
+ // grid nobody authored, half-honoured exactly where the bake cost changed.
74
+ const DEFAULT_PROBE_BUDGET = [7, 4, 7];
75
+ const PROBE_BUDGET_PRESETS = { default: DEFAULT_PROBE_BUDGET, large: [12, 6, 10] };
76
+ const PROBE_BUDGET_AXIS_BAND = { min: 2, max: 16 };
77
+ const PROBE_BUDGET_MAX = 1536;
78
+ const DEFAULT_PROBE_BOUNCES = 1;
79
+ const PROBE_BOUNCES_BAND = { min: 1, max: 4 };
80
+ /** The engine's own box — `DEFAULT_PROBE_VOLUME` in probeRung.ts, 6 m cells over the default budget. It is
81
+ * what an unauthored `probes.size` lands at, so a budget's cell pitch can be reported without one. */
82
+ const DEFAULT_PROBE_SPAN = [36, 18, 36];
83
+ /** Keys the parser claims. Everything else is CARRIED — the bake step writes its artifact pointer here. */
84
+ const CLAIMED_KEYS = [
85
+ 'version', 'mode', 'timeOfDay', 'sun', 'sky', 'environment', 'shadows', 'grade', 'exposure', 'bloom', 'fog', 'ao', 'probes', 'practicals',
86
+ 'volumes', 'weather', 'ocean',
87
+ ];
88
+ const TIME_OF_DAY_KEYS = ['hours', 'cycleSeconds', 'paused', 'latitudeDeg', 'declinationDeg', 'noonAzimuthDeg'];
89
+ const SUN_KEYS = ['intensityScale', 'tint', 'tintMode'];
90
+ const SKY_KEYS = ['turbidity', 'irradianceScale', 'twilightFloor'];
91
+ const ENVIRONMENT_KEYS = ['intensity'];
92
+ const SHADOWS_KEYS = ['opacity', 'extent'];
93
+ /** The blocks that feed the probe bake rather than the frame — the ones a `baked` world has to re-bake for. */
94
+ const TRANSPORT_KEYS = ['sun', 'sky', 'environment', 'shadows', 'weather', 'ocean'];
95
+ const GRADE_KEYS = ['look', 'slope', 'power', 'saturation'];
96
+ const EXPOSURE_KEYS = ['compensation', 'min', 'max', 'key', 'postGain'];
97
+ const BLOOM_KEYS = ['intensity', 'nightIntensity', 'threshold'];
98
+ const FOG_KEYS = ['enabled', 'density', 'heightDensity'];
99
+ const AO_KEYS = ['intensity', 'radius'];
100
+ const PROBES_KEYS = ['center', 'size', 'budget', 'bounces', 'skyFallback', 'volumes'];
101
+ /** SYNC OBLIGATION: mirrors the engine's nested-volume parser (`parseProbeVolumes` / `parseProbePad`,
102
+ * systems/visual/src/runtime/visualsConfig.ts) — widen both in lockstep. */
103
+ const PROBE_VOLUME_KEYS = ['center', 'size', 'budget', 'blendMetres', 'pad'];
104
+ const PROBE_VOLUME_MAX = 4;
105
+ const DEFAULT_PROBE_VOLUME_BLEND = 0.5;
106
+ /** Interior corners leak past this nested cell pitch — measured on the reference shed: 2.5–3.1 m cells bled
107
+ * a sunlit strip down every vertical corner, 1.5–1.9 m rendered them clean. A hint, never a gate. */
108
+ const NESTED_CELL_CORNER_HINT = 1.9;
109
+ const VOLUME_KEYS = ['center', 'size', 'blendMetres', 'exposure', 'bloom', 'fog', 'ao'];
110
+ /** The post-stack blocks a volume may override locally, and the document-level ones it may not. */
111
+ const VOLUME_OVERRIDE_KEYS = ['exposure', 'bloom', 'fog', 'ao'];
112
+ const VOLUME_EXCLUDED_KEYS = ['grade', 'timeOfDay', 'probes', 'mode', 'practicals', ...TRANSPORT_KEYS];
113
+ // `enabled` is authorable on the document's fog but not in a volume: a volume blends, and there is no half-off.
114
+ const VOLUME_FOG_KEYS = ['density', 'heightDensity'];
115
+ const DEFAULT_VOLUME_BLEND_METRES = 1;
116
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
117
+ /** Mirrors engine-core/weather's strict optional weather block; defaults stay in the runtime. */
118
+ function auditWeather(audit, raw, mode) {
119
+ if (raw === undefined)
120
+ return;
121
+ const error = (message) => { audit.errors.push(`${audit.file}: ${message}`); };
122
+ if (!isRecord(raw)) {
123
+ error('weather must be an object');
124
+ return;
125
+ }
126
+ const values = ['coverage', 'density', 'rain', 'storm', 'windX', 'windZ'];
127
+ const keys = ['enabled', 'preset', 'seed', 'cloudBaseM', 'cloudScaleM', 'cloudShadows', ...values];
128
+ for (const key of Object.keys(raw))
129
+ if (!keys.includes(key))
130
+ error(`unknown weather field: ${key}`);
131
+ const presets = ['clear', 'fair', 'overcast', 'rain', 'storm'];
132
+ if (raw.preset != null && !presets.includes(raw.preset))
133
+ error(`weather.preset must be one of ${presets.join(', ')}`);
134
+ for (const key of ['enabled', 'cloudShadows']) {
135
+ if (raw[key] !== undefined && typeof raw[key] !== 'boolean')
136
+ error(`weather.${key} must be a boolean`);
137
+ }
138
+ const number = (key, min, max, nullIsAbsent = false) => {
139
+ const value = raw[key];
140
+ if (value === undefined || (value === null && nullIsAbsent))
141
+ return;
142
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max) {
143
+ error(`weather.${key} must be a finite number in [${min}, ${max}]`);
144
+ }
145
+ };
146
+ number('seed', 0, 0xffffffff, true);
147
+ if (typeof raw.seed === 'number' && Number.isFinite(raw.seed) && !Number.isInteger(raw.seed))
148
+ error('weather.seed must be an integer');
149
+ number('cloudBaseM', 100, 20000, true);
150
+ number('cloudScaleM', 500, 50000, true);
151
+ for (const key of values)
152
+ number(key, key.startsWith('wind') ? -40 : 0, key.startsWith('wind') ? 40 : 1);
153
+ if (raw.enabled === true && mode === 'baked')
154
+ error('Weather requires dynamic lighting; baked lighting artifacts do not contain weather states.');
155
+ }
156
+ /** Mirrors visual/ocean/oceanConfig.ts; scene documents and their sealed hashes are unaffected. */
157
+ function auditOcean(audit, raw, mode) {
158
+ if (raw === undefined)
159
+ return;
160
+ const error = (message) => { audit.errors.push(`${audit.file}: ${message}`); };
161
+ if (!isRecord(raw)) {
162
+ error('ocean must be an object');
163
+ return;
164
+ }
165
+ const keys = ['enabled', 'level', 'seed', 'significantWaveHeight', 'peakWavelength', 'windDirectionDeg', 'bathymetry', 'refraction', 'reflections'];
166
+ for (const key of Object.keys(raw))
167
+ if (!keys.includes(key))
168
+ error(`unknown ocean field: ${key}`);
169
+ for (const key of ['enabled', 'refraction', 'reflections']) {
170
+ if (raw[key] !== undefined && typeof raw[key] !== 'boolean')
171
+ error(`ocean.${key} must be a boolean`);
172
+ }
173
+ for (const [key, min, max] of [['level', -10000, 10000], ['seed', 0, 0xffffffff], ['significantWaveHeight', 0, 8],
174
+ ['peakWavelength', 2, 1000], ['windDirectionDeg', -360, 360]]) {
175
+ const value = raw[key];
176
+ if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max)) {
177
+ error(`ocean.${key} must be in [${min}, ${max}]`);
178
+ }
179
+ }
180
+ if (raw.seed !== undefined && !Number.isInteger(raw.seed))
181
+ error('ocean.seed must be an integer');
182
+ const peak = raw.peakWavelength ?? 20, height = raw.significantWaveHeight ?? 0.8;
183
+ if (typeof peak === 'number' && typeof height === 'number' && peak < height * 12) {
184
+ error('ocean.peakWavelength must be at least 12 times significantWaveHeight');
185
+ }
186
+ if (raw.bathymetry != null && (typeof raw.bathymetry !== 'string' || raw.bathymetry.trim() === '')) {
187
+ error('ocean.bathymetry must be a non-empty URL or null');
188
+ }
189
+ if (raw.enabled === true && mode === 'baked')
190
+ error('Ocean currently requires dynamic lighting.');
191
+ }
192
+ /** Wrap a clock reading into [0, 24) — the cycle is periodic, so a scrub past midnight is not an error. */
193
+ function wrapHours(hours) {
194
+ const h = hours % 24;
195
+ return h < 0 ? h + 24 : h;
196
+ }
197
+ function editDistance(a, b) {
198
+ const row = Array.from({ length: b.length + 1 }, (_, i) => i);
199
+ for (let i = 1; i <= a.length; i += 1) {
200
+ let previous = row[0];
201
+ row[0] = i;
202
+ for (let j = 1; j <= b.length; j += 1) {
203
+ const swap = row[j];
204
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1));
205
+ previous = swap;
206
+ }
207
+ }
208
+ return row[b.length];
209
+ }
210
+ /**
211
+ * The closest known key within two edits — a typo, not a different word. `null` when nothing is close.
212
+ * A dropped or invented unit suffix (`latitude` for `latitudeDeg`, `saturationDeg` for `saturation`) is the
213
+ * commonest miss here and outruns two edits, so a prefix relation counts as one.
214
+ */
215
+ function didYouMean(key, known) {
216
+ const lower = key.toLowerCase();
217
+ let best = null;
218
+ let bestDistance = 3;
219
+ for (const candidate of known) {
220
+ const other = candidate.toLowerCase();
221
+ const prefixed = lower.length >= 4 && (other.startsWith(lower) || lower.startsWith(other));
222
+ const distance = prefixed ? 1 : editDistance(lower, other);
223
+ if (distance < bestDistance) {
224
+ best = candidate;
225
+ bestDistance = distance;
226
+ }
227
+ }
228
+ return best;
229
+ }
230
+ function numberField(audit, source, key, fallback, what) {
231
+ const value = source[key];
232
+ if (value === undefined)
233
+ return fallback;
234
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
235
+ audit.errors.push(`${audit.file}: ${what}.${key} must be a finite number`);
236
+ return fallback;
237
+ }
238
+ return value;
239
+ }
240
+ function booleanField(audit, source, key, fallback, what) {
241
+ const value = source[key];
242
+ if (value === undefined)
243
+ return fallback;
244
+ if (typeof value !== 'boolean') {
245
+ audit.errors.push(`${audit.file}: ${what}.${key} must be a boolean`);
246
+ return fallback;
247
+ }
248
+ return value;
249
+ }
250
+ // Unknown keys inside a claimed BLOCK are dropped on the floor by the parser (only the top level is carried),
251
+ // so a typo there is silent: the world boots with the default and looks subtly wrong.
252
+ function reportUnknownKeys(audit, source, known, what) {
253
+ for (const key of Object.keys(source)) {
254
+ if (known.includes(key))
255
+ continue;
256
+ const suggestion = didYouMean(key, known);
257
+ audit.warnings.push(`${audit.file}: ${what}.${key} is not read by the runtime and is ignored${suggestion ? ` — did you mean "${suggestion}"?` : ''}`);
258
+ }
259
+ }
260
+ /** A boolean with a THIRD state: absent — or an explicit null — is "decide for me", which the runtime resolves
261
+ * rather than a value it is missing. A wrong TYPE still throws engine-side, so it is an error here. */
262
+ function tristateField(audit, source, key, what) {
263
+ const value = source[key];
264
+ if (value === undefined || value === null)
265
+ return null;
266
+ if (typeof value !== 'boolean') {
267
+ audit.errors.push(`${audit.file}: ${what}.${key} must be a boolean or null`);
268
+ return null;
269
+ }
270
+ return value;
271
+ }
272
+ function auditTimeOfDay(audit, raw) {
273
+ if (raw === undefined)
274
+ return { fragment: `sun ${DEFAULT_HOURS}h, static`, cycleSeconds: 0 };
275
+ if (!isRecord(raw)) {
276
+ audit.errors.push(`${audit.file}: timeOfDay must be an object`);
277
+ return { fragment: 'sun ?', cycleSeconds: 0 };
278
+ }
279
+ reportUnknownKeys(audit, raw, TIME_OF_DAY_KEYS, 'timeOfDay');
280
+ const authoredCycle = numberField(audit, raw, 'cycleSeconds', 0, 'timeOfDay');
281
+ const cycleSeconds = Math.max(0, authoredCycle);
282
+ if (authoredCycle < 0) {
283
+ audit.warnings.push(`${audit.file}: timeOfDay.cycleSeconds ${authoredCycle} is clamped to 0 — the sun will not move`);
284
+ }
285
+ const authoredHours = numberField(audit, raw, 'hours', DEFAULT_HOURS, 'timeOfDay');
286
+ const hours = wrapHours(authoredHours);
287
+ if (hours !== authoredHours) {
288
+ audit.warnings.push(`${audit.file}: timeOfDay.hours ${authoredHours} wraps to ${hours}`);
289
+ }
290
+ const paused = booleanField(audit, raw, 'paused', false, 'timeOfDay');
291
+ const path = {
292
+ latitudeDeg: numberField(audit, raw, 'latitudeDeg', DEFAULT_SUN_PATH.latitudeDeg, 'timeOfDay'),
293
+ declinationDeg: numberField(audit, raw, 'declinationDeg', DEFAULT_SUN_PATH.declinationDeg, 'timeOfDay'),
294
+ noonAzimuthDeg: numberField(audit, raw, 'noonAzimuthDeg', DEFAULT_SUN_PATH.noonAzimuthDeg, 'timeOfDay'),
295
+ };
296
+ const movement = cycleSeconds === 0 ? 'static' : `${cycleSeconds}s/day${paused ? ', paused' : ''}`;
297
+ const moved = Object.keys(path).some((key) => path[key] !== DEFAULT_SUN_PATH[key]);
298
+ const pathText = moved
299
+ ? ` · path lat ${path.latitudeDeg}° dec ${path.declinationDeg}° noon ${path.noonAzimuthDeg}°`
300
+ : '';
301
+ return { fragment: `sun ${hours}h, ${movement}${pathText}`, cycleSeconds };
302
+ }
303
+ function auditGrade(audit, raw) {
304
+ if (raw === undefined)
305
+ return `grade ${DEFAULT_LOOK}`;
306
+ if (!isRecord(raw)) {
307
+ audit.errors.push(`${audit.file}: grade must be an object`);
308
+ return 'grade ?';
309
+ }
310
+ reportUnknownKeys(audit, raw, GRADE_KEYS, 'grade');
311
+ const look = raw.look;
312
+ let name = DEFAULT_LOOK;
313
+ if (look !== undefined) {
314
+ if (typeof look !== 'string' || !exports.AGX_LOOK_NAMES.includes(look)) {
315
+ audit.errors.push(`${audit.file}: grade.look must be one of ${exports.AGX_LOOK_NAMES.join(' | ')}`);
316
+ }
317
+ else {
318
+ name = look;
319
+ }
320
+ }
321
+ // The three CDL numbers override whatever the preset sets, one by one.
322
+ const overridden = ['slope', 'power', 'saturation'].filter((key) => {
323
+ if (raw[key] === undefined)
324
+ return false;
325
+ numberField(audit, raw, key, 0, 'grade');
326
+ return true;
327
+ });
328
+ return `grade ${name}${overridden.length ? ` (${overridden.join('/')} overridden)` : ''}`;
329
+ }
330
+ /** Warn-and-clamp for the fields the engine parser silently clamps non-negative (the cycleSeconds pattern). */
331
+ function nonNegativeField(audit, source, key, fallback, what) {
332
+ const value = numberField(audit, source, key, fallback, what);
333
+ if (value < 0) {
334
+ audit.warnings.push(`${audit.file}: ${what}.${key} ${value} is clamped to 0`);
335
+ return 0;
336
+ }
337
+ return value;
338
+ }
339
+ /** Warn-and-clamp into an authored band, and hand back the value the runtime will actually use. */
340
+ function clampedField(audit, source, key, fallback, what, band) {
341
+ const authored = numberField(audit, source, key, fallback, what);
342
+ const clamped = Math.min(Math.max(authored, band.min), band.max);
343
+ if (clamped !== authored) {
344
+ audit.warnings.push(`${audit.file}: ${what}.${key} ${authored} is clamped to ${clamped} [${band.min}..${band.max}]`);
345
+ }
346
+ return clamped;
347
+ }
348
+ /** A banded number with a THIRD state: absent — or an explicit null — is the engine's own derivation (the
349
+ * schedule, the fitted box) rather than a value that went missing. A wrong TYPE still throws engine-side. */
350
+ function clampedNullableField(audit, source, key, what, band) {
351
+ const value = source[key];
352
+ if (value === undefined || value === null)
353
+ return null;
354
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
355
+ audit.errors.push(`${audit.file}: ${what}.${key} must be a finite number or null`);
356
+ return null;
357
+ }
358
+ const clamped = Math.min(Math.max(value, band.min), band.max);
359
+ if (clamped !== value) {
360
+ audit.warnings.push(`${audit.file}: ${what}.${key} ${value} is clamped to ${clamped} [${band.min}..${band.max}]`);
361
+ }
362
+ return clamped;
363
+ }
364
+ const HEX_COLOR = /^#?(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
365
+ /** A `#rrggbb` / `#rgb` tint, `#` optional — the engine parser accepts the bare form too, and this mirror
366
+ * must never warn on a value the runtime happily consumes. A bad one is a warning: the runtime ignores it. */
367
+ function hexColorField(audit, source, key, what) {
368
+ const value = source[key];
369
+ if (value === undefined)
370
+ return null;
371
+ if (typeof value !== 'string' || !HEX_COLOR.test(value)) {
372
+ audit.warnings.push(`${audit.file}: ${what}.${key} ${JSON.stringify(value)} is not a hex colour ("#rrggbb" or "#rgb") and is ignored`);
373
+ return null;
374
+ }
375
+ return value;
376
+ }
377
+ /** Warn-and-clamp on a compensation outside the calibrated ±EV band, and hand back the value the runtime uses. */
378
+ function clampedCompensation(audit, source, what) {
379
+ const authored = numberField(audit, source, 'compensation', DEFAULT_EXPOSURE.compensation, what);
380
+ const compensation = Math.min(Math.max(authored, -EXPOSURE_COMPENSATION_LIMIT), EXPOSURE_COMPENSATION_LIMIT);
381
+ if (compensation !== authored) {
382
+ audit.warnings.push(`${audit.file}: ${what}.compensation ${authored} is clamped to ${compensation} (±${EXPOSURE_COMPENSATION_LIMIT} EV)`);
383
+ }
384
+ return compensation;
385
+ }
386
+ // The engine parser THROWS on an incoherent band — an exposure multiplier of zero or below renders black or
387
+ // inverted, and min above max has no sensible normalization — so both are errors here.
388
+ function auditExposureBand(audit, min, max, what) {
389
+ if (!(min > 0) || !(max > 0)) {
390
+ audit.errors.push(`${audit.file}: ${what}.min and ${what}.max must be positive exposure multipliers`);
391
+ }
392
+ else if (min > max) {
393
+ audit.errors.push(`${audit.file}: ${what}.min must not exceed ${what}.max (equal pins the exposure)`);
394
+ }
395
+ }
396
+ function auditExposure(audit, raw) {
397
+ if (raw === undefined)
398
+ return null;
399
+ if (!isRecord(raw)) {
400
+ audit.errors.push(`${audit.file}: exposure must be an object`);
401
+ return 'exposure ?';
402
+ }
403
+ reportUnknownKeys(audit, raw, EXPOSURE_KEYS, 'exposure');
404
+ const compensation = clampedCompensation(audit, raw, 'exposure');
405
+ const min = numberField(audit, raw, 'min', DEFAULT_EXPOSURE.min, 'exposure');
406
+ const max = numberField(audit, raw, 'max', DEFAULT_EXPOSURE.max, 'exposure');
407
+ auditExposureBand(audit, min, max, 'exposure');
408
+ const key = clampedNullableField(audit, raw, 'key', 'exposure', EXPOSURE_KEY_BAND);
409
+ // Said out loud: an authored key IS the target at every hour, so the EV stops left in the document beside it
410
+ // do nothing at all.
411
+ if (key !== null && raw.compensation !== undefined) {
412
+ audit.warnings.push(`${audit.file}: exposure.key pins the auto-exposure target, so exposure.compensation is ignored beside it (the key wins)`);
413
+ }
414
+ const postGain = raw.postGain === undefined
415
+ ? null
416
+ : clampedField(audit, raw, 'postGain', DEFAULT_EXPOSURE.postGain, 'exposure', EXPOSURE_POST_GAIN_BAND);
417
+ const sign = compensation > 0 ? '+' : '';
418
+ return `exposure ${sign}${compensation} EV [${min}..${max}${min === max ? ', pinned' : ''}]`
419
+ + (key === null ? '' : ` key ${key}`)
420
+ + (postGain === null ? '' : ` · gain ${postGain}`);
421
+ }
422
+ function auditBloom(audit, raw) {
423
+ if (raw === undefined)
424
+ return null;
425
+ if (!isRecord(raw)) {
426
+ audit.errors.push(`${audit.file}: bloom must be an object`);
427
+ return 'bloom ?';
428
+ }
429
+ reportUnknownKeys(audit, raw, BLOOM_KEYS, 'bloom');
430
+ const intensity = nonNegativeField(audit, raw, 'intensity', 0.4, 'bloom');
431
+ const night = nonNegativeField(audit, raw, 'nightIntensity', 0.12, 'bloom');
432
+ const threshold = nonNegativeField(audit, raw, 'threshold', 4, 'bloom');
433
+ return `bloom ${intensity}/${night} @${threshold}`;
434
+ }
435
+ function auditFog(audit, raw) {
436
+ if (raw === undefined)
437
+ return null;
438
+ if (!isRecord(raw)) {
439
+ audit.errors.push(`${audit.file}: fog must be an object`);
440
+ return 'fog ?';
441
+ }
442
+ reportUnknownKeys(audit, raw, FOG_KEYS, 'fog');
443
+ const enabled = booleanField(audit, raw, 'enabled', true, 'fog');
444
+ const density = nonNegativeField(audit, raw, 'density', 0.0012, 'fog');
445
+ const heightDensity = nonNegativeField(audit, raw, 'heightDensity', 0.002, 'fog');
446
+ return enabled ? `fog ${density}/${heightDensity}` : 'fog off';
447
+ }
448
+ function auditAo(audit, raw) {
449
+ if (raw === undefined)
450
+ return null;
451
+ if (!isRecord(raw)) {
452
+ audit.errors.push(`${audit.file}: ao must be an object`);
453
+ return 'ao ?';
454
+ }
455
+ reportUnknownKeys(audit, raw, AO_KEYS, 'ao');
456
+ const intensity = nonNegativeField(audit, raw, 'intensity', 3, 'ao');
457
+ const radius = nonNegativeField(audit, raw, 'radius', 1.8, 'ao');
458
+ return `ao ${intensity} r${radius}`;
459
+ }
460
+ const UNAUTHORED_TRANSPORT = { fragment: null, retuned: false };
461
+ /**
462
+ * An enum, so a wrong SPELLING fails the way `grade.look` does — a mode that silently fell back would leave the
463
+ * warm ramp on a sun the world believes it replaced. `replace` with nothing to replace the ramp WITH is the one
464
+ * incoherent pair: the engine warns and behaves as `multiply`, so this warns too.
465
+ */
466
+ function sunTintModeField(audit, source, tint) {
467
+ const value = source.tintMode;
468
+ if (value === undefined)
469
+ return DEFAULT_SUN_TINT_MODE;
470
+ if (typeof value !== 'string' || !SUN_TINT_MODES.includes(value)) {
471
+ audit.errors.push(`${audit.file}: sun.tintMode must be one of ${SUN_TINT_MODES.join(' | ')} (got ${JSON.stringify(value)})`);
472
+ return DEFAULT_SUN_TINT_MODE;
473
+ }
474
+ if (value === 'replace' && tint === null) {
475
+ audit.warnings.push(`${audit.file}: sun.tintMode "replace" needs a sun.tint to replace the elevation warm ramp with — it behaves as "multiply"`);
476
+ return DEFAULT_SUN_TINT_MODE;
477
+ }
478
+ return value;
479
+ }
480
+ /** The sun's strength and colour. Transport, not post: it lights the world the probe bake captures. */
481
+ function auditSun(audit, raw) {
482
+ if (raw === undefined)
483
+ return UNAUTHORED_TRANSPORT;
484
+ if (!isRecord(raw)) {
485
+ audit.errors.push(`${audit.file}: sun must be an object`);
486
+ return { fragment: 'sun ?', retuned: false };
487
+ }
488
+ reportUnknownKeys(audit, raw, SUN_KEYS, 'sun');
489
+ const scale = clampedField(audit, raw, 'intensityScale', DEFAULT_SUN_INTENSITY_SCALE, 'sun', SUN_INTENSITY_SCALE_BAND);
490
+ const tint = hexColorField(audit, raw, 'tint', 'sun');
491
+ const tintMode = sunTintModeField(audit, raw, tint);
492
+ return {
493
+ fragment: `sun ×${scale}${tint === null ? '' : ` ${tint}`}${tintMode === DEFAULT_SUN_TINT_MODE ? '' : ` ${tintMode}`}`,
494
+ retuned: scale !== DEFAULT_SUN_INTENSITY_SCALE || tint !== null || tintMode !== DEFAULT_SUN_TINT_MODE,
495
+ };
496
+ }
497
+ /**
498
+ * The sky itself: how thick its air reads (Linke's TL) and how bright the whole dome is. Transport — the probe
499
+ * cubes photograph this sky, and TL shapes the SUN BEAM's own elevation curve too, so the direct and sky halves
500
+ * of one daylight never disagree. `irradianceScale` is NOT `environment.intensity`: this says the sky IS
501
+ * brighter, that one says how much of it the materials see as IBL, and the two multiply.
502
+ */
503
+ function auditSky(audit, raw) {
504
+ if (raw === undefined)
505
+ return UNAUTHORED_TRANSPORT;
506
+ if (!isRecord(raw)) {
507
+ audit.errors.push(`${audit.file}: sky must be an object`);
508
+ return { fragment: 'sky ?', retuned: false };
509
+ }
510
+ reportUnknownKeys(audit, raw, SKY_KEYS, 'sky');
511
+ const turbidity = clampedField(audit, raw, 'turbidity', DEFAULT_SKY_TURBIDITY, 'sky', SKY_TURBIDITY_BAND);
512
+ const scale = clampedField(audit, raw, 'irradianceScale', DEFAULT_SKY_IRRADIANCE_SCALE, 'sky', SKY_IRRADIANCE_SCALE_BAND);
513
+ const floor = clampedField(audit, raw, 'twilightFloor', DEFAULT_SKY_TWILIGHT_FLOOR, 'sky', SKY_TWILIGHT_FLOOR_BAND);
514
+ // The floor is blended at runtime on top of whatever was baked, so it never asks for a re-bake.
515
+ return {
516
+ fragment: `sky TL ${turbidity} ×${scale}${floor !== DEFAULT_SKY_TWILIGHT_FLOOR ? ` · night floor ${floor}` : ''}`,
517
+ retuned: turbidity !== DEFAULT_SKY_TURBIDITY || scale !== DEFAULT_SKY_IRRADIANCE_SCALE,
518
+ };
519
+ }
520
+ /** The environment (sky/ambient) light's strength — transport, so the bake captures whatever it is set to. */
521
+ function auditEnvironment(audit, raw) {
522
+ if (raw === undefined)
523
+ return UNAUTHORED_TRANSPORT;
524
+ if (!isRecord(raw)) {
525
+ audit.errors.push(`${audit.file}: environment must be an object`);
526
+ return { fragment: 'env ?', retuned: false };
527
+ }
528
+ reportUnknownKeys(audit, raw, ENVIRONMENT_KEYS, 'environment');
529
+ const intensity = clampedField(audit, raw, 'intensity', DEFAULT_ENVIRONMENT_INTENSITY, 'environment', ENVIRONMENT_INTENSITY_BAND);
530
+ return { fragment: `env ${intensity}`, retuned: intensity !== DEFAULT_ENVIRONMENT_INTENSITY };
531
+ }
532
+ /**
533
+ * How strongly a shadow darkens what it falls on, 0 (none) to 1 (full), and how far the sun's ortho box reaches
534
+ * — both transport, so the bake holds them: it photographs the scene WITH its shadows.
535
+ */
536
+ function auditShadows(audit, raw) {
537
+ if (raw === undefined)
538
+ return UNAUTHORED_TRANSPORT;
539
+ if (!isRecord(raw)) {
540
+ audit.errors.push(`${audit.file}: shadows must be an object`);
541
+ return { fragment: 'shadows ?', retuned: false };
542
+ }
543
+ reportUnknownKeys(audit, raw, SHADOWS_KEYS, 'shadows');
544
+ const opacity = clampedField(audit, raw, 'opacity', DEFAULT_SHADOW_OPACITY, 'shadows', SHADOW_OPACITY_BAND);
545
+ const extent = clampedNullableField(audit, raw, 'extent', 'shadows', SHADOW_EXTENT_BAND);
546
+ return {
547
+ fragment: `shadows ${opacity}${extent === null ? '' : ` extent ${extent}m`}`,
548
+ retuned: opacity !== DEFAULT_SHADOW_OPACITY || extent !== null,
549
+ };
550
+ }
551
+ /**
552
+ * Exactly three finite numbers, or null where the field is absent. `positive` additionally rejects a zero or
553
+ * negative extent. The engine parser THROWS on both — a collapsed axis is a degenerate box, not a small one —
554
+ * so both are errors here, per the mirror rule.
555
+ */
556
+ function tripleField(audit, source, key, what, positive) {
557
+ const value = source[key];
558
+ if (value === undefined)
559
+ return null;
560
+ if (!Array.isArray(value) || value.length !== 3 || value.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
561
+ audit.errors.push(`${audit.file}: ${what}.${key} must be three finite numbers [x, y, z]`);
562
+ return null;
563
+ }
564
+ const numbers = value;
565
+ if (positive && numbers.some((n) => !(n > 0))) {
566
+ audit.errors.push(`${audit.file}: ${what}.${key} components must all be greater than 0`);
567
+ return null;
568
+ }
569
+ return numbers;
570
+ }
571
+ /**
572
+ * The authored probe budget, mirroring `parseProbeBudget`: a preset name, or three whole probe counts. A budget
573
+ * outside the band is refused WHOLE — the engine warns and falls back to the default — while a value that is not
574
+ * a budget at all (an unknown preset, a two-member array) is a throw there and an error here. Null = unauthored.
575
+ */
576
+ function probeBudgetField(audit, source, what = 'probes') {
577
+ const value = source.budget;
578
+ if (value === undefined)
579
+ return null;
580
+ const presets = Object.keys(PROBE_BUDGET_PRESETS).join(' | ');
581
+ if (typeof value === 'string') {
582
+ const preset = PROBE_BUDGET_PRESETS[value];
583
+ if (preset === undefined) {
584
+ audit.errors.push(`${audit.file}: ${what}.budget must be ${presets} or three probe counts [nx, ny, nz]`);
585
+ return null;
586
+ }
587
+ return preset;
588
+ }
589
+ if (!Array.isArray(value) || value.length !== 3 || value.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
590
+ audit.errors.push(`${audit.file}: ${what}.budget must be three probe counts [nx, ny, nz] or one of ${presets}`);
591
+ return null;
592
+ }
593
+ const budget = value;
594
+ const refused = `— using the default budget [${DEFAULT_PROBE_BUDGET.join(', ')}]`;
595
+ for (let index = 0; index < 3; index += 1) {
596
+ const count = budget[index];
597
+ const axis = 'xyz'[index];
598
+ if (!Number.isInteger(count)) {
599
+ audit.warnings.push(`${audit.file}: ${what}.budget ${axis} is ${count} and probes are whole ${refused}`);
600
+ return DEFAULT_PROBE_BUDGET;
601
+ }
602
+ if (count < PROBE_BUDGET_AXIS_BAND.min || count > PROBE_BUDGET_AXIS_BAND.max) {
603
+ audit.warnings.push(`${audit.file}: ${what}.budget ${axis} is ${count}, outside [${PROBE_BUDGET_AXIS_BAND.min}, ${PROBE_BUDGET_AXIS_BAND.max}] ${refused}`);
604
+ return DEFAULT_PROBE_BUDGET;
605
+ }
606
+ }
607
+ const total = budget[0] * budget[1] * budget[2];
608
+ if (total > PROBE_BUDGET_MAX) {
609
+ audit.warnings.push(`${audit.file}: ${what}.budget [${budget.join(', ')}] is ${total} probes, over the cap of ${PROBE_BUDGET_MAX} ${refused}`);
610
+ return DEFAULT_PROBE_BUDGET;
611
+ }
612
+ return budget;
613
+ }
614
+ // The atlas the field lives in, mirrored from `probeAtlasLayout` (systems/visual/src/probes/probeVisibility.ts):
615
+ // 7 SH slices per padded Z layer, the params row, ONE depth tile per probe, the cell mask, the anchor, the occlusion slab at 8 voxels per
616
+ // cell per axis over a 34² tile pitch, then the nz relocation-offset slices — LAST, so the sampler derives their base as `depth - nz`.
617
+ // 196 probes ask for 322 slices, 720 for 1045.
618
+ const PROBE_OCT_PADDED = 34;
619
+ // The engine's OCC_PER_CELL (probeOcclusion.ts) — raised 4 → 8 in the corner wave: at 4 a 5 m cell makes
620
+ // 1.25 m voxels over 0.3 m walls and the corner junction is ambiguous under every gate.
621
+ const OCC_PER_CELL = 8;
622
+ /** GLES3 guarantees 256 3D-texture layers; desktop drivers report 2048. A field over the floor is a phone that
623
+ * cannot allocate the atlas, which costs it DDGI visibility — not a world that fails to boot. */
624
+ const PROBE_ATLAS_MOBILE_FLOOR = 256;
625
+ const PROBE_ATLAS_DESKTOP_MAX = 2048;
626
+ function probeAtlasDepth([nx, ny, nz]) {
627
+ const cells = [Math.max(nx - 1, 1), Math.max(ny - 1, 1), Math.max(nz - 1, 1)];
628
+ const voxels = cells[0] * cells[1] * cells[2] * OCC_PER_CELL ** 3;
629
+ const occlusionBase = 7 * (nz + 2) + 1 + nx * ny * nz + cells[2] + 1;
630
+ return occlusionBase + Math.ceil(voxels / (Math.max(nx, PROBE_OCT_PADDED) * Math.max(ny, PROBE_OCT_PADDED))) + nz;
631
+ }
632
+ const metres = (value) => String(Math.round(value * 100) / 100);
633
+ /**
634
+ * What a budget actually buys, neither number being visible in the document: the CELL pitch it lands at inside
635
+ * the box (the probes span it corner to corner, so `size / (n - 1)`), and the 3D-texture slices its atlas asks
636
+ * for. A bigger budget buys tighter cells over the same box — `probes.size` is what buys a different box.
637
+ */
638
+ function reportProbeGrid(audit, budget, size) {
639
+ const [nx, ny, nz] = budget;
640
+ const cells = budget.map((count, axis) => size[axis] / Math.max(count - 1, 1));
641
+ const depth = probeAtlasDepth(budget);
642
+ audit.notes.push(`${audit.file}: probes ${nx}×${ny}×${nz} = ${nx * ny * nz} over ${size.map(metres).join(' × ')} m — cells ` +
643
+ `${cells.map(metres).join(' × ')} m · atlas ${depth} slices`);
644
+ if (depth > PROBE_ATLAS_DESKTOP_MAX) {
645
+ audit.errors.push(`${audit.file}: that atlas is ${depth} 3D-texture slices, past the ${PROBE_ATLAS_DESKTOP_MAX} desktop drivers report — ` +
646
+ 'it cannot be allocated anywhere; lower probes.budget');
647
+ }
648
+ else if (depth > PROBE_ATLAS_MOBILE_FLOOR) {
649
+ audit.notes.push(`${audit.file}: that atlas is ${depth} 3D-texture slices, over the ${PROBE_ATLAS_MOBILE_FLOOR} GLES3 guarantees — ` +
650
+ 'a phone that caps there loses DDGI visibility for this world');
651
+ }
652
+ }
653
+ /**
654
+ * The probe volume box: where `helix bake-lighting` captures the field, AND — via an authored centre — where a
655
+ * dynamic world pins its runtime volume statically instead of following the camera, so the pre-bake world
656
+ * previews the exact box its bake will use. Absent a centre the placement is camera-derived (the bake pins off
657
+ * the boot camera, which stands where the world STARTS; a dynamic volume scrolls, and `size` is ignored there).
658
+ * `budget` and `bounces` are the FIELD's own shape, so they are transport too — and bake-only: a dynamic world's
659
+ * live refresh runs its own budget-free feedback bounce and never reads either.
660
+ */
661
+ function auditProbes(audit, raw) {
662
+ if (raw === undefined)
663
+ return UNAUTHORED_TRANSPORT;
664
+ if (!isRecord(raw)) {
665
+ audit.errors.push(`${audit.file}: probes must be an object`);
666
+ return { fragment: 'bake volume ?', retuned: false };
667
+ }
668
+ reportUnknownKeys(audit, raw, PROBES_KEYS, 'probes');
669
+ const center = tripleField(audit, raw, 'center', 'probes', false);
670
+ const size = tripleField(audit, raw, 'size', 'probes', true);
671
+ const budget = probeBudgetField(audit, raw);
672
+ // Rounded after the band, exactly as the engine parser does — 2.5 passes lands on a real pass count.
673
+ const bounces = raw.bounces === undefined
674
+ ? null
675
+ : Math.round(clampedField(audit, raw, 'bounces', DEFAULT_PROBE_BOUNCES, 'probes', PROBE_BOUNCES_BAND));
676
+ const skyFallback = tristateField(audit, raw, 'skyFallback', 'probes');
677
+ if (budget !== null || size !== null)
678
+ reportProbeGrid(audit, budget ?? DEFAULT_PROBE_BUDGET, size ?? DEFAULT_PROBE_SPAN);
679
+ const nested = auditProbeVolumes(audit, raw.volumes);
680
+ if (nested.count > 0) {
681
+ // Every volume stacks into ONE 3D texture (plus a one-slice directory), so the LIMITS are judged on the sum.
682
+ const total = probeAtlasDepth(budget ?? DEFAULT_PROBE_BUDGET) + nested.slices + 1;
683
+ audit.notes.push(`${audit.file}: probes + ${nested.count} nested volume${nested.count === 1 ? '' : 's'} stack into one atlas ≈ ${total} slices`);
684
+ if (total > PROBE_ATLAS_DESKTOP_MAX) {
685
+ audit.errors.push(`${audit.file}: that stacked atlas is ≈ ${total} 3D-texture slices, past the ${PROBE_ATLAS_DESKTOP_MAX} desktop drivers report — ` +
686
+ 'it cannot be allocated anywhere; lower a budget or drop a volume');
687
+ }
688
+ else if (total > PROBE_ATLAS_MOBILE_FLOOR) {
689
+ audit.notes.push(`${audit.file}: that stacked atlas is ≈ ${total} 3D-texture slices, over the ${PROBE_ATLAS_MOBILE_FLOOR} GLES3 guarantees — ` +
690
+ 'a phone that caps there loses DDGI visibility for this world');
691
+ }
692
+ }
693
+ const authored = [
694
+ center === null ? null : `centre [${center.join(', ')}]`,
695
+ size === null ? null : `size [${size.join(', ')}]`,
696
+ budget === null ? null : `budget [${budget.join(', ')}]`,
697
+ bounces === null ? null : `${bounces} bounce${bounces === 1 ? '' : 's'}`,
698
+ skyFallback === null ? null : `sky fallback ${skyFallback ? 'on' : 'off'}`,
699
+ nested.count === 0 ? null : `${nested.count} nested volume${nested.count === 1 ? '' : 's'}`,
700
+ ].filter((part) => part !== null);
701
+ const budgetMoved = budget !== null && budget.some((count, axis) => count !== DEFAULT_PROBE_BUDGET[axis]);
702
+ return {
703
+ fragment: `bake volume ${authored.length ? authored.join(' ') : 'engine-derived'}`,
704
+ retuned: budgetMoved || (bounces !== null && bounces !== DEFAULT_PROBE_BOUNCES) || nested.count > 0,
705
+ };
706
+ }
707
+ /** One nested volume's `pad` — metres past the box its SELECTION still owns. Mirrors the engine's
708
+ * `parseProbePad` shapes exactly; the engine throws where this reports an error. */
709
+ function padField(audit, value, what) {
710
+ if (value === undefined)
711
+ return;
712
+ const shapes = `${audit.file}: ${what}.pad must be metres >= 0 — a number, [x, y, z], or { x?, y?, z? } each a number or [minFace, maxFace]`;
713
+ const face = (v) => (typeof v === 'number' && Number.isFinite(v) && v >= 0) ||
714
+ (Array.isArray(v) && v.length === 2 && v.every((n) => typeof n === 'number' && Number.isFinite(n) && n >= 0));
715
+ if (typeof value === 'number') {
716
+ if (!(Number.isFinite(value) && value >= 0))
717
+ audit.errors.push(shapes);
718
+ return;
719
+ }
720
+ if (Array.isArray(value)) {
721
+ if (value.length !== 3 || value.some((n) => typeof n !== 'number' || !Number.isFinite(n) || n < 0))
722
+ audit.errors.push(shapes);
723
+ return;
724
+ }
725
+ if (!isRecord(value)) {
726
+ audit.errors.push(shapes);
727
+ return;
728
+ }
729
+ reportUnknownKeys(audit, value, ['x', 'y', 'z'], `${what}.pad`);
730
+ for (const axis of ['x', 'y', 'z']) {
731
+ if (value[axis] !== undefined && !face(value[axis])) {
732
+ audit.errors.push(shapes);
733
+ return;
734
+ }
735
+ }
736
+ }
737
+ /**
738
+ * The NESTED probe volumes — a denser lattice over one room, baked into the same artifact. Mirrors the
739
+ * engine's `parseProbeVolumes`: `center` and `size` are REQUIRED (a volume without a box is nothing, and the
740
+ * engine refuses the document), the budget shares the world band, `blendMetres` past half the smallest extent
741
+ * never reaches full weight, and the cells are reported against the measured corner floor.
742
+ */
743
+ function auditProbeVolumes(audit, raw) {
744
+ if (raw === undefined)
745
+ return { count: 0, slices: 0 };
746
+ if (!Array.isArray(raw)) {
747
+ audit.errors.push(`${audit.file}: probes.volumes must be an array of nested probe volumes`);
748
+ return { count: 0, slices: 0 };
749
+ }
750
+ if (raw.length > PROBE_VOLUME_MAX) {
751
+ audit.warnings.push(`${audit.file}: probes.volumes has ${raw.length} volumes, over the cap of ${PROBE_VOLUME_MAX} — the extras are ignored`);
752
+ }
753
+ const entries = raw.slice(0, PROBE_VOLUME_MAX);
754
+ let slices = 0;
755
+ for (const [index, entry] of entries.entries()) {
756
+ const what = `probes.volumes[${index}]`;
757
+ if (!isRecord(entry)) {
758
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
759
+ continue;
760
+ }
761
+ reportUnknownKeys(audit, entry, PROBE_VOLUME_KEYS, what);
762
+ const size = tripleField(audit, entry, 'size', what, true);
763
+ if (entry.center === undefined) {
764
+ audit.errors.push(`${audit.file}: ${what}.center is required — a nested volume is a box somewhere, or it is nothing`);
765
+ }
766
+ else {
767
+ tripleField(audit, entry, 'center', what, false);
768
+ }
769
+ if (entry.size === undefined) {
770
+ audit.errors.push(`${audit.file}: ${what}.size is required — a nested volume is a box of some extent, or it is nothing`);
771
+ }
772
+ const budget = probeBudgetField(audit, entry, what) ?? DEFAULT_PROBE_BUDGET;
773
+ if (entry.blendMetres !== undefined) {
774
+ const blend = nonNegativeField(audit, entry, 'blendMetres', DEFAULT_PROBE_VOLUME_BLEND, what);
775
+ if (size !== null && blend > Math.min(...size) / 2) {
776
+ audit.warnings.push(`${audit.file}: ${what}.blendMetres ${blend} exceeds half the smallest extent (${metres(Math.min(...size) / 2)}) — ` +
777
+ 'the volume never reaches full weight anywhere inside itself');
778
+ }
779
+ }
780
+ padField(audit, entry.pad, what);
781
+ slices += probeAtlasDepth(budget);
782
+ if (size !== null) {
783
+ const cells = budget.map((count, axis) => size[axis] / Math.max(count - 1, 1));
784
+ audit.notes.push(`${audit.file}: ${what} ${budget.join('×')} = ${budget[0] * budget[1] * budget[2]} over ${size.map(metres).join(' × ')} m — ` +
785
+ `cells ${cells.map(metres).join(' × ')} m`);
786
+ if (Math.max(...cells) > NESTED_CELL_CORNER_HINT) {
787
+ audit.notes.push(`${audit.file}: ${what} cells reach ${metres(Math.max(...cells))} m — interior corners hold at ~${NESTED_CELL_CORNER_HINT} m ` +
788
+ 'and under (measured); raise its budget or shrink its box');
789
+ }
790
+ }
791
+ }
792
+ return { count: entries.length, slices };
793
+ }
794
+ /** A volume's override of a post-stack block is SPARSE: an unauthored field keeps the document's value. */
795
+ function auditVolumeBlock(audit, raw, known, numbers, what) {
796
+ if (raw === undefined)
797
+ return;
798
+ if (!isRecord(raw)) {
799
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
800
+ return;
801
+ }
802
+ reportUnknownKeys(audit, raw, known, what);
803
+ for (const key of numbers) {
804
+ if (raw[key] !== undefined)
805
+ nonNegativeField(audit, raw, key, 0, what);
806
+ }
807
+ }
808
+ function auditVolumeExposure(audit, raw, what) {
809
+ if (raw === undefined)
810
+ return;
811
+ if (!isRecord(raw)) {
812
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
813
+ return;
814
+ }
815
+ reportUnknownKeys(audit, raw, EXPOSURE_KEYS, what);
816
+ clampedCompensation(audit, raw, what);
817
+ auditVolumeExposureKeys(audit, raw, what);
818
+ // Sparse, so an unauthored end still comes from the document: the band is only coherence-checked when the
819
+ // volume authors both, and a lone end is judged on its sign alone.
820
+ const min = raw.min === undefined ? null : numberField(audit, raw, 'min', DEFAULT_EXPOSURE.min, what);
821
+ const max = raw.max === undefined ? null : numberField(audit, raw, 'max', DEFAULT_EXPOSURE.max, what);
822
+ if (min !== null && max !== null) {
823
+ auditExposureBand(audit, min, max, what);
824
+ return;
825
+ }
826
+ const lone = min ?? max;
827
+ if (lone !== null && !(lone > 0)) {
828
+ audit.errors.push(`${audit.file}: ${what}.${min !== null ? 'min' : 'max'} must be a positive exposure multiplier`);
829
+ }
830
+ }
831
+ /** The two post-stack exposure knobs a volume may also pull. An explicit `key: null` is AUTHORED here, not
832
+ * absent: it is how a box inside a keyed document hands the hour back to the day/night schedule. */
833
+ function auditVolumeExposureKeys(audit, raw, what) {
834
+ if (raw.key !== undefined)
835
+ clampedNullableField(audit, raw, 'key', what, EXPOSURE_KEY_BAND);
836
+ if (raw.postGain !== undefined)
837
+ clampedField(audit, raw, 'postGain', DEFAULT_EXPOSURE.postGain, what, EXPOSURE_POST_GAIN_BAND);
838
+ }
839
+ function auditVolume(audit, raw, what) {
840
+ if (!isRecord(raw)) {
841
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
842
+ return;
843
+ }
844
+ // The document-level blocks a volume cannot take get their own word, so they are not reported as typos.
845
+ for (const key of VOLUME_EXCLUDED_KEYS) {
846
+ if (raw[key] === undefined)
847
+ continue;
848
+ const why = key === 'grade'
849
+ ? ' — the grade is baked at compile time, so it cannot vary with the camera'
850
+ : TRANSPORT_KEYS.includes(key)
851
+ ? ' — it is a light-transport value that lights the whole world, so it cannot vary with the camera position'
852
+ : '';
853
+ audit.warnings.push(`${audit.file}: ${what}.${key} is not overridable per volume and is ignored${why}; a volume may override ${VOLUME_OVERRIDE_KEYS.join(', ')}`);
854
+ }
855
+ const scoped = Object.fromEntries(Object.entries(raw).filter(([key]) => !VOLUME_EXCLUDED_KEYS.includes(key)));
856
+ reportUnknownKeys(audit, scoped, VOLUME_KEYS, what);
857
+ // The box is the whole point of a volume: without a centre or an extent there is nothing to blend inside of.
858
+ if (raw.center === undefined) {
859
+ audit.errors.push(`${audit.file}: ${what}.center is required — three finite numbers [x, y, z], the box centre`);
860
+ }
861
+ else {
862
+ tripleField(audit, raw, 'center', what, false);
863
+ }
864
+ if (raw.size === undefined) {
865
+ audit.errors.push(`${audit.file}: ${what}.size is required — three finite numbers [x, y, z], the box extent`);
866
+ }
867
+ else {
868
+ tripleField(audit, raw, 'size', what, true);
869
+ }
870
+ nonNegativeField(audit, raw, 'blendMetres', DEFAULT_VOLUME_BLEND_METRES, what);
871
+ auditVolumeExposure(audit, raw.exposure, `${what}.exposure`);
872
+ auditVolumeBlock(audit, raw.bloom, BLOOM_KEYS, BLOOM_KEYS, `${what}.bloom`);
873
+ auditVolumeBlock(audit, raw.fog, FOG_KEYS, VOLUME_FOG_KEYS, `${what}.fog`);
874
+ if (isRecord(raw.fog) && raw.fog.enabled !== undefined) {
875
+ audit.warnings.push(`${audit.file}: ${what}.fog.enabled is not overridable per volume and is ignored — fade a volume's fog by blending fog.density toward 0`);
876
+ }
877
+ auditVolumeBlock(audit, raw.ao, AO_KEYS, AO_KEYS, `${what}.ao`);
878
+ }
879
+ /**
880
+ * The post-processing volumes: camera-position-driven local overrides of the document's own look blocks. Weight
881
+ * is 1 inside the box and ramps to 0 over `blendMetres` OUTWARD from its surface, and the volumes compose in
882
+ * ARRAY ORDER — effective = lerp(effective, volumeValue, weight) per authored field, starting from the document.
883
+ */
884
+ function auditVolumes(audit, raw) {
885
+ if (raw === undefined)
886
+ return null;
887
+ if (!Array.isArray(raw)) {
888
+ audit.errors.push(`${audit.file}: volumes must be an array of post-processing volumes`);
889
+ return 'volumes ?';
890
+ }
891
+ raw.forEach((entry, index) => auditVolume(audit, entry, `volumes[${index}]`));
892
+ return `${raw.length} volumes`;
893
+ }
894
+ function auditPracticals(audit, raw) {
895
+ if (raw === undefined)
896
+ return '0 practicals';
897
+ if (!Array.isArray(raw)) {
898
+ audit.errors.push(`${audit.file}: practicals must be an array`);
899
+ return '? practicals';
900
+ }
901
+ raw.forEach((entry, index) => {
902
+ if (!isRecord(entry))
903
+ audit.errors.push(`${audit.file}: practicals[${index}] must be an object`);
904
+ });
905
+ if (raw.length) {
906
+ // The engine carries practicals verbatim: the practicals/night rig has not moved into the package yet.
907
+ audit.warnings.push(`${audit.file}: ${raw.length} practical(s) are carried verbatim — nothing in the visual runtime reads them yet`);
908
+ }
909
+ return `${raw.length} practicals`;
910
+ }
911
+ /**
912
+ * The bake step's artifact pointer. ABSENT IS NOT AN ERROR HERE, exactly as it is not in the engine parser: the
913
+ * bake writes the block into this same document later, and refusing an un-baked `mode: "baked"` world would make
914
+ * it unopenable by the very tool that has to bake it. A pointer that IS there is checked on the spot — but the
915
+ * runtime only READS it on a `baked` world (it throws there rather than fall back to the zero-bake look), so on
916
+ * any other mode a malformed block is something the engine tolerates: a WARNING, per the mirror rule.
917
+ */
918
+ function auditBakedLightingPointer(audit, raw, severe) {
919
+ if (raw === undefined || raw === null)
920
+ return null;
921
+ const sink = severe ? audit.errors : audit.warnings;
922
+ if (!isRecord(raw)) {
923
+ sink.push(`${audit.file}: bakedLighting must be an object`);
924
+ return null;
925
+ }
926
+ const version = raw.version;
927
+ const artifact = raw.artifact;
928
+ let valid = true;
929
+ if (typeof version !== 'number' || version !== exports.BAKED_LIGHTING_VERSION) {
930
+ sink.push(`${audit.file}: bakedLighting.version must be ${exports.BAKED_LIGHTING_VERSION} (got ${JSON.stringify(version)})`);
931
+ valid = false;
932
+ }
933
+ if (typeof artifact !== 'string' || artifact.trim() === '') {
934
+ sink.push(`${audit.file}: bakedLighting.artifact must be a non-empty string — the baked field, relative to the world root`);
935
+ valid = false;
936
+ }
937
+ // The key receipt is the bake's, and a pointer written before it existed carries none — absent is not a fault.
938
+ const rawKeys = raw.keys;
939
+ let keys = null;
940
+ if (rawKeys !== undefined && rawKeys !== null) {
941
+ if (typeof rawKeys !== 'number' || !Number.isInteger(rawKeys) || rawKeys < 1) {
942
+ sink.push(`${audit.file}: bakedLighting.keys must be a positive integer — the sun keys the artifact carries (got ${JSON.stringify(rawKeys)})`);
943
+ valid = false;
944
+ }
945
+ else {
946
+ keys = rawKeys;
947
+ }
948
+ }
949
+ return valid ? { version: version, artifact: artifact, keys } : null;
950
+ }
951
+ /**
952
+ * The bake's key receipt against the world's own sun. ONE key is the STATIC plan and plays back clamped onto its
953
+ * only key at every hour, so under a moving sun the indirect light is pinned to the baked hour while the sky goes
954
+ * on turning — the runtime says so at boot, and this says so at publish, where it can still be re-baked.
955
+ */
956
+ function auditBakedKeys(audit, pointer, cycleSeconds) {
957
+ const keys = pointer?.keys ?? null;
958
+ if (keys === null)
959
+ return;
960
+ if (keys === 1 && cycleSeconds > 0) {
961
+ audit.errors.push(`${audit.file}: the artifact carries ONE sun key and this world's sun cycles (timeOfDay.cycleSeconds ${cycleSeconds}) — the ` +
962
+ 'indirect light stays pinned to the baked hour while the sky moves; re-bake with `helix bake-lighting --keys N`');
963
+ }
964
+ else if (keys > 1 && cycleSeconds === 0) {
965
+ audit.notes.push(`${audit.file}: the artifact carries ${keys} sun keys and this world's sun is static — a static sun needs one key; ` +
966
+ `re-bake for a ~${keys}× smaller artifact`);
967
+ }
968
+ }
969
+ /**
970
+ * Audits a parsed `helix.visuals.json` document against the v1 rules the engine's parser enforces. `file` is
971
+ * the path the messages name, so the creator is told which copy is wrong when both source and bundle carry one.
972
+ */
973
+ function auditVisualsConfig(raw, file = exports.VISUALS_CONFIG_FILE) {
974
+ const audit = { errors: [], warnings: [], notes: [], file };
975
+ // The parser answers a null/absent document with the scaffold default, so a `null` file boots — but nobody
976
+ // means it, and the world then renders the default look rather than the one the file was meant to declare.
977
+ if (raw === null) {
978
+ return {
979
+ errors: [],
980
+ warnings: [`${file}: the document is null — the runtime falls back to the scaffold default (dynamic, static noon sun)`],
981
+ notes: [],
982
+ summary: `${file}: null · the scaffold default (dynamic, sun ${DEFAULT_HOURS}h, grade ${DEFAULT_LOOK})`,
983
+ cycleSeconds: 0,
984
+ mode: DEFAULT_MODE,
985
+ bakedLighting: null,
986
+ hasBakedLighting: false,
987
+ };
988
+ }
989
+ if (!isRecord(raw)) {
990
+ return {
991
+ errors: [`${file}: the document must be an object`],
992
+ warnings: [],
993
+ notes: [],
994
+ summary: null,
995
+ cycleSeconds: 0,
996
+ mode: null,
997
+ bakedLighting: null,
998
+ hasBakedLighting: false,
999
+ };
1000
+ }
1001
+ const version = raw.version;
1002
+ if (typeof version !== 'number' || version !== exports.VISUALS_CONFIG_VERSION) {
1003
+ audit.errors.push(`${file}: version must be ${exports.VISUALS_CONFIG_VERSION} (got ${JSON.stringify(version)})`);
1004
+ }
1005
+ const mode = raw.mode;
1006
+ let declaredMode = null;
1007
+ if (typeof mode !== 'string' || !exports.VISUALS_MODES.includes(mode)) {
1008
+ audit.errors.push(`${file}: mode must be one of ${exports.VISUALS_MODES.join(' | ')} (got ${JSON.stringify(mode)})`);
1009
+ }
1010
+ else {
1011
+ declaredMode = mode;
1012
+ }
1013
+ // What `mode: "baked"` POINTS AT is only half-checkable from the document: the pointer's shape is judged here,
1014
+ // whether it resolves to a shipped artifact by the bundle rule in bundle.ts.
1015
+ const bakedLighting = auditBakedLightingPointer(audit, raw.bakedLighting, declaredMode === 'baked');
1016
+ const timeOfDay = auditTimeOfDay(audit, raw.timeOfDay);
1017
+ auditWeather(audit, raw.weather, declaredMode);
1018
+ auditOcean(audit, raw.ocean, declaredMode);
1019
+ if (declaredMode === 'baked')
1020
+ auditBakedKeys(audit, bakedLighting, timeOfDay.cycleSeconds);
1021
+ // The transport blocks sit beside the sun's own segment in the line: they are what the world is LIT with,
1022
+ // where the grade and the post stack below are what the frame is then developed with.
1023
+ const transport = [
1024
+ ['sun', auditSun(audit, raw.sun)],
1025
+ ['sky', auditSky(audit, raw.sky)],
1026
+ ['environment', auditEnvironment(audit, raw.environment)],
1027
+ ['shadows', auditShadows(audit, raw.shadows)],
1028
+ ];
1029
+ const transportBlocks = transport
1030
+ .map(([, block]) => block.fragment)
1031
+ .filter((fragment) => fragment !== null);
1032
+ // The probe block is transport too, but its fragment belongs with the boxes further down the line, so it is
1033
+ // audited here — in the transport pass whose re-bake warning it joins — and placed there.
1034
+ const probes = auditProbes(audit, raw.probes);
1035
+ // LIVE nested volumes need a PINNED volume: the engine serves them on a dynamic world only with an authored
1036
+ // probes.center (the sampler reads every volume's box from a directory written once, which a camera-following
1037
+ // volume would strand on its first crossing). Mirrors the engine parser's warning, message for message.
1038
+ if (declaredMode === 'dynamic' && isRecord(raw.probes) && raw.probes.center === undefined
1039
+ && Array.isArray(raw.probes.volumes) && raw.probes.volumes.length > 0) {
1040
+ audit.warnings.push(`${file}: probes.volumes on a dynamic world without probes.center — nested volumes need a PINNED volume` +
1041
+ ' (author probes.center + probes.size), so they will not serve in this world as authored');
1042
+ }
1043
+ // A transport value is captured INTO the field at bake time, so on a baked world an edit here is inert until
1044
+ // the next bake — the one way a valid document still renders something other than what it says.
1045
+ const retuned = [...transport.filter(([, block]) => block.retuned).map(([name]) => name), ...(probes.retuned ? ['probes'] : [])];
1046
+ if (retuned.length && declaredMode === 'baked') {
1047
+ audit.warnings.push(`${file}: ${retuned.join(', ')} — light transport, captured INTO the field on a mode "baked" world — so the shipped ` +
1048
+ 'field still holds what it was baked with; re-run `helix bake-lighting` for a change here to take effect');
1049
+ }
1050
+ const grade = auditGrade(audit, raw.grade);
1051
+ // The authored post-stack blocks, the bake volume and the post-processing volumes appear in the summary only
1052
+ // when the document carries them.
1053
+ const optionalBlocks = [
1054
+ auditExposure(audit, raw.exposure),
1055
+ auditBloom(audit, raw.bloom),
1056
+ auditFog(audit, raw.fog),
1057
+ auditAo(audit, raw.ao),
1058
+ probes.fragment,
1059
+ auditVolumes(audit, raw.volumes),
1060
+ ].filter((fragment) => fragment !== null);
1061
+ const practicals = auditPracticals(audit, raw.practicals);
1062
+ // Unknown TOP-LEVEL keys are carried on purpose (the bake artifact pointer rides here, and an older runtime
1063
+ // must still boot a newer document) — so they are never an error, and only a near-miss of a claimed key is
1064
+ // worth a word.
1065
+ const carried = Object.keys(raw).filter((key) => !CLAIMED_KEYS.includes(key));
1066
+ for (const key of carried) {
1067
+ const suggestion = didYouMean(key, CLAIMED_KEYS);
1068
+ if (suggestion) {
1069
+ audit.warnings.push(`${file}: "${key}" is carried verbatim, not read — did you mean "${suggestion}"?`);
1070
+ }
1071
+ }
1072
+ const summary = audit.errors.length
1073
+ ? null
1074
+ : `${file}: v${exports.VISUALS_CONFIG_VERSION} ${String(mode)} · ${timeOfDay.fragment}` +
1075
+ (transportBlocks.length ? ` · ${transportBlocks.join(' · ')}` : '') +
1076
+ ` · ${grade}` +
1077
+ (optionalBlocks.length ? ` · ${optionalBlocks.join(' · ')}` : '') +
1078
+ ` · ${practicals}` +
1079
+ (carried.length ? ` · carries ${carried.join(', ')}` : '');
1080
+ return {
1081
+ errors: audit.errors,
1082
+ warnings: audit.warnings,
1083
+ notes: audit.notes,
1084
+ summary,
1085
+ cycleSeconds: timeOfDay.cycleSeconds,
1086
+ mode: declaredMode,
1087
+ bakedLighting,
1088
+ hasBakedLighting: raw.bakedLighting !== undefined && raw.bakedLighting !== null,
1089
+ };
1090
+ }
1091
+ /** The same audit over the document's TEXT — unparseable JSON is an error here, as it is a throw at boot. */
1092
+ function auditVisualsConfigText(text, file = exports.VISUALS_CONFIG_FILE) {
1093
+ let parsed;
1094
+ try {
1095
+ parsed = JSON.parse(text);
1096
+ }
1097
+ catch (err) {
1098
+ return {
1099
+ errors: [`${file} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`],
1100
+ warnings: [],
1101
+ notes: [],
1102
+ summary: null,
1103
+ cycleSeconds: 0,
1104
+ mode: null,
1105
+ bakedLighting: null,
1106
+ hasBakedLighting: false,
1107
+ };
1108
+ }
1109
+ return auditVisualsConfig(parsed, file);
1110
+ }
1111
+ const isFiniteTriple = (value) => Array.isArray(value) && value.length === 3 && value.every((n) => typeof n === 'number' && Number.isFinite(n));
1112
+ const isCountTriple = (value) => Array.isArray(value) && value.length === 3 && value.every((n) => typeof n === 'number' && Number.isInteger(n) && n > 0);
1113
+ const isBase64Payload = (value) => typeof value === 'string' && value !== '';
1114
+ function positiveInteger(audit, value, what) {
1115
+ if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
1116
+ audit.errors.push(`${audit.file}: ${what} must be a positive integer (got ${JSON.stringify(value)})`);
1117
+ return null;
1118
+ }
1119
+ return value;
1120
+ }
1121
+ function auditArtifactKeys(audit, raw) {
1122
+ if (!Array.isArray(raw)) {
1123
+ audit.errors.push(`${audit.file}: keys must be an array of keyframes`);
1124
+ return 0;
1125
+ }
1126
+ if (raw.length === 0) {
1127
+ audit.errors.push(`${audit.file}: keys is empty — a store with no keyframes plays a black field`);
1128
+ return 0;
1129
+ }
1130
+ // One bad key is enough: a store this shape came out of one export, and it fails identically on every key.
1131
+ for (let index = 0; index < raw.length; index += 1) {
1132
+ const before = audit.errors.length;
1133
+ const key = raw[index];
1134
+ if (!isRecord(key)) {
1135
+ audit.errors.push(`${audit.file}: keys[${index}] must be an object`);
1136
+ }
1137
+ else {
1138
+ if (typeof key.hours !== 'number' || !Number.isFinite(key.hours)) {
1139
+ audit.errors.push(`${audit.file}: keys[${index}].hours must be a finite number — the sun time this key was baked at`);
1140
+ }
1141
+ if (!isBase64Payload(key.sh)) {
1142
+ audit.errors.push(`${audit.file}: keys[${index}].sh must be a non-empty base64 string — the key's SH coefficients`);
1143
+ }
1144
+ }
1145
+ if (audit.errors.length > before)
1146
+ break;
1147
+ }
1148
+ return raw.length;
1149
+ }
1150
+ /** The metadata shape shared by the legacy top-level `volume` and each volume-list entry: the box triples and
1151
+ * the probes lattice. Returns the lattice count and label, or null when the shape is unusable. */
1152
+ function auditVolumeMetadataShape(audit, raw, what) {
1153
+ if (!isRecord(raw)) {
1154
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
1155
+ return null;
1156
+ }
1157
+ for (const key of ['size', 'center']) {
1158
+ if (!isFiniteTriple(raw[key]))
1159
+ audit.errors.push(`${audit.file}: ${what}.${key} must be three finite numbers [x, y, z]`);
1160
+ }
1161
+ if (!isCountTriple(raw.probes)) {
1162
+ audit.errors.push(`${audit.file}: ${what}.probes must be three positive integers [x, y, z]`);
1163
+ return null;
1164
+ }
1165
+ const [px, py, pz] = raw.probes;
1166
+ return { count: px * py * pz, lattice: `${px}x${py}x${pz}` };
1167
+ }
1168
+ /** The box the field was baked in — the LEGACY single-volume shape. MANDATORY: without it the runtime has no
1169
+ * grid to rebuild and refuses to boot. */
1170
+ function auditArtifactVolume(audit, raw, probeCount) {
1171
+ if (raw === undefined || raw === null) {
1172
+ audit.errors.push(`${audit.file}: no \`volume\` block — the runtime has no box to rebuild the probe grid in and throws at boot; re-export the bake`);
1173
+ return '?';
1174
+ }
1175
+ const metadata = auditVolumeMetadataShape(audit, raw, 'volume');
1176
+ if (metadata === null)
1177
+ return '?';
1178
+ if (probeCount !== null && metadata.count !== probeCount) {
1179
+ audit.errors.push(`${audit.file}: volume ${metadata.lattice} holds ${metadata.count} probes, not the ${probeCount} its field carries`);
1180
+ }
1181
+ return metadata.lattice;
1182
+ }
1183
+ /**
1184
+ * The MULTI-VOLUME artifact shape — `volumes`, world volume first — which `helix bake-lighting` writes for a
1185
+ * world authoring nested probe volumes. Mirrors the engine reader exactly: `store.volume` is
1186
+ * `volumes[0].volume`, so entry 0 must carry one or the runtime has no box and throws at boot; and playback
1187
+ * refuses a field whose volumes declare a different probe total than it carries. A volume-less LATER entry is
1188
+ * legal (a geometry-only slot spans the rest), so the total is only judged when every entry declared a lattice.
1189
+ */
1190
+ function auditArtifactVolumeList(audit, raw, probeCount) {
1191
+ if (!Array.isArray(raw) || raw.length === 0) {
1192
+ audit.errors.push(`${audit.file}: volumes must be a non-empty array — the field's volume list, world volume first`);
1193
+ return { volume: '?', geometry: false };
1194
+ }
1195
+ let declared = 0;
1196
+ let allPlaced = true;
1197
+ let world = '?';
1198
+ let worldGeometry = false;
1199
+ raw.forEach((entry, index) => {
1200
+ const what = `volumes[${index}]`;
1201
+ if (!isRecord(entry)) {
1202
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
1203
+ allPlaced = false;
1204
+ return;
1205
+ }
1206
+ if (typeof entry.firstProbe !== 'number' || !Number.isInteger(entry.firstProbe) || entry.firstProbe < 0) {
1207
+ audit.errors.push(`${audit.file}: ${what}.firstProbe must be a non-negative integer — where this volume's span starts in every key`);
1208
+ }
1209
+ if (entry.volume === undefined || entry.volume === null) {
1210
+ if (index === 0) {
1211
+ audit.errors.push(`${audit.file}: volumes[0] carries no \`volume\` block — the world volume is the box the runtime rebuilds the probe grid in, ` +
1212
+ 'and it throws at boot without one; re-export the bake');
1213
+ }
1214
+ allPlaced = false;
1215
+ }
1216
+ else {
1217
+ const metadata = auditVolumeMetadataShape(audit, entry.volume, `${what}.volume`);
1218
+ if (metadata === null)
1219
+ allPlaced = false;
1220
+ else {
1221
+ declared += metadata.count;
1222
+ if (index === 0)
1223
+ world = metadata.lattice;
1224
+ }
1225
+ }
1226
+ // Geometry rides PER VOLUME in this shape. Entry 0's absence is the same SH-only warning the legacy shape
1227
+ // gets; a nested volume without one plays SH-only for its own room, which the runtime notes at boot.
1228
+ if (entry.geometry === undefined || entry.geometry === null) {
1229
+ if (index === 0) {
1230
+ audit.warnings.push(`${audit.file}: volumes[0] has no \`geometry\` block — this is an SH-only field, so DDGI visibility is OFF for this world ` +
1231
+ '(indirect light leaks through walls and the runtime warns at boot); re-export the bake with the geometry half');
1232
+ }
1233
+ else {
1234
+ audit.notes.push(`${audit.file}: ${what} has no \`geometry\` block — that nested volume ships SH only`);
1235
+ }
1236
+ }
1237
+ else {
1238
+ const ok = auditArtifactGeometry(audit, entry.geometry, `${what}.geometry`);
1239
+ if (index === 0)
1240
+ worldGeometry = ok;
1241
+ }
1242
+ });
1243
+ if (probeCount !== null && allPlaced && declared !== probeCount) {
1244
+ audit.errors.push(`${audit.file}: the ${raw.length} volume(s) hold ${declared} probes, not the ${probeCount} the field carries`);
1245
+ }
1246
+ const nested = raw.length - 1;
1247
+ return { volume: nested > 0 ? `${world} + ${nested} nested` : world, geometry: worldGeometry };
1248
+ }
1249
+ /** The sun-independent half — depth tiles, params row, cell mask. Optional, and its absence costs visibility.
1250
+ * `what` relabels the messages for a volume-list entry's own block; the default keeps the legacy wording. */
1251
+ function auditArtifactGeometry(audit, raw, what = 'geometry') {
1252
+ if (raw === undefined || raw === null) {
1253
+ audit.warnings.push(`${audit.file}: no \`geometry\` block — this is an SH-only field, so DDGI visibility is OFF for this world ` +
1254
+ '(indirect light leaks through walls and the runtime warns at boot); re-export the bake with the geometry half');
1255
+ return false;
1256
+ }
1257
+ if (!isRecord(raw)) {
1258
+ audit.errors.push(`${audit.file}: ${what} must be an object`);
1259
+ return false;
1260
+ }
1261
+ positiveInteger(audit, raw.octPadded, `${what}.octPadded`);
1262
+ positiveInteger(audit, raw.paramTexels, `${what}.paramTexels`);
1263
+ if (!isCountTriple(raw.maskCells))
1264
+ audit.errors.push(`${audit.file}: ${what}.maskCells must be three positive integers [x, y, z]`);
1265
+ for (const key of ['depth', 'params', 'mask']) {
1266
+ if (!isBase64Payload(raw[key]))
1267
+ audit.errors.push(`${audit.file}: ${what}.${key} must be a non-empty base64 string`);
1268
+ }
1269
+ return true;
1270
+ }
1271
+ /**
1272
+ * Audits the artifact a `mode: "baked"` world points at — the engine's `ProbeKeyframeStore` JSON. SHAPE AND
1273
+ * COUNTS ONLY: the base64 float payloads are never decoded, so `validate` stays a read of the header rather
1274
+ * than a megabyte of atob per world. What the engine throws on decoding them (array lengths against the
1275
+ * declared dimensions) is therefore NOT mirrored — the counts that can be checked cheaply are.
1276
+ */
1277
+ function auditBakedArtifact(raw, file, options = {}) {
1278
+ const audit = { errors: [], warnings: [], notes: [], file };
1279
+ if (!isRecord(raw)) {
1280
+ return {
1281
+ errors: [`${file}: the baked lighting artifact must be an object — a probe keyframe store`],
1282
+ warnings: [],
1283
+ notes: [],
1284
+ summary: null,
1285
+ };
1286
+ }
1287
+ const probeCount = positiveInteger(audit, raw.probeCount, 'probeCount');
1288
+ const keys = auditArtifactKeys(audit, raw.keys);
1289
+ // The document's own receipt is judged in `auditBakedKeys`; this is the same rule read off the FIELD, which is
1290
+ // the copy that cannot be stale — a one-key store plays back clamped onto its only key at every hour.
1291
+ if (keys === 1 && (options.cycleSeconds ?? 0) > 0) {
1292
+ audit.errors.push(`${file}: this field carries ONE sun key but this world's sun CYCLES — the indirect light is pinned to the baked hour ` +
1293
+ 'while the sky moves; re-bake with `helix bake-lighting --keys N`');
1294
+ }
1295
+ // `undefined` is NOT `null` here: the loader hands anything but null straight to atob, so a store missing the
1296
+ // field throws where an SH-only one nulls it.
1297
+ if (raw.practicals !== null && typeof raw.practicals !== 'string') {
1298
+ audit.errors.push(`${file}: practicals must be a base64 string or null — the field's night term`);
1299
+ }
1300
+ // TWO shapes, same precedence as the engine reader: a `volumes` LIST (world volume first — what
1301
+ // `helix bake-lighting` writes for a world authoring nested probe volumes) wins over the legacy bare
1302
+ // `volume` + `geometry` pair every pre-nested artifact carries.
1303
+ let volume;
1304
+ let geometry;
1305
+ if (raw.volumes !== undefined) {
1306
+ ({ volume, geometry } = auditArtifactVolumeList(audit, raw.volumes, probeCount));
1307
+ }
1308
+ else {
1309
+ volume = auditArtifactVolume(audit, raw.volume, probeCount);
1310
+ geometry = auditArtifactGeometry(audit, raw.geometry);
1311
+ }
1312
+ const summary = audit.errors.length
1313
+ ? null
1314
+ : `${file}: baked field · ${probeCount} probes · ${keys} keys · volume ${volume}${geometry ? ' · geometry' : ' · SH only'}`;
1315
+ return { errors: audit.errors, warnings: audit.warnings, notes: audit.notes, summary };
1316
+ }
1317
+ /** The same audit over the artifact's TEXT — unparseable JSON is an error, as it is a throw at boot. */
1318
+ function auditBakedArtifactText(text, file, options = {}) {
1319
+ let parsed;
1320
+ try {
1321
+ parsed = JSON.parse(text);
1322
+ }
1323
+ catch (err) {
1324
+ return {
1325
+ errors: [`${file} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`],
1326
+ warnings: [],
1327
+ notes: [],
1328
+ summary: null,
1329
+ };
1330
+ }
1331
+ return auditBakedArtifact(parsed, file, options);
1332
+ }
1333
+ //# sourceMappingURL=visualsConfig.js.map