@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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SERIALIZED projection of the inspection model — Layer 3's fourth
|
|
3
|
+
* projection, and the agent surface (design: `docs/ARCHITECTURE-CORE.md`
|
|
4
|
+
* §Editor chrome, "The Inspection Model" … "and later a serialized export
|
|
5
|
+
* (`editor.inspect`) — the Figma-Inspect analog and the agent surface";
|
|
6
|
+
* build ledger: `docs/WORK.md` §Inspection Model program, W4).
|
|
7
|
+
*
|
|
8
|
+
* It is the same kind of thing the column and the compact card are: a DUMB
|
|
9
|
+
* projection that reads identity/order/title/body off an
|
|
10
|
+
* {@link InspectionSubject} and knows nothing about content. The only thing
|
|
11
|
+
* it does that the visual projections do not is READ THE VALUES — a field
|
|
12
|
+
* descriptor is an address, and an agent asking "what is this thing" wants
|
|
13
|
+
* the value at that address, so a `fields` body is serialized through the
|
|
14
|
+
* section's OWN `io.get`, the same io the field rows edit through.
|
|
15
|
+
*
|
|
16
|
+
* Three rules this projection is built on:
|
|
17
|
+
*
|
|
18
|
+
* - **Opaque rendering stays opaque.** `render()` is never called and React
|
|
19
|
+
* is never touched. A custom body may still own the model's ordinary
|
|
20
|
+
* descriptor channel; those fields serialize through their existing io so
|
|
21
|
+
* custom chrome cannot hide scriptable paths or their refusal reasons.
|
|
22
|
+
* - **MIXED is a distinguished marker, not a missing value.** A field whose
|
|
23
|
+
* subjects disagree serializes as `{mixed: true}` with no `value` — an
|
|
24
|
+
* agent must be able to tell "they disagree" from "it is unset", which is
|
|
25
|
+
* exactly why the sentinel is in the value model at all.
|
|
26
|
+
* - **Icons are not data.** An `IconDefinition` is Font Awesome's render
|
|
27
|
+
* payload; an agent has no use for path geometry, and its `iconName` says
|
|
28
|
+
* nothing the section's `title` doesn't. Omitted outright.
|
|
29
|
+
*
|
|
30
|
+
* Pure and React-free: subject in, JSON-safe object out. The live half —
|
|
31
|
+
* "which subject is showing right now" — is `inspection/active-subject.ts`.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import type {
|
|
35
|
+
FieldDescriptor,
|
|
36
|
+
InspectionFieldIo,
|
|
37
|
+
InspectionPresentation,
|
|
38
|
+
InspectionSection,
|
|
39
|
+
InspectionSectionData,
|
|
40
|
+
InspectionSubject,
|
|
41
|
+
InspectionSurfaceKind,
|
|
42
|
+
} from './model';
|
|
43
|
+
import { fieldReadonlyReason, isMixed } from './model';
|
|
44
|
+
|
|
45
|
+
/** How deep {@link toJsonSafe} walks a structured value before giving up. A
|
|
46
|
+
* `json`-typed descriptor can address an arbitrary blob; three levels covers
|
|
47
|
+
* every shape the field vocabulary actually produces (vec3, colour tuples,
|
|
48
|
+
* option lists, small records) without risking an unbounded walk. */
|
|
49
|
+
const MAX_VALUE_DEPTH = 3;
|
|
50
|
+
|
|
51
|
+
/** One field, with the value currently at its `path`. */
|
|
52
|
+
export interface SerializedInspectionField {
|
|
53
|
+
/** The stable scriptable address — the SAME one agents script against. */
|
|
54
|
+
readonly path: string;
|
|
55
|
+
readonly label: string;
|
|
56
|
+
readonly type: FieldDescriptor['type'];
|
|
57
|
+
/** The current value, JSON-safe. Absent when the value is `undefined`
|
|
58
|
+
* (nothing at that address) or when `mixed` is set. */
|
|
59
|
+
readonly value?: unknown;
|
|
60
|
+
/** The subjects disagree about this field (the model's MIXED sentinel). */
|
|
61
|
+
readonly mixed?: true;
|
|
62
|
+
/** The value shown is the DECLARED DEFAULT — the document does not carry it. */
|
|
63
|
+
readonly defaulted?: boolean;
|
|
64
|
+
readonly readonly?: boolean;
|
|
65
|
+
/** The same adapter-authored sentence the disabled field and write refusal use. */
|
|
66
|
+
readonly readonlyReason?: string;
|
|
67
|
+
readonly resettable?: boolean;
|
|
68
|
+
readonly revertsTo?: string;
|
|
69
|
+
readonly group?: string;
|
|
70
|
+
readonly options?: readonly unknown[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export type SerializedInspectionBody =
|
|
74
|
+
/** `data`, when present, is the producer's published display values riding
|
|
75
|
+
* BESIDE the field list (the Element section's class chips and active
|
|
76
|
+
* breakpoint are the shipped case): facts the section shows that are not
|
|
77
|
+
* themselves writable fields. */
|
|
78
|
+
| {
|
|
79
|
+
readonly kind: 'fields';
|
|
80
|
+
readonly fields: readonly SerializedInspectionField[];
|
|
81
|
+
readonly data?: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
/** A block the model does not model. Named, never rendered or introspected —
|
|
84
|
+
* plus, when the producer published one, the body's own displayed VALUES
|
|
85
|
+
* (`InspectionSectionData`; the Transform section is the shipped case). */
|
|
86
|
+
| {
|
|
87
|
+
readonly kind: 'custom';
|
|
88
|
+
readonly id: string;
|
|
89
|
+
readonly title: string;
|
|
90
|
+
readonly data?: Record<string, unknown>;
|
|
91
|
+
}
|
|
92
|
+
/** The subject's live preview. Named opaque for the same reason a custom
|
|
93
|
+
* body is — there is nothing in a rendered viewport for an agent to read —
|
|
94
|
+
* but distinguished, because "this thing has a live preview" is a real
|
|
95
|
+
* fact about the subject that the section list would otherwise not carry. */
|
|
96
|
+
| { readonly kind: 'preview'; readonly id: string; readonly title: string };
|
|
97
|
+
|
|
98
|
+
export interface SerializedInspectionSection {
|
|
99
|
+
readonly id: string;
|
|
100
|
+
readonly title: string;
|
|
101
|
+
readonly order: number;
|
|
102
|
+
readonly description?: string;
|
|
103
|
+
readonly body: SerializedInspectionBody;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** A subject verb, as data: what it is called and (for a toggle) its state. */
|
|
107
|
+
export interface SerializedInspectionAction {
|
|
108
|
+
readonly id: string;
|
|
109
|
+
readonly title: string;
|
|
110
|
+
readonly label?: string;
|
|
111
|
+
/** Toggle state, for verbs that have one. The visibility eye is the worked
|
|
112
|
+
* case: `visible` is lifted OUT of the descriptor grid onto the identity
|
|
113
|
+
* row, so this flag is the ONLY place an agent can read it — without it
|
|
114
|
+
* the answer would only be recoverable by prose-matching `title`. */
|
|
115
|
+
readonly pressed?: boolean;
|
|
116
|
+
readonly disabled?: boolean;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface SerializedSubjectLink {
|
|
120
|
+
readonly id: string;
|
|
121
|
+
readonly title: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface SerializedInspectionSubject {
|
|
125
|
+
readonly id: string;
|
|
126
|
+
readonly title: string;
|
|
127
|
+
/** What to CALL this thing's type (+ seam provenance). Absent when there is
|
|
128
|
+
* no identity row (the no-selection subject). */
|
|
129
|
+
readonly kindLabel?: string;
|
|
130
|
+
/** The identity row's own line, verbatim — for an ingest mount that is where
|
|
131
|
+
* the object came FROM (`Source · game.js:271`), which is the fact every
|
|
132
|
+
* question about writing it back starts at. */
|
|
133
|
+
readonly note?: string;
|
|
134
|
+
/** The quiet line a subject with nothing to edit explains itself with. */
|
|
135
|
+
readonly hint?: string;
|
|
136
|
+
/** How many OTHER nodes are selected alongside this one. "The agent reads
|
|
137
|
+
* what the human sees" is only true if the agent also learns that a gizmo
|
|
138
|
+
* gesture here would move more than the subject it is reading. */
|
|
139
|
+
readonly alsoSelected?: number;
|
|
140
|
+
/** Which surface this subject belongs to, and how it is presented: the
|
|
141
|
+
* subject's own affinity, plus the presentation ACTUALLY showing when the
|
|
142
|
+
* caller resolved one (`inspector-presentation.ts` — the subject cannot
|
|
143
|
+
* know it, since a user override lives outside the model). */
|
|
144
|
+
readonly presentation: {
|
|
145
|
+
readonly preferred: InspectionPresentation;
|
|
146
|
+
readonly resolved?: InspectionPresentation;
|
|
147
|
+
readonly surface?: InspectionSurfaceKind;
|
|
148
|
+
};
|
|
149
|
+
readonly quickActions: readonly SerializedInspectionAction[];
|
|
150
|
+
readonly related: readonly SerializedSubjectLink[];
|
|
151
|
+
readonly sections: readonly SerializedInspectionSection[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* NOTHING is being inspected — the wire's answer when the inspector itself is
|
|
156
|
+
* unmounted (owner, 2026-08-07: with nothing selected the human sees no
|
|
157
|
+
* inspector, and the agent surface must say the same thing).
|
|
158
|
+
*
|
|
159
|
+
* It is an explicit marker rather than `null` because absence is already
|
|
160
|
+
* spoken for at every hop of this wire: the browser answering nothing, the
|
|
161
|
+
* relay timing out, and a session with no attached tab all arrive as a
|
|
162
|
+
* missing value, which the operation reports as `INSPECTION_UNAVAILABLE`
|
|
163
|
+
* ("nobody answered"). "Somebody answered, and the answer is that there is
|
|
164
|
+
* nothing to inspect" is a DIFFERENT fact, and it deserves a token that
|
|
165
|
+
* survives the same hops — an object, which every layer already carries
|
|
166
|
+
* unchanged, and which prints as `{none: true}` in a `vgai eval` rather than
|
|
167
|
+
* as a bare `null` an agent would read as a failure.
|
|
168
|
+
*/
|
|
169
|
+
export interface SerializedNoInspection {
|
|
170
|
+
readonly none: true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** What `editor.inspect` answers: the subject showing, or {@link NO_INSPECTION}. */
|
|
174
|
+
export type SerializedInspection = SerializedInspectionSubject | SerializedNoInspection;
|
|
175
|
+
|
|
176
|
+
export const NO_INSPECTION: SerializedNoInspection = Object.freeze({ none: true as const });
|
|
177
|
+
|
|
178
|
+
/** What the live shell knows that a pure subject cannot: which surface it is,
|
|
179
|
+
* and which projection the user is actually looking at. */
|
|
180
|
+
export interface SerializedInspectionContext {
|
|
181
|
+
readonly surface: InspectionSurfaceKind;
|
|
182
|
+
readonly presentation: InspectionPresentation;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function isPlainObject(value: object): boolean {
|
|
186
|
+
const proto = Object.getPrototypeOf(value) as object | null;
|
|
187
|
+
return proto === Object.prototype || proto === null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Narrow an arbitrary property value to something that survives
|
|
192
|
+
* `JSON.stringify` intact.
|
|
193
|
+
*
|
|
194
|
+
* Primitives pass through; arrays and plain objects are walked to
|
|
195
|
+
* {@link MAX_VALUE_DEPTH}. Anything else — a live `THREE.Color`, a texture, a
|
|
196
|
+
* function, a DOM node — becomes `{kind:'opaque', type}` rather than being
|
|
197
|
+
* dropped or half-flattened: "there is a value here and it is a Texture" is
|
|
198
|
+
* true and useful, while an empty object would read as "an empty value" and a
|
|
199
|
+
* silent omission would read as "unset". Both of those are the anti-shim
|
|
200
|
+
* rule's fabrication, one field at a time.
|
|
201
|
+
*/
|
|
202
|
+
export function toJsonSafe(value: unknown, depth = 0): unknown {
|
|
203
|
+
if (value === null) return null;
|
|
204
|
+
const type = typeof value;
|
|
205
|
+
if (type === 'string' || type === 'boolean') return value;
|
|
206
|
+
// `-0` is a finite number that does NOT survive the wire: `JSON.stringify`
|
|
207
|
+
// writes it as `0`, so a serialized value and its parse would differ — and
|
|
208
|
+
// the round trip is the property this whole projection is judged on. It
|
|
209
|
+
// reaches here for real (an identity quaternion converted to Euler degrees
|
|
210
|
+
// yields `-0` on two axes), and no reader has ever wanted the sign of zero.
|
|
211
|
+
if (type === 'number') {
|
|
212
|
+
if (!Number.isFinite(value)) return { kind: 'opaque', type: 'number' };
|
|
213
|
+
return value === 0 ? 0 : value;
|
|
214
|
+
}
|
|
215
|
+
if (type !== 'object') return { kind: 'opaque', type };
|
|
216
|
+
if (depth >= MAX_VALUE_DEPTH) return { kind: 'opaque', type: constructorName(value as object) };
|
|
217
|
+
if (Array.isArray(value)) return value.map((item) => toJsonSafe(item, depth + 1));
|
|
218
|
+
const object = value as object;
|
|
219
|
+
if (!isPlainObject(object)) return { kind: 'opaque', type: constructorName(object) };
|
|
220
|
+
const out: Record<string, unknown> = {};
|
|
221
|
+
for (const [key, item] of Object.entries(object)) {
|
|
222
|
+
if (item !== undefined) out[key] = toJsonSafe(item, depth + 1);
|
|
223
|
+
}
|
|
224
|
+
return out;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function constructorName(value: object): string {
|
|
228
|
+
return (value.constructor as { name?: string } | undefined)?.name ?? 'object';
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function serializeField(field: FieldDescriptor, io: InspectionFieldIo): SerializedInspectionField {
|
|
232
|
+
// Read through the SECTION's own io — the same one the field rows write
|
|
233
|
+
// through — so an agent's read and a human's read cannot diverge.
|
|
234
|
+
let raw: unknown;
|
|
235
|
+
try {
|
|
236
|
+
raw = io.get(field.path);
|
|
237
|
+
} catch {
|
|
238
|
+
// A descriptor whose backing object went away mid-read is a value we do
|
|
239
|
+
// not have, not a failed inspection: the rest of the subject is still
|
|
240
|
+
// true and reporting it is more useful than throwing the whole read away.
|
|
241
|
+
raw = undefined;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
path: field.path,
|
|
245
|
+
label: field.label,
|
|
246
|
+
type: field.type,
|
|
247
|
+
...(isMixed(raw) ? { mixed: true as const } : {}),
|
|
248
|
+
...(!isMixed(raw) && raw !== undefined ? { value: toJsonSafe(raw) } : {}),
|
|
249
|
+
...(field.defaulted !== undefined ? { defaulted: field.defaulted } : {}),
|
|
250
|
+
...(field.readonly !== undefined ? { readonly: field.readonly } : {}),
|
|
251
|
+
...(field.readonly ? { readonlyReason: fieldReadonlyReason(field) } : {}),
|
|
252
|
+
...(field.resettable !== undefined ? { resettable: field.resettable } : {}),
|
|
253
|
+
...(field.revertsTo !== undefined ? { revertsTo: field.revertsTo } : {}),
|
|
254
|
+
...(field.group !== undefined ? { group: field.group } : {}),
|
|
255
|
+
...(field.options !== undefined
|
|
256
|
+
? { options: field.options.map((option) => toJsonSafe(option)) }
|
|
257
|
+
: {}),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** A custom body's published values, narrowed to the wire. Keys are the
|
|
262
|
+
* producer's own vocabulary; this projection reads none of them. */
|
|
263
|
+
function serializeSectionData(data: InspectionSectionData): Record<string, unknown> {
|
|
264
|
+
const out: Record<string, unknown> = {};
|
|
265
|
+
for (const [key, value] of Object.entries(data)) {
|
|
266
|
+
if (value !== undefined) out[key] = toJsonSafe(value);
|
|
267
|
+
}
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function serializeBody(section: InspectionSection): SerializedInspectionBody {
|
|
272
|
+
const body = section.body;
|
|
273
|
+
if (body.kind === 'fields') {
|
|
274
|
+
return { kind: 'fields', fields: body.fields.map((field) => serializeField(field, body.io)) };
|
|
275
|
+
}
|
|
276
|
+
// An opaque body replaces RENDERING, never identity — so the identity the
|
|
277
|
+
// model kept IS the whole serialization. `render()` is not called.
|
|
278
|
+
//
|
|
279
|
+
// A custom body may ALSO have published its displayed values (P18: the
|
|
280
|
+
// Transform section's position/rotation/scale, which an agent could
|
|
281
|
+
// otherwise not read at all). They ride through untouched: the producer
|
|
282
|
+
// decided what the section says about itself, and a projection that
|
|
283
|
+
// reinterpreted it would be the content knowledge this layer removes.
|
|
284
|
+
if (body.kind === 'custom' && body.data !== undefined && body.editable === undefined) {
|
|
285
|
+
return {
|
|
286
|
+
kind: 'custom',
|
|
287
|
+
id: section.id,
|
|
288
|
+
title: section.title,
|
|
289
|
+
data: serializeSectionData(body.data),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// A custom body whose values ARE an ordinary descriptor channel is a FIELD
|
|
293
|
+
// LIST on this wire. Nothing here is rendered, so `custom` would be naming
|
|
294
|
+
// chrome the reader cannot see while hiding the one thing it can use: the
|
|
295
|
+
// whole react/DOM lane draws its own widgets over `STYLE_PROPERTIES`, so
|
|
296
|
+
// every section reported `kind: 'custom'` and `editor.inspect()` enumerated
|
|
297
|
+
// ZERO fields for a DOM element — 55 authorable style properties, reachable
|
|
298
|
+
// only by a caller that already knew their names. Identity is untouched:
|
|
299
|
+
// `SerializedInspectionSection` carries the id/title/order above.
|
|
300
|
+
if (body.kind === 'custom' && body.editable !== undefined) {
|
|
301
|
+
const editable = body.editable;
|
|
302
|
+
return {
|
|
303
|
+
kind: 'fields',
|
|
304
|
+
fields: editable.fields.map((field) => serializeField(field, editable.io)),
|
|
305
|
+
// Published display values ride beside the fields (see the wire type):
|
|
306
|
+
// dropping them when a body had BOTH halves would make adding a write
|
|
307
|
+
// door silently delete the read-only facts the section also shows.
|
|
308
|
+
...(body.data !== undefined ? { data: serializeSectionData(body.data) } : {}),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return { kind: body.kind, id: section.id, title: section.title };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function serializeSection(section: InspectionSection): SerializedInspectionSection {
|
|
315
|
+
return {
|
|
316
|
+
id: section.id,
|
|
317
|
+
title: section.title,
|
|
318
|
+
order: section.order,
|
|
319
|
+
...(section.description !== undefined ? { description: section.description } : {}),
|
|
320
|
+
body: serializeBody(section),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* One inspection subject, as JSON.
|
|
326
|
+
*
|
|
327
|
+
* `context` is optional so the function stays testable as pure data-in/
|
|
328
|
+
* data-out; the live shell always passes it, because "which surface, and
|
|
329
|
+
* which projection is actually showing" is the one thing about a subject that
|
|
330
|
+
* the subject itself cannot answer.
|
|
331
|
+
*/
|
|
332
|
+
export function serializeInspectionSubject(
|
|
333
|
+
subject: InspectionSubject,
|
|
334
|
+
context?: SerializedInspectionContext,
|
|
335
|
+
): SerializedInspectionSubject {
|
|
336
|
+
return {
|
|
337
|
+
id: subject.id,
|
|
338
|
+
title: subject.title,
|
|
339
|
+
...(subject.identity?.kindLabel ? { kindLabel: subject.identity.kindLabel } : {}),
|
|
340
|
+
...(subject.identity?.note ? { note: subject.identity.note.text } : {}),
|
|
341
|
+
...(subject.hint ? { hint: subject.hint } : {}),
|
|
342
|
+
...(subject.alsoSelected ? { alsoSelected: subject.alsoSelected } : {}),
|
|
343
|
+
presentation: {
|
|
344
|
+
preferred: subject.presentation.preferred,
|
|
345
|
+
...(context ? { resolved: context.presentation, surface: context.surface } : {}),
|
|
346
|
+
},
|
|
347
|
+
quickActions: subject.quickActions.map((action) => ({
|
|
348
|
+
id: action.id,
|
|
349
|
+
title: action.title,
|
|
350
|
+
...(action.label !== undefined ? { label: action.label } : {}),
|
|
351
|
+
...(action.pressed !== undefined ? { pressed: action.pressed } : {}),
|
|
352
|
+
...(action.disabled !== undefined ? { disabled: action.disabled } : {}),
|
|
353
|
+
})),
|
|
354
|
+
related: subject.related.map(({ id, title }) => ({ id, title })),
|
|
355
|
+
sections: subject.sections.map(serializeSection),
|
|
356
|
+
};
|
|
357
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `useActiveInspection` — the ONE reactive entry point to the inspection
|
|
3
|
+
* model, and the reason the dock and the inspector cannot disagree about
|
|
4
|
+
* which projection is showing.
|
|
5
|
+
*
|
|
6
|
+
* ## Why a hook and not "call the same function"
|
|
7
|
+
*
|
|
8
|
+
* Before this module, `components/Inspector.tsx` and
|
|
9
|
+
* the workspace host both resolved the active surface and then
|
|
10
|
+
* its presentation — the same expression, over DIFFERENT subscription sets. The inspector subscribed to
|
|
11
|
+
* the active adapter (`adapter.subscribe`); the dock did not. So when the
|
|
12
|
+
* active adapter changed under a document swap, the inspector re-rendered
|
|
13
|
+
* with the new surface and the dock kept the old one: the card floated over
|
|
14
|
+
* a dom document whose subject wanted the column, and the
|
|
15
|
+
* `workspace:inspector` panel never existed (measured live, 2026-08-06).
|
|
16
|
+
*
|
|
17
|
+
* Sharing a function is discipline; sharing a hook is structure. Every store
|
|
18
|
+
* the resolution reads is subscribed to HERE, once, so a consumer cannot
|
|
19
|
+
* under-subscribe — there is no per-consumer subscription list left to drift.
|
|
20
|
+
* The value returned is the whole {@link InspectionDisplay}
|
|
21
|
+
* (`inspection/display.ts`): the composed subject, its surface, whether an
|
|
22
|
+
* inspector exists, and which projection shows it, all derived from that one
|
|
23
|
+
* subject.
|
|
24
|
+
*
|
|
25
|
+
* It is not a store: it holds nothing. Every listed store already exists and
|
|
26
|
+
* already notifies; this hook only makes sure the same set backs every
|
|
27
|
+
* consumer of the resolution.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { useEffect, useReducer, useRef, useSyncExternalStore } from 'react';
|
|
31
|
+
import { assetEditorContextVersion, subscribeAssetEditorContext } from '../asset-editor-context';
|
|
32
|
+
import {
|
|
33
|
+
assetInspectorActionsVersion,
|
|
34
|
+
subscribeAssetInspectorActions,
|
|
35
|
+
} from '../asset-inspector-actions';
|
|
36
|
+
import { assetSelectionVersion, subscribeAssetSelection } from '../asset-selection';
|
|
37
|
+
import { activeAuthoringVersion, subscribeActiveAuthoring } from '../authoring/active-adapter';
|
|
38
|
+
import { resolvePanelAuthoring } from '../authoring/panel-authoring';
|
|
39
|
+
import { recordAuthoringConsumerUse } from '../coverage/authoring-seam-evidence';
|
|
40
|
+
import { documentContextVersion, subscribeDocumentContexts } from '../document-context-registry';
|
|
41
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
42
|
+
import {
|
|
43
|
+
inspectorPresentationVersion,
|
|
44
|
+
subscribeInspectorPresentation,
|
|
45
|
+
} from '../inspector-presentation';
|
|
46
|
+
import {
|
|
47
|
+
inspectorSectionRegistryVersion,
|
|
48
|
+
subscribeInspectorSectionRegistry,
|
|
49
|
+
} from '../inspector-section-registry';
|
|
50
|
+
import { subscribeToolContributionPlay, toolContributionPlayKey } from '../tool-contribution-play';
|
|
51
|
+
import {
|
|
52
|
+
subscribeWorkspaceDocuments,
|
|
53
|
+
workspaceDocumentRegistryVersion,
|
|
54
|
+
} from '../workspace-document-registry';
|
|
55
|
+
import { chromeRegionsVersion, subscribeChromeRegions } from '../workspace-regions';
|
|
56
|
+
import { describeActiveInspectionSubject } from './active-subject';
|
|
57
|
+
import type { InspectionDisplay } from './display';
|
|
58
|
+
import {
|
|
59
|
+
documentInspectionSubjectVersion,
|
|
60
|
+
subscribeDocumentInspectionSubject,
|
|
61
|
+
} from './document-subject';
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The active inspection display, re-derived whenever anything it reads
|
|
65
|
+
* changes. Consumers: the inspector projections (`components/Inspector.tsx`),
|
|
66
|
+
* the workspace's physical gating (the workspace host) and the
|
|
67
|
+
* floating card's own chrome (`components/CompactInspectorCard.tsx`).
|
|
68
|
+
*/
|
|
69
|
+
export function useActiveInspection(store: EditorShellStore): InspectionDisplay {
|
|
70
|
+
// 1. Selection, the scene, and reflected edits. Exact membership-only
|
|
71
|
+
// changes for an unrelated runtime object cannot change the active subject;
|
|
72
|
+
// selected replacement and conservative structural changes advance the
|
|
73
|
+
// shell snapshot at the store boundary.
|
|
74
|
+
useSyncExternalStore(store.subscribe, store.getShellSnapshot, store.getShellSnapshot);
|
|
75
|
+
// 2. Which document is active (the surface's first input).
|
|
76
|
+
useSyncExternalStore(
|
|
77
|
+
subscribeWorkspaceDocuments,
|
|
78
|
+
workspaceDocumentRegistryVersion,
|
|
79
|
+
workspaceDocumentRegistryVersion,
|
|
80
|
+
);
|
|
81
|
+
// 3. The adapter override slot — an ingest/document swap installs another.
|
|
82
|
+
useSyncExternalStore(subscribeActiveAuthoring, activeAuthoringVersion, activeAuthoringVersion);
|
|
83
|
+
// Play publishes the Game subject after async authoring setup has already
|
|
84
|
+
// notified the shell. Observe that publication even while no section is mounted.
|
|
85
|
+
useSyncExternalStore(
|
|
86
|
+
subscribeToolContributionPlay,
|
|
87
|
+
toolContributionPlayKey,
|
|
88
|
+
toolContributionPlayKey,
|
|
89
|
+
);
|
|
90
|
+
// 4. The user's per-surface presentation preference.
|
|
91
|
+
useSyncExternalStore(
|
|
92
|
+
subscribeInspectorPresentation,
|
|
93
|
+
inspectorPresentationVersion,
|
|
94
|
+
inspectorPresentationVersion,
|
|
95
|
+
);
|
|
96
|
+
// 4b. The active workspace's docked-layout choice beneath it
|
|
97
|
+
// (`workspace-regions.ts`) — a workspace switch re-lays the column.
|
|
98
|
+
useSyncExternalStore(subscribeChromeRegions, chromeRegionsVersion, chromeRegionsVersion);
|
|
99
|
+
// 5. Section contributions (project tools register asynchronously / on HMR).
|
|
100
|
+
useSyncExternalStore(
|
|
101
|
+
subscribeInspectorSectionRegistry,
|
|
102
|
+
inspectorSectionRegistryVersion,
|
|
103
|
+
inspectorSectionRegistryVersion,
|
|
104
|
+
);
|
|
105
|
+
// 5b. The verbs `asset.inspector` sections publish for the selected asset.
|
|
106
|
+
// They resolve asynchronously (the Edit Mesh door imports the module
|
|
107
|
+
// before it knows), so the subject that carries them has to re-derive
|
|
108
|
+
// when they land — exactly like (5).
|
|
109
|
+
useSyncExternalStore(
|
|
110
|
+
subscribeAssetInspectorActions,
|
|
111
|
+
assetInspectorActionsVersion,
|
|
112
|
+
assetInspectorActionsVersion,
|
|
113
|
+
);
|
|
114
|
+
// 6. The asset browser's transient selection — a contribution matches on it.
|
|
115
|
+
useSyncExternalStore(subscribeAssetSelection, assetSelectionVersion, assetSelectionVersion);
|
|
116
|
+
// 7. The open Asset Lab document — the `asset-lab` surface's own subject.
|
|
117
|
+
useSyncExternalStore(
|
|
118
|
+
subscribeAssetEditorContext,
|
|
119
|
+
assetEditorContextVersion,
|
|
120
|
+
assetEditorContextVersion,
|
|
121
|
+
);
|
|
122
|
+
// 7b. What the ACTIVE document says it is. A document whose own subject
|
|
123
|
+
// changes under a pick the adapters never see (the component boards)
|
|
124
|
+
// has no other way into this resolution.
|
|
125
|
+
useSyncExternalStore(
|
|
126
|
+
subscribeDocumentInspectionSubject,
|
|
127
|
+
documentInspectionSubjectVersion,
|
|
128
|
+
documentInspectionSubjectVersion,
|
|
129
|
+
);
|
|
130
|
+
// 7c. What the active document's PUBLISHED CONTEXT answers, when the package
|
|
131
|
+
// driving it says that moved (`document-context-registry.ts`'s
|
|
132
|
+
// `notifyDocumentContextChanged`, the SDK's `documents.contextChanged`).
|
|
133
|
+
// A context is a live handle: `@volter/editor-blender` reads the engine through
|
|
134
|
+
// its RNA door and the answer decides which Properties TABS a datablock
|
|
135
|
+
// has, and nothing in a host store moves when that answer lands.
|
|
136
|
+
useSyncExternalStore(subscribeDocumentContexts, documentContextVersion, documentContextVersion);
|
|
137
|
+
// 8. The adapter's OWN truth (hierarchy/props changes, and the mount that
|
|
138
|
+
// makes a root's adapter resolvable in the first place — the
|
|
139
|
+
// notification the dock was missing).
|
|
140
|
+
const [, forceAdapterUpdate] = useReducer((value: number) => value + 1, 0);
|
|
141
|
+
const { adapter } = resolvePanelAuthoring(store);
|
|
142
|
+
const observedStoreVersions = useRef({
|
|
143
|
+
broad: store.getSnapshot(),
|
|
144
|
+
shell: store.getShellSnapshot(),
|
|
145
|
+
});
|
|
146
|
+
observedStoreVersions.current = {
|
|
147
|
+
broad: store.getSnapshot(),
|
|
148
|
+
shell: store.getShellSnapshot(),
|
|
149
|
+
};
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
const subscribe = adapter.subscribe;
|
|
152
|
+
if (!subscribe) return;
|
|
153
|
+
return recordAuthoringConsumerUse({
|
|
154
|
+
adapter,
|
|
155
|
+
seam: 'editor.subscribe',
|
|
156
|
+
stage: 'effect',
|
|
157
|
+
detail: 'the active Inspector subscribed to adapter-owned changes',
|
|
158
|
+
run: () =>
|
|
159
|
+
subscribe.call(adapter, () => {
|
|
160
|
+
const previous = observedStoreVersions.current;
|
|
161
|
+
const next = {
|
|
162
|
+
broad: store.getSnapshot(),
|
|
163
|
+
shell: store.getShellSnapshot(),
|
|
164
|
+
};
|
|
165
|
+
observedStoreVersions.current = next;
|
|
166
|
+
// A store-backed adapter reports through the same notification that
|
|
167
|
+
// already reaches the selector above. An exact object-map-only
|
|
168
|
+
// change advances only `broad` and cannot affect the selected
|
|
169
|
+
// subject; a shell change is already scheduled by the direct store
|
|
170
|
+
// subscription. A genuine adapter-only event advances neither and
|
|
171
|
+
// still owns this explicit re-render path (notably replaceChild).
|
|
172
|
+
if (next.broad === previous.broad && next.shell === previous.shell) {
|
|
173
|
+
forceAdapterUpdate();
|
|
174
|
+
}
|
|
175
|
+
}),
|
|
176
|
+
});
|
|
177
|
+
}, [adapter, store]);
|
|
178
|
+
|
|
179
|
+
return describeActiveInspectionSubject(store);
|
|
180
|
+
}
|