@vgai/engine 0.3.0 → 0.4.0-canary.20260715.1

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 (559) hide show
  1. package/package.json +8 -2
  2. package/schemas/engine-api.json +124 -0
  3. package/schemas/engine-api.md +53 -0
  4. package/schemas/engine-capabilities.json +124 -0
  5. package/schemas/inputmap.schema.json +314 -0
  6. package/schemas/mat.schema.json +286 -0
  7. package/schemas/prefab.schema.json +10148 -0
  8. package/schemas/scn2d.schema.json +475 -0
  9. package/schemas/vgai-game.schema.json +383 -0
  10. package/schemas/vscn.schema.json +11007 -0
  11. package/src/adapter/{world-kind.ts → adapter-surface.ts} +6 -6
  12. package/src/adapter/authoring.ts +67 -0
  13. package/src/adapter/game-adapter.ts +8 -8
  14. package/src/adapter/host-context.ts +2 -4
  15. package/src/adapter/index.ts +3 -1
  16. package/src/adapter/system-adapter.ts +73 -0
  17. package/src/adapter/vgai-scene-game-adapter.ts +239 -180
  18. package/src/animation/xstate-animation-binding.ts +300 -262
  19. package/src/animation/xstate-animation-meta.ts +50 -13
  20. package/src/character/cloth-sim.ts +533 -0
  21. package/src/character/spring-chain.ts +307 -0
  22. package/src/core/game-loop.ts +41 -3
  23. package/src/core/seeded-random.ts +161 -0
  24. package/src/core/system-runner.ts +20 -3
  25. package/src/core/types.ts +37 -0
  26. package/src/data/data-asset.ts +1 -1
  27. package/src/dev/performance-profiler.ts +213 -0
  28. package/src/dev/webgl-gpu-timer.ts +53 -0
  29. package/src/ecs/component-manager.ts +45 -12
  30. package/src/ecs/game-component.ts +95 -11
  31. package/src/humanoid/bake.operation.ts +326 -0
  32. package/src/humanoid/body.ts +663 -0
  33. package/src/humanoid/clips.ts +149 -0
  34. package/src/humanoid/compose.ts +209 -0
  35. package/src/humanoid/generate.ts +189 -0
  36. package/src/humanoid/index.ts +36 -0
  37. package/src/humanoid/schema.ts +108 -0
  38. package/src/humanoid/skeleton.ts +345 -0
  39. package/src/index.ts +5 -5
  40. package/src/input/input-manager.ts +701 -22
  41. package/src/input/input-types.ts +5 -2
  42. package/src/manifest/index.ts +5 -5
  43. package/src/manifest/load.ts +125 -72
  44. package/src/manifest/schema.ts +362 -255
  45. package/src/react/game-state.tsx +135 -32
  46. package/src/react/root-adapter.tsx +49 -0
  47. package/src/react/unmanaged-root-detector.ts +66 -0
  48. package/src/react/use-data.ts +12 -2
  49. package/src/runtime/create-runtime.ts +100 -282
  50. package/src/runtime/debug-bridge.ts +483 -0
  51. package/src/runtime/debug-registry.ts +856 -0
  52. package/src/runtime/game.ts +342 -93
  53. package/src/runtime/gameplay-rng-trap.ts +134 -0
  54. package/src/runtime/input-router.ts +7 -7
  55. package/src/runtime/mount-game.ts +40 -38
  56. package/src/runtime/mount-manifest.ts +169 -37
  57. package/src/runtime/render-control.ts +13 -13
  58. package/src/runtime/render-seed.ts +1 -1
  59. package/src/runtime/state-bridge.ts +24 -10
  60. package/src/runtime/types.ts +110 -28
  61. package/src/scene/asset-registry.ts +22 -0
  62. package/src/scene/component-registry.ts +14 -3
  63. package/src/scene/defaults.ts +1 -0
  64. package/src/scene/light-camera-factory.ts +11 -3
  65. package/src/scene/scene-apply.ts +55 -4
  66. package/src/scene/scene-loader.ts +10 -27
  67. package/src/scene/scene-types.ts +0 -1
  68. package/src/scene/schema/index.ts +0 -34
  69. package/src/scene/schema/light.ts +16 -1
  70. package/src/scene/schema/material.ts +96 -91
  71. package/src/scene/schema/scene-file.ts +1 -7
  72. package/src/scene/user-data.ts +14 -1
  73. package/src/setup/setup-renderer.ts +1 -1
  74. package/src/tools/define-tool.ts +50 -11
  75. package/src/world2d/authoring-2d.ts +17 -1
  76. package/src/world2d/collision-2d.ts +1 -1
  77. package/src/world2d/pixi-game-adapter.ts +19 -17
  78. package/src/world2d/scene2d-loader.ts +1 -0
  79. package/src/world2d/types.ts +8 -2
  80. package/dist/adapter/authoring.d.ts +0 -404
  81. package/dist/adapter/authoring.d.ts.map +0 -1
  82. package/dist/adapter/authoring.js +0 -22
  83. package/dist/adapter/colyseus-networking-adapter.d.ts +0 -43
  84. package/dist/adapter/colyseus-networking-adapter.d.ts.map +0 -1
  85. package/dist/adapter/colyseus-networking-adapter.js +0 -38
  86. package/dist/adapter/first-party-systems.d.ts +0 -38
  87. package/dist/adapter/first-party-systems.d.ts.map +0 -1
  88. package/dist/adapter/first-party-systems.js +0 -77
  89. package/dist/adapter/game-adapter.d.ts +0 -133
  90. package/dist/adapter/game-adapter.d.ts.map +0 -1
  91. package/dist/adapter/game-adapter.js +0 -10
  92. package/dist/adapter/host-context.d.ts +0 -73
  93. package/dist/adapter/host-context.d.ts.map +0 -1
  94. package/dist/adapter/host-context.js +0 -16
  95. package/dist/adapter/index.d.ts +0 -22
  96. package/dist/adapter/index.d.ts.map +0 -1
  97. package/dist/adapter/index.js +0 -15
  98. package/dist/adapter/ingest/game-contract.d.ts +0 -53
  99. package/dist/adapter/ingest/game-contract.d.ts.map +0 -1
  100. package/dist/adapter/ingest/game-contract.js +0 -30
  101. package/dist/adapter/ingest/overlay-applier.d.ts +0 -118
  102. package/dist/adapter/ingest/overlay-applier.d.ts.map +0 -1
  103. package/dist/adapter/ingest/overlay-applier.js +0 -132
  104. package/dist/adapter/ingest/overlay-apply.d.ts +0 -60
  105. package/dist/adapter/ingest/overlay-apply.d.ts.map +0 -1
  106. package/dist/adapter/ingest/overlay-apply.js +0 -101
  107. package/dist/adapter/ingest/overlay-file.d.ts +0 -79
  108. package/dist/adapter/ingest/overlay-file.d.ts.map +0 -1
  109. package/dist/adapter/ingest/overlay-file.js +0 -66
  110. package/dist/adapter/ingest/overlay-report.d.ts +0 -113
  111. package/dist/adapter/ingest/overlay-report.d.ts.map +0 -1
  112. package/dist/adapter/ingest/overlay-report.js +0 -103
  113. package/dist/adapter/ingest/scene-capture.d.ts +0 -97
  114. package/dist/adapter/ingest/scene-capture.d.ts.map +0 -1
  115. package/dist/adapter/ingest/scene-capture.js +0 -248
  116. package/dist/adapter/ingest/upstream-pin.d.ts +0 -47
  117. package/dist/adapter/ingest/upstream-pin.d.ts.map +0 -1
  118. package/dist/adapter/ingest/upstream-pin.js +0 -50
  119. package/dist/adapter/loop-gate-report.d.ts +0 -34
  120. package/dist/adapter/loop-gate-report.d.ts.map +0 -1
  121. package/dist/adapter/loop-gate-report.js +0 -37
  122. package/dist/adapter/rapier-physics-adapter.d.ts +0 -12
  123. package/dist/adapter/rapier-physics-adapter.d.ts.map +0 -1
  124. package/dist/adapter/rapier-physics-adapter.js +0 -46
  125. package/dist/adapter/system-adapter.d.ts +0 -133
  126. package/dist/adapter/system-adapter.d.ts.map +0 -1
  127. package/dist/adapter/system-adapter.js +0 -13
  128. package/dist/adapter/transform.d.ts +0 -18
  129. package/dist/adapter/transform.d.ts.map +0 -1
  130. package/dist/adapter/transform.js +0 -1
  131. package/dist/adapter/vgai-scene-game-adapter.d.ts +0 -116
  132. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +0 -1
  133. package/dist/adapter/vgai-scene-game-adapter.js +0 -714
  134. package/dist/adapter/world-kind.d.ts +0 -30
  135. package/dist/adapter/world-kind.d.ts.map +0 -1
  136. package/dist/adapter/world-kind.js +0 -18
  137. package/dist/ai/navigation.d.ts +0 -64
  138. package/dist/ai/navigation.d.ts.map +0 -1
  139. package/dist/ai/navigation.js +0 -133
  140. package/dist/animation/anim-graph-types.d.ts +0 -25
  141. package/dist/animation/anim-graph-types.d.ts.map +0 -1
  142. package/dist/animation/anim-graph-types.js +0 -1
  143. package/dist/animation/animation-clock.d.ts +0 -213
  144. package/dist/animation/animation-clock.d.ts.map +0 -1
  145. package/dist/animation/animation-clock.js +0 -301
  146. package/dist/animation/blend-node.d.ts +0 -22
  147. package/dist/animation/blend-node.d.ts.map +0 -1
  148. package/dist/animation/blend-node.js +0 -97
  149. package/dist/animation/camera-ownership.d.ts +0 -250
  150. package/dist/animation/camera-ownership.d.ts.map +0 -1
  151. package/dist/animation/camera-ownership.js +0 -169
  152. package/dist/animation/cinematic-cues.d.ts +0 -200
  153. package/dist/animation/cinematic-cues.d.ts.map +0 -1
  154. package/dist/animation/cinematic-cues.js +0 -213
  155. package/dist/animation/clip-map.d.ts +0 -12
  156. package/dist/animation/clip-map.d.ts.map +0 -1
  157. package/dist/animation/clip-map.js +0 -37
  158. package/dist/animation/gsap-registration.d.ts +0 -119
  159. package/dist/animation/gsap-registration.d.ts.map +0 -1
  160. package/dist/animation/gsap-registration.js +0 -92
  161. package/dist/animation/theatre-clock-binding.d.ts +0 -89
  162. package/dist/animation/theatre-clock-binding.d.ts.map +0 -1
  163. package/dist/animation/theatre-clock-binding.js +0 -29
  164. package/dist/animation/theatre-director.d.ts +0 -242
  165. package/dist/animation/theatre-director.d.ts.map +0 -1
  166. package/dist/animation/theatre-director.js +0 -235
  167. package/dist/animation/theatre-object-binding.d.ts +0 -305
  168. package/dist/animation/theatre-object-binding.d.ts.map +0 -1
  169. package/dist/animation/theatre-object-binding.js +0 -351
  170. package/dist/animation/xstate-animation-binding.d.ts +0 -111
  171. package/dist/animation/xstate-animation-binding.d.ts.map +0 -1
  172. package/dist/animation/xstate-animation-binding.js +0 -307
  173. package/dist/animation/xstate-animation-meta.d.ts +0 -228
  174. package/dist/animation/xstate-animation-meta.d.ts.map +0 -1
  175. package/dist/animation/xstate-animation-meta.js +0 -221
  176. package/dist/assets.d.ts +0 -26
  177. package/dist/assets.d.ts.map +0 -1
  178. package/dist/assets.js +0 -55
  179. package/dist/audio/index.d.ts +0 -4
  180. package/dist/audio/index.d.ts.map +0 -1
  181. package/dist/audio/index.js +0 -24
  182. package/dist/audio/tone-clock-binding.d.ts +0 -75
  183. package/dist/audio/tone-clock-binding.d.ts.map +0 -1
  184. package/dist/audio/tone-clock-binding.js +0 -29
  185. package/dist/audio/tone-context.d.ts +0 -114
  186. package/dist/audio/tone-context.d.ts.map +0 -1
  187. package/dist/audio/tone-context.js +0 -39
  188. package/dist/audio/tone-offline-render.d.ts +0 -90
  189. package/dist/audio/tone-offline-render.d.ts.map +0 -1
  190. package/dist/audio/tone-offline-render.js +0 -56
  191. package/dist/audio/wav-encode.d.ts +0 -38
  192. package/dist/audio/wav-encode.d.ts.map +0 -1
  193. package/dist/audio/wav-encode.js +0 -97
  194. package/dist/core/game-loop.d.ts +0 -21
  195. package/dist/core/game-loop.d.ts.map +0 -1
  196. package/dist/core/game-loop.js +0 -130
  197. package/dist/core/system-runner.d.ts +0 -120
  198. package/dist/core/system-runner.d.ts.map +0 -1
  199. package/dist/core/system-runner.js +0 -286
  200. package/dist/core/types.d.ts +0 -58
  201. package/dist/core/types.d.ts.map +0 -1
  202. package/dist/core/types.js +0 -25
  203. package/dist/data/data-asset.d.ts +0 -101
  204. package/dist/data/data-asset.d.ts.map +0 -1
  205. package/dist/data/data-asset.js +0 -122
  206. package/dist/data/data-check-core.d.ts +0 -110
  207. package/dist/data/data-check-core.d.ts.map +0 -1
  208. package/dist/data/data-check-core.js +0 -178
  209. package/dist/data/data-ref.d.ts +0 -79
  210. package/dist/data/data-ref.d.ts.map +0 -1
  211. package/dist/data/data-ref.js +0 -130
  212. package/dist/data/vite-plugin-data.d.ts +0 -79
  213. package/dist/data/vite-plugin-data.d.ts.map +0 -1
  214. package/dist/data/vite-plugin-data.js +0 -217
  215. package/dist/dev/console-bridge.d.ts +0 -22
  216. package/dist/dev/console-bridge.d.ts.map +0 -1
  217. package/dist/dev/console-bridge.js +0 -71
  218. package/dist/dev/debug-draw.d.ts +0 -24
  219. package/dist/dev/debug-draw.d.ts.map +0 -1
  220. package/dist/dev/debug-draw.js +0 -73
  221. package/dist/dev/logger.d.ts +0 -30
  222. package/dist/dev/logger.d.ts.map +0 -1
  223. package/dist/dev/logger.js +0 -90
  224. package/dist/ecs/component-manager.d.ts +0 -189
  225. package/dist/ecs/component-manager.d.ts.map +0 -1
  226. package/dist/ecs/component-manager.js +0 -676
  227. package/dist/ecs/game-component.d.ts +0 -97
  228. package/dist/ecs/game-component.d.ts.map +0 -1
  229. package/dist/ecs/game-component.js +0 -80
  230. package/dist/ecs/hmr-swap-report.d.ts +0 -53
  231. package/dist/ecs/hmr-swap-report.d.ts.map +0 -1
  232. package/dist/ecs/hmr-swap-report.js +0 -55
  233. package/dist/index.d.ts +0 -37
  234. package/dist/index.d.ts.map +0 -1
  235. package/dist/index.js +0 -30
  236. package/dist/input/input-manager.d.ts +0 -596
  237. package/dist/input/input-manager.d.ts.map +0 -1
  238. package/dist/input/input-manager.js +0 -1564
  239. package/dist/input/input-types.d.ts +0 -171
  240. package/dist/input/input-types.d.ts.map +0 -1
  241. package/dist/input/input-types.js +0 -1
  242. package/dist/input/prompt-labels.d.ts +0 -21
  243. package/dist/input/prompt-labels.d.ts.map +0 -1
  244. package/dist/input/prompt-labels.js +0 -121
  245. package/dist/input/rebind-controller.d.ts +0 -59
  246. package/dist/input/rebind-controller.d.ts.map +0 -1
  247. package/dist/input/rebind-controller.js +0 -85
  248. package/dist/input/schema.d.ts +0 -16
  249. package/dist/input/schema.d.ts.map +0 -1
  250. package/dist/input/schema.js +0 -228
  251. package/dist/loader.d.ts +0 -43
  252. package/dist/loader.d.ts.map +0 -1
  253. package/dist/loader.js +0 -59
  254. package/dist/manifest/index.d.ts +0 -5
  255. package/dist/manifest/index.d.ts.map +0 -1
  256. package/dist/manifest/index.js +0 -8
  257. package/dist/manifest/load-file.d.ts +0 -4
  258. package/dist/manifest/load-file.d.ts.map +0 -1
  259. package/dist/manifest/load-file.js +0 -14
  260. package/dist/manifest/load.d.ts +0 -117
  261. package/dist/manifest/load.d.ts.map +0 -1
  262. package/dist/manifest/load.js +0 -255
  263. package/dist/manifest/schema.d.ts +0 -173
  264. package/dist/manifest/schema.d.ts.map +0 -1
  265. package/dist/manifest/schema.js +0 -302
  266. package/dist/physics/collision-system.d.ts +0 -41
  267. package/dist/physics/collision-system.d.ts.map +0 -1
  268. package/dist/physics/collision-system.js +0 -64
  269. package/dist/physics/physics-registry.d.ts +0 -45
  270. package/dist/physics/physics-registry.d.ts.map +0 -1
  271. package/dist/physics/physics-registry.js +0 -65
  272. package/dist/physics/transform-writer.d.ts +0 -16
  273. package/dist/physics/transform-writer.d.ts.map +0 -1
  274. package/dist/physics/transform-writer.js +0 -38
  275. package/dist/physics/trigger-dispatch.d.ts +0 -24
  276. package/dist/physics/trigger-dispatch.d.ts.map +0 -1
  277. package/dist/physics/trigger-dispatch.js +0 -80
  278. package/dist/react/game-state.d.ts +0 -105
  279. package/dist/react/game-state.d.ts.map +0 -1
  280. package/dist/react/game-state.js +0 -144
  281. package/dist/react/use-data.d.ts +0 -60
  282. package/dist/react/use-data.d.ts.map +0 -1
  283. package/dist/react/use-data.js +0 -96
  284. package/dist/react/use-selection.d.ts +0 -75
  285. package/dist/react/use-selection.d.ts.map +0 -1
  286. package/dist/react/use-selection.js +0 -90
  287. package/dist/render/auto-batcher.d.ts +0 -34
  288. package/dist/render/auto-batcher.d.ts.map +0 -1
  289. package/dist/render/auto-batcher.js +0 -140
  290. package/dist/render/render-batch-system.d.ts +0 -33
  291. package/dist/render/render-batch-system.d.ts.map +0 -1
  292. package/dist/render/render-batch-system.js +0 -230
  293. package/dist/render/render-features.d.ts +0 -47
  294. package/dist/render/render-features.d.ts.map +0 -1
  295. package/dist/render/render-features.js +0 -105
  296. package/dist/render/render-settings.d.ts +0 -36
  297. package/dist/render/render-settings.d.ts.map +0 -1
  298. package/dist/render/render-settings.js +0 -51
  299. package/dist/runtime/create-runtime.d.ts +0 -280
  300. package/dist/runtime/create-runtime.d.ts.map +0 -1
  301. package/dist/runtime/create-runtime.js +0 -795
  302. package/dist/runtime/frame-selector-cache.d.ts +0 -41
  303. package/dist/runtime/frame-selector-cache.d.ts.map +0 -1
  304. package/dist/runtime/frame-selector-cache.js +0 -65
  305. package/dist/runtime/game.d.ts +0 -433
  306. package/dist/runtime/game.d.ts.map +0 -1
  307. package/dist/runtime/game.js +0 -569
  308. package/dist/runtime/input-router.d.ts +0 -78
  309. package/dist/runtime/input-router.d.ts.map +0 -1
  310. package/dist/runtime/input-router.js +0 -171
  311. package/dist/runtime/mount-game.d.ts +0 -129
  312. package/dist/runtime/mount-game.d.ts.map +0 -1
  313. package/dist/runtime/mount-game.js +0 -152
  314. package/dist/runtime/mount-manifest.d.ts +0 -119
  315. package/dist/runtime/mount-manifest.d.ts.map +0 -1
  316. package/dist/runtime/mount-manifest.js +0 -204
  317. package/dist/runtime/render-audio-control.d.ts +0 -110
  318. package/dist/runtime/render-audio-control.d.ts.map +0 -1
  319. package/dist/runtime/render-audio-control.js +0 -111
  320. package/dist/runtime/render-control.d.ts +0 -291
  321. package/dist/runtime/render-control.d.ts.map +0 -1
  322. package/dist/runtime/render-control.js +0 -264
  323. package/dist/runtime/render-seed.d.ts +0 -57
  324. package/dist/runtime/render-seed.d.ts.map +0 -1
  325. package/dist/runtime/render-seed.js +0 -74
  326. package/dist/runtime/scene-ui-bridge.d.ts +0 -69
  327. package/dist/runtime/scene-ui-bridge.d.ts.map +0 -1
  328. package/dist/runtime/scene-ui-bridge.js +0 -23
  329. package/dist/runtime/scene-ui-data.d.ts +0 -13
  330. package/dist/runtime/scene-ui-data.d.ts.map +0 -1
  331. package/dist/runtime/scene-ui-data.js +0 -92
  332. package/dist/runtime/state-bridge.d.ts +0 -47
  333. package/dist/runtime/state-bridge.d.ts.map +0 -1
  334. package/dist/runtime/state-bridge.js +0 -53
  335. package/dist/runtime/types.d.ts +0 -179
  336. package/dist/runtime/types.d.ts.map +0 -1
  337. package/dist/runtime/types.js +0 -1
  338. package/dist/scene/asset-loaders.d.ts +0 -79
  339. package/dist/scene/asset-loaders.d.ts.map +0 -1
  340. package/dist/scene/asset-loaders.js +0 -141
  341. package/dist/scene/asset-paths.d.ts +0 -11
  342. package/dist/scene/asset-paths.d.ts.map +0 -1
  343. package/dist/scene/asset-paths.js +0 -108
  344. package/dist/scene/asset-ref-check.d.ts +0 -88
  345. package/dist/scene/asset-ref-check.d.ts.map +0 -1
  346. package/dist/scene/asset-ref-check.js +0 -214
  347. package/dist/scene/asset-registry.d.ts +0 -30
  348. package/dist/scene/asset-registry.d.ts.map +0 -1
  349. package/dist/scene/asset-registry.js +0 -50
  350. package/dist/scene/collider-dimensions.d.ts +0 -63
  351. package/dist/scene/collider-dimensions.d.ts.map +0 -1
  352. package/dist/scene/collider-dimensions.js +0 -98
  353. package/dist/scene/component-registry.d.ts +0 -17
  354. package/dist/scene/component-registry.d.ts.map +0 -1
  355. package/dist/scene/component-registry.js +0 -28
  356. package/dist/scene/defaults.d.ts +0 -252
  357. package/dist/scene/defaults.d.ts.map +0 -1
  358. package/dist/scene/defaults.js +0 -151
  359. package/dist/scene/geometries/index.d.ts +0 -8
  360. package/dist/scene/geometries/index.d.ts.map +0 -1
  361. package/dist/scene/geometries/index.js +0 -7
  362. package/dist/scene/geometries/terrain.d.ts +0 -2
  363. package/dist/scene/geometries/terrain.d.ts.map +0 -1
  364. package/dist/scene/geometries/terrain.js +0 -37
  365. package/dist/scene/geometry-registry.d.ts +0 -24
  366. package/dist/scene/geometry-registry.d.ts.map +0 -1
  367. package/dist/scene/geometry-registry.js +0 -20
  368. package/dist/scene/instance-registry.d.ts +0 -36
  369. package/dist/scene/instance-registry.d.ts.map +0 -1
  370. package/dist/scene/instance-registry.js +0 -55
  371. package/dist/scene/instancers/grid.d.ts +0 -2
  372. package/dist/scene/instancers/grid.d.ts.map +0 -1
  373. package/dist/scene/instancers/grid.js +0 -36
  374. package/dist/scene/instancers/index.d.ts +0 -8
  375. package/dist/scene/instancers/index.d.ts.map +0 -1
  376. package/dist/scene/instancers/index.js +0 -7
  377. package/dist/scene/light-camera-factory.d.ts +0 -23
  378. package/dist/scene/light-camera-factory.d.ts.map +0 -1
  379. package/dist/scene/light-camera-factory.js +0 -68
  380. package/dist/scene/material-factory.d.ts +0 -17
  381. package/dist/scene/material-factory.d.ts.map +0 -1
  382. package/dist/scene/material-factory.js +0 -197
  383. package/dist/scene/material-registry.d.ts +0 -40
  384. package/dist/scene/material-registry.d.ts.map +0 -1
  385. package/dist/scene/material-registry.js +0 -44
  386. package/dist/scene/materials/index.d.ts +0 -8
  387. package/dist/scene/materials/index.d.ts.map +0 -1
  388. package/dist/scene/materials/index.js +0 -7
  389. package/dist/scene/materials/water.d.ts +0 -2
  390. package/dist/scene/materials/water.d.ts.map +0 -1
  391. package/dist/scene/materials/water.js +0 -54
  392. package/dist/scene/parse.d.ts +0 -23
  393. package/dist/scene/parse.d.ts.map +0 -1
  394. package/dist/scene/parse.js +0 -179
  395. package/dist/scene/particles-factory.d.ts +0 -33
  396. package/dist/scene/particles-factory.d.ts.map +0 -1
  397. package/dist/scene/particles-factory.js +0 -282
  398. package/dist/scene/scene-apply.d.ts +0 -109
  399. package/dist/scene/scene-apply.d.ts.map +0 -1
  400. package/dist/scene/scene-apply.js +0 -326
  401. package/dist/scene/scene-diff-schema.d.ts +0 -285
  402. package/dist/scene/scene-diff-schema.d.ts.map +0 -1
  403. package/dist/scene/scene-diff-schema.js +0 -92
  404. package/dist/scene/scene-diff-types.d.ts +0 -40
  405. package/dist/scene/scene-diff-types.d.ts.map +0 -1
  406. package/dist/scene/scene-diff-types.js +0 -14
  407. package/dist/scene/scene-loader.d.ts +0 -177
  408. package/dist/scene/scene-loader.d.ts.map +0 -1
  409. package/dist/scene/scene-loader.js +0 -1213
  410. package/dist/scene/scene-query.d.ts +0 -11
  411. package/dist/scene/scene-query.d.ts.map +0 -1
  412. package/dist/scene/scene-query.js +0 -63
  413. package/dist/scene/scene-types.d.ts +0 -10
  414. package/dist/scene/scene-types.d.ts.map +0 -1
  415. package/dist/scene/scene-types.js +0 -8
  416. package/dist/scene/scene-version.d.ts +0 -26
  417. package/dist/scene/scene-version.d.ts.map +0 -1
  418. package/dist/scene/scene-version.js +0 -34
  419. package/dist/scene/schema/animation.d.ts +0 -8
  420. package/dist/scene/schema/animation.d.ts.map +0 -1
  421. package/dist/scene/schema/animation.js +0 -42
  422. package/dist/scene/schema/audio.d.ts +0 -13
  423. package/dist/scene/schema/audio.d.ts.map +0 -1
  424. package/dist/scene/schema/audio.js +0 -22
  425. package/dist/scene/schema/camera.d.ts +0 -28
  426. package/dist/scene/schema/camera.d.ts.map +0 -1
  427. package/dist/scene/schema/camera.js +0 -17
  428. package/dist/scene/schema/collider.d.ts +0 -40
  429. package/dist/scene/schema/collider.d.ts.map +0 -1
  430. package/dist/scene/schema/collider.js +0 -55
  431. package/dist/scene/schema/entity-ref.d.ts +0 -31
  432. package/dist/scene/schema/entity-ref.d.ts.map +0 -1
  433. package/dist/scene/schema/entity-ref.js +0 -61
  434. package/dist/scene/schema/entity.d.ts +0 -1036
  435. package/dist/scene/schema/entity.d.ts.map +0 -1
  436. package/dist/scene/schema/entity.js +0 -153
  437. package/dist/scene/schema/environment.d.ts +0 -425
  438. package/dist/scene/schema/environment.d.ts.map +0 -1
  439. package/dist/scene/schema/environment.js +0 -357
  440. package/dist/scene/schema/index.d.ts +0 -39
  441. package/dist/scene/schema/index.d.ts.map +0 -1
  442. package/dist/scene/schema/index.js +0 -20
  443. package/dist/scene/schema/instances.d.ts +0 -14
  444. package/dist/scene/schema/instances.d.ts.map +0 -1
  445. package/dist/scene/schema/instances.js +0 -28
  446. package/dist/scene/schema/joint.d.ts +0 -23
  447. package/dist/scene/schema/joint.d.ts.map +0 -1
  448. package/dist/scene/schema/joint.js +0 -23
  449. package/dist/scene/schema/light.d.ts +0 -38
  450. package/dist/scene/schema/light.d.ts.map +0 -1
  451. package/dist/scene/schema/light.js +0 -26
  452. package/dist/scene/schema/material.d.ts +0 -199
  453. package/dist/scene/schema/material.d.ts.map +0 -1
  454. package/dist/scene/schema/material.js +0 -99
  455. package/dist/scene/schema/mesh.d.ts +0 -48
  456. package/dist/scene/schema/mesh.d.ts.map +0 -1
  457. package/dist/scene/schema/mesh.js +0 -82
  458. package/dist/scene/schema/particles.d.ts +0 -2178
  459. package/dist/scene/schema/particles.d.ts.map +0 -1
  460. package/dist/scene/schema/particles.js +0 -321
  461. package/dist/scene/schema/physics.d.ts +0 -56
  462. package/dist/scene/schema/physics.d.ts.map +0 -1
  463. package/dist/scene/schema/physics.js +0 -37
  464. package/dist/scene/schema/scene-file.d.ts +0 -304
  465. package/dist/scene/schema/scene-file.d.ts.map +0 -1
  466. package/dist/scene/schema/scene-file.js +0 -262
  467. package/dist/scene/schema/shadow.d.ts +0 -28
  468. package/dist/scene/schema/shadow.d.ts.map +0 -1
  469. package/dist/scene/schema/shadow.js +0 -20
  470. package/dist/scene/schema/spline.d.ts +0 -25
  471. package/dist/scene/schema/spline.d.ts.map +0 -1
  472. package/dist/scene/schema/spline.js +0 -15
  473. package/dist/scene/schema/tuples.d.ts +0 -12
  474. package/dist/scene/schema/tuples.d.ts.map +0 -1
  475. package/dist/scene/schema/tuples.js +0 -14
  476. package/dist/scene/schema/ui.d.ts +0 -880
  477. package/dist/scene/schema/ui.d.ts.map +0 -1
  478. package/dist/scene/schema/ui.js +0 -506
  479. package/dist/scene/user-data.d.ts +0 -171
  480. package/dist/scene/user-data.d.ts.map +0 -1
  481. package/dist/scene/user-data.js +0 -137
  482. package/dist/setup/setup-audio.d.ts +0 -20
  483. package/dist/setup/setup-audio.d.ts.map +0 -1
  484. package/dist/setup/setup-audio.js +0 -41
  485. package/dist/setup/setup-particles.d.ts +0 -17
  486. package/dist/setup/setup-particles.d.ts.map +0 -1
  487. package/dist/setup/setup-particles.js +0 -16
  488. package/dist/setup/setup-physics.d.ts +0 -25
  489. package/dist/setup/setup-physics.d.ts.map +0 -1
  490. package/dist/setup/setup-physics.js +0 -51
  491. package/dist/setup/setup-renderer.d.ts +0 -69
  492. package/dist/setup/setup-renderer.d.ts.map +0 -1
  493. package/dist/setup/setup-renderer.js +0 -363
  494. package/dist/tools/define-tool.d.ts +0 -105
  495. package/dist/tools/define-tool.d.ts.map +0 -1
  496. package/dist/tools/define-tool.js +0 -82
  497. package/dist/world2d/authoring-2d.d.ts +0 -76
  498. package/dist/world2d/authoring-2d.d.ts.map +0 -1
  499. package/dist/world2d/authoring-2d.js +0 -176
  500. package/dist/world2d/capture-to-scene2d.d.ts +0 -5
  501. package/dist/world2d/capture-to-scene2d.d.ts.map +0 -1
  502. package/dist/world2d/capture-to-scene2d.js +0 -49
  503. package/dist/world2d/collision-2d.d.ts +0 -52
  504. package/dist/world2d/collision-2d.d.ts.map +0 -1
  505. package/dist/world2d/collision-2d.js +0 -70
  506. package/dist/world2d/components-2d.d.ts +0 -47
  507. package/dist/world2d/components-2d.d.ts.map +0 -1
  508. package/dist/world2d/components-2d.js +0 -77
  509. package/dist/world2d/index.d.ts +0 -34
  510. package/dist/world2d/index.d.ts.map +0 -1
  511. package/dist/world2d/index.js +0 -32
  512. package/dist/world2d/ingest-iframe-2d.d.ts +0 -82
  513. package/dist/world2d/ingest-iframe-2d.d.ts.map +0 -1
  514. package/dist/world2d/ingest-iframe-2d.js +0 -166
  515. package/dist/world2d/ingest2d.d.ts +0 -97
  516. package/dist/world2d/ingest2d.d.ts.map +0 -1
  517. package/dist/world2d/ingest2d.js +0 -40
  518. package/dist/world2d/physics2d-registry.d.ts +0 -24
  519. package/dist/world2d/physics2d-registry.d.ts.map +0 -1
  520. package/dist/world2d/physics2d-registry.js +0 -38
  521. package/dist/world2d/pixi-game-adapter.d.ts +0 -107
  522. package/dist/world2d/pixi-game-adapter.d.ts.map +0 -1
  523. package/dist/world2d/pixi-game-adapter.js +0 -211
  524. package/dist/world2d/pixi-surface.d.ts +0 -39
  525. package/dist/world2d/pixi-surface.d.ts.map +0 -1
  526. package/dist/world2d/pixi-surface.js +0 -47
  527. package/dist/world2d/scene-capture-2d.d.ts +0 -43
  528. package/dist/world2d/scene-capture-2d.d.ts.map +0 -1
  529. package/dist/world2d/scene-capture-2d.js +0 -92
  530. package/dist/world2d/scene2d-loader.d.ts +0 -27
  531. package/dist/world2d/scene2d-loader.d.ts.map +0 -1
  532. package/dist/world2d/scene2d-loader.js +0 -274
  533. package/dist/world2d/schema/entity2d.d.ts +0 -102
  534. package/dist/world2d/schema/entity2d.d.ts.map +0 -1
  535. package/dist/world2d/schema/entity2d.js +0 -119
  536. package/dist/world2d/schema/physics2d.d.ts +0 -46
  537. package/dist/world2d/schema/physics2d.d.ts.map +0 -1
  538. package/dist/world2d/schema/physics2d.js +0 -45
  539. package/dist/world2d/schema/sprite.d.ts +0 -42
  540. package/dist/world2d/schema/sprite.d.ts.map +0 -1
  541. package/dist/world2d/schema/sprite.js +0 -63
  542. package/dist/world2d/schema/tilemap.d.ts +0 -15
  543. package/dist/world2d/schema/tilemap.d.ts.map +0 -1
  544. package/dist/world2d/schema/tilemap.js +0 -19
  545. package/dist/world2d/schema/tuples2d.d.ts +0 -20
  546. package/dist/world2d/schema/tuples2d.d.ts.map +0 -1
  547. package/dist/world2d/schema/tuples2d.js +0 -19
  548. package/dist/world2d/system-adapters-2d.d.ts +0 -16
  549. package/dist/world2d/system-adapters-2d.d.ts.map +0 -1
  550. package/dist/world2d/system-adapters-2d.js +0 -37
  551. package/dist/world2d/transform-writer-2d.d.ts +0 -16
  552. package/dist/world2d/transform-writer-2d.d.ts.map +0 -1
  553. package/dist/world2d/transform-writer-2d.js +0 -22
  554. package/dist/world2d/types.d.ts +0 -53
  555. package/dist/world2d/types.d.ts.map +0 -1
  556. package/dist/world2d/types.js +0 -1
  557. package/src/runtime/scene-ui-bridge.ts +0 -86
  558. package/src/runtime/scene-ui-data.ts +0 -119
  559. package/src/scene/schema/ui.ts +0 -602
