@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,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NAMED WORKSPACES — task-named arrangements of the one editor.
|
|
3
|
+
*
|
|
4
|
+
* The ruling (docs/ARCHITECTURE-CORE.md §Editor chrome, "Workspaces are
|
|
5
|
+
* task-named layout memories, switched only by explicit act"): the single
|
|
6
|
+
* The editor gains named workspaces — `Game` (default), `Model`,
|
|
7
|
+
* `Sculpt`, `Texture`, `Animate`, `Look` — each an ARRANGEMENT the mounted
|
|
8
|
+
* layout host applies: which regions are shown, which views sit where, and
|
|
9
|
+
* which documents its areas hold.
|
|
10
|
+
*
|
|
11
|
+
* This module is the registry + the active-id store, and it owns no geometry
|
|
12
|
+
* at all: under the frame the grid is the workbench's own, and a workspace
|
|
13
|
+
* switch is the host reading this table (`frame/bridge.tsx`).
|
|
14
|
+
*
|
|
15
|
+
* Three rules the ruling states and this module encodes:
|
|
16
|
+
*
|
|
17
|
+
* 1. **Switching is an explicit act only.** `Window → Workspace`, the
|
|
18
|
+
* registered actions (palette-ready, with a cycle shortcut pair), and
|
|
19
|
+
* the session operation `editor.workspace(id)`, and an explicit change
|
|
20
|
+
* to the mounted layout's arrangement call {@link setEditorWorkspace}. Nothing derives a workspace from what the
|
|
21
|
+
* user opened: DOCUMENT-OPEN NEVER MOVES CHROME. A workspace TAB STRIP
|
|
22
|
+
* exists only as a region a style or workspace turns on
|
|
23
|
+
* (`workspaceTabs` — Blender's top bar), where a click IS the explicit
|
|
24
|
+
* act; nothing derives a workspace, and there is no mode machine. Immersive Play remains the sole automatic
|
|
25
|
+
* transition, and it restores to the workspace it left (it never sets
|
|
26
|
+
* one — it hides and re-shows groups within the active workspace).
|
|
27
|
+
* 2. **A workspace positions chrome and dock groups only; it never opens
|
|
28
|
+
* documents.** The shipped defaults in `workspace-preset-layouts.ts` are
|
|
29
|
+
* normalized to carry no document panels at all.
|
|
30
|
+
* 3. **Shipped defaults are authored by arranging live and snapshotting
|
|
31
|
+
* `toJSON`** — never hand-written JSON. See that module's header for the
|
|
32
|
+
* capture procedure.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { WorkspaceLayoutContribution } from '@volter/editor-sdk/looks';
|
|
36
|
+
import { activeProduct, subscribeActiveProduct } from './active-product';
|
|
37
|
+
import { adapterEditorConfiguration } from './adapter-editor-config';
|
|
38
|
+
import { layoutPolicy, subscribeLayoutPolicy } from './layout-policy';
|
|
39
|
+
import { projectDeclaresDocumentKind, projectMounts, subscribeProjectShape } from './project-shape';
|
|
40
|
+
/** Imported arrangements may supply their own persistence identity. */
|
|
41
|
+
import { setWorkspaceAreas } from './workspace-areas';
|
|
42
|
+
import { setWorkspaceRegions } from './workspace-regions';
|
|
43
|
+
|
|
44
|
+
export type EditorWorkspaceId = string;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* WHICH CHROME REGIONS A WORKSPACE SHOWS — the knobs a skin or a preset turns,
|
|
48
|
+
* as data on the workspace rather than code paths in the dock. `tabs` is the
|
|
49
|
+
* center group's tab strip (Blender has none; Maya and Substance do), `header`
|
|
50
|
+
* the document header strip (`DocumentHeaderStrip`), `shelf` the tool rail
|
|
51
|
+
* (`DocumentShelfRail`). Absent means shown. A region hidden here is hidden
|
|
52
|
+
* for every document in the workspace; a document that has no contents for a
|
|
53
|
+
* region shows none regardless.
|
|
54
|
+
*/
|
|
55
|
+
export interface EditorWorkspaceRegions {
|
|
56
|
+
/** The WORKSPACE tab strip in the top bar (Blender's) — a style's or a
|
|
57
|
+
* workspace's region; a click on a tab is the explicit act. Absent: hidden. */
|
|
58
|
+
readonly workspaceTabs?: 'shown' | 'hidden';
|
|
59
|
+
readonly tabs?: 'shown' | 'hidden';
|
|
60
|
+
readonly header?: 'shown' | 'hidden';
|
|
61
|
+
readonly shelf?: 'shown' | 'hidden';
|
|
62
|
+
/** The docked inspector's layout: sections stacked (`column`, the default)
|
|
63
|
+
* or tabbed behind a vertical icon rail, one body at a time
|
|
64
|
+
* (`properties` — Blender's Properties editor). A user's own per-surface
|
|
65
|
+
* preference (`inspector-presentation.ts`) still outranks this. */
|
|
66
|
+
readonly inspector?: 'column' | 'properties';
|
|
67
|
+
/** The bottom utility drawer. `hidden` means this workspace never shows
|
|
68
|
+
* it, not even when play settles — Blender's modeling workspace has no
|
|
69
|
+
* timeline strip. Absent means shown. */
|
|
70
|
+
readonly drawer?: 'shown' | 'hidden';
|
|
71
|
+
/** The top bar's runtime TELEMETRY cluster (`HeaderTelemetry`). Absent
|
|
72
|
+
* means shown. */
|
|
73
|
+
readonly telemetry?: 'shown' | 'hidden';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface EditorWorkspaceDescriptor {
|
|
77
|
+
readonly id: EditorWorkspaceId;
|
|
78
|
+
/** What this workspace needs the project to DECLARE before it applies
|
|
79
|
+
* (ARCHITECTURE-CORE §Roots). `'mounts'`: at least one root — the Game
|
|
80
|
+
* workspace plays a world, and a project with none has nothing for it.
|
|
81
|
+
* Omitted: applies to every project. */
|
|
82
|
+
readonly requires?: 'mounts' | { readonly documentKind: string };
|
|
83
|
+
readonly title: string;
|
|
84
|
+
readonly description: string;
|
|
85
|
+
/** See {@link EditorWorkspaceRegions}. Absent means every region shown. */
|
|
86
|
+
readonly regions?: EditorWorkspaceRegions;
|
|
87
|
+
/**
|
|
88
|
+
* Whose SHIPPED arrangement this workspace starts from — its own, for every
|
|
89
|
+
* contributed workspace (a package whose workspaces open alike ships them the
|
|
90
|
+
* same captured geometry, as `@volter/editor-blender` does for Sculpt and Texture: their
|
|
91
|
+
* reserved panels ship WITH their programs, never as empty chrome); the
|
|
92
|
+
* host's own may alias another's. Every workspace keeps its OWN persisted
|
|
93
|
+
* layout the moment the user touches it, so aliasing only ever describes the
|
|
94
|
+
* first-open default.
|
|
95
|
+
*/
|
|
96
|
+
readonly arrangement: EditorWorkspaceId;
|
|
97
|
+
/** The workspace's EDITOR AREAS beside the centre document — a Blender area
|
|
98
|
+
* IS an editor group (orchestrator ruling 2026-09-19; see
|
|
99
|
+
* `WorkspaceAreaContribution` and `workspace-areas.ts`). Absent: the centre
|
|
100
|
+
* document alone, which is every host workspace. */
|
|
101
|
+
readonly areas?: WorkspaceLayoutContribution['areas'];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The workspaces EVERY project gets — the host's own. Every other workspace is
|
|
106
|
+
* a package's `workspace.layout` contribution (Game ships with `@vgai/game`;
|
|
107
|
+
* Model, Sculpt and Texture with `@volter/editor-blender`), registered through
|
|
108
|
+
* {@link registerContributedWorkspace} and listed by {@link editorWorkspaces}.
|
|
109
|
+
* Animate and Design stay here until their packages exist (WORK.md §The
|
|
110
|
+
* workbench).
|
|
111
|
+
*/
|
|
112
|
+
const BUILT_IN_WORKSPACES: readonly EditorWorkspaceDescriptor[] = Object.freeze([
|
|
113
|
+
{
|
|
114
|
+
id: 'animate',
|
|
115
|
+
title: 'Animate',
|
|
116
|
+
// WHAT IT DRAWS TODAY, which is the centre document alone. A workspace's
|
|
117
|
+
// second surface is an `areas` entry (`WorkspaceAreaContribution` — the
|
|
118
|
+
// Model workspace's timeline strip is one), and this workspace declares
|
|
119
|
+
// none, so promising "a docked timeline" described a screen nobody could
|
|
120
|
+
// get. It says what it is until the animation package ships the timeline
|
|
121
|
+
// document an area could name (walk 4, W-animate).
|
|
122
|
+
description: 'Animating: the viewport, with the outliner and properties beside it.',
|
|
123
|
+
arrangement: 'animate',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 'design',
|
|
127
|
+
title: 'Design',
|
|
128
|
+
description:
|
|
129
|
+
'Figma-shaped design: pasteboards, moodboards and the UI board. Uses the standing ' +
|
|
130
|
+
'arrangement until the design program ships its reserved panels.',
|
|
131
|
+
arrangement: 'game',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'look',
|
|
135
|
+
title: 'Look',
|
|
136
|
+
description: 'Marmoset-shaped look development: a near-fullscreen document, minimal chrome.',
|
|
137
|
+
arrangement: 'look',
|
|
138
|
+
regions: { header: 'hidden', shelf: 'hidden', drawer: 'hidden' },
|
|
139
|
+
},
|
|
140
|
+
] satisfies readonly EditorWorkspaceDescriptor[]);
|
|
141
|
+
|
|
142
|
+
interface ContributedWorkspace {
|
|
143
|
+
readonly descriptor: EditorWorkspaceDescriptor;
|
|
144
|
+
}
|
|
145
|
+
const contributedWorkspaces = new Map<string, ContributedWorkspace>();
|
|
146
|
+
let registryVersion = 0;
|
|
147
|
+
const registryListeners = new Set<() => void>();
|
|
148
|
+
|
|
149
|
+
/** Contributions first, in registration order, then the host's own — so a
|
|
150
|
+
* project's packages name the workspaces it opens in (Game, Model) before
|
|
151
|
+
* the ones every project has. The switch surfaces enumerate this. */
|
|
152
|
+
export function editorWorkspaces(): readonly EditorWorkspaceDescriptor[] {
|
|
153
|
+
return [
|
|
154
|
+
...[...contributedWorkspaces.values()].map((entry) => entry.descriptor),
|
|
155
|
+
...BUILT_IN_WORKSPACES,
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function editorWorkspacesVersion(): number {
|
|
160
|
+
return registryVersion;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function subscribeEditorWorkspaces(listener: () => void): () => void {
|
|
164
|
+
registryListeners.add(listener);
|
|
165
|
+
return () => registryListeners.delete(listener);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Register a package's workspace (`workspace.layout` contribution). Returns
|
|
170
|
+
* the unregister. A duplicate id throws — ids key persisted state. A
|
|
171
|
+
* workspace whose contribution arrives after the session chose a PROVISIONAL
|
|
172
|
+
* workspace (nothing recorded, nothing declared) re-runs that choice, so a
|
|
173
|
+
* game project opens in Game whichever loads first.
|
|
174
|
+
*/
|
|
175
|
+
export function registerContributedWorkspace(
|
|
176
|
+
contribution: WorkspaceLayoutContribution,
|
|
177
|
+
): () => void {
|
|
178
|
+
if (
|
|
179
|
+
BUILT_IN_WORKSPACES.some((entry) => entry.id === contribution.id) ||
|
|
180
|
+
contributedWorkspaces.has(contribution.id)
|
|
181
|
+
)
|
|
182
|
+
throw new Error(
|
|
183
|
+
`registerContributedWorkspace: workspace "${contribution.id}" is already registered.`,
|
|
184
|
+
);
|
|
185
|
+
const entry: ContributedWorkspace = {
|
|
186
|
+
descriptor: {
|
|
187
|
+
id: contribution.id,
|
|
188
|
+
title: contribution.title,
|
|
189
|
+
description: contribution.description,
|
|
190
|
+
arrangement: contribution.id,
|
|
191
|
+
...(contribution.requires ? { requires: contribution.requires } : {}),
|
|
192
|
+
...(contribution.regions ? { regions: contribution.regions } : {}),
|
|
193
|
+
...(contribution.areas ? { areas: contribution.areas } : {}),
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
contributedWorkspaces.set(contribution.id, entry);
|
|
197
|
+
registryVersion++;
|
|
198
|
+
for (const listener of registryListeners) listener();
|
|
199
|
+
if (_provisional) setEditorWorkspace(defaultEditorWorkspace(), { provisional: true });
|
|
200
|
+
// A CONTRIBUTION THAT ARRIVES UNDER THE ACTIVE WORKSPACE'S OWN ID republishes
|
|
201
|
+
// it: the per-project restore picks a workspace by id at boot, before the
|
|
202
|
+
// package that DEFINES it has loaded, so its regions and its areas were both
|
|
203
|
+
// read off a descriptor that did not exist yet.
|
|
204
|
+
//
|
|
205
|
+
// THE TEST IS UNCONDITIONAL, and it was an `else if` until 2026-09-20, which
|
|
206
|
+
// is a defect the Timeline's first walk found: a PROVISIONAL session whose
|
|
207
|
+
// default workspace is ALREADY this id takes the branch above, and
|
|
208
|
+
// `setEditorWorkspace` returns early on an unchanged id — so the publish
|
|
209
|
+
// never ran and the workspace stood up with its regions and its AREAS
|
|
210
|
+
// unread. Measured on a `--template models` scaffold: `model` is the
|
|
211
|
+
// provisional default, `@volter/editor-blender` registers it a moment later, and its
|
|
212
|
+
// Timeline area simply did not open. The two branches answer different
|
|
213
|
+
// questions ("did the default change?" and "is this contribution the active
|
|
214
|
+
// workspace?") and only the second one decides whether to publish.
|
|
215
|
+
if (activeEditorWorkspace() === contribution.id) publishWorkspaceRegions();
|
|
216
|
+
return () => {
|
|
217
|
+
if (contributedWorkspaces.get(contribution.id) !== entry) return;
|
|
218
|
+
contributedWorkspaces.delete(contribution.id);
|
|
219
|
+
registryVersion++;
|
|
220
|
+
for (const listener of registryListeners) listener();
|
|
221
|
+
if (activeEditorWorkspace() === contribution.id)
|
|
222
|
+
setEditorWorkspace(defaultEditorWorkspace(), { provisional: true });
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function editorWorkspaceIds(): readonly EditorWorkspaceId[] {
|
|
227
|
+
return editorWorkspaces().map((entry) => entry.id);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function isEditorWorkspaceId(value: unknown): value is EditorWorkspaceId {
|
|
231
|
+
return (
|
|
232
|
+
typeof value === 'string' &&
|
|
233
|
+
(layoutPolicy()?.arrangement?.id === value ||
|
|
234
|
+
editorWorkspaces().some((entry) => entry.id === value))
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function editorWorkspaceDescriptor(
|
|
239
|
+
id: EditorWorkspaceId,
|
|
240
|
+
): EditorWorkspaceDescriptor | undefined {
|
|
241
|
+
const registered = editorWorkspaces().find((entry) => entry.id === id);
|
|
242
|
+
const arrangement = layoutPolicy()?.arrangement;
|
|
243
|
+
if (arrangement?.id === id)
|
|
244
|
+
// THE PROJECT'S LAYOUT POLICY OVERRIDES THE TITLE AND THE REGIONS; IT DOES
|
|
245
|
+
// NOT REPLACE THE WORKSPACE. This branch used to synthesize a descriptor
|
|
246
|
+
// from the policy alone, which SILENTLY DROPPED the contributed
|
|
247
|
+
// workspace's `areas` — the Timeline's first walk found it (2026-09-20):
|
|
248
|
+
// on a `--template models` scaffold the project's arrangement id IS
|
|
249
|
+
// `model`, so `@volter/editor-blender`'s Model workspace was resolved through here
|
|
250
|
+
// and its bottom Timeline area was never published, while `uv-editing` —
|
|
251
|
+
// which no project names as its arrangement — worked. A policy says how a
|
|
252
|
+
// project wants its chrome laid out; which EDITORS a workspace opens is
|
|
253
|
+
// the contribution's, and nothing in a project's layout policy can even
|
|
254
|
+
// spell one.
|
|
255
|
+
return {
|
|
256
|
+
...(registered ?? {}),
|
|
257
|
+
id,
|
|
258
|
+
title: arrangement.title,
|
|
259
|
+
description: 'Project layout',
|
|
260
|
+
arrangement: id,
|
|
261
|
+
...(arrangement.regions ? { regions: arrangement.regions } : {}),
|
|
262
|
+
};
|
|
263
|
+
return registered;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** `game` IS today's editor: its shipped "preset" is simply the layout the
|
|
267
|
+
* reconcile already builds, so an existing project sees no change at all.
|
|
268
|
+
* It is the default for every project that MOUNTS something; the default
|
|
269
|
+
* for a project that declares no roots is the first workspace whose
|
|
270
|
+
* requirement it meets ({@link defaultEditorWorkspace}). */
|
|
271
|
+
export const DEFAULT_EDITOR_WORKSPACE: EditorWorkspaceId = 'look';
|
|
272
|
+
|
|
273
|
+
/** Does `id`'s workspace apply to the active project's declared shape? */
|
|
274
|
+
export function workspaceApplies(id: EditorWorkspaceId): boolean {
|
|
275
|
+
const entry = editorWorkspaces().find((candidate) => candidate.id === id);
|
|
276
|
+
if (!entry?.requires) return true;
|
|
277
|
+
if (entry.requires === 'mounts') return projectMounts();
|
|
278
|
+
return projectDeclaresDocumentKind(entry.requires.documentKind);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* The workspace a project opens in when this checkout has none recorded, in
|
|
283
|
+
* order of who said it:
|
|
284
|
+
*
|
|
285
|
+
* 1. THE PROJECT — its `editor.workspace` in `vgai.adapter.ts`, or an imported
|
|
286
|
+
* arrangement's id, when the project's shape meets it;
|
|
287
|
+
* 2. THE PRODUCT — `frame/product.ts`'s `workspace`. A product is
|
|
288
|
+
* composition-scoped (ARCHITECTURE-CORE §The target shape, rule 3), and
|
|
289
|
+
* which workspace its editor opens in is exactly that kind of choice: the
|
|
290
|
+
* game editor opens in Game, the model editor in Model;
|
|
291
|
+
* 3. registry order — the first workspace whose requirement this project
|
|
292
|
+
* meets, which is what a host with no product composed answers.
|
|
293
|
+
*
|
|
294
|
+
* Registry order is a poor THIRD and was a poor FIRST: contributions come in
|
|
295
|
+
* load order, so two packages that both register an unconditional workspace
|
|
296
|
+
* made the default a race. The product naming one is what settles it.
|
|
297
|
+
*/
|
|
298
|
+
export function defaultEditorWorkspace(): EditorWorkspaceId {
|
|
299
|
+
const declared = layoutPolicy()?.arrangement?.id ?? adapterEditorConfiguration().workspace;
|
|
300
|
+
if (isEditorWorkspaceId(declared) && workspaceApplies(declared)) return declared;
|
|
301
|
+
const product = activeProduct()?.workspace;
|
|
302
|
+
if (product !== undefined && isEditorWorkspaceId(product) && workspaceApplies(product))
|
|
303
|
+
return product;
|
|
304
|
+
return (
|
|
305
|
+
editorWorkspaces().find((entry) => workspaceApplies(entry.id))?.id ?? DEFAULT_EDITOR_WORKSPACE
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
let _workspace: EditorWorkspaceId = DEFAULT_EDITOR_WORKSPACE;
|
|
310
|
+
/** Whether the active workspace was a FALLBACK (nothing recorded for this
|
|
311
|
+
* checkout, nothing declared by the adapter) rather than a choice — a
|
|
312
|
+
* contribution registering later may improve on a fallback, never on a
|
|
313
|
+
* choice. */
|
|
314
|
+
let _provisional = true;
|
|
315
|
+
const _listeners = new Set<() => void>();
|
|
316
|
+
|
|
317
|
+
/** Current workspace id (`useSyncExternalStore`-shaped snapshot). */
|
|
318
|
+
export function activeEditorWorkspace(): EditorWorkspaceId {
|
|
319
|
+
return _workspace;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Switch workspaces. EXPLICIT ACTS ONLY (see the module header) — the menu,
|
|
324
|
+
* the registered actions, the `editor.workspace(id)` session operation, and
|
|
325
|
+
* the per-project restore at boot.
|
|
326
|
+
*/
|
|
327
|
+
/** The active workspace's region choices (see {@link EditorWorkspaceRegions}). */
|
|
328
|
+
export function activeWorkspaceRegions(): EditorWorkspaceRegions {
|
|
329
|
+
return editorWorkspaceDescriptor(activeEditorWorkspace())?.regions ?? {};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** The active workspace's EDITOR AREAS (see {@link EditorWorkspaceDescriptor.areas}). */
|
|
333
|
+
export function activeWorkspaceAreaContributions(): NonNullable<
|
|
334
|
+
WorkspaceLayoutContribution['areas']
|
|
335
|
+
> {
|
|
336
|
+
return editorWorkspaceDescriptor(activeEditorWorkspace())?.areas ?? [];
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** Push the active workspace's regions into the store the host regions read
|
|
340
|
+
* (`workspace-regions.ts`) — on every switch, and once at load for the
|
|
341
|
+
* restored workspace — and its AREAS into `workspace-areas.ts`, which opens
|
|
342
|
+
* the documents they name. The two travel together on purpose: they are the
|
|
343
|
+
* two halves of "apply this workspace", and a caller that could do one
|
|
344
|
+
* without the other is how a workspace ends up with a group and no editor
|
|
345
|
+
* in it. */
|
|
346
|
+
function publishWorkspaceRegions(): void {
|
|
347
|
+
setWorkspaceRegions(activeWorkspaceRegions());
|
|
348
|
+
setWorkspaceAreas(activeWorkspaceAreaContributions());
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export function setEditorWorkspace(
|
|
352
|
+
id: EditorWorkspaceId,
|
|
353
|
+
options: { readonly provisional?: boolean } = {},
|
|
354
|
+
): void {
|
|
355
|
+
_provisional = options.provisional === true;
|
|
356
|
+
if (_workspace === id) return;
|
|
357
|
+
_workspace = id;
|
|
358
|
+
for (const listener of _listeners) listener();
|
|
359
|
+
publishWorkspaceRegions();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function subscribeEditorWorkspace(listener: () => void): () => void {
|
|
363
|
+
_listeners.add(listener);
|
|
364
|
+
return () => _listeners.delete(listener);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** The cycle action's step, in registry order and wrapping both ways. */
|
|
368
|
+
export function cycleEditorWorkspace(step: 1 | -1): EditorWorkspaceId {
|
|
369
|
+
// Only the workspaces the project's declared shape meets take part.
|
|
370
|
+
const ids = editorWorkspaceIds().filter(workspaceApplies);
|
|
371
|
+
const index = ids.indexOf(activeEditorWorkspace());
|
|
372
|
+
const next = ids[(index + step + ids.length) % ids.length] ?? defaultEditorWorkspace();
|
|
373
|
+
setEditorWorkspace(next);
|
|
374
|
+
return next;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// ---- "the workspace has been applied" -------------------------------------
|
|
378
|
+
// A workspace switch is a store flip; the surfaces it names re-render on the
|
|
379
|
+
// next paint. That is invisible to a scripted caller, so `editor.workspace(id)`
|
|
380
|
+
// must be able to ack the ARRANGEMENT rather than the intent — otherwise the
|
|
381
|
+
// very next screenshot photographs the outgoing one. The layout host calls
|
|
382
|
+
// {@link notifyEditorWorkspaceApplied} once it has committed the new
|
|
383
|
+
// workspace's documents (`frame/bridge.tsx`'s workspace effect); the frame
|
|
384
|
+
// sizes its editor groups from the same registry change, in the same beat.
|
|
385
|
+
|
|
386
|
+
const _appliedWaiters = new Set<() => void>();
|
|
387
|
+
|
|
388
|
+
export function notifyEditorWorkspaceApplied(): void {
|
|
389
|
+
const waiters = [..._appliedWaiters];
|
|
390
|
+
_appliedWaiters.clear();
|
|
391
|
+
for (const resolve of waiters) resolve();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/** Resolves on the NEXT applied workspace. Call BEFORE the store flip. */
|
|
395
|
+
export function whenEditorWorkspaceApplied(): Promise<void> {
|
|
396
|
+
return new Promise((resolve) => _appliedWaiters.add(resolve));
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export function __resetEditorWorkspaceForTest(): void {
|
|
400
|
+
_workspace = DEFAULT_EDITOR_WORKSPACE;
|
|
401
|
+
_listeners.clear();
|
|
402
|
+
_appliedWaiters.clear();
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// The restored workspace's regions are live before the first render.
|
|
406
|
+
publishWorkspaceRegions();
|
|
407
|
+
|
|
408
|
+
// A project that declares a different shape than the workspace it was left in
|
|
409
|
+
// (a zero-root folder reopened from a Game-workspace record, or the reverse)
|
|
410
|
+
// moves to the first workspace its shape meets — one of the explicit acts the
|
|
411
|
+
// module header allows, and the one that lets chrome follow declarations.
|
|
412
|
+
subscribeProjectShape(() => {
|
|
413
|
+
if (!workspaceApplies(_workspace)) setEditorWorkspace(defaultEditorWorkspace());
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// An imported layout may change its region choices without remounting.
|
|
417
|
+
subscribeLayoutPolicy(publishWorkspaceRegions);
|
|
418
|
+
|
|
419
|
+
// A product composes before it mounts, but this module is in its import graph
|
|
420
|
+
// and therefore evaluates first — so the product's own default arrives after
|
|
421
|
+
// this module's provisional choice and re-runs it, exactly as a late
|
|
422
|
+
// contribution does.
|
|
423
|
+
subscribeActiveProduct(() => {
|
|
424
|
+
if (_provisional) setEditorWorkspace(defaultEditorWorkspace(), { provisional: true });
|
|
425
|
+
});
|