@volter/editor-core 0.5.57
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/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { ToolObject3DGesture, ToolObject3DPointerEvent } from '@volter/editor-sdk/contributions';
|
|
2
|
+
|
|
3
|
+
export interface Object3DGestureControllerOptions {
|
|
4
|
+
readonly begin: (event: ToolObject3DPointerEvent) => ToolObject3DGesture | null;
|
|
5
|
+
readonly persist: (label?: string) => Promise<void>;
|
|
6
|
+
readonly reportError: (error: unknown) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Exactly one project gesture at a time; every terminal path is explicit. */
|
|
10
|
+
export class Object3DGestureController {
|
|
11
|
+
private active: { pointerId: number; gesture: ToolObject3DGesture } | null = null;
|
|
12
|
+
private settling = false;
|
|
13
|
+
private readonly idleWaiters = new Set<() => void>();
|
|
14
|
+
|
|
15
|
+
constructor(private readonly options: Object3DGestureControllerOptions) {}
|
|
16
|
+
|
|
17
|
+
begin(event: ToolObject3DPointerEvent): boolean {
|
|
18
|
+
if (this.active || this.settling) return false;
|
|
19
|
+
try {
|
|
20
|
+
const gesture = this.options.begin(event);
|
|
21
|
+
if (!gesture) return false;
|
|
22
|
+
this.active = { pointerId: event.pointerId, gesture };
|
|
23
|
+
return true;
|
|
24
|
+
} catch (error) {
|
|
25
|
+
this.options.reportError(error);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
update(event: ToolObject3DPointerEvent): void {
|
|
31
|
+
if (!this.active || this.active.pointerId !== event.pointerId) return;
|
|
32
|
+
try {
|
|
33
|
+
this.active.gesture.update(event);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
void this.cancelWithError(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async commit(event: ToolObject3DPointerEvent): Promise<boolean> {
|
|
40
|
+
const active = this.take(event.pointerId);
|
|
41
|
+
if (!active) return false;
|
|
42
|
+
this.settling = true;
|
|
43
|
+
try {
|
|
44
|
+
await active.commit(event);
|
|
45
|
+
await this.options.persist(active.label);
|
|
46
|
+
return true;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
try {
|
|
49
|
+
await active.cancel();
|
|
50
|
+
} catch (cancelError) {
|
|
51
|
+
this.options.reportError({ operationError: error, rollbackError: cancelError });
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
this.options.reportError(error);
|
|
55
|
+
return false;
|
|
56
|
+
} finally {
|
|
57
|
+
this.settling = false;
|
|
58
|
+
for (const resolve of this.idleWaiters) resolve();
|
|
59
|
+
this.idleWaiters.clear();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async cancel(pointerId?: number): Promise<boolean> {
|
|
64
|
+
const active = this.take(pointerId);
|
|
65
|
+
if (!active) return false;
|
|
66
|
+
this.settling = true;
|
|
67
|
+
try {
|
|
68
|
+
await active.cancel();
|
|
69
|
+
return true;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
this.options.reportError(error);
|
|
72
|
+
return false;
|
|
73
|
+
} finally {
|
|
74
|
+
this.settling = false;
|
|
75
|
+
for (const resolve of this.idleWaiters) resolve();
|
|
76
|
+
this.idleWaiters.clear();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** A source handoff waits for persistence/rollback, including pointer-up work. */
|
|
81
|
+
async settle(): Promise<void> {
|
|
82
|
+
if (this.active) await this.cancel();
|
|
83
|
+
if (this.settling) await new Promise<void>((resolve) => this.idleWaiters.add(resolve));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
hasActiveGesture(): boolean {
|
|
87
|
+
return this.active !== null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private take(pointerId?: number): ToolObject3DGesture | null {
|
|
91
|
+
if (!this.active || (pointerId !== undefined && this.active.pointerId !== pointerId))
|
|
92
|
+
return null;
|
|
93
|
+
const gesture = this.active.gesture;
|
|
94
|
+
this.active = null;
|
|
95
|
+
return gesture;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private async cancelWithError(error: unknown): Promise<void> {
|
|
99
|
+
const active = this.take();
|
|
100
|
+
if (!active) return;
|
|
101
|
+
this.settling = true;
|
|
102
|
+
try {
|
|
103
|
+
await active.cancel();
|
|
104
|
+
this.options.reportError(error);
|
|
105
|
+
} catch (rollbackError) {
|
|
106
|
+
this.options.reportError({ operationError: error, rollbackError });
|
|
107
|
+
} finally {
|
|
108
|
+
this.settling = false;
|
|
109
|
+
for (const resolve of this.idleWaiters) resolve();
|
|
110
|
+
this.idleWaiters.clear();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONE resolver for "which authoring adapter do the shared panels drive?" —
|
|
3
|
+
* the Hierarchy and the Inspector must never disagree, and before this module
|
|
4
|
+
* they each open-coded the same expression.
|
|
5
|
+
*
|
|
6
|
+
* ## The defect this exists for (audit A1/A3, 2026-08-01) — and its MEASURED cause
|
|
7
|
+
*
|
|
8
|
+
* Symptom: every pixi ingest (the in-tree canvas fixtures, and
|
|
9
|
+
* the synthetic `ingest-pixi` manifest fixtures) mounted, captured and drew,
|
|
10
|
+
* `getAuthoringOverride()` held a healthy `PixiAuthoringAdapter` with
|
|
11
|
+
* `{transform, inspectorFields, persist}` all true — and the Hierarchy still
|
|
12
|
+
* rendered "No authoring adapter" while the Inspector took its
|
|
13
|
+
* nothing-to-show branch. The three route (the `games-fps` fixture) bound fine in the same session
|
|
14
|
+
* shape.
|
|
15
|
+
*
|
|
16
|
+
* The audit's hypothesis was adapter RESOLUTION: that the active workspace
|
|
17
|
+
* document's adapter shadowed the ingest override at `Inspector.tsx`'s
|
|
18
|
+
* `documentSelection?.adapter ?? getActiveAuthoring(store)`. Reproduced live on
|
|
19
|
+
* a single-`ingest-pixi`-root project and measured: `activeWorkspaceDocument
|
|
20
|
+
* Selection()` is `null`, the only open document is `workspace:game`, and the
|
|
21
|
+
* override is already correct at the moment the panels are showing the wrong
|
|
22
|
+
* thing. Resolution was never wrong. **It was a stale render**: the override
|
|
23
|
+
* slot is module state with no change notification, and the panels only
|
|
24
|
+
* re-rendered because ingest entry ALSO calls `setActiveViewportTab`, which in
|
|
25
|
+
* a Three-rooted project activates a different center document and the
|
|
26
|
+
* workspace registry's `notifyChanged()` re-rendered them incidentally. With no
|
|
27
|
+
* Three root there is one center document, that activation is a no-op, and the
|
|
28
|
+
* incidental notification never happens.
|
|
29
|
+
*
|
|
30
|
+
* The fix is therefore in `active-adapter.ts` (the slot notifies) plus the
|
|
31
|
+
* subscription the panels take out beside this resolver. This module exists so
|
|
32
|
+
* the two panels share ONE expression and one subscription set instead of two
|
|
33
|
+
* copies that can drift apart again.
|
|
34
|
+
*
|
|
35
|
+
* ## Why the resolution ORDER is unchanged
|
|
36
|
+
*
|
|
37
|
+
* An earlier revision of this fix also made an ingest override outrank a
|
|
38
|
+
* document-published adapter — the audit's hypothesis, kept "just in case". It
|
|
39
|
+
* is deliberately NOT here: it was never observed (measured null document
|
|
40
|
+
* selection in the reproduction above), and reaching `isIngestActive` from a
|
|
41
|
+
* module both shared panels import drags `ingest/mount-ingest-root.ts`'s whole transitive
|
|
42
|
+
* graph — the pixi stack and the engine renderer setup — into the
|
|
43
|
+
* Hierarchy's module graph, which broke six unit suites outright on a
|
|
44
|
+
* `URL.createObjectURL` that does not exist in the node test environment. A
|
|
45
|
+
* behavior change nobody could demonstrate is not worth a dependency edge that
|
|
46
|
+
* heavy. If document shadowing is ever actually observed, it should be fixed
|
|
47
|
+
* where the document's provider is registered (`world-documents.tsx`), which
|
|
48
|
+
* is the layer that knows a foreign session is live.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import type { AdapterSurface, AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
52
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
53
|
+
import {
|
|
54
|
+
activeWorkspaceDocument,
|
|
55
|
+
activeWorkspaceDocumentSelection,
|
|
56
|
+
type WorkspaceDocumentSelection,
|
|
57
|
+
} from '../workspace-document-registry';
|
|
58
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
59
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
60
|
+
|
|
61
|
+
export interface PanelAuthoringBinding {
|
|
62
|
+
/** The adapter the Hierarchy/Inspector must drive. */
|
|
63
|
+
readonly adapter: AuthoringAdapter;
|
|
64
|
+
/** Render substrate owned by the active authored document. `null` for
|
|
65
|
+
* composition/reference documents that do not focus one root surface. */
|
|
66
|
+
readonly surface: AdapterSurface | null;
|
|
67
|
+
/** The active document's selection context, when it publishes one. */
|
|
68
|
+
readonly documentSelection: WorkspaceDocumentSelection | null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* An authored root document projects only the root it is showing. The Game
|
|
73
|
+
* document intentionally falls through to the full composite: composition is
|
|
74
|
+
* its subject, while a Scene/world document's subject is one root.
|
|
75
|
+
*
|
|
76
|
+
* `world` documents carry their manifest root id as provenance. The pinned
|
|
77
|
+
* Three Scene document predates per-root document ids, so its focused child is
|
|
78
|
+
* the one live Three adapter that honestly reports transform authoring.
|
|
79
|
+
*/
|
|
80
|
+
function adapterSurface(kind: string): AdapterSurface | null {
|
|
81
|
+
return kind === 'three' || kind === 'canvas' || kind === 'dom' ? kind : null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function rootDocumentBinding(
|
|
85
|
+
active: AuthoringAdapter,
|
|
86
|
+
): { adapter: AuthoringAdapter; surface: AdapterSurface } | null {
|
|
87
|
+
if (!(active instanceof CompositeAuthoringAdapter)) return null;
|
|
88
|
+
const document = activeWorkspaceDocument()?.descriptor;
|
|
89
|
+
if (!document) return null;
|
|
90
|
+
|
|
91
|
+
const children = active.childAdapters();
|
|
92
|
+
if (document.kind === 'world') {
|
|
93
|
+
const rootId = document.provenance?.rootId;
|
|
94
|
+
const child = rootId ? children.find((candidate) => candidate.worldId === rootId) : undefined;
|
|
95
|
+
const surface = child ? adapterSurface(child.kind) : null;
|
|
96
|
+
return child && surface ? { adapter: child.adapter, surface } : null;
|
|
97
|
+
}
|
|
98
|
+
if (document.kind === 'scene') {
|
|
99
|
+
const child = children.find(
|
|
100
|
+
(candidate) => candidate.kind === 'three' && candidate.adapter.capabilities.transform,
|
|
101
|
+
);
|
|
102
|
+
if (!child) return null;
|
|
103
|
+
return {
|
|
104
|
+
adapter: active.projectedDocumentAdapter(child.worldId) ?? child.adapter,
|
|
105
|
+
surface: 'three',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function resolvePanelAuthoring(store: EditorShellStore): PanelAuthoringBinding {
|
|
112
|
+
const documentSelection = activeWorkspaceDocumentSelection();
|
|
113
|
+
const active = getActiveAuthoring(store);
|
|
114
|
+
const rootBinding = rootDocumentBinding(active);
|
|
115
|
+
const documentKind = activeWorkspaceDocument()?.descriptor.kind;
|
|
116
|
+
return {
|
|
117
|
+
adapter: documentSelection?.adapter ?? rootBinding?.adapter ?? active,
|
|
118
|
+
surface: documentKind === 'story' ? 'dom' : (rootBinding?.surface ?? null),
|
|
119
|
+
documentSelection,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { faCubesStacked } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Checkbox,
|
|
5
|
+
Dialog,
|
|
6
|
+
DialogBody,
|
|
7
|
+
DialogFooter,
|
|
8
|
+
DialogHeader,
|
|
9
|
+
FieldRow,
|
|
10
|
+
Text,
|
|
11
|
+
themeVars,
|
|
12
|
+
} from '@volter/editor-sdk/widgets';
|
|
13
|
+
import type {
|
|
14
|
+
AuthoringAdapter,
|
|
15
|
+
ComponentInstanceOverride,
|
|
16
|
+
EditorNode,
|
|
17
|
+
} from '@volter/editor-project/adapter';
|
|
18
|
+
import { useEffect, useState } from 'react';
|
|
19
|
+
import { createHmrRegistrationGroup } from '../hmr-registration-group';
|
|
20
|
+
import { GROUP_SECTION_ORDER, type InspectionSection } from '../inspection/model';
|
|
21
|
+
import { registerInspectorSections } from '../inspector-section-registry';
|
|
22
|
+
import { showTransientHint } from '../transient-hint';
|
|
23
|
+
import {
|
|
24
|
+
applyAuthoringInstanceToComponent,
|
|
25
|
+
openAuthoringComponent,
|
|
26
|
+
revertAuthoringInstance,
|
|
27
|
+
} from './consumer-actions';
|
|
28
|
+
import { matchesPrefabInstance, prefabInstanceStoryAction } from './prefab-instance-section-model';
|
|
29
|
+
|
|
30
|
+
function display(value: unknown): string {
|
|
31
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function PrefabInstanceSection({ adapter, nodeId }: { adapter: AuthoringAdapter; nodeId: string }) {
|
|
35
|
+
const description = adapter.instances?.describe(nodeId) ?? null;
|
|
36
|
+
const [selected, setSelected] = useState<Set<string>>(new Set());
|
|
37
|
+
const [applyTarget, setApplyTarget] = useState<ComponentInstanceOverride | null>(null);
|
|
38
|
+
const [busy, setBusy] = useState(false);
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
setSelected(new Set());
|
|
42
|
+
setApplyTarget(null);
|
|
43
|
+
}, [nodeId]);
|
|
44
|
+
|
|
45
|
+
if (!description) return null;
|
|
46
|
+
const storyAction = prefabInstanceStoryAction(adapter, nodeId);
|
|
47
|
+
|
|
48
|
+
const toggle = (path: string, checked: boolean): void => {
|
|
49
|
+
setSelected((current) => {
|
|
50
|
+
const next = new Set(current);
|
|
51
|
+
if (checked) next.add(path);
|
|
52
|
+
else next.delete(path);
|
|
53
|
+
return next;
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const revertSelected = async (): Promise<void> => {
|
|
58
|
+
if (selected.size === 0 || !adapter.instances) return;
|
|
59
|
+
setBusy(true);
|
|
60
|
+
try {
|
|
61
|
+
await revertAuthoringInstance(adapter, nodeId, [...selected]);
|
|
62
|
+
setSelected(new Set());
|
|
63
|
+
showTransientHint(
|
|
64
|
+
`Reverted ${selected.size} prefab override${selected.size === 1 ? '' : 's'}.`,
|
|
65
|
+
);
|
|
66
|
+
} finally {
|
|
67
|
+
setBusy(false);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const apply = async (): Promise<void> => {
|
|
72
|
+
if (!applyTarget || !adapter.instances) return;
|
|
73
|
+
setBusy(true);
|
|
74
|
+
try {
|
|
75
|
+
const result = await applyAuthoringInstanceToComponent(adapter, nodeId, applyTarget.path);
|
|
76
|
+
showTransientHint(result.message);
|
|
77
|
+
if (result.changed) setApplyTarget(null);
|
|
78
|
+
} finally {
|
|
79
|
+
setBusy(false);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div style={{ display: 'grid', gap: 10 }} data-testid="prefab-instance-overrides">
|
|
85
|
+
<FieldRow label="Prefab">
|
|
86
|
+
<Text>{description.componentName}</Text>
|
|
87
|
+
</FieldRow>
|
|
88
|
+
<div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
|
|
89
|
+
<Button
|
|
90
|
+
size="compact"
|
|
91
|
+
disabled={!adapter.instances?.openComponent}
|
|
92
|
+
onClick={() => openAuthoringComponent(adapter, nodeId)}
|
|
93
|
+
>
|
|
94
|
+
Open Component
|
|
95
|
+
</Button>
|
|
96
|
+
<Button
|
|
97
|
+
size="compact"
|
|
98
|
+
disabled={!storyAction}
|
|
99
|
+
title={
|
|
100
|
+
storyAction ? `Open ${storyAction.story.label}` : 'This prefab has no composed story.'
|
|
101
|
+
}
|
|
102
|
+
onClick={() => storyAction?.open()}
|
|
103
|
+
>
|
|
104
|
+
Open Story
|
|
105
|
+
</Button>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div>
|
|
109
|
+
<Text tone="muted">Overrides ({description.overrides.length})</Text>
|
|
110
|
+
{description.overrides.length === 0 ? (
|
|
111
|
+
<div style={{ paddingTop: 6 }}>
|
|
112
|
+
<Text tone="muted">
|
|
113
|
+
Using component defaults. Change a property above and it will be listed here as an
|
|
114
|
+
override you can apply or revert.
|
|
115
|
+
</Text>
|
|
116
|
+
</div>
|
|
117
|
+
) : (
|
|
118
|
+
<div style={{ display: 'grid', gap: 4, paddingTop: 6 }}>
|
|
119
|
+
{description.overrides.map((override) => (
|
|
120
|
+
<div
|
|
121
|
+
key={override.path}
|
|
122
|
+
style={{
|
|
123
|
+
border: `1px solid ${themeVars.boundary.default}`,
|
|
124
|
+
borderRadius: 5,
|
|
125
|
+
display: 'grid',
|
|
126
|
+
gap: 4,
|
|
127
|
+
padding: 6,
|
|
128
|
+
}}
|
|
129
|
+
>
|
|
130
|
+
<label style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
131
|
+
<Checkbox
|
|
132
|
+
checked={selected.has(override.path)}
|
|
133
|
+
onChange={(event) => toggle(override.path, event.target.checked)}
|
|
134
|
+
/>
|
|
135
|
+
<Text>{override.label}</Text>
|
|
136
|
+
<Text tone="muted">{display(override.value)}</Text>
|
|
137
|
+
</label>
|
|
138
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 6, paddingLeft: 22 }}>
|
|
139
|
+
<Text tone="muted">default: {override.defaultText ?? 'component fallback'}</Text>
|
|
140
|
+
<Button
|
|
141
|
+
size="compact"
|
|
142
|
+
disabled={!override.canApplyToComponent || busy}
|
|
143
|
+
title={override.applyUnavailableReason}
|
|
144
|
+
onClick={() => setApplyTarget(override)}
|
|
145
|
+
>
|
|
146
|
+
Apply…
|
|
147
|
+
</Button>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
))}
|
|
151
|
+
</div>
|
|
152
|
+
)}
|
|
153
|
+
</div>
|
|
154
|
+
{description.overrides.length > 0 ? (
|
|
155
|
+
<Button
|
|
156
|
+
size="compact"
|
|
157
|
+
disabled={selected.size === 0 || busy}
|
|
158
|
+
title={selected.size === 0 ? 'Tick an override above to select it first.' : undefined}
|
|
159
|
+
onClick={() => void revertSelected()}
|
|
160
|
+
>
|
|
161
|
+
Revert Selected
|
|
162
|
+
</Button>
|
|
163
|
+
) : null}
|
|
164
|
+
|
|
165
|
+
{applyTarget ? (
|
|
166
|
+
<Dialog
|
|
167
|
+
labelledBy="apply-prefab-default-title"
|
|
168
|
+
onDismiss={() => !busy && setApplyTarget(null)}
|
|
169
|
+
>
|
|
170
|
+
<DialogHeader
|
|
171
|
+
titleId="apply-prefab-default-title"
|
|
172
|
+
title={`Apply “${applyTarget.label} = ${display(applyTarget.value)}” to ${description.componentName}?`}
|
|
173
|
+
/>
|
|
174
|
+
<DialogBody>
|
|
175
|
+
<div style={{ display: 'grid', gap: 8 }}>
|
|
176
|
+
<Text>
|
|
177
|
+
This changes the default used by {applyTarget.affectedInstanceCount} placed instance
|
|
178
|
+
{applyTarget.affectedInstanceCount === 1 ? '' : 's'}.
|
|
179
|
+
</Text>
|
|
180
|
+
<FieldRow label="Current default">
|
|
181
|
+
<Text tone="muted">{applyTarget.defaultText ?? 'component fallback'}</Text>
|
|
182
|
+
</FieldRow>
|
|
183
|
+
<FieldRow label="New default">
|
|
184
|
+
<Text>{display(applyTarget.value)}</Text>
|
|
185
|
+
</FieldRow>
|
|
186
|
+
</div>
|
|
187
|
+
</DialogBody>
|
|
188
|
+
<DialogFooter>
|
|
189
|
+
<Button disabled={busy} onClick={() => setApplyTarget(null)}>
|
|
190
|
+
Cancel
|
|
191
|
+
</Button>
|
|
192
|
+
<Button disabled={busy} onClick={() => void apply()}>
|
|
193
|
+
Apply
|
|
194
|
+
</Button>
|
|
195
|
+
</DialogFooter>
|
|
196
|
+
</Dialog>
|
|
197
|
+
) : null}
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function sections(
|
|
203
|
+
node: EditorNode | null,
|
|
204
|
+
adapter: AuthoringAdapter,
|
|
205
|
+
): readonly InspectionSection[] {
|
|
206
|
+
if (!node || !matchesPrefabInstance(node, adapter)) return [];
|
|
207
|
+
const description = adapter.instances?.describe(node.id);
|
|
208
|
+
if (!description) return [];
|
|
209
|
+
return [
|
|
210
|
+
{
|
|
211
|
+
id: 'prefab-instance',
|
|
212
|
+
title: 'Prefab Instance',
|
|
213
|
+
icon: faCubesStacked,
|
|
214
|
+
order: GROUP_SECTION_ORDER + 125,
|
|
215
|
+
body: {
|
|
216
|
+
kind: 'custom',
|
|
217
|
+
render: () => <PrefabInstanceSection adapter={adapter} nodeId={node.id} />,
|
|
218
|
+
data: {
|
|
219
|
+
component: description.componentName,
|
|
220
|
+
sourcePath: description.sourcePath ?? null,
|
|
221
|
+
overrideCount: description.overrides.length,
|
|
222
|
+
overrides: description.overrides.map((override) => ({
|
|
223
|
+
path: override.path,
|
|
224
|
+
value: override.value,
|
|
225
|
+
default: override.defaultText ?? null,
|
|
226
|
+
canApplyToComponent: override.canApplyToComponent,
|
|
227
|
+
})),
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const registrationGroup = createHmrRegistrationGroup(import.meta.hot, 'prefab-instance-inspector');
|
|
235
|
+
registrationGroup.ensure((track) => {
|
|
236
|
+
track(registerInspectorSections({ match: matchesPrefabInstance, sections }));
|
|
237
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two decisions the Prefab Instance inspector section makes before it
|
|
3
|
+
* renders anything: does this selection HAVE a prefab-instance description, and
|
|
4
|
+
* does it have a story of its own to open.
|
|
5
|
+
*
|
|
6
|
+
* They live here rather than inside the section because the section is a React
|
|
7
|
+
* component in a repo whose unit tests run headless (`environment: 'node'`) —
|
|
8
|
+
* the same reason `components/inspector-stories-gating.ts` exists. Both are
|
|
9
|
+
* pure functions of (adapter, node).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { AuthoringAdapter, EditorNode, StoryRef } from '@volter/editor-project/adapter';
|
|
13
|
+
import { resolveNodeScopedStories } from '../components/inspector-stories-gating';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Whether `node` is a component instance this adapter can describe.
|
|
17
|
+
*
|
|
18
|
+
* Both halves are load-bearing. `adapter.instances` is OPTIONAL, so an adapter
|
|
19
|
+
* that has no instances provider at all must not match — the section would then
|
|
20
|
+
* register for every selection in that world and render nothing, an empty
|
|
21
|
+
* registered section. (`undefined !== null` is `true`: the absent provider
|
|
22
|
+
* cannot be tested by comparing its answer.)
|
|
23
|
+
*/
|
|
24
|
+
export function matchesPrefabInstance(node: EditorNode | null, adapter: AuthoringAdapter): boolean {
|
|
25
|
+
const instances = adapter.instances;
|
|
26
|
+
if (!node || !instances) return false;
|
|
27
|
+
return instances.describe(node.id) !== null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The section's "Open Story" affordance, bound to the node's own first story. */
|
|
31
|
+
export interface PrefabInstanceStoryAction {
|
|
32
|
+
readonly story: StoryRef;
|
|
33
|
+
/** Put the node's component into that story (opens its story document). */
|
|
34
|
+
readonly open: () => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The story this prefab instance can open, or `null` when it has none.
|
|
39
|
+
*
|
|
40
|
+
* Routed through {@link resolveNodeScopedStories} rather than `adapter.stories`
|
|
41
|
+
* because a world-level provider answers the same rows for EVERY node: on an
|
|
42
|
+
* ingest root those rows are the game's own scenes, and applying one navigates
|
|
43
|
+
* the whole game from inside a per-node section. When only a world-level
|
|
44
|
+
* provider exists this section offers no story action at all — the honest
|
|
45
|
+
* absence, since the node genuinely has no composed story.
|
|
46
|
+
*/
|
|
47
|
+
export function prefabInstanceStoryAction(
|
|
48
|
+
adapter: AuthoringAdapter,
|
|
49
|
+
nodeId: string,
|
|
50
|
+
): PrefabInstanceStoryAction | null {
|
|
51
|
+
const provider = resolveNodeScopedStories(adapter, nodeId);
|
|
52
|
+
const story = provider?.storiesFor(nodeId)[0];
|
|
53
|
+
if (!provider || !story) return null;
|
|
54
|
+
return { story, open: () => provider.apply(nodeId, story.id) };
|
|
55
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/** The project owns its authoring session. Scene tabs attach renderers to it;
|
|
2
|
+
* closing a viewport must not remove the other scenes or component canvases. */
|
|
3
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
4
|
+
import { runProjectReady } from '../project-ready';
|
|
5
|
+
import {
|
|
6
|
+
availableWorkspaceDocuments,
|
|
7
|
+
requestAvailableWorkspaceDocument,
|
|
8
|
+
} from '../workspace-available-documents';
|
|
9
|
+
import { activeWorkspaceDocumentId, openWorkspaceDocuments } from '../workspace-document-registry';
|
|
10
|
+
import type { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
11
|
+
import {
|
|
12
|
+
bindEditModeRebuildOwner,
|
|
13
|
+
exitEditModeAuthoring,
|
|
14
|
+
installEditModeAuthoringForProject,
|
|
15
|
+
} from './edit-mode-authoring';
|
|
16
|
+
|
|
17
|
+
type Stage = (composite: CompositeAuthoringAdapter) => Promise<void>;
|
|
18
|
+
class ProjectAuthoringSession {
|
|
19
|
+
private references = 0;
|
|
20
|
+
private disposed = false;
|
|
21
|
+
private composite: CompositeAuthoringAdapter | undefined;
|
|
22
|
+
private disposeDocuments: (() => void) | undefined;
|
|
23
|
+
private stages = new Set<Stage>();
|
|
24
|
+
private tail: Promise<void> = Promise.resolve();
|
|
25
|
+
private unbind: () => void;
|
|
26
|
+
readonly ready: Promise<void>;
|
|
27
|
+
|
|
28
|
+
constructor(private readonly store: EditorShellStore) {
|
|
29
|
+
this.unbind = bindEditModeRebuildOwner(() => this.rebuild());
|
|
30
|
+
this.ready = this.rebuild();
|
|
31
|
+
}
|
|
32
|
+
retain(): () => void {
|
|
33
|
+
this.references++;
|
|
34
|
+
return () => {
|
|
35
|
+
if (--this.references > 0) return;
|
|
36
|
+
this.disposed = true;
|
|
37
|
+
this.unbind();
|
|
38
|
+
this.disposeDocuments?.();
|
|
39
|
+
exitEditModeAuthoring(this.composite);
|
|
40
|
+
sessions.delete(this.store);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
attach(stage: Stage): { ready: Promise<void>; dispose: () => void } {
|
|
44
|
+
const release = this.retain();
|
|
45
|
+
this.stages.add(stage);
|
|
46
|
+
// A stage attached during a rebuild is mounted by that rebuild. A later
|
|
47
|
+
// stage attaches to the already installed project without reinstalling it.
|
|
48
|
+
const ready = this.composite ? stage(this.composite) : this.tail;
|
|
49
|
+
return {
|
|
50
|
+
ready,
|
|
51
|
+
dispose: () => {
|
|
52
|
+
this.stages.delete(stage);
|
|
53
|
+
release();
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
private rebuild(): Promise<void> {
|
|
58
|
+
const run = this.tail.then(async () => {
|
|
59
|
+
if (this.disposed) return;
|
|
60
|
+
const active = activeWorkspaceDocumentId();
|
|
61
|
+
const available = new Set(availableWorkspaceDocuments().map((entry) => entry.descriptor.id));
|
|
62
|
+
const reopen = this.composite
|
|
63
|
+
? openWorkspaceDocuments()
|
|
64
|
+
.map((document) => document.descriptor.id)
|
|
65
|
+
.filter((id) => available.has(id))
|
|
66
|
+
: [];
|
|
67
|
+
this.disposeDocuments?.();
|
|
68
|
+
this.disposeDocuments = undefined;
|
|
69
|
+
exitEditModeAuthoring(this.composite);
|
|
70
|
+
this.composite = undefined;
|
|
71
|
+
const composite = await installEditModeAuthoringForProject(this.store);
|
|
72
|
+
if (this.disposed) {
|
|
73
|
+
exitEditModeAuthoring(composite);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const { installRootDocuments } = await import('../components/world-documents');
|
|
77
|
+
if (this.disposed) {
|
|
78
|
+
exitEditModeAuthoring(composite);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.composite = composite;
|
|
82
|
+
this.disposeDocuments = installRootDocuments(this.store, composite);
|
|
83
|
+
for (const id of reopen) requestAvailableWorkspaceDocument(id, id === active);
|
|
84
|
+
await Promise.all([...this.stages].map((stage) => stage(composite)));
|
|
85
|
+
});
|
|
86
|
+
this.tail = run.catch(() => undefined);
|
|
87
|
+
return run;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const sessions = new Map<EditorShellStore, ProjectAuthoringSession>();
|
|
91
|
+
function sessionFor(store: EditorShellStore): ProjectAuthoringSession {
|
|
92
|
+
let session = sessions.get(store);
|
|
93
|
+
if (!session) {
|
|
94
|
+
session = new ProjectAuthoringSession(store);
|
|
95
|
+
sessions.set(store, session);
|
|
96
|
+
}
|
|
97
|
+
return session;
|
|
98
|
+
}
|
|
99
|
+
export function retainProjectAuthoringSession(store: EditorShellStore) {
|
|
100
|
+
const session = sessionFor(store);
|
|
101
|
+
return { ready: session.ready.then(() => runProjectReady()), dispose: session.retain() };
|
|
102
|
+
}
|
|
103
|
+
export function attachProjectAuthoringStage(store: EditorShellStore, stage: Stage) {
|
|
104
|
+
return sessionFor(store).attach(stage);
|
|
105
|
+
}
|