@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,195 @@
|
|
|
1
|
+
import type { AuthoringAdapter, EditorNode } from '@volter/editor-project/adapter';
|
|
2
|
+
import { setAuthoringSelection } from './consumer-actions';
|
|
3
|
+
|
|
4
|
+
/** Session-only contents scope shared by hierarchy, viewport picking, and
|
|
5
|
+
* hotkeys. The adapter remains the source of hierarchy/ownership truth; this
|
|
6
|
+
* module only records which semantic boundary the user has opened. */
|
|
7
|
+
interface SelectionScopeState {
|
|
8
|
+
adapter: AuthoringAdapter;
|
|
9
|
+
stack: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let state: SelectionScopeState | null = null;
|
|
13
|
+
const listeners = new Set<() => void>();
|
|
14
|
+
let version = 0;
|
|
15
|
+
|
|
16
|
+
function emit(): void {
|
|
17
|
+
version += 1;
|
|
18
|
+
for (const listener of listeners) listener();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isScopeNode(node: EditorNode | null): boolean {
|
|
22
|
+
return (
|
|
23
|
+
!!node && (node.role === 'component' || node.role === 'instance' || node.role === 'boundary')
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function isDescendant(adapter: AuthoringAdapter, id: string, ancestorId: string): boolean {
|
|
28
|
+
let current: string | null = id;
|
|
29
|
+
let guard = 0;
|
|
30
|
+
while (current && guard++ < 1000) {
|
|
31
|
+
if (current === ancestorId) return true;
|
|
32
|
+
current = adapter.hierarchy.node(current)?.parentId ?? null;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function subscribeSelectionScope(listener: () => void): () => void {
|
|
38
|
+
listeners.add(listener);
|
|
39
|
+
return () => listeners.delete(listener);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function selectionScopeVersion(): number {
|
|
43
|
+
return version;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Current boundary id for pick resolution. Deliberately adapter-agnostic:
|
|
47
|
+
* layered picking resolves through a composite's child adapter while the
|
|
48
|
+
* hierarchy owns the composite adapter that opened the scope. */
|
|
49
|
+
export function currentSelectionScopeId(): string | null {
|
|
50
|
+
return state?.stack.at(-1) ?? null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function selectionScopeStack(adapter: AuthoringAdapter): string[] {
|
|
54
|
+
if (state?.adapter !== adapter) return [];
|
|
55
|
+
const valid = state.stack.filter((id) => adapter.hierarchy.node(id) !== null);
|
|
56
|
+
if (valid.length !== state.stack.length) {
|
|
57
|
+
state = valid.length > 0 ? { adapter, stack: valid } : null;
|
|
58
|
+
}
|
|
59
|
+
return valid;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function enterSelectionScope(adapter: AuthoringAdapter, id: string): boolean {
|
|
63
|
+
const node = adapter.hierarchy.node(id);
|
|
64
|
+
if (!isScopeNode(node) || node!.childIds.length === 0) return false;
|
|
65
|
+
|
|
66
|
+
const current = state?.adapter === adapter ? state.stack : [];
|
|
67
|
+
const parentScope = current.at(-1);
|
|
68
|
+
if (parentScope && !isDescendant(adapter, id, parentScope)) return false;
|
|
69
|
+
if (parentScope === id) return false;
|
|
70
|
+
state = { adapter, stack: [...current, id] };
|
|
71
|
+
setAuthoringSelection(adapter, [id]);
|
|
72
|
+
emit();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Navigate to an existing breadcrumb boundary, or null for the full Game. */
|
|
77
|
+
export function setSelectionScope(adapter: AuthoringAdapter, id: string | null): void {
|
|
78
|
+
if (id === null) {
|
|
79
|
+
if (state === null) return;
|
|
80
|
+
state = null;
|
|
81
|
+
emit();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const current = selectionScopeStack(adapter);
|
|
85
|
+
const index = current.indexOf(id);
|
|
86
|
+
if (index < 0) return;
|
|
87
|
+
state = { adapter, stack: current.slice(0, index + 1) };
|
|
88
|
+
setAuthoringSelection(adapter, [id]);
|
|
89
|
+
emit();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function exitSelectionScope(adapter: AuthoringAdapter): boolean {
|
|
93
|
+
if (state && state.adapter !== adapter) {
|
|
94
|
+
state = null;
|
|
95
|
+
emit();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
const current = selectionScopeStack(adapter);
|
|
99
|
+
if (current.length === 0) return false;
|
|
100
|
+
const next = current.slice(0, -1);
|
|
101
|
+
state = next.length > 0 ? { adapter, stack: next } : null;
|
|
102
|
+
const selectionId = next.at(-1) ?? current[0]!;
|
|
103
|
+
setAuthoringSelection(adapter, [selectionId]);
|
|
104
|
+
emit();
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function enterSelectedScope(adapter: AuthoringAdapter): boolean {
|
|
109
|
+
const selected = adapter.selection?.get() ?? [];
|
|
110
|
+
return selected.length === 1 ? enterSelectionScope(adapter, selected[0]!) : false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Drill in ONE level (the viewport's double-click, Figma's own gesture): open
|
|
115
|
+
* `boundaryId`'s scope, then select whatever the SAME pointer resolves to now
|
|
116
|
+
* that the scope is open.
|
|
117
|
+
*
|
|
118
|
+
* `repick` is the caller's own pick — `layered-pick.ts` already passes
|
|
119
|
+
* `currentSelectionScopeId()` into `SelectionProvider.resolve`, and the
|
|
120
|
+
* adapter's resolve already answers with the next member down its own owner
|
|
121
|
+
* chain. So there is no second chain-walking rule here, and this module still
|
|
122
|
+
* knows nothing about how a surface picks. Repeat the gesture to keep
|
|
123
|
+
* descending; {@link exitSelectionScope} (Escape) walks back out.
|
|
124
|
+
*/
|
|
125
|
+
export function drillIntoSelectionScope(
|
|
126
|
+
adapter: AuthoringAdapter,
|
|
127
|
+
boundaryId: string,
|
|
128
|
+
repick: () => string | null,
|
|
129
|
+
): boolean {
|
|
130
|
+
if (!enterSelectionScope(adapter, boundaryId)) return false;
|
|
131
|
+
// `enterSelectionScope` already selected the boundary; a deeper member under
|
|
132
|
+
// the same pointer is what the gesture actually asked for. When the chain
|
|
133
|
+
// ends here the boundary stays selected — entering was still correct.
|
|
134
|
+
const deeper = repick();
|
|
135
|
+
if (deeper && deeper !== boundaryId) setAuthoringSelection(adapter, [deeper]);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Figma's outside-click rule: a click that lands outside an open scope leaves
|
|
141
|
+
* it. Pops every entry whose boundary does not CONTAIN `id`, so the stack
|
|
142
|
+
* follows the click to the level that does; a `null` id (empty space) closes
|
|
143
|
+
* every scope.
|
|
144
|
+
*
|
|
145
|
+
* Selection stays the caller's to set — the pick that produced `id` was
|
|
146
|
+
* already resolved against the scope that was open (a chain without the scope
|
|
147
|
+
* in it resolves to its own outermost owner), so this only makes the stack
|
|
148
|
+
* agree with where the click landed.
|
|
149
|
+
*/
|
|
150
|
+
export function popSelectionScopesToContain(adapter: AuthoringAdapter, id: string | null): boolean {
|
|
151
|
+
const current = selectionScopeStack(adapter);
|
|
152
|
+
if (current.length === 0) return false;
|
|
153
|
+
let depth = 0;
|
|
154
|
+
while (id !== null && depth < current.length && isDescendant(adapter, id, current[depth]!)) {
|
|
155
|
+
depth += 1;
|
|
156
|
+
}
|
|
157
|
+
if (depth === current.length) return false;
|
|
158
|
+
state = depth > 0 ? { adapter, stack: current.slice(0, depth) } : null;
|
|
159
|
+
emit();
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* ONE click's answer, across the scope exit the click itself causes — the
|
|
165
|
+
* whole of the viewport's single-click resolution.
|
|
166
|
+
*
|
|
167
|
+
* A pick resolves against whatever scope is OPEN (`layered-pick.ts` hands
|
|
168
|
+
* `currentSelectionScopeId()` to the adapter's own resolve), so a click that
|
|
169
|
+
* leaves the innermost scope was resolved by a scope that is about to be
|
|
170
|
+
* wrong. With a one-deep stack that is invisible — popping lands at "no
|
|
171
|
+
* scope", which is what the stale answer already assumed. With a stack THREE
|
|
172
|
+
* deep it is visible: the stale resolve answers with the chain's outermost
|
|
173
|
+
* owner, one level shallower than the same click gives once the stack has
|
|
174
|
+
* followed it, so the user has to click twice to land where one click should
|
|
175
|
+
* have (reviewer, #1235).
|
|
176
|
+
*
|
|
177
|
+
* So: resolve, let {@link popSelectionScopesToContain} follow the hit, and
|
|
178
|
+
* re-resolve ONCE — only when the stack actually moved, because a click that
|
|
179
|
+
* stays inside the open scope has nothing to re-resolve against. The second
|
|
180
|
+
* answer needs no second pop: it is a member of the scope the first pop
|
|
181
|
+
* settled on.
|
|
182
|
+
*/
|
|
183
|
+
export function pickAcrossScopeExit(
|
|
184
|
+
adapter: AuthoringAdapter,
|
|
185
|
+
repick: () => string | null,
|
|
186
|
+
): string | null {
|
|
187
|
+
const hit = repick();
|
|
188
|
+
return popSelectionScopesToContain(adapter, hit) ? repick() : hit;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Test-only reset; production scope is intentionally session-local. */
|
|
192
|
+
export function _resetSelectionScopeForTest(): void {
|
|
193
|
+
state = null;
|
|
194
|
+
emit();
|
|
195
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format-neutral shell document operations.
|
|
3
|
+
*
|
|
4
|
+
* Save destination, save state, hierarchy rows and select-all are questions
|
|
5
|
+
* about a DOCUMENT, and the shell owns none. Answering them from store fields
|
|
6
|
+
* would bind the shell chrome — status bar, application menus, command relay,
|
|
7
|
+
* hotkeys — to one format; these helpers ask the ACTIVE
|
|
8
|
+
* {@link AuthoringAdapter} instead, so the same chrome works for a TSX/R3F
|
|
9
|
+
* world, a React root, and an ingested game alike.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { AuthoringAdapter, NodeCreationSite, WriteAnchorKind } from '@volter/editor-project/adapter';
|
|
13
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
14
|
+
import { forEachHierarchyNode } from '../hierarchy-walk';
|
|
15
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
16
|
+
import { saveAuthoringDocument, setAuthoringSelection } from './consumer-actions';
|
|
17
|
+
import { resolvePanelAuthoring } from './panel-authoring';
|
|
18
|
+
|
|
19
|
+
/** The authoring adapter owned by the active center document. This is the same
|
|
20
|
+
* resolution used by Hierarchy and Inspector; shell commands must not keep
|
|
21
|
+
* driving the scene adapter after an asset/source document becomes active. */
|
|
22
|
+
export function activeDocumentAuthoring(store: EditorShellStore): AuthoringAdapter {
|
|
23
|
+
return resolvePanelAuthoring(store).adapter;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** One flattened hierarchy row — the wire shape `editor.hierarchy.inspect` reports. */
|
|
27
|
+
export interface ShellHierarchyRow {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
childIds: string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The active adapter's hierarchy, flattened breadth-first to id/name/childIds
|
|
35
|
+
* rows. `[]` when the adapter owns no tree (the no-authoring floor).
|
|
36
|
+
*/
|
|
37
|
+
export function activeHierarchyRows(store: EditorShellStore): ShellHierarchyRow[] {
|
|
38
|
+
const rows: ShellHierarchyRow[] = [];
|
|
39
|
+
forEachHierarchyNode(activeDocumentAuthoring(store).hierarchy, (node) => {
|
|
40
|
+
rows.push({ id: node.id, name: node.label, childIds: [...node.childIds] });
|
|
41
|
+
});
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The source path represented by an adapter's document node.
|
|
47
|
+
*
|
|
48
|
+
* Source-authored adapters persist edits immediately and intentionally expose
|
|
49
|
+
* no PersistenceProvider. Their hierarchy still owns an honest document node
|
|
50
|
+
* whose secondary label is the project-relative source path (`src/world.tsx`,
|
|
51
|
+
* for example). Prefer that source identity for document chrome instead of
|
|
52
|
+
* leaking a composite persistence fallback such as "(no persistable child)".
|
|
53
|
+
*/
|
|
54
|
+
export function authoringDocumentSourcePath(adapter: AuthoringAdapter): string | null {
|
|
55
|
+
let found: string | null = null;
|
|
56
|
+
forEachHierarchyNode(adapter.hierarchy, (node) => {
|
|
57
|
+
const sourcePath = node.secondaryLabel?.trim();
|
|
58
|
+
if (node.role !== 'document' || !sourcePath) return;
|
|
59
|
+
found = sourcePath;
|
|
60
|
+
return false; // the first document row answers; never walk the whole tree for it
|
|
61
|
+
});
|
|
62
|
+
return found;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The active source-authored document path, when its adapter exposes one. */
|
|
66
|
+
export function activeDocumentSourcePath(store: EditorShellStore): string | null {
|
|
67
|
+
return authoringDocumentSourcePath(getActiveAuthoring(store));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The exact source filename represented by a project-relative path. */
|
|
71
|
+
export function sourceFileName(sourcePath: string | null | undefined): string | null {
|
|
72
|
+
const trimmed = sourcePath?.trim();
|
|
73
|
+
if (!trimmed) return null;
|
|
74
|
+
return trimmed.split(/[\\/]/).filter(Boolean).at(-1) ?? null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Where a save would land, straight from the active adapter's
|
|
79
|
+
* `PersistenceProvider`, or `null` when this adapter persists nothing.
|
|
80
|
+
*/
|
|
81
|
+
export function activeSaveDestination(store: EditorShellStore): string | null {
|
|
82
|
+
const adapter = getActiveAuthoring(store);
|
|
83
|
+
return adapter.capabilities.persist ? (adapter.persistence?.destination ?? null) : null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether the active adapter has unsaved edits.
|
|
88
|
+
*
|
|
89
|
+
* A source-backed adapter may be clean because it rolled a failed write back.
|
|
90
|
+
* Its provider still reports that failure until a later successful write
|
|
91
|
+
* clears the project-history error; clean and successful are not synonyms.
|
|
92
|
+
*/
|
|
93
|
+
export function activeSaveState(store: EditorShellStore): 'saved' | 'unsaved' | 'failed' {
|
|
94
|
+
const persistence = getActiveAuthoring(store).persistence;
|
|
95
|
+
if (persistence?.lastError?.()) return 'failed';
|
|
96
|
+
return persistence?.isDirty() ? 'unsaved' : 'saved';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** The active adapter's human-readable persistence failure, when any. */
|
|
100
|
+
export function activeSaveFailure(store: EditorShellStore): string | null {
|
|
101
|
+
return getActiveAuthoring(store).persistence?.lastError?.() ?? null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The creation-site anchor for the CURRENT selection, as the control
|
|
106
|
+
* API reports it (`vgai status` / `vgai eval`'s `editor.status()`).
|
|
107
|
+
*
|
|
108
|
+
* `null` has one meaning and one only: there is nothing to ask about — no
|
|
109
|
+
* selection, or an active adapter that indexes no creation sites. Whenever the
|
|
110
|
+
* adapter DOES index them the answer is a record, anchored or reasoned; a
|
|
111
|
+
* silent blank for "we couldn't find it" is exactly what the honest-floor rule
|
|
112
|
+
* forbids.
|
|
113
|
+
*/
|
|
114
|
+
export function activeSelectionCreationSite(store: EditorShellStore): NodeCreationSite | null {
|
|
115
|
+
const adapter = activeDocumentAuthoring(store);
|
|
116
|
+
const id = adapter.selection?.get()[0] ?? null;
|
|
117
|
+
if (!id) return null;
|
|
118
|
+
return adapter.truth?.resolve(id, 'position').site ?? null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The WRITE-side sibling of {@link activeSelectionCreationSite}: which lane
|
|
123
|
+
* would carry an edit to the current selection (`WriteAnchorKind`).
|
|
124
|
+
*
|
|
125
|
+
* Reported beside the anchor because the anchor alone cannot answer it — two
|
|
126
|
+
* subjects at the same kind of `file:line` can belong to different lanes with
|
|
127
|
+
* different correctness contracts. A caller sweeping the hierarchy for one
|
|
128
|
+
* subject per lane reads this per row; `vgai doctor`'s edit-write walk is that
|
|
129
|
+
* caller, and it is what makes the walk exhaustive over the kinds a world has
|
|
130
|
+
* instead of stopping at whichever row answered first.
|
|
131
|
+
*
|
|
132
|
+
* `null` on the same terms as the anchor: nothing selected, or an adapter that
|
|
133
|
+
* plans no distinguishable lanes.
|
|
134
|
+
*
|
|
135
|
+
* READ THROUGH THE SAME BINDING THE WRITE TAKES ({@link activeDocumentAuthoring},
|
|
136
|
+
* which is what `setActiveInspectionField` resolves too). A classifier reached
|
|
137
|
+
* through a different resolver than the writer is how a subject came to be
|
|
138
|
+
* reported in one lane while its edit travelled another.
|
|
139
|
+
*/
|
|
140
|
+
export function activeSelectionWriteAnchorKind(store: EditorShellStore): WriteAnchorKind | null {
|
|
141
|
+
const adapter = activeDocumentAuthoring(store);
|
|
142
|
+
const id = adapter.selection?.get()[0] ?? null;
|
|
143
|
+
if (!id) return null;
|
|
144
|
+
return adapter.truth?.resolve(id, 'position').writeAnchorKind ?? null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Current document-local selection, shared by UI actions and the control API. */
|
|
148
|
+
export function activeSelectionIds(store: EditorShellStore): string[] {
|
|
149
|
+
return [...(activeDocumentAuthoring(store).selection?.get() ?? store.selectedEntityIds)];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Route selection through the active document's native adapter. */
|
|
153
|
+
export function selectAuthoringNodes(store: EditorShellStore, ids: readonly string[]): void {
|
|
154
|
+
const adapter = activeDocumentAuthoring(store);
|
|
155
|
+
if (!setAuthoringSelection(adapter, ids)) store.selectMultiple([...ids]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Select every node the active adapter's hierarchy exposes. */
|
|
159
|
+
export function selectAllAuthoringNodes(store: EditorShellStore): void {
|
|
160
|
+
selectAuthoringNodes(
|
|
161
|
+
store,
|
|
162
|
+
activeHierarchyRows(store).map((row) => row.id),
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Save through the active adapter's persistence provider (no-op when it has none). */
|
|
167
|
+
export async function saveActiveAuthoring(store: EditorShellStore): Promise<void> {
|
|
168
|
+
await saveAuthoringDocument(getActiveAuthoring(store), 'the shell saved the active document');
|
|
169
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE SHELL'S ANSWERS to `Object3DDocumentWritePolicy` — the composition the
|
|
3
|
+
* editor installs at boot (`EditorContext.tsx`'s `EditorProvider`).
|
|
4
|
+
*
|
|
5
|
+
* `openPersistence` and `replaceSource` are one-line delegations to the
|
|
6
|
+
* modules that already owned them. `saveThumbnailFraming` moved here WHOLE
|
|
7
|
+
* from `components/Object3DDocumentToolbar.tsx` (nothing about it changed) —
|
|
8
|
+
* merging `.vgai/thumbnails.json` is transport work end to end: read the
|
|
9
|
+
* project's manifest, refuse an unreadable one, write the merged bytes back
|
|
10
|
+
* through the project-file route.
|
|
11
|
+
*
|
|
12
|
+
* The point of the seam is only that the Asset Lab 3D document and its
|
|
13
|
+
* toolbar no longer import the server SDK barrel, the project file history,
|
|
14
|
+
* or the storage backend (ARCHITECTURE-CORE §Editor chrome, "the viewport
|
|
15
|
+
* stack is separable").
|
|
16
|
+
*
|
|
17
|
+
* This file is the shell side of that boundary and is free to import all of
|
|
18
|
+
* them.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
loadProjectThumbnailManifest,
|
|
23
|
+
resetProjectThumbnailManifestCache,
|
|
24
|
+
THUMBNAIL_MANIFEST_PATH,
|
|
25
|
+
THUMBNAIL_PROFILE,
|
|
26
|
+
} from '../asset-workflow/thumbnail-system';
|
|
27
|
+
import { workspaceHistoryService } from '../components/workspace-history';
|
|
28
|
+
import { projectFiles } from '../files/project-files';
|
|
29
|
+
import { getProjectFileHistory } from '../history/project-file-history';
|
|
30
|
+
import { getProjectResourceHistoryBackend } from '../history/project-root-history-backends';
|
|
31
|
+
import { replaceProjectSource } from '../history/source-history-backend';
|
|
32
|
+
import type {
|
|
33
|
+
Object3DDocumentThumbnailFraming,
|
|
34
|
+
Object3DDocumentWritePolicy,
|
|
35
|
+
} from '../object3d-document-write-policy';
|
|
36
|
+
import { sourceWriteBackendIfPrimed } from '../ui-source/tier-source-write-backend';
|
|
37
|
+
import { openObject3DDocumentPersistence } from './object3d-document-persistence';
|
|
38
|
+
|
|
39
|
+
async function persistThumbnailFraming(
|
|
40
|
+
assetPath: string,
|
|
41
|
+
framing: Object3DDocumentThumbnailFraming | undefined,
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
const read = await loadProjectThumbnailManifest();
|
|
44
|
+
// REFUSE rather than rebuild. `absent` and `unreadable` used to arrive as the
|
|
45
|
+
// same `null`, so a manifest that merely failed to parse was treated as "no
|
|
46
|
+
// manifest yet" and the write below replaced every framing entry in the
|
|
47
|
+
// project with `{}`.
|
|
48
|
+
if (read.status === 'unreadable') {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`${THUMBNAIL_MANIFEST_PATH} is present but could not be read (${read.reason}). ` +
|
|
51
|
+
'Refusing to overwrite it — fix or delete the file, then try again.',
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const manifest =
|
|
55
|
+
read.status === 'ok'
|
|
56
|
+
? read.manifest
|
|
57
|
+
: {
|
|
58
|
+
version: 1 as const,
|
|
59
|
+
profile: THUMBNAIL_PROFILE.version,
|
|
60
|
+
generatedAt: new Date().toISOString(),
|
|
61
|
+
entries: {},
|
|
62
|
+
};
|
|
63
|
+
const key = assetPath.replace(/^\/+/, '');
|
|
64
|
+
const prior = manifest.entries[key] ?? {
|
|
65
|
+
state: 'fallback' as const,
|
|
66
|
+
profileVersion: THUMBNAIL_PROFILE.version,
|
|
67
|
+
issueCode: 'thumbnail.pending-regeneration',
|
|
68
|
+
};
|
|
69
|
+
const updated = {
|
|
70
|
+
...manifest,
|
|
71
|
+
// Re-stamp the profile that produced this rewrite while KEEPING every
|
|
72
|
+
// existing entry; each entry's own `profileVersion` is what marks it stale.
|
|
73
|
+
profile: THUMBNAIL_PROFILE.version,
|
|
74
|
+
generatedAt: new Date().toISOString(),
|
|
75
|
+
entries: {
|
|
76
|
+
...manifest.entries,
|
|
77
|
+
[key]: { ...prior, framing },
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const content = `${JSON.stringify(updated, null, 2)}\n`;
|
|
81
|
+
const history = workspaceHistoryService();
|
|
82
|
+
const written = history
|
|
83
|
+
? await getProjectFileHistory(
|
|
84
|
+
history,
|
|
85
|
+
getProjectResourceHistoryBackend(),
|
|
86
|
+
'project-resources',
|
|
87
|
+
).write(THUMBNAIL_MANIFEST_PATH, content, {
|
|
88
|
+
label: `${framing ? 'Save' : 'Reset'} thumbnail framing ${assetPath}`,
|
|
89
|
+
kind: 'project-file',
|
|
90
|
+
contentType: 'application/json',
|
|
91
|
+
})
|
|
92
|
+
: await projectFiles.write(THUMBNAIL_MANIFEST_PATH, content).then(() => true);
|
|
93
|
+
if (written) resetProjectThumbnailManifestCache();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const SHELL_OBJECT3D_DOCUMENT_WRITE_POLICY: Object3DDocumentWritePolicy = {
|
|
97
|
+
openPersistence: (options) => openObject3DDocumentPersistence(options),
|
|
98
|
+
replaceSource: async (history, request) => {
|
|
99
|
+
// The session's recorder, read per use rather than captured: it is
|
|
100
|
+
// confirmed once at boot and a caller that captured it earlier would hold
|
|
101
|
+
// `undefined` for the session (a human hit exactly that duplicating from
|
|
102
|
+
// the Asset Editor — runhuman pass 41).
|
|
103
|
+
const backend = sourceWriteBackendIfPrimed('The Asset Editor');
|
|
104
|
+
if (!backend) throw new Error('This editor tier cannot write project source.');
|
|
105
|
+
return replaceProjectSource(backend, history, request);
|
|
106
|
+
},
|
|
107
|
+
saveThumbnailFraming: persistThumbnailFraming,
|
|
108
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE SHELL'S ANSWERS to `ViewportAuthoringPolicy` — the composition the
|
|
3
|
+
* editor installs at boot (`EditorContext.tsx`'s `EditorProvider`).
|
|
4
|
+
*
|
|
5
|
+
* Every member here is a one-line delegation to the module that already owned
|
|
6
|
+
* that answer. Nothing moved and nothing was reimplemented: the point of the
|
|
7
|
+
* seam is only that `editor-viewport.ts` no longer imports these modules, so
|
|
8
|
+
* the gizmo viewport does not carry the composite adapter, the workspace
|
|
9
|
+
* document registry, or the layered-pick walk in its own closure
|
|
10
|
+
* (ARCHITECTURE-CORE §Editor chrome, "the viewport stack is separable").
|
|
11
|
+
*
|
|
12
|
+
* This file is the shell side of that boundary and is free to import all of
|
|
13
|
+
* them.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ViewportAuthoringPolicy } from '../viewport-authoring-policy';
|
|
17
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
18
|
+
import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
|
|
19
|
+
import { pickTopmost } from './layered-pick';
|
|
20
|
+
import { resolvePanelAuthoring } from './panel-authoring';
|
|
21
|
+
import { isViewportToolContextVisible, resolveViewportToolContext } from './viewport-tool-context';
|
|
22
|
+
import {
|
|
23
|
+
applyRootHiddenVisibility,
|
|
24
|
+
isThreejsSurfaceVisible,
|
|
25
|
+
resolveThreeViewportRootId,
|
|
26
|
+
suppressRootEnvironment,
|
|
27
|
+
} from './world-hidden-viewport';
|
|
28
|
+
|
|
29
|
+
export const SHELL_VIEWPORT_AUTHORING_POLICY: ViewportAuthoringPolicy = {
|
|
30
|
+
activeAuthoring: (store) => getActiveAuthoring(store),
|
|
31
|
+
panelAuthoring: (store) => resolvePanelAuthoring(store).adapter,
|
|
32
|
+
pick: (store, clientX, clientY, intent) => pickTopmost(store, clientX, clientY, { intent }),
|
|
33
|
+
toolOwner: (adapter, selectedIds) => resolveViewportToolContext(adapter, selectedIds),
|
|
34
|
+
// Both halves of "is this owner painted here" — visibility says a three
|
|
35
|
+
// surface is drawn at all, selection ownership says it is the world being
|
|
36
|
+
// edited. The viewport ANDs the result with `kind === 'three'`, exactly as it
|
|
37
|
+
// did when it called these two itself.
|
|
38
|
+
toolOwnerPainted: (store, owner) =>
|
|
39
|
+
isThreejsSurfaceVisible(store) && isViewportToolContextVisible(store, owner),
|
|
40
|
+
threeSurfaceShowing: (store, adapter) =>
|
|
41
|
+
isThreejsSurfaceVisible(store) &&
|
|
42
|
+
(adapter instanceof CompositeAuthoringAdapter
|
|
43
|
+
? adapter.childAdapters().some((child) => child.kind === 'three')
|
|
44
|
+
: !adapter.rects && typeof adapter.hierarchy.object3D === 'function'),
|
|
45
|
+
threeViewportRootId: (store) => resolveThreeViewportRootId(store),
|
|
46
|
+
applyRootHiddenVisibility,
|
|
47
|
+
suppressRootEnvironment,
|
|
48
|
+
};
|