@vgai/editor 0.2.0 → 0.4.0-canary.20260715.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 (430) hide show
  1. package/README.md +24 -0
  2. package/dist/assets/axe-C7YBtOuM.js +30 -0
  3. package/dist/assets/browserAll-DDtGGE48.js +1 -0
  4. package/dist/assets/create-runtime-DbTlBlKG.js +1 -0
  5. package/dist/assets/{game-BI111o5f.js → game-BE0r7DMI.js} +3 -3
  6. package/dist/assets/game-BdTHR2_X.js +1 -0
  7. package/dist/assets/{game-pt_1lQLv.js → game-C3iQGSqo.js} +1 -1
  8. package/dist/assets/game-CcHfYxjP.js +1 -0
  9. package/dist/assets/game-Cqzj_lpD.js +1 -0
  10. package/dist/assets/game-DSZdeCHu.js +1 -0
  11. package/dist/assets/game-Dch9sAPc.js +1 -0
  12. package/dist/assets/{game-xsOho_wg.js → game-SAFn90pA.js} +3 -3
  13. package/dist/assets/game-loop-DMIgSMV-.js +1 -0
  14. package/dist/assets/{game-source-CvidN7AB.js → game-source-Dk83w26t.js} +1 -1
  15. package/dist/assets/{index-Bp5cecD6.js → index-4idIsHHJ.js} +2 -2
  16. package/dist/assets/{index-DL7RcQ0n.js → index-C-LhOTBN.js} +1 -1
  17. package/dist/assets/{index-Cs8xwv3e.js → index-CDkxceqE.js} +1 -1
  18. package/dist/assets/index-CQEfi217.js +15412 -0
  19. package/dist/assets/index-Dvi-V0NE.css +1 -0
  20. package/dist/assets/ingest-siblings-s0P5I1Ub.js +1 -0
  21. package/dist/assets/mount-manifest-DXMOlF79.js +1 -0
  22. package/dist/assets/react-18-C9eHn8x1.js +1 -0
  23. package/dist/assets/webworkerAll-Fn0e-ouF.js +1 -0
  24. package/dist/assets/world-documents-GM0a9Kv7.js +1 -0
  25. package/dist/index.html +15 -13
  26. package/dist/ingest/racing-game/vgai.game.json +5 -4
  27. package/dist/ingest/simcity/vgai.game.json +5 -4
  28. package/dist/ingest/tanks/vgai.game.json +5 -4
  29. package/dist/project-scripts.bundle.js +3917 -0
  30. package/dist/scenes/untitled.vscn.json +2 -0
  31. package/dist-server/packaged.mjs +7697 -3435
  32. package/package.json +31 -4
  33. package/scripts/probe-reporter.ts +349 -0
  34. package/scripts/run-probe.ts +2260 -0
  35. package/server/asset-catalog-audit.ts +268 -0
  36. package/server/asset-catalog-v2.ts +146 -0
  37. package/server/asset-library-routes.ts +276 -58
  38. package/server/canonical-path.ts +1 -1
  39. package/server/dev.ts +148 -44
  40. package/server/editor-server.ts +888 -61
  41. package/server/editor-sse.ts +115 -4
  42. package/server/harness-chat-service.ts +796 -0
  43. package/server/local-asset-catalog.ts +157 -22
  44. package/server/packaged.ts +51 -21
  45. package/server/process-shutdown.ts +136 -0
  46. package/server/prod.ts +9 -6
  47. package/server/project-hmr-files.ts +41 -0
  48. package/server/project-operations.ts +343 -0
  49. package/server/project-optimize-deps-entries.ts +4 -4
  50. package/server/project-output-writer.ts +156 -0
  51. package/server/project-validation.ts +140 -0
  52. package/server/project-view.ts +8 -50
  53. package/server/server-utils.ts +75 -10
  54. package/server/session-registry.ts +12 -0
  55. package/src/EditorContext.tsx +107 -3
  56. package/src/action-registry.ts +115 -17
  57. package/src/adapter-resolver.ts +213 -478
  58. package/src/asset-events.ts +64 -1
  59. package/src/asset-preview.ts +906 -0
  60. package/src/asset-selection.ts +121 -0
  61. package/src/asset-workflow/asset-capabilities.ts +259 -0
  62. package/src/asset-workflow/asset-editor-errors.ts +46 -0
  63. package/src/asset-workflow/asset-import-pipeline.ts +176 -0
  64. package/src/asset-workflow/asset-library-query.ts +107 -0
  65. package/src/asset-workflow/asset-types.ts +192 -0
  66. package/src/asset-workflow/asset-workflow-quality.ts +65 -0
  67. package/src/asset-workflow/import-contract.ts +113 -0
  68. package/src/asset-workflow/model-conversion.ts +126 -0
  69. package/src/asset-workflow/model-inspection.ts +185 -0
  70. package/src/asset-workflow/project-asset-commands.ts +23 -0
  71. package/src/asset-workflow/project-asset-health.ts +153 -0
  72. package/src/asset-workflow/project-asset-operations.ts +119 -0
  73. package/src/asset-workflow/thumbnail-system.ts +172 -0
  74. package/src/authoring/active-systems.ts +15 -0
  75. package/src/authoring/boundary-authoring-adapter.ts +16 -5
  76. package/src/authoring/composite-authoring-adapter.ts +305 -124
  77. package/src/authoring/design-time-layers.ts +300 -117
  78. package/src/authoring/edit-mode-authoring.ts +278 -293
  79. package/src/authoring/embed-only-adapter.ts +4 -2
  80. package/src/authoring/first-party-hierarchy-menu.ts +7 -2
  81. package/src/authoring/first-party-inspector/AddSectionMenu.tsx +5 -12
  82. package/src/authoring/first-party-inspector/EnvironmentSection.tsx +53 -126
  83. package/src/authoring/first-party-inspector/HeaderSection.tsx +54 -65
  84. package/src/authoring/first-party-inspector/is-first-party-selection.ts +30 -11
  85. package/src/authoring/first-party-inspector/register.tsx +13 -2
  86. package/src/authoring/ingest-authoring-adapter.ts +142 -45
  87. package/src/authoring/mount-failure-report.ts +5 -5
  88. package/src/authoring/provenance.ts +41 -0
  89. package/src/authoring/react-dom-authoring-adapter.ts +92 -92
  90. package/src/authoring/react-inspector-section.tsx +489 -51
  91. package/src/authoring/react-world-authoring-adapter.ts +541 -306
  92. package/src/authoring/story-overlay.ts +1 -1
  93. package/src/authoring/story-types.ts +11 -0
  94. package/src/authoring/vgai-scene-authoring-adapter.ts +54 -25
  95. package/src/authoring/viewport-tool-context.ts +78 -0
  96. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  97. package/src/authoring/world-hidden-viewport.ts +186 -0
  98. package/src/authoring/world-pan-state.ts +33 -17
  99. package/src/authoring/world-session-state.ts +1 -1
  100. package/src/authoring/world2d-authoring-adapter.ts +109 -52
  101. package/src/availability-tick.ts +56 -0
  102. package/src/browser-play-entry.ts +5 -5
  103. package/src/browser-project-scripts.ts +1 -0
  104. package/src/build-identity.ts +15 -0
  105. package/src/command-listener.ts +893 -19
  106. package/src/components/AlignToolbar.tsx +74 -63
  107. package/src/components/AppRoot.tsx +193 -26
  108. package/src/components/ApplicationMenus.tsx +272 -0
  109. package/src/components/AssetBrowser.tsx +1450 -293
  110. package/src/components/AssetEditorShell.tsx +141 -0
  111. package/src/components/AssetImportDetails.tsx +218 -0
  112. package/src/components/AssetLibraryPanel.tsx +14 -0
  113. package/src/components/CameraInfo.tsx +11 -20
  114. package/src/components/CenterDocuments.tsx +585 -0
  115. package/src/components/CommandPalette.tsx +75 -30
  116. package/src/components/ConsolePanel.css +55 -0
  117. package/src/components/ConsolePanel.tsx +57 -112
  118. package/src/components/DebugConsolePanel.tsx +461 -0
  119. package/src/components/DebuggerPanel.tsx +165 -0
  120. package/src/components/DefaultEditorLayout.tsx +167 -231
  121. package/src/components/GameHierarchy.tsx +873 -290
  122. package/src/components/GamePerformanceOverlay.tsx +46 -0
  123. package/src/components/HarnessChatPanel.tsx +2352 -0
  124. package/src/components/HistoryPanel.tsx +226 -0
  125. package/src/components/Inspector.tsx +153 -99
  126. package/src/components/InspectorToolSection.tsx +6 -4
  127. package/src/components/MountFailureBanner.tsx +31 -48
  128. package/src/components/NetworkSection.tsx +25 -14
  129. package/src/components/OnlineAssetBrowser.tsx +794 -343
  130. package/src/components/OverlayReportBanner.tsx +38 -64
  131. package/src/components/PerformancePanel.tsx +206 -0
  132. package/src/components/PlayBar.tsx +93 -263
  133. package/src/components/PrefabSaveDialog.tsx +55 -127
  134. package/src/components/ProjectHeader.css +60 -0
  135. package/src/components/ProjectHeader.tsx +170 -105
  136. package/src/components/ProjectScreen.tsx +246 -184
  137. package/src/components/ReactCanvasControls.tsx +185 -0
  138. package/src/components/ResolutionPicker.tsx +85 -0
  139. package/src/components/RootActivateDialog.tsx +39 -68
  140. package/src/components/SaveDialog.tsx +55 -127
  141. package/src/components/SaveStatus.tsx +11 -29
  142. package/src/components/StartupLoadingScreen.tsx +96 -0
  143. package/src/components/StateWatchPanel.tsx +302 -0
  144. package/src/components/StatsOverlay.tsx +12 -5
  145. package/src/components/StatusBar.tsx +64 -0
  146. package/src/components/ThemeManagerDialog.css +89 -0
  147. package/src/components/ThemeManagerDialog.tsx +371 -0
  148. package/src/components/ToolHost.tsx +26 -15
  149. package/src/components/Toolbar.tsx +117 -214
  150. package/src/components/VgaiVoxelLogo.tsx +89 -0
  151. package/src/components/ViewportOverlay.tsx +97 -172
  152. package/src/components/ViewportPanel.tsx +130 -31
  153. package/src/components/WorkspaceDock.tsx +891 -0
  154. package/src/components/WorldSelectionOverlay.tsx +51 -63
  155. package/src/components/WorldTextEditor.tsx +9 -5
  156. package/src/components/asset-documents.tsx +390 -0
  157. package/src/components/asset-editor-persistence.ts +44 -0
  158. package/src/components/asset-selection-section.tsx +338 -0
  159. package/src/components/asset-viewers/AudioViewer.tsx +73 -21
  160. package/src/components/asset-viewers/GenericJsonViewer.tsx +26 -11
  161. package/src/components/asset-viewers/ImageViewer.tsx +43 -11
  162. package/src/components/asset-viewers/InputMapViewer.tsx +512 -134
  163. package/src/components/asset-viewers/MaterialAssetEditor.tsx +540 -0
  164. package/src/components/asset-viewers/ModelViewer.tsx +805 -121
  165. package/src/components/asset-viewers/OnlineAssetDetail.tsx +177 -60
  166. package/src/components/asset-viewers/SourceAssetViewer.tsx +121 -0
  167. package/src/components/asset-workflow.css +506 -0
  168. package/src/components/build-documents.tsx +696 -0
  169. package/src/components/core-utilities.tsx +75 -0
  170. package/src/components/data-documents.tsx +364 -0
  171. package/src/components/{DataPanel.tsx → data-editor.tsx} +138 -288
  172. package/src/components/debugger-panel-state.ts +57 -0
  173. package/src/components/inspector-widgets/AlignmentGrid.tsx +8 -14
  174. package/src/components/inspector-widgets/BorderEditor.tsx +41 -33
  175. package/src/components/inspector-widgets/ColorPicker.tsx +39 -39
  176. package/src/components/inspector-widgets/FontPicker.tsx +13 -21
  177. package/src/components/inspector-widgets/GradientEditor.tsx +11 -19
  178. package/src/components/inspector-widgets/ScrubbableInput.tsx +6 -3
  179. package/src/components/inspector-widgets/ShadowEditor.tsx +20 -33
  180. package/src/components/inspector-widgets/shared.tsx +90 -49
  181. package/src/components/inspectors/AnimationSection.tsx +39 -40
  182. package/src/components/inspectors/AudioSection.tsx +28 -39
  183. package/src/components/inspectors/BoneAttachmentSection.tsx +19 -24
  184. package/src/components/inspectors/CameraSection.tsx +14 -23
  185. package/src/components/inspectors/ComponentsSection.tsx +39 -43
  186. package/src/components/inspectors/JointsSection.tsx +34 -43
  187. package/src/components/inspectors/LightSection.tsx +90 -35
  188. package/src/components/inspectors/MaterialSection.tsx +137 -174
  189. package/src/components/inspectors/MeshSection.tsx +9 -17
  190. package/src/components/inspectors/NavigationSection.tsx +8 -15
  191. package/src/components/inspectors/ParticleSection.tsx +91 -76
  192. package/src/components/inspectors/PhysicsSection.tsx +42 -46
  193. package/src/components/inspectors/PostProcessingSection.tsx +28 -36
  194. package/src/components/inspectors/RenderingSection.tsx +12 -20
  195. package/src/components/inspectors/ShadowSection.tsx +7 -8
  196. package/src/components/inspectors/SplineSection.tsx +31 -42
  197. package/src/components/inspectors/TransformSection.tsx +14 -22
  198. package/src/components/patterns/Dialog.tsx +95 -0
  199. package/src/components/patterns/Fields.tsx +44 -0
  200. package/src/components/patterns/List.tsx +25 -0
  201. package/src/components/patterns/StateSurface.tsx +40 -0
  202. package/src/components/patterns/Surfaces.tsx +115 -0
  203. package/src/components/patterns/Tabs.tsx +80 -0
  204. package/src/components/patterns/Toolbar.tsx +51 -0
  205. package/src/components/patterns/Tree.tsx +72 -0
  206. package/src/components/primitives/Button.tsx +46 -0
  207. package/src/components/primitives/ColorInput.tsx +11 -47
  208. package/src/components/primitives/EditorIcon.tsx +99 -0
  209. package/src/components/primitives/FormControls.tsx +71 -0
  210. package/src/components/primitives/JsonInput.tsx +15 -2
  211. package/src/components/primitives/Layout.tsx +100 -0
  212. package/src/components/primitives/Menu.tsx +105 -0
  213. package/src/components/primitives/NumberInput.tsx +8 -35
  214. package/src/components/primitives/Panel.tsx +49 -44
  215. package/src/components/primitives/SectionHeader.tsx +10 -28
  216. package/src/components/primitives/Text.tsx +46 -0
  217. package/src/components/primitives/Tooltip.tsx +20 -12
  218. package/src/components/primitives/Vec3Input.tsx +3 -0
  219. package/src/components/primitives/banner-tones.ts +33 -0
  220. package/src/components/primitives/editor-icons.ts +102 -0
  221. package/src/components/primitives/panel-header-styles.ts +30 -0
  222. package/src/components/project-operation-documents.tsx +226 -0
  223. package/src/components/status-contributions.tsx +175 -0
  224. package/src/components/story-documents-register.ts +15 -0
  225. package/src/components/story-documents.tsx +1185 -0
  226. package/src/components/tool-documents.tsx +110 -0
  227. package/src/components/workspace-dock.css +293 -0
  228. package/src/components/workspace-history.ts +33 -0
  229. package/src/components/world-documents.tsx +145 -0
  230. package/src/components/xstate-documents.tsx +209 -0
  231. package/src/composite-screenshot.ts +248 -0
  232. package/src/design-system/index.ts +70 -0
  233. package/src/design-system-stories/Foundation.stories.tsx +183 -0
  234. package/src/design-system-stories/Patterns.stories.tsx +251 -0
  235. package/src/design-system-stories/Workspace.stories.tsx +538 -0
  236. package/src/doctor/report.ts +57 -13
  237. package/src/editor-api.ts +295 -31
  238. package/src/editor-compatibility.ts +200 -0
  239. package/src/editor-console.ts +35 -17
  240. package/src/editor-hotkeys.ts +85 -33
  241. package/src/editor-store.ts +538 -233
  242. package/src/editor-viewport.ts +160 -34
  243. package/src/entity-factory.ts +14 -3
  244. package/src/gizmo-registry.ts +21 -5
  245. package/src/harness-chat-editor-context.ts +37 -0
  246. package/src/harness-chat-indicator.ts +68 -0
  247. package/src/harness-chat-layout.ts +53 -0
  248. package/src/harness-chat-lifecycle.ts +170 -0
  249. package/src/harness-chat-reconnect.ts +85 -0
  250. package/src/harness-chat-types.ts +409 -0
  251. package/src/hierarchy-drop.ts +50 -0
  252. package/src/hierarchy-expansion-state.ts +100 -0
  253. package/src/hierarchy-menu-registry.ts +1 -1
  254. package/src/hierarchy-projection.ts +76 -0
  255. package/src/history/editor-session.ts +21 -0
  256. package/src/history/history-commands.ts +147 -0
  257. package/src/history/history-service.ts +904 -0
  258. package/src/history/json-history-resource.ts +165 -0
  259. package/src/history/persistence-coordinator.ts +35 -0
  260. package/src/history/project-file-history.ts +266 -0
  261. package/src/history/project-root-history-backends.ts +53 -0
  262. package/src/history/resource-registry.ts +209 -0
  263. package/src/history/snapshot-store.ts +108 -0
  264. package/src/history/source-history-backend.ts +374 -0
  265. package/src/history/types.ts +100 -0
  266. package/src/hmr-registration-group.ts +67 -0
  267. package/src/hmr-stable-react-context.ts +23 -0
  268. package/src/hosted-example.ts +12 -2
  269. package/src/hotkeys.ts +89 -18
  270. package/src/ingest/discovery-react.ts +9 -10
  271. package/src/ingest/discovery.ts +4 -4
  272. package/src/ingest/discovery2d.ts +5 -5
  273. package/src/ingest/games/bloom-composer/vgai.game.json +3 -3
  274. package/src/ingest/games/embed-bundle/vgai.game.json +3 -3
  275. package/src/ingest/games/games-fps/vgai.game.json +3 -3
  276. package/src/ingest/games/iframe-reachable/vgai.game.json +3 -3
  277. package/src/ingest/games/interactive-cubes/vgai.game.json +3 -3
  278. package/src/ingest/games/mismatched-three/vgai.game.json +3 -3
  279. package/src/ingest/games/own-three-bundled/vgai.game.json +3 -3
  280. package/src/ingest/games/pointerlock-maze/vgai.game.json +7 -4
  281. package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +3 -3
  282. package/src/ingest/games-2d/bunnymark/vgai.game.json +3 -3
  283. package/src/ingest/games-2d/flappy/vgai.game.json +3 -3
  284. package/src/ingest/games-2d/flappy-pixi/vgai.game.json +3 -3
  285. package/src/ingest/games-2d/puzzling-potions/vgai.game.json +3 -3
  286. package/src/ingest/games-2d/tilemap-camera/vgai.game.json +3 -3
  287. package/src/ingest/games-react/react-rpg/vgai.game.json +3 -3
  288. package/src/ingest/types.ts +1 -1
  289. package/src/ingest-mode.ts +47 -52
  290. package/src/ingest-siblings.ts +23 -33
  291. package/src/initial-scene.ts +1 -2
  292. package/src/main.tsx +16 -8
  293. package/src/manifest-project.ts +10 -12
  294. package/src/model-thumbnail.ts +261 -26
  295. package/src/module-mode.ts +44 -50
  296. package/src/play-log-events.ts +26 -0
  297. package/src/play-mode.ts +495 -401
  298. package/src/play-scene-adoption.ts +23 -0
  299. package/src/playground/main.ts +68 -24
  300. package/src/playwright-shim.ts +473 -0
  301. package/src/project-manager.ts +90 -10
  302. package/src/project-operations.ts +112 -0
  303. package/src/project-story-discovery.ts +25 -0
  304. package/src/project-tool-discovery.ts +43 -0
  305. package/src/scene-serializer.ts +0 -6
  306. package/src/scene-sync.ts +7 -2
  307. package/src/script-loader.ts +3 -3
  308. package/src/skeleton-helper.ts +57 -0
  309. package/src/storage/seed.ts +68 -8
  310. package/src/stories/StoryPreviewMount.tsx +265 -0
  311. package/src/stories/action-stories.fixture.tsx +44 -0
  312. package/src/stories/button-stories.fixture.tsx +50 -0
  313. package/src/stories/compose-project-stories.ts +182 -0
  314. package/src/stories/loader-stories.fixture.tsx +53 -0
  315. package/src/stories/story-discovery.ts +130 -0
  316. package/src/stories/story-registry.ts +146 -0
  317. package/src/theme-css.ts +1049 -0
  318. package/src/theme-library.ts +238 -0
  319. package/src/theme-preference.ts +130 -0
  320. package/src/theme.ts +527 -0
  321. package/src/tool-loader.ts +80 -24
  322. package/src/ui-source/inspect.ts +27 -4
  323. package/src/ui-source/source-write-backend.ts +83 -22
  324. package/src/widgets/index.ts +9 -18
  325. package/src/workspace-aux-commands.ts +11 -0
  326. package/src/workspace-dock-controller.ts +64 -0
  327. package/src/workspace-document-ids.ts +5 -0
  328. package/src/workspace-document-registry.ts +367 -0
  329. package/src/workspace-state-persistence.ts +455 -0
  330. package/src/workspace-status-registry.ts +110 -0
  331. package/src/workspace-utility-commands.ts +49 -0
  332. package/src/workspace-utility-registry.ts +161 -0
  333. package/src/world-document-routing.ts +16 -0
  334. package/src/xstate-inspect/XStateMachineInspector.tsx +544 -0
  335. package/src/xstate-inspect/character-animation-machine.fixture.ts +74 -0
  336. package/src/xstate-inspect/use-live-actor-state.ts +39 -0
  337. package/src/xstate-inspect/xstate-graph.ts +265 -0
  338. package/src/xstate-inspect/xstate-layout.ts +76 -0
  339. package/src/z-index.ts +26 -0
  340. package/template/.claude/skills/editor/SKILL.md +129 -90
  341. package/template/AGENTS.md +1110 -0
  342. package/template/CLAUDE.md +1 -512
  343. package/template/IDIOMS.md +50 -0
  344. package/template/check-idioms.ts +706 -0
  345. package/template/manifest-entry-modules-plugin.ts +53 -0
  346. package/template/package.json +13 -4
  347. package/template/public/scenes/default.scn2d.json +6 -0
  348. package/template/public/scenes/default.vscn.json +7 -1
  349. package/template/public/scenes/untitled.vscn.json +10 -0
  350. package/template/scripts/playtest.ts +40 -0
  351. package/template/server/loopback.ts +75 -0
  352. package/template/server/rooms/arena-room.ts +69 -1
  353. package/template/server/rooms/game-room.ts +68 -1
  354. package/template/src/data/README.md +9 -4
  355. package/template/src/data/data-ref.ts +35 -0
  356. package/template/src/data/tuning.schema.ts +1 -1
  357. package/template/src/main.ts +41 -62
  358. package/template/src/manifest-entry-modules.d.ts +3 -0
  359. package/template/src/operations/README.md +88 -0
  360. package/template/src/runtime/pixi-adapter.ts +24 -0
  361. package/template/src/scripts/components/data-spinner.ts +43 -2
  362. package/template/src/scripts/components/spin-lap-math.ts +27 -0
  363. package/template/src/tools/README.md +5 -3
  364. package/template/src/tools/example.tool.tsx +13 -7
  365. package/template/src/ui/Button.stories.tsx +66 -0
  366. package/template/src/ui/RebindPanel.tsx +2 -6
  367. package/template/src/ui/game.tsx +17 -0
  368. package/template/tests/acceptance/example.spec.ts +64 -0
  369. package/template/tests/logic/example.test.ts +31 -0
  370. package/template/tests/logic/room.test.ts +100 -0
  371. package/template/tests/tsconfig.json +30 -0
  372. package/template/validate-manifest.ts +5 -5
  373. package/template/validate-scenes.ts +50 -18
  374. package/template/vgai.game.json +20 -13
  375. package/template/vite.config.ts +77 -16
  376. package/vite-plugin-ui-oid.ts +261 -17
  377. package/dist/assets/CCDIKSolver-Dz-ysxZF.js +0 -1
  378. package/dist/assets/SelectionBox-BXsv_6aH.js +0 -1
  379. package/dist/assets/browser-project-scripts-DOru4L1x.js +0 -2
  380. package/dist/assets/browserAll-CEkWYlFk.js +0 -1
  381. package/dist/assets/create-runtime-DYIWr3va.js +0 -1
  382. package/dist/assets/data-asset-Bb9sIM7i.js +0 -5
  383. package/dist/assets/game-8SDZPPgH.js +0 -1
  384. package/dist/assets/game-CevorxyV.js +0 -1
  385. package/dist/assets/game-Di7XlywD.js +0 -1
  386. package/dist/assets/game-DjnCaw8R.js +0 -1
  387. package/dist/assets/game-Q9A0aXSV.js +0 -1
  388. package/dist/assets/index-CPVV6pjw.js +0 -1
  389. package/dist/assets/index-CpOnYyeD.js +0 -213
  390. package/dist/assets/index-Dr8H_6Rl.js +0 -1
  391. package/dist/assets/index-_bCaipUk.js +0 -13650
  392. package/dist/assets/ingest-siblings-Dz8eEqrV.js +0 -1
  393. package/dist/assets/mount-manifest-Bhk0ohsl.js +0 -1
  394. package/dist/assets/scene-query-BivAHhJu.js +0 -1
  395. package/dist/assets/webworkerAll-BLrH0F6F.js +0 -1
  396. package/dist/assets/xstate-animation-binding-1NGLmw6y.js +0 -1
  397. package/dist/assets/xstate.esm-BgUD33nl.js +0 -3
  398. package/src/authoring/scene-ui-layer.ts +0 -485
  399. package/src/authoring/ui-authoring-adapter.ts +0 -325
  400. package/src/authoring/ui-hierarchy-menu.ts +0 -40
  401. package/src/authoring/ui-inspector-sections.tsx +0 -156
  402. package/src/authoring/undo-timeline.ts +0 -145
  403. package/src/components/BottomPanel.tsx +0 -326
  404. package/src/components/BuildPanel.tsx +0 -455
  405. package/src/components/FolderTree.tsx +0 -179
  406. package/src/components/RightPanel.tsx +0 -166
  407. package/src/components/WorldContextMenu.tsx +0 -257
  408. package/src/components/asset-viewers/AssetViewer.tsx +0 -38
  409. package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +0 -129
  410. package/src/scene-ui-mode/active-scene-ui.ts +0 -58
  411. package/src/scene-ui-mode/scene-ui-palette-panel.tsx +0 -152
  412. package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +0 -29
  413. package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +0 -74
  414. package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +0 -49
  415. package/src/scene-ui-mode/ui-prefab-io.ts +0 -76
  416. package/src/ui-editor/inspector.tsx +0 -563
  417. package/src/ui-editor/node-ops.ts +0 -266
  418. package/src/ui-editor/overlay.tsx +0 -380
  419. package/src/ui-editor/palette.tsx +0 -114
  420. package/src/ui-editor/react-store.ts +0 -78
  421. package/src/ui-editor/timeline-panel.tsx +0 -443
  422. package/src/ui-editor/ui-edit-store.ts +0 -552
  423. package/src/ui-editor/ui-prefab.ts +0 -95
  424. package/template/project.json +0 -9
  425. package/template/src/scripts/main.ts +0 -94
  426. package/template/src/ui/DefaultHud.tsx +0 -40
  427. package/template/src/ui/game-state.tsx +0 -37
  428. package/template/src/ui/mount-default-hud.tsx +0 -19
  429. package/template/src/ui/mount-ui.ts +0 -15
  430. package/vite-plugin-react-world-provider.ts +0 -81
