@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
package/server/dev.ts CHANGED
@@ -7,16 +7,27 @@
7
7
  * Supports VGAI_PROJECT env var for initial project path.
8
8
  */
9
9
 
10
- import { type Dirent, readdirSync, realpathSync, statSync } from 'node:fs';
10
+ import {
11
+ type Dirent,
12
+ mkdirSync,
13
+ readFileSync,
14
+ readdirSync,
15
+ realpathSync,
16
+ statSync,
17
+ unlinkSync,
18
+ writeFileSync,
19
+ } from 'node:fs';
11
20
  import path from 'node:path';
12
21
  import { fileURLToPath } from 'node:url';
13
22
  import express from 'express';
14
23
  import { createServer as createViteServer } from 'vite';
24
+ import { gameGlobalsShadowPlugin } from '../vite-plugin-game-globals';
15
25
  import { projectGameStaticPlugin } from '../vite-plugin-project-game-static';
16
26
  import { canonicalProjectRoot } from './canonical-path';
17
27
  import { createEditorServer } from './editor-server';
18
- import { gameGlobalsShadowPlugin } from '../vite-plugin-game-globals';
19
28
  import { ingestGameShadowRoots } from './game-globals-shadow';
29
+ import { closeHttpServer, createProcessShutdown } from './process-shutdown';
30
+ import { classifyProjectHotUpdate } from './project-hmr-files';
20
31
  import { friendlyListenError, resolveBindHost } from './server-utils';
21
32
  import { registerSession, unregisterSession } from './session-registry';
22
33
 
@@ -24,7 +35,12 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
24
35
  // Port is env-overridable so multiple editor servers (e.g. parallel e2e/capture
25
36
  // runs across git worktrees) don't collide on 5173. Defaults preserve behavior.
26
37
  const PORT = Number(process.env['VGAI_EDITOR_PORT']) || 5173;
27
- const HMR_PORT = Number(process.env['VGAI_HMR_PORT']) || (PORT === 5173 ? 24678 : PORT + 100);
38
+ // Scaffolded editor ports live in 20000-29999, reserving the parallel
39
+ // 30000-39999 band for their HMR sockets so two generated projects cannot
40
+ // collide merely because their preferred editor ports differ by 100.
41
+ const DEFAULT_HMR_PORT =
42
+ PORT >= 20_000 && PORT < 30_100 ? PORT + 10_000 : PORT === 5173 ? 24678 : PORT + 100;
43
+ const HMR_PORT = Number(process.env['VGAI_HMR_PORT']) || DEFAULT_HMR_PORT;
28
44
  // S3: bind to loopback by default; opt-in to a wider interface via env.
29
45
  const HOST = resolveBindHost();
30
46
  // Engine root is three levels up from packages/editor/server/
