@volter/sdk 0.0.0-stage → 0.5.203
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1166 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +317 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +403 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import {
|
|
2
|
+
adapterEditorConfiguration,
|
|
3
|
+
subscribeAdapterEditorConfiguration,
|
|
4
|
+
} from '@volter/sdk/kit/adapter-editor-config';
|
|
5
|
+
import { effectiveSettings, subscribeSettings } from '@volter/sdk/kit/settings-store';
|
|
6
|
+
/**
|
|
7
|
+
* WHICH CHROME REGIONS ARE SHOWN right now — the one store the two document
|
|
8
|
+
* regions (`DocumentHeaderStrip`, `DocumentShelfRail`), the title bar's own
|
|
9
|
+
* strips and the inspector's presentation resolver read.
|
|
10
|
+
*
|
|
11
|
+
* WHAT IS NOT A KEY HERE: how the workbench names an open document. Editor
|
|
12
|
+
* tabs, their strip and its presentation are the frame's, and a workspace that
|
|
13
|
+
* declared them would be declaring something it cannot draw.
|
|
14
|
+
*
|
|
15
|
+
* Workspace and user style choices, with project adapter defaults:
|
|
16
|
+
* resolved[key] = workspace.regions[key] ?? adapter default ?? preset.regions[key] ?? default
|
|
17
|
+
* - the WORKSPACE layer is what the active workspace declares
|
|
18
|
+
* (`workspace-presets.ts`, `EditorWorkspaceRegions`) — Look hides every
|
|
19
|
+
* region and stays minimal under any preset;
|
|
20
|
+
* - the PRESET layer is what a style bundle asked for (`workspace-style.ts`,
|
|
21
|
+
* the fourth axis beside palette, material and composition), persisted
|
|
22
|
+
* like the other three so the bundle survives a reload.
|
|
23
|
+
* A host with no workspaces and no bundles (a bounded host) never
|
|
24
|
+
* writes either, so every region stays shown and the page pays for this
|
|
25
|
+
* file alone. Same shape as every module-scope store here: value + version
|
|
26
|
+
* + subscribe.
|
|
27
|
+
*/
|
|
28
|
+
export interface ChromeRegions {
|
|
29
|
+
/** The workspace tab strip in the top bar (`ProjectHeader`); absent = hidden. */
|
|
30
|
+
readonly workspaceTabs?: 'shown' | 'hidden';
|
|
31
|
+
readonly header?: 'shown' | 'hidden';
|
|
32
|
+
readonly shelf?: 'shown' | 'hidden';
|
|
33
|
+
/** How the docked inspector lays its sections out — stacked (`column`) or
|
|
34
|
+
* tabbed behind a vertical rail (`properties`). Read by the presentation
|
|
35
|
+
* resolver (`inspector-presentation.ts`) beneath the user's own override. */
|
|
36
|
+
readonly inspector?: 'column' | 'properties' | 'card';
|
|
37
|
+
/** The bottom utility DRAWER (analytics, console, history…). Hidden means
|
|
38
|
+
* a workspace never shows it — not on a switch, not when play settles;
|
|
39
|
+
* Blender's modeling workspace has no timeline strip. */
|
|
40
|
+
readonly drawer?: 'shown' | 'hidden';
|
|
41
|
+
/** The top bar's runtime TELEMETRY cluster (`HeaderTelemetry`: the frame
|
|
42
|
+
* readout, its sparkline, the audio meter). A LOOK knob, not a product
|
|
43
|
+
* one — Invite and Account stay whatever this says, being identity rather
|
|
44
|
+
* than appearance, and the Profiler utility remains the door to the same
|
|
45
|
+
* numbers (the readout's own tooltip says so). Absent means shown, so
|
|
46
|
+
* every skin that predates this key is pixel-identical. */
|
|
47
|
+
readonly telemetry?: 'shown' | 'hidden';
|
|
48
|
+
/** The `·TypeName` a component-instance row prints after its name
|
|
49
|
+
* (`GameHierarchy.tsx`'s `hierarchy-instance-type`). A LOOK knob: measured
|
|
50
|
+
* on `outliner.png`, every Blender row carries its NAME ALONE — the type is
|
|
51
|
+
* the glyph, which is the whole reason the glyph is coloured by category.
|
|
52
|
+
*
|
|
53
|
+
* Hiding it costs one VISIBLE fact, and only on rows where the name and the
|
|
54
|
+
* type differ (`EnemyBravo ·Enemy`). Where they agree it costs nothing, and
|
|
55
|
+
* that is every row of the starter template — the label IS the instance's
|
|
56
|
+
* `name` prop, which authors write as the component's own name (`Hero Box
|
|
57
|
+
* ·HeroBox`, `Ground ·Ground`). The row keeps the fact reachable when
|
|
58
|
+
* hidden: the label's own `title` carries the sentence, the inspector shows
|
|
59
|
+
* the component's sections, and the override `*` moves onto the NAME rather
|
|
60
|
+
* than leaving with the suffix it used to ride. Absent means shown, so
|
|
61
|
+
* every skin that predates this key is pixel-identical. */
|
|
62
|
+
readonly hierarchyTypeSuffix?: 'shown' | 'hidden';
|
|
63
|
+
/** The dotted RULE a component-instance row draws under its name
|
|
64
|
+
* (`semantic.instance`; the owner's 2026-07-31 ruling that instance identity
|
|
65
|
+
* is carried by a rule rather than by recolored text). A LOOK knob, the same
|
|
66
|
+
* kind as {@link ChromeRegions.hierarchyTypeSuffix} and measured the same
|
|
67
|
+
* way: `modeling-object-none.png` and `modeling-object-selected.png` carry
|
|
68
|
+
* NO rule, dotted or solid, under any Outliner name in any selection state —
|
|
69
|
+
* Blender marks an instance nowhere in that panel.
|
|
70
|
+
*
|
|
71
|
+
* Hiding it costs the row's instance HINT, not the fact: the label's own
|
|
72
|
+
* `title`, the row's Go to Callsite / Open Component Source actions and the
|
|
73
|
+
* inspector's component sections all still say it. Absent means shown, so
|
|
74
|
+
* every skin that predates this key is pixel-identical.
|
|
75
|
+
*
|
|
76
|
+
* Note the SEPARATE, older mechanism it sits above:
|
|
77
|
+
* `--volter-tree-active-name-underline` (`theme.ts`) drops the rule on the
|
|
78
|
+
* SELECTED row alone, and only for a palette that declares an active ink,
|
|
79
|
+
* so two marks never argue on one row. That one is the palette's; this one
|
|
80
|
+
* is the look's, and where a look hides the rule outright the palette rule
|
|
81
|
+
* never gets a say. */
|
|
82
|
+
readonly hierarchyInstanceRule?: 'shown' | 'hidden';
|
|
83
|
+
/**
|
|
84
|
+
* WHICH RESTRICTION COLUMNS an Outliner row carries at its right edge —
|
|
85
|
+
* Blender's own filter, whose default decides the same thing there.
|
|
86
|
+
*
|
|
87
|
+
* - `select+viewport` — this editor's own pair: a selection LOCK and the
|
|
88
|
+
* eye, packed against the row's right margin.
|
|
89
|
+
* - `viewport+render` — Blender's default filter. Measured on
|
|
90
|
+
* `outliner.png`: every object row carries exactly two marks, an eye at
|
|
91
|
+
* x 515-541 device (CSS ink 257.5-270.5, 32 px in from the area's own
|
|
92
|
+
* right edge) and a render camera at 555-581 (277.5-290.5, 12 px in);
|
|
93
|
+
* a 20 px column pitch, and NO lock glyph anywhere in the frame,
|
|
94
|
+
* Blender's Disable Selection column being off by default.
|
|
95
|
+
*
|
|
96
|
+
* The RENDER column is declared and left BLANK, deliberately. three.js has
|
|
97
|
+
* one `Object3D.visible` governing viewport and render alike, so a second
|
|
98
|
+
* toggle would write nothing and fail "a control is accepted through its own
|
|
99
|
+
* click" — but Blender's columns are positions, and drawing our one eye in
|
|
100
|
+
* the outer slot would put it in the render column and align it with
|
|
101
|
+
* neither. Reserving the slot puts the eye exactly where Blender's eye is.
|
|
102
|
+
* A skew whose adapter really does separate the two fills the column in;
|
|
103
|
+
* nothing else changes.
|
|
104
|
+
*
|
|
105
|
+
* Absent means `select+viewport`, so every skin that predates this key is
|
|
106
|
+
* pixel-identical.
|
|
107
|
+
*/
|
|
108
|
+
readonly hierarchyRestrictions?: 'select+viewport' | 'viewport+render';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* EVERY REGION AND ITS DEFAULT, stated once.
|
|
113
|
+
*
|
|
114
|
+
* Three things read this — the merge, the snapshot key, and the absolute write
|
|
115
|
+
* a bundle makes — and before 2026-09-18 each spelled the key list and its
|
|
116
|
+
* default out by hand, so a seventh region meant editing the same table three
|
|
117
|
+
* times and the merge tripped the complexity lint on the way.
|
|
118
|
+
*
|
|
119
|
+
* A NEW REGION IS FIVE EDITS, not the one this comment used to claim, and the
|
|
120
|
+
* last two are the ones that bite: this table, its member on {@link
|
|
121
|
+
* ChromeRegions}, the same member on `@volter/sdk`'s
|
|
122
|
+
* `WorkspaceArrangement['regions']` (which a contributed bundle is typed
|
|
123
|
+
* against), `@volter/project`'s `ChromeRegionsSettingsSchema`, which is
|
|
124
|
+
* `.strict()`, and the FRAME's own configuration contribution
|
|
125
|
+
* (`node scripts/workbench/generate-settings.mjs --write`, which rewrites
|
|
126
|
+
* `packages/editor-core/workbench/src/volterGeneratedSettings.ts` from the JSON
|
|
127
|
+
* Schema).
|
|
128
|
+
*
|
|
129
|
+
* Miss the fourth and NOTHING fails to compile: a region value the person sets is
|
|
130
|
+
* written into `~/.volter/settings.json`, the server rejects the unknown key with a 400, and the only report is a `[settings] Could not save
|
|
131
|
+
* user settings` line in the editor console — every appearance preference
|
|
132
|
+
* silently stops persisting. Measured 2026-09-18, found by the editor's `console` command
|
|
133
|
+
* after nine failed writes.
|
|
134
|
+
*
|
|
135
|
+
* Miss the FIFTH and the frame drops the key on the way through instead: the
|
|
136
|
+
* workbench's configuration service knows only the generated list, so
|
|
137
|
+
* `volterSettings.ts` reports "…is not a volter setting, so it was not applied" and
|
|
138
|
+
* the region reverts to its default on the next read of persisted settings.
|
|
139
|
+
* Measured 2026-09-21 by the editor's `console` command on the first boot after a new key
|
|
140
|
+
* landed, which is the reason this list says five now.
|
|
141
|
+
*
|
|
142
|
+
* AND THE FIFTH HAS A RELEASE IN IT, which is the part that decides where a
|
|
143
|
+
* look's value belongs. The generated artifact is built INTO a Code-OSS
|
|
144
|
+
* release, so a running release cut before the key reports it and ignores it
|
|
145
|
+
* until the next cut — a region is not a value a look can add and use in the
|
|
146
|
+
* same session. A look value that the STAGE reads (the transform gizmo's
|
|
147
|
+
* screen size, which tool its shelf opens on) therefore rides the THEME
|
|
148
|
+
* instead, as the material's `stage` emitted onto the theme root by the page
|
|
149
|
+
* itself: it crosses nothing (`@volter/sdk/looks`'
|
|
150
|
+
* `StageContribution`, `native-selection-style.ts`'s readers).
|
|
151
|
+
* A region stays a region — what CHROME is shown is genuinely a persisted
|
|
152
|
+
* preference a person can also set.
|
|
153
|
+
*
|
|
154
|
+
* Run `npm run generate-schema` with the schema edit, then the settings
|
|
155
|
+
* generator.
|
|
156
|
+
*/
|
|
157
|
+
const REGION_DEFAULTS = {
|
|
158
|
+
workspaceTabs: 'hidden',
|
|
159
|
+
header: 'shown',
|
|
160
|
+
shelf: 'shown',
|
|
161
|
+
inspector: 'column',
|
|
162
|
+
drawer: 'shown',
|
|
163
|
+
telemetry: 'shown',
|
|
164
|
+
hierarchyTypeSuffix: 'shown',
|
|
165
|
+
hierarchyInstanceRule: 'shown',
|
|
166
|
+
hierarchyRestrictions: 'select+viewport',
|
|
167
|
+
} as const satisfies Required<ChromeRegions>;
|
|
168
|
+
|
|
169
|
+
const REGION_KEYS = Object.keys(REGION_DEFAULTS) as ReadonlyArray<keyof ChromeRegions>;
|
|
170
|
+
|
|
171
|
+
/** The regions whose values are not the `shown`/`hidden` pair, for
|
|
172
|
+
* {@link isRegions}. A key absent here takes that pair. */
|
|
173
|
+
const REGION_VALUES: Partial<Record<keyof ChromeRegions, readonly string[]>> = {
|
|
174
|
+
inspector: ['column', 'properties', 'card'],
|
|
175
|
+
hierarchyRestrictions: ['select+viewport', 'viewport+render'],
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
function isRegions(value: unknown): value is ChromeRegions {
|
|
179
|
+
if (!value || typeof value !== 'object') return false;
|
|
180
|
+
const record = value as Record<string, unknown>;
|
|
181
|
+
for (const key of Object.keys(record)) {
|
|
182
|
+
if (!(REGION_KEYS as readonly string[]).includes(key)) return false;
|
|
183
|
+
const allowed = REGION_VALUES[key as keyof ChromeRegions] ?? ['shown', 'hidden'];
|
|
184
|
+
if (!allowed.includes(record[key] as string)) return false;
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** The person's own region choices, in the settings layers as `appearance.regions`
|
|
190
|
+
* (`settings-store.ts`). A style never writes them: which regions exist is function, a
|
|
191
|
+
* workspace's and the person's (ARCHITECTURE.md rule 7). */
|
|
192
|
+
function readPersistedPreset(): ChromeRegions {
|
|
193
|
+
const stored: unknown = effectiveSettings().appearance?.regions;
|
|
194
|
+
return isRegions(stored) ? stored : {};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
let _workspace: ChromeRegions = {};
|
|
198
|
+
let _preset: ChromeRegions = readPersistedPreset();
|
|
199
|
+
let _version = 0;
|
|
200
|
+
const _listeners = new Set<() => void>();
|
|
201
|
+
|
|
202
|
+
function resolved(key: keyof ChromeRegions): string | undefined {
|
|
203
|
+
// `inspector` alone has a THIRD layer between the workspace and the preset:
|
|
204
|
+
// the project adapter's own declaration (`adapter-editor-config.ts`).
|
|
205
|
+
if (key === 'inspector')
|
|
206
|
+
return _workspace.inspector ?? adapterEditorConfiguration().inspector ?? _preset.inspector;
|
|
207
|
+
return _workspace[key] ?? _preset[key];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function merged(): ChromeRegions {
|
|
211
|
+
const next: Record<string, string> = {};
|
|
212
|
+
for (const key of REGION_KEYS) {
|
|
213
|
+
const value = resolved(key);
|
|
214
|
+
if (value) next[key] = value;
|
|
215
|
+
}
|
|
216
|
+
return next as ChromeRegions;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let _merged: ChromeRegions = merged();
|
|
220
|
+
|
|
221
|
+
export function activeChromeRegions(): ChromeRegions {
|
|
222
|
+
return _merged;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** A stable string, because `useSyncExternalStore` compares snapshots by
|
|
226
|
+
* identity and a fresh object would loop. */
|
|
227
|
+
export function chromeRegionsKey(): string {
|
|
228
|
+
return regionsKey(_merged);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function regionsKey(regions: ChromeRegions): string {
|
|
232
|
+
return REGION_KEYS.map((key) => `${key}:${regions[key] ?? REGION_DEFAULTS[key]}`).join(' ');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function publish(): void {
|
|
236
|
+
const before = chromeRegionsKey();
|
|
237
|
+
_merged = merged();
|
|
238
|
+
if (chromeRegionsKey() === before) return;
|
|
239
|
+
_version += 1;
|
|
240
|
+
for (const listener of _listeners) listener();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** The active workspace's declaration (`workspace-presets.ts`). */
|
|
244
|
+
export function setWorkspaceRegions(regions: ChromeRegions): void {
|
|
245
|
+
_workspace = regions;
|
|
246
|
+
publish();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
// A settings load or a project's own override changes the preset underneath.
|
|
251
|
+
function syncPreset(): void {
|
|
252
|
+
const next = readPersistedPreset();
|
|
253
|
+
if (regionsKey(next) === regionsKey(_preset)) return;
|
|
254
|
+
_preset = next;
|
|
255
|
+
publish();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
subscribeSettings(syncPreset);
|
|
259
|
+
|
|
260
|
+
subscribeAdapterEditorConfiguration(publish);
|
|
261
|
+
|
|
262
|
+
export function subscribeChromeRegions(listener: () => void): () => void {
|
|
263
|
+
_listeners.add(listener);
|
|
264
|
+
return () => _listeners.delete(listener);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function chromeRegionsVersion(): number {
|
|
268
|
+
return _version;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function __resetChromeRegionsForTest(): void {
|
|
272
|
+
_workspace = {};
|
|
273
|
+
_preset = {};
|
|
274
|
+
_merged = {};
|
|
275
|
+
_version = 0;
|
|
276
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { EditorRegionName, WorkspacePanelGlyphName } from '@volter/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'];
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace STATUS-CONTRIBUTION registry (W0 — the shell-contract slice of
|
|
3
|
+
* §9 W0). "Status is status, not a command" (§1.5): save/dirty/failure
|
|
4
|
+
* state, problem counts, connection/play state, build progress, and concise
|
|
5
|
+
* selection information belong in a narrow status bar — not mixed into the
|
|
6
|
+
* global command header and not spread across viewport overlays.
|
|
7
|
+
*
|
|
8
|
+
* Consumed since W4 by `components/StatusBar.tsx` (rendered under the
|
|
9
|
+
* bottom dock/drawer strip); the core contributions live in
|
|
10
|
+
* `components/status-contributions.tsx` (+ `build-documents.tsx`'s
|
|
11
|
+
* `build-progress`). Migration map.
|
|
12
|
+
*
|
|
13
|
+
* Idioms mirror `inspector-section-registry.ts`: module-scope state,
|
|
14
|
+
* `useSyncExternalStore`-shaped subscribe + monotonic version,
|
|
15
|
+
* `__resetForTest`, pure-logic headless tests (`Content` is never rendered
|
|
16
|
+
* here). Ids key persisted/status-bar slots, so duplicates throw (same rule
|
|
17
|
+
* as `workspace-utility-registry.ts`).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { ComponentType } from 'react';
|
|
21
|
+
|
|
22
|
+
/** The §7 status contribution contract: one compact status-bar item. */
|
|
23
|
+
export interface WorkspaceStatusContribution {
|
|
24
|
+
/** Stable id — keys the status-bar slot (`data-testid`). */
|
|
25
|
+
readonly id: string;
|
|
26
|
+
/**
|
|
27
|
+
* WHAT A PERSON CALLS IT. Required, because the status bar this draws into
|
|
28
|
+
* is the workbench's and `IStatusbarEntry.name` is required there: it is the
|
|
29
|
+
* label in the bar's own right-click menu (`Hide <item>`) and the entry's
|
|
30
|
+
* aria label. Before it existed every contribution passed its raw id, so the
|
|
31
|
+
* menu read `tool:blender.status`, `console-counts`, `play-state` beside VS
|
|
32
|
+
* Code's own `Remote Host` and `Problems` (walk 4, 2026-09-20).
|
|
33
|
+
*
|
|
34
|
+
* Title Case, and a NOUN — it names the thing, not what it is doing right
|
|
35
|
+
* now: the CONTENT changes, this does not.
|
|
36
|
+
*/
|
|
37
|
+
readonly name: string;
|
|
38
|
+
/** Which end of the bar (§4.1: session state left, selection info right).
|
|
39
|
+
* Default `'left'`. */
|
|
40
|
+
readonly align?: 'left' | 'right';
|
|
41
|
+
/** Slot order within its side (ascending; ties keep registration order).
|
|
42
|
+
* Default `0`. */
|
|
43
|
+
readonly order?: number;
|
|
44
|
+
/** React content host — compact, passive, non-command (§1.5). Never
|
|
45
|
+
* rendered by the registry itself. */
|
|
46
|
+
readonly Content: ComponentType;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// --- Module-scope state (mirrors inspector-section-registry.ts) -----------
|
|
50
|
+
|
|
51
|
+
interface StoredContribution {
|
|
52
|
+
readonly contribution: WorkspaceStatusContribution;
|
|
53
|
+
readonly seq: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let _contributions: StoredContribution[] = [];
|
|
57
|
+
let _seq = 0;
|
|
58
|
+
let _version = 0;
|
|
59
|
+
const _listeners = new Set<() => void>();
|
|
60
|
+
|
|
61
|
+
function notifyChanged(): void {
|
|
62
|
+
_version++;
|
|
63
|
+
for (const fn of _listeners) fn();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Subscribe to (un)registrations. Returns an unsubscribe function. */
|
|
67
|
+
export function subscribeWorkspaceStatus(fn: () => void): () => void {
|
|
68
|
+
_listeners.add(fn);
|
|
69
|
+
return () => {
|
|
70
|
+
_listeners.delete(fn);
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Monotonic change counter — the `getSnapshot` for `useSyncExternalStore`. */
|
|
75
|
+
export function workspaceStatusRegistryVersion(): number {
|
|
76
|
+
return _version;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Register a status contribution. Returns an unregister function.
|
|
81
|
+
* Throws on a duplicate id (ids key status-bar slots — same uniqueness rule
|
|
82
|
+
* as `registerWorkspaceUtility`).
|
|
83
|
+
*/
|
|
84
|
+
export function registerWorkspaceStatus(contribution: WorkspaceStatusContribution): () => void {
|
|
85
|
+
if (_contributions.some((c) => c.contribution.id === contribution.id)) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`registerWorkspaceStatus: id "${contribution.id}" is already registered — ` +
|
|
88
|
+
'status ids key status-bar slots, so they must be unique; unregister the ' +
|
|
89
|
+
'previous contribution first.',
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const stored: StoredContribution = { contribution, seq: _seq++ };
|
|
93
|
+
_contributions = [..._contributions, stored];
|
|
94
|
+
notifyChanged();
|
|
95
|
+
return () => {
|
|
96
|
+
if (!_contributions.includes(stored)) return;
|
|
97
|
+
_contributions = _contributions.filter((c) => c !== stored);
|
|
98
|
+
notifyChanged();
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Registered contributions for one side of the bar, in (order,
|
|
103
|
+
* registration-sequence) order; with no argument, both sides (left first). */
|
|
104
|
+
export function workspaceStatusContributions(
|
|
105
|
+
align?: 'left' | 'right',
|
|
106
|
+
): WorkspaceStatusContribution[] {
|
|
107
|
+
const side = (want: 'left' | 'right') =>
|
|
108
|
+
[..._contributions]
|
|
109
|
+
.filter((c) => (c.contribution.align ?? 'left') === want)
|
|
110
|
+
.sort((a, b) => (a.contribution.order ?? 0) - (b.contribution.order ?? 0) || a.seq - b.seq)
|
|
111
|
+
.map((c) => c.contribution);
|
|
112
|
+
if (align) return side(align);
|
|
113
|
+
return [...side('left'), ...side('right')];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Test-only reset (mirrors `__resetInspectorSectionRegistryForTest`). */
|
|
117
|
+
export function __resetWorkspaceStatusRegistryForTest(): void {
|
|
118
|
+
_contributions = [];
|
|
119
|
+
_seq = 0;
|
|
120
|
+
notifyChanged();
|
|
121
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE WORKBENCH'S WORKSPACE STORAGE, as the frame hands it over at mount: Code-OSS's own
|
|
3
|
+
* `IStorageService` at `StorageScope.WORKSPACE`, which the web workbench keeps in the project's
|
|
4
|
+
* folder (`.volter/workbench-storage.json`, the fork's `workspaceStorageUrl`). A host without the
|
|
5
|
+
* frame installs none, and the project-local layer keeps its own file.
|
|
6
|
+
*/
|
|
7
|
+
export interface WorkspaceStorageProvider {
|
|
8
|
+
get(key: string): string | undefined;
|
|
9
|
+
/** `undefined` removes the key. */
|
|
10
|
+
store(key: string, value: string | undefined): void;
|
|
11
|
+
/** Resolves once every change the workbench holds (its own layout included) has reached the
|
|
12
|
+
* project's folder. The session's end waits on it: the server stops listening moments after
|
|
13
|
+
* the page acknowledges, so a write left for the page's unload never lands. */
|
|
14
|
+
flush(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let provider: WorkspaceStorageProvider | null = null;
|
|
18
|
+
const listeners = new Set<() => void>();
|
|
19
|
+
|
|
20
|
+
export function setWorkspaceStorageProvider(next: WorkspaceStorageProvider | null): void {
|
|
21
|
+
provider = next;
|
|
22
|
+
for (const listener of listeners) listener();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function workspaceStorageProvider(): WorkspaceStorageProvider | null {
|
|
26
|
+
return provider;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Fires when the provider is installed or removed. */
|
|
30
|
+
export function onWorkspaceStorageProvider(listener: () => void): () => void {
|
|
31
|
+
listeners.add(listener);
|
|
32
|
+
return () => {
|
|
33
|
+
listeners.delete(listener);
|
|
34
|
+
};
|
|
35
|
+
}
|