@@ -1,19 +1,22 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "three.js — Pointer-Lock Maze",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "pointerlock-maze",
11
- "kind": "threejs",
12
11
  "description": "Upstream misc_controls_pointerlock: WASD + pointer-lock first-person walk over a procedural box field. Own scene/camera/renderer/rAF/input. Needs #blocker/#instructions DOM.",
13
12
  "adapter": {
13
+ "surface": "threejs",
14
14
  "ingest": {
15
15
  "strategy": "shared",
16
- "domStubs": ["blocker", "instructions"]
16
+ "domStubs": [
17
+ "blocker",
18
+ "instructions"
19
+ ]
17
20
  }
18
21
  },
19
22
  "entry": "game.js"
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Bubbo Bubbo (real OSS game)",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "bubbo-bubbo",
11
- "kind": "pixijs",
12
11
  "description": "REAL unmodified OSS PixiJS game — pixijs/open-games Bubbo Bubbo, vendored byte-for-byte under vendor/pixi-games/bubbo-bubbo (MIT) and mounted via the iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-bubbo.sh first.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "iframe-reachable",
16
16
  "bundleUrl": "/pixi-game-static/bubbo-bubbo/bubbo-bubbo.mjs",
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Bunnymark",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "bunnymark",
11
- "kind": "pixijs",
12
11
  "description": "Canonical PixiJS sprite-batching stress test — thousands of bouncing sprites.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "shared"