@@ -77,6 +93,25 @@ async function main(): Promise<void> {
77
93
  // 1. Create Vite in middleware mode (before editor routes so we can pass the callback)
78
94
  const vite = await createViteServer({
79
95
  configFile: path.resolve(engineRoot, 'vite.config.ts'),
96
+ // Per-project dep-optimize cache. The repo-root config's default cacheDir
97
+ // (`<engineRoot>/node_modules/.vite`) is SHARED by every editor session
98
+ // launched from this checkout — and the resolved config varies per session
99
+ // (projectPath-conditional plugins below, env-var aliases), so alternating
100
+ // `vgai edit <A>` / `vgai edit <B>` / e2e-fixture boots each see "vite
101
+ // config has changed", re-optimize, and swap the deps dir out from under
102
+ // every OTHER live editor sharing it. Connected tabs then full-reload
103
+ // ("optimized dependencies changed"), which drops in-flight control
104
+ // commands — dogfooded as `vgai play` timing out ("editor connected but
105
+ // did not respond") whenever another project's editor booted concurrently.
106
+ // A project-local cache gives each project a stable hash and isolates
107
+ // concurrent sessions; `.vite-editor` (not `.vite`) so it never collides
108
+ // with the project's OWN standalone `npm run game` cache, whose config —
109
+ // and therefore hash — legitimately differs. Projectless boots keep a
110
+ // shared-but-separate dir under the checkout (nothing per-project to key
111
+ // on; a project opened later via open-project keeps this boot-time dir).
112
+ cacheDir: projectPath
113
+ ? path.join(projectPath, 'node_modules', '.vite-editor')
114
+ : path.join(engineRoot, 'node_modules', '.vite-editor-no-project'),
80
115
  plugins: [
81
116
  // Pipe gated `window`/`document` into game code: prepend a lexical shadow
82
117
  // to every project `/src/` module so its globals resolve to the editor's
@@ -111,35 +146,30 @@ async function main(): Promise<void> {
111
146
  file: string;
112
147
  server: { ws: { send: (msg: unknown) => void } };
113
148
  }) {
114
- // Vite's `file` hook argument is ALWAYS forward-slash normalized
115
- // (its cross-platform module-id convention), but `projectPath`
116
- // comes from `canonicalProjectRoot` -> `realpathSync`, which on
117
- // Windows returns a native backslash path. A naive
118
- // `file.startsWith(projectPath)` therefore NEVER matches on
119
- // Windows ("C:/Users/...".startsWith("C:\\Users\\...") is
120
- // false) — the custom `vgai:script-update` event silently never
121
- // fires and every project edit falls through to Vite's default
122
- // full-module-reload HMR instead. Compare forward-slash forms
123
- // on both sides so this works identically on every OS.
124
- const projectPathPosix = projectPath!.split(path.sep).join('/');
125
- if (file.startsWith(projectPathPosix)) {
126
- // Data assets (docs/DATA-TOOLS-DESIGN.md §2.3) ride Vite's
127
- // STOCK HMR: fall through so the imported JSON module
128
- // updates and the owning handle module's
129
- // `import.meta.hot.accept('./x.data.json', …)` fires in the
130
- // running game (live tuning). Safe from the full-page-reload
131
- // hazard the swallow below exists for: the template's
132
- // handle module self-accepts the dep, and an unimported
133
- // .data.json maps to zero modules (no-op). Scene/asset
134
- // files stay swallowed — the editor owns those via SSE.
135
- if (/\.data\.json$/.test(file)) return;
136
- if (/\.(ts|tsx|js|jsx)$/.test(file)) {
137
- server.ws.send({ type: 'custom', event: 'vgai:script-update', data: { file } });
138
- }
139
- // Swallow all project file changes — the editor handles
140
- // scene/asset updates via its own SSE channel.
141
- return [];
149
+ const kind = classifyProjectHotUpdate(
150
+ file,
151
+ projectPath!,
152
+ /\.[jt]sx?$/.test(file) ? readFileSync(file, 'utf-8') : '',
153
+ );
154
+ if (kind === 'outside') return;
155
+ // Data handles below src/ ride stock Vite HMR so their owning
156
+ // module's import.meta.hot.accept callback can live-tune them.
157
+ if (kind === 'stock-data') return;
158
+ if (kind === 'react') return;
159
+ if (kind === 'component') {
160
+ server.ws.send({ type: 'custom', event: 'vgai:script-update', data: { file } });
161
+ }
162
+ if (kind === 'restart') {
163
+ server.ws.send({
164
+ type: 'custom',
165
+ event: 'vgai:restart-required',
166
+ data: { file },
167
+ });
142
168
  }
169
+ // Other project changes (including scripts/, tests/, dist/)
170
+ // are not runtime modules. Swallow them; scene/asset changes
171
+ // are delivered through the editor's own SSE channel.
172
+ return [];
143
173
  },
144
174
  },
145
175
  ]
@@ -162,7 +192,7 @@ async function main(): Promise<void> {
162
192
  __VGAI_PROJECT_PATH__: JSON.stringify(projectPath ?? ''),
163
193
  // Track N, N2 (docs/REACT-INGEST-LANDING-DESIGN.md D-N2): the absolute
164
194
  // repo root, so `ingest/discovery-react.ts` can build the `projectRoot`
165
- // an `ingest-react` fixture's `resolveWorldAdapter` call needs (its
195
+ // an `ingest-react` fixture's `resolveRootAdapter` call needs (its
166
196
  // `entry`'s `/@fs/` dynamic import + `loadProjectGameProvider` lookup)
167
197
  // WITHOUT a "current project" — these in-tree fixtures live in THIS
168
198
  // package's own source tree, not a project a user opens (mirrors
@@ -178,6 +208,8 @@ async function main(): Promise<void> {
178
208
  const editorRouter = createEditorServer({
179
209
  engineRoot,
180
210
  projectPath,
211
+ watchEngineSource: true,
212
+ loadProjectModule: (moduleId) => vite.ssrLoadModule(moduleId),
181
213
  onProjectOpened(newProjectPath: string) {
182
214
  // Dynamically allow Vite to serve /@fs/ paths from the new project directory
183
215
  const allowed = vite.config.server.fs.allow;
@@ -189,6 +221,7 @@ async function main(): Promise<void> {
189
221
  // And gate its modules with the game-globals prelude (see vgai-game-globals above).
190
222
  projectRoots.add(newProjectPath);
191
223
  // And point the project-static route (D-X2) at the newly opened project.
224
+ const previousProjectRoot = currentProjectRoot;
192
225
  currentProjectRoot = newProjectPath;
193
226
  // Keep the session registry (D12) pointing at the CURRENT project so
194
227
  // `vgai edit` reuse/targeting decisions see switches, not boot state.
@@ -198,6 +231,9 @@ async function main(): Promise<void> {
198
231
  pid: process.pid,
199
232
  startedAt: sessionStartedAt,
200
233
  });
234
+ // #146: the in-project session file follows the switch too.
235
+ if (previousProjectRoot !== newProjectPath) removeSessionFile(previousProjectRoot);
236
+ writeSessionFile(newProjectPath);
201
237
  },
202
238
  });
203
239
  app.use(editorRouter);
@@ -220,12 +256,58 @@ async function main(): Promise<void> {
220
256
  // even after 45s; scoped polling mounts fine). Instead: a tiny mtime poller
221
257
  // over the CURRENT project only, forwarding synthetic add/change/unlink
222
258
  // events into Vite's watcher, which runs the normal invalidate+HMR pipeline.
223
- if (process.env['VGAI_WATCH_POLL']) {
259
+ // AUTO-ENABLED when the project sits on a Windows drvfs mount (/mnt/<drive>/
260
+ // under WSL) — the one environment where inotify is structurally absent. A
261
+ // silently-stale dev server reads as "my edit didn't work" to agents and
262
+ // humans alike (dogfooded 2026-07-12: a one-line CSS fix "didn't apply"
263
+ // through a whole debugging round because the served transform was stale).
264
+ // VGAI_WATCH_POLL stays the explicit override: `1`/`<ms>` forces polling on
265
+ // anywhere, `0` disables it even on drvfs.
266
+ const watchPollEnv = process.env['VGAI_WATCH_POLL'];
267
+ const projectOnDrvfs = process.platform === 'linux' && /^\/mnt\/[a-z]\//i.test(projectPath ?? '');
268
+ if (watchPollEnv ? watchPollEnv !== '0' : projectOnDrvfs) {
224
269
  startProjectPollWatcher(vite.watcher, () => currentProjectRoot);
225
270
  }
226
271
 
227
272
  // 3. Start Express
228
273
  const sessionStartedAt = new Date().toISOString();
274
+
275
+ // #146 — `.vgai/session.json` INSIDE the project: session discovery for
276
+ // agents becomes `cat .vgai/session.json` (local, obvious, and readable by
277
+ // a sandboxed agent without leaving the project tree) instead of parsing
278
+ // the global registry at ~/.vgai/editor-sessions.json and matching cwd.
279
+ // Written at boot and on every project switch, removed on shutdown. Never
280
+ // fatal — a read-only project dir must not kill the dev server.
281
+ const writeSessionFile = (project: string | null | undefined): void => {
282
+ if (!project) return;
283
+ try {
284
+ mkdirSync(path.join(project, '.vgai'), { recursive: true });
285
+ writeFileSync(
286
+ path.join(project, '.vgai', 'session.json'),
287
+ `${JSON.stringify(
288
+ {
289
+ port: PORT,
290
+ pid: process.pid,
291
+ url: `http://${HOST}:${PORT}/`,
292
+ startedAt: sessionStartedAt,
293
+ },
294
+ null,
295
+ 2,
296
+ )}\n`,
297
+ );
298
+ } catch {
299
+ // best-effort only
300
+ }
301
+ };
302
+ const removeSessionFile = (project: string | null | undefined): void => {
303
+ if (!project) return;
304
+ try {
305
+ unlinkSync(path.join(project, '.vgai', 'session.json'));
306
+ } catch {
307
+ // already gone / never written
308
+ }
309
+ };
310
+
229
311
  const server = app.listen(PORT, HOST, () => {
230
312
  console.log(
231
313
  `\n \x1b[32mEditor server\x1b[0m running at \x1b[36mhttp://${HOST}:${PORT}\x1b[0m`,
@@ -233,9 +315,7 @@ async function main(): Promise<void> {
233
315
  if (projectPath) {
234
316
  console.log(` \x1b[33mProject\x1b[0m: ${projectPath}`);
235
317
  }
236
- console.log(
237
- ` \x1b[33mEditor\x1b[0m: \x1b[36mhttp://${HOST}:${PORT}/\x1b[0m\n`,
238
- );
318
+ console.log(` \x1b[33mEditor\x1b[0m: \x1b[36mhttp://${HOST}:${PORT}/\x1b[0m\n`);
239
319
  // D12: announce this session so `vgai edit` can reuse instead of hijack.
240
320
  registerSession({
241
321
  project: projectPath ?? null,
@@ -243,6 +323,8 @@ async function main(): Promise<void> {
243
323
  pid: process.pid,
244
324
  startedAt: sessionStartedAt,
245
325
  });
326
+ // #146: and inside the project itself, for `cat .vgai/session.json`.
327
+ writeSessionFile(projectPath ?? null);
246
328
  });
247
329
 
248
330
  // SC5: friendly message instead of an opaque crash on port conflict.
@@ -251,15 +333,35 @@ async function main(): Promise<void> {
251
333
  process.exit(1);
252
334
  });
253
335
 
254
- // Cleanup on shutdown
255
- const shutdown = () => {
336
+ // Cleanup on shutdown. The last-gasp log line exists because a detached
337
+ // session once vanished with a log that ended mid-banner (target-blaster
338
+ // friction #5, #146 ledger) — post-mortems had to GUESS between a signal,
339
+ // a crash, and a silent WSL OOM kill. Signals and normal exits now name
340
+ // themselves; an abrupt SIGKILL/OOM remains the one case with no line
341
+ // (nothing can log through a KILL), which the ABSENCE of this line now
342
+ // positively identifies.
343
+ const lastGasp = (why: string) => {
344
+ console.error(`[vgai-editor] shutting down (${why}) — pid ${process.pid}, port ${PORT}`);
345
+ };
346
+ let shutdownStarted = false;
347
+ const shutdown = createProcessShutdown({
348
+ tasks: [() => closeHttpServer(server), () => editorRouter.close(), () => vite.close()],
349
+ });
350
+ const onShutdownSignal = (signal: string) => {
351
+ if (shutdownStarted) return;
352
+ shutdownStarted = true;
353
+ lastGasp(signal);
256
354
  unregisterSession(process.pid);
257
- vite.close();
258
- server.close();
355
+ removeSessionFile(currentProjectRoot ?? projectPath ?? null);
356
+ void shutdown(signal);
259
357
  };
260
- process.once('SIGINT', shutdown);
261
- process.once('SIGTERM', shutdown);
262
- process.once('exit', () => unregisterSession(process.pid));
358
+ process.once('SIGINT', () => onShutdownSignal('SIGINT'));
359
+ process.once('SIGTERM', () => onShutdownSignal('SIGTERM'));
360
+ process.once('exit', (code) => {
361
+ if (!shutdownStarted) lastGasp(`exit ${code}`);
362
+ unregisterSession(process.pid);
363
+ removeSessionFile(currentProjectRoot ?? projectPath ?? null);
364
+ });
263
365
  }
264
366
 
265
367
  /**
@@ -341,7 +443,9 @@ function startProjectPollWatcher(
341
443
  setTimeout(tick, interval);
342
444
  };
343
445
  setTimeout(tick, interval);
344
- console.log(` Project poll-watcher on (VGAI_WATCH_POLL, every ${interval}ms)`);
446
+ console.log(
447
+ ` Project poll-watcher on (auto on drvfs projects; VGAI_WATCH_POLL=0/1/<ms> overrides; every ${interval}ms)`,
448
+ );
345
449
  }
346
450
 
347
451
  main().catch((err) => {