@aura3d/engine 4.0.7 → 4.1.0

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 (314) hide show
  1. package/dist/audio/index.d.ts +1 -0
  2. package/dist/audio/index.d.ts.map +1 -1
  3. package/dist/audio/index.js +1 -0
  4. package/dist/audio/index.js.map +1 -1
  5. package/dist/audio/synth/SampleSlices.d.ts +88 -0
  6. package/dist/audio/synth/SampleSlices.d.ts.map +1 -0
  7. package/dist/audio/synth/SampleSlices.js +185 -0
  8. package/dist/audio/synth/SampleSlices.js.map +1 -0
  9. package/dist/audio/synth/SynthCueBank.d.ts +102 -0
  10. package/dist/audio/synth/SynthCueBank.d.ts.map +1 -0
  11. package/dist/audio/synth/SynthCueBank.js +323 -0
  12. package/dist/audio/synth/SynthCueBank.js.map +1 -0
  13. package/dist/audio/synth/SynthLoops.d.ts +77 -0
  14. package/dist/audio/synth/SynthLoops.d.ts.map +1 -0
  15. package/dist/audio/synth/SynthLoops.js +147 -0
  16. package/dist/audio/synth/SynthLoops.js.map +1 -0
  17. package/dist/audio/synth/index.d.ts +9 -0
  18. package/dist/audio/synth/index.d.ts.map +1 -0
  19. package/dist/audio/synth/index.js +5 -0
  20. package/dist/audio/synth/index.js.map +1 -0
  21. package/dist/audio/synth/notes.d.ts +18 -0
  22. package/dist/audio/synth/notes.d.ts.map +1 -0
  23. package/dist/audio/synth/notes.js +35 -0
  24. package/dist/audio/synth/notes.js.map +1 -0
  25. package/dist/audio/synth/types.d.ts +84 -0
  26. package/dist/audio/synth/types.d.ts.map +1 -0
  27. package/dist/audio/synth/types.js +2 -0
  28. package/dist/audio/synth/types.js.map +1 -0
  29. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  30. package/dist/aura3d-cli/cli-help.js +6 -0
  31. package/dist/aura3d-cli/cli-help.js.map +1 -1
  32. package/dist/aura3d-cli/cli.js +33 -0
  33. package/dist/aura3d-cli/cli.js.map +1 -1
  34. package/dist/aura3d-cli/commands/assets/gltfToolkit.d.ts +25 -0
  35. package/dist/aura3d-cli/commands/assets/gltfToolkit.d.ts.map +1 -0
  36. package/dist/aura3d-cli/commands/assets/gltfToolkit.js +59 -0
  37. package/dist/aura3d-cli/commands/assets/gltfToolkit.js.map +1 -0
  38. package/dist/aura3d-cli/commands/assets/importMeshy.d.ts +50 -0
  39. package/dist/aura3d-cli/commands/assets/importMeshy.d.ts.map +1 -0
  40. package/dist/aura3d-cli/commands/assets/importMeshy.js +112 -0
  41. package/dist/aura3d-cli/commands/assets/importMeshy.js.map +1 -0
  42. package/dist/aura3d-cli/commands/assets/index.d.ts +6 -0
  43. package/dist/aura3d-cli/commands/assets/index.d.ts.map +1 -0
  44. package/dist/aura3d-cli/commands/assets/index.js +54 -0
  45. package/dist/aura3d-cli/commands/assets/index.js.map +1 -0
  46. package/dist/aura3d-cli/commands/assets/mergeClips.d.ts +44 -0
  47. package/dist/aura3d-cli/commands/assets/mergeClips.d.ts.map +1 -0
  48. package/dist/aura3d-cli/commands/assets/mergeClips.js +103 -0
  49. package/dist/aura3d-cli/commands/assets/mergeClips.js.map +1 -0
  50. package/dist/aura3d-cli/commands/assets/optimize.d.ts +54 -0
  51. package/dist/aura3d-cli/commands/assets/optimize.d.ts.map +1 -0
  52. package/dist/aura3d-cli/commands/assets/optimize.js +76 -0
  53. package/dist/aura3d-cli/commands/assets/optimize.js.map +1 -0
  54. package/dist/aura3d-cli/commands/assets/optimizeVerb.d.ts +9 -0
  55. package/dist/aura3d-cli/commands/assets/optimizeVerb.d.ts.map +1 -0
  56. package/dist/aura3d-cli/commands/assets/optimizeVerb.js +40 -0
  57. package/dist/aura3d-cli/commands/assets/optimizeVerb.js.map +1 -0
  58. package/dist/aura3d-cli/commands/meshyLedger.d.ts +103 -0
  59. package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -0
  60. package/dist/aura3d-cli/commands/meshyLedger.js +308 -0
  61. package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -0
  62. package/dist/aura3d-cli/commands/prd05/index.d.ts.map +1 -1
  63. package/dist/aura3d-cli/commands/prd05/index.js +8 -2
  64. package/dist/aura3d-cli/commands/prd05/index.js.map +1 -1
  65. package/dist/aura3d-cli/commands/registry.d.ts +1 -0
  66. package/dist/aura3d-cli/commands/registry.d.ts.map +1 -1
  67. package/dist/aura3d-cli/commands/registry.js +1 -0
  68. package/dist/aura3d-cli/commands/registry.js.map +1 -1
  69. package/dist/create-aura3d/index.js +1 -1
  70. package/dist/debug/index.d.ts +2 -0
  71. package/dist/debug/index.d.ts.map +1 -1
  72. package/dist/debug/index.js +1 -0
  73. package/dist/debug/index.js.map +1 -1
  74. package/dist/debug/safety/blackFrame.d.ts +45 -0
  75. package/dist/debug/safety/blackFrame.d.ts.map +1 -0
  76. package/dist/debug/safety/blackFrame.js +109 -0
  77. package/dist/debug/safety/blackFrame.js.map +1 -0
  78. package/dist/debug/safety/diagnosticsPanel.d.ts +53 -0
  79. package/dist/debug/safety/diagnosticsPanel.d.ts.map +1 -0
  80. package/dist/debug/safety/diagnosticsPanel.js +117 -0
  81. package/dist/debug/safety/diagnosticsPanel.js.map +1 -0
  82. package/dist/debug/safety/index.d.ts +47 -0
  83. package/dist/debug/safety/index.d.ts.map +1 -0
  84. package/dist/debug/safety/index.js +61 -0
  85. package/dist/debug/safety/index.js.map +1 -0
  86. package/dist/debug/safety/switches.d.ts +27 -0
  87. package/dist/debug/safety/switches.d.ts.map +1 -0
  88. package/dist/debug/safety/switches.js +23 -0
  89. package/dist/debug/safety/switches.js.map +1 -0
  90. package/dist/engine/agent-api/app/runtimeNodes.d.ts.map +1 -1
  91. package/dist/engine/agent-api/app/runtimeNodes.js +15 -0
  92. package/dist/engine/agent-api/app/runtimeNodes.js.map +1 -1
  93. package/dist/engine/agent-api/assets/productionModels.d.ts +58 -0
  94. package/dist/engine/agent-api/assets/productionModels.d.ts.map +1 -0
  95. package/dist/engine/agent-api/assets/productionModels.js +103 -0
  96. package/dist/engine/agent-api/assets/productionModels.js.map +1 -0
  97. package/dist/engine/agent-api/compiler/customMaterial.d.ts +7 -0
  98. package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
  99. package/dist/engine/agent-api/compiler/customMaterial.js +20 -3
  100. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  101. package/dist/engine/agent-api/compiler/errors.d.ts +1 -1
  102. package/dist/engine/agent-api/compiler/errors.d.ts.map +1 -1
  103. package/dist/engine/agent-api/compiler/errors.js.map +1 -1
  104. package/dist/engine/agent-api/compiler/lines.d.ts.map +1 -1
  105. package/dist/engine/agent-api/compiler/lines.js +10 -1
  106. package/dist/engine/agent-api/compiler/lines.js.map +1 -1
  107. package/dist/engine/agent-api/compiler/renderInput.d.ts.map +1 -1
  108. package/dist/engine/agent-api/compiler/renderInput.js +12 -3
  109. package/dist/engine/agent-api/compiler/renderInput.js.map +1 -1
  110. package/dist/engine/agent-api/game-kits/ballFlight.d.ts +145 -0
  111. package/dist/engine/agent-api/game-kits/ballFlight.d.ts.map +1 -0
  112. package/dist/engine/agent-api/game-kits/ballFlight.js +308 -0
  113. package/dist/engine/agent-api/game-kits/ballFlight.js.map +1 -0
  114. package/dist/engine/agent-api/game-kits/index.d.ts +9 -5
  115. package/dist/engine/agent-api/game-kits/index.d.ts.map +1 -1
  116. package/dist/engine/agent-api/game-kits/index.js +1 -0
  117. package/dist/engine/agent-api/game-kits/index.js.map +1 -1
  118. package/dist/engine/agent-api/game-kits/racketAthleteRig.d.ts +107 -0
  119. package/dist/engine/agent-api/game-kits/racketAthleteRig.d.ts.map +1 -0
  120. package/dist/engine/agent-api/game-kits/racketAthleteRig.js +178 -0
  121. package/dist/engine/agent-api/game-kits/racketAthleteRig.js.map +1 -0
  122. package/dist/engine/agent-api/game-kits/racketGeometry.d.ts +8 -0
  123. package/dist/engine/agent-api/game-kits/racketGeometry.d.ts.map +1 -0
  124. package/dist/engine/agent-api/game-kits/racketGeometry.js +73 -0
  125. package/dist/engine/agent-api/game-kits/racketGeometry.js.map +1 -0
  126. package/dist/engine/agent-api/game-kits/racketScoring.d.ts +53 -0
  127. package/dist/engine/agent-api/game-kits/racketScoring.d.ts.map +1 -0
  128. package/dist/engine/agent-api/game-kits/racketScoring.js +69 -0
  129. package/dist/engine/agent-api/game-kits/racketScoring.js.map +1 -0
  130. package/dist/engine/agent-api/game-kits/racketSports.d.ts +20 -6
  131. package/dist/engine/agent-api/game-kits/racketSports.d.ts.map +1 -1
  132. package/dist/engine/agent-api/game-kits/racketSports.js +15 -74
  133. package/dist/engine/agent-api/game-kits/racketSports.js.map +1 -1
  134. package/dist/engine/agent-api/index.d.ts +7 -0
  135. package/dist/engine/agent-api/index.d.ts.map +1 -1
  136. package/dist/engine/agent-api/index.js +5 -0
  137. package/dist/engine/agent-api/index.js.map +1 -1
  138. package/dist/engine/agent-api/nodes/batched.d.ts.map +1 -1
  139. package/dist/engine/agent-api/nodes/batched.js +63 -3
  140. package/dist/engine/agent-api/nodes/batched.js.map +1 -1
  141. package/dist/engine/agent-api/nodes/batchedState.d.ts +5 -0
  142. package/dist/engine/agent-api/nodes/batchedState.d.ts.map +1 -1
  143. package/dist/engine/agent-api/nodes/batchedState.js +10 -0
  144. package/dist/engine/agent-api/nodes/batchedState.js.map +1 -1
  145. package/dist/engine/agent-api/nodes/instances.js +1 -2
  146. package/dist/engine/agent-api/nodes/instances.js.map +1 -1
  147. package/dist/engine/agent-api/nodes/lines.d.ts.map +1 -1
  148. package/dist/engine/agent-api/nodes/lines.js +2 -1
  149. package/dist/engine/agent-api/nodes/lines.js.map +1 -1
  150. package/dist/engine/agent-api/nodes/mergeStatic.d.ts +26 -0
  151. package/dist/engine/agent-api/nodes/mergeStatic.d.ts.map +1 -0
  152. package/dist/engine/agent-api/nodes/mergeStatic.js +126 -0
  153. package/dist/engine/agent-api/nodes/mergeStatic.js.map +1 -0
  154. package/dist/engine/agent-api/nodes/scatter.d.ts +116 -0
  155. package/dist/engine/agent-api/nodes/scatter.d.ts.map +1 -0
  156. package/dist/engine/agent-api/nodes/scatter.js +211 -0
  157. package/dist/engine/agent-api/nodes/scatter.js.map +1 -0
  158. package/dist/engine/agent-api/nodes/scene.d.ts +9 -1
  159. package/dist/engine/agent-api/nodes/scene.d.ts.map +1 -1
  160. package/dist/engine/agent-api/nodes/scene.js +28 -2
  161. package/dist/engine/agent-api/nodes/scene.js.map +1 -1
  162. package/dist/engine/agent-api/sceneMath.d.ts +6 -0
  163. package/dist/engine/agent-api/sceneMath.d.ts.map +1 -1
  164. package/dist/engine/agent-api/sceneMath.js +6 -2
  165. package/dist/engine/agent-api/sceneMath.js.map +1 -1
  166. package/dist/engine/contracts/stubs/game.d.ts +0 -8
  167. package/dist/engine/contracts/stubs/game.d.ts.map +1 -1
  168. package/dist/engine/contracts/stubs/game.js +6 -0
  169. package/dist/engine/contracts/stubs/game.js.map +1 -1
  170. package/dist/engine/deprecated/advanced-runtime.js +2 -2
  171. package/dist/engine/deprecated/apps.js +2 -2
  172. package/dist/engine/deprecated/assets-browser.js +2 -2
  173. package/dist/engine/deprecated/contracts.js +2 -2
  174. package/dist/engine/deprecated/media-node.js +2 -2
  175. package/dist/engine/deprecated/production-runtime.js +2 -2
  176. package/dist/engine/deprecated/rendering-production-runtime.js +2 -2
  177. package/dist/engine/deprecated/rendering-webgpu.js +2 -2
  178. package/dist/engine/deprecated/rendering.js +2 -2
  179. package/dist/engine/deprecated/workflows-production.js +2 -2
  180. package/dist/engine/index.d.ts +1 -0
  181. package/dist/engine/index.d.ts.map +1 -1
  182. package/dist/engine/index.js +1 -0
  183. package/dist/engine/index.js.map +1 -1
  184. package/dist/engine/instances-model/InstancedModel.d.ts.map +1 -1
  185. package/dist/engine/instances-model/InstancedModel.js +2 -5
  186. package/dist/engine/instances-model/InstancedModel.js.map +1 -1
  187. package/dist/engine/production-runtime/TypedGLBActor.d.ts +6 -0
  188. package/dist/engine/production-runtime/TypedGLBActor.d.ts.map +1 -1
  189. package/dist/engine/production-runtime/TypedGLBActor.js +8 -1
  190. package/dist/engine/production-runtime/TypedGLBActor.js.map +1 -1
  191. package/dist/engine/production-runtime/actor/ModelTextureShare.d.ts +38 -0
  192. package/dist/engine/production-runtime/actor/ModelTextureShare.d.ts.map +1 -0
  193. package/dist/engine/production-runtime/actor/ModelTextureShare.js +65 -0
  194. package/dist/engine/production-runtime/actor/ModelTextureShare.js.map +1 -0
  195. package/dist/engine/public/index.d.ts +71 -67
  196. package/dist/engine/public/index.d.ts.map +1 -1
  197. package/dist/engine/public/index.js +59 -54
  198. package/dist/engine/public/index.js.map +1 -1
  199. package/dist/engine/qa/countedRng.d.ts +16 -0
  200. package/dist/engine/qa/countedRng.d.ts.map +1 -0
  201. package/dist/engine/qa/countedRng.js +40 -0
  202. package/dist/engine/qa/countedRng.js.map +1 -0
  203. package/dist/engine/qa/fixedStepLoop.d.ts +43 -0
  204. package/dist/engine/qa/fixedStepLoop.d.ts.map +1 -0
  205. package/dist/engine/qa/fixedStepLoop.js +83 -0
  206. package/dist/engine/qa/fixedStepLoop.js.map +1 -0
  207. package/dist/engine/qa/hooks.d.ts +80 -0
  208. package/dist/engine/qa/hooks.d.ts.map +1 -0
  209. package/dist/engine/qa/hooks.js +95 -0
  210. package/dist/engine/qa/hooks.js.map +1 -0
  211. package/dist/engine/qa/index.d.ts +10 -0
  212. package/dist/engine/qa/index.d.ts.map +1 -0
  213. package/dist/engine/qa/index.js +6 -0
  214. package/dist/engine/qa/index.js.map +1 -0
  215. package/dist/engine/qa/params.d.ts +38 -0
  216. package/dist/engine/qa/params.d.ts.map +1 -0
  217. package/dist/engine/qa/params.js +35 -0
  218. package/dist/engine/qa/params.js.map +1 -0
  219. package/dist/game/capture/captureFromUrl.d.ts +1 -1
  220. package/dist/game/capture/captureFromUrl.d.ts.map +1 -1
  221. package/dist/game/capture/index.d.ts +1 -1
  222. package/dist/game/capture/index.d.ts.map +1 -1
  223. package/dist/game/components.d.ts +1 -1
  224. package/dist/game/components.d.ts.map +1 -1
  225. package/dist/game/createGame.d.ts +1 -1
  226. package/dist/game/createGame.d.ts.map +1 -1
  227. package/dist/game/createGame.js +1 -1
  228. package/dist/game/createGame.js.map +1 -1
  229. package/dist/game/evidence/beacon.d.ts +1 -1
  230. package/dist/game/evidence/beacon.d.ts.map +1 -1
  231. package/dist/game/flagDefault.d.ts +8 -0
  232. package/dist/game/flagDefault.d.ts.map +1 -0
  233. package/dist/game/flagDefault.js +28 -0
  234. package/dist/game/flagDefault.js.map +1 -0
  235. package/dist/game/index.d.ts +4 -2
  236. package/dist/game/index.d.ts.map +1 -1
  237. package/dist/game/index.js +10 -3
  238. package/dist/game/index.js.map +1 -1
  239. package/dist/game/input/bindingStore.d.ts +87 -0
  240. package/dist/game/input/bindingStore.d.ts.map +1 -0
  241. package/dist/game/input/bindingStore.js +164 -0
  242. package/dist/game/input/bindingStore.js.map +1 -0
  243. package/dist/game/session/GameSession.d.ts +2 -2
  244. package/dist/game/session/GameSession.d.ts.map +1 -1
  245. package/dist/game/session/GameSession.js +1 -1
  246. package/dist/game/session/GameSession.js.map +1 -1
  247. package/dist/rendering/ForwardPass.d.ts +5 -0
  248. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  249. package/dist/rendering/ForwardPass.js +13 -3
  250. package/dist/rendering/ForwardPass.js.map +1 -1
  251. package/dist/rendering/MaterialBinding.d.ts.map +1 -1
  252. package/dist/rendering/MaterialBinding.js +11 -1
  253. package/dist/rendering/MaterialBinding.js.map +1 -1
  254. package/dist/rendering/Renderer.d.ts +8 -0
  255. package/dist/rendering/Renderer.d.ts.map +1 -1
  256. package/dist/rendering/Renderer.js +7 -0
  257. package/dist/rendering/Renderer.js.map +1 -1
  258. package/dist/rendering/ShaderLibrary.js +5 -5
  259. package/dist/rendering/ShaderLibraryCore.js +1 -1
  260. package/dist/rendering/WebGPUDevice.js +1 -1
  261. package/dist/rendering/index.d.ts +1 -0
  262. package/dist/rendering/index.d.ts.map +1 -1
  263. package/dist/rendering/index.js +1 -0
  264. package/dist/rendering/index.js.map +1 -1
  265. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +1 -1
  266. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
  267. package/dist/rendering/output/ToneMappingOperators.glsl.js +2 -0
  268. package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
  269. package/dist/rendering/program/chunks/shadow_forward.glsl.d.ts +2 -2
  270. package/dist/rendering/program/chunks/shadow_forward.glsl.d.ts.map +1 -1
  271. package/dist/rendering/program/chunks/shadow_forward.glsl.js +1 -1
  272. package/dist/rendering/shaders/chunks/author/colorspace.glsl.d.ts +8 -0
  273. package/dist/rendering/shaders/chunks/author/colorspace.glsl.d.ts.map +1 -0
  274. package/dist/rendering/shaders/chunks/author/colorspace.glsl.js +20 -0
  275. package/dist/rendering/shaders/chunks/author/colorspace.glsl.js.map +1 -0
  276. package/dist/rendering/shaders/chunks/author/fog.glsl.d.ts +3 -0
  277. package/dist/rendering/shaders/chunks/author/fog.glsl.d.ts.map +1 -0
  278. package/dist/rendering/shaders/chunks/author/fog.glsl.js +18 -0
  279. package/dist/rendering/shaders/chunks/author/fog.glsl.js.map +1 -0
  280. package/dist/rendering/shaders/chunks/author/index.d.ts +16 -0
  281. package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -0
  282. package/dist/rendering/shaders/chunks/author/index.js +77 -0
  283. package/dist/rendering/shaders/chunks/author/index.js.map +1 -0
  284. package/dist/rendering/shaders/chunks/author/math.glsl.d.ts +3 -0
  285. package/dist/rendering/shaders/chunks/author/math.glsl.d.ts.map +1 -0
  286. package/dist/rendering/shaders/chunks/author/math.glsl.js +43 -0
  287. package/dist/rendering/shaders/chunks/author/math.glsl.js.map +1 -0
  288. package/dist/rendering/shaders/chunks/author/noise.glsl.d.ts +3 -0
  289. package/dist/rendering/shaders/chunks/author/noise.glsl.d.ts.map +1 -0
  290. package/dist/rendering/shaders/chunks/author/noise.glsl.js +94 -0
  291. package/dist/rendering/shaders/chunks/author/noise.glsl.js.map +1 -0
  292. package/dist/rendering/shaders/chunks/author/sky.glsl.d.ts +3 -0
  293. package/dist/rendering/shaders/chunks/author/sky.glsl.d.ts.map +1 -0
  294. package/dist/rendering/shaders/chunks/author/sky.glsl.js +28 -0
  295. package/dist/rendering/shaders/chunks/author/sky.glsl.js.map +1 -0
  296. package/dist/rendering/shaders/chunks/author/toon.glsl.d.ts +3 -0
  297. package/dist/rendering/shaders/chunks/author/toon.glsl.d.ts.map +1 -0
  298. package/dist/rendering/shaders/chunks/author/toon.glsl.js +21 -0
  299. package/dist/rendering/shaders/chunks/author/toon.glsl.js.map +1 -0
  300. package/dist/rendering/shaders/chunks/author/triplanar.glsl.d.ts +3 -0
  301. package/dist/rendering/shaders/chunks/author/triplanar.glsl.d.ts.map +1 -0
  302. package/dist/rendering/shaders/chunks/author/triplanar.glsl.js +14 -0
  303. package/dist/rendering/shaders/chunks/author/triplanar.glsl.js.map +1 -0
  304. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  305. package/dist/rendering/webgl2/LegacyPost.js +3 -2
  306. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  307. package/package.json +33 -26
  308. package/templates/cinematic-scene/package.json +2 -2
  309. package/templates/mini-game/package.json +2 -2
  310. package/templates/product-viewer/package.json +2 -2
  311. package/templates/production-asset-inspector/package.json +1 -1
  312. package/templates/production-material-studio/package.json +1 -1
  313. package/templates/production-product-configurator/package.json +1 -1
  314. package/templates/production-product-viewer/package.json +1 -1
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Asset tooling commands: `assets merge-clips`, `meshy ledger`. (`assets optimize --file` extends the prd05 verb and
3
+ * `assets import-meshy --into` extends the built-in import in cli.ts; both reuse the modules in this folder.)
4
+ */
5
+ import { registerCliCommand } from "../../contracts/commands.js";
6
+ import { meshyLedgerCommand } from "../meshyLedger.js";
7
+ import { mergeClipsUsage, mergeGlbClips, parseClipSpec } from "./mergeClips.js";
8
+ function flag(argv, name) {
9
+ const index = argv.indexOf(name);
10
+ const value = index >= 0 ? argv[index + 1] : undefined;
11
+ return value && !value.startsWith("--") ? value : undefined;
12
+ }
13
+ registerCliCommand({
14
+ name: "assets merge-clips",
15
+ owner: "assets-tooling",
16
+ summary: "Merge Meshy animate-task clips into one rigged GLB, by node name.",
17
+ usage: mergeClipsUsage(),
18
+ run: async (argv, io) => {
19
+ const base = flag(argv, "--base");
20
+ const out = flag(argv, "--out");
21
+ const valueFlags = new Set(["--base", "--out", "--tex"]);
22
+ const specs = argv.filter((arg, index) => !arg.startsWith("--") && !valueFlags.has(argv[index - 1] ?? ""));
23
+ if (!base || !out || specs.length === 0) {
24
+ io.stderr(`Usage: ${mergeClipsUsage()}`);
25
+ return 2;
26
+ }
27
+ const tex = flag(argv, "--tex");
28
+ const result = await mergeGlbClips({
29
+ projectDir: io.cwd,
30
+ base,
31
+ output: out,
32
+ clips: specs.map(parseClipSpec),
33
+ keepBaseAnimations: argv.includes("--keep-base-animations"),
34
+ ...(tex ? { tex: Number(tex) } : {})
35
+ });
36
+ if (argv.includes("--json"))
37
+ io.stdout(JSON.stringify(result, null, 2));
38
+ else {
39
+ for (const clip of result.clips)
40
+ io.stdout(`${clip.name}: ${clip.channels}/${clip.sourceChannels} channels (${clip.missingNodes} unmatched), ${clip.duration.toFixed(2)}s`);
41
+ io.stdout(`wrote ${result.output} (${result.bytes} bytes), animations: ${result.animations.join(", ")}`);
42
+ }
43
+ return 0;
44
+ }
45
+ });
46
+ registerCliCommand({
47
+ name: "meshy ledger",
48
+ owner: "assets-tooling",
49
+ summary: "Credit ledger for paid Meshy generation: per-game caps, a global cap, safe settlement.",
50
+ usage: "aura3d meshy ledger status|reserve|settle|reconcile|list [--ledger path] [--global-cap N] [--game tag] [--op op] [--cap N] [--est N] [--rid id] [--status s] [--exit-code N] [--task-id id] [--task-status s] [--actual N] [--note text]",
51
+ run: (argv, io) => meshyLedgerCommand(argv, io)
52
+ });
53
+ export {};
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `aura3d assets merge-clips --base rigged.glb --out hero.glb run=animation_run.glb idle=animation_idle.glb ...`
3
+ *
4
+ * Meshy rigging returns one rigged GLB, and every `animate` task returns a separate GLB that carries one clip on the
5
+ * same skeleton. This copies each source clip onto the base rig by node name and writes ONE GLB with every named clip,
6
+ * ready for AnimationController / cloneSkinned. Source clips that match no node of the base rig are rejected loudly
7
+ * instead of producing a silent T-pose.
8
+ */
9
+ import { type GltfToolkit } from "./gltfToolkit.js";
10
+ export interface MergeClipInput {
11
+ /** Clip name written to the output GLB (and used by the game: run, idle, jump...). */
12
+ readonly name: string;
13
+ /** A GLB file, or a Meshy download directory containing animation_glb.glb. */
14
+ readonly file: string;
15
+ }
16
+ export interface MergeClipsOptions {
17
+ /** Rigged GLB, or a Meshy rig download directory containing rigged_character_glb.glb. */
18
+ readonly base: string;
19
+ readonly output: string;
20
+ readonly clips: readonly MergeClipInput[];
21
+ readonly projectDir?: string;
22
+ /** Keep the rest-pose clips the rig task shipped with (default drops them unless a clip reuses the name). */
23
+ readonly keepBaseAnimations?: boolean;
24
+ /** Texture size cap for the written file (default 1024). */
25
+ readonly tex?: number;
26
+ readonly toolkit?: GltfToolkit;
27
+ }
28
+ export interface MergedClipReport {
29
+ readonly name: string;
30
+ readonly channels: number;
31
+ readonly sourceChannels: number;
32
+ readonly missingNodes: number;
33
+ readonly duration: number;
34
+ }
35
+ export interface MergeClipsResult {
36
+ readonly output: string;
37
+ readonly bytes: number;
38
+ readonly clips: readonly MergedClipReport[];
39
+ readonly animations: readonly string[];
40
+ }
41
+ export declare function parseClipSpec(spec: string): MergeClipInput;
42
+ export declare function mergeGlbClips(options: MergeClipsOptions): Promise<MergeClipsResult>;
43
+ export declare function mergeClipsUsage(): string;
44
+ //# sourceMappingURL=mergeClips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeClips.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/mergeClips.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAiC,KAAK,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6GAA6G;IAC7G,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAM1D;AAaD,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoEzF;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `aura3d assets merge-clips --base rigged.glb --out hero.glb run=animation_run.glb idle=animation_idle.glb ...`
3
+ *
4
+ * Meshy rigging returns one rigged GLB, and every `animate` task returns a separate GLB that carries one clip on the
5
+ * same skeleton. This copies each source clip onto the base rig by node name and writes ONE GLB with every named clip,
6
+ * ready for AnimationController / cloneSkinned. Source clips that match no node of the base rig are rejected loudly
7
+ * instead of producing a silent T-pose.
8
+ */
9
+ import { existsSync, mkdirSync, statSync } from "node:fs";
10
+ import { dirname, join, resolve } from "node:path";
11
+ import { createGltfIo, loadGltfToolkit } from "./gltfToolkit.js";
12
+ export function parseClipSpec(spec) {
13
+ const index = spec.indexOf("=");
14
+ if (index <= 0 || index === spec.length - 1)
15
+ throw new Error(`Clip spec "${spec}" must look like name=file.glb (or name=meshy-download-dir).`);
16
+ const name = spec.slice(0, index);
17
+ if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(name))
18
+ throw new Error(`Clip name "${name}" must start with a letter and use letters, digits, "-" or "_".`);
19
+ return { name, file: spec.slice(index + 1) };
20
+ }
21
+ function resolveGlb(projectDir, path, directoryEntry) {
22
+ const resolved = resolve(projectDir, path);
23
+ if (!existsSync(resolved))
24
+ throw new Error(`File not found: ${path}`);
25
+ if (statSync(resolved).isDirectory()) {
26
+ const inside = join(resolved, directoryEntry);
27
+ if (!existsSync(inside))
28
+ throw new Error(`${path} is a directory without ${directoryEntry}.`);
29
+ return inside;
30
+ }
31
+ return resolved;
32
+ }
33
+ export async function mergeGlbClips(options) {
34
+ if (options.clips.length === 0)
35
+ throw new Error("merge-clips needs at least one name=file clip.");
36
+ const names = new Set();
37
+ for (const clip of options.clips) {
38
+ if (names.has(clip.name))
39
+ throw new Error(`Duplicate clip name "${clip.name}".`);
40
+ names.add(clip.name);
41
+ }
42
+ const projectDir = resolve(options.projectDir ?? process.cwd());
43
+ const output = resolve(projectDir, options.output);
44
+ const tex = options.tex ?? 1024;
45
+ if (!Number.isInteger(tex) || tex < 16 || tex > 4096)
46
+ throw new Error(`--tex must be an integer from 16 to 4096 (got ${tex}).`);
47
+ const toolkit = options.toolkit ?? loadGltfToolkit(projectDir);
48
+ const { dedup, prune, textureCompress, resample, reorder } = toolkit.functions;
49
+ const io = await createGltfIo(toolkit);
50
+ const baseFile = resolveGlb(projectDir, options.base, "rigged_character_glb.glb");
51
+ if (baseFile === output)
52
+ throw new Error("--out must differ from --base.");
53
+ const base = await io.read(baseFile);
54
+ const root = base.getRoot();
55
+ const buffer = root.listBuffers()[0] ?? base.createBuffer();
56
+ const nodesByName = new Map(root.listNodes().map((node) => [node.getName(), node]));
57
+ const reports = [];
58
+ for (const clip of options.clips) {
59
+ const source = await io.read(resolveGlb(projectDir, clip.file, "animation_glb.glb"));
60
+ const animation = source.getRoot().listAnimations()[0];
61
+ if (!animation)
62
+ throw new Error(`${clip.name}: ${clip.file} has no animation.`);
63
+ const target = base.createAnimation(clip.name);
64
+ const samplers = new Map();
65
+ let channels = 0;
66
+ let missingNodes = 0;
67
+ for (const channel of animation.listChannels()) {
68
+ const node = nodesByName.get(channel.getTargetNode()?.getName());
69
+ if (!node) {
70
+ missingNodes += 1;
71
+ continue;
72
+ }
73
+ const sourceSampler = channel.getSampler();
74
+ if (!samplers.has(sourceSampler)) {
75
+ const input = base.createAccessor().setType(sourceSampler.getInput().getType()).setArray(sourceSampler.getInput().getArray().slice()).setBuffer(buffer);
76
+ const out = base.createAccessor().setType(sourceSampler.getOutput().getType()).setArray(sourceSampler.getOutput().getArray().slice()).setBuffer(buffer);
77
+ const sampler = base.createAnimationSampler().setInput(input).setOutput(out).setInterpolation(sourceSampler.getInterpolation());
78
+ target.addSampler(sampler);
79
+ samplers.set(sourceSampler, sampler);
80
+ }
81
+ target.addChannel(base.createAnimationChannel().setTargetNode(node).setTargetPath(channel.getTargetPath()).setSampler(samplers.get(sourceSampler)));
82
+ channels += 1;
83
+ }
84
+ if (channels === 0) {
85
+ throw new Error(`${clip.name}: none of ${animation.listChannels().length} channels in ${clip.file} match a node of the base rig (different skeleton?).`);
86
+ }
87
+ const duration = Math.max(0, ...[...samplers.values()].map((sampler) => sampler.getInput().getMax([])[0] ?? 0));
88
+ reports.push({ name: clip.name, channels, sourceChannels: animation.listChannels().length, missingNodes, duration });
89
+ }
90
+ if (options.keepBaseAnimations !== true) {
91
+ for (const animation of root.listAnimations())
92
+ if (!names.has(animation.getName()))
93
+ animation.dispose();
94
+ }
95
+ await base.transform(dedup(), resample(), prune(), textureCompress({ encoder: toolkit.sharp, resize: [tex, tex], targetFormat: "jpeg", slots: /^(?!normal)/, quality: 85 }), textureCompress({ encoder: toolkit.sharp, resize: [tex, tex], slots: /^normal/ }), reorder({ encoder: toolkit.MeshoptEncoder }));
96
+ mkdirSync(dirname(output), { recursive: true });
97
+ await io.write(output, base);
98
+ return { output, bytes: statSync(output).size, clips: reports, animations: root.listAnimations().map((animation) => animation.getName()) };
99
+ }
100
+ export function mergeClipsUsage() {
101
+ return "aura3d assets merge-clips --base rigged.glb|<rig-download-dir> --out hero.glb name=clip.glb|<animate-download-dir> [name=...] [--keep-base-animations] [--tex 1024] [--json]";
102
+ }
103
+ //# sourceMappingURL=mergeClips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeClips.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/mergeClips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `aura3d assets optimize --file in.glb --out out.glb [--role hero|vehicle|character|prop|background]`
3
+ *
4
+ * Direct-file mode of the `assets optimize` verb (the id-based admission pipeline stays in prd05). Dedup, weld,
5
+ * budgeted simplify, prune, texture downscale (colour/ORM -> jpeg, normal -> png) and a stable vertex order. Geometry
6
+ * stays float32 by default: meshopt quantisation moves scale into a node transform, which skews the grounding and
7
+ * bounds checks `assets import-meshy` runs, so `meshopt: true` is for static background props you will not measure.
8
+ */
9
+ import { type GltfToolkit } from "./gltfToolkit.js";
10
+ export type OptimizeRole = "hero" | "vehicle" | "character" | "prop" | "background";
11
+ /** Vertex and texture budgets by role (Meshy meshes weld to roughly half as many vertices as triangles). */
12
+ export declare const OPTIMIZE_BUDGETS: Readonly<Record<OptimizeRole, {
13
+ readonly maxVerts: number;
14
+ readonly tex: number;
15
+ }>>;
16
+ export declare const MAX_OPTIMIZE_TEXTURE = 4096;
17
+ export interface OptimizeGlbOptions {
18
+ readonly input: string;
19
+ readonly output: string;
20
+ readonly projectDir?: string;
21
+ readonly role?: OptimizeRole;
22
+ readonly maxVerts?: number;
23
+ readonly tex?: number;
24
+ /** false skips simplification even when over budget. */
25
+ readonly simplify?: boolean;
26
+ readonly meshopt?: boolean;
27
+ /** Simplifier error tolerance, 0..1 (default 0.05). */
28
+ readonly error?: number;
29
+ readonly toolkit?: GltfToolkit;
30
+ }
31
+ export interface OptimizePlan {
32
+ readonly role: OptimizeRole;
33
+ readonly maxVerts: number;
34
+ readonly tex: number;
35
+ readonly simplify: boolean;
36
+ readonly meshopt: boolean;
37
+ readonly error: number;
38
+ }
39
+ export interface OptimizeGlbResult extends OptimizePlan {
40
+ readonly input: string;
41
+ readonly output: string;
42
+ readonly bytesIn: number;
43
+ readonly bytesOut: number;
44
+ readonly vertsBefore: number;
45
+ readonly vertsAfter: number;
46
+ readonly skinned: boolean;
47
+ readonly simplified: boolean;
48
+ }
49
+ export declare function isOptimizeRole(value: string): value is OptimizeRole;
50
+ /** Pure planning step: resolve role budgets and validate overrides (no files, no toolkit). */
51
+ export declare function planOptimize(options: Pick<OptimizeGlbOptions, "role" | "maxVerts" | "tex" | "simplify" | "meshopt" | "error">): OptimizePlan;
52
+ export declare function optimizeGlbFile(options: OptimizeGlbOptions): Promise<OptimizeGlbResult>;
53
+ export declare function optimizeUsage(): string;
54
+ //# sourceMappingURL=optimize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/optimize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAiC,KAAK,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAE/F,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;AAEpF,4GAA4G;AAC5G,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAMhH,CAAC;AAEF,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG,YAAY,CAW5I;AASD,wBAAsB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6B7F;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `aura3d assets optimize --file in.glb --out out.glb [--role hero|vehicle|character|prop|background]`
3
+ *
4
+ * Direct-file mode of the `assets optimize` verb (the id-based admission pipeline stays in prd05). Dedup, weld,
5
+ * budgeted simplify, prune, texture downscale (colour/ORM -> jpeg, normal -> png) and a stable vertex order. Geometry
6
+ * stays float32 by default: meshopt quantisation moves scale into a node transform, which skews the grounding and
7
+ * bounds checks `assets import-meshy` runs, so `meshopt: true` is for static background props you will not measure.
8
+ */
9
+ import { mkdirSync, statSync } from "node:fs";
10
+ import { dirname, resolve } from "node:path";
11
+ import { createGltfIo, loadGltfToolkit } from "./gltfToolkit.js";
12
+ /** Vertex and texture budgets by role (Meshy meshes weld to roughly half as many vertices as triangles). */
13
+ export const OPTIMIZE_BUDGETS = {
14
+ hero: { maxVerts: 40000, tex: 2048 },
15
+ vehicle: { maxVerts: 40000, tex: 2048 },
16
+ character: { maxVerts: 30000, tex: 2048 },
17
+ prop: { maxVerts: 6000, tex: 1024 },
18
+ background: { maxVerts: 15000, tex: 1024 }
19
+ };
20
+ export const MAX_OPTIMIZE_TEXTURE = 4096;
21
+ export function isOptimizeRole(value) {
22
+ return value in OPTIMIZE_BUDGETS;
23
+ }
24
+ /** Pure planning step: resolve role budgets and validate overrides (no files, no toolkit). */
25
+ export function planOptimize(options) {
26
+ const role = options.role ?? "prop";
27
+ if (!isOptimizeRole(role))
28
+ throw new Error(`Unknown optimize role "${String(role)}". Use ${Object.keys(OPTIMIZE_BUDGETS).join(", ")}.`);
29
+ const budget = OPTIMIZE_BUDGETS[role];
30
+ const maxVerts = options.maxVerts ?? budget.maxVerts;
31
+ const tex = options.tex ?? budget.tex;
32
+ const error = options.error ?? 0.05;
33
+ if (!Number.isInteger(maxVerts) || maxVerts < 100)
34
+ throw new Error(`--max-verts must be an integer >= 100 (got ${maxVerts}).`);
35
+ if (!Number.isInteger(tex) || tex < 16 || tex > MAX_OPTIMIZE_TEXTURE)
36
+ throw new Error(`--tex must be an integer from 16 to ${MAX_OPTIMIZE_TEXTURE} (got ${tex}).`);
37
+ if (!(error > 0 && error <= 1))
38
+ throw new Error(`--error must be in (0, 1] (got ${error}).`);
39
+ return { role, maxVerts, tex, simplify: options.simplify !== false, meshopt: options.meshopt === true, error };
40
+ }
41
+ function countVerts(doc) {
42
+ return doc
43
+ .getRoot()
44
+ .listMeshes()
45
+ .reduce((sum, mesh) => sum + mesh.listPrimitives().reduce((acc, prim) => acc + (prim.getAttribute("POSITION")?.getCount() ?? 0), 0), 0);
46
+ }
47
+ export async function optimizeGlbFile(options) {
48
+ const plan = planOptimize(options);
49
+ const projectDir = resolve(options.projectDir ?? process.cwd());
50
+ const input = resolve(projectDir, options.input);
51
+ const output = resolve(projectDir, options.output);
52
+ if (input === output)
53
+ throw new Error("--out must differ from --file: optimize never overwrites its input.");
54
+ const toolkit = options.toolkit ?? loadGltfToolkit(projectDir);
55
+ const { dedup, weld, simplify, prune, textureCompress, meshopt, resample, reorder } = toolkit.functions;
56
+ const io = await createGltfIo(toolkit);
57
+ const doc = await io.read(input);
58
+ const vertsBefore = countVerts(doc);
59
+ const skinned = doc.getRoot().listSkins().length > 0;
60
+ await doc.transform(dedup(), weld());
61
+ let simplified = false;
62
+ if (plan.simplify && vertsBefore > plan.maxVerts) {
63
+ await doc.transform(simplify({ simplifier: toolkit.MeshoptSimplifier, ratio: Math.max(0.02, plan.maxVerts / vertsBefore), error: plan.error, lockBorder: skinned }));
64
+ simplified = true;
65
+ }
66
+ await doc.transform(resample(), prune(), textureCompress({ encoder: toolkit.sharp, resize: [plan.tex, plan.tex], targetFormat: "jpeg", slots: /^(?!normal)/, quality: 86 }), textureCompress({ encoder: toolkit.sharp, resize: [plan.tex, plan.tex], slots: /^normal/ }), reorder({ encoder: toolkit.MeshoptEncoder }));
67
+ if (plan.meshopt)
68
+ await doc.transform(meshopt({ encoder: toolkit.MeshoptEncoder, level: "medium" }));
69
+ mkdirSync(dirname(output), { recursive: true });
70
+ await io.write(output, doc);
71
+ return { ...plan, input, output, bytesIn: statSync(input).size, bytesOut: statSync(output).size, vertsBefore, vertsAfter: countVerts(doc), skinned, simplified };
72
+ }
73
+ export function optimizeUsage() {
74
+ return "aura3d assets optimize --file in.glb --out out.glb [--role hero|vehicle|character|prop|background] [--max-verts N] [--tex N] [--no-simplify] [--meshopt] [--error 0.05] [--json]";
75
+ }
76
+ //# sourceMappingURL=optimize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/optimize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAgC,MAAM,kBAAkB,CAAC;AAI/F,4GAA4G;AAC5G,MAAM,CAAC,MAAM,gBAAgB,GAAwF;IACnH,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;IACpC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;IACvC,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;IACzC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACnC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAqCzC,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,IAAI,gBAAgB,CAAC;AACnC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,OAAiG;IAC5H,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxI,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,IAAI,CAAC,CAAC;IAC/H,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,oBAAoB;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,oBAAoB,SAAS,GAAG,IAAI,CAAC,CAAC;IACnK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,IAAI,CAAC,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;AACjH,CAAC;AAED,SAAS,UAAU,CAAC,GAAU;IAC5B,OAAO,GAAG;SACP,OAAO,EAAE;SACT,UAAU,EAAE;SACZ,MAAM,CAAC,CAAC,GAAW,EAAE,IAAW,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,IAAW,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1K,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAC7G,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IACxG,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACrD,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACrK,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,MAAM,GAAG,CAAC,SAAS,CACjB,QAAQ,EAAE,EACV,KAAK,EAAE,EACP,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAClI,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAC3F,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAC7C,CAAC;IACF,IAAI,IAAI,CAAC,OAAO;QAAE,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACnK,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,kLAAkL,CAAC;AAC5L,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface VerbIo {
2
+ readonly cwd: string;
3
+ readonly stdout: (line: string) => void;
4
+ readonly stderr: (line: string) => void;
5
+ }
6
+ /** CLI wrapper for direct-file optimize; the prd05 `assets optimize` verb delegates here when `--file` is present. */
7
+ export declare function optimizeFileVerb(argv: readonly string[], io: VerbIo): Promise<number>;
8
+ export {};
9
+ //# sourceMappingURL=optimizeVerb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizeVerb.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/optimizeVerb.ts"],"names":[],"mappings":"AAEA,UAAU,MAAM;IACd,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAQD,sHAAsH;AACtH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B3F"}
@@ -0,0 +1,40 @@
1
+ import { isOptimizeRole, optimizeGlbFile, optimizeUsage } from "./optimize.js";
2
+ function flag(argv, name) {
3
+ const index = argv.indexOf(name);
4
+ const value = index >= 0 ? argv[index + 1] : undefined;
5
+ return value && !value.startsWith("--") ? value : undefined;
6
+ }
7
+ /** CLI wrapper for direct-file optimize; the prd05 `assets optimize` verb delegates here when `--file` is present. */
8
+ export async function optimizeFileVerb(argv, io) {
9
+ const file = flag(argv, "--file");
10
+ const out = flag(argv, "--out");
11
+ if (!file || !out) {
12
+ io.stderr(`Usage: ${optimizeUsage()}`);
13
+ return 2;
14
+ }
15
+ const role = flag(argv, "--role");
16
+ if (role !== undefined && !isOptimizeRole(role)) {
17
+ io.stderr(`Unsupported --role "${role}". Use hero, vehicle, character, prop or background.`);
18
+ return 2;
19
+ }
20
+ const maxVerts = flag(argv, "--max-verts");
21
+ const tex = flag(argv, "--tex");
22
+ const error = flag(argv, "--error");
23
+ const result = await optimizeGlbFile({
24
+ projectDir: io.cwd,
25
+ input: file,
26
+ output: out,
27
+ ...(role ? { role: role } : {}),
28
+ ...(maxVerts ? { maxVerts: Number(maxVerts) } : {}),
29
+ ...(tex ? { tex: Number(tex) } : {}),
30
+ ...(error ? { error: Number(error) } : {}),
31
+ simplify: !argv.includes("--no-simplify"),
32
+ meshopt: argv.includes("--meshopt")
33
+ });
34
+ if (argv.includes("--json"))
35
+ io.stdout(JSON.stringify(result, null, 2));
36
+ else
37
+ io.stdout(`${result.output}: ${result.bytesIn} -> ${result.bytesOut} bytes, vertices ${result.vertsBefore} -> ${result.vertsAfter} (${result.role} budget ${result.maxVerts}, textures <= ${result.tex}px)${result.skinned ? ", skinned" : ""}`);
38
+ return 0;
39
+ }
40
+ //# sourceMappingURL=optimizeVerb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizeVerb.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/assets/optimizeVerb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAqB,MAAM,eAAe,CAAC;AAQlG,SAAS,IAAI,CAAC,IAAuB,EAAE,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC;AAED,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB,EAAE,EAAU;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,EAAE,CAAC,MAAM,CAAC,UAAU,aAAa,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,uBAAuB,IAAI,sDAAsD,CAAC,CAAC;QAC7F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,UAAU,EAAE,EAAE,CAAC,GAAG;QAClB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,GAAG;QACX,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;QACnE,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,QAAQ,iBAAiB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtP,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `aura3d meshy ledger` — a local credit ledger for paid Meshy generation.
3
+ *
4
+ * Bookkeeping only: this module never talks to Meshy and never reads, prints or stores a credential. A wrapper that
5
+ * calls Meshy (for example through Kiro Prism) reserves credits here BEFORE a paid call and settles the record after.
6
+ * Per-game caps and one global cap are enforced under a lock, so many agents or shells can share one ledger.
7
+ *
8
+ * Lessons baked in:
9
+ * - A rate-limited or timed-out poll does not mean the task failed: the task usually finishes and is charged.
10
+ * Such a call settles as `unconfirmed` and keeps counting its estimate until `reconcile` proves otherwise.
11
+ * - Only a confirmed no-charge outcome (auth/validation/credit errors, a FAILED task) settles as `failed` (counts 0).
12
+ * - Every record carries a required game/project tag, and `prefixedName` makes raw download names game-prefixed so
13
+ * two games cannot silently reuse each other's `rocks.raw.glb`.
14
+ */
15
+ export type MeshyLedgerStatus = "reserved" | "ok" | "failed" | "unconfirmed";
16
+ export interface MeshyLedgerRecord {
17
+ readonly ts: string;
18
+ readonly rid: string;
19
+ readonly status: MeshyLedgerStatus;
20
+ readonly game?: string;
21
+ readonly op?: string;
22
+ readonly est?: number;
23
+ readonly actual?: number;
24
+ readonly task_id?: string;
25
+ readonly note?: string;
26
+ }
27
+ export interface MeshyLedgerOptions {
28
+ /** Defaults to $AURA3D_MESHY_LEDGER, then ~/.aura3d/meshy-ledger.jsonl. */
29
+ readonly ledgerPath?: string;
30
+ /** Total credits the whole ledger may spend. Defaults to $AURA3D_MESHY_GLOBAL_CAP, then 1000. */
31
+ readonly globalCap?: number;
32
+ readonly lockTimeoutMs?: number;
33
+ readonly now?: () => Date;
34
+ }
35
+ export interface MeshyLedgerTotals {
36
+ readonly spent: number;
37
+ readonly unconfirmed: number;
38
+ readonly byGame: Readonly<Record<string, number>>;
39
+ readonly unconfirmedRids: readonly string[];
40
+ }
41
+ /** Meshy's published per-operation credit costs (preview 20, refine 10, remesh 5, rigging 5, animate 3, retexture 10). */
42
+ export declare const MESHY_CREDIT_ESTIMATES: Readonly<Record<string, number>>;
43
+ export declare const DEFAULT_MESHY_GLOBAL_CAP = 1000;
44
+ export declare class MeshyLedgerError extends Error {
45
+ readonly code: "CAP_GLOBAL" | "CAP_GAME" | "BAD_GAME_TAG" | "BAD_RECORD" | "UNKNOWN_RID" | "BAD_TRANSITION" | "LOCK_TIMEOUT";
46
+ constructor(code: "CAP_GLOBAL" | "CAP_GAME" | "BAD_GAME_TAG" | "BAD_RECORD" | "UNKNOWN_RID" | "BAD_TRANSITION" | "LOCK_TIMEOUT", message: string);
47
+ }
48
+ export declare function defaultLedgerPath(): string;
49
+ export declare function assertGameTag(game: string): string;
50
+ /**
51
+ * Raw Meshy downloads must carry the game tag so two games never share `rocks.raw.glb`.
52
+ * `prefixedName("drift", "lamp")` -> `drift-lamp`; an already-prefixed name is returned unchanged.
53
+ */
54
+ export declare function prefixedName(game: string, name: string): string;
55
+ export declare function readMeshyLedger(options?: MeshyLedgerOptions): readonly MeshyLedgerRecord[];
56
+ /** Latest record per reservation id wins (fields merge). failed counts 0; reserved/unconfirmed/ok count actual ?? est. */
57
+ export declare function meshyLedgerTotals(records: readonly MeshyLedgerRecord[]): MeshyLedgerTotals;
58
+ export interface ReserveInput {
59
+ readonly game: string;
60
+ readonly op: string;
61
+ /** Defaults to the published estimate for `op`. */
62
+ readonly est?: number;
63
+ /** Per-game cap for this call; the call is refused when the game's spend plus `est` would exceed it. */
64
+ readonly cap: number;
65
+ }
66
+ /** Reserve credits before a paid call. Throws MeshyLedgerError (CAP_GLOBAL / CAP_GAME) without writing when over a cap. */
67
+ export declare function reserveMeshyCredits(input: ReserveInput, options?: MeshyLedgerOptions): string;
68
+ export interface SettleInput {
69
+ readonly status: Exclude<MeshyLedgerStatus, "reserved">;
70
+ readonly task_id?: string;
71
+ readonly actual?: number;
72
+ readonly note?: string;
73
+ }
74
+ /** Settle (or later reconcile) a reservation. `failed` is final; `ok` only accepts a corrected actual. */
75
+ export declare function settleMeshyCredits(rid: string, input: SettleInput, options?: MeshyLedgerOptions): MeshyLedgerRecord;
76
+ export interface MeshyCallOutcome {
77
+ /** Meshy CLI exit code: 0 ok, 3 auth, 4 validation, 6 rate limit, 8 timeout, 9 credits. */
78
+ readonly exitCode: number;
79
+ readonly taskId?: string;
80
+ /** Provider task status when known (SUCCEEDED, FAILED, PENDING, IN_PROGRESS...). */
81
+ readonly taskStatus?: string;
82
+ }
83
+ /**
84
+ * Decide how a finished Meshy call settles. A rate limit or timeout without a confirmed result is NOT a failure:
85
+ * the task may already be charged, so it stays `unconfirmed` (counted) until a `get` confirms it.
86
+ */
87
+ export declare function classifyMeshyOutcome(outcome: MeshyCallOutcome): SettleInput;
88
+ export declare function summarizeMeshyLedger(options?: MeshyLedgerOptions): {
89
+ readonly globalCap: number;
90
+ readonly spent: number;
91
+ readonly left: number;
92
+ readonly unconfirmed: number;
93
+ readonly unconfirmedRids: readonly string[];
94
+ readonly byGame: Readonly<Record<string, number>>;
95
+ };
96
+ interface CliIo {
97
+ readonly cwd: string;
98
+ readonly stdout: (line: string) => void;
99
+ readonly stderr: (line: string) => void;
100
+ }
101
+ export declare function meshyLedgerCommand(argv: readonly string[], io: CliIo): Promise<number>;
102
+ export {};
103
+ //# sourceMappingURL=meshyLedger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meshyLedger.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/commands/meshyLedger.ts"],"names":[],"mappings":"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"}