@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
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story discovery — C3 (spec §9, docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md
|
|
3
|
+
* "Add CSF Discovery and Portable Story Mounting"). The story sibling of
|
|
4
|
+
* `tool-loader.ts`: conventional `src/**\/*.stories.tsx` / `*.stories.ts`
|
|
5
|
+
* files of the open project are found via the editor server's folder scan
|
|
6
|
+
* (`GET /__editor/story-files`, `editor-server.ts`) — the SAME "discovery IS
|
|
7
|
+
* a live folder scan, never a cached manifest" physics `tool-loader.ts`/
|
|
8
|
+
* `DataPanel.tsx` already use (docs/DATA-TOOLS-DESIGN.md §3.5 rule 2).
|
|
9
|
+
*
|
|
10
|
+
* Deliberately paths-only, same reasoning as tool discovery: the CSF MODULE
|
|
11
|
+
* itself is loaded client-side through Vite's `/@fs/` dynamic-import path
|
|
12
|
+
* (`compose-project-stories.ts` calls `load()` below), so it arrives
|
|
13
|
+
* transpiled with HMR and the editor never stores a duplicate story
|
|
14
|
+
* definition anywhere — the CSF module on disk stays the single source of
|
|
15
|
+
* truth (spec §9 C3 "Story source remains the CSF module").
|
|
16
|
+
*
|
|
17
|
+
* Browser mode (no Node dev server): `fetch('/__editor/story-files')` 404s
|
|
18
|
+
* or throws, so `discoverProjectStories` resolves to an empty list rather
|
|
19
|
+
* than throwing — same graceful no-op `refreshProjectTools` uses.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** One discovered story module — path only; the module is loaded on demand. */
|
|
23
|
+
export interface DiscoveredStoryModule {
|
|
24
|
+
/** Project-relative path, e.g. `src/ui/Button.stories.tsx`. */
|
|
25
|
+
modulePath: string;
|
|
26
|
+
/** Dynamically imports the CSF module via Vite's `/@fs/` path, cache-busted
|
|
27
|
+
* so a re-discover (or an explicit re-load) always gets fresh code — same
|
|
28
|
+
* contract as `tool-loader.ts`'s `refreshProjectTools`. Returns the raw
|
|
29
|
+
* module namespace (default export = Meta, named exports = stories). */
|
|
30
|
+
load: () => Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Minimal shape `discoverProjectStories` needs from the open project — the
|
|
34
|
+
* same fields `getCurrentProject()` (`project-manager.ts`) already returns,
|
|
35
|
+
* kept as a narrow parameter so this module doesn't need to import the
|
|
36
|
+
* whole project-manager (and stays trivially testable with a fixture). */
|
|
37
|
+
export interface StoryDiscoveryProject {
|
|
38
|
+
rootPath: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Shape of `/__editor/story-files` (editor-server.ts) — a live folder scan,
|
|
42
|
+
* never a cached manifest (D3), plus a server-truthed existence check for
|
|
43
|
+
* the project's optional `.storybook/preview.ts(x)`. */
|
|
44
|
+
interface StoryFilesPayload {
|
|
45
|
+
files: Array<{ path: string }>;
|
|
46
|
+
/** Project-relative path to whichever preview-config candidate exists on
|
|
47
|
+
* disk, or `null` when the project has no `.storybook/` folder at all
|
|
48
|
+
* (the common case — this repo's own template ships none). */
|
|
49
|
+
previewModulePath?: string | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// No project param: the editor server is single-project (`projectRoot` is
|
|
53
|
+
// server-side session state — `/__editor/open-project`), so this GET is
|
|
54
|
+
// never parameterized by project, same as `/__editor/tool-files`/
|
|
55
|
+
// `/__editor/data-files`.
|
|
56
|
+
async function fetchStoryFilesPayload(): Promise<StoryFilesPayload | undefined> {
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch('/__editor/story-files');
|
|
59
|
+
if (!res.ok) return undefined; // no dev server route (e.g. browser mode)
|
|
60
|
+
return (await res.json()) as StoryFilesPayload;
|
|
61
|
+
} catch {
|
|
62
|
+
return undefined; // server unreachable
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Scan the open project for `*.stories.tsx` / `*.stories.ts` files (via the
|
|
68
|
+
* editor server's `/__editor/story-files` route) and return one
|
|
69
|
+
* `DiscoveredStoryModule` per file, each carrying a lazy `load()`.
|
|
70
|
+
*
|
|
71
|
+
* Never throws: a missing/unreachable route (browser mode, or no project
|
|
72
|
+
* open) resolves to `[]`, mirroring `refreshProjectTools`'s "keep the editor
|
|
73
|
+
* alive" discipline — a broken discovery pass must not crash the Stories
|
|
74
|
+
* panel.
|
|
75
|
+
*/
|
|
76
|
+
export async function discoverProjectStories(
|
|
77
|
+
project: StoryDiscoveryProject | null,
|
|
78
|
+
): Promise<DiscoveredStoryModule[]> {
|
|
79
|
+
if (!project) return [];
|
|
80
|
+
|
|
81
|
+
const payload = await fetchStoryFilesPayload();
|
|
82
|
+
if (!payload) return [];
|
|
83
|
+
|
|
84
|
+
return payload.files.map(({ path: modulePath }) => ({
|
|
85
|
+
modulePath,
|
|
86
|
+
load: () =>
|
|
87
|
+
import(
|
|
88
|
+
/* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
|
|
89
|
+
) as Promise<unknown>,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Load the open project's `.storybook/preview.ts(x)` module namespace, if it
|
|
95
|
+
* has one — the project-level annotations `setProjectAnnotations` applies
|
|
96
|
+
* once per session (`compose-project-stories.ts`'s `ensureProjectAnnotations`,
|
|
97
|
+
* called from `story-registry.ts`'s `refreshProjectStories`). Resolves to
|
|
98
|
+
* `undefined` when the project has no `.storybook/` folder (this repo's own
|
|
99
|
+
* template ships none — Storybook's own documented default project
|
|
100
|
+
* annotations apply, same as running with no preview config at all) or when
|
|
101
|
+
* the file fails to import for any other reason; never throws — a project
|
|
102
|
+
* config error here must not block story discovery from working.
|
|
103
|
+
*
|
|
104
|
+
* Asks the server (`/__editor/story-files`'s `previewModulePath`) which
|
|
105
|
+
* candidate, if any, actually exists on disk BEFORE importing anything — no
|
|
106
|
+
* more blind `/@fs/` probing of a path that almost always isn't there. A
|
|
107
|
+
* project with no `.storybook/` folder now costs zero network requests here
|
|
108
|
+
* instead of one guaranteed-to-fail one (that failure was invisible to this
|
|
109
|
+
* function's own try/catch, since a browser reports a failed `/@fs/` fetch
|
|
110
|
+
* as a page-level network error regardless of how the JS that triggered it
|
|
111
|
+
* handles the rejection — see `check-vgai-generated-project-p2p.ts`, which
|
|
112
|
+
* caught this as a generated-project "browser error").
|
|
113
|
+
*/
|
|
114
|
+
export async function loadProjectPreviewAnnotations(
|
|
115
|
+
project: StoryDiscoveryProject | null,
|
|
116
|
+
): Promise<unknown> {
|
|
117
|
+
if (!project) return undefined;
|
|
118
|
+
const payload = await fetchStoryFilesPayload();
|
|
119
|
+
const modulePath = payload?.previewModulePath;
|
|
120
|
+
if (!modulePath) return undefined;
|
|
121
|
+
try {
|
|
122
|
+
return await import(
|
|
123
|
+
/* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
|
|
124
|
+
);
|
|
125
|
+
} catch {
|
|
126
|
+
// Reported as present but failed to import for some other reason (a
|
|
127
|
+
// genuine config error) — degrade the same way as "not present".
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story registry (C3, spec §9) — the story sibling of `tool-loader.ts`'s
|
|
3
|
+
* registry half: ties `story-discovery.ts` (find modules) and
|
|
4
|
+
* `compose-project-stories.ts` (portable-mount one loaded module) together
|
|
5
|
+
* into a live, `useSyncExternalStore`-shaped list consumed by React design-time
|
|
6
|
+
* world mounting and its document/story hierarchy.
|
|
7
|
+
*
|
|
8
|
+
* Same discipline as the tool registry: discovery is a live rescan (never a
|
|
9
|
+
* cached manifest, D3), re-run on project open/change and on the server's
|
|
10
|
+
* `story-files-changed` SSE broadcast (a new/removed `*.stories.tsx`).
|
|
11
|
+
* Per-module failures (a module that fails to import, or fails to compose)
|
|
12
|
+
* are collected alongside successes rather than dropped — the panel shows a
|
|
13
|
+
* broken module's error inline, naming the module (spec §9 "errors identify
|
|
14
|
+
* the source module"), instead of silently omitting it.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
type ComposedProjectStory,
|
|
19
|
+
composeProjectStories,
|
|
20
|
+
ensureProjectAnnotations,
|
|
21
|
+
} from './compose-project-stories';
|
|
22
|
+
|
|
23
|
+
/** One portable CSF story explicitly associated with a native React root.
|
|
24
|
+
* The association uses Storybook's standard custom-parameters seam:
|
|
25
|
+
* `parameters.vgai.root` (preferred) or `parameters.vgai.world` (migration
|
|
26
|
+
* alias). No story args/decorators/loaders are copied or reinterpreted. */
|
|
27
|
+
export interface RootPreviewStory extends ComposedProjectStory {
|
|
28
|
+
modulePath: string;
|
|
29
|
+
rootId: string;
|
|
30
|
+
isDefault: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
import { discoverProjectStories, loadProjectPreviewAnnotations } from './story-discovery';
|
|
34
|
+
|
|
35
|
+
/** One discovered module's outcome after load + compose. */
|
|
36
|
+
export type ProjectStoryModule =
|
|
37
|
+
| { modulePath: string; ok: true; stories: ComposedProjectStory[] }
|
|
38
|
+
| { modulePath: string; ok: false; error: string };
|
|
39
|
+
|
|
40
|
+
interface StoryDiscoveryProjectLike {
|
|
41
|
+
rootPath: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let _modules: ProjectStoryModule[] = [];
|
|
45
|
+
const _listeners = new Set<() => void>();
|
|
46
|
+
|
|
47
|
+
/** Current story modules (stable reference between refreshes). */
|
|
48
|
+
export function getProjectStoryModules(): ProjectStoryModule[] {
|
|
49
|
+
return _modules;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Subscribe to story-registry changes. Returns an unsubscribe function. */
|
|
53
|
+
export function subscribeProjectStoryModules(fn: () => void): () => void {
|
|
54
|
+
_listeners.add(fn);
|
|
55
|
+
return () => _listeners.delete(fn);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function vgaiParameters(story: ComposedProjectStory): Record<string, unknown> | null {
|
|
59
|
+
const value = story.parameters['vgai'];
|
|
60
|
+
return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Return the project's composed portable stories associated with `rootId`.
|
|
64
|
+
* This is the canonical React design-time source consumed by the main world
|
|
65
|
+
* viewport and hierarchy. `defaultStory` may be declared once
|
|
66
|
+
* at CSF meta level; `default: true` is accepted story-by-story. */
|
|
67
|
+
export function getRootPreviewStories(rootId: string): RootPreviewStory[] {
|
|
68
|
+
const out: RootPreviewStory[] = [];
|
|
69
|
+
for (const module_ of _modules) {
|
|
70
|
+
if (!module_.ok) continue;
|
|
71
|
+
for (const story of module_.stories) {
|
|
72
|
+
const vgai = vgaiParameters(story);
|
|
73
|
+
if (!vgai) continue;
|
|
74
|
+
const associatedRoot =
|
|
75
|
+
typeof vgai['root'] === 'string'
|
|
76
|
+
? vgai['root']
|
|
77
|
+
: typeof vgai['world'] === 'string'
|
|
78
|
+
? vgai['world']
|
|
79
|
+
: null;
|
|
80
|
+
if (associatedRoot !== rootId) continue;
|
|
81
|
+
const defaultStory = typeof vgai['defaultStory'] === 'string' ? vgai['defaultStory'] : null;
|
|
82
|
+
out.push({
|
|
83
|
+
...story,
|
|
84
|
+
modulePath: module_.modulePath,
|
|
85
|
+
rootId,
|
|
86
|
+
isDefault: vgai['default'] === true || defaultStory === story.name,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Deterministic stopped-mode preview: explicit default first, otherwise the
|
|
94
|
+
* first story in discovery/export order (the same order the hierarchy
|
|
95
|
+
* presents). */
|
|
96
|
+
export function getDefaultRootPreviewStory(rootId: string): RootPreviewStory | null {
|
|
97
|
+
const stories = getRootPreviewStories(rootId);
|
|
98
|
+
return stories.find((story) => story.isDefault) ?? stories[0] ?? null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function publish(next: ProjectStoryModule[]): void {
|
|
102
|
+
_modules = next;
|
|
103
|
+
for (const fn of _listeners) fn();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Re-run the whole discovery + load + compose pass. Never throws: a broken
|
|
108
|
+
* module (import failure, or a `composeProjectStories` failure) becomes an
|
|
109
|
+
* `{ ok: false, error }` entry naming the module, and every other module
|
|
110
|
+
* still loads — the same "one bad file never takes the rest down" physics
|
|
111
|
+
* `refreshProjectTools` uses.
|
|
112
|
+
*
|
|
113
|
+
* Applies the project's `.storybook/preview.ts(x)` annotations (if the
|
|
114
|
+
* project has one — `loadProjectPreviewAnnotations`) via
|
|
115
|
+
* `ensureProjectAnnotations` before composing anything, exactly once per
|
|
116
|
+
* session. `explicitPreviewAnnotations` is a test/caller override — pass it
|
|
117
|
+
* to skip the `/@fs/` discovery and thread a fixture's annotations directly.
|
|
118
|
+
*/
|
|
119
|
+
export async function refreshProjectStories(
|
|
120
|
+
project: StoryDiscoveryProjectLike | null,
|
|
121
|
+
explicitPreviewAnnotations?: unknown,
|
|
122
|
+
): Promise<void> {
|
|
123
|
+
const previewAnnotations =
|
|
124
|
+
explicitPreviewAnnotations ?? (await loadProjectPreviewAnnotations(project));
|
|
125
|
+
ensureProjectAnnotations(previewAnnotations);
|
|
126
|
+
|
|
127
|
+
const discovered = await discoverProjectStories(project);
|
|
128
|
+
const next: ProjectStoryModule[] = [];
|
|
129
|
+
for (const { modulePath, load } of discovered) {
|
|
130
|
+
let mod: unknown;
|
|
131
|
+
try {
|
|
132
|
+
mod = await load();
|
|
133
|
+
} catch (err) {
|
|
134
|
+
next.push({
|
|
135
|
+
modulePath,
|
|
136
|
+
ok: false,
|
|
137
|
+
error: `[stories] failed to load ${modulePath} — ${String(err instanceof Error ? err.message : err)}`,
|
|
138
|
+
});
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const result = composeProjectStories(modulePath, mod);
|
|
142
|
+
if (result.ok) next.push({ modulePath, ok: true, stories: result.stories });
|
|
143
|
+
else next.push({ modulePath, ok: false, error: result.error });
|
|
144
|
+
}
|
|
145
|
+
publish(next);
|
|
146
|
+
}
|