16
16
  }
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Flappy Bird",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "flappy",
11
- "kind": "pixijs",
12
11
  "description": "Gravity/physics, keyboard + pointer input, AABB collision, scrolling, score HUD.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "shared"
16
16
  }
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Flappy Pixi (real OSS game, pixi v6)",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "flappy-pixi",
11
- "kind": "pixijs",
12
11
  "description": "REAL unmodified OSS PixiJS game — aliexme's Flappy Pixi, vendored byte-for-byte under vendor/pixi-games/flappy-pixi (MIT). Pixi v6 on the v8 host via version-skew (D-P2): pixiModuleUrl's PRESENCE swaps the trapped instance to a served standalone pixi@6.5.10 build. Assets are inlined in the bundle. Requires the gitignored bundles: run vendor/pixi-games/_host/build-flappy-pixi.sh first.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "iframe-reachable",
16
16
  "bundleUrl": "/pixi-game-static/flappy-pixi/flappy-pixi.mjs",
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Puzzling Potions (real OSS game)",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "puzzling-potions",
11
- "kind": "pixijs",
12
11
  "description": "REAL unmodified OSS PixiJS game — pixijs/open-games Puzzling Potions (match-3 with Spine animations; spine-pixi-v8 pinned exactly 4.2.95 — see host-namespace-registry.ts), vendored byte-for-byte under vendor/pixi-games/puzzling-potions (MIT), iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-puzzling-potions.sh first.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "iframe-reachable",
