@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,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One structural and operational answer for an AuthoringAdapter.
|
|
3
|
+
*
|
|
4
|
+
* This module does not call providers. It inventories their compiler-pinned
|
|
5
|
+
* shapes and combines those receipts with receipts produced by real consumers
|
|
6
|
+
* and conformance probes. Shape can reject a malformed carrier immediately;
|
|
7
|
+
* it can never manufacture an operational pass.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
AUTHORING_ADAPTER_SHAPE,
|
|
12
|
+
AUTHORING_PROVIDER_KEYS,
|
|
13
|
+
AUTHORING_PROVIDER_SHAPES,
|
|
14
|
+
type AuthoringAdapter,
|
|
15
|
+
type AuthoringProviderKey,
|
|
16
|
+
gradeSeamCarrier,
|
|
17
|
+
gradeSeamEvidence,
|
|
18
|
+
HIERARCHY_PROVIDER_SHAPE,
|
|
19
|
+
type HierarchyProvider,
|
|
20
|
+
inspectSeamShape,
|
|
21
|
+
type SeamEvidenceReceipt,
|
|
22
|
+
type SeamEvidenceVerdict,
|
|
23
|
+
type SeamProofStage,
|
|
24
|
+
type SeamShape,
|
|
25
|
+
type StructuralWriteOutcome,
|
|
26
|
+
type WriteAck,
|
|
27
|
+
} from '@volter/editor-project/adapter';
|
|
28
|
+
import { liveSeamEvidence, recordLiveSeamEvidence } from './live-seam-evidence';
|
|
29
|
+
|
|
30
|
+
const EPOCHS = new WeakMap<object, string>();
|
|
31
|
+
let nextEpoch = 1;
|
|
32
|
+
|
|
33
|
+
/** Stable only for the lifetime of this adapter object. A cold remount creates
|
|
34
|
+
* a new adapter and therefore cannot inherit receipts from the old one. */
|
|
35
|
+
export function authoringAdapterEpoch(adapter: AuthoringAdapter): string {
|
|
36
|
+
const object = adapter as object;
|
|
37
|
+
const existing = EPOCHS.get(object);
|
|
38
|
+
if (existing) return existing;
|
|
39
|
+
const epoch = `authoring-${nextEpoch++}`;
|
|
40
|
+
EPOCHS.set(object, epoch);
|
|
41
|
+
return epoch;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function recordAuthoringReceipt(options: {
|
|
45
|
+
readonly adapter: AuthoringAdapter;
|
|
46
|
+
readonly seam: string;
|
|
47
|
+
readonly stage: SeamProofStage;
|
|
48
|
+
readonly outcome: 'pass' | 'fail';
|
|
49
|
+
readonly detail: string;
|
|
50
|
+
}): void {
|
|
51
|
+
const epoch = authoringAdapterEpoch(options.adapter);
|
|
52
|
+
const record = (seam: string, detail: string): void =>
|
|
53
|
+
recordLiveSeamEvidence({
|
|
54
|
+
seam,
|
|
55
|
+
subject: 'authoring-adapter',
|
|
56
|
+
epoch,
|
|
57
|
+
stage: options.stage,
|
|
58
|
+
outcome: options.outcome,
|
|
59
|
+
source: 'consumer',
|
|
60
|
+
detail,
|
|
61
|
+
});
|
|
62
|
+
record(options.seam, options.detail);
|
|
63
|
+
const segments = options.seam.split('.');
|
|
64
|
+
if (segments.length < 3) return;
|
|
65
|
+
const parent = segments.slice(0, -1).join('.');
|
|
66
|
+
record(
|
|
67
|
+
parent,
|
|
68
|
+
options.outcome === 'pass'
|
|
69
|
+
? `${parent} served a real consumer ${options.stage}`
|
|
70
|
+
: `${parent} failed through its consumer: ${options.detail}`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function writeAck(value: unknown): WriteAck | null {
|
|
75
|
+
if (!value || typeof value !== 'object') return null;
|
|
76
|
+
const candidate = value as { destination?: unknown; persisted?: unknown };
|
|
77
|
+
return typeof candidate.destination === 'string' && typeof candidate.persisted === 'boolean'
|
|
78
|
+
? (candidate as WriteAck)
|
|
79
|
+
: null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Record one real consumer call against the exact adapter object it used.
|
|
83
|
+
*
|
|
84
|
+
* The epoch, not a display label, is the identity boundary: one root can be
|
|
85
|
+
* reported under its manifest id in status and under `root` in the ingest
|
|
86
|
+
* mount report, while both names refer to this same adapter instance. The
|
|
87
|
+
* receipt is therefore stored under the neutral subject and rebound to the
|
|
88
|
+
* report's subject in {@link inspectAuthoringAdapterSeams} below.
|
|
89
|
+
*
|
|
90
|
+
* Promise-returning provider methods keep their original timing and rejection;
|
|
91
|
+
* success is recorded only after they settle. A thrown/rejected call records a
|
|
92
|
+
* failing receipt and is rethrown unchanged.
|
|
93
|
+
*/
|
|
94
|
+
export function recordAuthoringConsumerUse<T>(options: {
|
|
95
|
+
readonly adapter: AuthoringAdapter;
|
|
96
|
+
readonly seam: string;
|
|
97
|
+
readonly stage: SeamProofStage;
|
|
98
|
+
readonly detail: string;
|
|
99
|
+
readonly run: () => T;
|
|
100
|
+
}): T {
|
|
101
|
+
const receipt = (outcome: 'pass' | 'fail', detail: string): void => {
|
|
102
|
+
recordAuthoringReceipt({ ...options, outcome, detail });
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
const value = options.run();
|
|
106
|
+
if (value && typeof (value as { then?: unknown }).then === 'function') {
|
|
107
|
+
return Promise.resolve(value).then(
|
|
108
|
+
(settled) => {
|
|
109
|
+
receipt('pass', options.detail);
|
|
110
|
+
return settled;
|
|
111
|
+
},
|
|
112
|
+
(error) => {
|
|
113
|
+
receipt(
|
|
114
|
+
'fail',
|
|
115
|
+
`${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
116
|
+
);
|
|
117
|
+
throw error;
|
|
118
|
+
},
|
|
119
|
+
) as unknown as T;
|
|
120
|
+
}
|
|
121
|
+
receipt('pass', options.detail);
|
|
122
|
+
return value;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
receipt(
|
|
125
|
+
'fail',
|
|
126
|
+
`${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
127
|
+
);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Record a write at the strength its own return value proves. A concrete
|
|
133
|
+
* WriteAck is a round trip even when it honestly says live-only; `void` proves
|
|
134
|
+
* only that the effect call returned. This keeps void-returning legacy lanes
|
|
135
|
+
* from manufacturing the stronger receipt their contract still owes. */
|
|
136
|
+
export function recordAuthoringWriteConsumerUse(options: {
|
|
137
|
+
readonly adapter: AuthoringAdapter;
|
|
138
|
+
readonly seam: string;
|
|
139
|
+
readonly detail: string;
|
|
140
|
+
readonly run: () => StructuralWriteOutcome;
|
|
141
|
+
}): StructuralWriteOutcome {
|
|
142
|
+
const success = (value: void | WriteAck): void | WriteAck => {
|
|
143
|
+
const ack = writeAck(value);
|
|
144
|
+
recordAuthoringReceipt({
|
|
145
|
+
adapter: options.adapter,
|
|
146
|
+
seam: options.seam,
|
|
147
|
+
stage: ack ? 'round-trip' : 'effect',
|
|
148
|
+
outcome: 'pass',
|
|
149
|
+
detail: ack
|
|
150
|
+
? `${options.detail}: ${ack.destination} (${ack.persisted ? 'persisted' : 'live-only'})`
|
|
151
|
+
: `${options.detail}; the provider returned no write acknowledgement`,
|
|
152
|
+
});
|
|
153
|
+
return value;
|
|
154
|
+
};
|
|
155
|
+
const failure = (error: unknown): never => {
|
|
156
|
+
recordAuthoringReceipt({
|
|
157
|
+
adapter: options.adapter,
|
|
158
|
+
seam: options.seam,
|
|
159
|
+
stage: 'round-trip',
|
|
160
|
+
outcome: 'fail',
|
|
161
|
+
detail: `${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
162
|
+
});
|
|
163
|
+
throw error;
|
|
164
|
+
};
|
|
165
|
+
try {
|
|
166
|
+
const value = options.run();
|
|
167
|
+
return value && typeof (value as { then?: unknown }).then === 'function'
|
|
168
|
+
? Promise.resolve(value).then(success, failure)
|
|
169
|
+
: success(value as void | WriteAck);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return failure(error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface AuthoringSeamEvidence {
|
|
176
|
+
readonly subject: string;
|
|
177
|
+
readonly epoch: string;
|
|
178
|
+
readonly receipts: readonly SeamEvidenceReceipt[];
|
|
179
|
+
readonly providers: Readonly<Record<AuthoringProviderKey, SeamEvidenceVerdict>>;
|
|
180
|
+
/**
|
|
181
|
+
* The hierarchy CARRIER: well-formed, and every member it advertises proven
|
|
182
|
+
* at that member's own required stage. This is the door
|
|
183
|
+
* `authoring/active-adapter.ts` refuses a malformed adapter with — a missing
|
|
184
|
+
* or mis-kinded `roots`/`node` only ever shows up as a member verdict, so
|
|
185
|
+
* the refusal needs the carrier grade and not the seam's own.
|
|
186
|
+
*/
|
|
187
|
+
readonly hierarchy: SeamEvidenceVerdict;
|
|
188
|
+
/**
|
|
189
|
+
* The hierarchy WALK — the `editor.hierarchy` seam's own verdict, which is a
|
|
190
|
+
* different and weaker question than {@link hierarchy}: did a current-epoch
|
|
191
|
+
* operation walk this root's tree and find it finite, non-empty and
|
|
192
|
+
* reciprocal (`coverage/authoring-read-probe.ts`)?
|
|
193
|
+
*
|
|
194
|
+
* It exists because the CARRIER asks a strictly stronger question: every
|
|
195
|
+
* member the carrier advertises, proven at that member's own stage. It used
|
|
196
|
+
* to be an UNANSWERABLE one — `object3D` (required `operation`) and
|
|
197
|
+
* `idForObject3D` (then required `effect`) are optional-but-PRESENT on every
|
|
198
|
+
* three adapter, no production consumer records a receipt for either, and
|
|
199
|
+
* the read probe did not call them, so `gradeSeamCarrier` returned
|
|
200
|
+
* `unverified` on a perfectly reciprocal tree, forever. Both are pure
|
|
201
|
+
* lookups and are `operation` now, called and checked against the walk by
|
|
202
|
+
* `coverage/authoring-read-probe.ts`'s `objectLookupReceipts`, so the
|
|
203
|
+
* carrier answers its own question on a healthy adapter.
|
|
204
|
+
* The two grades stay separate regardless: this one is what
|
|
205
|
+
* `adapter-reach.ts`'s `captureEvidence` reads, and reading the CARRIER
|
|
206
|
+
* there once left the capture row's `ok` branch DEAD — a healthy
|
|
207
|
+
* root printed "no current-epoch hierarchy operation proves it projects
|
|
208
|
+
* this root's runtime" as `info` while the operation had in fact run and
|
|
209
|
+
* passed. MEASURED 2026-09-19 on a `--template game` scaffold: `info` with
|
|
210
|
+
* the reciprocity fix in, `gap` with the pre-fix adapter planted — the
|
|
211
|
+
* failure branch worked, the success branch could not be reached.
|
|
212
|
+
*
|
|
213
|
+
* Graded here, beside the carrier and off the SAME receipt set, so the two
|
|
214
|
+
* answers cannot drift apart in two modules.
|
|
215
|
+
*/
|
|
216
|
+
readonly hierarchyWalk: SeamEvidenceVerdict;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function inspectAuthoringAdapterSeams(options: {
|
|
220
|
+
readonly adapter: AuthoringAdapter;
|
|
221
|
+
readonly subject: string;
|
|
222
|
+
readonly epoch?: string | undefined;
|
|
223
|
+
readonly receipts?: readonly SeamEvidenceReceipt[] | undefined;
|
|
224
|
+
}): AuthoringSeamEvidence {
|
|
225
|
+
const { adapter, subject } = options;
|
|
226
|
+
const epoch = options.epoch ?? authoringAdapterEpoch(adapter);
|
|
227
|
+
const receipts: SeamEvidenceReceipt[] = [
|
|
228
|
+
...inspectSeamShape<AuthoringAdapter>({
|
|
229
|
+
prefix: 'editor',
|
|
230
|
+
value: adapter,
|
|
231
|
+
shape: AUTHORING_ADAPTER_SHAPE,
|
|
232
|
+
subject,
|
|
233
|
+
epoch,
|
|
234
|
+
}),
|
|
235
|
+
...inspectSeamShape<HierarchyProvider>({
|
|
236
|
+
prefix: 'editor.hierarchy',
|
|
237
|
+
value: adapter.hierarchy,
|
|
238
|
+
shape: HIERARCHY_PROVIDER_SHAPE,
|
|
239
|
+
subject,
|
|
240
|
+
epoch,
|
|
241
|
+
}),
|
|
242
|
+
];
|
|
243
|
+
|
|
244
|
+
for (const [provider, shape] of Object.entries(AUTHORING_PROVIDER_SHAPES)) {
|
|
245
|
+
receipts.push(
|
|
246
|
+
...inspectSeamShape({
|
|
247
|
+
prefix: `editor.${provider}`,
|
|
248
|
+
value: (adapter as unknown as Record<string, unknown>)[provider],
|
|
249
|
+
shape: shape as SeamShape<object>,
|
|
250
|
+
subject,
|
|
251
|
+
epoch,
|
|
252
|
+
}),
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
// An adapter epoch already identifies one concrete carrier. Rebind its live
|
|
256
|
+
// consumer receipts to this report's display subject so the same operation
|
|
257
|
+
// closes both the per-root status row (`worldId`) and the ingest report
|
|
258
|
+
// (`root`) without duplicating or guessing names at the call site.
|
|
259
|
+
receipts.push(
|
|
260
|
+
...liveSeamEvidence.receipts({ epoch }).map((receipt) => ({ ...receipt, subject })),
|
|
261
|
+
);
|
|
262
|
+
if (options.receipts) receipts.push(...options.receipts);
|
|
263
|
+
|
|
264
|
+
const providers = {} as Record<AuthoringProviderKey, SeamEvidenceVerdict>;
|
|
265
|
+
for (const provider of AUTHORING_PROVIDER_KEYS) {
|
|
266
|
+
const nested = (AUTHORING_PROVIDER_SHAPES as Partial<Record<string, SeamShape<object>>>)[
|
|
267
|
+
provider
|
|
268
|
+
];
|
|
269
|
+
providers[provider] = gradeSeamCarrier({
|
|
270
|
+
seam: `editor.${provider}`,
|
|
271
|
+
required: AUTHORING_ADAPTER_SHAPE[provider].required,
|
|
272
|
+
shape: nested,
|
|
273
|
+
subject,
|
|
274
|
+
epoch,
|
|
275
|
+
receipts,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
subject,
|
|
281
|
+
epoch,
|
|
282
|
+
receipts,
|
|
283
|
+
providers,
|
|
284
|
+
hierarchy: gradeSeamCarrier({
|
|
285
|
+
seam: 'editor.hierarchy',
|
|
286
|
+
required: AUTHORING_ADAPTER_SHAPE.hierarchy.required,
|
|
287
|
+
shape: HIERARCHY_PROVIDER_SHAPE as SeamShape<object>,
|
|
288
|
+
subject,
|
|
289
|
+
epoch,
|
|
290
|
+
receipts,
|
|
291
|
+
}),
|
|
292
|
+
hierarchyWalk: gradeSeamEvidence({
|
|
293
|
+
seam: 'editor.hierarchy',
|
|
294
|
+
required: AUTHORING_ADAPTER_SHAPE.hierarchy.required,
|
|
295
|
+
subject,
|
|
296
|
+
epoch,
|
|
297
|
+
receipts,
|
|
298
|
+
}),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHICH CANVAS IS PRESENTING, and the bounded failsafe for when NONE is.
|
|
3
|
+
*
|
|
4
|
+
* The `canvas-revealed` ontology invariant (`ontology-invariants.ts`) asks one
|
|
5
|
+
* question: is this session drawing onto a surface nobody can see? Its own
|
|
6
|
+
* `fix` text has always named "the reveal failsafe" — and there wasn't one.
|
|
7
|
+
* This module is both halves, kept pure (facts in, decision out) so every
|
|
8
|
+
* transition is testable with no browser, the same contract the invariants
|
|
9
|
+
* themselves follow.
|
|
10
|
+
*
|
|
11
|
+
* ## Half one: the measurement was picking the wrong canvas
|
|
12
|
+
*
|
|
13
|
+
* The facts used to come from `findPrimaryCanvas`, which ranks by painted
|
|
14
|
+
* AREA and is blind to visibility — a canvas hidden by `visibility: hidden`
|
|
15
|
+
* keeps its full bounding box. Measured live on a racing-game ingest session
|
|
16
|
+
* (2026-08-15): during Play the Scene document's render overlay is hidden
|
|
17
|
+
* with an inline `visibility: hidden` while the game's own canvas
|
|
18
|
+
* fills the pane. The editor's Scene canvas — full-size, correctly hidden,
|
|
19
|
+
* shallower in the tree — won the ranking, so the invariant reported
|
|
20
|
+
* "4 frame(s) produced in 3389ms while the viewport canvas is hidden
|
|
21
|
+
* (visibility: hidden)" for a session whose screenshot showed the game
|
|
22
|
+
* rendering perfectly. A standing warning on a healthy session is the failure
|
|
23
|
+
* mode the invariant module's own comments warn about, so it is fixed at the
|
|
24
|
+
* source: **a session is revealed when ANY of its canvases is revealed**, and
|
|
25
|
+
* only when every one of them is hidden does the row name the largest one's
|
|
26
|
+
* reason.
|
|
27
|
+
*
|
|
28
|
+
* ## Half two: firing, not just reporting
|
|
29
|
+
*
|
|
30
|
+
* When every canvas IS hidden while frames are being produced, reporting is
|
|
31
|
+
* not enough — the user is looking at a blank viewport and the fix is one
|
|
32
|
+
* style write away. The failsafe fires it, and is deliberately narrow:
|
|
33
|
+
*
|
|
34
|
+
* - **Only inline hiding on the canvas ITSELF.** A canvas hidden by an
|
|
35
|
+
* ancestor (a render overlay) or by a stylesheet rule is somebody
|
|
36
|
+
* else's decision, expressed somewhere this must not reach into.
|
|
37
|
+
* - **Only a canvas with no declared owner.** The editor's own viewport
|
|
38
|
+
* canvas is inline `opacity: 0` whenever `isThreejsSurfaceVisible` says so
|
|
39
|
+
* — a computed decision with a name — and React would re-apply it anyway.
|
|
40
|
+
* Fighting it would put a permanent false alarm on every DOM-only project.
|
|
41
|
+
* - **Once per canvas, after a bounded wait.** A mount is legitimately hidden
|
|
42
|
+
* for a moment; a failsafe that fires on the transient is a failsafe that
|
|
43
|
+
* cries wolf. And a failsafe is an emergency, never a policy: it clears the
|
|
44
|
+
* style once and then stops, so it can never become the mechanism a broken
|
|
45
|
+
* reveal path quietly relies on.
|
|
46
|
+
*
|
|
47
|
+
* Firing is LOUD by design. The ledger entry says the failsafe fired, what it
|
|
48
|
+
* had to undo, and that this is a defect worth reporting upstream — because a
|
|
49
|
+
* silently-repaired reveal is a reveal nobody ever fixes.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/** One canvas as the DOM layer measured it. */
|
|
53
|
+
export interface CanvasVisibilityFact {
|
|
54
|
+
/** How the message names it — a `data-testid`, a class, or its index. */
|
|
55
|
+
readonly label: string;
|
|
56
|
+
/** Painted area in CSS px², used only to pick the one the row speaks for. */
|
|
57
|
+
readonly area: number;
|
|
58
|
+
/** Why it is not visible, in the measurement's own words, or `null` when it
|
|
59
|
+
* IS visible. */
|
|
60
|
+
readonly hiddenBy: string | null;
|
|
61
|
+
/** Which of the canvas' OWN inline style properties is what hides it, or
|
|
62
|
+
* `null` when the hiding comes from anywhere else (an ancestor, a
|
|
63
|
+
* stylesheet, a zero-size box). Only this is ever cleared. */
|
|
64
|
+
readonly inlineHiding: 'opacity' | 'visibility' | 'display' | null;
|
|
65
|
+
/** True when this canvas' visibility is nobody's declared decision. The
|
|
66
|
+
* editor's own viewport canvas is `false` — see the module header. */
|
|
67
|
+
readonly failsafeEligible: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Why the session has no visible presentation surface, in the measurement's
|
|
72
|
+
* own words — `undefined` when there is no canvas to measure at all, `null`
|
|
73
|
+
* when at least one canvas is revealed.
|
|
74
|
+
*
|
|
75
|
+
* This is the whole of half one: the presence of ONE revealed canvas is what
|
|
76
|
+
* makes the session presentable, whatever the others are doing.
|
|
77
|
+
*/
|
|
78
|
+
export function presentingCanvasHiddenBy(
|
|
79
|
+
canvases: readonly CanvasVisibilityFact[],
|
|
80
|
+
): string | null | undefined {
|
|
81
|
+
if (canvases.length === 0) return undefined;
|
|
82
|
+
if (canvases.some((canvas) => canvas.hiddenBy === null)) return null;
|
|
83
|
+
const largest = [...canvases].sort((a, b) => b.area - a.area)[0];
|
|
84
|
+
return largest?.hiddenBy ?? null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* One line per hidden canvas: which one, why, and whose doing it is.
|
|
89
|
+
*
|
|
90
|
+
* The row used to say only "the viewport canvas is hidden (visibility:
|
|
91
|
+
* hidden)" — a sentence you cannot act on, because a session has several
|
|
92
|
+
* canvases and the reason does not say which of them is the subject or who
|
|
93
|
+
* hid it. Verifying this work against a live session was blocked on exactly
|
|
94
|
+
* that gap, which is the argument for it being in the report rather than in a
|
|
95
|
+
* debug affordance.
|
|
96
|
+
*/
|
|
97
|
+
export function hiddenCanvasBreakdown(
|
|
98
|
+
canvases: readonly CanvasVisibilityFact[],
|
|
99
|
+
): readonly string[] {
|
|
100
|
+
return canvases
|
|
101
|
+
.filter((canvas) => canvas.hiddenBy !== null)
|
|
102
|
+
.sort((a, b) => b.area - a.area)
|
|
103
|
+
.map(
|
|
104
|
+
(canvas) =>
|
|
105
|
+
`${canvas.label} (${canvas.hiddenBy}, ${
|
|
106
|
+
canvas.inlineHiding === null
|
|
107
|
+
? 'from an ancestor or a stylesheet'
|
|
108
|
+
: canvas.failsafeEligible
|
|
109
|
+
? 'its own inline style, unowned'
|
|
110
|
+
: 'its own inline style, by a declared owner'
|
|
111
|
+
}, ${Math.round(canvas.area)}px²)`,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* THE ONE SUBJECT DEFINITION — a canvas hiding ITSELF with nobody owning that
|
|
117
|
+
* decision. Both the invariant row and the failsafe below turn on this, which
|
|
118
|
+
* is why it is a function rather than two filters that could drift apart.
|
|
119
|
+
*
|
|
120
|
+
* Two facts have to line up, and each was measured as a false positive on the
|
|
121
|
+
* same live racing-ingest session (2026-08-15) when it did not:
|
|
122
|
+
*
|
|
123
|
+
* - hidden by its OWN box or inline style. On the UI Components document,
|
|
124
|
+
* every canvas is hidden by an ANCESTOR — the editor
|
|
125
|
+
* showing a different document, which is what the user opened.
|
|
126
|
+
* - and NOT a canvas whose visibility is somebody's declared decision. The
|
|
127
|
+
* editor's own viewport canvas carries inline `opacity: 0` from
|
|
128
|
+
* `isThreejsSurfaceVisible`, so during Play over an ingest root it read as
|
|
129
|
+
* "a canvas hiding itself" and kept the row violating on a healthy session.
|
|
130
|
+
*/
|
|
131
|
+
export function selfHiddenSubjects(
|
|
132
|
+
canvases: readonly CanvasVisibilityFact[],
|
|
133
|
+
): readonly CanvasVisibilityFact[] {
|
|
134
|
+
return canvases.filter((canvas) => canvas.failsafeEligible && canvas.inlineHiding !== null);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Of the hidden canvases, is any of them {@link selfHiddenSubjects | hiding
|
|
139
|
+
* itself}? `null` when nothing is hidden at all — there is no question to
|
|
140
|
+
* answer.
|
|
141
|
+
*/
|
|
142
|
+
export function anyCanvasHidesItself(canvases: readonly CanvasVisibilityFact[]): boolean | null {
|
|
143
|
+
if (!canvases.some((canvas) => canvas.hiddenBy !== null)) return null;
|
|
144
|
+
return selfHiddenSubjects(canvases).length > 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* How long the all-hidden-while-drawing condition must hold before the
|
|
149
|
+
* failsafe fires. Longer than one vitals sample, so the condition has to
|
|
150
|
+
* SURVIVE a sample rather than merely be observed once during a mount.
|
|
151
|
+
*/
|
|
152
|
+
export const REVEAL_FAILSAFE_DEADLINE_MS = 4_000;
|
|
153
|
+
|
|
154
|
+
export type RevealFailsafeDecision =
|
|
155
|
+
| { readonly fire: false }
|
|
156
|
+
| { readonly fire: true; readonly target: CanvasVisibilityFact; readonly ledger: string };
|
|
157
|
+
|
|
158
|
+
export interface RevealFailsafeInput {
|
|
159
|
+
readonly canvases: readonly CanvasVisibilityFact[];
|
|
160
|
+
/** Frames the page produced in the sample window. */
|
|
161
|
+
readonly framesProduced: number;
|
|
162
|
+
/** How long the condition has held, or `null` when this is the first sample
|
|
163
|
+
* that has seen it (nothing has held yet). */
|
|
164
|
+
readonly hiddenForMs: number | null;
|
|
165
|
+
readonly deadlineMs?: number;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Whether to force the reveal, and the ledger line that must accompany it.
|
|
170
|
+
*
|
|
171
|
+
* Every gate is a fact the caller measured; nothing here reads a clock or the
|
|
172
|
+
* DOM.
|
|
173
|
+
*/
|
|
174
|
+
export function decideRevealFailsafe(input: RevealFailsafeInput): RevealFailsafeDecision {
|
|
175
|
+
const deadline = input.deadlineMs ?? REVEAL_FAILSAFE_DEADLINE_MS;
|
|
176
|
+
if (input.framesProduced <= 0) return { fire: false };
|
|
177
|
+
if (input.hiddenForMs === null || input.hiddenForMs < deadline) return { fire: false };
|
|
178
|
+
if (presentingCanvasHiddenBy(input.canvases) === null) return { fire: false };
|
|
179
|
+
const target = [...selfHiddenSubjects(input.canvases)].sort((a, b) => b.area - a.area)[0];
|
|
180
|
+
if (!target) return { fire: false };
|
|
181
|
+
return {
|
|
182
|
+
fire: true,
|
|
183
|
+
target,
|
|
184
|
+
ledger:
|
|
185
|
+
`canvas reveal FAILSAFE FIRED — the "${target.label}" canvas was still hidden by its own ` +
|
|
186
|
+
`inline ${target.inlineHiding} (${target.hiddenBy}) ${Math.round(input.hiddenForMs / 1000)}s ` +
|
|
187
|
+
'after frames started arriving, so the editor cleared that style to put the picture on ' +
|
|
188
|
+
'screen. THIS IS A DEFECT, not a feature: the mount path that hid this canvas never ran ' +
|
|
189
|
+
'its own reveal, and the failsafe fires ONCE — a second mount in this state stays blank. ' +
|
|
190
|
+
'Report it upstream with the mount that owns this canvas.',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE DESIGN-TIME SURFACE REGISTRY — every place the editor mounts a game's own
|
|
3
|
+
* content while it is NOT playing, and the content clock each one publishes.
|
|
4
|
+
*
|
|
5
|
+
* ## CONTENT time vs PRESENTATION time (the one policy, stated once)
|
|
6
|
+
*
|
|
7
|
+
* A design-time surface renders continuously, and that is fine: the camera
|
|
8
|
+
* orbit, a turntable, the standard viewport dressing and the editor's own
|
|
9
|
+
* helpers are PRESENTATION and are editor-owned, so they may move while the
|
|
10
|
+
* editor is in Edit. What may NOT move is CONTENT — the mounted world's
|
|
11
|
+
* `update(dt)`, an animation mixer, a `useFrame` clock, a simulation step —
|
|
12
|
+
* because Edit is static (ARCHITECTURE-CORE §Rules). An interactive document
|
|
13
|
+
* may advance content only through its explicit animation/simulation transport;
|
|
14
|
+
* opening the document itself never advances it. Off-screen capture operations
|
|
15
|
+
* may request their own bounded settle before producing a still.
|
|
16
|
+
*
|
|
17
|
+
* ## WHY A REGISTRY, rather than a field on one surface's session class
|
|
18
|
+
*
|
|
19
|
+
* Edit-static was enforced at the Scene view's design session only, so the
|
|
20
|
+
* SAME content mounted on any other surface kept running: a GLB train animated
|
|
21
|
+
* in the Asset Lab while every instrument reported a still editor (owner find,
|
|
22
|
+
* 2026-08-15). The check therefore enumerates SURFACES, and a surface that
|
|
23
|
+
* publishes no clock is reported UNMEASURED BY NAME rather than assumed still —
|
|
24
|
+
* silence is the one case that would let a surface animate in Edit with the
|
|
25
|
+
* vitals green, which is the defect this registry exists to make impossible.
|
|
26
|
+
*
|
|
27
|
+
* A surface's clock is monotonic seconds of ITS OWN content time. Its absolute
|
|
28
|
+
* value means nothing; `coverage/session-vitals.ts` only ever asks whether two
|
|
29
|
+
* readings differ, which is what makes camera orbit (which never touches it)
|
|
30
|
+
* irrelevant to the answer.
|
|
31
|
+
*
|
|
32
|
+
* ## THE TRANSPORT IS THE SANCTION
|
|
33
|
+
*
|
|
34
|
+
* "Edit is static" has always meant *nothing plays on its own* — the origin
|
|
35
|
+
* note behind the row says it out loud: a game running "with nothing having
|
|
36
|
+
* pressed ▶". A document's own animation/simulation transport IS that press,
|
|
37
|
+
* so content time advancing WHILE a transport is engaged is the sanctioned
|
|
38
|
+
* case, not the violation. A surface therefore publishes a second reading
|
|
39
|
+
* beside its clock: how many times an ENGAGED transport advanced it
|
|
40
|
+
* ({@link DesignTimeSurface.transportAdvances}). The row fires only when the
|
|
41
|
+
* clock moved and that counter did not.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
export interface DesignTimeSurface {
|
|
45
|
+
/**
|
|
46
|
+
* Stable per MOUNT — the document id only for the one mount that IS the
|
|
47
|
+
* document. Two mounts of one document (its viewport and a chromeless
|
|
48
|
+
* preview of it) are two surfaces: registration is last-wins and the vitals
|
|
49
|
+
* consumer keys its per-window sample history by this id, so a shared id
|
|
50
|
+
* makes the survivor answer for both — a held preview clock once spoke for a
|
|
51
|
+
* viewport that was visibly animating (measured 2026-08-30). Suffix, or
|
|
52
|
+
* sequence, anything that is not the document itself.
|
|
53
|
+
*/
|
|
54
|
+
readonly id: string;
|
|
55
|
+
/** What the vitals row calls it out loud. */
|
|
56
|
+
readonly label: string;
|
|
57
|
+
/**
|
|
58
|
+
* Monotonic seconds of THIS surface's content time, or `null` when the host
|
|
59
|
+
* cannot currently make an honest comparison. Interactive document boot is
|
|
60
|
+
* never such a window: it publishes zero immediately because it performs no
|
|
61
|
+
* hidden simulation.
|
|
62
|
+
*/
|
|
63
|
+
readonly contentClock: () => number | null;
|
|
64
|
+
/**
|
|
65
|
+
* Monotonic count of the times an ENGAGED transport (this document's
|
|
66
|
+
* animation transport, its simulation transport's play or step) advanced
|
|
67
|
+
* this surface's content time.
|
|
68
|
+
*
|
|
69
|
+
* Compared the same way the clock is: two readings, and only whether they
|
|
70
|
+
* DIFFER. A counter — not a "is a transport playing right now" boolean —
|
|
71
|
+
* because the question is about the window BETWEEN two samples, and a
|
|
72
|
+
* boolean answers about the instant of the sample: a single-frame step, or
|
|
73
|
+
* a transport paused between two reads, would both report "nothing engaged"
|
|
74
|
+
* over a window in which a transport was the only thing that ran.
|
|
75
|
+
*
|
|
76
|
+
* A surface that omits this publishes no transport at all, so ANY advance of
|
|
77
|
+
* its clock is unsanctioned — which is the honest reading for a surface (a
|
|
78
|
+
* preview card, a turntable) that has no ▶ to press.
|
|
79
|
+
*/
|
|
80
|
+
readonly transportAdvances?: () => number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const surfaces = new Map<string, DesignTimeSurface>();
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Publish one live design-time surface. Returns its withdrawal — the ONE
|
|
87
|
+
* teardown path, and it is safe to call after the id has been re-registered by
|
|
88
|
+
* a later mount (it withdraws only its own entry).
|
|
89
|
+
*/
|
|
90
|
+
export function registerDesignTimeSurface(surface: DesignTimeSurface): () => void {
|
|
91
|
+
surfaces.set(surface.id, surface);
|
|
92
|
+
return () => {
|
|
93
|
+
if (surfaces.get(surface.id) !== surface) return;
|
|
94
|
+
surfaces.delete(surface.id);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Every live design-time surface, for the vitals collector. */
|
|
99
|
+
export function allDesignTimeSurfaces(): readonly DesignTimeSurface[] {
|
|
100
|
+
return [...surfaces.values()];
|
|
101
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** One current-process evidence ledger shared by panels, relay consumers,
|
|
2
|
+
* coverage, status, and Doctor. It is intentionally ephemeral: project source
|
|
3
|
+
* remains truth and no VGAI evidence sidecar is invented. */
|
|
4
|
+
|
|
5
|
+
import { SeamEvidenceLedger, type SeamEvidenceReceipt } from '@volter/editor-project/adapter';
|
|
6
|
+
|
|
7
|
+
export const liveSeamEvidence = new SeamEvidenceLedger();
|
|
8
|
+
|
|
9
|
+
export function recordLiveSeamEvidence(receipt: SeamEvidenceReceipt): void {
|
|
10
|
+
liveSeamEvidence.record(receipt);
|
|
11
|
+
}
|