@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.
- package/README.md +24 -0
- package/dist/assets/axe-C7YBtOuM.js +30 -0
- package/dist/assets/browserAll-DDtGGE48.js +1 -0
- package/dist/assets/create-runtime-DbTlBlKG.js +1 -0
- package/dist/assets/{game-BI111o5f.js → game-BE0r7DMI.js} +3 -3
- package/dist/assets/game-BdTHR2_X.js +1 -0
- package/dist/assets/{game-pt_1lQLv.js → game-C3iQGSqo.js} +1 -1
- package/dist/assets/game-CcHfYxjP.js +1 -0
- package/dist/assets/game-Cqzj_lpD.js +1 -0
- package/dist/assets/game-DSZdeCHu.js +1 -0
- package/dist/assets/game-Dch9sAPc.js +1 -0
- package/dist/assets/{game-xsOho_wg.js → game-SAFn90pA.js} +3 -3
- package/dist/assets/game-loop-DMIgSMV-.js +1 -0
- package/dist/assets/{game-source-CvidN7AB.js → game-source-Dk83w26t.js} +1 -1
- package/dist/assets/{index-Bp5cecD6.js → index-4idIsHHJ.js} +2 -2
- package/dist/assets/{index-DL7RcQ0n.js → index-C-LhOTBN.js} +1 -1
- package/dist/assets/{index-Cs8xwv3e.js → index-CDkxceqE.js} +1 -1
- package/dist/assets/index-CQEfi217.js +15412 -0
- package/dist/assets/index-Dvi-V0NE.css +1 -0
- package/dist/assets/ingest-siblings-s0P5I1Ub.js +1 -0
- package/dist/assets/mount-manifest-DXMOlF79.js +1 -0
- package/dist/assets/react-18-C9eHn8x1.js +1 -0
- package/dist/assets/webworkerAll-Fn0e-ouF.js +1 -0
- package/dist/assets/world-documents-GM0a9Kv7.js +1 -0
- package/dist/index.html +15 -13
- package/dist/ingest/racing-game/vgai.game.json +5 -4
- package/dist/ingest/simcity/vgai.game.json +5 -4
- package/dist/ingest/tanks/vgai.game.json +5 -4
- package/dist/project-scripts.bundle.js +3917 -0
- package/dist/scenes/untitled.vscn.json +2 -0
- package/dist-server/packaged.mjs +7697 -3435
- package/package.json +31 -4
- package/scripts/probe-reporter.ts +349 -0
- package/scripts/run-probe.ts +2260 -0
- package/server/asset-catalog-audit.ts +268 -0
- package/server/asset-catalog-v2.ts +146 -0
- package/server/asset-library-routes.ts +276 -58
- package/server/canonical-path.ts +1 -1
- package/server/dev.ts +148 -44
- package/server/editor-server.ts +888 -61
- package/server/editor-sse.ts +115 -4
- package/server/harness-chat-service.ts +796 -0
- package/server/local-asset-catalog.ts +157 -22
- package/server/packaged.ts +51 -21
- package/server/process-shutdown.ts +136 -0
- package/server/prod.ts +9 -6
- package/server/project-hmr-files.ts +41 -0
- package/server/project-operations.ts +343 -0
- package/server/project-optimize-deps-entries.ts +4 -4
- package/server/project-output-writer.ts +156 -0
- package/server/project-validation.ts +140 -0
- package/server/project-view.ts +8 -50
- package/server/server-utils.ts +75 -10
- package/server/session-registry.ts +12 -0
- package/src/EditorContext.tsx +107 -3
- package/src/action-registry.ts +115 -17
- package/src/adapter-resolver.ts +213 -478
- package/src/asset-events.ts +64 -1
- package/src/asset-preview.ts +906 -0
- package/src/asset-selection.ts +121 -0
- package/src/asset-workflow/asset-capabilities.ts +259 -0
- package/src/asset-workflow/asset-editor-errors.ts +46 -0
- package/src/asset-workflow/asset-import-pipeline.ts +176 -0
- package/src/asset-workflow/asset-library-query.ts +107 -0
- package/src/asset-workflow/asset-types.ts +192 -0
- package/src/asset-workflow/asset-workflow-quality.ts +65 -0
- package/src/asset-workflow/import-contract.ts +113 -0
- package/src/asset-workflow/model-conversion.ts +126 -0
- package/src/asset-workflow/model-inspection.ts +185 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +153 -0
- package/src/asset-workflow/project-asset-operations.ts +119 -0
- package/src/asset-workflow/thumbnail-system.ts +172 -0
- package/src/authoring/active-systems.ts +15 -0
- package/src/authoring/boundary-authoring-adapter.ts +16 -5
- package/src/authoring/composite-authoring-adapter.ts +305 -124
- package/src/authoring/design-time-layers.ts +300 -117
- package/src/authoring/edit-mode-authoring.ts +278 -293
- package/src/authoring/embed-only-adapter.ts +4 -2
- package/src/authoring/first-party-hierarchy-menu.ts +7 -2
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +5 -12
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +53 -126
- package/src/authoring/first-party-inspector/HeaderSection.tsx +54 -65
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +30 -11
- package/src/authoring/first-party-inspector/register.tsx +13 -2
- package/src/authoring/ingest-authoring-adapter.ts +142 -45
- package/src/authoring/mount-failure-report.ts +5 -5
- package/src/authoring/provenance.ts +41 -0
- package/src/authoring/react-dom-authoring-adapter.ts +92 -92
- package/src/authoring/react-inspector-section.tsx +489 -51
- package/src/authoring/react-world-authoring-adapter.ts +541 -306
- package/src/authoring/story-overlay.ts +1 -1
- package/src/authoring/story-types.ts +11 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +54 -25
- package/src/authoring/viewport-tool-context.ts +78 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +186 -0
- package/src/authoring/world-pan-state.ts +33 -17
- package/src/authoring/world-session-state.ts +1 -1
- package/src/authoring/world2d-authoring-adapter.ts +109 -52
- package/src/availability-tick.ts +56 -0
- package/src/browser-play-entry.ts +5 -5
- package/src/browser-project-scripts.ts +1 -0
- package/src/build-identity.ts +15 -0
- package/src/command-listener.ts +893 -19
- package/src/components/AlignToolbar.tsx +74 -63
- package/src/components/AppRoot.tsx +193 -26
- package/src/components/ApplicationMenus.tsx +272 -0
- package/src/components/AssetBrowser.tsx +1450 -293
- package/src/components/AssetEditorShell.tsx +141 -0
- package/src/components/AssetImportDetails.tsx +218 -0
- package/src/components/AssetLibraryPanel.tsx +14 -0
- package/src/components/CameraInfo.tsx +11 -20
- package/src/components/CenterDocuments.tsx +585 -0
- package/src/components/CommandPalette.tsx +75 -30
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +57 -112
- package/src/components/DebugConsolePanel.tsx +461 -0
- package/src/components/DebuggerPanel.tsx +165 -0
- package/src/components/DefaultEditorLayout.tsx +167 -231
- package/src/components/GameHierarchy.tsx +873 -290
- package/src/components/GamePerformanceOverlay.tsx +46 -0
- package/src/components/HarnessChatPanel.tsx +2352 -0
- package/src/components/HistoryPanel.tsx +226 -0
- package/src/components/Inspector.tsx +153 -99
- package/src/components/InspectorToolSection.tsx +6 -4
- package/src/components/MountFailureBanner.tsx +31 -48
- package/src/components/NetworkSection.tsx +25 -14
- package/src/components/OnlineAssetBrowser.tsx +794 -343
- package/src/components/OverlayReportBanner.tsx +38 -64
- package/src/components/PerformancePanel.tsx +206 -0
- package/src/components/PlayBar.tsx +93 -263
- package/src/components/PrefabSaveDialog.tsx +55 -127
- package/src/components/ProjectHeader.css +60 -0
- package/src/components/ProjectHeader.tsx +170 -105
- package/src/components/ProjectScreen.tsx +246 -184
- package/src/components/ReactCanvasControls.tsx +185 -0
- package/src/components/ResolutionPicker.tsx +85 -0
- package/src/components/RootActivateDialog.tsx +39 -68
- package/src/components/SaveDialog.tsx +55 -127
- package/src/components/SaveStatus.tsx +11 -29
- package/src/components/StartupLoadingScreen.tsx +96 -0
- package/src/components/StateWatchPanel.tsx +302 -0
- package/src/components/StatsOverlay.tsx +12 -5
- package/src/components/StatusBar.tsx +64 -0
- package/src/components/ThemeManagerDialog.css +89 -0
- package/src/components/ThemeManagerDialog.tsx +371 -0
- package/src/components/ToolHost.tsx +26 -15
- package/src/components/Toolbar.tsx +117 -214
- package/src/components/VgaiVoxelLogo.tsx +89 -0
- package/src/components/ViewportOverlay.tsx +97 -172
- package/src/components/ViewportPanel.tsx +130 -31
- package/src/components/WorkspaceDock.tsx +891 -0
- package/src/components/WorldSelectionOverlay.tsx +51 -63
- package/src/components/WorldTextEditor.tsx +9 -5
- package/src/components/asset-documents.tsx +390 -0
- package/src/components/asset-editor-persistence.ts +44 -0
- package/src/components/asset-selection-section.tsx +338 -0
- package/src/components/asset-viewers/AudioViewer.tsx +73 -21
- package/src/components/asset-viewers/GenericJsonViewer.tsx +26 -11
- package/src/components/asset-viewers/ImageViewer.tsx +43 -11
- package/src/components/asset-viewers/InputMapViewer.tsx +512 -134
- package/src/components/asset-viewers/MaterialAssetEditor.tsx +540 -0
- package/src/components/asset-viewers/ModelViewer.tsx +805 -121
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +177 -60
- package/src/components/asset-viewers/SourceAssetViewer.tsx +121 -0
- package/src/components/asset-workflow.css +506 -0
- package/src/components/build-documents.tsx +696 -0
- package/src/components/core-utilities.tsx +75 -0
- package/src/components/data-documents.tsx +364 -0
- package/src/components/{DataPanel.tsx → data-editor.tsx} +138 -288
- package/src/components/debugger-panel-state.ts +57 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +8 -14
- package/src/components/inspector-widgets/BorderEditor.tsx +41 -33
- package/src/components/inspector-widgets/ColorPicker.tsx +39 -39
- package/src/components/inspector-widgets/FontPicker.tsx +13 -21
- package/src/components/inspector-widgets/GradientEditor.tsx +11 -19
- package/src/components/inspector-widgets/ScrubbableInput.tsx +6 -3
- package/src/components/inspector-widgets/ShadowEditor.tsx +20 -33
- package/src/components/inspector-widgets/shared.tsx +90 -49
- package/src/components/inspectors/AnimationSection.tsx +39 -40
- package/src/components/inspectors/AudioSection.tsx +28 -39
- package/src/components/inspectors/BoneAttachmentSection.tsx +19 -24
- package/src/components/inspectors/CameraSection.tsx +14 -23
- package/src/components/inspectors/ComponentsSection.tsx +39 -43
- package/src/components/inspectors/JointsSection.tsx +34 -43
- package/src/components/inspectors/LightSection.tsx +90 -35
- package/src/components/inspectors/MaterialSection.tsx +137 -174
- package/src/components/inspectors/MeshSection.tsx +9 -17
- package/src/components/inspectors/NavigationSection.tsx +8 -15
- package/src/components/inspectors/ParticleSection.tsx +91 -76
- package/src/components/inspectors/PhysicsSection.tsx +42 -46
- package/src/components/inspectors/PostProcessingSection.tsx +28 -36
- package/src/components/inspectors/RenderingSection.tsx +12 -20
- package/src/components/inspectors/ShadowSection.tsx +7 -8
- package/src/components/inspectors/SplineSection.tsx +31 -42
- package/src/components/inspectors/TransformSection.tsx +14 -22
- package/src/components/patterns/Dialog.tsx +95 -0
- package/src/components/patterns/Fields.tsx +44 -0
- package/src/components/patterns/List.tsx +25 -0
- package/src/components/patterns/StateSurface.tsx +40 -0
- package/src/components/patterns/Surfaces.tsx +115 -0
- package/src/components/patterns/Tabs.tsx +80 -0
- package/src/components/patterns/Toolbar.tsx +51 -0
- package/src/components/patterns/Tree.tsx +72 -0
- package/src/components/primitives/Button.tsx +46 -0
- package/src/components/primitives/ColorInput.tsx +11 -47
- package/src/components/primitives/EditorIcon.tsx +99 -0
- package/src/components/primitives/FormControls.tsx +71 -0
- package/src/components/primitives/JsonInput.tsx +15 -2
- package/src/components/primitives/Layout.tsx +100 -0
- package/src/components/primitives/Menu.tsx +105 -0
- package/src/components/primitives/NumberInput.tsx +8 -35
- package/src/components/primitives/Panel.tsx +49 -44
- package/src/components/primitives/SectionHeader.tsx +10 -28
- package/src/components/primitives/Text.tsx +46 -0
- package/src/components/primitives/Tooltip.tsx +20 -12
- package/src/components/primitives/Vec3Input.tsx +3 -0
- package/src/components/primitives/banner-tones.ts +33 -0
- package/src/components/primitives/editor-icons.ts +102 -0
- package/src/components/primitives/panel-header-styles.ts +30 -0
- package/src/components/project-operation-documents.tsx +226 -0
- package/src/components/status-contributions.tsx +175 -0
- package/src/components/story-documents-register.ts +15 -0
- package/src/components/story-documents.tsx +1185 -0
- package/src/components/tool-documents.tsx +110 -0
- package/src/components/workspace-dock.css +293 -0
- package/src/components/workspace-history.ts +33 -0
- package/src/components/world-documents.tsx +145 -0
- package/src/components/xstate-documents.tsx +209 -0
- package/src/composite-screenshot.ts +248 -0
- package/src/design-system/index.ts +70 -0
- package/src/design-system-stories/Foundation.stories.tsx +183 -0
- package/src/design-system-stories/Patterns.stories.tsx +251 -0
- package/src/design-system-stories/Workspace.stories.tsx +538 -0
- package/src/doctor/report.ts +57 -13
- package/src/editor-api.ts +295 -31
- package/src/editor-compatibility.ts +200 -0
- package/src/editor-console.ts +35 -17
- package/src/editor-hotkeys.ts +85 -33
- package/src/editor-store.ts +538 -233
- package/src/editor-viewport.ts +160 -34
- package/src/entity-factory.ts +14 -3
- package/src/gizmo-registry.ts +21 -5
- package/src/harness-chat-editor-context.ts +37 -0
- package/src/harness-chat-indicator.ts +68 -0
- package/src/harness-chat-layout.ts +53 -0
- package/src/harness-chat-lifecycle.ts +170 -0
- package/src/harness-chat-reconnect.ts +85 -0
- package/src/harness-chat-types.ts +409 -0
- package/src/hierarchy-drop.ts +50 -0
- package/src/hierarchy-expansion-state.ts +100 -0
- package/src/hierarchy-menu-registry.ts +1 -1
- package/src/hierarchy-projection.ts +76 -0
- package/src/history/editor-session.ts +21 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-service.ts +904 -0
- package/src/history/json-history-resource.ts +165 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +266 -0
- package/src/history/project-root-history-backends.ts +53 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +108 -0
- package/src/history/source-history-backend.ts +374 -0
- package/src/history/types.ts +100 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hosted-example.ts +12 -2
- package/src/hotkeys.ts +89 -18
- package/src/ingest/discovery-react.ts +9 -10
- package/src/ingest/discovery.ts +4 -4
- package/src/ingest/discovery2d.ts +5 -5
- package/src/ingest/games/bloom-composer/vgai.game.json +3 -3
- package/src/ingest/games/embed-bundle/vgai.game.json +3 -3
- package/src/ingest/games/games-fps/vgai.game.json +3 -3
- package/src/ingest/games/iframe-reachable/vgai.game.json +3 -3
- package/src/ingest/games/interactive-cubes/vgai.game.json +3 -3
- package/src/ingest/games/mismatched-three/vgai.game.json +3 -3
- package/src/ingest/games/own-three-bundled/vgai.game.json +3 -3
- package/src/ingest/games/pointerlock-maze/vgai.game.json +7 -4
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +3 -3
- package/src/ingest/games-2d/bunnymark/vgai.game.json +3 -3
- package/src/ingest/games-2d/flappy/vgai.game.json +3 -3
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +3 -3
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +3 -3
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +3 -3
- package/src/ingest/games-react/react-rpg/vgai.game.json +3 -3
- package/src/ingest/types.ts +1 -1
- package/src/ingest-mode.ts +47 -52
- package/src/ingest-siblings.ts +23 -33
- package/src/initial-scene.ts +1 -2
- package/src/main.tsx +16 -8
- package/src/manifest-project.ts +10 -12
- package/src/model-thumbnail.ts +261 -26
- package/src/module-mode.ts +44 -50
- package/src/play-log-events.ts +26 -0
- package/src/play-mode.ts +495 -401
- package/src/play-scene-adoption.ts +23 -0
- package/src/playground/main.ts +68 -24
- package/src/playwright-shim.ts +473 -0
- package/src/project-manager.ts +90 -10
- package/src/project-operations.ts +112 -0
- package/src/project-story-discovery.ts +25 -0
- package/src/project-tool-discovery.ts +43 -0
- package/src/scene-serializer.ts +0 -6
- package/src/scene-sync.ts +7 -2
- package/src/script-loader.ts +3 -3
- package/src/skeleton-helper.ts +57 -0
- package/src/storage/seed.ts +68 -8
- package/src/stories/StoryPreviewMount.tsx +265 -0
- package/src/stories/action-stories.fixture.tsx +44 -0
- package/src/stories/button-stories.fixture.tsx +50 -0
- package/src/stories/compose-project-stories.ts +182 -0
- package/src/stories/loader-stories.fixture.tsx +53 -0
- package/src/stories/story-discovery.ts +130 -0
- package/src/stories/story-registry.ts +146 -0
- package/src/theme-css.ts +1049 -0
- package/src/theme-library.ts +238 -0
- package/src/theme-preference.ts +130 -0
- package/src/theme.ts +527 -0
- package/src/tool-loader.ts +80 -24
- package/src/ui-source/inspect.ts +27 -4
- package/src/ui-source/source-write-backend.ts +83 -22
- package/src/widgets/index.ts +9 -18
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-dock-controller.ts +64 -0
- package/src/workspace-document-ids.ts +5 -0
- package/src/workspace-document-registry.ts +367 -0
- package/src/workspace-state-persistence.ts +455 -0
- package/src/workspace-status-registry.ts +110 -0
- package/src/workspace-utility-commands.ts +49 -0
- package/src/workspace-utility-registry.ts +161 -0
- package/src/world-document-routing.ts +16 -0
- package/src/xstate-inspect/XStateMachineInspector.tsx +544 -0
- package/src/xstate-inspect/character-animation-machine.fixture.ts +74 -0
- package/src/xstate-inspect/use-live-actor-state.ts +39 -0
- package/src/xstate-inspect/xstate-graph.ts +265 -0
- package/src/xstate-inspect/xstate-layout.ts +76 -0
- package/src/z-index.ts +26 -0
- package/template/.claude/skills/editor/SKILL.md +129 -90
- package/template/AGENTS.md +1110 -0
- package/template/CLAUDE.md +1 -512
- package/template/IDIOMS.md +50 -0
- package/template/check-idioms.ts +706 -0
- package/template/manifest-entry-modules-plugin.ts +53 -0
- package/template/package.json +13 -4
- package/template/public/scenes/default.scn2d.json +6 -0
- package/template/public/scenes/default.vscn.json +7 -1
- package/template/public/scenes/untitled.vscn.json +10 -0
- package/template/scripts/playtest.ts +40 -0
- package/template/server/loopback.ts +75 -0
- package/template/server/rooms/arena-room.ts +69 -1
- package/template/server/rooms/game-room.ts +68 -1
- package/template/src/data/README.md +9 -4
- package/template/src/data/data-ref.ts +35 -0
- package/template/src/data/tuning.schema.ts +1 -1
- package/template/src/main.ts +41 -62
- package/template/src/manifest-entry-modules.d.ts +3 -0
- package/template/src/operations/README.md +88 -0
- package/template/src/runtime/pixi-adapter.ts +24 -0
- package/template/src/scripts/components/data-spinner.ts +43 -2
- package/template/src/scripts/components/spin-lap-math.ts +27 -0
- package/template/src/tools/README.md +5 -3
- package/template/src/tools/example.tool.tsx +13 -7
- package/template/src/ui/Button.stories.tsx +66 -0
- package/template/src/ui/RebindPanel.tsx +2 -6
- package/template/src/ui/game.tsx +17 -0
- package/template/tests/acceptance/example.spec.ts +64 -0
- package/template/tests/logic/example.test.ts +31 -0
- package/template/tests/logic/room.test.ts +100 -0
- package/template/tests/tsconfig.json +30 -0
- package/template/validate-manifest.ts +5 -5
- package/template/validate-scenes.ts +50 -18
- package/template/vgai.game.json +20 -13
- package/template/vite.config.ts +77 -16
- package/vite-plugin-ui-oid.ts +261 -17
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +0 -1
- package/dist/assets/SelectionBox-BXsv_6aH.js +0 -1
- package/dist/assets/browser-project-scripts-DOru4L1x.js +0 -2
- package/dist/assets/browserAll-CEkWYlFk.js +0 -1
- package/dist/assets/create-runtime-DYIWr3va.js +0 -1
- package/dist/assets/data-asset-Bb9sIM7i.js +0 -5
- package/dist/assets/game-8SDZPPgH.js +0 -1
- package/dist/assets/game-CevorxyV.js +0 -1
- package/dist/assets/game-Di7XlywD.js +0 -1
- package/dist/assets/game-DjnCaw8R.js +0 -1
- package/dist/assets/game-Q9A0aXSV.js +0 -1
- package/dist/assets/index-CPVV6pjw.js +0 -1
- package/dist/assets/index-CpOnYyeD.js +0 -213
- package/dist/assets/index-Dr8H_6Rl.js +0 -1
- package/dist/assets/index-_bCaipUk.js +0 -13650
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +0 -1
- package/dist/assets/mount-manifest-Bhk0ohsl.js +0 -1
- package/dist/assets/scene-query-BivAHhJu.js +0 -1
- package/dist/assets/webworkerAll-BLrH0F6F.js +0 -1
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +0 -1
- package/dist/assets/xstate.esm-BgUD33nl.js +0 -3
- package/src/authoring/scene-ui-layer.ts +0 -485
- package/src/authoring/ui-authoring-adapter.ts +0 -325
- package/src/authoring/ui-hierarchy-menu.ts +0 -40
- package/src/authoring/ui-inspector-sections.tsx +0 -156
- package/src/authoring/undo-timeline.ts +0 -145
- package/src/components/BottomPanel.tsx +0 -326
- package/src/components/BuildPanel.tsx +0 -455
- package/src/components/FolderTree.tsx +0 -179
- package/src/components/RightPanel.tsx +0 -166
- package/src/components/WorldContextMenu.tsx +0 -257
- package/src/components/asset-viewers/AssetViewer.tsx +0 -38
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +0 -129
- package/src/scene-ui-mode/active-scene-ui.ts +0 -58
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +0 -152
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +0 -29
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +0 -74
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +0 -49
- package/src/scene-ui-mode/ui-prefab-io.ts +0 -76
- package/src/ui-editor/inspector.tsx +0 -563
- package/src/ui-editor/node-ops.ts +0 -266
- package/src/ui-editor/overlay.tsx +0 -380
- package/src/ui-editor/palette.tsx +0 -114
- package/src/ui-editor/react-store.ts +0 -78
- package/src/ui-editor/timeline-panel.tsx +0 -443
- package/src/ui-editor/ui-edit-store.ts +0 -552
- package/src/ui-editor/ui-prefab.ts +0 -95
- package/template/project.json +0 -9
- package/template/src/scripts/main.ts +0 -94
- package/template/src/ui/DefaultHud.tsx +0 -40
- package/template/src/ui/game-state.tsx +0 -37
- package/template/src/ui/mount-default-hud.tsx +0 -19
- package/template/src/ui/mount-ui.ts +0 -15
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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 `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
258
|
-
|
|
355
|
+
removeSessionFile(currentProjectRoot ?? projectPath ?? null);
|
|
356
|
+
void shutdown(signal);
|
|
259
357
|
};
|
|
260
|
-
process.once('SIGINT',
|
|
261
|
-
process.once('SIGTERM',
|
|
262
|
-
process.once('exit', () =>
|
|
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(
|
|
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) => {
|