@@ -90,8 +90,11 @@ export type ActionValueOf<T extends ActionValueType> = T extends 'digital'
90
90
  * value. Returned by the `*Source` sibling of each typed getter (e.g. `getScalarSource`).
91
91
  */
92
92
  export interface ActionValueSource {
93
- /** The binding kind that produced the current value. */
94
- bindingType: InputBinding['type'];
93
+ /** The binding kind that produced the current value. `'virtual'` (Task 1.4,
94
+ * ACCEPTANCE-DRIVER-BUILD-PLAN.md) is not a real `InputBinding` — it marks a
95
+ * value written by `InputManager.setVirtualAction` (the synthetic-player
96
+ * seat), not a device binding. */
97
+ bindingType: InputBinding['type'] | 'virtual';
95
98
  /** Present for `test_axis`/`test_vector2`/`test_pointer_delta`/`test_pointer_position`/
96
99
  * `touch_button`/`touch_stick` bindings — the caller-chosen source id passed to the
97
100
  * matching `inject*`/`setTouch*` call (F2 reuses this same field for named touch zones,
@@ -1,21 +1,21 @@
1
1
  // Game manifest (vgai.game.json) — schema + loader (T3.1 slice 1).
2
2
  // See docs/GAME-MANIFEST-DESIGN.md.
3
3
 
4
- export type { ResolvedAdapter, ResolvedGameManifest, ResolvedWorldEntry } from './load';
4
+ export type { ResolvedAdapter, ResolvedAdapterRoot, ResolvedGameManifest } from './load';
5
5
  export { CAPABILITY_CEILINGS, DEFAULT_SERVER_MODULE, loadGameManifest } from './load';
6
6
  export type {
7
+ AdapterRoot,
7
8
  GameManifest,
8
9
  IngestStrategy,
10
+ RootAdapter,
9
11
  Tier,
10
- WorldAdapter,
11
- WorldEntry,
12
12
  } from './schema';
13
13
  export {
14
+ AdapterRootSchema,
14
15
  GameManifestSchema,
15
16
  IngestStrategySchema,
17
+ RootAdapterSchema,
16
18
  TierSchema,
17
- WorldAdapterSchema,
18
- WorldEntrySchema,
19
19
  } from './schema';
20
20
 
21
21
  // `loadGameManifestFile` (Node-only, reads `path` via `node:fs`) is
@@ -14,12 +14,12 @@
14
14
  // only need `loadGameManifest` never pull in `node:fs`.
15
15
 
16
16
  import {
17
+ type AdapterRoot,
17
18
  type GameManifest,
18
19
  GameManifestSchema,
19
20
  type IngestStrategy,
21
+ type RootAdapter,
20
22
  type Tier,
21
- type WorldAdapter,
22
- type WorldEntry,
23
23
  } from './schema';
24
24
 
25
25
  // ---------------------------------------------------------------------------
@@ -29,10 +29,16 @@ import {
29
29
  /** D6's resolved adapter identities. */
30
30
  export type ResolvedAdapter =
31
31
  | {
32
- readonly type: 'default';
33
- readonly identity: 'default-three' | 'default-pixi' | 'default-react';
32
+ readonly type: 'builtin';
33
+ readonly identity: 'threejs' | 'pixijs' | 'react';
34
+ readonly surface: 'threejs' | 'pixijs' | 'react';
35
+ }
36
+ | {
37
+ readonly type: 'module';
38
+ readonly identity: 'module';
39
+ readonly module: string;
40
+ readonly surface: 'threejs' | 'pixijs' | 'react';
34
41
  }
35
- | { readonly type: 'module'; readonly identity: 'module'; readonly module: string }
36
42
  | {
37
43
  readonly type: 'ingest';
38
44
  // 'ingest-react' (Track N, N1 — docs/REACT-INGEST-LANDING-DESIGN.md
@@ -48,6 +54,7 @@ export type ResolvedAdapter =
48
54
  // strategies either; `resolveIngestDescriptor`/`resolveIngest2DDescriptor`
49
55
  // are where "not yet buildable" strategies throw.
50
56
  readonly identity: 'ingest-three' | 'ingest-pixi' | 'ingest-react';
57
+ readonly surface: 'threejs' | 'pixijs' | 'react';
51
58
  readonly strategy: IngestStrategy;
52
59
  readonly entryHtml: string | undefined;
53
60
  readonly assets: Record<string, string> | undefined;
@@ -62,9 +69,9 @@ export type ResolvedAdapter =
62
69
  readonly bodyHtml: string | undefined;
63
70
  };
64
71
 
65
- export interface ResolvedWorldEntry {
72
+ export interface ResolvedAdapterRoot {
66
73
  readonly id: string;
67
- readonly kind: WorldEntry['kind'];
74
+ readonly surface: ResolvedAdapter['surface'];
68
75
  readonly description: string | undefined;
69
76
  readonly adapter: ResolvedAdapter;
70
77
  readonly scene: string | undefined;
@@ -77,14 +84,41 @@ export interface ResolvedWorldEntry {
77
84
  }
78
85
 
79
86
  export interface ResolvedGameManifest {
80
- readonly manifestVersion: 1;
87
+ readonly manifestVersion: 2;
81
88
  readonly name: string;
89
+ readonly appId: string | undefined;
90
+ readonly editorPort: number | undefined;
82
91
  readonly version: string;
83
92
  readonly engine: { readonly version: string };
84
93
  /** Sorted by zOrder; ties broken by original array order (§3). */
85
- readonly worlds: readonly ResolvedWorldEntry[];
94
+ readonly roots: readonly ResolvedAdapterRoot[];
86
95
  readonly server: { readonly room: string; readonly module: string } | undefined;
87
96
  readonly resolution: { readonly width: number; readonly height: number } | undefined;
97
+ readonly authoring:
98
+ | {
99
+ readonly hierarchy?:
100
+ | {
101
+ readonly rootLabels?: Readonly<Record<string, string>> | undefined;
102
+ readonly groups?:
103
+ | readonly {
104
+ readonly id: string;
105
+ readonly label: string;
106
+ readonly roots: readonly string[];
107
+ }[]
108
+ | undefined;
109
+ }
110
+ | undefined;
111
+ }
112
+ | undefined;
113
+ /** D18 — read by the debug-bridge installer to gate `?vgai-debug=1` in production builds. */
114
+ readonly debug: { readonly allowInProduction: boolean } | undefined;
115
+ /** D15 — read by `mount-manifest.ts`'s boot-time seeding reader (gates
116
+ * whether `ctx.random` is seeded from `defaultSeed`/`?vgai-seed=`), the
117
+ * gameplay-rng-ban burn-down scan, and the dev-mode Math.random phase
118
+ * trap. See `docs/D15-DETERMINISM-DESIGN.md`. */
119
+ readonly determinism:
120
+ | { readonly seededRandom: boolean; readonly defaultSeed?: number | undefined }
121
+ | undefined;
88
122
  }
89
123
 
90
124
  // ---------------------------------------------------------------------------
@@ -94,12 +128,12 @@ export interface ResolvedGameManifest {
94
128
 
95
129
  /**
96
130
  * Ceiling (maximum legal declared `Tier`) per adapter type and delivery
97
- * context. `default` worlds are always first-party in both contexts (D6/§2 —
98
- * a first-party world is fully vgai-native everywhere). `ingest` worlds are
131
+ * context. `default` roots are always first-party in both contexts (D6/§2 —
132
+ * a first-party root is fully vgai-native everywhere). `ingest` roots are
99
133
  * ceilinged by their own capture `strategy`: locally the local CLI's Vite
100
134
  * pipeline gives bundler dedupe, so every strategy reaches its own natural
101
135
  * rung; hosted has no bundler (esbuild-wasm + externals only), and a
102
- * `deduped` world is DEFINED by being source built through our pipeline — no
136
+ * `deduped` root is DEFINED by being source built through our pipeline — no
103
137
  * prebuilt bundle exists to fall back to an iframe rung, and nothing
104
138
  * implements a hosted build for it, so hosted is `unsupported` (honesty over
105
139
  * optimism; if the hosted esbuild-wasm path ever proves capable, raising
@@ -109,11 +143,11 @@ export interface ResolvedGameManifest {
109
143
  * adapter's reach is not derivable", §4) — modeled here as `first-party`
110
144
  * (the top rank), i.e. no ceiling actually constrains a module adapter's
111
145
  * declared tier; the loader instead requires the tier to be declared
112
- * explicitly for module worlds (see `resolveCapabilities`), since there is no
146
+ * explicitly for module roots (see `resolveCapabilities`), since there is no
113
147
  * default to derive.
114
148
  */
115
149
  export const CAPABILITY_CEILINGS = {
116
- default: { local: 'first-party', hosted: 'first-party' },
150
+ builtin: { local: 'first-party', hosted: 'first-party' },
117
151
  ingest: {
118
152
  shared: { local: 'shared', hosted: 'shared' },
119
153
  deduped: { local: 'deduped', hosted: 'unsupported' },
@@ -146,14 +180,14 @@ const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/;
146
180
  // ---------------------------------------------------------------------------
147
181
 
148
182
  function isModuleAdapter(
149
- adapter: WorldAdapter,
150
- ): adapter is Extract<WorldAdapter, { module: string }> {
183
+ adapter: RootAdapter,
184
+ ): adapter is Extract<RootAdapter, { module: string }> {
151
185
  return typeof adapter === 'object' && 'module' in adapter;
152
186
  }
153
187
 
154
188
  function isIngestAdapter(
155
- adapter: WorldAdapter,
156
- ): adapter is Extract<WorldAdapter, { ingest: { strategy: IngestStrategy } }> {
189
+ adapter: RootAdapter,
190
+ ): adapter is Extract<RootAdapter, { ingest: { strategy: IngestStrategy } }> {
157
191
  return typeof adapter === 'object' && 'ingest' in adapter;
158
192
  }
159
193
 
@@ -161,9 +195,9 @@ function isIngestAdapter(
161
195
  // Cross-field checks (§3 — beyond what Zod alone enforces)
162
196
  // ---------------------------------------------------------------------------
163
197
  //
164
- // D-V6 (docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md): world-id uniqueness used to
198
+ // D-V6 (docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md): root-id uniqueness used to
165
199
  // be a cross-field check HERE (`checkUniqueWorldIds`, removed) — it moved
166
- // INTO `GameManifestSchema`'s `worlds` `superRefine` (schema.ts) instead, so
200
+ // INTO `GameManifestSchema`'s `roots` `superRefine` (schema.ts) instead, so
167
201
  // the generated JSON Schema and any other schema consumer see the same
168
202
  // constraint the loader always enforced. `parseManifest` below catches that
169
203
  // one recognizable schema-level issue and rethrows it as a clean, single
@@ -172,17 +206,22 @@ function isIngestAdapter(
172
206
  // callers/tests that pattern-match the message text are unaffected by the
173
207
  // enforcement moving one layer down.
174
208
 
175
- function checkAdapterSceneEntryRules(world: WorldEntry): void {
176
- const { adapter } = world;
177
- if (adapter === 'default' && !world.scene && !world.entry) {
209
+ function checkAdapterSceneEntryRules(root: AdapterRoot): void {
210
+ const { adapter } = root;
211
+ if (typeof adapter === 'string' && !root.scene && !root.entry) {
178
212
  throw new Error(
179
- `Game manifest: world "${world.id}" uses the 'default' adapter but declares neither ` +
180
- '`scene` nor `entry` — a default-adapter world requires one of the two (§3).',
213
+ `Game manifest: root "${root.id}" uses the '${adapter}' adapter but declares neither ` +
214
+ '`scene` nor `entry` — a built-in adapter root requires an authored document or entry.',
181
215
  );
182
216
  }
183
- if (isIngestAdapter(adapter) && world.scene !== undefined) {
217
+ if (adapter === 'react' && root.scene !== undefined) {
184
218
  throw new Error(
185
- `Game manifest: world "${world.id}" uses an { ingest } adapter but declares \`scene\` — ` +
219
+ `Game manifest: React root "${root.id}" declares \`scene\` — React roots use JSX entry modules.`,
220
+ );
221
+ }
222
+ if (isIngestAdapter(adapter) && root.scene !== undefined) {
223
+ throw new Error(
224
+ `Game manifest: root "${root.id}" uses an { ingest } adapter but declares \`scene\` — ` +
186
225
  'ingest adapters forbid `scene` (adapt-never-migrate: ingested games keep their own ' +
187
226
  "formats; overlay persistence is T3.2's) (§3).",
188
227
  );
@@ -190,13 +229,13 @@ function checkAdapterSceneEntryRules(world: WorldEntry): void {
190
229
  }
191
230
 
192
231
  // Historical note (Track N, N1): this file used to reject EVERY `kind:
193
- // 'react'` + `{ ingest }` world outright here (`checkReactAdapterRestriction`,
232
+ // 'react'` + `{ ingest }` root outright here (`checkReactAdapterRestriction`,
194
233
  // citing "no react ingest program is un-parked"). Track N un-parks exactly
195
234
  // that program (docs/REACT-INGEST-LANDING-DESIGN.md) — react+ingest is now a
196
235
  // structurally legal combination, resolved to the `'ingest-react'` identity
197
- // by `resolveAdapter` below like any other ingest world. There is nothing
236
+ // by `resolveAdapter` below like any other ingest root. There is nothing
198
237
  // left to reject at THIS layer: `checkAdapterSceneEntryRules` above already
199
- // forbids `scene` on any `{ ingest }`-adapter world (kind-agnostic), and the
238
+ // forbids `scene` on any `{ ingest }`-adapter root (kind-agnostic), and the
200
239
  // v1 "deduped strategy only" restriction is an editor-resolver concern
201
240
  // (D-N3), not a manifest-shape concern — see the `ResolvedAdapter` type's
202
241
  // comment above.
@@ -205,28 +244,36 @@ function checkAdapterSceneEntryRules(world: WorldEntry): void {
205
244
  // Resolution (§5)
206
245
  // ---------------------------------------------------------------------------
207
246
 
208
- function resolveAdapter(world: WorldEntry): ResolvedAdapter {
209
- const { adapter, kind } = world;
247
+ function resolveAdapter(root: AdapterRoot): ResolvedAdapter {
248
+ const { adapter } = root;
210
249
 
211
- if (adapter === 'default') {
212
- const identity =
213
- kind === 'threejs' ? 'default-three' : kind === 'pixijs' ? 'default-pixi' : 'default-react';
214
- return { type: 'default', identity };
250
+ if (typeof adapter === 'string') {
251
+ return { type: 'builtin', identity: adapter, surface: adapter };
215
252
  }
216
253
 
217
254
  if (isModuleAdapter(adapter)) {
218
- return { type: 'module', identity: 'module', module: adapter.module };
255
+ return {
256
+ type: 'module',
257
+ identity: 'module',
258
+ module: adapter.module,
259
+ surface: adapter.surface,
260
+ };
219
261
  }
220
262
 
221
263
  // isIngestAdapter (Track N, N1: 'ingest-react' joins 'ingest-three'/
222
264
  // 'ingest-pixi' — see the `ResolvedAdapter` type's comment above for why
223
265
  // this stays strategy-agnostic here).
224
266
  const identity =
225
- kind === 'threejs' ? 'ingest-three' : kind === 'pixijs' ? 'ingest-pixi' : 'ingest-react';
267
+ adapter.surface === 'threejs'
268
+ ? 'ingest-three'
269
+ : adapter.surface === 'pixijs'
270
+ ? 'ingest-pixi'
271
+ : 'ingest-react';
226
272
  const ingest = adapter.ingest;
227
273
  return {
228
274
  type: 'ingest',
229
275
  identity,
276
+ surface: adapter.surface,
230
277
  strategy: ingest.strategy,
231
278
  entryHtml: ingest.entryHtml,
232
279
  assets: ingest.assets,
@@ -241,23 +288,23 @@ function resolveAdapter(world: WorldEntry): ResolvedAdapter {
241
288
  };
242
289
  }
243
290
 
244
- function ceilingFor(adapter: WorldAdapter, context: 'local' | 'hosted'): Tier {
245
- if (adapter === 'default') return CAPABILITY_CEILINGS.default[context];
291
+ function ceilingFor(adapter: RootAdapter, context: 'local' | 'hosted'): Tier {
292
+ if (typeof adapter === 'string') return CAPABILITY_CEILINGS.builtin[context];
246
293
  if (isModuleAdapter(adapter)) return CAPABILITY_CEILINGS.module[context];
247
294
  return CAPABILITY_CEILINGS.ingest[adapter.ingest.strategy][context];
248
295
  }
249
296
 
250
- function resolveCapabilities(world: WorldEntry): { local: Tier; hosted: Tier } {
297
+ function resolveCapabilities(root: AdapterRoot): { local: Tier; hosted: Tier } {
251
298
  const contexts = ['local', 'hosted'] as const;
252
299
  const result = {} as { local: Tier; hosted: Tier };
253
300
 
254
301
  for (const context of contexts) {
255
- const declared = world.capabilities?.[context];
302
+ const declared = root.capabilities?.[context];
256
303
  if (declared !== undefined) {
257
- const ceiling = ceilingFor(world.adapter, context);
304
+ const ceiling = ceilingFor(root.adapter, context);
258
305
  if (TIER_RANK[declared] > TIER_RANK[ceiling]) {
259
306
  throw new Error(
260
- `Game manifest: world "${world.id}": declared capabilities.${context} tier "${declared}" ` +
307
+ `Game manifest: root "${root.id}": declared capabilities.${context} tier "${declared}" ` +
261
308
  `exceeds the "${ceiling}" ceiling for this adapter in the ${context} context (§4). ` +
262
309
  'Under-claiming (including `unsupported`) is legal; over-claiming is not.',
263
310
  );
@@ -267,15 +314,15 @@ function resolveCapabilities(world: WorldEntry): { local: Tier; hosted: Tier } {
267
314
  }
268
315
 
269
316
  // Omitted -> derive.
270
- if (world.adapter === 'default') {
317
+ if (typeof root.adapter === 'string') {
271
318
  result[context] = 'first-party';
272
- } else if (isModuleAdapter(world.adapter)) {
319
+ } else if (isModuleAdapter(root.adapter)) {
273
320
  throw new Error(
274
- `Game manifest: world "${world.id}": { module } adapter requires an explicit ` +
321
+ `Game manifest: root "${root.id}": { module } adapter requires an explicit ` +
275
322
  `capabilities.${context} declaration — a custom adapter's reach is not derivable (§4).`,
276
323
  );
277
324
  } else {
278
- result[context] = CAPABILITY_CEILINGS.ingest[world.adapter.ingest.strategy][context];
325
+ result[context] = CAPABILITY_CEILINGS.ingest[root.adapter.ingest.strategy][context];
279
326
  }
280
327
  }
281
328
 
@@ -292,10 +339,10 @@ function checkEngineVersionPin(version: string): void {
292
339
  }
293
340
 
294
341
  /**
295
- * Resolve one already-Zod-validated world entry into its `ResolvedWorldEntry`
342
+ * Resolve one already-Zod-validated root entry into its `ResolvedAdapterRoot`
296
343
  * (adapter identity, capabilities, and a pass-through of every other field).
297
- * Every `WorldEntry` field participates here or in a check above:
298
- * `id`/`kind` drive adapter resolution + uniqueness; `adapter` (incl. its
344
+ * Every `AdapterRoot` field participates here or in a check above:
345
+ * `id` drives uniqueness; `adapter` (incl. its surface and
299
346
  * `module`/`ingest.*` sub-fields) drives identity + capability-ceiling
300
347
  * resolution; `scene`/`entry` drive the scene/entry cross-field rule and are
301
348
  * carried through; `zOrder` drives the final sort; `pausable`/`loop` are
@@ -303,22 +350,23 @@ function checkEngineVersionPin(version: string): void {
303
350
  * `capabilities.{local,hosted}` drive tier resolution; `description` (T3.3
304
351
  * slice 3) is carried through as-is — its consumer today is
305
352
  * `resolveIngestDescriptor` (packages/editor/src/adapter-resolver.ts), which
306
- * threads an ingest-three world's description into `IngestGame.description`.
353
+ * threads an ingest-three root's description into `IngestGame.description`.
307
354
  */
308
- function resolveWorld(world: WorldEntry): ResolvedWorldEntry {
309
- checkAdapterSceneEntryRules(world);
355
+ function resolveRoot(root: AdapterRoot): ResolvedAdapterRoot {
356
+ checkAdapterSceneEntryRules(root);
357
+ const adapter = resolveAdapter(root);
310
358
 
311
359
  return {
312
- id: world.id,
313
- kind: world.kind,
314
- description: world.description,
315
- adapter: resolveAdapter(world),
316
- scene: world.scene,
317
- entry: world.entry,
318
- zOrder: world.zOrder,
319
- pausable: world.pausable,
320
- loop: world.loop,
321
- capabilities: resolveCapabilities(world),
360
+ id: root.id,
361
+ surface: adapter.surface,
362
+ description: root.description,
363
+ adapter,
364
+ scene: root.scene,
365
+ entry: root.entry,
366
+ zOrder: root.zOrder,
367
+ pausable: root.pausable,
368
+ loop: root.loop,
369
+ capabilities: resolveCapabilities(root),
322
370
  };
323
371
  }
324
372
 
@@ -329,20 +377,20 @@ function resolveWorld(world: WorldEntry): ResolvedWorldEntry {
329
377
  /**
330
378
  * Parse + validate + resolve a raw manifest value into a `ResolvedGameManifest`.
331
379
  * Pure data-in/data-out (no `fs`) — see `load-file.ts` for the Node path-based
332
- * wrapper. Throws a descriptive `Error` (naming the offending world/field) on
380
+ * wrapper. Throws a descriptive `Error` (naming the offending root/field) on
333
381
  * any Zod validation failure or cross-field rule violation.
334
382
  */
335
383
  export function loadGameManifest(raw: unknown): ResolvedGameManifest {
336
384
  const parsed = GameManifestSchema.safeParse(raw);
337
385
  if (!parsed.success) {
338
- // D-V6: the `worlds` `superRefine`'s duplicate-id issue is the one
386
+ // D-V6: the `roots` `superRefine`'s duplicate-id issue is the one
339
387
  // schema-level violation this loader still surfaces as a clean, single
340
388
  // `Error` (matching `checkUniqueWorldIds`'s pre-D-V6 message shape) —
341
389
  // every other schema violation keeps propagating as the raw `ZodError`
342
390
  // it always has (unchanged behavior, e.g. the iframe-reachable
343
391
  // field-exclusivity / manifestVersion checks).
344
392
  const dupIssue = parsed.error.issues.find((issue) =>
345
- issue.message.startsWith('Game manifest: duplicate world id'),
393
+ issue.message.startsWith('Game manifest: duplicate root id'),
346
394
  );
347
395
  if (dupIssue) throw new Error(dupIssue.message);
348
396
  throw parsed.error;
@@ -351,16 +399,16 @@ export function loadGameManifest(raw: unknown): ResolvedGameManifest {
351
399
 
352
400
  checkEngineVersionPin(manifest.engine.version);
353
401
 
354
- const resolvedWithIndex = manifest.worlds.map((world, index) => ({
355
- world: resolveWorld(world),
402
+ const resolvedWithIndex = manifest.roots.map((root, index) => ({
403
+ root: resolveRoot(root),
356
404
  index,
357
405
  }));
358
406
 
359
407
  resolvedWithIndex.sort(
360
- (a, b) => a.world.zOrder - b.world.zOrder || a.index - b.index, // ties -> array order (§3)
408
+ (a, b) => a.root.zOrder - b.root.zOrder || a.index - b.index, // ties -> array order (§3)
361
409
  );
362
410
 
363
- const worlds = resolvedWithIndex.map(({ world }) => world);
411
+ const roots = resolvedWithIndex.map(({ root }) => root);
364
412
 
365
413
  const server = manifest.server
366
414
  ? { room: manifest.server.room, module: manifest.server.module ?? DEFAULT_SERVER_MODULE }
@@ -369,10 +417,15 @@ export function loadGameManifest(raw: unknown): ResolvedGameManifest {
369
417
  return {
370
418
  manifestVersion: manifest.manifestVersion,
371
419
  name: manifest.name,
420
+ appId: manifest.appId,
421
+ editorPort: manifest.editorPort,
372
422
  version: manifest.version,
373
423
  engine: { version: manifest.engine.version },
374
- worlds,
424
+ roots,
375
425
  server,
376
426
  resolution: manifest.resolution,
427
+ authoring: manifest.authoring,
428
+ debug: manifest.debug,
429
+ determinism: manifest.determinism,
377
430
  };
378
431
  }