16
16
  "bundleUrl": "/pixi-game-static/puzzling-potions/puzzling-potions.mjs",
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "Tilemap + Camera",
4
4
  "version": "0.1.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "tilemap-camera",
11
- "kind": "pixijs",
12
11
  "description": "Real @pixi/tilemap CompositeTilemap (60x40 grid) + keyboard player + camera follow.",
13
12
  "adapter": {
13
+ "surface": "pixijs",
14
14
  "ingest": {
15
15
  "strategy": "shared"
16
16
  }
@@ -1,16 +1,16 @@
1
1
  {
2
- "manifestVersion": 1,
2
+ "manifestVersion": 2,
3
3
  "name": "React RPG: 2e (real OSS game)",
4
4
  "version": "2.0.0",
5
5
  "engine": {
6
6
  "version": "0.1.0"
7
7
  },
8
- "worlds": [
8
+ "roots": [
9
9
  {
10
10
  "id": "react-rpg",
11
- "kind": "react",
12
11
  "description": "REAL unmodified native-React OSS game — ASteinheiser/react-rpg.com, vendored byte-for-byte under vendor/react-games/react-rpg (MIT) and mounted via the ingest-react identity (Track N, D-N1/D-N2/D-N3). No authoring in v1 (D-N8) — this world is ingested read-only, no scene/write-back surface.",
13
12
  "adapter": {
13
+ "surface": "react",
14
14
  "ingest": {
15
15
  "strategy": "deduped"
16
16
  }
@@ -81,7 +81,7 @@ export interface IngestGame {
81
81
  * a manifest that has one. `ingest/discovery.ts`'s in-tree fixture route
82
82
  * sets this from the parsed manifest's `version`; `adapter-resolver.ts`'s
83
83
  * `resolveIngestDescriptor` (the CLI-on-folder / manifest-world route)
84
- * cannot — it only has a `ResolvedWorldEntry`, not the manifest's top-level
84
+ * cannot — it only has a `ResolvedAdapterRoot`, not the manifest's top-level
85
85
  * `version` — so `ingest-mode.ts`'s `enterIngestModeFromManifestWorld`
86
86
  * threads the resolved manifest's `version` through as an explicit
87
87
  * parameter instead, taking precedence over this field where both exist.
@@ -32,7 +32,7 @@
32
32
 
33
33
  import { readGameContract } from '@engine/adapter/ingest/game-contract';
34
34
  import { extractUpstreamPin } from '@engine/adapter/ingest/upstream-pin';
35
- import type { ResolvedGameManifest, ResolvedWorldEntry } from '@engine/manifest/load';
35
+ import type { ResolvedAdapterRoot, ResolvedGameManifest } from '@engine/manifest/load';
36
36
  import type { Tier } from '@engine/manifest/schema';
37
37
  import type { Overlay2D } from '@engine/world2d/authoring-2d';
38
38
  import {
@@ -90,7 +90,6 @@ import {
90
90
  ReactDomAuthoringAdapter,
91
91
  type ReactDomOverlay,
92
92
  } from './authoring/react-dom-authoring-adapter';
93
- import { unregisterUndoAdapter } from './authoring/undo-timeline';
94
93
  import { loadWorldOverlay, saveWorldOverlay, worldOverlayPath } from './authoring/world-overlay';
95
94
  import { World2DAuthoringAdapter } from './authoring/world2d-authoring-adapter';
96
95
  import { editorConsole } from './editor-console';
@@ -134,7 +133,7 @@ interface IngestSession {
134
133
  * own sections), referenced here by forward type reference.
135
134
  *
136
135
  * `siblings` (D-V2, docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md, F24 composite):
137
- * a composite manifest's OTHER worlds, mounted beside this session's ingest
136
+ * a composite manifest's OTHER roots, mounted beside this session's ingest
138
137
  * world (`ingest-siblings.ts`'s `mountIngestSiblings`) — always `[]` for
139
138
  * every non-composite entry path (the in-tree fixture glob route, the
140
139
  * `?ingest=` URL route, a single-world manifest). `exitActiveIngest` below
@@ -490,7 +489,7 @@ async function mountThreeIframeReachableBundle(
490
489
  *
491
490
  * `declaredTier` (T3.4 slice 1, docs/ADAPTER-AUTHORING-DESIGN.md §1.C
492
491
  * retrofit) is the world's declared `capabilities.local` tier, when known —
493
- * only `enterIngestModeFromManifestWorld` has a `ResolvedWorldEntry` to read
492
+ * only `enterIngestModeFromManifestWorld` has a `ResolvedAdapterRoot` to read
494
493
  * it from; the in-tree fixture route (`enterIngestMode`) has no manifest at
495
494
  * all, so it stays `undefined` there (anti-shim: never fabricate a declared
496
495
  * tier that was never actually declared). Both embed-only degradation points
@@ -772,7 +771,7 @@ export async function enterIngestMode(store: EditorStore, gameId: string): Promi
772
771
  * world id too, for the in-tree fixtures — same namespace, different origin).
773
772
  *
774
773
  * `gameVersion` (T7.7/D9): `resolveIngestDescriptor` only has a
775
- * `ResolvedWorldEntry`, not the manifest's top-level `version` — so the caller
774
+ * `ResolvedAdapterRoot`, not the manifest's top-level `version` — so the caller
776
775
  * (`tryManifestIngestRoute` below, which fetched the full `ResolvedGameManifest`)
777
776
  * passes it here explicitly, threaded straight through to `enterIngestModeWithGame`.
778
777
  *
@@ -783,7 +782,7 @@ export async function enterIngestMode(store: EditorStore, gameId: string): Promi
783
782
  */
784
783
  export async function enterIngestModeFromManifestWorld(
785
784
  store: EditorStore,
786
- world: ResolvedWorldEntry,
785
+ world: ResolvedAdapterRoot,
787
786
  projectRoot: string,
788
787
  gameVersion?: string,
789
788
  upstreamPin?: string | null,
@@ -996,7 +995,7 @@ export async function enterIngestModeWithGame2D(
996
995
  throw new Error(
997
996
  `enterIngestModeWithGame2D: world2d ingest game "${game.id}" has neither \`load\` nor ` +
998
997
  '`bundleUrl` — only shared/deduped (load) or iframe-reachable (bundleUrl) ingest-pixi ' +
999
- 'worlds are mountable this slice (resolveIngest2DDescriptor).',
998
+ 'roots are mountable this slice (resolveIngest2DDescriptor).',
1000
999
  );
1001
1000
  }
1002
1001
 
@@ -1105,7 +1104,7 @@ export async function enterIngestModeWithGame2D(
1105
1104
  */
1106
1105
  export async function enterIngestModeFromManifestWorld2D(
1107
1106
  store: EditorStore,
1108
- world: ResolvedWorldEntry,
1107
+ world: ResolvedAdapterRoot,
1109
1108
  projectRoot: string,
1110
1109
  ): Promise<void> {
1111
1110
  const game = resolveIngest2DDescriptor(world, projectRoot);
@@ -1141,7 +1140,9 @@ function disposePixiSession(s: IngestSession2D): void {
1141
1140
  // timeline (mirrors `IngestAuthoringAdapter` — see disposeThreejsSession's
1142
1141
  // identical call above), so this session's entries must be dropped the same
1143
1142
  // way on exit. Absent for a D-W2 opaque-embed session (no adapter, no undo entries).
1144
- if (s.adapter) unregisterUndoAdapter(s.adapter);
1143
+ if (s.adapter) {
1144
+ s.adapter.dispose();
1145
+ }
1145
1146
  setActiveAuthoring(null);
1146
1147
  setActiveSystems(null);
1147
1148
  setMountFailureReport(null); // D-W3: no session -> no banner to show (mirrors setActiveOverlayReport(null) above)
@@ -1176,9 +1177,7 @@ interface IngestSessionReact {
1176
1177
  /** The runtime Game's real play-state control — the F26 play surface. */
1177
1178
  setPaused: (paused: boolean) => void;
1178
1179
  stop: () => void;
1179
- /** D-K4 (wave 10 Slice A): the live DOM-authoring adapter both routes now
1180
- * install — self-registered with the global undo timeline at construction,
1181
- * so teardown must unregister it (mirrors `IngestSession2D.adapter`). */
1180
+ /** Live DOM-authoring adapter; owns a session history resource. */
1182
1181
  adapter: ReactDomAuthoringAdapter;
1183
1182
  }
1184
1183
 
@@ -1229,17 +1228,17 @@ function reactDomEvidence(
1229
1228
  * `?ingest=<id>` URL route's react fallback, tried after the three/pixi
1230
1229
  * fixture globs — see `autoLaunchIngestFromURL` below). Mounts through the
1231
1230
  * EXACT SAME T6.2 react-world host stack `default-react`/multi-world react
1232
- * worlds use — NOT the capture-based three/pixi bridge (there is no scene to
1231
+ * roots use — NOT the capture-based three/pixi bridge (there is no scene to
1233
1232
  * capture; the mounted tree IS React, D-N1).
1234
1233
  *
1235
1234
  * Reuses `resolveAllWorlds` + the WORLDS-PATH `createGameRuntime` (not the
1236
1235
  * legacy single-`{canvas,adapter}` path, which is three-only and has no
1237
1236
  * `ReactWorldHost`/`container` concept — see `create-runtime.ts`'s
1238
1237
  * `HostContext`) rather than hand-building a `ReactWorldHost`/`Game`: a
1239
- * single-element `worlds` array gets EVERY host concern for free (the
1238
+ * single-element `roots` array gets EVERY host concern for free (the
1240
1239
  * absolutely-positioned DOM-root layer, a real `Game`, dispose via
1241
1240
  * `session.stop()`) with zero reinvention — `resolveAllWorlds`'s
1242
- * `MULTI_WORLD_ALLOWED_IDENTITIES` gate only fires for `worlds.length > 1`
1241
+ * `MULTI_WORLD_ALLOWED_IDENTITIES` gate only fires for `roots.length > 1`
1243
1242
  * (see that function's doc comment), so a ONE-element manifest containing an
1244
1243
  * `ingest-react` world resolves cleanly through it despite that identity
1245
1244
  * being excluded from real multi-world manifests.
@@ -1295,7 +1294,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
1295
1294
  const h = gameContainer.clientHeight;
1296
1295
  const session = await createGameRuntime({
1297
1296
  container: gameContainer,
1298
- worlds: specs,
1297
+ roots: specs,
1299
1298
  width: w,
1300
1299
  height: h,
1301
1300
  });
@@ -1307,7 +1306,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
1307
1306
  // adapter with none — it is installed directly, never `withStoreSelection`-wrapped.
1308
1307
  const worldId = game.worldId;
1309
1308
  const overlay = await loadWorldOverlay<ReactDomOverlay>(worldId);
1310
- const root = session.game.worlds[0]!.reactRoot();
1309
+ const root = session.game.roots[0]!.reactRoot();
1311
1310
  const adapter = new ReactDomAuthoringAdapter(root, store, {
1312
1311
  overlay,
1313
1312
  persist: (o) => saveWorldOverlay(worldId, o),
@@ -1367,8 +1366,8 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
1367
1366
  * manifest-route sibling of {@link enterIngestModeReact} above: an
1368
1367
  * EXTERNAL-FOLDER `ingest-react` world (the opened project's OWN
1369
1368
  * `vgai.game.json`, not the vendored `games-react/<id>` discovery glob)
1370
- * enters the same react ingest session. Exactly the same worlds-path recipe
1371
- * (one-element `resolveAllWorlds` + worlds-path `createGameRuntime`) and the
1369
+ * enters the same react ingest session. Exactly the same roots-path recipe
1370
+ * (one-element `resolveAllWorlds` + roots-path `createGameRuntime`) and the
1372
1371
  * same `ReactDomAuthoringAdapter` D-K4 wiring (see that function's doc
1373
1372
  * comment) — only the SOURCE of `world`/`projectRoot` differs (the opened project's manifest +
1374
1373
  * `project.rootPath`, via `tryManifestIngestRouteReact` below, instead of
@@ -1382,7 +1381,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
1382
1381
  export async function enterIngestModeFromManifestWorldReact(
1383
1382
  store: EditorStore,
1384
1383
  manifest: ResolvedGameManifest,
1385
- world: ResolvedWorldEntry,
1384
+ world: ResolvedAdapterRoot,
1386
1385
  projectRoot: string,
1387
1386
  ): Promise<void> {
1388
1387
  if (getEditorMode() === 'browser') {
@@ -1411,12 +1410,12 @@ export async function enterIngestModeFromManifestWorldReact(
1411
1410
  // above) makes — an external-folder game may declare the game contract too.
1412
1411
  (window as unknown as { __vgaiMountCold?: boolean }).__vgaiMountCold = true;
1413
1412
  const { createGameRuntime } = await import('@engine/runtime/create-runtime');
1414
- const specs = await resolveAllWorlds({ ...manifest, worlds: [world] }, projectRoot);
1413
+ const specs = await resolveAllWorlds({ ...manifest, roots: [world] }, projectRoot);
1415
1414
  const w = gameContainer.clientWidth;
1416
1415
  const h = gameContainer.clientHeight;
1417
1416
  const session = await createGameRuntime({
1418
1417
  container: gameContainer,
1419
- worlds: specs,
1418
+ roots: specs,
1420
1419
  width: w,
1421
1420
  height: h,
1422
1421
  });
@@ -1426,7 +1425,7 @@ export async function enterIngestModeFromManifestWorldReact(
1426
1425
  // not `game.worldId` (the vendored-fixture wrapper's field).
1427
1426
  const worldId = world.id;
1428
1427
  const overlay = await loadWorldOverlay<ReactDomOverlay>(worldId);
1429
- const root = session.game.worlds[0]!.reactRoot();
1428
+ const root = session.game.roots[0]!.reactRoot();
1430
1429
  const adapter = new ReactDomAuthoringAdapter(root, store, {
1431
1430
  overlay,
1432
1431
  persist: (o) => saveWorldOverlay(worldId, o),
@@ -1476,12 +1475,8 @@ export async function enterIngestModeFromManifestWorldReact(
1476
1475
  */
1477
1476
  function disposeReactSession(s: IngestSessionReact): void {
1478
1477
  setGameInputGate(() => true);
1479
- // D-K4: this session's ReactDomAuthoringAdapter self-registered with the
1480
- // global undo timeline at construction (mirrors `IngestAuthoringAdapter`/
1481
- // `World2DAuthoringAdapter`/`ReactWorldAuthoringAdapter`) — drop it so any
1482
- // of its entries still on the global stack are dropped (with a warn), not
1483
- // undone against a torn-down DOM.
1484
- unregisterUndoAdapter(s.adapter);
1478
+ // Disposal expires its session history and releases listeners.
1479
+ s.adapter.dispose();
1485
1480
  setActiveAuthoring(null);
1486
1481
  setActiveSystems(null);
1487
1482
  setMountFailureReport(null); // D-W3: no session -> no banner to show (mirrors disposeThreejsSession's identical call)
@@ -1521,10 +1516,11 @@ function disposeThreejsSession(s: IngestSession): void {
1521
1516
  // way on exit.
1522
1517
  setGameInputGate(() => true);
1523
1518
 
1524
- // T3.2 slice 2: this ingest session's authoring adapter is done recording —
1525
- // drop it from the undo timeline's live set so any of its entries still on the
1526
- // global stack are dropped (with a warn), not undone against a torn-down scene.
1527
- if (s.mount?.authoring) unregisterUndoAdapter(s.mount.authoring);
1519
+ // The concrete ingest adapter owns a session history resource. Dispose it
1520
+ // when present; minimal/custom authoring implementations need no teardown.
1521
+ if (s.mount?.authoring) {
1522
+ s.mount.authoring.dispose?.();
1523
+ }
1528
1524
  setActiveAuthoring(null);
1529
1525
  setActiveSystems(null);
1530
1526
  setActiveOverlayReport(null); // D9: no session -> no banner to show
@@ -1629,7 +1625,7 @@ if (import.meta.env.DEV) {
1629
1625
  * Wait for the Game-tab container (registered via a callback ref at layout
1630
1626
  * mount) — poll a bounded number of rAF ticks so we don't race the first
1631
1627
  * paint. Exported (T3.4 slice 2) so `module-mode.ts`'s manifest-route auto-
1632
- * mount for `{ module }` worlds — the sibling of `tryManifestIngestRoute`
1628
+ * mount for `{ module }` roots — the sibling of `tryManifestIngestRoute`
1633
1629
  * below — can reuse the SAME wait rather than duplicating it.
1634
1630
  */
1635
1631
  export async function waitForGameContainer(): Promise<boolean> {
@@ -1646,17 +1642,17 @@ export async function waitForGameContainer(): Promise<boolean> {
1646
1642
 
1647
1643
  /**
1648
1644
  * D-V2 (docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md, F24 composite): every world
1649
- * in `manifest.worlds` whose adapter is `{ ingest }` — a composite manifest
1645
+ * in `manifest.roots` whose adapter is `{ ingest }` — a composite manifest
1650
1646
  * caps this at exactly one (see each `tryManifestIngestRoute*` below); ≥2 is
1651
1647
  * a loud named error via {@link reportTooManyIngestWorlds}, never a silent
1652
1648
  * first-wins pick (mirrors `run-bundle.ts`'s fail-on-ambiguity pattern).
1653
1649
  */
1654
- function findIngestWorlds(manifest: ResolvedGameManifest): ResolvedWorldEntry[] {
1655
- return manifest.worlds.filter((w) => w.adapter.type === 'ingest');
1650
+ function findIngestWorlds(manifest: ResolvedGameManifest): ResolvedAdapterRoot[] {
1651
+ return manifest.roots.filter((w) => w.adapter.type === 'ingest');
1656
1652
  }
1657
1653
 
1658
1654
  /**
1659
- * D-V2: the "composite declares ≥2 ingest worlds" violation — named, listing
1655
+ * D-V2: the "composite declares ≥2 ingest roots" violation — named, listing
1660
1656
  * every offending world id, reported once (into BOTH `editorConsole` and the
1661
1657
  * D-V5 multi-entry mount-failure report, one entry per offending world so
1662
1658
  * the banner names all of them) by whichever `tryManifestIngestRoute*`
@@ -1664,7 +1660,7 @@ function findIngestWorlds(manifest: ResolvedGameManifest): ResolvedWorldEntry[]
1664
1660
  * `autoLaunchIngestFromURL`) — the caller returns `true` right after this
1665
1661
  * (claims the route), so the other two ingest routes never also report it.
1666
1662
  */
1667
- function reportTooManyIngestWorlds(ingestWorlds: ResolvedWorldEntry[]): void {
1663
+ function reportTooManyIngestWorlds(ingestWorlds: ResolvedAdapterRoot[]): void {
1668
1664
  const ids = ingestWorlds.map((w) => `"${w.id}"`).join(', ');
1669
1665
  const message =
1670
1666
  'a composite manifest declares exactly ONE ingest world in this slice — found ' +
@@ -1673,7 +1669,7 @@ function reportTooManyIngestWorlds(ingestWorlds: ResolvedWorldEntry[]): void {
1673
1669
  for (const world of ingestWorlds) {
1674
1670
  addMountFailureReport({
1675
1671
  worldId: world.id,
1676
- kind: world.kind,
1672
+ kind: world.surface,
1677
1673
  identity: world.adapter.identity,
1678
1674
  message,
1679
1675
  });
@@ -1746,17 +1742,17 @@ async function mountCompositeSiblings(
1746
1742
  */
1747
1743
  function promoteToCompositeAuthoring(
1748
1744
  manifest: ResolvedGameManifest,
1749
- ingestWorld: ResolvedWorldEntry,
1745
+ ingestWorld: ResolvedAdapterRoot,
1750
1746
  siblings: readonly SiblingMount[],
1751
1747
  ): void {
1752
1748
  if (siblings.length === 0) return;
1753
1749
  const primaryAdapter = getAuthoringOverride();
1754
1750
  if (!primaryAdapter) return;
1755
1751
  const children: CompositeChild[] = [
1756
- { worldId: ingestWorld.id, kind: ingestWorld.kind, adapter: primaryAdapter },
1752
+ { worldId: ingestWorld.id, kind: ingestWorld.surface, adapter: primaryAdapter },
1757
1753
  ...siblings.map((s) => ({
1758
1754
  worldId: s.worldId,
1759
- kind: manifest.worlds.find((w) => w.id === s.worldId)?.kind ?? 'unknown',
1755
+ kind: manifest.roots.find((w) => w.id === s.worldId)?.surface ?? 'unknown',
1760
1756
  // D-E1: every successfully-mounted SiblingMount gets an honest
1761
1757
  // `authoring` whenever a store was supplied — every composite route
1762
1758
  // below supplies one, so this is never actually undefined in
@@ -1776,8 +1772,8 @@ function promoteToCompositeAuthoring(
1776
1772
  * ingest world at all, or the one ingest world isn't ingest-three", so the
1777
1773
  * next route (pixi, react, then the URL route) still gets a chance.
1778
1774
  *
1779
- * D-V2 (F24 composite): scans ALL worlds for `{ ingest }` adapters, not just
1780
- * `worlds[0]` — 0 ingest worlds declines (unchanged non-ingest-manifest
1775
+ * D-V2 (F24 composite): scans ALL roots for `{ ingest }` adapters, not just
1776
+ * `roots[0]` — 0 ingest roots declines (unchanged non-ingest-manifest
1781
1777
  * behavior); ≥2 claims the route and fails loudly
1782
1778
  * ({@link reportTooManyIngestWorlds}), mounting nothing; exactly 1 whose
1783
1779
  * identity is `ingest-three` mounts THAT world (wherever it sits in the
@@ -1815,7 +1811,7 @@ async function tryManifestIngestRoute(store: EditorStore): Promise<boolean> {
1815
1811
  try {
1816
1812
  // D9/T7.7: thread the manifest's OWN version through — resolveIngestDescriptor
1817
1813
  // (called inside enterIngestModeFromManifestWorld) only sees the per-world
1818
- // ResolvedWorldEntry, not this top-level field.
1814
+ // ResolvedAdapterRoot, not this top-level field.
1819
1815
  // R5 (§4(c)): best-effort read of this project's UPSTREAM.md pin, same
1820
1816
  // spirit — resolveIngestDescriptor has no way to discover one either.
1821
1817
  const upstreamPin = await readVendoredUpstreamPin();
@@ -1849,7 +1845,7 @@ async function tryManifestIngestRoute(store: EditorStore): Promise<boolean> {
1849
1845
  // Populate the loud banner slot too.
1850
1846
  setMountFailureReport({
1851
1847
  worldId: ingestWorld.id,
1852
- kind: ingestWorld.kind,
1848
+ kind: ingestWorld.surface,
1853
1849
  identity: ingestWorld.adapter.identity,
1854
1850
  message: formatMountFailureMessage(err),
1855
1851
  });
@@ -1910,7 +1906,7 @@ async function tryManifestIngestRoute2D(store: EditorStore): Promise<boolean> {
1910
1906
  // D-W3 (F9) — see tryManifestIngestRoute's identical comment above.
1911
1907
  setMountFailureReport({
1912
1908
  worldId: ingestWorld.id,
1913
- kind: ingestWorld.kind,
1909
+ kind: ingestWorld.surface,
1914
1910
  identity: ingestWorld.adapter.identity,
1915
1911
  message: formatMountFailureMessage(err),
1916
1912
  });
@@ -1973,7 +1969,7 @@ async function tryManifestIngestRouteReact(store: EditorStore): Promise<boolean>
1973
1969
  // D-W3 (F9) — see tryManifestIngestRoute's identical comment above.
1974
1970
  setMountFailureReport({
1975
1971
  worldId: ingestWorld.id,
1976
- kind: ingestWorld.kind,
1972
+ kind: ingestWorld.surface,
1977
1973
  identity: ingestWorld.adapter.identity,
1978
1974
  message: formatMountFailureMessage(err),
1979
1975
  });
@@ -1999,8 +1995,7 @@ async function tryManifestIngestRouteReact(store: EditorStore): Promise<boolean>
1999
1995
  * 2. Manifest route, three (T3.3 slice 3, docs/CLI-ON-FOLDER-DESIGN.md §1E,
2000
1996
  * `tryManifestIngestRoute` above) — the CLI-on-folder AC ("point the CLI
2001
1997
  * at an ingest game folder never registered in source -> opens, plays,
2002
- * edits"). Browser-mode builds and legacy `project.json`-only projects
2003
- * both fall straight through to route 5, unchanged.
1998
+ * edits"). Browser-mode builds fall straight through to route 5.
2004
1999
  * 3. Manifest route, pixi (T6.1 slice 4, `tryManifestIngestRoute2D` above) —
2005
2000
  * the world2d silo retirement's replacement discovery path for an
2006
2001
  * `ingest-pixi` world.
@@ -2040,7 +2035,7 @@ export async function autoLaunchIngestFromURL(store: EditorStore): Promise<void>
2040
2035
  } catch (err) {
2041
2036
  editorConsole.error(`Auto-ingest failed: ${err}`, 'ingest');
2042
2037
  // D-W3 (F9): the `?ingest=<id>` URL-fallback route has no
2043
- // `ResolvedWorldEntry` to read a world id/kind from (it resolves
2038
+ // `ResolvedAdapterRoot` to read a world id/kind from (it resolves
2044
2039
  // straight off the in-tree fixture globs) — `gameId` and the fixed
2045
2040
  // 'threejs'/'ingest-three' vocabulary are the closest honest analog.
2046
2041
  setMountFailureReport({