@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,536 @@
|
|
|
1
|
+
import {
|
|
2
|
+
openAvailableWorkspaceDocument,
|
|
3
|
+
requestAvailableWorkspaceDocument,
|
|
4
|
+
} from './workspace-available-documents';
|
|
5
|
+
/**
|
|
6
|
+
* PERSISTED WORKSPACE STATE: which named workspace the project was left in,
|
|
7
|
+
* which documents were open, which one was in front, and each kind's own
|
|
8
|
+
* session cell. Restored on boot, written through (debounced) on every change.
|
|
9
|
+
* Manual hierarchy openness is NOT here - it persists in its own store
|
|
10
|
+
* (`hierarchy-expansion-state.ts`), same key discipline.
|
|
11
|
+
*
|
|
12
|
+
* NO GEOMETRY LIVES HERE, and that is the whole shape of this module. Where a
|
|
13
|
+
* document is DRAWN - groups, sizes, tab order, split geometry - is the
|
|
14
|
+
* workbench's own editor-group state, which VS Code persists itself. This
|
|
15
|
+
* module records the SET and nothing about its arrangement; a reload reopens
|
|
16
|
+
* the same documents into whatever grid the workbench restored. Geometry that
|
|
17
|
+
* two owners both record is geometry they can disagree about, and the
|
|
18
|
+
* workbench is the one that draws it.
|
|
19
|
+
*
|
|
20
|
+
* STORAGE DECISION (owner ruling, 2026-09-04 - ARCHITECTURE-CORE §Editor
|
|
21
|
+
* chrome, "Settings have four layers with named homes"): the `workspace`
|
|
22
|
+
* SECTION of the project-local document (`project-local-state.ts`), which is
|
|
23
|
+
* `.vgai/editor-state.json` - git-ignored by the scaffold, written by the
|
|
24
|
+
* editor server locally, keyed by the folder itself.
|
|
25
|
+
*
|
|
26
|
+
* DOCUMENTS: THIS MODULE NAMES NONE OF THEM. It stores, per open document, an
|
|
27
|
+
* OPAQUE blob under that document's KIND and ID - whatever the descriptor's
|
|
28
|
+
* own `persist` returns - and on the next boot hands each blob back to the
|
|
29
|
+
* kind's registered restorer (`workspace-document-restore.ts`). The rule
|
|
30
|
+
* "persist+restore only documents that can truthfully reopen - verify on
|
|
31
|
+
* restore, drop silently if gone" is unchanged; every kind owns its own
|
|
32
|
+
* answer:
|
|
33
|
+
*
|
|
34
|
+
* - a document that nothing at boot re-derives, and whose subject is a
|
|
35
|
+
* stable addressable state, declares `persist` and verifies itself on the
|
|
36
|
+
* way back (`restore` answering `false` is the whole drop mechanism);
|
|
37
|
+
* - a document something else reopens unconditionally, and one whose subject
|
|
38
|
+
* is a live session or an unresolved remote view, declares no `persist` at
|
|
39
|
+
* all, and simply does not come back.
|
|
40
|
+
*
|
|
41
|
+
* A kind with NO restorer registered - a module that is gone, a package this
|
|
42
|
+
* project no longer depends on, a record another build wrote - restores
|
|
43
|
+
* nothing, silently. That is the entire compatibility rule for a document's
|
|
44
|
+
* blob. The RECORD around it carries one number,
|
|
45
|
+
* {@link WORKSPACE_STATE_VERSION}, and a record written in any other shape is
|
|
46
|
+
* read as no record at all: no migration, no dual-read, no compat branch.
|
|
47
|
+
*
|
|
48
|
+
* CONTRIBUTIONS LOAD FIRST, AND BEFORE THE CLOCK STARTS. A restorer usually
|
|
49
|
+
* belongs to the module that opens the kind, and that module can be a
|
|
50
|
+
* package's - whose code loads on the contribution pass, which
|
|
51
|
+
* `project-tool-discovery.ts` defers behind the opening viewport frame. So a
|
|
52
|
+
* record with any open document awaits ONE contribution pass first, which is
|
|
53
|
+
* that module's header's sanctioned exception to its own deferral. It cannot
|
|
54
|
+
* deadlock: the deferral lives in the discovery LIFECYCLE, not in
|
|
55
|
+
* `refreshProjectToolContributions` itself. Without it the host would drop a
|
|
56
|
+
* package's documents on every boot and silently call it a verification
|
|
57
|
+
* failure. That load is NOT inside `RESTORE_TIMEOUT_MS`: it is a known startup
|
|
58
|
+
* cost (9s on a cold `full` scaffold, measured 2026-09-18), not the hung fetch
|
|
59
|
+
* the bound guards, and counting it made the bound fire on every boot.
|
|
60
|
+
*
|
|
61
|
+
* Write-through is debounced (300ms trailing) and flushed on `pagehide`, so
|
|
62
|
+
* an immediate reload still captures the last change. Subscriptions install
|
|
63
|
+
* only AFTER the async restore finishes - a half-restored open-set must
|
|
64
|
+
* never overwrite the stored one. That wait is BOUNDED (`RESTORE_TIMEOUT_MS`):
|
|
65
|
+
* a hung verification fetch (e.g. a stalled asset-existence probe) must never
|
|
66
|
+
* block write-through + pagehide-flush installation for the whole session -
|
|
67
|
+
* open-tab state is convenience state, not project truth, so availability
|
|
68
|
+
* beats completeness here. If the restore itself keeps running past the
|
|
69
|
+
* timeout, its later document-opens still land normally; only the
|
|
70
|
+
* subscription install is time-boxed, not the restore itself.
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
import { editorViewFromUrl } from '@volter/editor-sdk';
|
|
74
|
+
import { projectAdapterFacet, waitForProjectAdapter } from './project-adapter';
|
|
75
|
+
import {
|
|
76
|
+
preloadProjectLocalState,
|
|
77
|
+
projectLocalSection,
|
|
78
|
+
projectLocalStateReady,
|
|
79
|
+
writeProjectLocalSection,
|
|
80
|
+
} from './project-local-state';
|
|
81
|
+
import { getCurrentProject } from './project-manager';
|
|
82
|
+
import { refreshProjectToolContributions } from './tool-loader';
|
|
83
|
+
import { PINNED_ASYNC_DOCUMENT_IDS } from './workspace-document-ids';
|
|
84
|
+
import {
|
|
85
|
+
activateWorkspaceDocument,
|
|
86
|
+
activeWorkspaceDocumentId,
|
|
87
|
+
type OpenWorkspaceDocument,
|
|
88
|
+
openWorkspaceDocuments,
|
|
89
|
+
restorePinnedWorkspaceDocumentActivation,
|
|
90
|
+
subscribeWorkspaceDocuments,
|
|
91
|
+
} from './workspace-document-registry';
|
|
92
|
+
import {
|
|
93
|
+
type WorkspaceStateStore,
|
|
94
|
+
workspaceDocumentRestorerEntries,
|
|
95
|
+
workspaceDocumentRestorers,
|
|
96
|
+
} from './workspace-document-restore';
|
|
97
|
+
import { isWorkspacePersistenceSuppressed } from './workspace-persistence-gate';
|
|
98
|
+
import {
|
|
99
|
+
activeEditorWorkspace,
|
|
100
|
+
defaultEditorWorkspace,
|
|
101
|
+
type EditorWorkspaceId,
|
|
102
|
+
isEditorWorkspaceId,
|
|
103
|
+
setEditorWorkspace,
|
|
104
|
+
workspaceApplies,
|
|
105
|
+
} from './workspace-presets';
|
|
106
|
+
|
|
107
|
+
interface WorkspaceRestoreEpoch {
|
|
108
|
+
readonly generation: number;
|
|
109
|
+
readonly promise: Promise<void>;
|
|
110
|
+
active: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let workspaceRestoreGeneration = 0;
|
|
114
|
+
let currentWorkspaceRestore: WorkspaceRestoreEpoch | null = null;
|
|
115
|
+
const workspaceRestoreWaiters = new Set<(epoch: WorkspaceRestoreEpoch) => void>();
|
|
116
|
+
|
|
117
|
+
function publishWorkspaceRestore(promise: Promise<void>): WorkspaceRestoreEpoch {
|
|
118
|
+
const epoch: WorkspaceRestoreEpoch = {
|
|
119
|
+
generation: ++workspaceRestoreGeneration,
|
|
120
|
+
promise,
|
|
121
|
+
active: true,
|
|
122
|
+
};
|
|
123
|
+
currentWorkspaceRestore = epoch;
|
|
124
|
+
for (const resolve of workspaceRestoreWaiters) resolve(epoch);
|
|
125
|
+
workspaceRestoreWaiters.clear();
|
|
126
|
+
return epoch;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function nextWorkspaceRestore(): Promise<WorkspaceRestoreEpoch> {
|
|
130
|
+
const current = currentWorkspaceRestore;
|
|
131
|
+
if (current?.active) return Promise.resolve(current);
|
|
132
|
+
return new Promise((resolve) => workspaceRestoreWaiters.add(resolve));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** URL presentation waits for local convenience state so the explicit link wins. */
|
|
136
|
+
export async function waitForWorkspaceStateRestore(): Promise<void> {
|
|
137
|
+
// The workspace installs persistence when it mounts. A generation gate,
|
|
138
|
+
// rather than an elapsed-time poll, makes a remount deterministic: a waiter
|
|
139
|
+
// that observes a disposed epoch follows the next install, and a newer epoch
|
|
140
|
+
// that appeared while it awaited is also joined. This is what prevents URL
|
|
141
|
+
// presentation from racing a stale generation on a fast reload.
|
|
142
|
+
for (;;) {
|
|
143
|
+
const epoch = await nextWorkspaceRestore();
|
|
144
|
+
await epoch.promise;
|
|
145
|
+
if (currentWorkspaceRestore === epoch && epoch.active) return;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* THE SHAPE of the record this module writes, as ONE number. A record whose
|
|
151
|
+
* `version` is not exactly this is read as absent: the project opens on its
|
|
152
|
+
* default document and the next write-through replaces it. An open set is
|
|
153
|
+
* convenience state, so a shape change memory-holes it — no migration, no
|
|
154
|
+
* dual-read, no compat branch (ARCHITECTURE-CORE §Removal doctrine, §Editor
|
|
155
|
+
* chrome "memory-holed, never migrated").
|
|
156
|
+
*
|
|
157
|
+
* The shape this number names: `{ version, workspace?, documents?: { open:
|
|
158
|
+
* { kind, id, state }[], activeId, kinds? } }`. Change any
|
|
159
|
+
* of it — a key's name, a nesting, what a value means — and bump this in the
|
|
160
|
+
* same commit, because nothing else lets the reader tell a stale record from a
|
|
161
|
+
* current one.
|
|
162
|
+
*/
|
|
163
|
+
const WORKSPACE_STATE_VERSION = 15;
|
|
164
|
+
const WRITE_DEBOUNCE_MS = 300;
|
|
165
|
+
/** Bound on the document-restore verification before write-through installs
|
|
166
|
+
* anyway (module header's "wait is BOUNDED" rule). */
|
|
167
|
+
const RESTORE_TIMEOUT_MS = 10_000;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* One persisted, restorable document: the KIND that owns it, its id, and that
|
|
171
|
+
* kind's own opaque blob. This module never looks inside `state`.
|
|
172
|
+
*/
|
|
173
|
+
export interface PersistedDocument {
|
|
174
|
+
readonly kind: string;
|
|
175
|
+
readonly id: string;
|
|
176
|
+
readonly state: unknown;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** The section of the project-local document this module owns. */
|
|
180
|
+
const WORKSPACE_SECTION = 'workspace';
|
|
181
|
+
|
|
182
|
+
export interface PersistedWorkspaceState {
|
|
183
|
+
/** {@link WORKSPACE_STATE_VERSION} as of the write. Any other value — including
|
|
184
|
+
* a record written before this field existed — is read as no record at all. */
|
|
185
|
+
readonly version: number;
|
|
186
|
+
// A `chat` field lived here until phase 1 unit 21 — one optional static
|
|
187
|
+
// panel's collapsed/surface choice, which made this module import
|
|
188
|
+
// `harness-chat-layout.ts` by name to save it. A static panel's OWNER keeps
|
|
189
|
+
// its own state now, in its own section of the same project-local document
|
|
190
|
+
// (`project-local-state.ts`), and the host persists only the workspace.
|
|
191
|
+
/** The active NAMED WORKSPACE, restored BEFORE layout restore: it selects
|
|
192
|
+
* which `workspaces` entry the layout restore reads. */
|
|
193
|
+
readonly workspace?: EditorWorkspaceId;
|
|
194
|
+
readonly documents?: {
|
|
195
|
+
open: PersistedDocument[];
|
|
196
|
+
activeId: string | null;
|
|
197
|
+
/** Per-KIND session state (`persistKindState`) — what belongs to a kind
|
|
198
|
+
* rather than to one open document, such as a discovery baseline that
|
|
199
|
+
* must survive a full reload. One cell per kind, opaque here. */
|
|
200
|
+
kinds?: Record<string, unknown>;
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** This project's persisted workspace state — the `workspace` section of the
|
|
205
|
+
* project-local document (`project-local-state.ts`), or `null` when the
|
|
206
|
+
* project has never arranged anything AND when what it arranged was written in
|
|
207
|
+
* another shape ({@link WORKSPACE_STATE_VERSION}). Exported for tests. */
|
|
208
|
+
export function readPersistedWorkspaceState(): PersistedWorkspaceState | null {
|
|
209
|
+
const section = projectLocalSection<PersistedWorkspaceState>(WORKSPACE_SECTION);
|
|
210
|
+
if (!section || section.version !== WORKSPACE_STATE_VERSION) return null;
|
|
211
|
+
return section;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function writePersistedWorkspaceState(state: PersistedWorkspaceState): void {
|
|
215
|
+
writeProjectLocalSection(WORKSPACE_SECTION, state);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Serialize the restorable half of one open document through the kind's own
|
|
220
|
+
* `persist` door, or `null` when this document does not persist. A throwing
|
|
221
|
+
* contribution is treated as "does not persist" — the shell must never crash
|
|
222
|
+
* on one. Exported for tests.
|
|
223
|
+
*/
|
|
224
|
+
export function persistableDocument(doc: OpenWorkspaceDocument): PersistedDocument | null {
|
|
225
|
+
const { descriptor } = doc;
|
|
226
|
+
if (!descriptor.persist) return null;
|
|
227
|
+
let state: unknown;
|
|
228
|
+
try {
|
|
229
|
+
state = descriptor.persist({ id: descriptor.id, title: doc.title });
|
|
230
|
+
} catch {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
if (state === undefined || state === null) return null;
|
|
234
|
+
return { kind: descriptor.kind, id: descriptor.id, state };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Every registered kind's own session state, keyed by kind. Two restorers
|
|
238
|
+
* sharing one kind share the cell, in registration order — a kind is one
|
|
239
|
+
* subject, so its session state is one value. */
|
|
240
|
+
function persistedKindStates(): Record<string, unknown> | undefined {
|
|
241
|
+
const states: Record<string, unknown> = {};
|
|
242
|
+
let any = false;
|
|
243
|
+
for (const restorer of workspaceDocumentRestorerEntries()) {
|
|
244
|
+
if (!restorer.persistKindState) continue;
|
|
245
|
+
let value: unknown;
|
|
246
|
+
try {
|
|
247
|
+
value = restorer.persistKindState();
|
|
248
|
+
} catch {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (value === undefined || value === null) continue;
|
|
252
|
+
states[restorer.kind] = value;
|
|
253
|
+
any = true;
|
|
254
|
+
}
|
|
255
|
+
return any ? states : undefined;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Snapshot the CURRENT session state: which named workspace is active, which
|
|
260
|
+
* documents are open, which one is in front, and each kind's own session cell.
|
|
261
|
+
*
|
|
262
|
+
* NO GEOMETRY. Where each document is DRAWN is the workbench's editor-group
|
|
263
|
+
* state, which VS Code persists itself; this module records only the SET, and
|
|
264
|
+
* that is what makes a reload reopen the same documents in whatever grid the
|
|
265
|
+
* workbench restored.
|
|
266
|
+
*/
|
|
267
|
+
export function snapshotWorkspaceState(): PersistedWorkspaceState {
|
|
268
|
+
const open: PersistedDocument[] = [];
|
|
269
|
+
for (const doc of openWorkspaceDocuments()) {
|
|
270
|
+
const persisted = persistableDocument(doc);
|
|
271
|
+
if (persisted) open.push(persisted);
|
|
272
|
+
}
|
|
273
|
+
const kinds = persistedKindStates();
|
|
274
|
+
return {
|
|
275
|
+
version: WORKSPACE_STATE_VERSION,
|
|
276
|
+
workspace: activeEditorWorkspace(),
|
|
277
|
+
documents: {
|
|
278
|
+
open,
|
|
279
|
+
activeId: activeWorkspaceDocumentId(),
|
|
280
|
+
...(kinds ? { kinds } : {}),
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Reopen ONE persisted document through its kind's registered restorers, in
|
|
287
|
+
* registration order, until one answers that it could. Returns whether any
|
|
288
|
+
* CLAIMED it — a claim is not the same as being open, because a kind may
|
|
289
|
+
* reopen asynchronously (it activates itself in that case; see
|
|
290
|
+
* `WorkspaceDocumentRestoreContext.active`).
|
|
291
|
+
*
|
|
292
|
+
* An unknown kind has no restorers and is dropped silently, which is also
|
|
293
|
+
* what a record written before this shape existed gets.
|
|
294
|
+
*/
|
|
295
|
+
async function restoreOneDocument(
|
|
296
|
+
store: WorkspaceStateStore,
|
|
297
|
+
doc: PersistedDocument,
|
|
298
|
+
activeId: string | null,
|
|
299
|
+
): Promise<boolean> {
|
|
300
|
+
for (const restorer of workspaceDocumentRestorers(doc.kind)) {
|
|
301
|
+
try {
|
|
302
|
+
const claimed = await restorer.restore({
|
|
303
|
+
id: doc.id,
|
|
304
|
+
state: doc.state,
|
|
305
|
+
active: doc.id === activeId,
|
|
306
|
+
store,
|
|
307
|
+
});
|
|
308
|
+
if (claimed) return true;
|
|
309
|
+
} catch {
|
|
310
|
+
// Drop silently — a document that cannot truthfully reopen is gone.
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** Restore an active id now, or hand a stable async board id to the document
|
|
317
|
+
* registry so its later project-owned registration completes the request. */
|
|
318
|
+
function restoreActiveDocument(id: string | null): boolean {
|
|
319
|
+
if (!id) return false;
|
|
320
|
+
if (openAvailableWorkspaceDocument(id)) return true;
|
|
321
|
+
if (PINNED_ASYNC_DOCUMENT_IDS.has(id)) {
|
|
322
|
+
requestAvailableWorkspaceDocument(id);
|
|
323
|
+
restorePinnedWorkspaceDocumentActivation(id);
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
return activateWorkspaceDocument(id);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/** Tell every registered kind the session is beginning, with its own session
|
|
330
|
+
* state and whether there is any persisted document to bring back. A throwing
|
|
331
|
+
* contribution must never take the workspace down with it. */
|
|
332
|
+
function beginKindRestores(
|
|
333
|
+
store: WorkspaceStateStore,
|
|
334
|
+
docs: PersistedWorkspaceState['documents'],
|
|
335
|
+
): void {
|
|
336
|
+
const kinds = docs?.kinds ?? {};
|
|
337
|
+
// NOT `docs !== undefined`. A record that lists NO open document is the same
|
|
338
|
+
// fact as no record at all for every kind that reads this: nothing is coming
|
|
339
|
+
// back, so the project's own default document is what the workspace opens on
|
|
340
|
+
// (see `WorkspaceDocumentKindRestoreContext.hasDocumentsToRestore`).
|
|
341
|
+
const hasDocumentsToRestore = (docs?.open.length ?? 0) > 0;
|
|
342
|
+
for (const restorer of workspaceDocumentRestorerEntries()) {
|
|
343
|
+
if (!restorer.beginRestore) continue;
|
|
344
|
+
try {
|
|
345
|
+
restorer.beginRestore({ state: kinds[restorer.kind], hasDocumentsToRestore, store });
|
|
346
|
+
} catch {
|
|
347
|
+
// Same failure physics as every other contribution call here.
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Settle the sources every present kind verifies against, ONCE — deduped by
|
|
353
|
+
* function identity, so two kinds reading one registry refresh it once (a
|
|
354
|
+
* second concurrent refresh would abort the first). */
|
|
355
|
+
function settleKindSources(open: readonly PersistedDocument[]): Promise<unknown> {
|
|
356
|
+
const prepares = new Set<() => Promise<void>>();
|
|
357
|
+
for (const doc of open) {
|
|
358
|
+
for (const restorer of workspaceDocumentRestorers(doc.kind)) {
|
|
359
|
+
if (restorer.prepare) prepares.add(restorer.prepare);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return Promise.all([...prepares].map((prepare) => prepare().catch(() => {})));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Restore the persisted open documents + active document (exported for
|
|
367
|
+
* tests). Every registered kind first hears the session begin — with its own
|
|
368
|
+
* session state and whether this project has a record at all — then the kinds
|
|
369
|
+
* actually present settle their sources ONCE (`prepare`, deduped by function
|
|
370
|
+
* identity so two kinds reading one registry refresh it once), and finally
|
|
371
|
+
* each document reopens in the original tab order against a settled store.
|
|
372
|
+
*/
|
|
373
|
+
export async function restoreWorkspaceDocuments(
|
|
374
|
+
store: WorkspaceStateStore,
|
|
375
|
+
persisted: PersistedWorkspaceState | null,
|
|
376
|
+
): Promise<void> {
|
|
377
|
+
const docs = persisted?.documents;
|
|
378
|
+
beginKindRestores(store, docs);
|
|
379
|
+
if (!docs || docs.open.length === 0) {
|
|
380
|
+
// Project-owned pinned boards register after async authoring bootstrap.
|
|
381
|
+
// Preserve their requested activation until that stable descriptor opens;
|
|
382
|
+
// arbitrary missing ids still reject rather than becoming latent state.
|
|
383
|
+
restoreActiveDocument(docs?.activeId ?? null);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
await settleKindSources(docs.open);
|
|
387
|
+
for (const doc of docs.open) {
|
|
388
|
+
await restoreOneDocument(store, doc, docs.activeId);
|
|
389
|
+
}
|
|
390
|
+
// Restore the saved active tab when available. Otherwise retain the
|
|
391
|
+
// registry's selection from opening the surviving documents (or no active
|
|
392
|
+
// document when none opened). A restorer that claimed the active document
|
|
393
|
+
// asynchronously activates it when ready; no particular document is required.
|
|
394
|
+
restoreActiveDocument(docs.activeId);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Install workspace-state persistence for this session:
|
|
399
|
+
* 1. apply the named workspace the project was left in;
|
|
400
|
+
* 2. restore its open documents (async, verified - module header rules);
|
|
401
|
+
* 3. subscribe write-through (debounced 300ms, flushed on pagehide).
|
|
402
|
+
* Returns a teardown (unsubscribes; flushes a pending write).
|
|
403
|
+
*/
|
|
404
|
+
export function installWorkspaceStatePersistence(store: WorkspaceStateStore): () => void {
|
|
405
|
+
// The project-local document is loaded when the project became active; on a
|
|
406
|
+
// boot where the workspace mounts first, the restore epoch published here
|
|
407
|
+
// spans the load, so `waitForWorkspaceStateRestore` still waits for what is
|
|
408
|
+
// actually on disk.
|
|
409
|
+
if (!projectLocalStateReady() || (getCurrentProject() && !projectAdapterFacet())) {
|
|
410
|
+
let disposed = false;
|
|
411
|
+
let inner: (() => void) | null = null;
|
|
412
|
+
let settle: () => void = () => {};
|
|
413
|
+
const gate = new Promise<void>((resolve) => {
|
|
414
|
+
settle = resolve;
|
|
415
|
+
});
|
|
416
|
+
const epoch = publishWorkspaceRestore(gate);
|
|
417
|
+
void Promise.all([preloadProjectLocalState(), waitForProjectAdapter()]).then(() => {
|
|
418
|
+
if (disposed) {
|
|
419
|
+
settle();
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
inner = installWorkspaceStatePersistence(store);
|
|
423
|
+
// The inner install published its own epoch; this outer one steps
|
|
424
|
+
// aside and settles once that one does.
|
|
425
|
+
epoch.active = false;
|
|
426
|
+
void waitForWorkspaceStateRestore().finally(settle);
|
|
427
|
+
});
|
|
428
|
+
return () => {
|
|
429
|
+
disposed = true;
|
|
430
|
+
inner?.();
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
const persisted = readPersistedWorkspaceState();
|
|
434
|
+
// The named workspace is applied FIRST: it decides which documents the
|
|
435
|
+
// workspace's own areas open beside the restored set. This is one of the
|
|
436
|
+
// explicit acts allowed to move the workspace (module header of
|
|
437
|
+
// `workspace-presets.ts`) - restoring the session boundary the user left.
|
|
438
|
+
if (
|
|
439
|
+
persisted?.workspace &&
|
|
440
|
+
isEditorWorkspaceId(persisted.workspace) &&
|
|
441
|
+
workspaceApplies(persisted.workspace)
|
|
442
|
+
) {
|
|
443
|
+
setEditorWorkspace(persisted.workspace);
|
|
444
|
+
} else {
|
|
445
|
+
// Nothing recorded for THIS checkout (or a record its shape no longer
|
|
446
|
+
// meets): the project's `editor.workspace` in `vgai.adapter.ts`,
|
|
447
|
+
// else the first workspace its shape meets.
|
|
448
|
+
setEditorWorkspace(defaultEditorWorkspace(), { provisional: true });
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
let disposed = false;
|
|
452
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
453
|
+
const unsubscribers: Array<() => void> = [];
|
|
454
|
+
|
|
455
|
+
const flush = () => {
|
|
456
|
+
if (timer !== null) {
|
|
457
|
+
clearTimeout(timer);
|
|
458
|
+
timer = null;
|
|
459
|
+
}
|
|
460
|
+
// Immersive play-mode chrome hide (`live-transition.ts`) suppresses writes
|
|
461
|
+
// for that play session - a play-time open set is transient presentation,
|
|
462
|
+
// never user intent. The gate also covers the pagehide flush and the
|
|
463
|
+
// teardown flush below. Belt-and-suspenders: also refuse while the store
|
|
464
|
+
// reports play active, so a transient rebuild that desynchronizes the
|
|
465
|
+
// suppression flag mid-play still cannot persist it.
|
|
466
|
+
if (
|
|
467
|
+
isWorkspacePersistenceSuppressed() ||
|
|
468
|
+
(store.playState !== undefined && store.playState !== 'stopped')
|
|
469
|
+
)
|
|
470
|
+
return;
|
|
471
|
+
writePersistedWorkspaceState(snapshotWorkspaceState());
|
|
472
|
+
};
|
|
473
|
+
const schedule = () => {
|
|
474
|
+
if (timer !== null) clearTimeout(timer);
|
|
475
|
+
timer = setTimeout(flush, WRITE_DEBOUNCE_MS);
|
|
476
|
+
};
|
|
477
|
+
const onPageHide = () => flush();
|
|
478
|
+
|
|
479
|
+
// Subscriptions install only after restore settles (module header: a
|
|
480
|
+
// half-restored open-set must never overwrite the stored one). A teardown
|
|
481
|
+
// racing the restore is honored via `disposed`. Bounded by
|
|
482
|
+
// `RESTORE_TIMEOUT_MS`: a hung verification fetch (a stalled asset-existence
|
|
483
|
+
// probe, a network partition on a kind's own `prepare` refresh) must never
|
|
484
|
+
// leave the WHOLE session with no write-through and no pagehide flush -
|
|
485
|
+
// open-tab state is convenience state, availability beats completeness.
|
|
486
|
+
// Whichever settles first wins; if the restore is still running when the
|
|
487
|
+
// timeout fires, its later document-opens still land normally.
|
|
488
|
+
let restoreTimer: ReturnType<typeof setTimeout> | null = null;
|
|
489
|
+
// A share URL is explicit presentation intent: do not reopen locally
|
|
490
|
+
// persisted subjects that could race and overwrite it.
|
|
491
|
+
const hasSharedView =
|
|
492
|
+
typeof window !== 'undefined' && editorViewFromUrl(window.location.href) !== null;
|
|
493
|
+
// A checkout with no record at all still goes through the documents
|
|
494
|
+
// restore: that is where a never-recorded project opens on its default
|
|
495
|
+
// document.
|
|
496
|
+
// THE CONTRIBUTION PASS IS NOT PART OF THE VERIFICATION BOUND. A package
|
|
497
|
+
// owns its documents' restorers as well as their code, so the kinds a
|
|
498
|
+
// record names exist only once contributions have loaded - but that load is
|
|
499
|
+
// a known startup cost (measured 9s on a cold `full` scaffold), not the
|
|
500
|
+
// hung fetch `RESTORE_TIMEOUT_MS` guards against. Counting it against that
|
|
501
|
+
// bound made the bound fire on EVERY boot, which is a mis-set bound rather
|
|
502
|
+
// than a safety net. So: load first, then start the clock.
|
|
503
|
+
const contributionsLoaded =
|
|
504
|
+
hasSharedView || !(persisted?.documents?.open.length ?? 0)
|
|
505
|
+
? Promise.resolve()
|
|
506
|
+
: refreshProjectToolContributions().catch(() => {});
|
|
507
|
+
const restoreSettled = contributionsLoaded
|
|
508
|
+
.then(() => (hasSharedView ? undefined : restoreWorkspaceDocuments(store, persisted)))
|
|
509
|
+
.catch(() => {});
|
|
510
|
+
const restoreTimedOut = new Promise<void>((resolve) => {
|
|
511
|
+
void contributionsLoaded.then(() => {
|
|
512
|
+
if (disposed) return;
|
|
513
|
+
restoreTimer = setTimeout(() => {
|
|
514
|
+
resolve();
|
|
515
|
+
}, RESTORE_TIMEOUT_MS);
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
const restorePromise = Promise.race([restoreSettled, restoreTimedOut]).then(() => {
|
|
519
|
+
if (restoreTimer !== null) clearTimeout(restoreTimer);
|
|
520
|
+
if (disposed) return;
|
|
521
|
+
unsubscribers.push(subscribeWorkspaceDocuments(schedule));
|
|
522
|
+
window.addEventListener('pagehide', onPageHide);
|
|
523
|
+
});
|
|
524
|
+
const restoreEpoch = publishWorkspaceRestore(restorePromise);
|
|
525
|
+
void restorePromise;
|
|
526
|
+
|
|
527
|
+
return () => {
|
|
528
|
+
disposed = true;
|
|
529
|
+
restoreEpoch.active = false;
|
|
530
|
+
if (currentWorkspaceRestore === restoreEpoch) currentWorkspaceRestore = null;
|
|
531
|
+
if (restoreTimer !== null) clearTimeout(restoreTimer);
|
|
532
|
+
for (const unsub of unsubscribers) unsub();
|
|
533
|
+
window.removeEventListener('pagehide', onPageHide);
|
|
534
|
+
if (timer !== null) flush();
|
|
535
|
+
};
|
|
536
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { EditorRegionName, WorkspacePanelGlyphName } from '@volter/editor-sdk/widgets';
|
|
2
|
+
|
|
3
|
+
/** Stable, geometry-free inventory of the editor's built-in persistent panels.
|
|
4
|
+
*
|
|
5
|
+
* `region` is a panel's claim on an EDITOR-AREA fill (`EditorTheme.color.region`
|
|
6
|
+
* carries the measurement): the dock paints the group showing this panel with
|
|
7
|
+
* that region's colour instead of the one fill every group shares. A panel
|
|
8
|
+
* that claims none is painted exactly as before the claim existed, which is
|
|
9
|
+
* every panel no reference frame shows painted differently.
|
|
10
|
+
*
|
|
11
|
+
* `icon` is the panel's own glyph, drawn in Blender's EDITOR-TYPE WELL — the
|
|
12
|
+
* 32x20 box every area begins with under `groupTabs: 'well'`
|
|
13
|
+
* (`workspace-regions.ts`). The NAME is declared here and the drawing lives
|
|
14
|
+
* in the editor's icon registry (`components/primitives/editor-icons.ts`), which also records which two of these are
|
|
15
|
+
* Blender's own measured marks and which five are ours because no reference
|
|
16
|
+
* frame photographs that editor. The field is optional so a host may add a
|
|
17
|
+
* panel without one; every panel below declares one, so the well's
|
|
18
|
+
* glyph-less branch does not fire in this editor. */
|
|
19
|
+
export const WORKSPACE_STATIC_PANELS = [
|
|
20
|
+
{
|
|
21
|
+
kind: 'agent',
|
|
22
|
+
title: 'Conversations',
|
|
23
|
+
hotkeyScope: 'workspace',
|
|
24
|
+
selectableText: true,
|
|
25
|
+
icon: 'users',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
kind: 'project-work',
|
|
29
|
+
title: 'Project work',
|
|
30
|
+
hotkeyScope: 'workspace',
|
|
31
|
+
selectableText: true,
|
|
32
|
+
icon: 'list',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
kind: 'hierarchy',
|
|
36
|
+
title: 'Hierarchy',
|
|
37
|
+
hotkeyScope: 'hierarchy',
|
|
38
|
+
selectableText: false,
|
|
39
|
+
region: 'outliner',
|
|
40
|
+
icon: 'outliner',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
kind: 'assets',
|
|
44
|
+
title: 'Content',
|
|
45
|
+
hotkeyScope: 'asset-browser',
|
|
46
|
+
selectableText: false,
|
|
47
|
+
icon: 'folder-open',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
kind: 'asset-library',
|
|
51
|
+
title: 'Asset Library',
|
|
52
|
+
hotkeyScope: 'asset-browser',
|
|
53
|
+
selectableText: false,
|
|
54
|
+
icon: 'cubes-stacked',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
kind: 'inspector',
|
|
58
|
+
title: 'Inspector',
|
|
59
|
+
hotkeyScope: 'inspector',
|
|
60
|
+
selectableText: false,
|
|
61
|
+
region: 'properties',
|
|
62
|
+
icon: 'properties',
|
|
63
|
+
},
|
|
64
|
+
] as const satisfies ReadonlyArray<{
|
|
65
|
+
readonly kind: string;
|
|
66
|
+
readonly title: string;
|
|
67
|
+
readonly hotkeyScope: string;
|
|
68
|
+
readonly selectableText: boolean;
|
|
69
|
+
readonly region?: EditorRegionName;
|
|
70
|
+
readonly icon?: WorkspacePanelGlyphName;
|
|
71
|
+
}>;
|
|
72
|
+
|
|
73
|
+
export type WorkspaceStaticPanelKind = (typeof WORKSPACE_STATIC_PANELS)[number]['kind'];
|