@volter/editor-core 0.5.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "What is the inspector looking at right now?" — the LIVE half of the
|
|
3
|
+
* serialized projection (`inspection/serialize.ts` is the pure half; design:
|
|
4
|
+
* `docs/ARCHITECTURE-CORE.md` §Editor chrome, "The Inspection Model"; build
|
|
5
|
+
* ledger: `docs/WORK.md` §Inspection Model program, W4).
|
|
6
|
+
*
|
|
7
|
+
* `components/Inspector.tsx` answers this question every render, for the
|
|
8
|
+
* column and the card. This module answers the SAME question, with the SAME
|
|
9
|
+
* calls in the SAME order, for the agent surface (`editor.inspect`) — because
|
|
10
|
+
* "the agent reads what the human sees" is only true if both go through
|
|
11
|
+
* `composeInspectionSubject` with identically-resolved inputs. Every step is
|
|
12
|
+
* shared code, not a re-derivation: `activeInspectionSurface`,
|
|
13
|
+
* `resolvePanelAuthoring`, `resolveInspectionSubjectId`, `matchedInspectorSections`,
|
|
14
|
+
* `describeNullInspectionSubject`, `resolveComposeStoriesInput`.
|
|
15
|
+
*
|
|
16
|
+
* The two do not differ ANYWHERE any more. An asset document is the three
|
|
17
|
+
* paradigm scoped to a subtree, so clicking a part inside one composes that
|
|
18
|
+
* part's subject through the document's own adapter exactly as clicking a
|
|
19
|
+
* node in the scene composes that node's, and the document's own identity
|
|
20
|
+
* floor arrives through the same no-selection seam every other surface uses
|
|
21
|
+
* (`authoring/null-inspection-subjects.tsx` reads what the document published
|
|
22
|
+
* to `inspection/document-subject.ts`).
|
|
23
|
+
*
|
|
24
|
+
* It is a FUNCTION over live state, like `inspection/active-surface.ts`: no
|
|
25
|
+
* cache, no subscription, no store. The answer is composed at the moment it
|
|
26
|
+
* is asked for.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
30
|
+
import { CompositeAuthoringAdapter } from '../authoring/composite-authoring-adapter';
|
|
31
|
+
import type { Object3DDocumentSession } from '../authoring/object3d-document-session';
|
|
32
|
+
import { object3DDocumentSession } from '../authoring/object3d-document-session-registry';
|
|
33
|
+
import { resolvePanelAuthoring } from '../authoring/panel-authoring';
|
|
34
|
+
import { LIVE_ONLY_ACK, type WriteAck } from '../authoring/write-pipe';
|
|
35
|
+
import { openEntityAssetDocument } from '../components/asset-documents';
|
|
36
|
+
import { describeAssetSelectionSubject } from '../components/asset-selection-section';
|
|
37
|
+
import { ingestCoverageSection } from '../components/CapabilityCoverageSection';
|
|
38
|
+
import { resolveInspectionSubjectId } from '../components/inspector-selection';
|
|
39
|
+
import { resolveComposeStoriesInput } from '../components/inspector-stories-gating';
|
|
40
|
+
import { kindDocumentEntry } from '../components/kind-documents';
|
|
41
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
42
|
+
import { entityObject3D } from '../entity-object';
|
|
43
|
+
import { inspectorPresentationOverride } from '../inspector-presentation';
|
|
44
|
+
import { matchedInspectorSections } from '../inspector-section-registry';
|
|
45
|
+
import { liveCoverage } from '../live-session-registry';
|
|
46
|
+
import { documentContributionForKind } from '../tool-loader';
|
|
47
|
+
import { GAME_DOCUMENT_ID } from '../workspace-document-ids';
|
|
48
|
+
import {
|
|
49
|
+
activeWorkspaceDocument,
|
|
50
|
+
activeWorkspaceDocumentId,
|
|
51
|
+
type WorkspaceDocumentSelection,
|
|
52
|
+
} from '../workspace-document-registry';
|
|
53
|
+
import { activeChromeRegions } from '../workspace-regions';
|
|
54
|
+
import { activeInspectionSurface } from './active-surface';
|
|
55
|
+
import {
|
|
56
|
+
composeInspectionSubject,
|
|
57
|
+
composeNullInspectionSubject,
|
|
58
|
+
type OwnedInspectorRail,
|
|
59
|
+
} from './compose';
|
|
60
|
+
import {
|
|
61
|
+
type InspectionDisplay,
|
|
62
|
+
inspectorBelongsToAnotherDocument,
|
|
63
|
+
resolveInspectionDisplay,
|
|
64
|
+
} from './display';
|
|
65
|
+
import { GAME_SUBJECT_ID } from './game-subject';
|
|
66
|
+
import {
|
|
67
|
+
type FieldDescriptor,
|
|
68
|
+
fieldReadonlyReason,
|
|
69
|
+
type InspectionFieldIo,
|
|
70
|
+
type InspectionSubject,
|
|
71
|
+
type InspectionSurfaceKind,
|
|
72
|
+
} from './model';
|
|
73
|
+
import { describeNullInspectionSubject } from './null-subject';
|
|
74
|
+
import { NO_INSPECTION, type SerializedInspection, serializeInspectionSubject } from './serialize';
|
|
75
|
+
|
|
76
|
+
/** A composed subject plus "is there an inspector at all?" — everything the
|
|
77
|
+
* one compose call site produces, before any projection decision. */
|
|
78
|
+
export interface ComposedInspection {
|
|
79
|
+
readonly subject: InspectionSubject;
|
|
80
|
+
/** A selection, or the surface's own `describeSubject(null)` answer, or a
|
|
81
|
+
* contribution that matched the empty selection (the asset browser's
|
|
82
|
+
* transient selection is one). `false` means NOTHING renders. */
|
|
83
|
+
readonly available: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** One capture function per live native document. Inspector composition is a
|
|
87
|
+
* pure read and may run for unrelated shell updates; keeping this callback
|
|
88
|
+
* stable prevents those updates from retriggering an expensive GPU readback.
|
|
89
|
+
* `previewKey` still requests a fresh frame when the actual selection changes. */
|
|
90
|
+
const object3DDocumentCaptures = new WeakMap<
|
|
91
|
+
Object3DDocumentSession,
|
|
92
|
+
(size: number) => Promise<string | null>
|
|
93
|
+
>();
|
|
94
|
+
|
|
95
|
+
function object3DDocumentCapture(
|
|
96
|
+
session: Object3DDocumentSession,
|
|
97
|
+
): (size: number) => Promise<string | null> {
|
|
98
|
+
const existing = object3DDocumentCaptures.get(session);
|
|
99
|
+
if (existing) return existing;
|
|
100
|
+
const capture = async (size: number) => session.captureImage(size);
|
|
101
|
+
object3DDocumentCaptures.set(session, capture);
|
|
102
|
+
return capture;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
interface NativeCanvasPreviewAdapter extends AuthoringAdapter {
|
|
106
|
+
previewImage(id: string, width: number, height: number): Promise<string | null>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function hasNativeCanvasPreview(adapter: AuthoringAdapter): adapter is NativeCanvasPreviewAdapter {
|
|
110
|
+
return typeof (adapter as Partial<NativeCanvasPreviewAdapter>).previewImage === 'function';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Resolve the native canvas-preview owner behind a selected id, including a
|
|
114
|
+
* manifest composite. Capability presence is enough; importing the concrete
|
|
115
|
+
* Pixi adapter here made every Three-only editor boot initialize Pixi. */
|
|
116
|
+
function canvasPreviewFor(
|
|
117
|
+
adapter: AuthoringAdapter,
|
|
118
|
+
nodeId: string | null,
|
|
119
|
+
surface: InspectionSurfaceKind | undefined,
|
|
120
|
+
): ((size: number) => Promise<string | null>) | null {
|
|
121
|
+
if (!nodeId) return null;
|
|
122
|
+
// Asset Lab already owns the canonical native viewport. Re-mounting the
|
|
123
|
+
// selected Object3D inside Inspector duplicates its scene, animation mixer
|
|
124
|
+
// and render loop (and a lone SkinnedMesh cannot own its sibling bones).
|
|
125
|
+
// Capture the existing viewport once instead: honest native pixels, no
|
|
126
|
+
// second continuously-rendered rig, and no fabricated preview hierarchy.
|
|
127
|
+
if (surface === 'asset-lab') {
|
|
128
|
+
const documentId = activeWorkspaceDocumentId();
|
|
129
|
+
const session = documentId ? object3DDocumentSession(documentId) : null;
|
|
130
|
+
return session ? object3DDocumentCapture(session) : null;
|
|
131
|
+
}
|
|
132
|
+
let candidate = adapter;
|
|
133
|
+
if (adapter instanceof CompositeAuthoringAdapter) {
|
|
134
|
+
const worldId = adapter.ownerOf(nodeId);
|
|
135
|
+
candidate =
|
|
136
|
+
adapter.childAdapters().find((child) => child.worldId === worldId)?.adapter ?? adapter;
|
|
137
|
+
}
|
|
138
|
+
return hasNativeCanvasPreview(candidate)
|
|
139
|
+
? (size) => candidate.previewImage(nodeId, size, size)
|
|
140
|
+
: null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* WHOSE RAIL IS THIS? — the active document's own package's, when that
|
|
145
|
+
* document declared `export const inspectorRail = 'owned'` (owner ruling,
|
|
146
|
+
* WORK.md §Blender in the tab is Blender, "Inspection parity", I2 decision 1).
|
|
147
|
+
*
|
|
148
|
+
* The one case shipped today is the Model document: Blender's Properties
|
|
149
|
+
* editor draws the tabs `ED_buttons_tabs_list` returns and nothing else, so
|
|
150
|
+
* the host's Preview / Transform / generic Object / Geometry / Materials
|
|
151
|
+
* blocks stand down beside Blender's sixteen. The resolution is a lookup, not
|
|
152
|
+
* a policy: a kind document's entry names its kind, the kind names its
|
|
153
|
+
* contribution (`tool-loader.ts`'s `documentContributionForKind`), and the
|
|
154
|
+
* contribution says whether it owns the rail and which built-ins it keeps.
|
|
155
|
+
*
|
|
156
|
+
* Spread into the compose input, so a document that owns nothing contributes
|
|
157
|
+
* no key at all and composition is byte-identical to before this existed.
|
|
158
|
+
*/
|
|
159
|
+
function ownedInspectorRail(): { rail: OwnedInspectorRail } | null {
|
|
160
|
+
const documentId = activeWorkspaceDocumentId();
|
|
161
|
+
if (documentId === null) return null;
|
|
162
|
+
const entry = kindDocumentEntry(documentId);
|
|
163
|
+
if (entry === undefined) return null;
|
|
164
|
+
const contribution = documentContributionForKind(entry.kind);
|
|
165
|
+
if (contribution === undefined || contribution.inspectorRail !== 'owned') return null;
|
|
166
|
+
return {
|
|
167
|
+
rail: { owner: contribution.owner, builtins: contribution.inspectorBuiltins ?? [] },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The ONE compose call site for the live shell — the whole of "resolve the
|
|
173
|
+
* four channels for THIS binding and hand them to `inspection/compose.ts`".
|
|
174
|
+
*
|
|
175
|
+
* Two callers, and they differ only in where the binding comes from:
|
|
176
|
+
* {@link describeActiveInspectionSubject} resolves it from live state, and
|
|
177
|
+
* `components/Inspector.tsx`'s bounded design-system host is handed one. They
|
|
178
|
+
* used to be two copies of this block; keeping the copies in step was
|
|
179
|
+
* discipline, and the point of the model is that it should be structure.
|
|
180
|
+
*/
|
|
181
|
+
export function composeInspectionForBinding(input: {
|
|
182
|
+
readonly store: EditorShellStore;
|
|
183
|
+
readonly adapter: AuthoringAdapter;
|
|
184
|
+
readonly documentSelection: WorkspaceDocumentSelection | null;
|
|
185
|
+
/** Absent in a bounded host: it names no surface, so its subject carries no
|
|
186
|
+
* per-surface affinity and its projection offers no preference switch. */
|
|
187
|
+
readonly surface?: InspectionSurfaceKind | undefined;
|
|
188
|
+
}): ComposedInspection {
|
|
189
|
+
const { store, adapter, documentSelection, surface } = input;
|
|
190
|
+
// PRODUCER SELECTION, and the only one: a single click in the Assets
|
|
191
|
+
// browser names its own subject, so the asset is what the box shows — not a
|
|
192
|
+
// section bolted onto whatever was selected before it.
|
|
193
|
+
const assetSubject = describeAssetSelectionSubject();
|
|
194
|
+
if (assetSubject !== null) {
|
|
195
|
+
return {
|
|
196
|
+
subject: composeNullInspectionSubject({ nullSubject: assetSubject, surface }),
|
|
197
|
+
available: true,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const nodeId = resolveInspectionSubjectId(documentSelection, store.selectedEntityIds, adapter);
|
|
201
|
+
const node = nodeId ? adapter.hierarchy.node(nodeId) : null;
|
|
202
|
+
// A selected id the current adapter's hierarchy cannot resolve matches NO
|
|
203
|
+
// contribution, and is not the null selection either. This occurs briefly
|
|
204
|
+
// during Edit↔Play ownership handoff; do not route the stale id into the
|
|
205
|
+
// adapter's inspector (which correctly refuses ids no current root owns).
|
|
206
|
+
if (nodeId !== null && node === null) {
|
|
207
|
+
return {
|
|
208
|
+
subject: composeNullInspectionSubject({ nullSubject: null, surface }),
|
|
209
|
+
available: false,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const onEdit = () => store.notifyIngestEdit();
|
|
213
|
+
// The null subject is resolved BEFORE the contributions, because it is an
|
|
214
|
+
// input to matching them: with nothing selected every surface hands a
|
|
215
|
+
// matcher the same `(null, adapter)`, so the subject's id is the only thing
|
|
216
|
+
// that says WHICH empty state this is (`inspector-section-registry.ts`'s
|
|
217
|
+
// `InspectorSectionMatchContext`). Resolving it after meant a contribution
|
|
218
|
+
// scoped to one empty-state subject appeared in all of them.
|
|
219
|
+
const nullSubject = nodeId
|
|
220
|
+
? null
|
|
221
|
+
: describeNullInspectionSubject({ adapter, surface, store, onEdit });
|
|
222
|
+
const contributions = nodeId
|
|
223
|
+
? node
|
|
224
|
+
? matchedInspectorSections(node, adapter)
|
|
225
|
+
: []
|
|
226
|
+
: matchedInspectorSections(null, adapter, { nullSubjectId: nullSubject?.id ?? null });
|
|
227
|
+
const subject = composeInspectionSubject({
|
|
228
|
+
adapter,
|
|
229
|
+
nodeId,
|
|
230
|
+
node,
|
|
231
|
+
surface,
|
|
232
|
+
contributions,
|
|
233
|
+
...(nodeId ? {} : { nullSubject }),
|
|
234
|
+
// Outside Asset Lab the Inspector mounts an isolated native snapshot.
|
|
235
|
+
// Asset Lab already owns that native viewport, so `canvasPreviewFor`
|
|
236
|
+
// supplies a one-shot capture instead of a second live render loop.
|
|
237
|
+
previewObject:
|
|
238
|
+
(nodeId === null || surface === 'asset-lab'
|
|
239
|
+
? null
|
|
240
|
+
: entityObject3D(adapter, store.objectMap, nodeId)) ?? null,
|
|
241
|
+
canvasPreview: canvasPreviewFor(adapter, nodeId, surface),
|
|
242
|
+
assetDocument:
|
|
243
|
+
nodeId && store.objectMap.has(nodeId)
|
|
244
|
+
? { open: () => openEntityAssetDocument(store, nodeId) }
|
|
245
|
+
: null,
|
|
246
|
+
stories: resolveComposeStoriesInput(adapter, node, nodeId),
|
|
247
|
+
// A DOCUMENT WHOSE PACKAGE OWNS ITS PROPERTIES RAIL stands the shell's own
|
|
248
|
+
// sections down (`inspection/compose.ts`, `OwnedInspectorRail`).
|
|
249
|
+
...(ownedInspectorRail() ?? {}),
|
|
250
|
+
// The box describes ONE node; a gizmo drag moves every selected one.
|
|
251
|
+
// Say how many, so a three-object drag is not headed by a single name
|
|
252
|
+
// (`InspectionSubject.alsoSelected`). Only the SHARED store selection
|
|
253
|
+
// counts: a document that supplies its own selection is answering for
|
|
254
|
+
// itself and the scene's selection is not what its reader is looking at.
|
|
255
|
+
...(documentSelection === null && nodeId !== null && store.selectedEntityIds.size > 1
|
|
256
|
+
? { alsoSelected: store.selectedEntityIds.size - 1 }
|
|
257
|
+
: {}),
|
|
258
|
+
onEdit,
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
subject,
|
|
262
|
+
available: nodeId !== null || nullSubject !== null || contributions.length > 0,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* The subject showing right now, resolved into the ONE
|
|
268
|
+
* {@link InspectionDisplay} every consumer reads: the composed subject, the
|
|
269
|
+
* surface it belongs to, whether there is an inspector at all, and which
|
|
270
|
+
* projection is showing it. `components/Inspector.tsx` renders it,
|
|
271
|
+
* the workspace host gates the dock panel and the floating card
|
|
272
|
+
* on it, and `inspectActiveSubject` serializes it — all from this one call,
|
|
273
|
+
* so no consumer can reach a different answer (see `inspection/display.ts`).
|
|
274
|
+
*/
|
|
275
|
+
export function describeActiveInspectionSubject(store: EditorShellStore): InspectionDisplay {
|
|
276
|
+
const surface = activeInspectionSurface(store);
|
|
277
|
+
const { adapter, documentSelection } = resolvePanelAuthoring(store);
|
|
278
|
+
const composed = composeInspectionForBinding({
|
|
279
|
+
store,
|
|
280
|
+
adapter,
|
|
281
|
+
documentSelection,
|
|
282
|
+
surface,
|
|
283
|
+
});
|
|
284
|
+
const { subject } = composed;
|
|
285
|
+
// DECISION (2026-08-14, owner-reported): a project-TOOL document owns its
|
|
286
|
+
// whole surface, so the scene's inspector must not float over it.
|
|
287
|
+
//
|
|
288
|
+
// `resolvePanelAuthoring` has no tool-document branch, so with the Data sheet
|
|
289
|
+
// active it falls through to the scene's composite adapter and composes
|
|
290
|
+
// whatever was selected in the 3D scene BEFORE the tab switch — the compact
|
|
291
|
+
// card then renders over a document that is not its subject's (measured
|
|
292
|
+
// live: active document `tool:data-tables.document`, `editor.inspect()`
|
|
293
|
+
// answering `world:world` at surface `three`, presentation `card`).
|
|
294
|
+
//
|
|
295
|
+
// The test is the same POSITIVE shape `active-surface.ts` uses for Asset Lab:
|
|
296
|
+
// does the ACTIVE tool document publish its own inspection context? A tool
|
|
297
|
+
// document that does (the humanoid builder's Object3D preview publishes a
|
|
298
|
+
// `WorkspaceDocumentSelection`) keeps its inspector, because that inspector
|
|
299
|
+
// IS the document's. One that does not is being described by another
|
|
300
|
+
// document's selection, and per the inspector doctrine — "with nothing
|
|
301
|
+
// selected the inspector shows nothing" — nothing is what it gets.
|
|
302
|
+
const available =
|
|
303
|
+
composed.available &&
|
|
304
|
+
(subject.id !== GAME_SUBJECT_ID || subject.sections.length > 0) &&
|
|
305
|
+
!inspectorBelongsToAnotherDocument({
|
|
306
|
+
activeDocumentKind: activeWorkspaceDocument()?.descriptor.kind ?? null,
|
|
307
|
+
documentSelection,
|
|
308
|
+
});
|
|
309
|
+
const report = activeWorkspaceDocumentId() === GAME_DOCUMENT_ID ? liveCoverage() : null;
|
|
310
|
+
if (report) {
|
|
311
|
+
const coverage = ingestCoverageSection(report);
|
|
312
|
+
const coverageSubject: InspectionSubject = available
|
|
313
|
+
? {
|
|
314
|
+
...subject,
|
|
315
|
+
sections: [
|
|
316
|
+
...subject.sections.filter((section) => section.id !== coverage.id),
|
|
317
|
+
coverage,
|
|
318
|
+
].sort((a, b) => a.order - b.order),
|
|
319
|
+
}
|
|
320
|
+
: {
|
|
321
|
+
id: `ingest:${report.summary.worldId}`,
|
|
322
|
+
title: 'Ingested game',
|
|
323
|
+
identity: null,
|
|
324
|
+
hint: 'This mount exposes no editable scene subject. Coverage below says exactly which editor seams it did earn.',
|
|
325
|
+
presentation: subject.presentation,
|
|
326
|
+
quickActions: [],
|
|
327
|
+
related: [],
|
|
328
|
+
sections: [coverage],
|
|
329
|
+
};
|
|
330
|
+
return resolveInspectionDisplay({
|
|
331
|
+
subject: coverageSubject,
|
|
332
|
+
surface,
|
|
333
|
+
available: true,
|
|
334
|
+
override: inspectorPresentationOverride(surface),
|
|
335
|
+
workspaceDefault: activeChromeRegions().inspector ?? null,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return resolveInspectionDisplay({
|
|
339
|
+
subject,
|
|
340
|
+
surface,
|
|
341
|
+
available,
|
|
342
|
+
override: inspectorPresentationOverride(surface),
|
|
343
|
+
workspaceDefault: activeChromeRegions().inspector ?? null,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* The active inspection subject as JSON — the whole of `editor.inspect`'s
|
|
349
|
+
* browser side.
|
|
350
|
+
*
|
|
351
|
+
* It reads the SAME `available` flag the dock and the card gate on, so the
|
|
352
|
+
* wire cannot claim a subject the human is not being shown: with nothing
|
|
353
|
+
* selected on a surface that has no empty-state subject, the box unmounts and
|
|
354
|
+
* this answers {@link NO_INSPECTION}. Serializing the composed subject anyway
|
|
355
|
+
* would report a placeholder nobody is looking at as though it were the
|
|
356
|
+
* inspector's contents — the fabrication the anti-shim rule names, on the one
|
|
357
|
+
* surface that exists to be believed.
|
|
358
|
+
*/
|
|
359
|
+
export function inspectActiveSubject(store: EditorShellStore): SerializedInspection {
|
|
360
|
+
const { subject, surface, presentation, available } = describeActiveInspectionSubject(store);
|
|
361
|
+
if (!available) return NO_INSPECTION;
|
|
362
|
+
return serializeInspectionSubject(subject, { surface, presentation });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** Run one verb from the active Inspector's own composed subject.
|
|
366
|
+
*
|
|
367
|
+
* This is the action counterpart to {@link setActiveInspectionField}: the
|
|
368
|
+
* control plane resolves the same action the human projection renders and
|
|
369
|
+
* awaits that action's own completion. It deliberately takes no entity id —
|
|
370
|
+
* the active Inspector subject is the address, just as it is for field edits.
|
|
371
|
+
*/
|
|
372
|
+
export async function runActiveInspectionAction(
|
|
373
|
+
store: EditorShellStore,
|
|
374
|
+
actionId: string,
|
|
375
|
+
): Promise<SerializedInspection> {
|
|
376
|
+
const { subject, available } = describeActiveInspectionSubject(store);
|
|
377
|
+
if (!available) throw new Error('No Inspector subject is active.');
|
|
378
|
+
const matches = subject.quickActions.filter((action) => action.id === actionId);
|
|
379
|
+
if (matches.length !== 1) {
|
|
380
|
+
const availableActions = subject.quickActions.map((action) => action.id);
|
|
381
|
+
throw new Error(
|
|
382
|
+
matches.length === 0
|
|
383
|
+
? `Inspector action ${JSON.stringify(actionId)} is not available. ` +
|
|
384
|
+
(availableActions.length > 0
|
|
385
|
+
? `Available actions: ${availableActions.join(', ')}.`
|
|
386
|
+
: 'This subject exposes no actions.')
|
|
387
|
+
: `Inspector action id ${JSON.stringify(actionId)} is ambiguous (${matches.length} matches).`,
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
const action = matches[0];
|
|
391
|
+
if (!action || action.disabled) {
|
|
392
|
+
throw new Error(`Inspector action ${JSON.stringify(actionId)} is disabled.`);
|
|
393
|
+
}
|
|
394
|
+
await action.run();
|
|
395
|
+
return inspectActiveSubject(store);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function assertInspectionFieldValue(field: FieldDescriptor, value: unknown): void {
|
|
399
|
+
const invalid = (expected: string): never => {
|
|
400
|
+
throw new Error(`Inspector field ${JSON.stringify(field.path)} expects ${expected}.`);
|
|
401
|
+
};
|
|
402
|
+
if (field.type === 'number' && (typeof value !== 'number' || !Number.isFinite(value))) {
|
|
403
|
+
invalid('a finite number');
|
|
404
|
+
}
|
|
405
|
+
if (field.type === 'boolean' && typeof value !== 'boolean') invalid('a boolean');
|
|
406
|
+
if (
|
|
407
|
+
(field.type === 'string' ||
|
|
408
|
+
field.type === 'color' ||
|
|
409
|
+
field.type === 'asset' ||
|
|
410
|
+
field.type === 'enum') &&
|
|
411
|
+
typeof value !== 'string'
|
|
412
|
+
) {
|
|
413
|
+
invalid('a string');
|
|
414
|
+
}
|
|
415
|
+
if (
|
|
416
|
+
field.type === 'vec3' &&
|
|
417
|
+
(!Array.isArray(value) ||
|
|
418
|
+
value.length !== 3 ||
|
|
419
|
+
value.some((component) => typeof component !== 'number' || !Number.isFinite(component)))
|
|
420
|
+
) {
|
|
421
|
+
invalid('three finite numbers');
|
|
422
|
+
}
|
|
423
|
+
if (field.type === 'enum' && field.options && !field.options.includes(value)) {
|
|
424
|
+
throw new Error(
|
|
425
|
+
`Inspector field ${JSON.stringify(field.path)} accepts: ${field.options.map(String).join(', ')}.`,
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Write one field through the same live Inspector IO the human projection uses,
|
|
432
|
+
* and report WHERE THAT WRITE went.
|
|
433
|
+
*
|
|
434
|
+
* The destination is not decoration. With no persistence route open — the
|
|
435
|
+
* structural lane over a fiber world, or an ingest root that is playing rather
|
|
436
|
+
* than held — the write lands on the live object, journals live-only and
|
|
437
|
+
* changes no byte. That is the product working as designed, but silence about
|
|
438
|
+
* it is indistinguishable from a write that vanished, and a caller diffing the
|
|
439
|
+
* tree to find out will call the healthy case a defect. So `persisted: false`
|
|
440
|
+
* is an ANSWER.
|
|
441
|
+
*
|
|
442
|
+
* THE ACK COMES FROM THE WRITE, not from the surface. It is whatever the
|
|
443
|
+
* persistence pipe returned to the provider that performed THIS edit
|
|
444
|
+
* (`authoring/write-pipe.ts`), handed straight up through `io.set`. Reading a
|
|
445
|
+
* destination off the ACTIVE ADAPTER afterwards is what this replaced: the
|
|
446
|
+
* composite joined only its persist-capable children, so a three-root edit
|
|
447
|
+
* acked the DOM root's file with `persisted: true` — measured on the vendored
|
|
448
|
+
* racing game. An io that performed no persisted write returns nothing, and
|
|
449
|
+
* the live-only floor below is the honest answer for it; there is deliberately
|
|
450
|
+
* no fallback that reads a destination from anywhere else.
|
|
451
|
+
*/
|
|
452
|
+
export async function setActiveInspectionField(
|
|
453
|
+
store: EditorShellStore,
|
|
454
|
+
path: string,
|
|
455
|
+
value: unknown,
|
|
456
|
+
): Promise<{ subject: SerializedInspection; write: WriteAck }> {
|
|
457
|
+
const match = resolveWritableField(store, path);
|
|
458
|
+
assertInspectionFieldValue(match.field, value);
|
|
459
|
+
const write = (await match.io.set(path, value)) ?? LIVE_ONLY_ACK;
|
|
460
|
+
return { subject: inspectActiveSubject(store), write };
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/** One editable path in the active Inspector, with the io that owns it. */
|
|
464
|
+
interface FieldMatch {
|
|
465
|
+
readonly field: FieldDescriptor;
|
|
466
|
+
readonly io: InspectionFieldIo;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Resolve ONE writable field of the active subject — the shared front half of
|
|
471
|
+
* every field door (`set` and `remove`), so the two cannot disagree about which
|
|
472
|
+
* io owns a path or about what "no such field" means.
|
|
473
|
+
*/
|
|
474
|
+
function resolveWritableField(store: EditorShellStore, path: string): FieldMatch {
|
|
475
|
+
const { subject, available } = describeActiveInspectionSubject(store);
|
|
476
|
+
if (!available) throw new Error('No Inspector subject is active.');
|
|
477
|
+
const subjectMatches = (subject.editable?.fields ?? [])
|
|
478
|
+
.filter((field) => field.path === path)
|
|
479
|
+
.map((field) => ({ field, io: subject.editable!.io }));
|
|
480
|
+
const sectionMatches = subject.sections.flatMap((section) => {
|
|
481
|
+
// A custom body's `editable` is the same (fields, io) pair a fields body
|
|
482
|
+
// is, declared by a section that draws its own chrome — the Transform
|
|
483
|
+
// section is the shipped one. Reading them together is what keeps ONE
|
|
484
|
+
// write path per field.
|
|
485
|
+
const body = section.body;
|
|
486
|
+
const editable =
|
|
487
|
+
body.kind === 'fields'
|
|
488
|
+
? { fields: body.fields, io: body.io }
|
|
489
|
+
: body.kind === 'custom'
|
|
490
|
+
? body.editable
|
|
491
|
+
: undefined;
|
|
492
|
+
if (!editable) return [];
|
|
493
|
+
return editable.fields
|
|
494
|
+
.filter((field) => field.path === path)
|
|
495
|
+
.map((field) => ({ field, io: editable.io }));
|
|
496
|
+
});
|
|
497
|
+
const matches = [...subjectMatches, ...sectionMatches];
|
|
498
|
+
if (matches.length === 0) {
|
|
499
|
+
throw new Error(`The active Inspector has no field at ${JSON.stringify(path)}.`);
|
|
500
|
+
}
|
|
501
|
+
if (matches.length > 1) {
|
|
502
|
+
throw new Error(`The active Inspector exposes ${JSON.stringify(path)} more than once.`);
|
|
503
|
+
}
|
|
504
|
+
const match = matches[0]!;
|
|
505
|
+
if (match.field.readonly) {
|
|
506
|
+
throw new Error(
|
|
507
|
+
`Inspector field ${JSON.stringify(path)} is read-only: ${fieldReadonlyReason(match.field)}`,
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
return match;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* The refusal a caller must be able to tell apart from every other one: this
|
|
515
|
+
* lane cannot express byte-absence for this field, so nothing was attempted.
|
|
516
|
+
*
|
|
517
|
+
* It is NOT a failure of the removal — it is the absence of the door. The
|
|
518
|
+
* distinction is the whole reason the class exists: an instrument grading an
|
|
519
|
+
* edit/revert round trip must report a missing seam as UNVERIFIABLE and a
|
|
520
|
+
* removal that ran and left the bytes changed as FAILED, and prose cannot be
|
|
521
|
+
* matched on. `command-listener.ts` turns this into the wire's
|
|
522
|
+
* `code: 'REMOVAL_UNAVAILABLE'`.
|
|
523
|
+
*/
|
|
524
|
+
export class InspectionRemovalUnavailableError extends Error {
|
|
525
|
+
constructor(message: string) {
|
|
526
|
+
super(message);
|
|
527
|
+
this.name = 'InspectionRemovalUnavailableError';
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* REMOVE one field's authored override through the same Inspector IO the human
|
|
533
|
+
* revert arrow uses, and report WHERE THAT REMOVAL went.
|
|
534
|
+
*
|
|
535
|
+
* ## Why this exists beside {@link setActiveInspectionField}
|
|
536
|
+
*
|
|
537
|
+
* `set` writes a VALUE, and a value is not the same thing as an absence. When
|
|
538
|
+
* an authoring gesture adds a prop the source did not carry — the append path
|
|
539
|
+
* in every dialect writer — reverting it through the value door writes the
|
|
540
|
+
* default back EXPLICITLY (`position={[0, 0, 0]}`), so the file is left one
|
|
541
|
+
* attribute heavier than it started. Byte-level revert is then impossible
|
|
542
|
+
* through the protocol, which is exactly what `scripts/doctor-walk.ts` measured
|
|
543
|
+
* as "BOTH product doors failed to revert" on a healthy lane.
|
|
544
|
+
*
|
|
545
|
+
* ## What it will NOT do
|
|
546
|
+
*
|
|
547
|
+
* It never falls back to a value write, and it never guesses what absence means
|
|
548
|
+
* for a dialect. Two declarations gate it, both read rather than inferred:
|
|
549
|
+
* the descriptor's own `resettable` (the adapter saying removal is legal here)
|
|
550
|
+
* and the io's `remove` (the lane saying it has a door at all). Missing either
|
|
551
|
+
* one raises {@link InspectionRemovalUnavailableError} — a NAMED refusal an
|
|
552
|
+
* instrument can grade as an unreached seam, never a silent no-op and never a
|
|
553
|
+
* write that pretends to be a revert.
|
|
554
|
+
*/
|
|
555
|
+
export async function removeActiveInspectionField(
|
|
556
|
+
store: EditorShellStore,
|
|
557
|
+
path: string,
|
|
558
|
+
): Promise<{ subject: SerializedInspection; write: WriteAck }> {
|
|
559
|
+
const match = resolveWritableField(store, path);
|
|
560
|
+
if (match.field.resettable !== true) {
|
|
561
|
+
throw new InspectionRemovalUnavailableError(
|
|
562
|
+
`Inspector field ${JSON.stringify(path)} does not declare itself removable ` +
|
|
563
|
+
"(`resettable`), so this lane has no way to express the property's absence. " +
|
|
564
|
+
'Write a value with `set-inspection-field` instead — and note that doing so cannot ' +
|
|
565
|
+
'restore byte-absence for a property an edit ADDED.',
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
if (!match.io.remove) {
|
|
569
|
+
throw new InspectionRemovalUnavailableError(
|
|
570
|
+
`The Inspector io that owns ${JSON.stringify(path)} implements no removal door, so the ` +
|
|
571
|
+
"property's authored override cannot be dropped through this editor. The dialect writer " +
|
|
572
|
+
'that owns this source edit owns removal too; until it does, an edit/revert round trip ' +
|
|
573
|
+
'over this lane is unverifiable at byte level.',
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
const write = (await match.io.remove(path)) ?? LIVE_ONLY_ACK;
|
|
577
|
+
return { subject: inspectActiveSubject(store), write };
|
|
578
|
+
}
|