@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
@@ -14,6 +14,7 @@
14
14
  import type {
15
15
  AuthoringAdapter,
16
16
  AuthoringCapabilities,
17
+ AuthoringProvenance,
17
18
  EditorNode,
18
19
  HierarchyProvider,
19
20
  InspectorProvider,
@@ -32,7 +33,21 @@ import {
32
33
  import type { PhysicsAdapter2D } from '@engine/world2d/system-adapters-2d';
33
34
  import type { Container } from 'pixi.js';
34
35
  import type { EditorStore } from '../editor-store';
35
- import { notifyUndoableOp, registerUndoAdapter } from './undo-timeline';
36
+ import { JsonHistoryResource } from '../history/json-history-resource';
37
+
38
+ interface World2DHistoryState {
39
+ overlay: Overlay2D;
40
+ nodes: Record<
41
+ string,
42
+ {
43
+ label: string;
44
+ alpha: number;
45
+ visible: boolean;
46
+ tint?: number;
47
+ transform?: Transform2DValue;
48
+ }
49
+ >;
50
+ }
36
51
 
37
52
  function numToHex(n: number): string {
38
53
  return `#${(n & 0xffffff).toString(16).padStart(6, '0')}`;
@@ -64,11 +79,22 @@ export interface World2DAuthoringOptions {
64
79
 
65
80
  export class World2DAuthoringAdapter implements AuthoringAdapter {
66
81
  readonly capabilities: AuthoringCapabilities;
82
+
83
+ // Every construction site today persists through the 2D overlay
84
+ // (`saveWorldOverlay`) — including first-party pixi roots: the live tree
85
+ // is projected directly and never written back as source.
86
+ readonly provenance: AuthoringProvenance = {
87
+ source: 'foreign',
88
+ label: 'overlay',
89
+ detail:
90
+ 'Live 2D (PixiJS) tree projected directly — edits persist to an editor overlay, never to the game source.',
91
+ };
67
92
  private readonly a2d: AuthoringAdapter2D;
68
93
  private readonly persistFn: ((overlay: Overlay2D) => Promise<void>) | undefined;
69
94
  /** Human-readable overlay destination (design §2) — see {@link World2DAuthoringOptions.destination}. */
70
95
  private readonly destination: string;
71
96
  private listeners = new Set<() => void>();
97
+ private readonly historyResource: JsonHistoryResource<World2DHistoryState> | null;
72
98
 
73
99
  constructor(
74
100
  root: Container,
@@ -93,14 +119,23 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
93
119
  reparent: false,
94
120
  persist: !!this.persistFn, // runtime-only unless a persist callback is wired
95
121
  };
96
- // v4 architecture-review §7.1-13 (was T3.2 slice 2 for the structural twin,
97
- // `IngestAuthoringAdapter`, only): this adapter IS the undo/redo target the
98
- // editor-global timeline dispatches to for entries it records below
99
- // (`pushUndo`). The caller (`play-mode.ts`'s `exitMultiWorldAuthoring`,
100
- // `ingest-mode.ts`'s `exitIngestMode2D`) unregisters it on teardown — see
101
- // those call sites' comments for why an unregistered-but-still-recorded
102
- // entry is dropped (with a warn) rather than undone against a torn-down tree.
103
- registerUndoAdapter(this);
122
+ const history = store.projectHistory;
123
+ this.historyResource = history
124
+ ? new JsonHistoryResource({
125
+ history,
126
+ kind: opts.persist ? 'overlay' : 'session-state',
127
+ scope: opts.persist ? 'project' : 'session',
128
+ ...(opts.persist
129
+ ? { location: (opts.destination ?? '.vgai/overlays/world2d.json').replace(/^\//, '') }
130
+ : { sessionId: `world2d-${crypto.randomUUID()}` }),
131
+ displayName: opts.destination ?? 'World 2D edits',
132
+ capture: () => this.captureHistoryState(),
133
+ restore: async (state) => {
134
+ this.restoreHistoryState(state);
135
+ if (this.persistFn) await this.persistFn(this.a2d.serializeOverlay());
136
+ },
137
+ })
138
+ : null;
104
139
  }
105
140
 
106
141
  refresh(): { count: number; sprites: number } {
@@ -161,6 +196,7 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
161
196
  return {
162
197
  id: n.id,
163
198
  label: n.label,
199
+ role: 'entity',
164
200
  kind: n.kind,
165
201
  parentId: n.parentId,
166
202
  childIds: n.childIds,
@@ -196,9 +232,10 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
196
232
  // exact same primitives `setTransform`/`getTransform` already use (no lossy
197
233
  // angle<->quaternion re-derivation on the undo path).
198
234
  beginEdit: (id) => {
235
+ this.historyResource?.assertCanMutate();
199
236
  const disp = this.a2d.displayObject(id);
200
237
  if (disp && this.physics.ownerOf(disp) === 'physics') this.physics.freeze(disp);
201
- this.editStartTransform = this.a2d.getTransform(id) ?? undefined;
238
+ this.editStartState = this.captureHistoryState();
202
239
  },
203
240
  apply: (id, t) => {
204
241
  const pos: [number, number] = [t.position[0], t.position[1]];
@@ -211,23 +248,18 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
211
248
  endEdit: (id) => {
212
249
  const disp = this.a2d.displayObject(id);
213
250
  if (disp && this.physics.ownerOf(disp) === 'physics') this.physics.unfreeze(disp);
214
- const prev = this.editStartTransform;
215
- this.editStartTransform = undefined;
216
- if (!prev) return;
217
- const next = this.a2d.getTransform(id);
218
- if (!next) return;
219
- this.pushUndo({
220
- undo: () => this.writeTransform(id, prev),
221
- redo: () => this.writeTransform(id, next),
222
- });
251
+ this.recordHistory(
252
+ `Transform ${this.a2d.node(id)?.label ?? '2D Object'}`,
253
+ this.editStartState,
254
+ );
255
+ this.editStartState = undefined;
223
256
  },
224
257
  };
225
258
 
226
259
  /** Write a 2D transform to the live tree (+ physics body, if owned) + the
227
- * overlay (via `AuthoringAdapter2D.setTransform`) — no undo push; shared by
228
- * `transforms.apply` (live-drag, no push) and the undo/redo thunks
229
- * `endEdit` records (which DO push, exactly once, on commit). */
260
+ * overlay. The gesture's complete before/after state is journaled at endEdit. */
230
261
  private writeTransform(id: string, t: Transform2DValue): void {
262
+ this.historyResource?.assertCanMutate();
231
263
  const disp = this.a2d.displayObject(id);
232
264
  if (disp && this.physics.ownerOf(disp) === 'physics') {
233
265
  this.physics.commit(disp, t.position, t.rotation);
@@ -255,12 +287,10 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
255
287
  return disp[path];
256
288
  },
257
289
  set: (id, path, value) => {
258
- const prev = this.inspector.get(id, path); // snapshot for undo
290
+ this.historyResource?.assertCanMutate();
291
+ const before = this.captureHistoryState();
259
292
  this.writeProp(id, path, value);
260
- this.pushUndo({
261
- undo: () => this.writeProp(id, path, prev),
262
- redo: () => this.writeProp(id, path, value),
263
- });
293
+ this.recordHistory(`Set ${this.a2d.node(id)?.label ?? '2D Object'} ${path}`, before);
264
294
  },
265
295
  };
266
296
 
@@ -269,45 +299,72 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
269
299
  private writeProp(id: string, path: string, value: unknown): void {
270
300
  const disp = this.a2d.displayObject(id) as (Container & Record<string, unknown>) | null;
271
301
  if (!disp) return;
272
- if (path === 'name') disp.label = value as string;
302
+ if (path === 'name') this.a2d.set(id, 'label', value as string);
273
303
  else if (path === 'tint') this.a2d.set(id, 'tint', hexToNum(value as string));
274
304
  else if (path === 'visible') this.a2d.set(id, 'visible', value as boolean);
305
+ else if (path === 'alpha') this.a2d.set(id, 'alpha', value as number);
275
306
  else disp[path] = value;
276
307
  this.notify();
277
308
  }
278
309
 
279
310
  // --- Overlay-backed undo/redo (v4 §7.1-13 — the world2d port of
280
311
  // IngestAuthoringAdapter's "Overlay-backed undo/redo" section). ---
281
- private readonly undoStack: Array<{ undo: () => void; redo: () => void }> = [];
282
- private readonly redoStack: Array<{ undo: () => void; redo: () => void }> = [];
283
- private editStartTransform: Transform2DValue | undefined;
312
+ private editStartState: World2DHistoryState | undefined;
284
313
 
285
- private pushUndo(entry: { undo: () => void; redo: () => void }): void {
286
- this.undoStack.push(entry);
287
- this.redoStack.length = 0;
288
- notifyUndoableOp(this); // tag this op on the global timeline
314
+ private recordHistory(label: string, before: World2DHistoryState | undefined): void {
315
+ if (this.historyResource && before) {
316
+ void this.historyResource.record(label, before, this.captureHistoryState()).catch(() => {});
317
+ return;
318
+ }
319
+ }
320
+
321
+ subscribe(listener: () => void): () => void {
322
+ this.listeners.add(listener);
323
+ return () => this.listeners.delete(listener);
289
324
  }
290
325
 
291
- undo(): boolean {
292
- // `false` tells the undo timeline "couldn't act — put the entry back" (see
293
- // `UndoAdapter` in `./undo-timeline.ts`).
294
- const e = this.undoStack.pop();
295
- if (!e) return false;
296
- e.undo();
297
- this.redoStack.push(e);
298
- return true;
326
+ dispose(): void {
327
+ this.historyResource?.dispose();
328
+ this.listeners.clear();
299
329
  }
300
330
 
301
- redo(): boolean {
302
- const e = this.redoStack.pop();
303
- if (!e) return false;
304
- e.redo();
305
- this.undoStack.push(e);
306
- return true;
331
+ private captureHistoryState(): World2DHistoryState {
332
+ const nodes: World2DHistoryState['nodes'] = {};
333
+ const visit = (id: string): void => {
334
+ const node = this.a2d.node(id);
335
+ const display = this.a2d.displayObject(id) as (Container & { tint?: number }) | null;
336
+ if (!node || !display) return;
337
+ let transform: Transform2DValue | null = null;
338
+ try {
339
+ transform = this.a2d.getTransform(id);
340
+ } catch {
341
+ // A custom adapter may expose inspectable container-like nodes without
342
+ // Pixi transform observables. Their non-transform fields remain journaled.
343
+ }
344
+ nodes[id] = {
345
+ label: display.label ?? '',
346
+ alpha: display.alpha,
347
+ visible: display.visible,
348
+ ...('tint' in display ? { tint: display.tint } : {}),
349
+ ...(transform ? { transform } : {}),
350
+ };
351
+ for (const childId of node.childIds) visit(childId);
352
+ };
353
+ for (const root of this.a2d.roots()) visit(root.id);
354
+ return { overlay: structuredClone(this.a2d.serializeOverlay()), nodes };
307
355
  }
308
356
 
309
- subscribe(listener: () => void): () => void {
310
- this.listeners.add(listener);
311
- return () => this.listeners.delete(listener);
357
+ private restoreHistoryState(state: World2DHistoryState): void {
358
+ for (const [id, value] of Object.entries(state.nodes)) {
359
+ const display = this.a2d.displayObject(id) as (Container & { tint?: number }) | null;
360
+ if (!display) continue;
361
+ display.label = value.label;
362
+ display.alpha = value.alpha;
363
+ display.visible = value.visible;
364
+ if (value.tint !== undefined && 'tint' in display) display.tint = value.tint;
365
+ if (value.transform) this.a2d.setTransform(id, value.transform);
366
+ }
367
+ this.a2d.replaceOverlay(state.overlay);
368
+ this.notify();
312
369
  }
313
370
  }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * W5 (workspace-shell W5-candidates, recorded by the W4 reviewer in
3
+ * docs/workspace-shell/W0-INVENTORY.md §7): ONE shared 250ms availability
4
+ * tick replacing the three independent `setInterval(…, 250)` pollers that
5
+ * W4 left behind (utility availability, the play-only State Watch gate, and
6
+ * ConnectionStatus's networking-adapter poll).
7
+ *
8
+ * These gates all watch the SAME kind of out-of-band signal — a live play
9
+ * session's adapters appearing/disappearing without any store/registry
10
+ * notification — so they don't need three timers, three wakeups, and three
11
+ * interleaved re-render schedules; they need one heartbeat. The interval is
12
+ * refcounted: it starts with the first subscriber and stops with the last,
13
+ * so an idle editor (none of the three consumers mounted) runs no timer at
14
+ * all — strictly better than the three always-on intervals it replaces.
15
+ *
16
+ * `useSyncExternalStore`-shaped on purpose: consumers subscribe + read the
17
+ * monotonic version, then derive their own predicate (`getActiveDebug()`,
18
+ * `getActiveNetworking()`, utility availability) per render.
19
+ */
20
+
21
+ import { useSyncExternalStore } from 'react';
22
+
23
+ const TICK_MS = 250;
24
+
25
+ let _version = 0;
26
+ let _intervalId: ReturnType<typeof setInterval> | null = null;
27
+ const _listeners = new Set<() => void>();
28
+
29
+ function onTick(): void {
30
+ _version++;
31
+ for (const fn of _listeners) fn();
32
+ }
33
+
34
+ /** Subscribe to the shared 250ms tick. Starts the timer on first subscriber,
35
+ * stops it with the last. Returns unsubscribe. */
36
+ export function subscribeAvailabilityTick(fn: () => void): () => void {
37
+ _listeners.add(fn);
38
+ if (_intervalId === null) _intervalId = setInterval(onTick, TICK_MS);
39
+ return () => {
40
+ _listeners.delete(fn);
41
+ if (_listeners.size === 0 && _intervalId !== null) {
42
+ clearInterval(_intervalId);
43
+ _intervalId = null;
44
+ }
45
+ };
46
+ }
47
+
48
+ /** Monotonic tick counter — the `getSnapshot` for `useSyncExternalStore`. */
49
+ export function availabilityTickVersion(): number {
50
+ return _version;
51
+ }
52
+
53
+ /** Re-render the calling component on every shared availability tick. */
54
+ export function useAvailabilityTick(): void {
55
+ useSyncExternalStore(subscribeAvailabilityTick, availabilityTickVersion);
56
+ }
@@ -1,6 +1,8 @@
1
1
  /**
2
- * Browser play entry — a STATIC, dynamic-import-free version of the template's
3
- * `src/scripts/main.ts` for the static/browser editor build.
2
+ * Browser play compatibility entry — a STATIC, dynamic-import-free generic
3
+ * scene loader for the hosted editor build. The standalone scaffold no longer
4
+ * owns scene loading in setup code; this path remains for pre-bundled examples
5
+ * and browser-only projects that have no live manifest-module resolver.
4
6
  *
5
7
  * The static host has no dev server, so play mode can't `import('/@fs/.../main.ts')`.
6
8
  * Instead this file is pre-bundled (see `scripts/bundle-project-scripts.mjs`) into a
@@ -32,9 +34,7 @@ import { setAssetPrefix } from '@engine/loader';
32
34
  import type { EditorPreview, GameCleanup, GameContext } from '@engine/runtime/types';
33
35
  import { loadScene, loadSceneFromData } from '@engine/scene/scene-loader';
34
36
  import { applyScenePostProcessing } from '@engine/setup/setup-renderer';
35
- // The generic fallback's component registry is still the template's (soon-to-be
36
- // minimal) `src/scripts/registry.ts` — unrelated to example dispatch, and this
37
- // migration wave does not touch the template layout (a later wave does).
37
+ // The generic compatibility fallback uses the template component registry.
38
38
  import { componentRegistry, gameComponents } from '../template/src/scripts/registry';
39
39
  import { SETUP_BY_EXAMPLE_ID } from './generated/setup-by-example.generated';
40
40
 
@@ -56,6 +56,7 @@ const BUNDLE_RUNTIME_MODULE_LOADERS: Record<string, () => Promise<unknown>> = {
56
56
  '@engine/audio': () => import('@engine/audio'),
57
57
  '@engine/data/data-asset': () => import('@engine/data/data-asset'),
58
58
  '@engine/ecs/game-component': () => import('@engine/ecs/game-component'),
59
+ '@engine/react/game-state': () => import('@engine/react/game-state'),
59
60
  '@engine/scene/scene-loader': () => import('@engine/scene/scene-loader'),
60
61
  '@engine/scene/scene-query': () => import('@engine/scene/scene-query'),
61
62
  '@engine/scene/user-data': () => import('@engine/scene/user-data'),
@@ -0,0 +1,15 @@
1
+ import enginePackage from '../../engine/package.json';
2
+ import { GAME_MANIFEST_VERSION } from '../../engine/src/manifest/schema';
3
+ import editorPackage from '../package.json';
4
+ import type { EditorServerCompatibility } from './editor-compatibility';
5
+
6
+ /** Build-time package identity shared by browser-only editor surfaces. */
7
+ export const BUNDLED_EDITOR_VERSION = editorPackage.version;
8
+ export const BUNDLED_ENGINE_VERSION = enginePackage.version;
9
+ export const BUNDLED_EDITOR_COMPATIBILITY: EditorServerCompatibility = {
10
+ apiVersion: 1,
11
+ engineVersion: BUNDLED_ENGINE_VERSION,
12
+ manifestVersion: GAME_MANIFEST_VERSION,
13
+ startedAt: 'browser-build',
14
+ source: { state: 'current' },
15
+ };