@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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H3 wiring — the instance row's two source actions, registered through the
|
|
3
|
+
* hierarchy contribution seam.
|
|
4
|
+
*
|
|
5
|
+
* This is the "adapter-module registration" half of the split
|
|
6
|
+
* `hierarchy-menu-registry.ts` describes: `GameHierarchy` stays contract-only
|
|
7
|
+
* and never learns that an R3F world has a callsite; THIS module is the one
|
|
8
|
+
* allowed to resolve the owning child adapter and probe it for source
|
|
9
|
+
* accessors. The sentences and the applicability rule are pure and live in
|
|
10
|
+
* `../instance-source-actions.ts`.
|
|
11
|
+
*
|
|
12
|
+
* ISOLATE IS DELIBERATELY ABSENT — see {@link enterInstanceRow}. The design
|
|
13
|
+
* record's "double-click = Isolate, reusing the catalog nodes' existing Isolate
|
|
14
|
+
* mount" is not reachable from a scene instance row, and faking it was
|
|
15
|
+
* explicitly out of scope.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
19
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
20
|
+
import { registerHierarchyMenuItems } from '../hierarchy-menu-registry';
|
|
21
|
+
import {
|
|
22
|
+
INSTANCE_SOURCE_LABELS,
|
|
23
|
+
type InstanceSourceLocator,
|
|
24
|
+
type InstanceSourceTarget,
|
|
25
|
+
instanceSourceTargets,
|
|
26
|
+
runInstanceSourceAction,
|
|
27
|
+
} from '../instance-source-actions';
|
|
28
|
+
import { showTransientHint } from '../transient-hint';
|
|
29
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
30
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
31
|
+
import { enterSelectionScope } from './selection-scope';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The adapter whose source accessors answer for `nodeId`. Ownership is asked
|
|
35
|
+
* of the composite (`ownerOf`/`childAdapters`, the same public T0 query
|
|
36
|
+
* `GameHierarchy`'s own gates use) rather than decoded from the id — a
|
|
37
|
+
* composite's routers would otherwise answer for a row their owning child
|
|
38
|
+
* knows nothing about.
|
|
39
|
+
*/
|
|
40
|
+
export function instanceSourceLocatorFor(
|
|
41
|
+
adapter: AuthoringAdapter,
|
|
42
|
+
nodeId: string,
|
|
43
|
+
): InstanceSourceLocator | null {
|
|
44
|
+
const owner =
|
|
45
|
+
adapter instanceof CompositeAuthoringAdapter
|
|
46
|
+
? (adapter.childAdapters().find((c) => c.worldId === adapter.ownerOf(nodeId))?.adapter ??
|
|
47
|
+
adapter)
|
|
48
|
+
: adapter;
|
|
49
|
+
const locator = owner as unknown as InstanceSourceLocator;
|
|
50
|
+
return typeof locator.sourceLocation === 'function' ||
|
|
51
|
+
typeof locator.definitionLocation === 'function'
|
|
52
|
+
? locator
|
|
53
|
+
: null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Run one target and SAY what happened — every path returns a sentence
|
|
57
|
+
* (copied / not in the index / clipboard refused), so no click is silent. */
|
|
58
|
+
function runAndReport(
|
|
59
|
+
locator: InstanceSourceLocator | null,
|
|
60
|
+
nodeId: string,
|
|
61
|
+
target: InstanceSourceTarget,
|
|
62
|
+
): void {
|
|
63
|
+
void runInstanceSourceAction(locator, nodeId, target).then(showTransientHint);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Double-click on an instance row.
|
|
68
|
+
*
|
|
69
|
+
* An instance row is already the native authoring subject; portable CSF
|
|
70
|
+
* selects complete design-time states and does not provide a second subtree
|
|
71
|
+
* isolation protocol. Double-click therefore ENTERS the instance's scope and
|
|
72
|
+
* falls back to its callsite when the row cannot be entered.
|
|
73
|
+
*
|
|
74
|
+
* That fallback is the COMMON case, not the corner one: `projectedChildren`
|
|
75
|
+
* collapses everything an instance rendered itself (same `authoringInstance`),
|
|
76
|
+
* so an instance row has children only when it contains a NESTED instance.
|
|
77
|
+
* Every other instance row is a hierarchy leaf, `enterSelectionScope` refuses
|
|
78
|
+
* it for having no children, and until now that double-click did nothing at
|
|
79
|
+
* all — the silent no-op this whole decision exists to kill.
|
|
80
|
+
*
|
|
81
|
+
* Rename is NOT in conflict: `Row`'s `onDoubleClick` already routes every
|
|
82
|
+
* `component`/`instance`/`boundary` row here BEFORE its rename branch, so an
|
|
83
|
+
* instance row has never started a rename on double-click; rename stays
|
|
84
|
+
* reachable on the context menu, where it is always offered for a non-group row.
|
|
85
|
+
*/
|
|
86
|
+
export function enterInstanceRow(adapter: AuthoringAdapter, nodeId: string): void {
|
|
87
|
+
if (enterSelectionScope(adapter, nodeId)) return;
|
|
88
|
+
runCallsite(adapter, nodeId);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function runCallsite(adapter: AuthoringAdapter, nodeId: string): void {
|
|
92
|
+
const node = adapter.hierarchy.node(nodeId);
|
|
93
|
+
const locator = instanceSourceLocatorFor(adapter, nodeId);
|
|
94
|
+
// Only a row that ADVERTISES a callsite falls through to the source action —
|
|
95
|
+
// a boundary/placeholder row with nothing to open keeps double-clicking to
|
|
96
|
+
// nothing, exactly as before, rather than raising a hint the user did not ask
|
|
97
|
+
// for by picking a source verb.
|
|
98
|
+
if (!instanceSourceTargets(node, locator, nodeId).includes('callsite')) return;
|
|
99
|
+
runAndReport(locator, nodeId, 'callsite');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let unregister: (() => void) | null = null;
|
|
103
|
+
|
|
104
|
+
/** Idempotent install of the two H3 items (see the register module). */
|
|
105
|
+
export function ensureInstanceSourceMenuRegistered(): void {
|
|
106
|
+
if (unregister) return;
|
|
107
|
+
unregister = registerHierarchyMenuItems(
|
|
108
|
+
({ nodeId, store }) => targetsFor(store, nodeId).length > 0,
|
|
109
|
+
({ nodeId, store }) => {
|
|
110
|
+
const adapter = getActiveAuthoring(store);
|
|
111
|
+
const locator = instanceSourceLocatorFor(adapter, nodeId);
|
|
112
|
+
return targetsFor(store, nodeId).map((target) => ({
|
|
113
|
+
label: INSTANCE_SOURCE_LABELS[target],
|
|
114
|
+
action: () => {
|
|
115
|
+
runAndReport(locator, nodeId, target);
|
|
116
|
+
},
|
|
117
|
+
}));
|
|
118
|
+
},
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function targetsFor(store: EditorShellStore, nodeId: string): InstanceSourceTarget[] {
|
|
123
|
+
const adapter = getActiveAuthoring(store);
|
|
124
|
+
return instanceSourceTargets(
|
|
125
|
+
adapter.hierarchy.node(nodeId),
|
|
126
|
+
instanceSourceLocatorFor(adapter, nodeId),
|
|
127
|
+
nodeId,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Test-only: drop the registration so a suite can reset the shared registry. */
|
|
132
|
+
export function __unregisterInstanceSourceMenuForTest(): void {
|
|
133
|
+
unregister?.();
|
|
134
|
+
unregister = null;
|
|
135
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered viewport picking (B4, D12) — "click anything you can see; topmost
|
|
3
|
+
* visible layer wins." Shell POLICY over the composite's public seams, kept a
|
|
4
|
+
* separate module (rather than living inline in `editor-viewport.ts`) so it
|
|
5
|
+
* stays lean AND unit-testable with plain fake adapters — no real DOM/canvas
|
|
6
|
+
* needed.
|
|
7
|
+
*
|
|
8
|
+
* This module speaks ONLY the public contract: `CompositeAuthoringAdapter
|
|
9
|
+
* .childAdapters()` (T0), the `AuthoringAdapter.pickable` provider (D12,
|
|
10
|
+
* `@volter/editor-project/adapter`), and `world-session-state.ts`'s session toggles. It never
|
|
11
|
+
* reaches into any one child adapter's own private, format-specific model (no
|
|
12
|
+
* concrete-world-shape vocabulary of any kind here) — `instanceof
|
|
13
|
+
* CompositeAuthoringAdapter` is the ONE sanctioned type check (that class's
|
|
14
|
+
* own doc comment blesses exactly this use, mirroring
|
|
15
|
+
* `authoring/first-party-inspector/is-first-party-selection.ts`'s identical
|
|
16
|
+
* precedent).
|
|
17
|
+
*
|
|
18
|
+
* Walk order: the composite's NON-threejs children (react/pixi design-time
|
|
19
|
+
* layers), topmost-first by (install-time) manifest zOrder — `stackOrder`
|
|
20
|
+
* sorts bottom-to-top, so `.reverse()` gives topmost-first while preserving
|
|
21
|
+
* its own tie-break rule. The Three world is appended LAST
|
|
22
|
+
* (canvas-bottom) regardless of its manifest zOrder — it always renders
|
|
23
|
+
* beneath every positioned design-time layer (`design-time-layers.ts`'s own
|
|
24
|
+
* doc comment: "the three canvas keeps its existing slot"), so it is
|
|
25
|
+
* correct for it to lose every pick to a layer that also claims the point.
|
|
26
|
+
*
|
|
27
|
+
* A layer that is eye-hidden or pick-locked (`world-session-state.ts`, B1) is
|
|
28
|
+
* skipped ENTIRELY — its `pickable.pick` is never even called. This is a
|
|
29
|
+
* SEPARATE mechanism from a layer's `interactive` toggle: an interactive
|
|
30
|
+
* layer's DOM has `pointer-events: auto`, so a real pointer event lands on the
|
|
31
|
+
* layer's own element and this walk (triggered only by the CANVAS's own
|
|
32
|
+
* `pointerup` listener) never runs at all for that event — mutually exclusive
|
|
33
|
+
* by construction, no code needed here for it.
|
|
34
|
+
*
|
|
35
|
+
* When the active adapter is NOT a composite (single-world project, or a
|
|
36
|
+
* non-composite override), this degrades to that one adapter's own
|
|
37
|
+
* `pickable.pick` (or `null` if it doesn't have one) — today's single-world
|
|
38
|
+
* behavior, unchanged.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
42
|
+
import { stackOrder } from '@volter/editor-project/adapter/root-stacking';
|
|
43
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
44
|
+
import { SCENE_DOCUMENT_ID } from '../workspace-document-ids';
|
|
45
|
+
import { activeWorkspaceDocumentId } from '../workspace-document-registry';
|
|
46
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
47
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
48
|
+
import { currentSelectionScopeId } from './selection-scope';
|
|
49
|
+
import { isRootHidden, isRootPickLocked } from './world-session-state';
|
|
50
|
+
|
|
51
|
+
export function resolveAdapterPick(
|
|
52
|
+
adapter: AuthoringAdapter,
|
|
53
|
+
clientX: number,
|
|
54
|
+
clientY: number,
|
|
55
|
+
intent: 'normal' | 'deep',
|
|
56
|
+
): string | null {
|
|
57
|
+
const raw = adapter.pickable?.pick(clientX, clientY) ?? null;
|
|
58
|
+
if (!raw) return null;
|
|
59
|
+
return (
|
|
60
|
+
adapter.selection?.resolve?.(raw, {
|
|
61
|
+
intent,
|
|
62
|
+
scopeId: currentSelectionScopeId(),
|
|
63
|
+
})?.id ?? raw
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function resolveAdapterCandidates(
|
|
68
|
+
adapter: AuthoringAdapter,
|
|
69
|
+
clientX: number,
|
|
70
|
+
clientY: number,
|
|
71
|
+
intent: 'normal' | 'deep',
|
|
72
|
+
): string[] {
|
|
73
|
+
const raw = adapter.pickable?.candidates?.(clientX, clientY) ?? [];
|
|
74
|
+
const resolved: string[] = [];
|
|
75
|
+
const seen = new Set<string>();
|
|
76
|
+
for (const id of raw) {
|
|
77
|
+
const candidate =
|
|
78
|
+
adapter.selection?.resolve?.(id, {
|
|
79
|
+
intent,
|
|
80
|
+
scopeId: currentSelectionScopeId(),
|
|
81
|
+
})?.id ?? id;
|
|
82
|
+
if (!seen.has(candidate)) {
|
|
83
|
+
seen.add(candidate);
|
|
84
|
+
resolved.push(candidate);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return resolved;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Topmost-first pick across every visible, pick-unlocked layer of the active
|
|
91
|
+
* (possibly composite) authoring adapter. Returns the winning node id, or
|
|
92
|
+
* `null` when nothing under `(clientX, clientY)` claims the point. */
|
|
93
|
+
export function pickTopmost(
|
|
94
|
+
store: EditorShellStore,
|
|
95
|
+
clientX: number,
|
|
96
|
+
clientY: number,
|
|
97
|
+
options: { intent?: 'normal' | 'deep' } = {},
|
|
98
|
+
): string | null {
|
|
99
|
+
const intent = options.intent ?? 'normal';
|
|
100
|
+
const active = getActiveAuthoring(store);
|
|
101
|
+
if (!(active instanceof CompositeAuthoringAdapter)) {
|
|
102
|
+
return resolveAdapterPick(active, clientX, clientY, intent);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const children = active.childAdapters();
|
|
106
|
+
// The Game document stays mounted warm while Scene is active. Its DOM rects
|
|
107
|
+
// therefore still exist even though it is not painted. Document ownership,
|
|
108
|
+
// not mount lifetime, decides which layers may claim the pointer.
|
|
109
|
+
const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
|
|
110
|
+
const layered = sceneDocumentActive ? [] : children.filter((c) => c.kind !== 'three');
|
|
111
|
+
const three = children.filter((c) => c.kind === 'three');
|
|
112
|
+
|
|
113
|
+
// `stackOrder` wants `{id, zOrder}` (`ClaimEntry`) — reuse `worldId` as its
|
|
114
|
+
// `id` (this walk has no separate id vocabulary of its own).
|
|
115
|
+
const layeredClaims = layered.map((c) => ({
|
|
116
|
+
id: c.worldId,
|
|
117
|
+
zOrder: c.zOrder,
|
|
118
|
+
worldId: c.worldId,
|
|
119
|
+
adapter: c.adapter,
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
// Topmost-first: `stackOrder` is bottom-to-top (ascending zOrder, ties by
|
|
123
|
+
// original array order) — `.reverse()` flips it without disturbing its own
|
|
124
|
+
// tie-break rule (a later-declared same-zOrder layer still wins the tie,
|
|
125
|
+
// now by being checked FIRST instead of sorting last).
|
|
126
|
+
const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
|
|
127
|
+
...stackOrder(layeredClaims).reverse(),
|
|
128
|
+
// The Three world paints/picks LAST — canvas-bottom, regardless
|
|
129
|
+
// of its own manifest zOrder (see module doc comment).
|
|
130
|
+
...three,
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
for (const { worldId, adapter } of order) {
|
|
134
|
+
if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
|
|
135
|
+
const hit = resolveAdapterPick(adapter, clientX, clientY, intent);
|
|
136
|
+
if (hit) return hit;
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Ordered overlap stack across the same visible layers as {@link pickTopmost}. */
|
|
142
|
+
export function pickCandidates(
|
|
143
|
+
store: EditorShellStore,
|
|
144
|
+
clientX: number,
|
|
145
|
+
clientY: number,
|
|
146
|
+
options: { intent?: 'normal' | 'deep'; adapter?: AuthoringAdapter } = {},
|
|
147
|
+
): string[] {
|
|
148
|
+
const intent = options.intent ?? 'normal';
|
|
149
|
+
const active = options.adapter ?? getActiveAuthoring(store);
|
|
150
|
+
if (!(active instanceof CompositeAuthoringAdapter)) {
|
|
151
|
+
const candidates = resolveAdapterCandidates(active, clientX, clientY, intent);
|
|
152
|
+
const fallback = resolveAdapterPick(active, clientX, clientY, intent);
|
|
153
|
+
return candidates.length > 0 ? candidates : fallback ? [fallback] : [];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const children = active.childAdapters();
|
|
157
|
+
const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
|
|
158
|
+
const layered = sceneDocumentActive ? [] : children.filter((child) => child.kind !== 'three');
|
|
159
|
+
const three = children.filter((child) => child.kind === 'three');
|
|
160
|
+
const layeredClaims = layered.map((child) => ({
|
|
161
|
+
id: child.worldId,
|
|
162
|
+
zOrder: child.zOrder,
|
|
163
|
+
worldId: child.worldId,
|
|
164
|
+
adapter: child.adapter,
|
|
165
|
+
}));
|
|
166
|
+
const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
|
|
167
|
+
...stackOrder(layeredClaims).reverse(),
|
|
168
|
+
...three,
|
|
169
|
+
];
|
|
170
|
+
const result: string[] = [];
|
|
171
|
+
const seen = new Set<string>();
|
|
172
|
+
for (const { worldId, adapter } of order) {
|
|
173
|
+
if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
|
|
174
|
+
const candidates = resolveAdapterCandidates(adapter, clientX, clientY, intent);
|
|
175
|
+
const fallback = resolveAdapterPick(adapter, clientX, clientY, intent);
|
|
176
|
+
for (const id of candidates.length > 0 ? candidates : fallback ? [fallback] : []) {
|
|
177
|
+
if (seen.has(id)) continue;
|
|
178
|
+
seen.add(id);
|
|
179
|
+
result.push(id);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "A continuous viewport gesture is happening right now" — the one fact the
|
|
3
|
+
* absorb-by-remount cycle needs from the gizmo.
|
|
4
|
+
*
|
|
5
|
+
* A source write remounts the world; a drag that is STILL RUNNING when the
|
|
6
|
+
* swap lands moves old-scene objects, and the adopted scene snaps them back
|
|
7
|
+
* to the written values — a human moving a three-cube selection "bit by bit"
|
|
8
|
+
* watched one member stay behind on every quick successive drag (runhuman
|
|
9
|
+
* passes 49/54, both ranked it their #1 fix). The design session builds the
|
|
10
|
+
* new world in parallel but awaits {@link whenLiveGestureIdle} before the
|
|
11
|
+
* swap, so a drag always completes on the objects it started on.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately module-scoped and frameworkless: the setter is the viewport's
|
|
14
|
+
* `dragging-changed` handler and the consumer is the design session — no
|
|
15
|
+
* React context reaches both.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
let active = 0;
|
|
19
|
+
let waiters: Array<() => void> = [];
|
|
20
|
+
|
|
21
|
+
export function beginLiveGesture(): void {
|
|
22
|
+
active += 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function endLiveGesture(): void {
|
|
26
|
+
active = Math.max(0, active - 1);
|
|
27
|
+
if (active === 0) {
|
|
28
|
+
const resolved = waiters;
|
|
29
|
+
waiters = [];
|
|
30
|
+
for (const resolve of resolved) resolve();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Whether any gesture (a drag, or a gesture's still-landing write) holds
|
|
35
|
+
* the lock right now — the swap's settle loop re-checks this after each
|
|
36
|
+
* wait, because a lock taken in the same task that released the previous
|
|
37
|
+
* one can race a waiter that already resolved. */
|
|
38
|
+
export function liveGestureActive(): boolean {
|
|
39
|
+
return active > 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Resolves immediately when no gesture is running, else on the current
|
|
43
|
+
* gesture's end. */
|
|
44
|
+
export function whenLiveGestureIdle(): Promise<void> {
|
|
45
|
+
return active === 0
|
|
46
|
+
? Promise.resolve()
|
|
47
|
+
: new Promise((resolve) => {
|
|
48
|
+
waiters.push(resolve);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading the transform of a LIVE `Object3D` the editor did not write.
|
|
3
|
+
*
|
|
4
|
+
* THE TRAP, measured on the racing-game ingest (2026-08-15). A physics library
|
|
5
|
+
* that drives a node writes the node's MATRIX and turns matrix composition off:
|
|
6
|
+
* `@react-three/cannon`'s frame handler is literally
|
|
7
|
+
* `object.matrixAutoUpdate = false; object.matrix.copy(m)`. Three never
|
|
8
|
+
* decomposes that back, so `object.position`/`.quaternion`/`.scale` keep
|
|
9
|
+
* whatever they held when the body was created — forever. Everything derived
|
|
10
|
+
* from `matrixWorld` (selection brackets, bounds, three's own
|
|
11
|
+
* `TransformControls`) tracks the truth, while everything derived from
|
|
12
|
+
* `.position` shows the spawn point. Measured side by side: the driven chassis
|
|
13
|
+
* reported `[-110, 0.75, 220]` in the Inspector while the game's own state
|
|
14
|
+
* provider put it at `(-24.5, 0.85, 186.2)`.
|
|
15
|
+
*
|
|
16
|
+
* That mismatch is worse than a wrong number: origin markers and gizmo anchors
|
|
17
|
+
* derived from `.position` sit somewhere the object is not, while the bounding
|
|
18
|
+
* box around them is correct, so the editor contradicts itself on screen.
|
|
19
|
+
*
|
|
20
|
+
* THE RULE: **when a node owns its own matrix (`matrixAutoUpdate === false`),
|
|
21
|
+
* the MATRIX is the transform.** Decompose it — through three's own
|
|
22
|
+
* `Matrix4.decompose`, never a re-derivation. Otherwise the vector fields are
|
|
23
|
+
* authoritative and are read directly: deliberately not "always decompose",
|
|
24
|
+
* because for an ordinary node `matrix` is one frame BEHIND a write the editor
|
|
25
|
+
* just made, and reading it back would make a gizmo drag stutter.
|
|
26
|
+
*
|
|
27
|
+
* Nothing here is library-specific: the predicate is three's own flag, so any
|
|
28
|
+
* driver following the same convention (cannon, a custom integrator, an
|
|
29
|
+
* animation system baking matrices) is covered without naming it.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import * as THREE from 'three';
|
|
33
|
+
|
|
34
|
+
export interface LocalTransformRead {
|
|
35
|
+
readonly position: [number, number, number];
|
|
36
|
+
readonly quaternion: [number, number, number, number];
|
|
37
|
+
readonly scale: [number, number, number];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const _position = new THREE.Vector3();
|
|
41
|
+
const _quaternion = new THREE.Quaternion();
|
|
42
|
+
const _scale = new THREE.Vector3();
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The node's LOCAL transform, from whichever of the two representations it
|
|
46
|
+
* actually maintains.
|
|
47
|
+
*/
|
|
48
|
+
export function localTransformOf(object: THREE.Object3D): LocalTransformRead {
|
|
49
|
+
if (object.matrixAutoUpdate === false) {
|
|
50
|
+
object.matrix.decompose(_position, _quaternion, _scale);
|
|
51
|
+
return {
|
|
52
|
+
position: _position.toArray() as [number, number, number],
|
|
53
|
+
quaternion: _quaternion.toArray() as [number, number, number, number],
|
|
54
|
+
scale: _scale.toArray() as [number, number, number],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
position: object.position.toArray() as [number, number, number],
|
|
59
|
+
quaternion: object.quaternion.toArray() as [number, number, number, number],
|
|
60
|
+
scale: object.scale.toArray() as [number, number, number],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount-failure report — D-W3: every manifest world's auto-launch route
|
|
3
|
+
* degrades to exactly one `editorConsole.error` line today (§0.4 — ground
|
|
4
|
+
* truth: the default Untitled scene is already showing by the time a manifest
|
|
5
|
+
* route fails, so a broken world mounts to what LOOKS like a normal empty
|
|
6
|
+
* project). This module is the structured half of the fix: a global mount-
|
|
7
|
+
* failure slot every manifest-route catch block populates.
|
|
8
|
+
*
|
|
9
|
+
* WHERE IT SHOWS — there is ONE error home, the editor's bottom surface, and
|
|
10
|
+
* this slot rides it rather than owning a surface of its own:
|
|
11
|
+
*
|
|
12
|
+
* 1. the `editorConsole.error` line each route already writes (the full
|
|
13
|
+
* trace lives there, and the status bar's `console-counts` counts it);
|
|
14
|
+
* 2. the status bar's `mount-failure` contribution
|
|
15
|
+
* (`../components/status-contributions.tsx`) — a sticky, danger-toned
|
|
16
|
+
* "N worlds failed to mount" item that names each world in its title and
|
|
17
|
+
* opens the Console on click. Sticky is the point: a dead world stays
|
|
18
|
+
* dead until it is fixed, so unlike a transient hint this item persists
|
|
19
|
+
* until the slot clears;
|
|
20
|
+
* 3. the Console utility is REVEALED on the empty→failing edge
|
|
21
|
+
* (`../workspace-utility-commands.ts`'s auto-open policy, the same one a
|
|
22
|
+
* failed build uses) — that reveal is what makes a mount failure loud
|
|
23
|
+
* without a second surface, and it is why the Console not being the
|
|
24
|
+
* default bottom tab is no longer an argument for one.
|
|
25
|
+
*
|
|
26
|
+
* A separate top-of-shell banner used to render this slot. It was a SECOND
|
|
27
|
+
* error home — users had to learn two places to look — and it is gone.
|
|
28
|
+
*
|
|
29
|
+
* D-V5 (composite): a composite manifest (one ingest world + siblings,
|
|
30
|
+
* `ingest-siblings.ts`) can fail SEVERAL roots independently in one mount
|
|
31
|
+
* attempt (a `default-three` sibling, a throwing `default-react` sibling, …)
|
|
32
|
+
* — a single-slot "last failure wins" model would silently drop every failure
|
|
33
|
+
* but the latest, the exact F9 anti-pattern this module exists to close. The
|
|
34
|
+
* slot is an ORDERED LIST: `addMountFailureReport` (deduped by `worldId` — a
|
|
35
|
+
* re-attempt for the SAME world replaces that world's entry in place, keeping
|
|
36
|
+
* list order stable), `getMountFailureReports()`,
|
|
37
|
+
* `clearMountFailureReports()`.
|
|
38
|
+
*
|
|
39
|
+
* The slot owns its own `subscribe` (same shape as
|
|
40
|
+
* `../asset-workflow/asset-materialization-report.ts`) rather than
|
|
41
|
+
* piggybacking on `EditorShellStore.subscribe`: the readers are no longer
|
|
42
|
+
* mounted inside a store-subscribed panel, and the per-world clears
|
|
43
|
+
* (`clearMountFailureReport`) run from root-level lifecycles that do not all
|
|
44
|
+
* broadcast a store notification. `getMountFailureReports()` returns a frozen
|
|
45
|
+
* snapshot whose identity changes only when the list does, so it is a valid
|
|
46
|
+
* `useSyncExternalStore` getSnapshot.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
/** One manifest world's mount failure — the exact fields the status item shows. */
|
|
50
|
+
export interface MountFailureReport {
|
|
51
|
+
/** The failing world's manifest id (`ResolvedAdapterRoot.id`), or the
|
|
52
|
+
* vendored/fixture route's discovered game/folder id. */
|
|
53
|
+
readonly worldId: string;
|
|
54
|
+
/** The world's render substrate kind (`ResolvedAdapterRoot.kind`, e.g.
|
|
55
|
+
* `'three'`/`'canvas'`/`'react'`) — or, for the URL-fallback route
|
|
56
|
+
* (which has no `ResolvedAdapterRoot` to read a kind from), the same
|
|
57
|
+
* vocabulary inferred from which fixture glob resolved the id. */
|
|
58
|
+
readonly kind: string;
|
|
59
|
+
/** The resolved adapter identity (`ResolvedAdapter['identity']` — e.g.
|
|
60
|
+
* `'ingest-three'`/`'ingest-pixi'`/`'ingest-react'`/`'module'`). */
|
|
61
|
+
readonly identity: string;
|
|
62
|
+
/** The caught error's message — never the raw `Error` object (never
|
|
63
|
+
* fabricated; empty only if the thrown value truly stringifies empty). */
|
|
64
|
+
readonly message: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** D-V5: an ORDERED list now backs the slot (insertion order — the order
|
|
68
|
+
* roots actually failed in, which for a composite's sibling loop is
|
|
69
|
+
* manifest order). Every accessor below is a thin view over this same
|
|
70
|
+
* array — never a second, parallel source of truth. Replaced wholesale
|
|
71
|
+
* rather than mutated so the snapshot identity is a real change signal. */
|
|
72
|
+
let _reports: readonly MountFailureReport[] = [];
|
|
73
|
+
const _listeners = new Set<() => void>();
|
|
74
|
+
|
|
75
|
+
function notify(): void {
|
|
76
|
+
for (const listener of _listeners) listener();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** `useSyncExternalStore`-compatible subscribe for the status contribution
|
|
80
|
+
* and the Console auto-open policy. */
|
|
81
|
+
export function subscribeToMountFailures(callback: () => void): () => void {
|
|
82
|
+
_listeners.add(callback);
|
|
83
|
+
return () => {
|
|
84
|
+
_listeners.delete(callback);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* D-V5: append one world's failure, deduped by `worldId` — a re-attempt for
|
|
90
|
+
* a world that already has an entry REPLACES it in place (keeps list order
|
|
91
|
+
* stable: retrying world B in `[A, B]` yields `[A, B']`, never `[A, B]` moved
|
|
92
|
+
* to the end).
|
|
93
|
+
*/
|
|
94
|
+
export function addMountFailureReport(report: MountFailureReport): void {
|
|
95
|
+
const index = _reports.findIndex((r) => r.worldId === report.worldId);
|
|
96
|
+
if (index === -1) {
|
|
97
|
+
_reports = [..._reports, report];
|
|
98
|
+
} else {
|
|
99
|
+
const next = [..._reports];
|
|
100
|
+
next[index] = report;
|
|
101
|
+
_reports = next;
|
|
102
|
+
}
|
|
103
|
+
notify();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** D-V5: every mount failure from the current attempt, oldest first. */
|
|
107
|
+
export function getMountFailureReports(): readonly MountFailureReport[] {
|
|
108
|
+
return _reports;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Drop every recorded failure — what a successful mount (or a torn-down
|
|
112
|
+
* session, which has nothing left to report) calls. */
|
|
113
|
+
export function clearMountFailureReports(): void {
|
|
114
|
+
if (_reports.length === 0) return;
|
|
115
|
+
_reports = [];
|
|
116
|
+
notify();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* PD-1: drop ONE world's recorded failure — what a route that mounts a single
|
|
121
|
+
* world calls after that world mounts successfully.
|
|
122
|
+
*
|
|
123
|
+
* `clearMountFailureReports()` above is the whole-attempt reset an ingest/
|
|
124
|
+
* module route can afford because it owns the entire mount. The R3F design
|
|
125
|
+
* session and the design-time layer loop do NOT: they mount roots
|
|
126
|
+
* independently, so a blanket clear on one root's success would erase a
|
|
127
|
+
* SIBLING root's still-true failure — the exact D-V5 drop the ordered list
|
|
128
|
+
* exists to prevent. Keyed by the same `worldId` `addMountFailureReport`
|
|
129
|
+
* dedupes on, and a no-op when that world has no entry.
|
|
130
|
+
*
|
|
131
|
+
* Not clearing at all is what PD-1 measured: an R3F world that failed to mount
|
|
132
|
+
* once kept reporting that failure through `vgai status`'s "MOUNT FAILED —
|
|
133
|
+
* THIS WORLD IS NOT RUNNING" line (and the in-editor surface) for the rest of
|
|
134
|
+
* the page's life, including while the very same world was mounted and
|
|
135
|
+
* PLAYING. A diagnostic that cannot go back to healthy is worse than none.
|
|
136
|
+
*/
|
|
137
|
+
export function clearMountFailureReport(worldId: string): void {
|
|
138
|
+
const index = _reports.findIndex((r) => r.worldId === worldId);
|
|
139
|
+
if (index === -1) return;
|
|
140
|
+
_reports = _reports.filter((_, i) => i !== index);
|
|
141
|
+
notify();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Build a `MountFailureReport['message']` from a caught value the same way
|
|
146
|
+
* every route's existing `editorConsole.error` line already stringifies it
|
|
147
|
+
* (`` `...failed: ${err}` `` — kept byte-for-byte at each call site so the
|
|
148
|
+
* console's full trace is unchanged) — an `Error`'s own `.message` reads
|
|
149
|
+
* better in a one-line summary than its `String(err)` form (`"Error: <msg>"`),
|
|
150
|
+
* so the report uses this instead of the console's template-literal form.
|
|
151
|
+
*/
|
|
152
|
+
export function formatMountFailureMessage(err: unknown): string {
|
|
153
|
+
return err instanceof Error ? err.message : String(err);
|
|
154
|
+
}
|