@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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DECLARED READINESS, per root — the facet that makes "is this game ready?" an
|
|
3
|
+
* answer with a stated PROVENANCE instead of a host-side guess nobody can see.
|
|
4
|
+
*
|
|
5
|
+
* ARCHITECTURE-CORE §The editor protocol, "Zero inference". The question has
|
|
6
|
+
* exactly three answerers, and this module is where each one's answer lands:
|
|
7
|
+
*
|
|
8
|
+
* · `host-mount` — a HOST-MOUNTED (exported-composition) root. The host runs
|
|
9
|
+
* the mount, so mount completion IS readiness; no game code is needed and
|
|
10
|
+
* the answer is `declared` for every first-party project by construction.
|
|
11
|
+
* · `contract-ready` — a SELF-BOOTING game that declares
|
|
12
|
+
* `window.volterGame.ready` (`@volter/project/adapter/ingest/game-contract`). Also
|
|
13
|
+
* `declared`: the game stated it.
|
|
14
|
+
* · `measured-wait` — a self-booting game that declares nothing. The measured
|
|
15
|
+
* waits remain (they are the documented fallback), and this is the whole
|
|
16
|
+
* point of the facet: that root reports `source: 'measured'`, so "nobody
|
|
17
|
+
* stated this" is a visible fact rather than silence.
|
|
18
|
+
*
|
|
19
|
+
* Published as the `readiness` facet of `/__editor/state`
|
|
20
|
+
* (`command-listener.ts`'s `collectState`), which is what the editor's `status` command reads.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type {
|
|
24
|
+
MountFailureKind,
|
|
25
|
+
ReadinessSource,
|
|
26
|
+
} from '@volter/project/adapter/ingest/mount-readiness';
|
|
27
|
+
|
|
28
|
+
/** How a root's readiness is answered. See this module's header for each. */
|
|
29
|
+
export type ReadinessMechanism = 'host-mount' | 'contract-ready' | 'measured-wait';
|
|
30
|
+
|
|
31
|
+
export interface RootReadiness {
|
|
32
|
+
/** The manifest root id, as every other per-root facet names it. */
|
|
33
|
+
readonly rootId: string;
|
|
34
|
+
readonly mechanism: ReadinessMechanism;
|
|
35
|
+
/** `declared` for `host-mount`/`contract-ready`, `measured` otherwise — the
|
|
36
|
+
* one field that makes a fallback legible as a fallback. */
|
|
37
|
+
readonly source: ReadinessSource;
|
|
38
|
+
/** `waiting` is a real state, not a missing answer: a self-booting game on a
|
|
39
|
+
* hidden tab parks there indefinitely and nothing is wrong. */
|
|
40
|
+
readonly state: 'waiting' | 'ready' | 'failed';
|
|
41
|
+
/** Which of M29's three blockers, for a `failed` root. */
|
|
42
|
+
readonly failure?: MountFailureKind;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* RESOURCE OWNERSHIP: one entry per root, written by the mount path that owns
|
|
47
|
+
* that root's lifecycle (`play-mode.ts` for host-mounted roots,
|
|
48
|
+
* `authoring/ingest-root-adapter.ts` for self-booting ones) and cleared by that
|
|
49
|
+
* same path's teardown. `clearRootReadiness` is per-root for the reason
|
|
50
|
+
* `clearMountFailureReport` is: a composite manifest mounts roots
|
|
51
|
+
* independently, and a blanket clear on one root's teardown would erase a
|
|
52
|
+
* sibling's still-true answer.
|
|
53
|
+
*/
|
|
54
|
+
const _readiness = new Map<string, RootReadiness>();
|
|
55
|
+
let _snapshot: readonly RootReadiness[] = [];
|
|
56
|
+
const _listeners = new Set<() => void>();
|
|
57
|
+
|
|
58
|
+
function publish(): void {
|
|
59
|
+
_snapshot = [..._readiness.values()];
|
|
60
|
+
for (const listener of _listeners) listener();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** `useSyncExternalStore`-compatible subscription for viewport explanations. */
|
|
64
|
+
export function subscribeRootReadiness(listener: () => void): () => void {
|
|
65
|
+
_listeners.add(listener);
|
|
66
|
+
return () => _listeners.delete(listener);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function recordRootReadiness(entry: RootReadiness): void {
|
|
70
|
+
_readiness.set(entry.rootId, entry);
|
|
71
|
+
publish();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function clearRootReadiness(rootId: string): void {
|
|
75
|
+
if (!_readiness.delete(rootId)) return;
|
|
76
|
+
publish();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Test seam. Every production teardown clears PER ROOT (see the ownership note
|
|
80
|
+
* above), so nothing but a test has the whole map's lifetime to drop. */
|
|
81
|
+
export function clearAllRootReadiness(): void {
|
|
82
|
+
if (_readiness.size === 0) return;
|
|
83
|
+
_readiness.clear();
|
|
84
|
+
publish();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Every root's readiness, in the order they were recorded. `[]` means nothing
|
|
89
|
+
* has mounted — deliberately NOT the same as "nothing is ready", which is what
|
|
90
|
+
* a bare boolean would have said.
|
|
91
|
+
*/
|
|
92
|
+
export function readinessFacet(): readonly RootReadiness[] {
|
|
93
|
+
return _snapshot;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The one sentence a reader gets when a project's readiness is entirely
|
|
98
|
+
* measured — i.e. no root stated it and every answer here is a host-side wait.
|
|
99
|
+
* `null` when there is nothing to say (nothing mounted, or at least one root
|
|
100
|
+
* declared), because a warning that fires on healthy projects is a warning
|
|
101
|
+
* people learn to skip.
|
|
102
|
+
*/
|
|
103
|
+
export function measuredReadinessWarning(): string | null {
|
|
104
|
+
const entries = readinessFacet();
|
|
105
|
+
if (entries.length === 0) return null;
|
|
106
|
+
const measured = entries.filter((entry) => entry.source === 'measured');
|
|
107
|
+
if (measured.length === 0) return null;
|
|
108
|
+
return (
|
|
109
|
+
`${measured.length} of ${entries.length} root(s) have NO readiness declaration ` +
|
|
110
|
+
`(${measured.map((entry) => entry.rootId).join(', ')}) — the host is measuring instead. ` +
|
|
111
|
+
'A self-booting game states it with `window.volterGame.ready`.'
|
|
112
|
+
);
|
|
113
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer resource counts a media integration reports for the session's diagnostics
|
|
3
|
+
* (`status.rendererResources`): the Three viewport's interactive renderers, for one. The kit
|
|
4
|
+
* reads what is registered and imports no renderer.
|
|
5
|
+
*/
|
|
6
|
+
export interface RendererResourceCount {
|
|
7
|
+
readonly active: number;
|
|
8
|
+
readonly idle: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const providers = new Map<string, () => RendererResourceCount | number>();
|
|
12
|
+
|
|
13
|
+
/** Report counts under `key`. Returns the teardown. */
|
|
14
|
+
export function registerRendererResourceCounts(
|
|
15
|
+
key: string,
|
|
16
|
+
read: () => RendererResourceCount | number,
|
|
17
|
+
): () => void {
|
|
18
|
+
providers.set(key, read);
|
|
19
|
+
return () => {
|
|
20
|
+
if (providers.get(key) === read) providers.delete(key);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Every registered provider's counts, read now. */
|
|
25
|
+
export function rendererResourceCounts(): Record<string, RendererResourceCount | number> {
|
|
26
|
+
return Object.fromEntries([...providers].map(([key, read]) => [key, read()]));
|
|
27
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Honest play-state reporting for the control API (the editor's `status` command) — the
|
|
3
|
+
* derivation half of the SimCity ledger's S-1 "false-alive ingest status".
|
|
4
|
+
*
|
|
5
|
+
* ## The defect this closes
|
|
6
|
+
*
|
|
7
|
+
* `EditorShellStore.playState` is EDITOR UI STATE. Every lane that mounts
|
|
8
|
+
* something writes `'playing'` into it, but only play mode's write is
|
|
9
|
+
* accompanied by a live `play-mode.ts` `_session`, which is the predicate the
|
|
10
|
+
* whole debug seam gates on (`isPlayModeActive()`, `command-listener.ts`'s
|
|
11
|
+
* `notPlayingResult`). `collectState` reported the store flag verbatim, so a
|
|
12
|
+
* mounted lane printed `playState: "playing"` while every `game.state()` /
|
|
13
|
+
* `game.command()` call refused with "not in play mode" — the two predicates
|
|
14
|
+
* disagreeing in the same breath.
|
|
15
|
+
*
|
|
16
|
+
* Worse, a lane sets `'playing'` BEFORE the mount is attempted (it is what
|
|
17
|
+
* swaps the viewport onto the live scene). A mount that then threw left the
|
|
18
|
+
* flag behind, so a DEAD game reported itself alive.
|
|
19
|
+
*
|
|
20
|
+
* ## The rule
|
|
21
|
+
*
|
|
22
|
+
* A reported play state is a claim about something that is actually running,
|
|
23
|
+
* so it is derived from the LIVE-SESSION REGISTRY (`live-session-registry.ts`)
|
|
24
|
+
* — the host's one question about what runs — never from the UI flag alone,
|
|
25
|
+
* and it names no lane:
|
|
26
|
+
*
|
|
27
|
+
* - nothing mounted is `stopped`, whatever the stale flag says;
|
|
28
|
+
* - a mount whose lane was not asked to run is `paused` — a freshly mounted,
|
|
29
|
+
* still-cold session is `paused`, not `playing`;
|
|
30
|
+
* - otherwise the store flag, which for a running lane is written in lockstep.
|
|
31
|
+
*
|
|
32
|
+
* Pure and injectable so the whole decision is unit-testable with no browser
|
|
33
|
+
* (`packages/editor/test/ingest-status.test.ts`).
|
|
34
|
+
*
|
|
35
|
+
* ## Why this is not folded back into the store's getter
|
|
36
|
+
*
|
|
37
|
+
* Because the two answer different questions, and the store's is the one the
|
|
38
|
+
* editor itself needs. `isPlayModeActive()` is `_instance.session !== null`,
|
|
39
|
+
* assigned only after the mount resolves — so a derived `store.playState` would
|
|
40
|
+
* read `'stopped'` for the whole play boot (manifest fetch, entry resolution,
|
|
41
|
+
* the mount itself), and the structural-edit block, the design session's
|
|
42
|
+
* suspend, the Play bar and the viewport-tab predicates would all act as though
|
|
43
|
+
* nothing were starting. The store's flag stays the editor's MODE; this stays
|
|
44
|
+
* the report.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
import type { MountFailureReport } from '@volter/sdk/kit/mount-failure-report';
|
|
48
|
+
|
|
49
|
+
/** The vocabulary `EditorShellStore.playState` and the SDK's status both use. */
|
|
50
|
+
export type ReportedPlayState = 'stopped' | 'playing' | 'paused';
|
|
51
|
+
|
|
52
|
+
/** Everything the derivation reads. Assembled by the caller from the live
|
|
53
|
+
* module singletons so this module itself imports no session state. */
|
|
54
|
+
export interface LiveSurfaceFacts {
|
|
55
|
+
/** `EditorShellStore.playState` — the UI flag, used only where it is backed. */
|
|
56
|
+
readonly storePlayState: ReportedPlayState;
|
|
57
|
+
/** `live-session-registry.ts`: some lane owns a canvas right now. */
|
|
58
|
+
readonly liveMounted: boolean;
|
|
59
|
+
/** `live-session-registry.ts`: some lane was asked to RUN content. */
|
|
60
|
+
readonly livePlaying: boolean;
|
|
61
|
+
/** Recorded mount failures (`authoring/mount-failure-report.ts`). */
|
|
62
|
+
readonly mountFailures: readonly MountFailureReport[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The reported play state — derived from what is actually running, asked of
|
|
67
|
+
* the live-session registry so no lane is named: a held mount (a mounted game
|
|
68
|
+
* whose loop is stopped) is `paused`; a running one reports the store's
|
|
69
|
+
* playing/paused; nothing mounted is `stopped` whatever the store says.
|
|
70
|
+
*/
|
|
71
|
+
export function deriveReportedPlayState(facts: LiveSurfaceFacts): ReportedPlayState {
|
|
72
|
+
if (!facts.liveMounted) {
|
|
73
|
+
// Nothing is running. A leftover `'playing'`/`'paused'` here is exactly
|
|
74
|
+
// the false-alive report S-1 is about — a mount that threw after setting
|
|
75
|
+
// the flag.
|
|
76
|
+
return 'stopped';
|
|
77
|
+
}
|
|
78
|
+
if (!facts.livePlaying) return 'paused';
|
|
79
|
+
return facts.storePlayState === 'paused' ? 'paused' : 'playing';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* True when the editor is reporting a world that FAILED to mount and has no
|
|
84
|
+
* live session to replace it. Consumers surface this as the "dead game" signal
|
|
85
|
+
* (the editor's `status` command's `mountFailures`, the status bar's mount-failure item)
|
|
86
|
+
* rather than making a reader diff two other fields to notice.
|
|
87
|
+
*/
|
|
88
|
+
export function hasDeadMount(facts: LiveSurfaceFacts): boolean {
|
|
89
|
+
return facts.mountFailures.length > 0 && !facts.liveMounted;
|
|
90
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandSpec } from '@volter/sdk/commands';
|
|
2
|
+
import { isRelayCommandType } from '@volter/sdk/session/command-table';
|
|
3
|
+
import { contributedCommand } from '@volter/sdk/kit/command-registry';
|
|
4
|
+
|
|
5
|
+
/** A listener can attach before the presentation-deferred contribution pass.
|
|
6
|
+
* A requested package command needs that pass now; absence is only meaningful
|
|
7
|
+
* after the current project's contributions have finished installing. */
|
|
8
|
+
export async function resolveContributedCommand(type: unknown): Promise<CommandSpec | null> {
|
|
9
|
+
const found = contributedCommand(type);
|
|
10
|
+
if (found || typeof type !== 'string' || isRelayCommandType(type)) return found;
|
|
11
|
+
await (await import('@volter/sdk/kit/initial-project')).projectBootstrapSettled();
|
|
12
|
+
await (await import('@volter/sdk/kit/tool-loader')).refreshProjectToolContributions();
|
|
13
|
+
return contributedCommand(type);
|
|
14
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a RELATIVE import specifier against an index of known project
|
|
3
|
+
* paths — the extensionless-import answer (`./x` → `x.tsx`/`x.ts`/index
|
|
4
|
+
* variants) answered from a REAL index, never by guessing an extension onto
|
|
5
|
+
* a path. `null` when the specifier is not relative or nothing in the index
|
|
6
|
+
* matches. The one algorithm behind both the component index and the
|
|
7
|
+
* project adapter's module resolver; two copies of the candidate list is
|
|
8
|
+
* how play and the finders disagree about which module a specifier names.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveRelativeSpecifier(
|
|
11
|
+
specifier: string,
|
|
12
|
+
fromPath: string,
|
|
13
|
+
paths: ReadonlySet<string>,
|
|
14
|
+
): string | null {
|
|
15
|
+
if (!specifier.startsWith('.')) return null;
|
|
16
|
+
const dir = fromPath.replaceAll('\\', '/').split('/').slice(0, -1);
|
|
17
|
+
for (const segment of specifier.split('/')) {
|
|
18
|
+
if (segment === '.' || segment === '') continue;
|
|
19
|
+
if (segment === '..') dir.pop();
|
|
20
|
+
else dir.push(segment);
|
|
21
|
+
}
|
|
22
|
+
const base = dir.join('/');
|
|
23
|
+
for (const candidate of [
|
|
24
|
+
base,
|
|
25
|
+
`${base}.tsx`,
|
|
26
|
+
`${base}.ts`,
|
|
27
|
+
`${base}/index.tsx`,
|
|
28
|
+
`${base}/index.ts`,
|
|
29
|
+
]) {
|
|
30
|
+
if (paths.has(candidate)) return candidate;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
interface DisposableSource {
|
|
2
|
+
dispose(): void;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface RetainedDocumentState {
|
|
6
|
+
readonly documentId: string;
|
|
7
|
+
inUse: boolean;
|
|
8
|
+
source: DisposableSource | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** CPU state belongs to an open document, not to the lifetime of its last pane. */
|
|
12
|
+
export class RetainedDocumentStates<T extends RetainedDocumentState> {
|
|
13
|
+
private readonly states = new Map<string, T[]>();
|
|
14
|
+
private readonly generations = new WeakMap<T, number>();
|
|
15
|
+
private unsubscribe: (() => void) | null = null;
|
|
16
|
+
|
|
17
|
+
constructor(
|
|
18
|
+
private readonly create: (documentId: string) => T,
|
|
19
|
+
private readonly isOpen: (documentId: string) => boolean,
|
|
20
|
+
private readonly subscribe: (changed: () => void) => () => void,
|
|
21
|
+
) {}
|
|
22
|
+
|
|
23
|
+
claim(documentId: string): T {
|
|
24
|
+
const states = this.states.get(documentId) ?? [];
|
|
25
|
+
let state = states.find(candidate => !candidate.inUse);
|
|
26
|
+
if (!state) {
|
|
27
|
+
state = this.create(documentId);
|
|
28
|
+
states.push(state);
|
|
29
|
+
this.states.set(documentId, states);
|
|
30
|
+
}
|
|
31
|
+
state.inUse = true;
|
|
32
|
+
this.generations.set(state, this.generation(state) + 1);
|
|
33
|
+
this.unsubscribe ??= this.subscribe(() => this.discardClosed());
|
|
34
|
+
return state;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
generation(state: T): number {
|
|
38
|
+
return this.generations.get(state) ?? 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
release(state: T, generation = this.generation(state)): void {
|
|
42
|
+
if (this.generation(state) !== generation) return;
|
|
43
|
+
state.inUse = false;
|
|
44
|
+
// React cleanup may precede the registry's close notification. The
|
|
45
|
+
// subscription also handles closing a pane that was already unmounted.
|
|
46
|
+
queueMicrotask(() => this.discardClosed());
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** A gesture may finish releasing its source after its document has closed
|
|
50
|
+
* or its state slot has been claimed by a replacement pane. */
|
|
51
|
+
retain(state: T, source: NonNullable<T['source']>, generation: number): void {
|
|
52
|
+
if (
|
|
53
|
+
!this.isOpen(state.documentId) ||
|
|
54
|
+
!this.states.get(state.documentId)?.includes(state) ||
|
|
55
|
+
this.generation(state) !== generation
|
|
56
|
+
) {
|
|
57
|
+
source.dispose();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const previous = state.source;
|
|
61
|
+
state.source = source;
|
|
62
|
+
if (previous !== source) previous?.dispose();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private discardClosed(): void {
|
|
66
|
+
const discarded: T[] = [];
|
|
67
|
+
for (const [documentId, states] of this.states) {
|
|
68
|
+
if (this.isOpen(documentId)) continue;
|
|
69
|
+
const remaining = states.filter(state => state.inUse);
|
|
70
|
+
discarded.push(...states.filter(state => !state.inUse));
|
|
71
|
+
if (remaining.length) this.states.set(documentId, remaining);
|
|
72
|
+
else this.states.delete(documentId);
|
|
73
|
+
}
|
|
74
|
+
if (this.states.size === 0) {
|
|
75
|
+
this.unsubscribe?.();
|
|
76
|
+
this.unsubscribe = null;
|
|
77
|
+
}
|
|
78
|
+
// Remove ownership first, even if a disposer throws or publishes a change.
|
|
79
|
+
const failures: unknown[] = [];
|
|
80
|
+
for (const state of discarded) {
|
|
81
|
+
const source = state.source;
|
|
82
|
+
state.source = null;
|
|
83
|
+
try {
|
|
84
|
+
source?.dispose();
|
|
85
|
+
} catch (error) {
|
|
86
|
+
failures.push(error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (failures.length) throw new AggregateError(failures, 'Retained document cleanup failed');
|
|
90
|
+
}
|
|
91
|
+
}
|