@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
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "three.js — Pointer-Lock Maze",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "pointerlock-maze",
|
|
11
|
-
"kind": "threejs",
|
|
12
11
|
"description": "Upstream misc_controls_pointerlock: WASD + pointer-lock first-person walk over a procedural box field. Own scene/camera/renderer/rAF/input. Needs #blocker/#instructions DOM.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "threejs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "shared",
|
|
16
|
-
"domStubs": [
|
|
16
|
+
"domStubs": [
|
|
17
|
+
"blocker",
|
|
18
|
+
"instructions"
|
|
19
|
+
]
|
|
17
20
|
}
|
|
18
21
|
},
|
|
19
22
|
"entry": "game.js"
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Bubbo Bubbo (real OSS game)",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "bubbo-bubbo",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "REAL unmodified OSS PixiJS game — pixijs/open-games Bubbo Bubbo, vendored byte-for-byte under vendor/pixi-games/bubbo-bubbo (MIT) and mounted via the iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-bubbo.sh first.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "iframe-reachable",
|
|
16
16
|
"bundleUrl": "/pixi-game-static/bubbo-bubbo/bubbo-bubbo.mjs",
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Bunnymark",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "bunnymark",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "Canonical PixiJS sprite-batching stress test — thousands of bouncing sprites.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "shared"
|
|
16
16
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Flappy Bird",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "flappy",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "Gravity/physics, keyboard + pointer input, AABB collision, scrolling, score HUD.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "shared"
|
|
16
16
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Flappy Pixi (real OSS game, pixi v6)",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "flappy-pixi",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "REAL unmodified OSS PixiJS game — aliexme's Flappy Pixi, vendored byte-for-byte under vendor/pixi-games/flappy-pixi (MIT). Pixi v6 on the v8 host via version-skew (D-P2): pixiModuleUrl's PRESENCE swaps the trapped instance to a served standalone pixi@6.5.10 build. Assets are inlined in the bundle. Requires the gitignored bundles: run vendor/pixi-games/_host/build-flappy-pixi.sh first.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "iframe-reachable",
|
|
16
16
|
"bundleUrl": "/pixi-game-static/flappy-pixi/flappy-pixi.mjs",
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Puzzling Potions (real OSS game)",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "puzzling-potions",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "REAL unmodified OSS PixiJS game — pixijs/open-games Puzzling Potions (match-3 with Spine animations; spine-pixi-v8 pinned exactly 4.2.95 — see host-namespace-registry.ts), vendored byte-for-byte under vendor/pixi-games/puzzling-potions (MIT), iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-puzzling-potions.sh first.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "iframe-reachable",
|
|
16
16
|
"bundleUrl": "/pixi-game-static/puzzling-potions/puzzling-potions.mjs",
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "Tilemap + Camera",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "tilemap-camera",
|
|
11
|
-
"kind": "pixijs",
|
|
12
11
|
"description": "Real @pixi/tilemap CompositeTilemap (60x40 grid) + keyboard player + camera follow.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "pixijs",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "shared"
|
|
16
16
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"manifestVersion":
|
|
2
|
+
"manifestVersion": 2,
|
|
3
3
|
"name": "React RPG: 2e (real OSS game)",
|
|
4
4
|
"version": "2.0.0",
|
|
5
5
|
"engine": {
|
|
6
6
|
"version": "0.1.0"
|
|
7
7
|
},
|
|
8
|
-
"
|
|
8
|
+
"roots": [
|
|
9
9
|
{
|
|
10
10
|
"id": "react-rpg",
|
|
11
|
-
"kind": "react",
|
|
12
11
|
"description": "REAL unmodified native-React OSS game — ASteinheiser/react-rpg.com, vendored byte-for-byte under vendor/react-games/react-rpg (MIT) and mounted via the ingest-react identity (Track N, D-N1/D-N2/D-N3). No authoring in v1 (D-N8) — this world is ingested read-only, no scene/write-back surface.",
|
|
13
12
|
"adapter": {
|
|
13
|
+
"surface": "react",
|
|
14
14
|
"ingest": {
|
|
15
15
|
"strategy": "deduped"
|
|
16
16
|
}
|
package/src/ingest/types.ts
CHANGED
|
@@ -81,7 +81,7 @@ export interface IngestGame {
|
|
|
81
81
|
* a manifest that has one. `ingest/discovery.ts`'s in-tree fixture route
|
|
82
82
|
* sets this from the parsed manifest's `version`; `adapter-resolver.ts`'s
|
|
83
83
|
* `resolveIngestDescriptor` (the CLI-on-folder / manifest-world route)
|
|
84
|
-
* cannot — it only has a `
|
|
84
|
+
* cannot — it only has a `ResolvedAdapterRoot`, not the manifest's top-level
|
|
85
85
|
* `version` — so `ingest-mode.ts`'s `enterIngestModeFromManifestWorld`
|
|
86
86
|
* threads the resolved manifest's `version` through as an explicit
|
|
87
87
|
* parameter instead, taking precedence over this field where both exist.
|
package/src/ingest-mode.ts
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
import { readGameContract } from '@engine/adapter/ingest/game-contract';
|
|
34
34
|
import { extractUpstreamPin } from '@engine/adapter/ingest/upstream-pin';
|
|
35
|
-
import type {
|
|
35
|
+
import type { ResolvedAdapterRoot, ResolvedGameManifest } from '@engine/manifest/load';
|
|
36
36
|
import type { Tier } from '@engine/manifest/schema';
|
|
37
37
|
import type { Overlay2D } from '@engine/world2d/authoring-2d';
|
|
38
38
|
import {
|
|
@@ -90,7 +90,6 @@ import {
|
|
|
90
90
|
ReactDomAuthoringAdapter,
|
|
91
91
|
type ReactDomOverlay,
|
|
92
92
|
} from './authoring/react-dom-authoring-adapter';
|
|
93
|
-
import { unregisterUndoAdapter } from './authoring/undo-timeline';
|
|
94
93
|
import { loadWorldOverlay, saveWorldOverlay, worldOverlayPath } from './authoring/world-overlay';
|
|
95
94
|
import { World2DAuthoringAdapter } from './authoring/world2d-authoring-adapter';
|
|
96
95
|
import { editorConsole } from './editor-console';
|
|
@@ -134,7 +133,7 @@ interface IngestSession {
|
|
|
134
133
|
* own sections), referenced here by forward type reference.
|
|
135
134
|
*
|
|
136
135
|
* `siblings` (D-V2, docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md, F24 composite):
|
|
137
|
-
* a composite manifest's OTHER
|
|
136
|
+
* a composite manifest's OTHER roots, mounted beside this session's ingest
|
|
138
137
|
* world (`ingest-siblings.ts`'s `mountIngestSiblings`) — always `[]` for
|
|
139
138
|
* every non-composite entry path (the in-tree fixture glob route, the
|
|
140
139
|
* `?ingest=` URL route, a single-world manifest). `exitActiveIngest` below
|
|
@@ -490,7 +489,7 @@ async function mountThreeIframeReachableBundle(
|
|
|
490
489
|
*
|
|
491
490
|
* `declaredTier` (T3.4 slice 1, docs/ADAPTER-AUTHORING-DESIGN.md §1.C
|
|
492
491
|
* retrofit) is the world's declared `capabilities.local` tier, when known —
|
|
493
|
-
* only `enterIngestModeFromManifestWorld` has a `
|
|
492
|
+
* only `enterIngestModeFromManifestWorld` has a `ResolvedAdapterRoot` to read
|
|
494
493
|
* it from; the in-tree fixture route (`enterIngestMode`) has no manifest at
|
|
495
494
|
* all, so it stays `undefined` there (anti-shim: never fabricate a declared
|
|
496
495
|
* tier that was never actually declared). Both embed-only degradation points
|
|
@@ -772,7 +771,7 @@ export async function enterIngestMode(store: EditorStore, gameId: string): Promi
|
|
|
772
771
|
* world id too, for the in-tree fixtures — same namespace, different origin).
|
|
773
772
|
*
|
|
774
773
|
* `gameVersion` (T7.7/D9): `resolveIngestDescriptor` only has a
|
|
775
|
-
* `
|
|
774
|
+
* `ResolvedAdapterRoot`, not the manifest's top-level `version` — so the caller
|
|
776
775
|
* (`tryManifestIngestRoute` below, which fetched the full `ResolvedGameManifest`)
|
|
777
776
|
* passes it here explicitly, threaded straight through to `enterIngestModeWithGame`.
|
|
778
777
|
*
|
|
@@ -783,7 +782,7 @@ export async function enterIngestMode(store: EditorStore, gameId: string): Promi
|
|
|
783
782
|
*/
|
|
784
783
|
export async function enterIngestModeFromManifestWorld(
|
|
785
784
|
store: EditorStore,
|
|
786
|
-
world:
|
|
785
|
+
world: ResolvedAdapterRoot,
|
|
787
786
|
projectRoot: string,
|
|
788
787
|
gameVersion?: string,
|
|
789
788
|
upstreamPin?: string | null,
|
|
@@ -996,7 +995,7 @@ export async function enterIngestModeWithGame2D(
|
|
|
996
995
|
throw new Error(
|
|
997
996
|
`enterIngestModeWithGame2D: world2d ingest game "${game.id}" has neither \`load\` nor ` +
|
|
998
997
|
'`bundleUrl` — only shared/deduped (load) or iframe-reachable (bundleUrl) ingest-pixi ' +
|
|
999
|
-
'
|
|
998
|
+
'roots are mountable this slice (resolveIngest2DDescriptor).',
|
|
1000
999
|
);
|
|
1001
1000
|
}
|
|
1002
1001
|
|
|
@@ -1105,7 +1104,7 @@ export async function enterIngestModeWithGame2D(
|
|
|
1105
1104
|
*/
|
|
1106
1105
|
export async function enterIngestModeFromManifestWorld2D(
|
|
1107
1106
|
store: EditorStore,
|
|
1108
|
-
world:
|
|
1107
|
+
world: ResolvedAdapterRoot,
|
|
1109
1108
|
projectRoot: string,
|
|
1110
1109
|
): Promise<void> {
|
|
1111
1110
|
const game = resolveIngest2DDescriptor(world, projectRoot);
|
|
@@ -1141,7 +1140,9 @@ function disposePixiSession(s: IngestSession2D): void {
|
|
|
1141
1140
|
// timeline (mirrors `IngestAuthoringAdapter` — see disposeThreejsSession's
|
|
1142
1141
|
// identical call above), so this session's entries must be dropped the same
|
|
1143
1142
|
// way on exit. Absent for a D-W2 opaque-embed session (no adapter, no undo entries).
|
|
1144
|
-
if (s.adapter)
|
|
1143
|
+
if (s.adapter) {
|
|
1144
|
+
s.adapter.dispose();
|
|
1145
|
+
}
|
|
1145
1146
|
setActiveAuthoring(null);
|
|
1146
1147
|
setActiveSystems(null);
|
|
1147
1148
|
setMountFailureReport(null); // D-W3: no session -> no banner to show (mirrors setActiveOverlayReport(null) above)
|
|
@@ -1176,9 +1177,7 @@ interface IngestSessionReact {
|
|
|
1176
1177
|
/** The runtime Game's real play-state control — the F26 play surface. */
|
|
1177
1178
|
setPaused: (paused: boolean) => void;
|
|
1178
1179
|
stop: () => void;
|
|
1179
|
-
/**
|
|
1180
|
-
* install — self-registered with the global undo timeline at construction,
|
|
1181
|
-
* so teardown must unregister it (mirrors `IngestSession2D.adapter`). */
|
|
1180
|
+
/** Live DOM-authoring adapter; owns a session history resource. */
|
|
1182
1181
|
adapter: ReactDomAuthoringAdapter;
|
|
1183
1182
|
}
|
|
1184
1183
|
|
|
@@ -1229,17 +1228,17 @@ function reactDomEvidence(
|
|
|
1229
1228
|
* `?ingest=<id>` URL route's react fallback, tried after the three/pixi
|
|
1230
1229
|
* fixture globs — see `autoLaunchIngestFromURL` below). Mounts through the
|
|
1231
1230
|
* EXACT SAME T6.2 react-world host stack `default-react`/multi-world react
|
|
1232
|
-
*
|
|
1231
|
+
* roots use — NOT the capture-based three/pixi bridge (there is no scene to
|
|
1233
1232
|
* capture; the mounted tree IS React, D-N1).
|
|
1234
1233
|
*
|
|
1235
1234
|
* Reuses `resolveAllWorlds` + the WORLDS-PATH `createGameRuntime` (not the
|
|
1236
1235
|
* legacy single-`{canvas,adapter}` path, which is three-only and has no
|
|
1237
1236
|
* `ReactWorldHost`/`container` concept — see `create-runtime.ts`'s
|
|
1238
1237
|
* `HostContext`) rather than hand-building a `ReactWorldHost`/`Game`: a
|
|
1239
|
-
* single-element `
|
|
1238
|
+
* single-element `roots` array gets EVERY host concern for free (the
|
|
1240
1239
|
* absolutely-positioned DOM-root layer, a real `Game`, dispose via
|
|
1241
1240
|
* `session.stop()`) with zero reinvention — `resolveAllWorlds`'s
|
|
1242
|
-
* `MULTI_WORLD_ALLOWED_IDENTITIES` gate only fires for `
|
|
1241
|
+
* `MULTI_WORLD_ALLOWED_IDENTITIES` gate only fires for `roots.length > 1`
|
|
1243
1242
|
* (see that function's doc comment), so a ONE-element manifest containing an
|
|
1244
1243
|
* `ingest-react` world resolves cleanly through it despite that identity
|
|
1245
1244
|
* being excluded from real multi-world manifests.
|
|
@@ -1295,7 +1294,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
|
|
|
1295
1294
|
const h = gameContainer.clientHeight;
|
|
1296
1295
|
const session = await createGameRuntime({
|
|
1297
1296
|
container: gameContainer,
|
|
1298
|
-
|
|
1297
|
+
roots: specs,
|
|
1299
1298
|
width: w,
|
|
1300
1299
|
height: h,
|
|
1301
1300
|
});
|
|
@@ -1307,7 +1306,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
|
|
|
1307
1306
|
// adapter with none — it is installed directly, never `withStoreSelection`-wrapped.
|
|
1308
1307
|
const worldId = game.worldId;
|
|
1309
1308
|
const overlay = await loadWorldOverlay<ReactDomOverlay>(worldId);
|
|
1310
|
-
const root = session.game.
|
|
1309
|
+
const root = session.game.roots[0]!.reactRoot();
|
|
1311
1310
|
const adapter = new ReactDomAuthoringAdapter(root, store, {
|
|
1312
1311
|
overlay,
|
|
1313
1312
|
persist: (o) => saveWorldOverlay(worldId, o),
|
|
@@ -1367,8 +1366,8 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
|
|
|
1367
1366
|
* manifest-route sibling of {@link enterIngestModeReact} above: an
|
|
1368
1367
|
* EXTERNAL-FOLDER `ingest-react` world (the opened project's OWN
|
|
1369
1368
|
* `vgai.game.json`, not the vendored `games-react/<id>` discovery glob)
|
|
1370
|
-
* enters the same react ingest session. Exactly the same
|
|
1371
|
-
* (one-element `resolveAllWorlds` +
|
|
1369
|
+
* enters the same react ingest session. Exactly the same roots-path recipe
|
|
1370
|
+
* (one-element `resolveAllWorlds` + roots-path `createGameRuntime`) and the
|
|
1372
1371
|
* same `ReactDomAuthoringAdapter` D-K4 wiring (see that function's doc
|
|
1373
1372
|
* comment) — only the SOURCE of `world`/`projectRoot` differs (the opened project's manifest +
|
|
1374
1373
|
* `project.rootPath`, via `tryManifestIngestRouteReact` below, instead of
|
|
@@ -1382,7 +1381,7 @@ export async function enterIngestModeReact(store: EditorStore, folderId: string)
|
|
|
1382
1381
|
export async function enterIngestModeFromManifestWorldReact(
|
|
1383
1382
|
store: EditorStore,
|
|
1384
1383
|
manifest: ResolvedGameManifest,
|
|
1385
|
-
world:
|
|
1384
|
+
world: ResolvedAdapterRoot,
|
|
1386
1385
|
projectRoot: string,
|
|
1387
1386
|
): Promise<void> {
|
|
1388
1387
|
if (getEditorMode() === 'browser') {
|
|
@@ -1411,12 +1410,12 @@ export async function enterIngestModeFromManifestWorldReact(
|
|
|
1411
1410
|
// above) makes — an external-folder game may declare the game contract too.
|
|
1412
1411
|
(window as unknown as { __vgaiMountCold?: boolean }).__vgaiMountCold = true;
|
|
1413
1412
|
const { createGameRuntime } = await import('@engine/runtime/create-runtime');
|
|
1414
|
-
const specs = await resolveAllWorlds({ ...manifest,
|
|
1413
|
+
const specs = await resolveAllWorlds({ ...manifest, roots: [world] }, projectRoot);
|
|
1415
1414
|
const w = gameContainer.clientWidth;
|
|
1416
1415
|
const h = gameContainer.clientHeight;
|
|
1417
1416
|
const session = await createGameRuntime({
|
|
1418
1417
|
container: gameContainer,
|
|
1419
|
-
|
|
1418
|
+
roots: specs,
|
|
1420
1419
|
width: w,
|
|
1421
1420
|
height: h,
|
|
1422
1421
|
});
|
|
@@ -1426,7 +1425,7 @@ export async function enterIngestModeFromManifestWorldReact(
|
|
|
1426
1425
|
// not `game.worldId` (the vendored-fixture wrapper's field).
|
|
1427
1426
|
const worldId = world.id;
|
|
1428
1427
|
const overlay = await loadWorldOverlay<ReactDomOverlay>(worldId);
|
|
1429
|
-
const root = session.game.
|
|
1428
|
+
const root = session.game.roots[0]!.reactRoot();
|
|
1430
1429
|
const adapter = new ReactDomAuthoringAdapter(root, store, {
|
|
1431
1430
|
overlay,
|
|
1432
1431
|
persist: (o) => saveWorldOverlay(worldId, o),
|
|
@@ -1476,12 +1475,8 @@ export async function enterIngestModeFromManifestWorldReact(
|
|
|
1476
1475
|
*/
|
|
1477
1476
|
function disposeReactSession(s: IngestSessionReact): void {
|
|
1478
1477
|
setGameInputGate(() => true);
|
|
1479
|
-
//
|
|
1480
|
-
|
|
1481
|
-
// `World2DAuthoringAdapter`/`ReactWorldAuthoringAdapter`) — drop it so any
|
|
1482
|
-
// of its entries still on the global stack are dropped (with a warn), not
|
|
1483
|
-
// undone against a torn-down DOM.
|
|
1484
|
-
unregisterUndoAdapter(s.adapter);
|
|
1478
|
+
// Disposal expires its session history and releases listeners.
|
|
1479
|
+
s.adapter.dispose();
|
|
1485
1480
|
setActiveAuthoring(null);
|
|
1486
1481
|
setActiveSystems(null);
|
|
1487
1482
|
setMountFailureReport(null); // D-W3: no session -> no banner to show (mirrors disposeThreejsSession's identical call)
|
|
@@ -1521,10 +1516,11 @@ function disposeThreejsSession(s: IngestSession): void {
|
|
|
1521
1516
|
// way on exit.
|
|
1522
1517
|
setGameInputGate(() => true);
|
|
1523
1518
|
|
|
1524
|
-
//
|
|
1525
|
-
//
|
|
1526
|
-
|
|
1527
|
-
|
|
1519
|
+
// The concrete ingest adapter owns a session history resource. Dispose it
|
|
1520
|
+
// when present; minimal/custom authoring implementations need no teardown.
|
|
1521
|
+
if (s.mount?.authoring) {
|
|
1522
|
+
s.mount.authoring.dispose?.();
|
|
1523
|
+
}
|
|
1528
1524
|
setActiveAuthoring(null);
|
|
1529
1525
|
setActiveSystems(null);
|
|
1530
1526
|
setActiveOverlayReport(null); // D9: no session -> no banner to show
|
|
@@ -1629,7 +1625,7 @@ if (import.meta.env.DEV) {
|
|
|
1629
1625
|
* Wait for the Game-tab container (registered via a callback ref at layout
|
|
1630
1626
|
* mount) — poll a bounded number of rAF ticks so we don't race the first
|
|
1631
1627
|
* paint. Exported (T3.4 slice 2) so `module-mode.ts`'s manifest-route auto-
|
|
1632
|
-
* mount for `{ module }`
|
|
1628
|
+
* mount for `{ module }` roots — the sibling of `tryManifestIngestRoute`
|
|
1633
1629
|
* below — can reuse the SAME wait rather than duplicating it.
|
|
1634
1630
|
*/
|
|
1635
1631
|
export async function waitForGameContainer(): Promise<boolean> {
|
|
@@ -1646,17 +1642,17 @@ export async function waitForGameContainer(): Promise<boolean> {
|
|
|
1646
1642
|
|
|
1647
1643
|
/**
|
|
1648
1644
|
* D-V2 (docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md, F24 composite): every world
|
|
1649
|
-
* in `manifest.
|
|
1645
|
+
* in `manifest.roots` whose adapter is `{ ingest }` — a composite manifest
|
|
1650
1646
|
* caps this at exactly one (see each `tryManifestIngestRoute*` below); ≥2 is
|
|
1651
1647
|
* a loud named error via {@link reportTooManyIngestWorlds}, never a silent
|
|
1652
1648
|
* first-wins pick (mirrors `run-bundle.ts`'s fail-on-ambiguity pattern).
|
|
1653
1649
|
*/
|
|
1654
|
-
function findIngestWorlds(manifest: ResolvedGameManifest):
|
|
1655
|
-
return manifest.
|
|
1650
|
+
function findIngestWorlds(manifest: ResolvedGameManifest): ResolvedAdapterRoot[] {
|
|
1651
|
+
return manifest.roots.filter((w) => w.adapter.type === 'ingest');
|
|
1656
1652
|
}
|
|
1657
1653
|
|
|
1658
1654
|
/**
|
|
1659
|
-
* D-V2: the "composite declares ≥2 ingest
|
|
1655
|
+
* D-V2: the "composite declares ≥2 ingest roots" violation — named, listing
|
|
1660
1656
|
* every offending world id, reported once (into BOTH `editorConsole` and the
|
|
1661
1657
|
* D-V5 multi-entry mount-failure report, one entry per offending world so
|
|
1662
1658
|
* the banner names all of them) by whichever `tryManifestIngestRoute*`
|
|
@@ -1664,7 +1660,7 @@ function findIngestWorlds(manifest: ResolvedGameManifest): ResolvedWorldEntry[]
|
|
|
1664
1660
|
* `autoLaunchIngestFromURL`) — the caller returns `true` right after this
|
|
1665
1661
|
* (claims the route), so the other two ingest routes never also report it.
|
|
1666
1662
|
*/
|
|
1667
|
-
function reportTooManyIngestWorlds(ingestWorlds:
|
|
1663
|
+
function reportTooManyIngestWorlds(ingestWorlds: ResolvedAdapterRoot[]): void {
|
|
1668
1664
|
const ids = ingestWorlds.map((w) => `"${w.id}"`).join(', ');
|
|
1669
1665
|
const message =
|
|
1670
1666
|
'a composite manifest declares exactly ONE ingest world in this slice — found ' +
|
|
@@ -1673,7 +1669,7 @@ function reportTooManyIngestWorlds(ingestWorlds: ResolvedWorldEntry[]): void {
|
|
|
1673
1669
|
for (const world of ingestWorlds) {
|
|
1674
1670
|
addMountFailureReport({
|
|
1675
1671
|
worldId: world.id,
|
|
1676
|
-
kind: world.
|
|
1672
|
+
kind: world.surface,
|
|
1677
1673
|
identity: world.adapter.identity,
|
|
1678
1674
|
message,
|
|
1679
1675
|
});
|
|
@@ -1746,17 +1742,17 @@ async function mountCompositeSiblings(
|
|
|
1746
1742
|
*/
|
|
1747
1743
|
function promoteToCompositeAuthoring(
|
|
1748
1744
|
manifest: ResolvedGameManifest,
|
|
1749
|
-
ingestWorld:
|
|
1745
|
+
ingestWorld: ResolvedAdapterRoot,
|
|
1750
1746
|
siblings: readonly SiblingMount[],
|
|
1751
1747
|
): void {
|
|
1752
1748
|
if (siblings.length === 0) return;
|
|
1753
1749
|
const primaryAdapter = getAuthoringOverride();
|
|
1754
1750
|
if (!primaryAdapter) return;
|
|
1755
1751
|
const children: CompositeChild[] = [
|
|
1756
|
-
{ worldId: ingestWorld.id, kind: ingestWorld.
|
|
1752
|
+
{ worldId: ingestWorld.id, kind: ingestWorld.surface, adapter: primaryAdapter },
|
|
1757
1753
|
...siblings.map((s) => ({
|
|
1758
1754
|
worldId: s.worldId,
|
|
1759
|
-
kind: manifest.
|
|
1755
|
+
kind: manifest.roots.find((w) => w.id === s.worldId)?.surface ?? 'unknown',
|
|
1760
1756
|
// D-E1: every successfully-mounted SiblingMount gets an honest
|
|
1761
1757
|
// `authoring` whenever a store was supplied — every composite route
|
|
1762
1758
|
// below supplies one, so this is never actually undefined in
|
|
@@ -1776,8 +1772,8 @@ function promoteToCompositeAuthoring(
|
|
|
1776
1772
|
* ingest world at all, or the one ingest world isn't ingest-three", so the
|
|
1777
1773
|
* next route (pixi, react, then the URL route) still gets a chance.
|
|
1778
1774
|
*
|
|
1779
|
-
* D-V2 (F24 composite): scans ALL
|
|
1780
|
-
* `
|
|
1775
|
+
* D-V2 (F24 composite): scans ALL roots for `{ ingest }` adapters, not just
|
|
1776
|
+
* `roots[0]` — 0 ingest roots declines (unchanged non-ingest-manifest
|
|
1781
1777
|
* behavior); ≥2 claims the route and fails loudly
|
|
1782
1778
|
* ({@link reportTooManyIngestWorlds}), mounting nothing; exactly 1 whose
|
|
1783
1779
|
* identity is `ingest-three` mounts THAT world (wherever it sits in the
|
|
@@ -1815,7 +1811,7 @@ async function tryManifestIngestRoute(store: EditorStore): Promise<boolean> {
|
|
|
1815
1811
|
try {
|
|
1816
1812
|
// D9/T7.7: thread the manifest's OWN version through — resolveIngestDescriptor
|
|
1817
1813
|
// (called inside enterIngestModeFromManifestWorld) only sees the per-world
|
|
1818
|
-
//
|
|
1814
|
+
// ResolvedAdapterRoot, not this top-level field.
|
|
1819
1815
|
// R5 (§4(c)): best-effort read of this project's UPSTREAM.md pin, same
|
|
1820
1816
|
// spirit — resolveIngestDescriptor has no way to discover one either.
|
|
1821
1817
|
const upstreamPin = await readVendoredUpstreamPin();
|
|
@@ -1849,7 +1845,7 @@ async function tryManifestIngestRoute(store: EditorStore): Promise<boolean> {
|
|
|
1849
1845
|
// Populate the loud banner slot too.
|
|
1850
1846
|
setMountFailureReport({
|
|
1851
1847
|
worldId: ingestWorld.id,
|
|
1852
|
-
kind: ingestWorld.
|
|
1848
|
+
kind: ingestWorld.surface,
|
|
1853
1849
|
identity: ingestWorld.adapter.identity,
|
|
1854
1850
|
message: formatMountFailureMessage(err),
|
|
1855
1851
|
});
|
|
@@ -1910,7 +1906,7 @@ async function tryManifestIngestRoute2D(store: EditorStore): Promise<boolean> {
|
|
|
1910
1906
|
// D-W3 (F9) — see tryManifestIngestRoute's identical comment above.
|
|
1911
1907
|
setMountFailureReport({
|
|
1912
1908
|
worldId: ingestWorld.id,
|
|
1913
|
-
kind: ingestWorld.
|
|
1909
|
+
kind: ingestWorld.surface,
|
|
1914
1910
|
identity: ingestWorld.adapter.identity,
|
|
1915
1911
|
message: formatMountFailureMessage(err),
|
|
1916
1912
|
});
|
|
@@ -1973,7 +1969,7 @@ async function tryManifestIngestRouteReact(store: EditorStore): Promise<boolean>
|
|
|
1973
1969
|
// D-W3 (F9) — see tryManifestIngestRoute's identical comment above.
|
|
1974
1970
|
setMountFailureReport({
|
|
1975
1971
|
worldId: ingestWorld.id,
|
|
1976
|
-
kind: ingestWorld.
|
|
1972
|
+
kind: ingestWorld.surface,
|
|
1977
1973
|
identity: ingestWorld.adapter.identity,
|
|
1978
1974
|
message: formatMountFailureMessage(err),
|
|
1979
1975
|
});
|
|
@@ -1999,8 +1995,7 @@ async function tryManifestIngestRouteReact(store: EditorStore): Promise<boolean>
|
|
|
1999
1995
|
* 2. Manifest route, three (T3.3 slice 3, docs/CLI-ON-FOLDER-DESIGN.md §1E,
|
|
2000
1996
|
* `tryManifestIngestRoute` above) — the CLI-on-folder AC ("point the CLI
|
|
2001
1997
|
* at an ingest game folder never registered in source -> opens, plays,
|
|
2002
|
-
* edits"). Browser-mode builds
|
|
2003
|
-
* both fall straight through to route 5, unchanged.
|
|
1998
|
+
* edits"). Browser-mode builds fall straight through to route 5.
|
|
2004
1999
|
* 3. Manifest route, pixi (T6.1 slice 4, `tryManifestIngestRoute2D` above) —
|
|
2005
2000
|
* the world2d silo retirement's replacement discovery path for an
|
|
2006
2001
|
* `ingest-pixi` world.
|
|
@@ -2040,7 +2035,7 @@ export async function autoLaunchIngestFromURL(store: EditorStore): Promise<void>
|
|
|
2040
2035
|
} catch (err) {
|
|
2041
2036
|
editorConsole.error(`Auto-ingest failed: ${err}`, 'ingest');
|
|
2042
2037
|
// D-W3 (F9): the `?ingest=<id>` URL-fallback route has no
|
|
2043
|
-
// `
|
|
2038
|
+
// `ResolvedAdapterRoot` to read a world id/kind from (it resolves
|
|
2044
2039
|
// straight off the in-tree fixture globs) — `gameId` and the fixed
|
|
2045
2040
|
// 'threejs'/'ingest-three' vocabulary are the closest honest analog.
|
|
2046
2041
|
setMountFailureReport({
|