@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,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE EDITOR WATCHES ITS OWN VITALS — the live half of
|
|
3
|
+
* `coverage/ontology-invariants.ts`.
|
|
4
|
+
*
|
|
5
|
+
* It reads the session's own singletons, hands the facts to the pure
|
|
6
|
+
* derivation, and pushes every violation into `editorConsole` as a warning
|
|
7
|
+
* sourced `invariant`. That is the whole integration: the console sync already
|
|
8
|
+
* forwards every warning to the server's unresolved-console ledger, so an
|
|
9
|
+
* ontology violation becomes a STANDING condition that rides the loudness
|
|
10
|
+
* banner on every `vgai` command until it stops recurring or somebody acks it
|
|
11
|
+
* by name. No new transport, no new door.
|
|
12
|
+
*
|
|
13
|
+
* ## What is measured, and what is honestly not
|
|
14
|
+
*
|
|
15
|
+
* Every fact here is read off something that already exists:
|
|
16
|
+
*
|
|
17
|
+
* - **loops** — the three runtimes the editor can enumerate (play, module,
|
|
18
|
+
* ingest). The row names them, so the scope of "Edit is static" is visible
|
|
19
|
+
* rather than implied.
|
|
20
|
+
* - **presented three roots** — the active authoring surface's own children
|
|
21
|
+
* (`authoring/mounted-root-subjects.ts`), which is what the hierarchy and
|
|
22
|
+
* the gizmo actually work over.
|
|
23
|
+
* - **frame cadence** — a rAF sampler owned by this module. Deliberately not
|
|
24
|
+
* the profiler's fps: the profiler measures the REGISTERED loop's callback,
|
|
25
|
+
* only exists while something registered one (play), and reads ~1ms while
|
|
26
|
+
* the tab crawls at 1.6fps because the budget went somewhere it cannot see.
|
|
27
|
+
* The question "is this visible tab still a direct-manipulation tool" is a
|
|
28
|
+
* question about the browser's frame cadence, and rAF is the instrument that
|
|
29
|
+
* answers it. One callback per frame, no allocation.
|
|
30
|
+
* - **play frames** — `PerformanceFrame.id`, a monotonic counter, off whatever
|
|
31
|
+
* render loop registered itself. Where no loop registered or its profiler is
|
|
32
|
+
* recording nothing, the fact is `null` and the row says UNMEASURED with
|
|
33
|
+
* that reason — never `ok`.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { getAuthoringOverride } from '../authoring/active-adapter';
|
|
37
|
+
import { mountedRootSubjects } from '../authoring/mounted-root-subjects';
|
|
38
|
+
import { editorConsole } from '../editor-console';
|
|
39
|
+
import { editorIsPlaying } from '../editor-session-mode';
|
|
40
|
+
import { liveSessions } from '../live-session-registry';
|
|
41
|
+
import { allPerformanceSources } from '../performance-sources';
|
|
42
|
+
import {
|
|
43
|
+
anyCanvasHidesItself,
|
|
44
|
+
type CanvasVisibilityFact,
|
|
45
|
+
decideRevealFailsafe,
|
|
46
|
+
hiddenCanvasBreakdown,
|
|
47
|
+
presentingCanvasHiddenBy,
|
|
48
|
+
} from './canvas-reveal';
|
|
49
|
+
import { allDesignTimeSurfaces } from './design-time-surfaces';
|
|
50
|
+
import {
|
|
51
|
+
type DesignTimeSurfaceFact,
|
|
52
|
+
deriveOntologyInvariants,
|
|
53
|
+
formatInvariantWarning,
|
|
54
|
+
type OntologyFacts,
|
|
55
|
+
type OntologyInvariantRow,
|
|
56
|
+
} from './ontology-invariants';
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* THE SESSION'S PERIODIC SAMPLE, for anyone else who needs one.
|
|
60
|
+
*
|
|
61
|
+
* Published as `host.session.onSample` (`@volter/editor-sdk/host`). A lane with
|
|
62
|
+
* a periodic derivation of its own — the capability-coverage union is the
|
|
63
|
+
* first, and used to be a direct call in the tick below — subscribes here
|
|
64
|
+
* instead of starting a second interval, so the session is looked at once per
|
|
65
|
+
* cadence and every answer describes the same instant. Listeners run FIRST in
|
|
66
|
+
* the pass, which is where the coverage union sat when it was the host's.
|
|
67
|
+
*
|
|
68
|
+
* A listener that throws is not allowed to end the host's own vitals: the
|
|
69
|
+
* whole point of this watcher is that it cannot be turned off.
|
|
70
|
+
*/
|
|
71
|
+
const _sampleListeners = new Set<() => void>();
|
|
72
|
+
|
|
73
|
+
export function onSessionSample(fn: () => void): () => void {
|
|
74
|
+
_sampleListeners.add(fn);
|
|
75
|
+
return () => {
|
|
76
|
+
_sampleListeners.delete(fn);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function fireSessionSample(): void {
|
|
81
|
+
for (const fn of [..._sampleListeners]) {
|
|
82
|
+
try {
|
|
83
|
+
fn();
|
|
84
|
+
} catch (error) {
|
|
85
|
+
editorConsole.error(`a session-sample subscriber threw: ${String(error)}`, 'invariant');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** How often the vitals are derived and reported. Long enough that the check
|
|
91
|
+
* itself is free, short enough that a violation reaches the next `vgai`
|
|
92
|
+
* command a human would run. */
|
|
93
|
+
const SAMPLE_INTERVAL_MS = 5_000;
|
|
94
|
+
|
|
95
|
+
/** The rAF cadence sampler's window. One sample per frame, reset each interval. */
|
|
96
|
+
interface FrameSample {
|
|
97
|
+
frames: number;
|
|
98
|
+
since: number;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let _sample: FrameSample = { frames: 0, since: 0 };
|
|
102
|
+
let _rafHandle: number | null = null;
|
|
103
|
+
let _timer: ReturnType<typeof setInterval> | null = null;
|
|
104
|
+
let _playStartedAt: number | null = null;
|
|
105
|
+
let _lastRows: readonly OntologyInvariantRow[] = [];
|
|
106
|
+
const _pendingInvariantViolations = new Map<string, number>();
|
|
107
|
+
|
|
108
|
+
/** Why the canvas is not visible, in the measurement's own words, or `null`
|
|
109
|
+
* when it is. Reads the same three ways a canvas actually disappears in this
|
|
110
|
+
* editor: taken out of layout, styled invisible, or collapsed to nothing. */
|
|
111
|
+
function canvasHiddenReason(canvas: HTMLCanvasElement): string | null {
|
|
112
|
+
const style = window.getComputedStyle(canvas);
|
|
113
|
+
if (style.display === 'none') return 'display: none';
|
|
114
|
+
if (style.visibility === 'hidden') return 'visibility: hidden';
|
|
115
|
+
if (Number.parseFloat(style.opacity || '1') === 0) return 'opacity: 0';
|
|
116
|
+
const rect = canvas.getBoundingClientRect();
|
|
117
|
+
if (rect.width <= 0 || rect.height <= 0) return 'zero-size box';
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The editor's OWN viewport canvas — the one whose visibility has a declared
|
|
123
|
+
* owner (`the world root's stage`'s `opacity: threejsSurface ? 1 : 0`, decided by
|
|
124
|
+
* `isThreejsSurfaceVisible`). Named here so the reveal failsafe can leave it
|
|
125
|
+
* alone; see `canvas-reveal.ts`'s header.
|
|
126
|
+
*/
|
|
127
|
+
const EDITOR_VIEWPORT_CANVAS_TESTID = 'editor-canvas';
|
|
128
|
+
|
|
129
|
+
/** Which of the canvas' OWN inline style properties is what hides it, if any.
|
|
130
|
+
* Read off the inline `style` attribute rather than the computed value: a
|
|
131
|
+
* computed `visibility: hidden` inherited from an ancestor is somebody
|
|
132
|
+
* else's decision and must never be cleared here. */
|
|
133
|
+
function inlineHidingOf(canvas: HTMLCanvasElement): 'opacity' | 'visibility' | 'display' | null {
|
|
134
|
+
const inline = canvas.style;
|
|
135
|
+
if (inline.display === 'none') return 'display';
|
|
136
|
+
if (inline.visibility === 'hidden') return 'visibility';
|
|
137
|
+
if (inline.opacity !== '' && Number.parseFloat(inline.opacity) === 0) return 'opacity';
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Every canvas on the page as `canvas-reveal.ts` reads them. */
|
|
142
|
+
function canvasFacts(): readonly CanvasVisibilityFact[] {
|
|
143
|
+
const canvases = [...document.querySelectorAll('canvas')];
|
|
144
|
+
return canvases.map((canvas, index): CanvasVisibilityFact => {
|
|
145
|
+
const testId = canvas.getAttribute('data-testid');
|
|
146
|
+
const rect = canvas.getBoundingClientRect();
|
|
147
|
+
return {
|
|
148
|
+
label: testId ?? (canvas.className || `canvas #${index}`),
|
|
149
|
+
area: Math.max(0, rect.width) * Math.max(0, rect.height),
|
|
150
|
+
hiddenBy: canvasHiddenReason(canvas),
|
|
151
|
+
inlineHiding: inlineHidingOf(canvas),
|
|
152
|
+
failsafeEligible: testId !== EDITOR_VIEWPORT_CANVAS_TESTID,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** The monotonic frame id of whichever render loop is registered, or a reason
|
|
158
|
+
* nothing can be said. */
|
|
159
|
+
function playFrameFacts(): { framesDrawn: number | null; framesUnavailable: string | null } {
|
|
160
|
+
const sources = allPerformanceSources();
|
|
161
|
+
if (sources.length === 0) {
|
|
162
|
+
return {
|
|
163
|
+
framesDrawn: null,
|
|
164
|
+
framesUnavailable:
|
|
165
|
+
'no render loop registered a performance source, so nothing counts this session’s frames',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
let best: number | null = null;
|
|
169
|
+
for (const source of sources) {
|
|
170
|
+
const snapshot = source.profiler.getSnapshot();
|
|
171
|
+
const latest = snapshot.frames.at(-1);
|
|
172
|
+
if (latest) best = Math.max(best ?? 0, latest.id);
|
|
173
|
+
}
|
|
174
|
+
if (best === null) {
|
|
175
|
+
return {
|
|
176
|
+
framesDrawn: null,
|
|
177
|
+
framesUnavailable:
|
|
178
|
+
'the registered render loop records no frames (its profiler has neither profiling nor telemetry enabled)',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return { framesDrawn: best, framesUnavailable: null };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The last content-clock reading per design-time surface, so the next sample can
|
|
186
|
+
* say whether it MOVED. A clock's absolute value means nothing on its own — the
|
|
187
|
+
* question is only ever "did it advance since we last looked", and comparing two
|
|
188
|
+
* readings is what makes camera orbit (which never touches this) irrelevant.
|
|
189
|
+
*/
|
|
190
|
+
const _lastContentClock = new Map<string, number>();
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The last TRANSPORT-ADVANCE reading per surface, sampled at the same instants
|
|
194
|
+
* as the clock above so the two answer for the same window: "content time
|
|
195
|
+
* moved" and "an engaged transport is what moved it"
|
|
196
|
+
* (`design-time-surfaces.ts` §THE TRANSPORT IS THE SANCTION).
|
|
197
|
+
*/
|
|
198
|
+
const _lastTransportAdvances = new Map<string, number>();
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* PER SURFACE, not per Scene. Every live design-time surface — Asset Lab
|
|
202
|
+
* documents, story turntables, board exhibits, preview cards
|
|
203
|
+
* (`coverage/design-time-surfaces.ts`) — is asked for its own content clock, and
|
|
204
|
+
* a surface that publishes none is reported by name with that reason rather than
|
|
205
|
+
* assumed still.
|
|
206
|
+
*/
|
|
207
|
+
function designTimeSurfaceFacts(): readonly DesignTimeSurfaceFact[] {
|
|
208
|
+
const live = allDesignTimeSurfaces();
|
|
209
|
+
const seen = new Set<string>();
|
|
210
|
+
const facts = live.map((surface): DesignTimeSurfaceFact => {
|
|
211
|
+
const { id, label } = surface;
|
|
212
|
+
seen.add(id);
|
|
213
|
+
// Sampled BEFORE the clock and carried through every return, so the
|
|
214
|
+
// transport reading and the clock reading always describe the same window.
|
|
215
|
+
let transportNow: number | null = null;
|
|
216
|
+
try {
|
|
217
|
+
transportNow = surface.transportAdvances?.() ?? null;
|
|
218
|
+
} catch {
|
|
219
|
+
transportNow = null;
|
|
220
|
+
}
|
|
221
|
+
const transportPrevious = _lastTransportAdvances.get(id);
|
|
222
|
+
if (transportNow === null) _lastTransportAdvances.delete(id);
|
|
223
|
+
else _lastTransportAdvances.set(id, transportNow);
|
|
224
|
+
const transportAdvanced =
|
|
225
|
+
transportNow === null || transportPrevious === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { transportAdvanced: transportNow !== transportPrevious };
|
|
228
|
+
let reading: number | null;
|
|
229
|
+
try {
|
|
230
|
+
reading = surface.contentClock();
|
|
231
|
+
} catch (error) {
|
|
232
|
+
_lastContentClock.delete(id);
|
|
233
|
+
return {
|
|
234
|
+
id,
|
|
235
|
+
label,
|
|
236
|
+
advanced: null,
|
|
237
|
+
unavailable: `its content clock threw: ${String(error)}`,
|
|
238
|
+
...transportAdvanced,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (reading === null) {
|
|
242
|
+
_lastContentClock.delete(id);
|
|
243
|
+
return {
|
|
244
|
+
id,
|
|
245
|
+
label,
|
|
246
|
+
advanced: null,
|
|
247
|
+
unavailable: 'its content clock is temporarily unavailable',
|
|
248
|
+
...transportAdvanced,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const now = reading;
|
|
252
|
+
const previous = _lastContentClock.get(id);
|
|
253
|
+
_lastContentClock.set(id, now);
|
|
254
|
+
if (previous === undefined) {
|
|
255
|
+
return {
|
|
256
|
+
id,
|
|
257
|
+
label,
|
|
258
|
+
advanced: null,
|
|
259
|
+
unavailable: 'first reading — nothing to compare it against yet',
|
|
260
|
+
...transportAdvanced,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return { id, label, advanced: now !== previous, ...transportAdvanced };
|
|
264
|
+
});
|
|
265
|
+
for (const id of [..._lastContentClock.keys()]) if (!seen.has(id)) _lastContentClock.delete(id);
|
|
266
|
+
for (const id of [..._lastTransportAdvances.keys()]) {
|
|
267
|
+
if (!seen.has(id)) _lastTransportAdvances.delete(id);
|
|
268
|
+
}
|
|
269
|
+
return facts;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Assemble everything the checks read, from the live session. */
|
|
273
|
+
export function collectOntologyFacts(now: number = Date.now()): OntologyFacts {
|
|
274
|
+
const playing = editorIsPlaying();
|
|
275
|
+
const elapsed = _sample.since === 0 ? 0 : now - _sample.since;
|
|
276
|
+
const frames = _sample.frames;
|
|
277
|
+
const fps = elapsed > 0 && frames > 0 ? (frames * 1000) / elapsed : null;
|
|
278
|
+
const play = playing
|
|
279
|
+
? {
|
|
280
|
+
startedMsAgo: _playStartedAt === null ? 0 : now - _playStartedAt,
|
|
281
|
+
...playFrameFacts(),
|
|
282
|
+
}
|
|
283
|
+
: null;
|
|
284
|
+
return {
|
|
285
|
+
mode: playing ? 'play' : 'edit',
|
|
286
|
+
loops: [
|
|
287
|
+
...liveSessions().map((session) => ({
|
|
288
|
+
name: `${session.id} session`,
|
|
289
|
+
running: session.mounted(),
|
|
290
|
+
})),
|
|
291
|
+
...liveSessions().map((session) => ({
|
|
292
|
+
name: `${session.id} playing`,
|
|
293
|
+
running: session.playing(),
|
|
294
|
+
})),
|
|
295
|
+
],
|
|
296
|
+
designTimeSurfaces: designTimeSurfaceFacts(),
|
|
297
|
+
presentedThreeRoots: getAuthoringOverride()
|
|
298
|
+
? mountedRootSubjects()
|
|
299
|
+
.filter((root) => root.surface === 'three')
|
|
300
|
+
.map((root) => root.worldId)
|
|
301
|
+
: null,
|
|
302
|
+
...(() => {
|
|
303
|
+
const canvases = canvasFacts();
|
|
304
|
+
return {
|
|
305
|
+
canvasHiddenBy: presentingCanvasHiddenBy(canvases),
|
|
306
|
+
canvasHidesItself: anyCanvasHidesItself(canvases),
|
|
307
|
+
hiddenCanvases: hiddenCanvasBreakdown(canvases),
|
|
308
|
+
};
|
|
309
|
+
})(),
|
|
310
|
+
framesProduced: _sample.since === 0 ? null : frames,
|
|
311
|
+
sampleWindowMs: _sample.since === 0 ? null : elapsed,
|
|
312
|
+
tabVisible: !document.hidden,
|
|
313
|
+
directManipulationExpected: navigator.webdriver !== true,
|
|
314
|
+
fps,
|
|
315
|
+
fpsUnavailable:
|
|
316
|
+
fps === null
|
|
317
|
+
? _sample.since === 0
|
|
318
|
+
? 'the frame sampler has not opened a window yet'
|
|
319
|
+
: 'no frame was produced in the sample window'
|
|
320
|
+
: null,
|
|
321
|
+
play,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** The rows as the status facet serves them — always the full set, re-derived
|
|
326
|
+
* on read so a reader never gets a verdict older than the question. */
|
|
327
|
+
export function ontologyInvariantFacet(): readonly OntologyInvariantRow[] {
|
|
328
|
+
return deriveOntologyInvariants(collectOntologyFacts());
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** The rows from the last reporting pass — what the console has already said,
|
|
332
|
+
* for a caller that wants the reported set rather than a fresh derivation. */
|
|
333
|
+
export function lastReportedInvariants(): readonly OntologyInvariantRow[] {
|
|
334
|
+
return _lastRows;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** When the all-hidden-while-drawing condition was FIRST seen, or `null` while
|
|
338
|
+
* the session has a presenting canvas. The failsafe's bounded window is
|
|
339
|
+
* measured from here, so a mount that is hidden for a moment never trips it. */
|
|
340
|
+
let _allHiddenSince: number | null = null;
|
|
341
|
+
/** Canvases this page-load already force-revealed. A failsafe is an emergency,
|
|
342
|
+
* never a policy: once each, then it stops (see `canvas-reveal.ts`). */
|
|
343
|
+
const _forceRevealed = new WeakSet<HTMLCanvasElement>();
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Fire the reveal when nothing is presenting and frames are arriving anyway.
|
|
347
|
+
*
|
|
348
|
+
* The write is the narrowest one that can work: clear the ONE inline property
|
|
349
|
+
* on the canvas itself that the decision named. Everything else about how the
|
|
350
|
+
* canvas got hidden is left exactly as it was.
|
|
351
|
+
*/
|
|
352
|
+
function runRevealFailsafe(facts: readonly CanvasVisibilityFact[], now: number): void {
|
|
353
|
+
const presenting = presentingCanvasHiddenBy(facts);
|
|
354
|
+
if (presenting === null || presenting === undefined) {
|
|
355
|
+
_allHiddenSince = null;
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (_allHiddenSince === null) {
|
|
359
|
+
_allHiddenSince = now;
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const decision = decideRevealFailsafe({
|
|
363
|
+
canvases: facts,
|
|
364
|
+
framesProduced: _sample.frames,
|
|
365
|
+
hiddenForMs: now - _allHiddenSince,
|
|
366
|
+
});
|
|
367
|
+
if (!decision.fire) return;
|
|
368
|
+
const canvas = [...document.querySelectorAll('canvas')].find(
|
|
369
|
+
(element) =>
|
|
370
|
+
(element.getAttribute('data-testid') ?? element.className) === decision.target.label,
|
|
371
|
+
);
|
|
372
|
+
if (!canvas || _forceRevealed.has(canvas)) return;
|
|
373
|
+
_forceRevealed.add(canvas);
|
|
374
|
+
if (decision.target.inlineHiding === 'display') canvas.style.removeProperty('display');
|
|
375
|
+
if (decision.target.inlineHiding === 'visibility') canvas.style.removeProperty('visibility');
|
|
376
|
+
if (decision.target.inlineHiding === 'opacity') canvas.style.removeProperty('opacity');
|
|
377
|
+
editorConsole.error(decision.ledger, 'invariant');
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Derive once and say every violation out loud.
|
|
382
|
+
*
|
|
383
|
+
* `editorConsole` collapses consecutive identical messages onto one entry and
|
|
384
|
+
* the server ledger SUMS the repeats, so a condition that keeps holding stays
|
|
385
|
+
* one loud, counted row rather than a flood — which is exactly why this can be
|
|
386
|
+
* a plain periodic check with no dedupe of its own.
|
|
387
|
+
*/
|
|
388
|
+
export function reportOntologyInvariants(): readonly OntologyInvariantRow[] {
|
|
389
|
+
const rows = ontologyInvariantFacet();
|
|
390
|
+
_lastRows = rows;
|
|
391
|
+
for (const row of rows) {
|
|
392
|
+
const warning = formatInvariantWarning(row);
|
|
393
|
+
if (!warning) {
|
|
394
|
+
_pendingInvariantViolations.delete(row.id);
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
// A build, source remount, or Doctor capture can legitimately occupy two
|
|
398
|
+
// five-second main-thread windows while the visible editor is otherwise
|
|
399
|
+
// responsive. The FPS floor describes a stopped direct-manipulation tool,
|
|
400
|
+
// so require the condition to survive a third consecutive sample before
|
|
401
|
+
// filing a permanent ledger warning. The status facet remains immediate;
|
|
402
|
+
// only the irreversible console filing is stabilized.
|
|
403
|
+
if (row.id === 'visible-tab-fps-floor') {
|
|
404
|
+
const samples = (_pendingInvariantViolations.get(row.id) ?? 0) + 1;
|
|
405
|
+
_pendingInvariantViolations.set(row.id, samples);
|
|
406
|
+
if (samples < 3) continue;
|
|
407
|
+
}
|
|
408
|
+
editorConsole.warn(warning, 'invariant');
|
|
409
|
+
}
|
|
410
|
+
return rows;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Start watching. Idempotent, and it runs on EVERY realm.
|
|
415
|
+
*
|
|
416
|
+
* This used to bail on a host with no server ledger "to be loud into". That
|
|
417
|
+
* names a mechanism this watcher does not use. Nothing on this timer talks to
|
|
418
|
+
* a server:
|
|
419
|
+
*
|
|
420
|
+
* - {@link runRevealFailsafe} is a REPAIR, not a report — it clears the one
|
|
421
|
+
* inline property hiding a canvas. Gating it meant a blank hosted viewport
|
|
422
|
+
* was the one viewport that could never self-heal, which is precisely the
|
|
423
|
+
* realm where no `vgai` command can be run to diagnose it.
|
|
424
|
+
* - {@link reportOntologyInvariants} and every {@link onSessionSample}
|
|
425
|
+
* subscriber derive from in-memory registries and speak through
|
|
426
|
+
* `editorConsole`, an in-page store read by `useSyncExternalStore`. It
|
|
427
|
+
* renders in the editor's own Console on every realm, hosted included.
|
|
428
|
+
*
|
|
429
|
+
* The half that genuinely needs a Node host is the server-ledger PUSH, and it
|
|
430
|
+
* is gated where it lives (`console-sync.ts`'s `installConsoleSync`). One
|
|
431
|
+
* mechanism, one gate — not a second, wider gate on the watcher that merely
|
|
432
|
+
* shares a sentence with it.
|
|
433
|
+
*
|
|
434
|
+
* Returns the teardown so a test or a shutdown path can end it; the editor
|
|
435
|
+
* itself never stops watching, because a vitals check that can be turned off is
|
|
436
|
+
* a vitals check that will be off when it matters.
|
|
437
|
+
*/
|
|
438
|
+
export function installSessionVitals(): () => void {
|
|
439
|
+
if (_timer !== null) return stopSessionVitals;
|
|
440
|
+
_sample = { frames: 0, since: Date.now() };
|
|
441
|
+
const tick = (): void => {
|
|
442
|
+
_sample.frames++;
|
|
443
|
+
_rafHandle = requestAnimationFrame(tick);
|
|
444
|
+
};
|
|
445
|
+
_rafHandle = requestAnimationFrame(tick);
|
|
446
|
+
_timer = setInterval(() => {
|
|
447
|
+
const playing = editorIsPlaying();
|
|
448
|
+
if (playing && _playStartedAt === null) _playStartedAt = Date.now();
|
|
449
|
+
if (!playing) _playStartedAt = null;
|
|
450
|
+
// EVERY periodic derivation about this session runs on THIS pass, the
|
|
451
|
+
// host's and a lane's alike. The capability-coverage union used to be a
|
|
452
|
+
// direct call here; it is `@vgai/game`'s now and subscribes through
|
|
453
|
+
// {@link onSessionSample}, which is why the door exists at all: one
|
|
454
|
+
// session, one cadence, one instant — a package timer beside this one
|
|
455
|
+
// would sample the same session a fraction of a second later and publish
|
|
456
|
+
// a second answer for one moment.
|
|
457
|
+
fireSessionSample();
|
|
458
|
+
// FIRE before reporting: the failsafe's whole point is that the row it
|
|
459
|
+
// would otherwise print describes a blank viewport the editor could have
|
|
460
|
+
// fixed. It runs on the same sample the row is derived from, so a fired
|
|
461
|
+
// reveal shows up as `ok` in the very next pass and as a loud ledger error
|
|
462
|
+
// in this one.
|
|
463
|
+
runRevealFailsafe(canvasFacts(), Date.now());
|
|
464
|
+
reportOntologyInvariants();
|
|
465
|
+
_sample = { frames: 0, since: Date.now() };
|
|
466
|
+
}, SAMPLE_INTERVAL_MS);
|
|
467
|
+
return stopSessionVitals;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Drop everything the vitals accumulated FOR THE PROJECT THAT JUST CLOSED,
|
|
472
|
+
* without stopping the watcher (the editor never stops watching — see
|
|
473
|
+
* {@link installSessionVitals}). Registered with `onProjectSessionEnd`.
|
|
474
|
+
*
|
|
475
|
+
* Every one of these is a claim about a specific project's session: the last
|
|
476
|
+
* invariant rows, the consecutive-violation counters that decide when a row is
|
|
477
|
+
* reported, the per-surface content-clock readings that decide whether a
|
|
478
|
+
* surface MOVED, and the play start time. Carried into the next project they
|
|
479
|
+
* become measurements attributed to a session that never made them — a
|
|
480
|
+
* violation counter two samples deep would fire on the new project's first
|
|
481
|
+
* sample.
|
|
482
|
+
*/
|
|
483
|
+
export function resetSessionVitalsForNewProject(): void {
|
|
484
|
+
_sample = { frames: 0, since: _timer === null ? 0 : Date.now() };
|
|
485
|
+
_playStartedAt = null;
|
|
486
|
+
_allHiddenSince = null;
|
|
487
|
+
_lastRows = [];
|
|
488
|
+
_pendingInvariantViolations.clear();
|
|
489
|
+
_lastContentClock.clear();
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
export function stopSessionVitals(): void {
|
|
493
|
+
if (_rafHandle !== null) cancelAnimationFrame(_rafHandle);
|
|
494
|
+
if (_timer !== null) clearInterval(_timer);
|
|
495
|
+
_rafHandle = null;
|
|
496
|
+
_timer = null;
|
|
497
|
+
_sample = { frames: 0, since: 0 };
|
|
498
|
+
_playStartedAt = null;
|
|
499
|
+
_allHiddenSince = null;
|
|
500
|
+
_pendingInvariantViolations.clear();
|
|
501
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Structural/operational evidence for one mounted SystemAdapters slot. */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
displayKeyedPhysics,
|
|
5
|
+
gradeSeamCarrier,
|
|
6
|
+
inspectSeamShape,
|
|
7
|
+
PHYSICS_2D_ADAPTER_SHAPE,
|
|
8
|
+
PHYSICS_ADAPTER_SHAPE,
|
|
9
|
+
type SeamEvidenceReceipt,
|
|
10
|
+
type SeamEvidenceVerdict,
|
|
11
|
+
type SeamShape,
|
|
12
|
+
SYSTEM_ADAPTERS_SHAPE,
|
|
13
|
+
SYSTEM_PROVIDER_SHAPES,
|
|
14
|
+
type SystemAdapters,
|
|
15
|
+
} from '@volter/editor-project/adapter';
|
|
16
|
+
import { liveSeamEvidence } from './live-seam-evidence';
|
|
17
|
+
|
|
18
|
+
const EPOCHS = new WeakMap<object, string>();
|
|
19
|
+
let nextEpoch = 1;
|
|
20
|
+
|
|
21
|
+
export function systemAdapterEpoch(value: object): string {
|
|
22
|
+
const found = EPOCHS.get(value);
|
|
23
|
+
if (found) return found;
|
|
24
|
+
const epoch = `system-${nextEpoch++}`;
|
|
25
|
+
EPOCHS.set(value, epoch);
|
|
26
|
+
return epoch;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function inspectSystemAdapterSeam<K extends keyof SystemAdapters>(options: {
|
|
30
|
+
readonly slot: K;
|
|
31
|
+
readonly adapter: NonNullable<SystemAdapters[K]>;
|
|
32
|
+
readonly subject: string;
|
|
33
|
+
readonly epoch?: string | undefined;
|
|
34
|
+
readonly receipts?: readonly SeamEvidenceReceipt[] | undefined;
|
|
35
|
+
}): SeamEvidenceVerdict {
|
|
36
|
+
const epoch = options.epoch ?? systemAdapterEpoch(options.adapter as object);
|
|
37
|
+
const seam = `system.${options.slot}`;
|
|
38
|
+
const bag = { [options.slot]: options.adapter } as Partial<SystemAdapters>;
|
|
39
|
+
const nestedShape =
|
|
40
|
+
options.slot === 'physics'
|
|
41
|
+
? displayKeyedPhysics(options.adapter as SystemAdapters['physics'])
|
|
42
|
+
? PHYSICS_2D_ADAPTER_SHAPE
|
|
43
|
+
: PHYSICS_ADAPTER_SHAPE
|
|
44
|
+
: SYSTEM_PROVIDER_SHAPES[options.slot as Exclude<keyof SystemAdapters, 'physics'>];
|
|
45
|
+
const receipts: SeamEvidenceReceipt[] = [
|
|
46
|
+
...inspectSeamShape<SystemAdapters>({
|
|
47
|
+
prefix: 'system',
|
|
48
|
+
value: bag,
|
|
49
|
+
shape: SYSTEM_ADAPTERS_SHAPE,
|
|
50
|
+
subject: options.subject,
|
|
51
|
+
epoch,
|
|
52
|
+
}).filter((receipt) => receipt.seam === seam),
|
|
53
|
+
...inspectSeamShape({
|
|
54
|
+
prefix: seam,
|
|
55
|
+
value: options.adapter,
|
|
56
|
+
shape: nestedShape as SeamShape<object>,
|
|
57
|
+
subject: options.subject,
|
|
58
|
+
epoch,
|
|
59
|
+
}),
|
|
60
|
+
...liveSeamEvidence.receipts({ subject: options.subject, epoch }),
|
|
61
|
+
...(options.receipts ?? []),
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
return gradeSeamCarrier({
|
|
65
|
+
seam,
|
|
66
|
+
subject: options.subject,
|
|
67
|
+
epoch,
|
|
68
|
+
required: SYSTEM_ADAPTERS_SHAPE[options.slot].required,
|
|
69
|
+
receipts,
|
|
70
|
+
shape: nestedShape as SeamShape<object>,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE crash-to-null React error boundary: a render/lifecycle throw below
|
|
3
|
+
* it reports through `onCaught` and unmounts the subtree (renders null) so a
|
|
4
|
+
* misbehaving child fails loudly WITHOUT throwing out of `root.render()` or
|
|
5
|
+
* taking its siblings down. Class-based by necessity — React has no hook
|
|
6
|
+
* equivalent for `getDerivedStateFromError`.
|
|
7
|
+
*
|
|
8
|
+
* Four copies of this exact component existed (ingest siblings, design-time
|
|
9
|
+
* layers, both story preview mounts) before this home; a fifth copy is the
|
|
10
|
+
* defect, not a convenience. Rung note: `react-error-boundary` ships this
|
|
11
|
+
* shape — adopting it is the right move the next time the editor's
|
|
12
|
+
* dependency set is being changed anyway; twelve lines did not justify a
|
|
13
|
+
* lockfile change on their own.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { Component, type ReactNode } from 'react';
|
|
17
|
+
|
|
18
|
+
export class CrashNullBoundary extends Component<
|
|
19
|
+
{
|
|
20
|
+
onCaught: (error: unknown) => void;
|
|
21
|
+
/** Optional because `createElement` callers pass children VARIADICALLY. */
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
},
|
|
24
|
+
{ crashed: boolean }
|
|
25
|
+
> {
|
|
26
|
+
override state = { crashed: false };
|
|
27
|
+
static getDerivedStateFromError(): { crashed: boolean } {
|
|
28
|
+
return { crashed: true };
|
|
29
|
+
}
|
|
30
|
+
override componentDidCatch(error: unknown): void {
|
|
31
|
+
this.props.onCaught(error);
|
|
32
|
+
}
|
|
33
|
+
override render(): ReactNode {
|
|
34
|
+
return this.state.crashed ? null : this.props.children;
|
|
35
|
+
}
|
|
36
|
+
}
|