@vgai/engine 0.2.0 → 0.3.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 (541) hide show
  1. package/README.md +3 -1
  2. package/dist/adapter/authoring.d.ts +404 -0
  3. package/dist/adapter/authoring.d.ts.map +1 -0
  4. package/dist/adapter/authoring.js +22 -0
  5. package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
  6. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
  7. package/dist/adapter/colyseus-networking-adapter.js +38 -0
  8. package/dist/adapter/first-party-systems.d.ts +38 -0
  9. package/dist/adapter/first-party-systems.d.ts.map +1 -0
  10. package/dist/adapter/first-party-systems.js +77 -0
  11. package/dist/adapter/game-adapter.d.ts +133 -0
  12. package/dist/adapter/game-adapter.d.ts.map +1 -0
  13. package/dist/adapter/game-adapter.js +10 -0
  14. package/dist/adapter/host-context.d.ts +73 -0
  15. package/dist/adapter/host-context.d.ts.map +1 -0
  16. package/dist/adapter/host-context.js +16 -0
  17. package/dist/adapter/index.d.ts +22 -0
  18. package/dist/adapter/index.d.ts.map +1 -0
  19. package/dist/adapter/index.js +15 -0
  20. package/dist/adapter/ingest/game-contract.d.ts +53 -0
  21. package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
  22. package/dist/adapter/ingest/game-contract.js +30 -0
  23. package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
  24. package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
  25. package/dist/adapter/ingest/overlay-applier.js +132 -0
  26. package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
  27. package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
  28. package/dist/adapter/ingest/overlay-apply.js +101 -0
  29. package/dist/adapter/ingest/overlay-file.d.ts +79 -0
  30. package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
  31. package/dist/adapter/ingest/overlay-file.js +66 -0
  32. package/dist/adapter/ingest/overlay-report.d.ts +113 -0
  33. package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
  34. package/dist/adapter/ingest/overlay-report.js +103 -0
  35. package/dist/adapter/ingest/scene-capture.d.ts +97 -0
  36. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
  37. package/dist/adapter/ingest/scene-capture.js +248 -0
  38. package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
  39. package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
  40. package/dist/adapter/ingest/upstream-pin.js +50 -0
  41. package/dist/adapter/loop-gate-report.d.ts +34 -0
  42. package/dist/adapter/loop-gate-report.d.ts.map +1 -0
  43. package/dist/adapter/loop-gate-report.js +37 -0
  44. package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
  45. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
  46. package/dist/adapter/rapier-physics-adapter.js +46 -0
  47. package/dist/adapter/system-adapter.d.ts +133 -0
  48. package/dist/adapter/system-adapter.d.ts.map +1 -0
  49. package/dist/adapter/system-adapter.js +13 -0
  50. package/dist/adapter/transform.d.ts +18 -0
  51. package/dist/adapter/transform.d.ts.map +1 -0
  52. package/dist/adapter/transform.js +1 -0
  53. package/dist/adapter/vgai-scene-game-adapter.d.ts +116 -0
  54. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
  55. package/dist/adapter/vgai-scene-game-adapter.js +714 -0
  56. package/dist/adapter/world-kind.d.ts +30 -0
  57. package/dist/adapter/world-kind.d.ts.map +1 -0
  58. package/dist/adapter/world-kind.js +18 -0
  59. package/dist/ai/navigation.d.ts +64 -0
  60. package/dist/ai/navigation.d.ts.map +1 -0
  61. package/dist/ai/navigation.js +133 -0
  62. package/dist/animation/anim-graph-types.d.ts +25 -0
  63. package/dist/animation/anim-graph-types.d.ts.map +1 -0
  64. package/dist/animation/anim-graph-types.js +1 -0
  65. package/dist/animation/animation-clock.d.ts +213 -0
  66. package/dist/animation/animation-clock.d.ts.map +1 -0
  67. package/dist/animation/animation-clock.js +301 -0
  68. package/dist/animation/blend-node.d.ts +22 -0
  69. package/dist/animation/blend-node.d.ts.map +1 -0
  70. package/dist/animation/blend-node.js +97 -0
  71. package/dist/animation/camera-ownership.d.ts +250 -0
  72. package/dist/animation/camera-ownership.d.ts.map +1 -0
  73. package/dist/animation/camera-ownership.js +169 -0
  74. package/dist/animation/cinematic-cues.d.ts +200 -0
  75. package/dist/animation/cinematic-cues.d.ts.map +1 -0
  76. package/dist/animation/cinematic-cues.js +213 -0
  77. package/dist/animation/clip-map.d.ts +12 -0
  78. package/dist/animation/clip-map.d.ts.map +1 -0
  79. package/dist/animation/clip-map.js +37 -0
  80. package/dist/animation/gsap-registration.d.ts +119 -0
  81. package/dist/animation/gsap-registration.d.ts.map +1 -0
  82. package/dist/animation/gsap-registration.js +92 -0
  83. package/dist/animation/theatre-clock-binding.d.ts +89 -0
  84. package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
  85. package/dist/animation/theatre-clock-binding.js +29 -0
  86. package/dist/animation/theatre-director.d.ts +242 -0
  87. package/dist/animation/theatre-director.d.ts.map +1 -0
  88. package/dist/animation/theatre-director.js +235 -0
  89. package/dist/animation/theatre-object-binding.d.ts +305 -0
  90. package/dist/animation/theatre-object-binding.d.ts.map +1 -0
  91. package/dist/animation/theatre-object-binding.js +351 -0
  92. package/dist/animation/xstate-animation-binding.d.ts +111 -0
  93. package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
  94. package/dist/animation/xstate-animation-binding.js +307 -0
  95. package/dist/animation/xstate-animation-meta.d.ts +228 -0
  96. package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
  97. package/dist/animation/xstate-animation-meta.js +221 -0
  98. package/dist/assets.d.ts +26 -0
  99. package/dist/assets.d.ts.map +1 -0
  100. package/dist/assets.js +55 -0
  101. package/dist/audio/index.d.ts +4 -0
  102. package/dist/audio/index.d.ts.map +1 -0
  103. package/dist/audio/index.js +24 -0
  104. package/dist/audio/tone-clock-binding.d.ts +75 -0
  105. package/dist/audio/tone-clock-binding.d.ts.map +1 -0
  106. package/dist/audio/tone-clock-binding.js +29 -0
  107. package/dist/audio/tone-context.d.ts +114 -0
  108. package/dist/audio/tone-context.d.ts.map +1 -0
  109. package/dist/audio/tone-context.js +39 -0
  110. package/dist/audio/tone-offline-render.d.ts +90 -0
  111. package/dist/audio/tone-offline-render.d.ts.map +1 -0
  112. package/dist/audio/tone-offline-render.js +56 -0
  113. package/dist/audio/wav-encode.d.ts +38 -0
  114. package/dist/audio/wav-encode.d.ts.map +1 -0
  115. package/dist/audio/wav-encode.js +97 -0
  116. package/dist/core/game-loop.d.ts +21 -0
  117. package/dist/core/game-loop.d.ts.map +1 -0
  118. package/dist/core/game-loop.js +130 -0
  119. package/dist/core/system-runner.d.ts +120 -0
  120. package/dist/core/system-runner.d.ts.map +1 -0
  121. package/dist/core/system-runner.js +286 -0
  122. package/dist/core/types.d.ts +58 -0
  123. package/dist/core/types.d.ts.map +1 -0
  124. package/dist/core/types.js +25 -0
  125. package/dist/data/data-asset.d.ts +101 -0
  126. package/dist/data/data-asset.d.ts.map +1 -0
  127. package/dist/data/data-asset.js +122 -0
  128. package/dist/data/data-check-core.d.ts +110 -0
  129. package/dist/data/data-check-core.d.ts.map +1 -0
  130. package/dist/data/data-check-core.js +178 -0
  131. package/dist/data/data-ref.d.ts +79 -0
  132. package/dist/data/data-ref.d.ts.map +1 -0
  133. package/dist/data/data-ref.js +130 -0
  134. package/dist/data/vite-plugin-data.d.ts +79 -0
  135. package/dist/data/vite-plugin-data.d.ts.map +1 -0
  136. package/dist/data/vite-plugin-data.js +217 -0
  137. package/dist/dev/console-bridge.d.ts +22 -0
  138. package/dist/dev/console-bridge.d.ts.map +1 -0
  139. package/dist/dev/console-bridge.js +71 -0
  140. package/dist/dev/debug-draw.d.ts +24 -0
  141. package/dist/dev/debug-draw.d.ts.map +1 -0
  142. package/dist/dev/debug-draw.js +73 -0
  143. package/dist/dev/logger.d.ts +30 -0
  144. package/dist/dev/logger.d.ts.map +1 -0
  145. package/dist/dev/logger.js +90 -0
  146. package/dist/ecs/component-manager.d.ts +189 -0
  147. package/dist/ecs/component-manager.d.ts.map +1 -0
  148. package/dist/ecs/component-manager.js +676 -0
  149. package/dist/ecs/game-component.d.ts +97 -0
  150. package/dist/ecs/game-component.d.ts.map +1 -0
  151. package/dist/ecs/game-component.js +80 -0
  152. package/dist/ecs/hmr-swap-report.d.ts +53 -0
  153. package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
  154. package/dist/ecs/hmr-swap-report.js +55 -0
  155. package/dist/index.d.ts +37 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +30 -0
  158. package/dist/input/input-manager.d.ts +596 -0
  159. package/dist/input/input-manager.d.ts.map +1 -0
  160. package/dist/input/input-manager.js +1564 -0
  161. package/dist/input/input-types.d.ts +171 -0
  162. package/dist/input/input-types.d.ts.map +1 -0
  163. package/dist/input/input-types.js +1 -0
  164. package/dist/input/prompt-labels.d.ts +21 -0
  165. package/dist/input/prompt-labels.d.ts.map +1 -0
  166. package/dist/input/prompt-labels.js +121 -0
  167. package/dist/input/rebind-controller.d.ts +59 -0
  168. package/dist/input/rebind-controller.d.ts.map +1 -0
  169. package/dist/input/rebind-controller.js +85 -0
  170. package/dist/input/schema.d.ts +16 -0
  171. package/dist/input/schema.d.ts.map +1 -0
  172. package/dist/input/schema.js +228 -0
  173. package/dist/loader.d.ts +43 -0
  174. package/dist/loader.d.ts.map +1 -0
  175. package/dist/loader.js +59 -0
  176. package/dist/manifest/index.d.ts +5 -0
  177. package/dist/manifest/index.d.ts.map +1 -0
  178. package/dist/manifest/index.js +8 -0
  179. package/dist/manifest/load-file.d.ts +4 -0
  180. package/dist/manifest/load-file.d.ts.map +1 -0
  181. package/dist/manifest/load-file.js +14 -0
  182. package/dist/manifest/load.d.ts +117 -0
  183. package/dist/manifest/load.d.ts.map +1 -0
  184. package/dist/manifest/load.js +255 -0
  185. package/dist/manifest/schema.d.ts +173 -0
  186. package/dist/manifest/schema.d.ts.map +1 -0
  187. package/dist/manifest/schema.js +302 -0
  188. package/dist/physics/collision-system.d.ts +41 -0
  189. package/dist/physics/collision-system.d.ts.map +1 -0
  190. package/dist/physics/collision-system.js +64 -0
  191. package/dist/physics/physics-registry.d.ts +45 -0
  192. package/dist/physics/physics-registry.d.ts.map +1 -0
  193. package/dist/physics/physics-registry.js +65 -0
  194. package/dist/physics/transform-writer.d.ts +16 -0
  195. package/dist/physics/transform-writer.d.ts.map +1 -0
  196. package/dist/physics/transform-writer.js +38 -0
  197. package/dist/physics/trigger-dispatch.d.ts +24 -0
  198. package/dist/physics/trigger-dispatch.d.ts.map +1 -0
  199. package/dist/physics/trigger-dispatch.js +80 -0
  200. package/dist/react/game-state.d.ts +105 -0
  201. package/dist/react/game-state.d.ts.map +1 -0
  202. package/dist/react/game-state.js +144 -0
  203. package/dist/react/use-data.d.ts +60 -0
  204. package/dist/react/use-data.d.ts.map +1 -0
  205. package/dist/react/use-data.js +96 -0
  206. package/dist/react/use-selection.d.ts +75 -0
  207. package/dist/react/use-selection.d.ts.map +1 -0
  208. package/dist/react/use-selection.js +90 -0
  209. package/dist/render/auto-batcher.d.ts +34 -0
  210. package/dist/render/auto-batcher.d.ts.map +1 -0
  211. package/dist/render/auto-batcher.js +140 -0
  212. package/dist/render/render-batch-system.d.ts +33 -0
  213. package/dist/render/render-batch-system.d.ts.map +1 -0
  214. package/dist/render/render-batch-system.js +230 -0
  215. package/dist/render/render-features.d.ts +47 -0
  216. package/dist/render/render-features.d.ts.map +1 -0
  217. package/dist/render/render-features.js +105 -0
  218. package/dist/render/render-settings.d.ts +36 -0
  219. package/dist/render/render-settings.d.ts.map +1 -0
  220. package/dist/render/render-settings.js +51 -0
  221. package/dist/runtime/create-runtime.d.ts +280 -0
  222. package/dist/runtime/create-runtime.d.ts.map +1 -0
  223. package/dist/runtime/create-runtime.js +795 -0
  224. package/dist/runtime/frame-selector-cache.d.ts +41 -0
  225. package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
  226. package/dist/runtime/frame-selector-cache.js +65 -0
  227. package/dist/runtime/game.d.ts +433 -0
  228. package/dist/runtime/game.d.ts.map +1 -0
  229. package/dist/runtime/game.js +569 -0
  230. package/dist/runtime/input-router.d.ts +78 -0
  231. package/dist/runtime/input-router.d.ts.map +1 -0
  232. package/dist/runtime/input-router.js +171 -0
  233. package/dist/runtime/mount-game.d.ts +129 -0
  234. package/dist/runtime/mount-game.d.ts.map +1 -0
  235. package/dist/runtime/mount-game.js +152 -0
  236. package/dist/runtime/mount-manifest.d.ts +119 -0
  237. package/dist/runtime/mount-manifest.d.ts.map +1 -0
  238. package/dist/runtime/mount-manifest.js +204 -0
  239. package/dist/runtime/render-audio-control.d.ts +110 -0
  240. package/dist/runtime/render-audio-control.d.ts.map +1 -0
  241. package/dist/runtime/render-audio-control.js +111 -0
  242. package/dist/runtime/render-control.d.ts +291 -0
  243. package/dist/runtime/render-control.d.ts.map +1 -0
  244. package/dist/runtime/render-control.js +264 -0
  245. package/dist/runtime/render-seed.d.ts +57 -0
  246. package/dist/runtime/render-seed.d.ts.map +1 -0
  247. package/dist/runtime/render-seed.js +74 -0
  248. package/dist/runtime/scene-ui-bridge.d.ts +69 -0
  249. package/dist/runtime/scene-ui-bridge.d.ts.map +1 -0
  250. package/dist/runtime/scene-ui-bridge.js +23 -0
  251. package/dist/runtime/scene-ui-data.d.ts +13 -0
  252. package/dist/runtime/scene-ui-data.d.ts.map +1 -0
  253. package/dist/runtime/scene-ui-data.js +92 -0
  254. package/dist/runtime/state-bridge.d.ts +47 -0
  255. package/dist/runtime/state-bridge.d.ts.map +1 -0
  256. package/dist/runtime/state-bridge.js +53 -0
  257. package/dist/runtime/types.d.ts +179 -0
  258. package/dist/runtime/types.d.ts.map +1 -0
  259. package/dist/runtime/types.js +1 -0
  260. package/dist/scene/asset-loaders.d.ts +79 -0
  261. package/dist/scene/asset-loaders.d.ts.map +1 -0
  262. package/dist/scene/asset-loaders.js +141 -0
  263. package/dist/scene/asset-paths.d.ts +11 -0
  264. package/dist/scene/asset-paths.d.ts.map +1 -0
  265. package/dist/scene/asset-paths.js +108 -0
  266. package/dist/scene/asset-ref-check.d.ts +88 -0
  267. package/dist/scene/asset-ref-check.d.ts.map +1 -0
  268. package/dist/scene/asset-ref-check.js +214 -0
  269. package/dist/scene/asset-registry.d.ts +30 -0
  270. package/dist/scene/asset-registry.d.ts.map +1 -0
  271. package/dist/scene/asset-registry.js +50 -0
  272. package/dist/scene/collider-dimensions.d.ts +63 -0
  273. package/dist/scene/collider-dimensions.d.ts.map +1 -0
  274. package/dist/scene/collider-dimensions.js +98 -0
  275. package/dist/scene/component-registry.d.ts +17 -0
  276. package/dist/scene/component-registry.d.ts.map +1 -0
  277. package/dist/scene/component-registry.js +28 -0
  278. package/dist/scene/defaults.d.ts +252 -0
  279. package/dist/scene/defaults.d.ts.map +1 -0
  280. package/dist/scene/defaults.js +151 -0
  281. package/dist/scene/geometries/index.d.ts +8 -0
  282. package/dist/scene/geometries/index.d.ts.map +1 -0
  283. package/dist/scene/geometries/index.js +7 -0
  284. package/dist/scene/geometries/terrain.d.ts +2 -0
  285. package/dist/scene/geometries/terrain.d.ts.map +1 -0
  286. package/dist/scene/geometries/terrain.js +37 -0
  287. package/dist/scene/geometry-registry.d.ts +24 -0
  288. package/dist/scene/geometry-registry.d.ts.map +1 -0
  289. package/dist/scene/geometry-registry.js +20 -0
  290. package/dist/scene/instance-registry.d.ts +36 -0
  291. package/dist/scene/instance-registry.d.ts.map +1 -0
  292. package/dist/scene/instance-registry.js +55 -0
  293. package/dist/scene/instancers/grid.d.ts +2 -0
  294. package/dist/scene/instancers/grid.d.ts.map +1 -0
  295. package/dist/scene/instancers/grid.js +36 -0
  296. package/dist/scene/instancers/index.d.ts +8 -0
  297. package/dist/scene/instancers/index.d.ts.map +1 -0
  298. package/dist/scene/instancers/index.js +7 -0
  299. package/dist/scene/light-camera-factory.d.ts +23 -0
  300. package/dist/scene/light-camera-factory.d.ts.map +1 -0
  301. package/dist/scene/light-camera-factory.js +68 -0
  302. package/dist/scene/material-factory.d.ts +17 -0
  303. package/dist/scene/material-factory.d.ts.map +1 -0
  304. package/dist/scene/material-factory.js +197 -0
  305. package/dist/scene/material-registry.d.ts +40 -0
  306. package/dist/scene/material-registry.d.ts.map +1 -0
  307. package/dist/scene/material-registry.js +44 -0
  308. package/dist/scene/materials/index.d.ts +8 -0
  309. package/dist/scene/materials/index.d.ts.map +1 -0
  310. package/dist/scene/materials/index.js +7 -0
  311. package/dist/scene/materials/water.d.ts +2 -0
  312. package/dist/scene/materials/water.d.ts.map +1 -0
  313. package/dist/scene/materials/water.js +54 -0
  314. package/dist/scene/parse.d.ts +23 -0
  315. package/dist/scene/parse.d.ts.map +1 -0
  316. package/dist/scene/parse.js +179 -0
  317. package/dist/scene/particles-factory.d.ts +33 -0
  318. package/dist/scene/particles-factory.d.ts.map +1 -0
  319. package/dist/scene/particles-factory.js +282 -0
  320. package/dist/scene/scene-apply.d.ts +109 -0
  321. package/dist/scene/scene-apply.d.ts.map +1 -0
  322. package/dist/scene/scene-apply.js +326 -0
  323. package/dist/scene/scene-diff-schema.d.ts +285 -0
  324. package/dist/scene/scene-diff-schema.d.ts.map +1 -0
  325. package/dist/scene/scene-diff-schema.js +92 -0
  326. package/dist/scene/scene-diff-types.d.ts +40 -0
  327. package/dist/scene/scene-diff-types.d.ts.map +1 -0
  328. package/dist/scene/scene-diff-types.js +14 -0
  329. package/dist/scene/scene-loader.d.ts +177 -0
  330. package/dist/scene/scene-loader.d.ts.map +1 -0
  331. package/dist/scene/scene-loader.js +1213 -0
  332. package/dist/scene/scene-query.d.ts +11 -0
  333. package/dist/scene/scene-query.d.ts.map +1 -0
  334. package/dist/scene/scene-query.js +63 -0
  335. package/dist/scene/scene-types.d.ts +10 -0
  336. package/dist/scene/scene-types.d.ts.map +1 -0
  337. package/dist/scene/scene-types.js +8 -0
  338. package/dist/scene/scene-version.d.ts +26 -0
  339. package/dist/scene/scene-version.d.ts.map +1 -0
  340. package/dist/scene/scene-version.js +34 -0
  341. package/dist/scene/schema/animation.d.ts +8 -0
  342. package/dist/scene/schema/animation.d.ts.map +1 -0
  343. package/dist/scene/schema/animation.js +42 -0
  344. package/dist/scene/schema/audio.d.ts +13 -0
  345. package/dist/scene/schema/audio.d.ts.map +1 -0
  346. package/dist/scene/schema/audio.js +22 -0
  347. package/dist/scene/schema/camera.d.ts +28 -0
  348. package/dist/scene/schema/camera.d.ts.map +1 -0
  349. package/dist/scene/schema/camera.js +17 -0
  350. package/dist/scene/schema/collider.d.ts +40 -0
  351. package/dist/scene/schema/collider.d.ts.map +1 -0
  352. package/dist/scene/schema/collider.js +55 -0
  353. package/dist/scene/schema/entity-ref.d.ts +31 -0
  354. package/dist/scene/schema/entity-ref.d.ts.map +1 -0
  355. package/dist/scene/schema/entity-ref.js +61 -0
  356. package/dist/scene/schema/entity.d.ts +1036 -0
  357. package/dist/scene/schema/entity.d.ts.map +1 -0
  358. package/dist/scene/schema/entity.js +153 -0
  359. package/dist/scene/schema/environment.d.ts +425 -0
  360. package/dist/scene/schema/environment.d.ts.map +1 -0
  361. package/dist/scene/schema/environment.js +357 -0
  362. package/dist/scene/schema/index.d.ts +39 -0
  363. package/dist/scene/schema/index.d.ts.map +1 -0
  364. package/dist/scene/schema/index.js +20 -0
  365. package/dist/scene/schema/instances.d.ts +14 -0
  366. package/dist/scene/schema/instances.d.ts.map +1 -0
  367. package/dist/scene/schema/instances.js +28 -0
  368. package/dist/scene/schema/joint.d.ts +23 -0
  369. package/dist/scene/schema/joint.d.ts.map +1 -0
  370. package/dist/scene/schema/joint.js +23 -0
  371. package/dist/scene/schema/light.d.ts +38 -0
  372. package/dist/scene/schema/light.d.ts.map +1 -0
  373. package/dist/scene/schema/light.js +26 -0
  374. package/dist/scene/schema/material.d.ts +199 -0
  375. package/dist/scene/schema/material.d.ts.map +1 -0
  376. package/dist/scene/schema/material.js +99 -0
  377. package/dist/scene/schema/mesh.d.ts +48 -0
  378. package/dist/scene/schema/mesh.d.ts.map +1 -0
  379. package/dist/scene/schema/mesh.js +82 -0
  380. package/dist/scene/schema/particles.d.ts +2178 -0
  381. package/dist/scene/schema/particles.d.ts.map +1 -0
  382. package/dist/scene/schema/particles.js +321 -0
  383. package/dist/scene/schema/physics.d.ts +56 -0
  384. package/dist/scene/schema/physics.d.ts.map +1 -0
  385. package/dist/scene/schema/physics.js +37 -0
  386. package/dist/scene/schema/scene-file.d.ts +304 -0
  387. package/dist/scene/schema/scene-file.d.ts.map +1 -0
  388. package/dist/scene/schema/scene-file.js +262 -0
  389. package/dist/scene/schema/shadow.d.ts +28 -0
  390. package/dist/scene/schema/shadow.d.ts.map +1 -0
  391. package/dist/scene/schema/shadow.js +20 -0
  392. package/dist/scene/schema/spline.d.ts +25 -0
  393. package/dist/scene/schema/spline.d.ts.map +1 -0
  394. package/dist/scene/schema/spline.js +15 -0
  395. package/dist/scene/schema/tuples.d.ts +12 -0
  396. package/dist/scene/schema/tuples.d.ts.map +1 -0
  397. package/dist/scene/schema/tuples.js +14 -0
  398. package/dist/scene/schema/ui.d.ts +880 -0
  399. package/dist/scene/schema/ui.d.ts.map +1 -0
  400. package/dist/scene/schema/ui.js +506 -0
  401. package/dist/scene/user-data.d.ts +171 -0
  402. package/dist/scene/user-data.d.ts.map +1 -0
  403. package/dist/scene/user-data.js +137 -0
  404. package/dist/setup/setup-audio.d.ts +20 -0
  405. package/dist/setup/setup-audio.d.ts.map +1 -0
  406. package/dist/setup/setup-audio.js +41 -0
  407. package/dist/setup/setup-particles.d.ts +17 -0
  408. package/dist/setup/setup-particles.d.ts.map +1 -0
  409. package/dist/setup/setup-particles.js +16 -0
  410. package/dist/setup/setup-physics.d.ts +25 -0
  411. package/dist/setup/setup-physics.d.ts.map +1 -0
  412. package/dist/setup/setup-physics.js +51 -0
  413. package/dist/setup/setup-renderer.d.ts +69 -0
  414. package/dist/setup/setup-renderer.d.ts.map +1 -0
  415. package/dist/setup/setup-renderer.js +363 -0
  416. package/dist/tools/define-tool.d.ts +105 -0
  417. package/dist/tools/define-tool.d.ts.map +1 -0
  418. package/dist/tools/define-tool.js +82 -0
  419. package/dist/world2d/authoring-2d.d.ts +76 -0
  420. package/dist/world2d/authoring-2d.d.ts.map +1 -0
  421. package/dist/world2d/authoring-2d.js +176 -0
  422. package/dist/world2d/capture-to-scene2d.d.ts +5 -0
  423. package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
  424. package/dist/world2d/capture-to-scene2d.js +49 -0
  425. package/dist/world2d/collision-2d.d.ts +52 -0
  426. package/dist/world2d/collision-2d.d.ts.map +1 -0
  427. package/dist/world2d/collision-2d.js +70 -0
  428. package/dist/world2d/components-2d.d.ts +47 -0
  429. package/dist/world2d/components-2d.d.ts.map +1 -0
  430. package/dist/world2d/components-2d.js +77 -0
  431. package/dist/world2d/index.d.ts +34 -0
  432. package/dist/world2d/index.d.ts.map +1 -0
  433. package/dist/world2d/index.js +32 -0
  434. package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
  435. package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
  436. package/dist/world2d/ingest-iframe-2d.js +166 -0
  437. package/dist/world2d/ingest2d.d.ts +97 -0
  438. package/dist/world2d/ingest2d.d.ts.map +1 -0
  439. package/dist/world2d/ingest2d.js +40 -0
  440. package/dist/world2d/physics2d-registry.d.ts +24 -0
  441. package/dist/world2d/physics2d-registry.d.ts.map +1 -0
  442. package/dist/world2d/physics2d-registry.js +38 -0
  443. package/dist/world2d/pixi-game-adapter.d.ts +107 -0
  444. package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
  445. package/dist/world2d/pixi-game-adapter.js +211 -0
  446. package/dist/world2d/pixi-surface.d.ts +39 -0
  447. package/dist/world2d/pixi-surface.d.ts.map +1 -0
  448. package/dist/world2d/pixi-surface.js +47 -0
  449. package/dist/world2d/scene-capture-2d.d.ts +43 -0
  450. package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
  451. package/dist/world2d/scene-capture-2d.js +92 -0
  452. package/dist/world2d/scene2d-loader.d.ts +27 -0
  453. package/dist/world2d/scene2d-loader.d.ts.map +1 -0
  454. package/dist/world2d/scene2d-loader.js +274 -0
  455. package/dist/world2d/schema/entity2d.d.ts +102 -0
  456. package/dist/world2d/schema/entity2d.d.ts.map +1 -0
  457. package/dist/world2d/schema/entity2d.js +119 -0
  458. package/dist/world2d/schema/physics2d.d.ts +46 -0
  459. package/dist/world2d/schema/physics2d.d.ts.map +1 -0
  460. package/dist/world2d/schema/physics2d.js +45 -0
  461. package/dist/world2d/schema/sprite.d.ts +42 -0
  462. package/dist/world2d/schema/sprite.d.ts.map +1 -0
  463. package/dist/world2d/schema/sprite.js +63 -0
  464. package/dist/world2d/schema/tilemap.d.ts +15 -0
  465. package/dist/world2d/schema/tilemap.d.ts.map +1 -0
  466. package/dist/world2d/schema/tilemap.js +19 -0
  467. package/dist/world2d/schema/tuples2d.d.ts +20 -0
  468. package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
  469. package/dist/world2d/schema/tuples2d.js +19 -0
  470. package/dist/world2d/system-adapters-2d.d.ts +16 -0
  471. package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
  472. package/dist/world2d/system-adapters-2d.js +37 -0
  473. package/dist/world2d/transform-writer-2d.d.ts +16 -0
  474. package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
  475. package/dist/world2d/transform-writer-2d.js +22 -0
  476. package/dist/world2d/types.d.ts +53 -0
  477. package/dist/world2d/types.d.ts.map +1 -0
  478. package/dist/world2d/types.js +1 -0
  479. package/package.json +18 -4
  480. package/src/adapter/authoring.ts +10 -0
  481. package/src/adapter/first-party-systems.ts +23 -34
  482. package/src/adapter/index.ts +1 -3
  483. package/src/adapter/system-adapter.ts +15 -22
  484. package/src/adapter/vgai-scene-game-adapter.ts +5 -14
  485. package/src/animation/anim-graph-types.ts +12 -43
  486. package/src/animation/animation-clock.ts +479 -0
  487. package/src/animation/camera-ownership.ts +467 -0
  488. package/src/animation/cinematic-cues.ts +451 -0
  489. package/src/animation/clip-map.ts +41 -0
  490. package/src/animation/gsap-registration.ts +184 -0
  491. package/src/animation/theatre-clock-binding.ts +111 -0
  492. package/src/animation/theatre-director.ts +347 -0
  493. package/src/animation/theatre-object-binding.ts +661 -0
  494. package/src/animation/xstate-animation-binding.ts +398 -0
  495. package/src/animation/xstate-animation-meta.ts +282 -0
  496. package/src/audio/index.ts +39 -7
  497. package/src/audio/tone-clock-binding.ts +98 -0
  498. package/src/audio/tone-context.ts +129 -0
  499. package/src/audio/tone-offline-render.ts +167 -0
  500. package/src/audio/wav-encode.ts +119 -0
  501. package/src/core/game-loop.ts +17 -0
  502. package/src/core/types.ts +13 -0
  503. package/src/data/data-asset.ts +167 -0
  504. package/src/data/data-check-core.ts +242 -0
  505. package/src/data/data-ref.ts +145 -0
  506. package/src/data/vite-plugin-data.ts +290 -0
  507. package/src/index.ts +48 -0
  508. package/src/input/input-manager.ts +1206 -32
  509. package/src/input/input-types.ts +155 -3
  510. package/src/input/prompt-labels.ts +122 -0
  511. package/src/input/rebind-controller.ts +105 -0
  512. package/src/input/schema.ts +206 -52
  513. package/src/react/use-data.ts +114 -0
  514. package/src/react/use-selection.tsx +135 -0
  515. package/src/runtime/create-runtime.ts +30 -9
  516. package/src/runtime/render-audio-control.ts +168 -0
  517. package/src/runtime/render-control.ts +522 -0
  518. package/src/runtime/render-seed.ts +79 -0
  519. package/src/runtime/types.ts +0 -5
  520. package/src/scene/asset-loaders.ts +10 -36
  521. package/src/scene/asset-paths.ts +0 -2
  522. package/src/scene/asset-ref-check.ts +248 -0
  523. package/src/scene/parse.ts +133 -0
  524. package/src/scene/scene-loader.ts +81 -96
  525. package/src/scene/schema/animation.ts +30 -79
  526. package/src/scene/schema/entity.ts +20 -0
  527. package/src/scene/schema/index.ts +2 -12
  528. package/src/scene/user-data.ts +8 -9
  529. package/src/setup/setup-renderer.ts +9 -2
  530. package/src/tools/define-tool.ts +152 -0
  531. package/src/animation/anim-graph.ts +0 -406
  532. package/src/animation/anim-system.ts +0 -28
  533. package/src/animation/property-track.ts +0 -178
  534. package/src/animation/schema.ts +0 -204
  535. package/src/audio/ambient.ts +0 -300
  536. package/src/audio/impacts.ts +0 -212
  537. package/src/audio/movement.ts +0 -140
  538. package/src/audio/musical.ts +0 -200
  539. package/src/audio/ui-sounds.ts +0 -171
  540. package/src/audio/vehicle.ts +0 -235
  541. package/src/audio/weapons.ts +0 -152
