@volter/sdk 0.0.0-stage → 0.5.204
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 +1168 -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 +329 -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 +669 -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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H3 wiring — the instance row's two source actions, registered through the
|
|
3
|
+
* hierarchy contribution seam.
|
|
4
|
+
*
|
|
5
|
+
* This is the "adapter-module registration" half of the split
|
|
6
|
+
* `hierarchy-menu-registry.ts` describes: `GameHierarchy` stays contract-only
|
|
7
|
+
* and never learns that an R3F world has a callsite; THIS module is the one
|
|
8
|
+
* allowed to resolve the owning child adapter and probe it for source
|
|
9
|
+
* accessors. The sentences and the applicability rule are pure and live in
|
|
10
|
+
* `../instance-source-actions.ts`.
|
|
11
|
+
*
|
|
12
|
+
* ISOLATE IS DELIBERATELY ABSENT — see {@link enterInstanceRow}. The design
|
|
13
|
+
* record's "double-click = Isolate, reusing the catalog nodes' existing Isolate
|
|
14
|
+
* mount" is not reachable from a scene instance row, and faking it was
|
|
15
|
+
* explicitly out of scope.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { AuthoringAdapter } from '@volter/project/adapter';
|
|
19
|
+
import type { ShellStore } from '@volter/sdk/kit/shell-store';
|
|
20
|
+
import { registerHierarchyMenuItems } from '@volter/sdk/kit/hierarchy-menu-registry';
|
|
21
|
+
import {
|
|
22
|
+
INSTANCE_SOURCE_LABELS,
|
|
23
|
+
type InstanceSourceLocator,
|
|
24
|
+
type InstanceSourceTarget,
|
|
25
|
+
instanceSourceTargets,
|
|
26
|
+
runInstanceSourceAction,
|
|
27
|
+
} from '@volter/sdk/kit/instance-source-actions';
|
|
28
|
+
import { showTransientHint } from '@volter/sdk/kit/transient-hint';
|
|
29
|
+
import { getActiveAuthoring } from '@volter/sdk/kit/authoring/active-adapter';
|
|
30
|
+
import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
|
|
31
|
+
import { enterSelectionScope } from '@volter/sdk/kit/authoring/selection-scope';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The adapter whose source accessors answer for `nodeId`. Ownership is asked
|
|
35
|
+
* of the composite (`ownerOf`/`childAdapters`, the same public T0 query
|
|
36
|
+
* `GameHierarchy`'s own gates use) rather than decoded from the id — a
|
|
37
|
+
* composite's routers would otherwise answer for a row their owning child
|
|
38
|
+
* knows nothing about.
|
|
39
|
+
*/
|
|
40
|
+
export function instanceSourceLocatorFor(
|
|
41
|
+
adapter: AuthoringAdapter,
|
|
42
|
+
nodeId: string,
|
|
43
|
+
): InstanceSourceLocator | null {
|
|
44
|
+
const owner =
|
|
45
|
+
adapter instanceof CompositeAuthoringAdapter
|
|
46
|
+
? (adapter.childAdapters().find((c) => c.worldId === adapter.ownerOf(nodeId))?.adapter ??
|
|
47
|
+
adapter)
|
|
48
|
+
: adapter;
|
|
49
|
+
const locator = owner as unknown as InstanceSourceLocator;
|
|
50
|
+
return typeof locator.sourceLocation === 'function' ||
|
|
51
|
+
typeof locator.definitionLocation === 'function'
|
|
52
|
+
? locator
|
|
53
|
+
: null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Run one target and SAY what happened — every path returns a sentence
|
|
57
|
+
* (copied / not in the index / clipboard refused), so no click is silent. */
|
|
58
|
+
function runAndReport(
|
|
59
|
+
locator: InstanceSourceLocator | null,
|
|
60
|
+
nodeId: string,
|
|
61
|
+
target: InstanceSourceTarget,
|
|
62
|
+
): void {
|
|
63
|
+
void runInstanceSourceAction(locator, nodeId, target).then(showTransientHint);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Double-click on an instance row.
|
|
68
|
+
*
|
|
69
|
+
* An instance row is already the native authoring subject; portable CSF
|
|
70
|
+
* selects complete design-time states and does not provide a second subtree
|
|
71
|
+
* isolation protocol. Double-click therefore ENTERS the instance's scope and
|
|
72
|
+
* falls back to its callsite when the row cannot be entered.
|
|
73
|
+
*
|
|
74
|
+
* That fallback is the COMMON case, not the corner one: `projectedChildren`
|
|
75
|
+
* collapses everything an instance rendered itself (same `authoringInstance`),
|
|
76
|
+
* so an instance row has children only when it contains a NESTED instance.
|
|
77
|
+
* Every other instance row is a hierarchy leaf, `enterSelectionScope` refuses
|
|
78
|
+
* it for having no children, and until now that double-click did nothing at
|
|
79
|
+
* all — the silent no-op this whole decision exists to kill.
|
|
80
|
+
*
|
|
81
|
+
* Rename is NOT in conflict: `Row`'s `onDoubleClick` already routes every
|
|
82
|
+
* `component`/`instance`/`boundary` row here BEFORE its rename branch, so an
|
|
83
|
+
* instance row has never started a rename on double-click; rename stays
|
|
84
|
+
* reachable on the context menu, where it is always offered for a non-group row.
|
|
85
|
+
*/
|
|
86
|
+
export function enterInstanceRow(adapter: AuthoringAdapter, nodeId: string): void {
|
|
87
|
+
if (enterSelectionScope(adapter, nodeId)) return;
|
|
88
|
+
runCallsite(adapter, nodeId);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function runCallsite(adapter: AuthoringAdapter, nodeId: string): void {
|
|
92
|
+
const node = adapter.hierarchy.node(nodeId);
|
|
93
|
+
const locator = instanceSourceLocatorFor(adapter, nodeId);
|
|
94
|
+
// Only a row that ADVERTISES a callsite falls through to the source action —
|
|
95
|
+
// a boundary/placeholder row with nothing to open keeps double-clicking to
|
|
96
|
+
// nothing, exactly as before, rather than raising a hint the user did not ask
|
|
97
|
+
// for by picking a source verb.
|
|
98
|
+
if (!instanceSourceTargets(node, locator, nodeId).includes('callsite')) return;
|
|
99
|
+
runAndReport(locator, nodeId, 'callsite');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let unregister: (() => void) | null = null;
|
|
103
|
+
|
|
104
|
+
/** Idempotent install of the two H3 items (see the register module). */
|
|
105
|
+
export function ensureInstanceSourceMenuRegistered(): void {
|
|
106
|
+
if (unregister) return;
|
|
107
|
+
unregister = registerHierarchyMenuItems(
|
|
108
|
+
({ nodeId, store }) => targetsFor(store, nodeId).length > 0,
|
|
109
|
+
({ nodeId, store }) => {
|
|
110
|
+
const adapter = getActiveAuthoring(store);
|
|
111
|
+
const locator = instanceSourceLocatorFor(adapter, nodeId);
|
|
112
|
+
return targetsFor(store, nodeId).map((target) => ({
|
|
113
|
+
label: INSTANCE_SOURCE_LABELS[target],
|
|
114
|
+
action: () => {
|
|
115
|
+
runAndReport(locator, nodeId, target);
|
|
116
|
+
},
|
|
117
|
+
}));
|
|
118
|
+
},
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function targetsFor(store: ShellStore, nodeId: string): InstanceSourceTarget[] {
|
|
123
|
+
const adapter = getActiveAuthoring(store);
|
|
124
|
+
return instanceSourceTargets(
|
|
125
|
+
adapter.hierarchy.node(nodeId),
|
|
126
|
+
instanceSourceLocatorFor(adapter, nodeId),
|
|
127
|
+
nodeId,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Test-only: drop the registration so a suite can reset the shared registry. */
|
|
132
|
+
export function __unregisterInstanceSourceMenuForTest(): void {
|
|
133
|
+
unregister?.();
|
|
134
|
+
unregister = null;
|
|
135
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered viewport picking (B4, D12) — "click anything you can see; topmost
|
|
3
|
+
* visible layer wins." Shell POLICY over the composite's public seams, kept a
|
|
4
|
+
* separate module (rather than living inline in `editor-viewport.ts`) so it
|
|
5
|
+
* stays lean AND unit-testable with plain fake adapters — no real DOM/canvas
|
|
6
|
+
* needed.
|
|
7
|
+
*
|
|
8
|
+
* This module speaks ONLY the public contract: `CompositeAuthoringAdapter
|
|
9
|
+
* .childAdapters()` (T0), the `AuthoringAdapter.pickable` provider (D12,
|
|
10
|
+
* `@volter/project/adapter`), and `world-session-state.ts`'s session toggles. It never
|
|
11
|
+
* reaches into any one child adapter's own private, format-specific model (no
|
|
12
|
+
* concrete-world-shape vocabulary of any kind here) — `instanceof
|
|
13
|
+
* CompositeAuthoringAdapter` is the ONE sanctioned type check (that class's
|
|
14
|
+
* own doc comment blesses exactly this use, mirroring
|
|
15
|
+
* `authoring/first-party-inspector/is-first-party-selection.ts`'s identical
|
|
16
|
+
* precedent).
|
|
17
|
+
*
|
|
18
|
+
* Walk order: the composite's NON-threejs children (react/pixi design-time
|
|
19
|
+
* layers), topmost-first by (install-time) manifest zOrder — `stackOrder`
|
|
20
|
+
* sorts bottom-to-top, so `.reverse()` gives topmost-first while preserving
|
|
21
|
+
* its own tie-break rule. The Three world is appended LAST
|
|
22
|
+
* (canvas-bottom) regardless of its manifest zOrder — it always renders
|
|
23
|
+
* beneath every positioned design-time layer (`design-time-layers.ts`'s own
|
|
24
|
+
* doc comment: "the three canvas keeps its existing slot"), so it is
|
|
25
|
+
* correct for it to lose every pick to a layer that also claims the point.
|
|
26
|
+
*
|
|
27
|
+
* A layer that is eye-hidden or pick-locked (`world-session-state.ts`, B1) is
|
|
28
|
+
* skipped ENTIRELY — its `pickable.pick` is never even called. This is a
|
|
29
|
+
* SEPARATE mechanism from a layer's `interactive` toggle: an interactive
|
|
30
|
+
* layer's DOM has `pointer-events: auto`, so a real pointer event lands on the
|
|
31
|
+
* layer's own element and this walk (triggered only by the CANVAS's own
|
|
32
|
+
* `pointerup` listener) never runs at all for that event — mutually exclusive
|
|
33
|
+
* by construction, no code needed here for it.
|
|
34
|
+
*
|
|
35
|
+
* When the active adapter is NOT a composite (single-world project, or a
|
|
36
|
+
* non-composite override), this degrades to that one adapter's own
|
|
37
|
+
* `pickable.pick` (or `null` if it doesn't have one) — today's single-world
|
|
38
|
+
* behavior, unchanged.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import type { AuthoringAdapter } from '@volter/project/adapter';
|
|
42
|
+
import { stackOrder } from '@volter/project/adapter/root-stacking';
|
|
43
|
+
import type { ShellStore } from '@volter/sdk/kit/shell-store';
|
|
44
|
+
import { SCENE_DOCUMENT_ID } from '@volter/sdk/kit/workspace-document-ids';
|
|
45
|
+
import { activeWorkspaceDocumentId } from '@volter/sdk/kit/workspace-document-registry';
|
|
46
|
+
import { getActiveAuthoring } from './active-adapter';
|
|
47
|
+
import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
|
|
48
|
+
import { currentSelectionScopeId } from '@volter/sdk/kit/authoring/selection-scope';
|
|
49
|
+
import { isRootHidden, isRootPickLocked } from '@volter/sdk/kit/authoring/world-session-state';
|
|
50
|
+
|
|
51
|
+
export function resolveAdapterPick(
|
|
52
|
+
adapter: AuthoringAdapter,
|
|
53
|
+
clientX: number,
|
|
54
|
+
clientY: number,
|
|
55
|
+
intent: 'normal' | 'deep',
|
|
56
|
+
): string | null {
|
|
57
|
+
const raw = adapter.pickable?.pick(clientX, clientY) ?? null;
|
|
58
|
+
if (!raw) return null;
|
|
59
|
+
return (
|
|
60
|
+
adapter.selection?.resolve?.(raw, {
|
|
61
|
+
intent,
|
|
62
|
+
scopeId: currentSelectionScopeId(),
|
|
63
|
+
})?.id ?? raw
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function resolveAdapterCandidates(
|
|
68
|
+
adapter: AuthoringAdapter,
|
|
69
|
+
clientX: number,
|
|
70
|
+
clientY: number,
|
|
71
|
+
intent: 'normal' | 'deep',
|
|
72
|
+
includeLocked = false,
|
|
73
|
+
): string[] {
|
|
74
|
+
const raw = adapter.pickable?.candidates?.(clientX, clientY, includeLocked ? { includeLocked } : undefined) ?? [];
|
|
75
|
+
const resolved: string[] = [];
|
|
76
|
+
const seen = new Set<string>();
|
|
77
|
+
for (const id of raw) {
|
|
78
|
+
const candidate =
|
|
79
|
+
adapter.selection?.resolve?.(id, {
|
|
80
|
+
intent,
|
|
81
|
+
scopeId: currentSelectionScopeId(),
|
|
82
|
+
})?.id ?? id;
|
|
83
|
+
if (!seen.has(candidate)) {
|
|
84
|
+
seen.add(candidate);
|
|
85
|
+
resolved.push(candidate);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return resolved;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Topmost-first pick across every visible, pick-unlocked layer of the active
|
|
92
|
+
* (possibly composite) authoring adapter. Returns the winning node id, or
|
|
93
|
+
* `null` when nothing under `(clientX, clientY)` claims the point. */
|
|
94
|
+
export function pickTopmost(
|
|
95
|
+
store: ShellStore,
|
|
96
|
+
clientX: number,
|
|
97
|
+
clientY: number,
|
|
98
|
+
options: { intent?: 'normal' | 'deep' } = {},
|
|
99
|
+
): string | null {
|
|
100
|
+
const intent = options.intent ?? 'normal';
|
|
101
|
+
const active = getActiveAuthoring(store);
|
|
102
|
+
if (!(active instanceof CompositeAuthoringAdapter)) {
|
|
103
|
+
return resolveAdapterPick(active, clientX, clientY, intent);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const children = active.childAdapters();
|
|
107
|
+
// The Game document stays mounted warm while Scene is active. Its DOM rects
|
|
108
|
+
// therefore still exist even though it is not painted. Document ownership,
|
|
109
|
+
// not mount lifetime, decides which layers may claim the pointer.
|
|
110
|
+
const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
|
|
111
|
+
const layered = sceneDocumentActive ? [] : children.filter((c) => c.kind !== 'three');
|
|
112
|
+
const three = children.filter((c) => c.kind === 'three');
|
|
113
|
+
|
|
114
|
+
// `stackOrder` wants `{id, zOrder}` (`ClaimEntry`) — reuse `worldId` as its
|
|
115
|
+
// `id` (this walk has no separate id vocabulary of its own).
|
|
116
|
+
const layeredClaims = layered.map((c) => ({
|
|
117
|
+
id: c.worldId,
|
|
118
|
+
zOrder: c.zOrder,
|
|
119
|
+
worldId: c.worldId,
|
|
120
|
+
adapter: c.adapter,
|
|
121
|
+
}));
|
|
122
|
+
|
|
123
|
+
// Topmost-first: `stackOrder` is bottom-to-top (ascending zOrder, ties by
|
|
124
|
+
// original array order) — `.reverse()` flips it without disturbing its own
|
|
125
|
+
// tie-break rule (a later-declared same-zOrder layer still wins the tie,
|
|
126
|
+
// now by being checked FIRST instead of sorting last).
|
|
127
|
+
const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
|
|
128
|
+
...stackOrder(layeredClaims).reverse(),
|
|
129
|
+
// The Three world paints/picks LAST — canvas-bottom, regardless
|
|
130
|
+
// of its own manifest zOrder (see module doc comment).
|
|
131
|
+
...three,
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
for (const { worldId, adapter } of order) {
|
|
135
|
+
if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
|
|
136
|
+
const hit = resolveAdapterPick(adapter, clientX, clientY, intent);
|
|
137
|
+
if (hit) return hit;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Ordered overlap stack across the same visible layers as {@link pickTopmost}. */
|
|
143
|
+
export function pickCandidates(
|
|
144
|
+
store: ShellStore,
|
|
145
|
+
clientX: number,
|
|
146
|
+
clientY: number,
|
|
147
|
+
options: { intent?: 'normal' | 'deep'; adapter?: AuthoringAdapter; includeLocked?: boolean } = {},
|
|
148
|
+
): string[] {
|
|
149
|
+
const intent = options.intent ?? 'normal';
|
|
150
|
+
const includeLocked = options.includeLocked === true;
|
|
151
|
+
const active = options.adapter ?? getActiveAuthoring(store);
|
|
152
|
+
if (!(active instanceof CompositeAuthoringAdapter)) {
|
|
153
|
+
const candidates = resolveAdapterCandidates(active, clientX, clientY, intent, includeLocked);
|
|
154
|
+
const fallback = resolveAdapterPick(active, clientX, clientY, intent);
|
|
155
|
+
return candidates.length > 0 ? candidates : fallback ? [fallback] : [];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const children = active.childAdapters();
|
|
159
|
+
const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
|
|
160
|
+
const layered = sceneDocumentActive ? [] : children.filter((child) => child.kind !== 'three');
|
|
161
|
+
const three = children.filter((child) => child.kind === 'three');
|
|
162
|
+
const layeredClaims = layered.map((child) => ({
|
|
163
|
+
id: child.worldId,
|
|
164
|
+
zOrder: child.zOrder,
|
|
165
|
+
worldId: child.worldId,
|
|
166
|
+
adapter: child.adapter,
|
|
167
|
+
}));
|
|
168
|
+
const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
|
|
169
|
+
...stackOrder(layeredClaims).reverse(),
|
|
170
|
+
...three,
|
|
171
|
+
];
|
|
172
|
+
const result: string[] = [];
|
|
173
|
+
const seen = new Set<string>();
|
|
174
|
+
for (const { worldId, adapter } of order) {
|
|
175
|
+
if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
|
|
176
|
+
const candidates = resolveAdapterCandidates(adapter, clientX, clientY, intent, includeLocked);
|
|
177
|
+
const fallback = resolveAdapterPick(adapter, clientX, clientY, intent);
|
|
178
|
+
for (const id of candidates.length > 0 ? candidates : fallback ? [fallback] : []) {
|
|
179
|
+
if (seen.has(id)) continue;
|
|
180
|
+
seen.add(id);
|
|
181
|
+
result.push(id);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHICH ROOTS THE ACTIVE AUTHORING SURFACE PRESENTS LIVE — the host's own
|
|
3
|
+
* answer to "what is mounted, and through which adapter".
|
|
4
|
+
*
|
|
5
|
+
* It lived in `coverage/root-coverage.ts` because the per-root coverage report
|
|
6
|
+
* was its first reader, and it stayed there long after a second one appeared.
|
|
7
|
+
* It is not a grade: the vitals' `presented three roots` invariant ("a scene
|
|
8
|
+
* has one root", `coverage/ontology-invariants.ts`) asks it, the Hierarchy and
|
|
9
|
+
* the gizmo work over exactly these subjects, and a host with no game skew
|
|
10
|
+
* loaded still has every one of them. So it is the authoring seam's, beside
|
|
11
|
+
* `active-adapter.ts` whose override it reads — and the coverage report that
|
|
12
|
+
* grades these subjects can leave the host without taking the question with
|
|
13
|
+
* it.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { AuthoringAdapter } from '@volter/project/adapter';
|
|
17
|
+
import type { AdapterSurface } from '@volter/project/adapter/adapter-surface';
|
|
18
|
+
import { liveSurface } from '@volter/sdk/kit/live-session-registry';
|
|
19
|
+
import { projectAdapterFacet } from '../project-adapter';
|
|
20
|
+
import {
|
|
21
|
+
activeWorkspaceDocument,
|
|
22
|
+
activeWorkspaceDocumentSelection,
|
|
23
|
+
} from '@volter/sdk/kit/workspace-document-registry';
|
|
24
|
+
import { getAuthoringOverride } from '@volter/sdk/kit/authoring/active-adapter';
|
|
25
|
+
import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
|
|
26
|
+
import { emptyProjectAuthoring } from '@volter/sdk/kit/authoring/empty-project-authoring';
|
|
27
|
+
|
|
28
|
+
/** One mounted root, as this module needs to see it. Structural on purpose: the
|
|
29
|
+
* composite hands these over, and a test can build one by hand. */
|
|
30
|
+
export interface MountedRootSubject {
|
|
31
|
+
readonly worldId: string;
|
|
32
|
+
readonly surface: AdapterSurface | null;
|
|
33
|
+
readonly adapter: AuthoringAdapter;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const SURFACE_KINDS: readonly string[] = ['three', 'canvas', 'dom'];
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A root that DECLARES it has no live editing surface here — the disclosure
|
|
40
|
+
* adapter (`AuthoringProvenance.source === 'boundary'`) a manifest-declared
|
|
41
|
+
* world wears while its real mount is still assembling, or after that mount was
|
|
42
|
+
* suspended or failed.
|
|
43
|
+
*
|
|
44
|
+
* It is NOT a coverage subject. Grading a disclosure against the provider
|
|
45
|
+
* contract prints "this root exposes no <provider> provider" fourteen times
|
|
46
|
+
* about a surface that does not exist yet — a snapshot that is false the moment
|
|
47
|
+
* it is taken and, because the console sync forwards warnings to the server's
|
|
48
|
+
* unresolved ledger, then stands there forever beside the real post-mount
|
|
49
|
+
* report.
|
|
50
|
+
*
|
|
51
|
+
* MEASURED on a canvas ingest: opening the project installs the edit-mode
|
|
52
|
+
* composite with a Boundary child for the ingest root
|
|
53
|
+
* (`authoring/edit-mode-authoring.ts`), and the mount then spends SECONDS
|
|
54
|
+
* awaiting the Game document, the capture window — a budget of VISIBLE time,
|
|
55
|
+
* 8s by default, which PARKS while the tab is hidden
|
|
56
|
+
* (`ingest/capture-wait-report.ts`) — and the stage settle, before
|
|
57
|
+
* `setActiveAuthoring` swaps the live adapter in
|
|
58
|
+
* (`ingest/mount-canvas-ingest-root.ts`). The vitals sampler runs every 5s
|
|
59
|
+
* (`coverage/session-vitals.ts`), so an ordinary reload lands inside that
|
|
60
|
+
* window and files "16 of 30 seams are MISSING" against a session that reports
|
|
61
|
+
* zero editor gaps seconds later.
|
|
62
|
+
*
|
|
63
|
+
* The stand-down is principled rather than timed: no debounce, no delay, no
|
|
64
|
+
* game id. Provenance is the adapter's OWN statement of what its rows project
|
|
65
|
+
* (rule zero — the shell reads the field, it never infers truth from adapter
|
|
66
|
+
* identity), and "declared world with no live editing surface here" is the
|
|
67
|
+
* adapter saying the mount has not attached. Coverage over an unattached mount
|
|
68
|
+
* is not a measurement.
|
|
69
|
+
*
|
|
70
|
+
* A root that mounted and honestly publishes nothing is the OPPOSITE case and
|
|
71
|
+
* stays a subject: `authoring/no-authoring-adapter.ts` declares no provenance
|
|
72
|
+
* at all, because "this root has no authoring surface" is a real, standing
|
|
73
|
+
* capability gap that the report exists to keep loud.
|
|
74
|
+
*/
|
|
75
|
+
function isBoundaryDisclosure(adapter: AuthoringAdapter): boolean {
|
|
76
|
+
return adapter.provenance?.source === 'boundary';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** The composite's `kind` string as a surface, or `null` when it is not one of
|
|
80
|
+
* the three the host hands out — in which case NOTHING is excused (see
|
|
81
|
+
* `CapabilityCoverageFacts.surface`). */
|
|
82
|
+
function asSurface(kind: string): AdapterSurface | null {
|
|
83
|
+
return SURFACE_KINDS.includes(kind) ? (kind as AdapterSurface) : null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Every root the active authoring surface presents LIVE, or `[]` when nothing is
|
|
88
|
+
* mounted.
|
|
89
|
+
*
|
|
90
|
+
* A composite lists its children; a bare adapter IS the one root. `role:
|
|
91
|
+
* 'surface'` children are skipped: they are adapter-owned content INSIDE a
|
|
92
|
+
* root (a nested board, a scene-UI seam), not roots the manifest declared, and
|
|
93
|
+
* grading them against the full contract would invent gaps for things that were
|
|
94
|
+
* never meant to be roots. {@link isBoundaryDisclosure} children are skipped for
|
|
95
|
+
* the sibling reason: they are worlds the editor has DISCLOSED, not mounted.
|
|
96
|
+
*/
|
|
97
|
+
export function mountedRootSubjects(): readonly MountedRootSubject[] {
|
|
98
|
+
// An isolation document is a real Edit mount owned by one declared region,
|
|
99
|
+
// even though it deliberately does not replace the composition-wide active
|
|
100
|
+
// adapter. Its workspace binding is the same adapter Hierarchy, Inspector,
|
|
101
|
+
// and writes use; its descriptor carries the owning root. Measure that pair
|
|
102
|
+
// first so coverage describes the surface the author is actually editing.
|
|
103
|
+
const documentSelection = activeWorkspaceDocumentSelection();
|
|
104
|
+
const documentRootId = activeWorkspaceDocument()?.descriptor.provenance?.rootId;
|
|
105
|
+
const documentRegion = documentRootId
|
|
106
|
+
? projectAdapterFacet()?.regions.find((region) => region.id === documentRootId)
|
|
107
|
+
: undefined;
|
|
108
|
+
const documentSubject =
|
|
109
|
+
documentSelection?.adapter && documentRootId && documentRegion
|
|
110
|
+
? {
|
|
111
|
+
worldId: documentRootId,
|
|
112
|
+
surface: documentRegion.surface,
|
|
113
|
+
adapter: documentSelection.adapter,
|
|
114
|
+
}
|
|
115
|
+
: null;
|
|
116
|
+
const active = getAuthoringOverride();
|
|
117
|
+
if (!active) return documentSubject ? [documentSubject] : [];
|
|
118
|
+
if (active instanceof CompositeAuthoringAdapter) {
|
|
119
|
+
const subjects = active
|
|
120
|
+
.childAdapters()
|
|
121
|
+
.filter((child) => child.role === 'world' && !isBoundaryDisclosure(child.adapter))
|
|
122
|
+
.map((child) => ({
|
|
123
|
+
worldId: child.worldId,
|
|
124
|
+
surface: asSurface(child.kind),
|
|
125
|
+
adapter: child.adapter,
|
|
126
|
+
}));
|
|
127
|
+
if (!documentSubject) return subjects;
|
|
128
|
+
return [documentSubject, ...subjects.filter((subject) => subject.worldId !== documentRootId)];
|
|
129
|
+
}
|
|
130
|
+
// A project that declares no roots wears a placeholder that says so; nothing is mounted.
|
|
131
|
+
if (isBoundaryDisclosure(active) || active === emptyProjectAuthoring()) return documentSubject ? [documentSubject] : [];
|
|
132
|
+
// A bare (non-composite) active adapter still HAS a surface — a live ingest
|
|
133
|
+
// session states its render substrate outright, and `IngestKind` and
|
|
134
|
+
// `AdapterSurface` are the same three words by construction. Leaving this
|
|
135
|
+
// `null` reported the canvas N-A trio (assetSubject/text/colorSample) as
|
|
136
|
+
// gaps on every bare canvas mount, while the surface-aware ingest door
|
|
137
|
+
// called the same three rows `na` — two doors disagreeing about one mount.
|
|
138
|
+
// No live ingest ⇒ `null` stays, and nothing is excused (the deliberate
|
|
139
|
+
// cheap-direction-to-be-wrong).
|
|
140
|
+
const activeSubject = {
|
|
141
|
+
worldId: 'root',
|
|
142
|
+
surface: liveSurface(),
|
|
143
|
+
adapter: active,
|
|
144
|
+
};
|
|
145
|
+
return documentSubject ? [documentSubject, activeSubject] : [activeSubject];
|
|
146
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NoAuthoringAdapter — what the editor can honestly offer over a mounted root
|
|
3
|
+
* that exposes no authoring surface at all.
|
|
4
|
+
*
|
|
5
|
+
* A `{ module }` adapter is free to publish nothing authorable: it mounts, it
|
|
6
|
+
* draws, and the host has no tree to bind the hierarchy/inspector/gizmo to.
|
|
7
|
+
* Rather than hide that root, or fabricate a surface for it, this adapter
|
|
8
|
+
* advertises exactly what is true — one informational hierarchy node and all
|
|
9
|
+
* `capabilities` false — so the editor's generic panels render an honest
|
|
10
|
+
* nothing-to-author state instead of pretending to edit.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
AuthoringAdapter,
|
|
15
|
+
AuthoringCapabilities,
|
|
16
|
+
EditorNode,
|
|
17
|
+
HierarchyProvider,
|
|
18
|
+
} from '@volter/project/adapter';
|
|
19
|
+
import type { ShellDocumentState } from '@volter/sdk/kit/shell-document-state';
|
|
20
|
+
|
|
21
|
+
/** The one hierarchy row this adapter publishes. Exported because it is a
|
|
22
|
+
* MESSAGE, not an entity: a surface that lists entities (the command palette)
|
|
23
|
+
* has to be able to tell it apart from a thing a person can select. */
|
|
24
|
+
export const NO_AUTHORING_ID = 'no-authoring:root';
|
|
25
|
+
|
|
26
|
+
export function makeNoAuthoringAdapter(
|
|
27
|
+
store: ShellDocumentState,
|
|
28
|
+
label: string,
|
|
29
|
+
secondaryLabel = 'No authoring surface',
|
|
30
|
+
): AuthoringAdapter {
|
|
31
|
+
const node: EditorNode = {
|
|
32
|
+
id: NO_AUTHORING_ID,
|
|
33
|
+
label,
|
|
34
|
+
secondaryLabel,
|
|
35
|
+
role: 'boundary',
|
|
36
|
+
kind: 'object',
|
|
37
|
+
parentId: null,
|
|
38
|
+
childIds: [],
|
|
39
|
+
};
|
|
40
|
+
const hierarchy: HierarchyProvider = {
|
|
41
|
+
roots: () => [node],
|
|
42
|
+
node: (id) => (id === NO_AUTHORING_ID ? node : null),
|
|
43
|
+
// No `object3D`/`idForObject3D`: there is no reachable Object3D to offer.
|
|
44
|
+
};
|
|
45
|
+
const capabilities: AuthoringCapabilities = {
|
|
46
|
+
transform: false,
|
|
47
|
+
inspectorFields: false,
|
|
48
|
+
persist: false,
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
capabilities,
|
|
52
|
+
hierarchy,
|
|
53
|
+
selection: {
|
|
54
|
+
get: () => [...store.selectedEntityIds],
|
|
55
|
+
set: (ids) => store.selectMultiple(ids),
|
|
56
|
+
},
|
|
57
|
+
subscribe: (listener) => store.subscribe(listener),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Asset Lab persistence. Project code serializes its own native
|
|
3
|
+
* document into ordinary files; this host-side bridge owns transaction
|
|
4
|
+
* ordering, checksum preflight, compensation, and canonical undo/redo.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { HistoryService } from '@volter/sdk/kit/history/history-service';
|
|
8
|
+
import {
|
|
9
|
+
getProjectFileHistory,
|
|
10
|
+
type HistoryFileBackend,
|
|
11
|
+
type ProjectFileMutation,
|
|
12
|
+
type ProjectFileMutationSession,
|
|
13
|
+
} from '../history/project-file-history';
|
|
14
|
+
import { getProjectResourceHistoryBackend } from '../history/project-root-history-backends';
|
|
15
|
+
import { runWritePipe, type WriteAck, type WriteResolution } from '@volter/sdk/kit/write-pipe';
|
|
16
|
+
|
|
17
|
+
/** One project-owned artifact participating in an Asset Lab commit. The document is whatever the
|
|
18
|
+
* medium hands its serializers (Three's is `ToolObject3DDocumentState`). */
|
|
19
|
+
export interface DocumentPersistenceResource<TDocument> {
|
|
20
|
+
/** Project-root-relative destination. */
|
|
21
|
+
readonly path: string;
|
|
22
|
+
/** MIME type recorded in canonical history. */
|
|
23
|
+
readonly contentType?: string;
|
|
24
|
+
/** `null` removes the file in the same atomic transaction. */
|
|
25
|
+
readonly serialize: (
|
|
26
|
+
document: TDocument,
|
|
27
|
+
) => string | Uint8Array | null | Promise<string | Uint8Array | null>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface DocumentPersistenceBinding<TDocument> {
|
|
31
|
+
/** Default undo/redo label. A completed gesture may supply a narrower one. */
|
|
32
|
+
readonly label?: string;
|
|
33
|
+
/** Non-empty, path-unique set of files owned by this document. */
|
|
34
|
+
readonly resources: readonly DocumentPersistenceResource<TDocument>[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface OpenObject3DDocumentPersistenceOptions<TDocument = unknown> {
|
|
38
|
+
readonly binding: DocumentPersistenceBinding<TDocument>;
|
|
39
|
+
readonly document: TDocument;
|
|
40
|
+
readonly history: HistoryService;
|
|
41
|
+
readonly backend?: HistoryFileBackend;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function serializeObject3DDocument<TDocument>(
|
|
45
|
+
binding: DocumentPersistenceBinding<TDocument>,
|
|
46
|
+
document: TDocument,
|
|
47
|
+
): Promise<ProjectFileMutation[]> {
|
|
48
|
+
if (binding.resources.length === 0) {
|
|
49
|
+
throw new Error('An Object3D document persistence binding must own at least one resource.');
|
|
50
|
+
}
|
|
51
|
+
const changes: ProjectFileMutation[] = [];
|
|
52
|
+
for (const resource of binding.resources) {
|
|
53
|
+
changes.push({
|
|
54
|
+
path: resource.path,
|
|
55
|
+
data: await resource.serialize(document),
|
|
56
|
+
contentType: resource.contentType ?? 'application/octet-stream',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return changes;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface Object3DDocumentPersistenceSession<TDocument = unknown> {
|
|
63
|
+
/** Commit through the one persistence pipe, and answer for THIS commit.
|
|
64
|
+
* `persisted: false` means the serializers produced the bytes already on
|
|
65
|
+
* disk and nothing moved — a real outcome, not a failure (a failure throws). */
|
|
66
|
+
commit(document: TDocument, label?: string): Promise<WriteAck>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Where an Asset Lab document's bytes go — the binding's own resource paths,
|
|
70
|
+
* which is the finest-grained honest answer this lane has. */
|
|
71
|
+
function destinationOf<TDocument>(binding: DocumentPersistenceBinding<TDocument>): string {
|
|
72
|
+
return binding.resources.map((resource) => resource.path).join(' + ');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Establish the exact serialized bytes represented by a newly mounted native
|
|
77
|
+
* document. Every later commit is checked against that mount-time baseline,
|
|
78
|
+
* so a stale HMR module can never overwrite a newer sidecar on disk.
|
|
79
|
+
*/
|
|
80
|
+
export async function openObject3DDocumentPersistence<TDocument>(
|
|
81
|
+
options: OpenObject3DDocumentPersistenceOptions<TDocument>,
|
|
82
|
+
): Promise<Object3DDocumentPersistenceSession<TDocument>> {
|
|
83
|
+
const { binding, document, history } = options;
|
|
84
|
+
const files = getProjectFileHistory(
|
|
85
|
+
history,
|
|
86
|
+
options.backend ?? getProjectResourceHistoryBackend(),
|
|
87
|
+
'asset-lab-document',
|
|
88
|
+
);
|
|
89
|
+
const session: ProjectFileMutationSession = await files.openMutationSession(
|
|
90
|
+
await serializeObject3DDocument(binding, document),
|
|
91
|
+
);
|
|
92
|
+
return {
|
|
93
|
+
// THE ONE PIPE, this lane's plug: resolve (a binding with resources is a
|
|
94
|
+
// real destination) → write (serialize + the file-mutation transaction) →
|
|
95
|
+
// record (that transaction IS the history entry, so nothing more).
|
|
96
|
+
commit: (nextDocument, requestedLabel) =>
|
|
97
|
+
runWritePipe({
|
|
98
|
+
resolve: (): WriteResolution => ({
|
|
99
|
+
reaches: 'writer',
|
|
100
|
+
// The document's own file is the anchor: no source literal addresses
|
|
101
|
+
// it, and project code serializes the record the editor edited.
|
|
102
|
+
anchorKind: 'data-record',
|
|
103
|
+
destination: destinationOf(binding),
|
|
104
|
+
write: async () => {
|
|
105
|
+
// Check the mount-time bytes BEFORE entering project code. HMR can
|
|
106
|
+
// invalidate a serializer's module-local state; a newer file must
|
|
107
|
+
// still receive the canonical content-conflict refusal, never that
|
|
108
|
+
// incidental serializer error and never an overwrite.
|
|
109
|
+
await session.assertUnchanged();
|
|
110
|
+
// Serialize before entering history: a failing project serializer
|
|
111
|
+
// writes nothing and cannot advance the open-document checksum
|
|
112
|
+
// baseline.
|
|
113
|
+
const changes = await serializeObject3DDocument(binding, nextDocument);
|
|
114
|
+
const label =
|
|
115
|
+
requestedLabel?.trim() || binding.label?.trim() || 'Edit Asset Lab Document';
|
|
116
|
+
return session.mutate(changes, { label });
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
record: () => undefined,
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
}
|