@@ -0,0 +1,204 @@
1
+ // D-Z2 (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md) — the standalone manifest-mount
2
+ // helper: an ENGINE-side generalization of `examples/tri-world/src/main.ts`'s
3
+ // hand-built `WorldMountSpec[]`.
4
+ //
5
+ // `resolveAllWorlds`/`resolveWorldAdapter` (`packages/editor/src/
6
+ // adapter-resolver.ts`) already do this translation for the EDITOR, but they
7
+ // are Vite-coupled by construction (`/@fs/` dynamic imports of project files
8
+ // through the dev server, §0.1/§0.5 of the design doc) — unusable from a
9
+ // plain static build. This module mirrors their per-kind dispatch
10
+ // (`default-three`/`default-pixi`/`default-react`, `{ module }`, `{ ingest }`)
11
+ // but never imports a project file itself: the caller's OWN bundler already
12
+ // resolved whatever module graph the manifest's worlds need, and hands the
13
+ // already-built pieces in via `entries` (keyed by world id) — no `/@fs/`, no
14
+ // dev server, no editor import.
15
+ //
16
+ // Engine-core react/pixi-free discipline (§0.6, mirrored from
17
+ // `create-runtime.ts`'s own documented rule for its `Pixi2DGameAdapter`/
18
+ // `ReactWorldAdapter` type-only imports): this file never value-imports
19
+ // `pixi.js`, `world2d/pixi-game-adapter.ts`, `react`, or `react-dom` — a
20
+ // pixijs or react world's adapter is ALWAYS supplied already-constructed via
21
+ // `entries[id].adapter` (the caller's own module graph built it, exactly like
22
+ // `tri-world`'s original hand-mount built `new PixiSceneGameAdapter(...)` and
23
+ // a hand-rolled `ReactWorldAdapter` itself). Threejs is different: `three`/
24
+ // `VgaiSceneGameAdapter` are already unconditional dependencies of every
25
+ // caller of `createGameRuntime`'s legacy path (this same file's sibling,
26
+ // immediately below in this directory), so building a `VgaiSceneGameAdapter`
27
+ // here for the common scene-driven/`setup`-driven cases adds no NEW bundle
28
+ // weight — only pixi/react are avoided.
29
+ import { fromSetup, VgaiSceneGameAdapter } from '../adapter';
30
+ import { assertNever } from '../adapter/world-kind';
31
+ import { loadGameManifest, } from '../manifest/load';
32
+ import { createGameRuntime, } from './create-runtime';
33
+ // ---------------------------------------------------------------------------
34
+ // Raw-vs-resolved manifest detection
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Distinguish an already-`loadGameManifest`d {@link ResolvedGameManifest}
38
+ * from a raw (pre-Zod-parse) manifest value. The two shapes differ in
39
+ * exactly one load-bearing way for this check: a `ResolvedWorldEntry.adapter`
40
+ * is `{ type: 'default' | 'module' | 'ingest', identity, ... }`, while a raw
41
+ * `WorldEntry.adapter` is the literal string `'default'` or a bare `{module}`/
42
+ * `{ingest}` object with NO `type`/`identity` fields (`schema.ts`'s
43
+ * `WorldAdapterSchema`). An empty `worlds` array is treated as "not resolved"
44
+ * (falls through to `loadGameManifest`, whose own Zod validation reports the
45
+ * empty-array error, if any, more precisely than a guess here could).
46
+ */
47
+ function looksAlreadyResolved(value) {
48
+ if (typeof value !== 'object' || value === null)
49
+ return false;
50
+ const worlds = value.worlds;
51
+ if (!Array.isArray(worlds) || worlds.length === 0)
52
+ return false;
53
+ return worlds.every((world) => {
54
+ if (typeof world !== 'object' || world === null)
55
+ return false;
56
+ const adapter = world.adapter;
57
+ if (typeof adapter !== 'object' || adapter === null)
58
+ return false;
59
+ const type = adapter.type;
60
+ return type === 'default' || type === 'module' || type === 'ingest';
61
+ });
62
+ }
63
+ /**
64
+ * Exported (E4, docs/unified-world-editor/27-visual-react-editing.md §7) so
65
+ * `mount-game.ts`'s `mountGameFromManifest` composer can share this exact
66
+ * raw-vs-resolved detection instead of re-implementing it — the two modules
67
+ * must always agree on what "already resolved" means.
68
+ */
69
+ export function resolveManifest(raw) {
70
+ if (looksAlreadyResolved(raw))
71
+ return raw;
72
+ return loadGameManifest(raw);
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Per-kind entry -> adapter resolution (mirrors `resolveWorldAdapter`'s
76
+ // per-identity dispatch, `packages/editor/src/adapter-resolver.ts`)
77
+ // ---------------------------------------------------------------------------
78
+ function resolveThreeAdapter(world, entry) {
79
+ if (entry?.adapter)
80
+ return entry.adapter;
81
+ if (world.adapter.type === 'module') {
82
+ throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares a { module } adapter ` +
83
+ `("${world.adapter.module}") — mountManifestWorlds never imports an arbitrary module ` +
84
+ 'path itself (no `/@fs/`, no dev server). Import the module yourself and supply the ' +
85
+ `constructed adapter via entries["${world.id}"] = { kind: 'threejs', adapter }.`);
86
+ }
87
+ if (world.adapter.type === 'ingest') {
88
+ throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares an { ingest } adapter — ` +
89
+ "ingest worlds require the editor's dev-server-backed mount machinery (an EditorStore " +
90
+ "plus iframe/DOM capture, see adapter-resolver.ts's resolveIngestThreeAdapter) and are " +
91
+ 'not supported by mountManifestWorlds (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md D-Z7 — no ' +
92
+ 'porting aids, no hosted ingest routes).');
93
+ }
94
+ // type === 'default'
95
+ if (world.entry !== undefined) {
96
+ if (!entry?.setup) {
97
+ throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares \`entry\` "${world.entry}" ` +
98
+ `— supply entries["${world.id}"] = { kind: 'threejs', setup } (the entry module's ` +
99
+ "exported `setup` function) or { kind: 'threejs', adapter } for full control. Got " +
100
+ `${entry === undefined ? 'no entry at all' : 'an entry with neither `setup` nor `adapter`'}.`);
101
+ }
102
+ return fromSetup(world.id, entry.setup);
103
+ }
104
+ if (world.scene !== undefined) {
105
+ return new VgaiSceneGameAdapter({
106
+ id: world.id,
107
+ scenePath: world.scene,
108
+ componentRegistry: entry?.componentRegistry,
109
+ });
110
+ }
111
+ // Unreachable in practice: `load.ts`'s `checkAdapterSceneEntryRules`
112
+ // requires `scene` or `entry` for every 'default' adapter world at
113
+ // manifest-load time — see `resolveDefaultThreeAdapter`'s identical guard.
114
+ throw new Error(`mountManifestWorlds: world "${world.id}" is default-three with neither \`scene\` nor ` +
115
+ '`entry` — this should have been rejected by manifest validation.');
116
+ }
117
+ function resolvePixiAdapter(world, entry) {
118
+ if (entry?.adapter)
119
+ return entry.adapter;
120
+ throw new Error(`mountManifestWorlds: world "${world.id}" (pixijs) has no entries["${world.id}"] — a pixijs ` +
121
+ 'world always needs a caller-supplied, already-constructed adapter ' +
122
+ `(entries["${world.id}"] = { kind: 'pixijs', adapter }, e.g. \`new PixiSceneGameAdapter(...)\` ` +
123
+ "built from your own already-imported '@engine/world2d') — mountManifestWorlds never " +
124
+ "value-imports pixi.js (mirrors create-runtime.ts's own pixi-free-core discipline).");
125
+ }
126
+ function resolveReactAdapter(world, entry) {
127
+ if (entry?.adapter)
128
+ return entry.adapter;
129
+ throw new Error(`mountManifestWorlds: world "${world.id}" (react) has no entries["${world.id}"] — a react ` +
130
+ 'world always needs a caller-supplied, already-constructed `ReactWorldAdapter` ' +
131
+ `(entries["${world.id}"] = { kind: 'react', adapter }, mounting via your own already-imported ` +
132
+ 'react-dom `createRoot` + your own `<GameProvider>`) — mountManifestWorlds never ' +
133
+ "value-imports react/react-dom (mirrors create-runtime.ts's own react-free-core discipline; " +
134
+ 'see docs/REACT-STATE-BRIDGE.md §2-3).');
135
+ }
136
+ function buildWorldMountSpec(world, entry) {
137
+ if (entry !== undefined && entry.kind !== world.kind) {
138
+ throw new Error(`mountManifestWorlds: entries["${world.id}"] declares kind "${entry.kind}" but the ` +
139
+ `manifest's world "${world.id}" is kind "${world.kind}" — fix the entries key (or the ` +
140
+ 'manifest) so the two agree.');
141
+ }
142
+ const base = {
143
+ id: world.id,
144
+ zOrder: world.zOrder,
145
+ pausable: world.pausable,
146
+ loop: world.loop,
147
+ };
148
+ // `entry`'s `kind` is guaranteed to agree with `world.kind` past the guard
149
+ // above (or `entry` is `undefined`) — TS can't narrow a `Record` lookup
150
+ // through that runtime check, so each branch casts to its own entry shape;
151
+ // the actual safety comes from the mismatch guard, not from the cast.
152
+ if (world.kind === 'threejs') {
153
+ const threeEntry = entry;
154
+ return { ...base, kind: 'threejs', adapter: resolveThreeAdapter(world, threeEntry) };
155
+ }
156
+ if (world.kind === 'pixijs') {
157
+ const pixiEntry = entry;
158
+ return { ...base, kind: 'pixijs', adapter: resolvePixiAdapter(world, pixiEntry) };
159
+ }
160
+ if (world.kind === 'react') {
161
+ const reactEntry = entry;
162
+ return { ...base, kind: 'react', adapter: resolveReactAdapter(world, reactEntry) };
163
+ }
164
+ // Exhaustiveness guard (§7.4-2, same idiom as `resolveAllWorlds`'s own
165
+ // dispatch loop): `world.kind` is the closed `WorldEntry['kind']` union
166
+ // (`z.enum(['threejs','pixijs','react'])`), so a hypothetical 4th kind
167
+ // must fail to compile here, not silently fall through.
168
+ return assertNever(world.kind, 'mountManifestWorlds');
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Entry point
172
+ // ---------------------------------------------------------------------------
173
+ /**
174
+ * Mount every world declared by a `vgai.game.json` manifest onto `container`,
175
+ * standalone — no editor, no dev server. The generalization of
176
+ * `examples/tri-world/src/main.ts`'s hand-built `WorldMountSpec[]` (D-Z2,
177
+ * docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md). Reuses the pure `loadGameManifest`
178
+ * + `createGameRuntime({ worlds })` and mirrors `resolveAllWorlds`'s per-kind
179
+ * dispatch — but every entry the manifest needs beyond what a `default`-
180
+ * adapter scene/entry can express on its own comes from the caller's OWN
181
+ * already-imported module graph (`opts.entries`), never a dynamic import
182
+ * this file performs itself.
183
+ *
184
+ * Degrades loudly (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md D-Z2): a missing
185
+ * entry, a kind/shape mismatch, a `{ module }`/`{ ingest }` adapter with no
186
+ * caller-supplied adapter, or an empty manifest all throw a named `Error`
187
+ * identifying the world id, its kind, and what was expected — never a silent
188
+ * skip or a partially-mounted session.
189
+ */
190
+ export async function mountManifestWorlds(opts) {
191
+ const manifest = resolveManifest(opts.manifest);
192
+ if (manifest.worlds.length === 0) {
193
+ throw new Error('mountManifestWorlds: manifest declares no worlds — nothing to mount.');
194
+ }
195
+ const entries = opts.entries ?? {};
196
+ const worlds = manifest.worlds.map((world) => buildWorldMountSpec(world, entries[world.id]));
197
+ return createGameRuntime({
198
+ container: opts.container,
199
+ worlds,
200
+ width: opts.width ?? manifest.resolution?.width,
201
+ height: opts.height ?? manifest.resolution?.height,
202
+ headless: opts.headless,
203
+ });
204
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Render-mode AUDIO control seam (I6, `docs/AI-NATIVE-AUTHORING-
3
+ * IMPLEMENTATION-SPEC.md` §15 I6 "Encode and Mux" + the audio-capture half of
4
+ * §13 G4). This is `render-control.ts`'s sibling for the audio side: where
5
+ * that module publishes `window.__vgaiRender` (exact-time seeks + composited
6
+ * frame passes), THIS module publishes `window.__vgaiRenderAudio` — an
7
+ * OPT-IN surface a render-mode page installs only when it declares a Tone
8
+ * score, so `vgai render-cinematic` (`packages/vgai-cli/src/render-
9
+ * cinematic.ts`) can detect "this cinematic has a deterministic audio track"
10
+ * with a single property check (`__vgaiRenderAudio?.hasAudio === true`)
11
+ * rather than needing a schema field threaded through every fixture.
12
+ *
13
+ * Deliberately a SEPARATE global from `__vgaiRender`/`VgaiRenderHarness`
14
+ * (`render-control.ts`), not an extra method bolted onto that interface:
15
+ * every existing render-mode page (I0's `render-cinematic` fixture, I8's
16
+ * `reference-cinematic`) has no Tone score at all, and this keeps their
17
+ * bundles/tests completely untouched — `render-control.ts` itself is not
18
+ * modified by this unit.
19
+ *
20
+ * ## Why `renderAudio` takes `(start, end)` and `compose` is a FACTORY
21
+ *
22
+ * `Tone.Offline` (via `audio/tone-offline-render.ts`) gives the composition
23
+ * callback LOCAL time 0 at whatever `start` was requested — an offline
24
+ * render of `[10, 10.72)` schedules its first event at LOCAL time 0, not
25
+ * absolute time 10 (see that module's own doc comment). A render-mode page
26
+ * authors its score in ABSOLUTE/canonical time (e.g. "a note at the same
27
+ * t=1.2s the video's Director cut happens"), so the actual Tone-native
28
+ * compose callback passed to `renderToneOffline` must subtract the
29
+ * requested range's `start` from every scheduled event time. Rather than
30
+ * have every fixture re-derive that subtraction inline, this module's
31
+ * {@link RenderAudioControlOptions.compose} is a FACTORY: called once per
32
+ * `renderAudio(start, end)` invocation with `start`, returning the actual
33
+ * `Tone.Offline`-native callback closed over that offset. This is the
34
+ * concrete fix for the G12 review follow-up named in this unit's build
35
+ * brief ("renderToneOffline gives the composition LOCAL time 0 at `start`,
36
+ * so your composition must close over the range/offset").
37
+ *
38
+ * ## Wire format — why WAV bytes cross as base64, not a raw sample array
39
+ *
40
+ * `page.evaluate`'s return value is JSON-serialized; a `Float32Array`/
41
+ * typed-array result would either fail to serialize or be coerced into a
42
+ * verbose `{ "0": ..., "1": ... }` object, and a plain JS number array of
43
+ * (potentially) hundreds of thousands of floats is slow to serialize and
44
+ * bloats the IPC payload. Encoding the FULL WAV file (header + 16-bit PCM
45
+ * data, `audio/wav-encode.ts`) to a single base64 string in-page keeps the
46
+ * Node-side capture driver (`render-cinematic.ts`) to one
47
+ * `Buffer.from(wavBase64, 'base64')` + one `writeFile` — no PCM assembly
48
+ * logic duplicated on the Node side at all.
49
+ */
50
+ import { type ToneOfflineComposeFn } from '../audio/tone-offline-render';
51
+ /** Builds the actual `Tone.Offline`-native compose callback for a render
52
+ * starting at `rangeStart` (absolute/canonical seconds) — see the module
53
+ * doc's "closes over the range/offset" section above. */
54
+ export type RenderAudioComposeFactory = (rangeStart: number) => ToneOfflineComposeFn;
55
+ export interface RenderAudioControlOptions {
56
+ /** See {@link RenderAudioComposeFactory}. */
57
+ readonly compose: RenderAudioComposeFactory;
58
+ /** Output channel count. Default 2 (stereo) — same default as `tone-offline-render.ts`. */
59
+ readonly channels?: number;
60
+ /** Output sample rate. Default 44100 — same default as `tone-offline-render.ts`. */
61
+ readonly sampleRate?: number;
62
+ /** Where to publish the harness. Defaults to the real `window` — override in a unit test. */
63
+ readonly target?: Record<string, unknown>;
64
+ /** Where to read `?vgai-render=1` from. Defaults to `window.location`. */
65
+ readonly location?: {
66
+ readonly search: string;
67
+ };
68
+ }
69
+ /** One offline audio render, encoded as a complete WAV file — the exact
70
+ * shape `render-cinematic.ts`'s capture driver reads back via `page.evaluate`. */
71
+ export interface RenderAudioResult {
72
+ /** Base64 of a complete little-endian 16-bit-PCM RIFF/WAVE file (see
73
+ * `audio/wav-encode.ts`) — decode with `Buffer.from(wavBase64, 'base64')`. */
74
+ readonly wavBase64: string;
75
+ readonly sampleRate: number;
76
+ readonly channels: number;
77
+ readonly durationSeconds: number;
78
+ /** RMS/peak over the raw PCM, BEFORE 16-bit quantization — lets a caller
79
+ * assert "genuinely non-silent audio, not a muxed-in silent track"
80
+ * without re-decoding the WAV it just received. */
81
+ readonly rms: number;
82
+ readonly peak: number;
83
+ }
84
+ /** The `window.__vgaiRenderAudio` surface. Presence of this global (guarded
85
+ * by `hasAudio: true`, never a bare `undefined`/`false` value on a present
86
+ * object) IS the "this cinematic declares a Tone score" signal `render-
87
+ * cinematic.ts` checks — see this module's own top doc comment. */
88
+ export interface VgaiRenderAudioHarness {
89
+ readonly hasAudio: true;
90
+ /** Render `[start, end)` (absolute/canonical seconds, exactly the same
91
+ * range `window.__vgaiRender`'s frame walk covers) offline via
92
+ * `Tone.Offline`, returning a complete WAV file. Deterministic: identical
93
+ * `(start, end)` on an unchanged score produces byte-identical
94
+ * `wavBase64` every call (the same `Tone.Offline` determinism
95
+ * `tone-offline-render.ts`/G2 already proves — this module adds no
96
+ * additional source of nondeterminism). */
97
+ renderAudio(start: number, end: number): Promise<RenderAudioResult>;
98
+ }
99
+ /**
100
+ * Build (and, when render mode is actually requested, publish) the
101
+ * `window.__vgaiRenderAudio` harness — same AC-4-shaped production
102
+ * protection as `installRenderControlHarness`: even called unconditionally
103
+ * on every boot, this only ever constructs/attaches the harness when
104
+ * `isRenderModeRequested(location)` is true, so a normal production gameplay
105
+ * page never gets `window.__vgaiRenderAudio` (and normal play never
106
+ * re-renders its music through an offline context — that would be a
107
+ * separate, much stranger bug).
108
+ */
109
+ export declare function installRenderAudioHarness(opts: RenderAudioControlOptions): VgaiRenderAudioHarness | undefined;
110
+ //# sourceMappingURL=render-audio-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-audio-control.d.ts","sourceRoot":"","sources":["../../src/runtime/render-audio-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAI5F;;0DAE0D;AAC1D,MAAM,MAAM,yBAAyB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,oBAAoB,CAAC;AAErF,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED;mFACmF;AACnF,MAAM,WAAW,iBAAiB;IAChC;mFAC+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;wDAEoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;oEAGoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB;;;;;;gDAM4C;IAC5C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrE;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,GAC9B,sBAAsB,GAAG,SAAS,CAoCpC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Render-mode AUDIO control seam (I6, `docs/AI-NATIVE-AUTHORING-
3
+ * IMPLEMENTATION-SPEC.md` §15 I6 "Encode and Mux" + the audio-capture half of
4
+ * §13 G4). This is `render-control.ts`'s sibling for the audio side: where
5
+ * that module publishes `window.__vgaiRender` (exact-time seeks + composited
6
+ * frame passes), THIS module publishes `window.__vgaiRenderAudio` — an
7
+ * OPT-IN surface a render-mode page installs only when it declares a Tone
8
+ * score, so `vgai render-cinematic` (`packages/vgai-cli/src/render-
9
+ * cinematic.ts`) can detect "this cinematic has a deterministic audio track"
10
+ * with a single property check (`__vgaiRenderAudio?.hasAudio === true`)
11
+ * rather than needing a schema field threaded through every fixture.
12
+ *
13
+ * Deliberately a SEPARATE global from `__vgaiRender`/`VgaiRenderHarness`
14
+ * (`render-control.ts`), not an extra method bolted onto that interface:
15
+ * every existing render-mode page (I0's `render-cinematic` fixture, I8's
16
+ * `reference-cinematic`) has no Tone score at all, and this keeps their
17
+ * bundles/tests completely untouched — `render-control.ts` itself is not
18
+ * modified by this unit.
19
+ *
20
+ * ## Why `renderAudio` takes `(start, end)` and `compose` is a FACTORY
21
+ *
22
+ * `Tone.Offline` (via `audio/tone-offline-render.ts`) gives the composition
23
+ * callback LOCAL time 0 at whatever `start` was requested — an offline
24
+ * render of `[10, 10.72)` schedules its first event at LOCAL time 0, not
25
+ * absolute time 10 (see that module's own doc comment). A render-mode page
26
+ * authors its score in ABSOLUTE/canonical time (e.g. "a note at the same
27
+ * t=1.2s the video's Director cut happens"), so the actual Tone-native
28
+ * compose callback passed to `renderToneOffline` must subtract the
29
+ * requested range's `start` from every scheduled event time. Rather than
30
+ * have every fixture re-derive that subtraction inline, this module's
31
+ * {@link RenderAudioControlOptions.compose} is a FACTORY: called once per
32
+ * `renderAudio(start, end)` invocation with `start`, returning the actual
33
+ * `Tone.Offline`-native callback closed over that offset. This is the
34
+ * concrete fix for the G12 review follow-up named in this unit's build
35
+ * brief ("renderToneOffline gives the composition LOCAL time 0 at `start`,
36
+ * so your composition must close over the range/offset").
37
+ *
38
+ * ## Wire format — why WAV bytes cross as base64, not a raw sample array
39
+ *
40
+ * `page.evaluate`'s return value is JSON-serialized; a `Float32Array`/
41
+ * typed-array result would either fail to serialize or be coerced into a
42
+ * verbose `{ "0": ..., "1": ... }` object, and a plain JS number array of
43
+ * (potentially) hundreds of thousands of floats is slow to serialize and
44
+ * bloats the IPC payload. Encoding the FULL WAV file (header + 16-bit PCM
45
+ * data, `audio/wav-encode.ts`) to a single base64 string in-page keeps the
46
+ * Node-side capture driver (`render-cinematic.ts`) to one
47
+ * `Buffer.from(wavBase64, 'base64')` + one `writeFile` — no PCM assembly
48
+ * logic duplicated on the Node side at all.
49
+ */
50
+ import { renderToneOffline } from '../audio/tone-offline-render';
51
+ import { encodeWav16, pcmStats } from '../audio/wav-encode';
52
+ import { isRenderModeRequested } from './render-control';
53
+ /**
54
+ * Build (and, when render mode is actually requested, publish) the
55
+ * `window.__vgaiRenderAudio` harness — same AC-4-shaped production
56
+ * protection as `installRenderControlHarness`: even called unconditionally
57
+ * on every boot, this only ever constructs/attaches the harness when
58
+ * `isRenderModeRequested(location)` is true, so a normal production gameplay
59
+ * page never gets `window.__vgaiRenderAudio` (and normal play never
60
+ * re-renders its music through an offline context — that would be a
61
+ * separate, much stranger bug).
62
+ */
63
+ export function installRenderAudioHarness(opts) {
64
+ const location = opts.location ?? window.location;
65
+ if (!isRenderModeRequested(location))
66
+ return undefined;
67
+ const target = opts.target ?? window;
68
+ const { compose, channels, sampleRate } = opts;
69
+ const harness = {
70
+ hasAudio: true,
71
+ async renderAudio(start, end) {
72
+ const rendered = await renderToneOffline({
73
+ start,
74
+ end,
75
+ ...(channels !== undefined ? { channels } : {}),
76
+ ...(sampleRate !== undefined ? { sampleRate } : {}),
77
+ compose: compose(start),
78
+ });
79
+ const channelData = [];
80
+ for (let ch = 0; ch < rendered.buffer.numberOfChannels; ch++) {
81
+ channelData.push(rendered.buffer.getChannelData(ch));
82
+ }
83
+ const wavBytes = encodeWav16({ channelData, sampleRate: rendered.buffer.sampleRate });
84
+ const stats = pcmStats(channelData);
85
+ return {
86
+ wavBase64: uint8ArrayToBase64(wavBytes),
87
+ sampleRate: rendered.buffer.sampleRate,
88
+ channels: rendered.buffer.numberOfChannels,
89
+ durationSeconds: rendered.durationSeconds,
90
+ rms: stats.rms,
91
+ peak: stats.peak,
92
+ };
93
+ },
94
+ };
95
+ target['__vgaiRenderAudio'] = harness;
96
+ return harness;
97
+ }
98
+ /** Browser-native base64 encode (`btoa`) over a `Uint8Array`, chunked so a
99
+ * multi-second stereo WAV doesn't blow `String.fromCharCode`'s argument-count
100
+ * limit in one call. Node has no `btoa` for arbitrary bytes reliably across
101
+ * versions, but this module only ever runs in the browser (render-mode
102
+ * pages), matching `tone-offline-render.ts`'s own "browser-only" contract. */
103
+ function uint8ArrayToBase64(bytes) {
104
+ const CHUNK_SIZE = 0x8000;
105
+ let binary = '';
106
+ for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {
107
+ const chunk = bytes.subarray(i, i + CHUNK_SIZE);
108
+ binary += String.fromCharCode(...chunk);
109
+ }
110
+ return btoa(binary);
111
+ }