@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,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE ONTOLOGY'S LIVE INVARIANTS, checked against the running session.
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE-CORE §Rules: "an invariant about what a running session shows or
|
|
5
|
+
* does (Edit is static; a scene has one root; the viewport canvas is revealed; a
|
|
6
|
+
* visible tab renders) is enforced by a STANDING SESSION WARNING through the
|
|
7
|
+
* console-loudness pipeline — loud on every vgai command until the condition is
|
|
8
|
+
* dead — never by prose alone." This module is the derivation half of that rule:
|
|
9
|
+
* facts in, rows out, no globals and no I/O, so every transition is testable
|
|
10
|
+
* with no browser.
|
|
11
|
+
*
|
|
12
|
+
* ## Three statuses, and why `unmeasured` is one of them
|
|
13
|
+
*
|
|
14
|
+
* A verdict is a measurement. Where the editor genuinely cannot see a fact
|
|
15
|
+
* today, the row says `unmeasured` AND NAMES WHAT IS MISSING — it never
|
|
16
|
+
* disappears and it never reports `ok`. That is the same rule the coverage rows
|
|
17
|
+
* follow, and it is what keeps this from becoming a list that looks green
|
|
18
|
+
* because half of it is blind. A row that goes quiet is how "ingested games
|
|
19
|
+
* autoplay in Edit" sat recorded for months while every instrument read green.
|
|
20
|
+
*
|
|
21
|
+
* ## The vocabulary is pinned, like the coverage vocabulary
|
|
22
|
+
*
|
|
23
|
+
* {@link ONTOLOGY_INVARIANTS} is derived from a `Record` over
|
|
24
|
+
* {@link OntologyInvariantId}, so an invariant added to the union without a
|
|
25
|
+
* check does not compile. There is no way to have an id nothing checks, and no
|
|
26
|
+
* way to check something the report does not list.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** The live invariants this session knows how to ask about. */
|
|
30
|
+
export type OntologyInvariantId =
|
|
31
|
+
| 'edit-mode-static'
|
|
32
|
+
| 'single-root-scene'
|
|
33
|
+
| 'canvas-revealed'
|
|
34
|
+
| 'visible-tab-fps-floor'
|
|
35
|
+
| 'play-drew-a-frame';
|
|
36
|
+
|
|
37
|
+
export interface OntologyInvariantRow {
|
|
38
|
+
readonly id: OntologyInvariantId;
|
|
39
|
+
readonly status: 'ok' | 'violation' | 'unmeasured';
|
|
40
|
+
/** What was measured, in the measurement's own terms. Always present. */
|
|
41
|
+
readonly detail: string;
|
|
42
|
+
/**
|
|
43
|
+
* The condition in STABLE words — no measured numbers, no timestamps.
|
|
44
|
+
*
|
|
45
|
+
* `detail` carries the measurement and therefore CHANGES every sample
|
|
46
|
+
* ("113.4fps", "119.8fps"), and the console ledger keys an entry on its
|
|
47
|
+
* message: a warning built from `detail` mints a brand-new unresolved
|
|
48
|
+
* condition every tick and buries the banner it was meant to serve (measured:
|
|
49
|
+
* five distinct entries for one violation in twenty seconds). So the warning
|
|
50
|
+
* is built from THIS, which is identical for as long as the condition holds —
|
|
51
|
+
* repeats then sum into one counted row, which is the whole contract of the
|
|
52
|
+
* ledger. The live number stays in `detail`, where `vgai status` re-derives it
|
|
53
|
+
* on every read. Present only on a violation.
|
|
54
|
+
*/
|
|
55
|
+
readonly cause?: string;
|
|
56
|
+
/** What the violation costs the user. Present only on a violation. */
|
|
57
|
+
readonly missing?: string;
|
|
58
|
+
/** The named mechanism that closes it, or — on `unmeasured` — the fact that
|
|
59
|
+
* is missing and where it would come from. */
|
|
60
|
+
readonly fix?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** One game loop the editor can enumerate, and whether it is advancing. */
|
|
64
|
+
export interface LoopFact {
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly running: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* One DESIGN-TIME SURFACE and whether its CONTENT time moved.
|
|
71
|
+
*
|
|
72
|
+
* Edit-static is not a fact about the Scene view. Every surface riding the
|
|
73
|
+
* shared `Object3DDocumentViewport`/`EditorViewport` stack — Asset Lab
|
|
74
|
+
* documents, story turntables, 3D board exhibits, preview cards — is a place
|
|
75
|
+
* content time can advance while the editor is in Edit, and one of them was
|
|
76
|
+
* measured doing it (a GLB train animating in the Asset Lab). So the check
|
|
77
|
+
* enumerates surfaces.
|
|
78
|
+
*
|
|
79
|
+
* CONTENT vs PRESENTATION is the whole distinction: a camera orbit, a turntable
|
|
80
|
+
* and the editor's dressing are presentation and are legitimate; an animation
|
|
81
|
+
* mixer, a `useFrame` clock or a simulation step is content and is not. Only the
|
|
82
|
+
* surface can tell them apart, so it publishes its own content clock — and a
|
|
83
|
+
* surface that publishes none reports `advanced: null` with the reason, which
|
|
84
|
+
* the row renders as UNMEASURED naming that surface. Never silently Scene-only.
|
|
85
|
+
*
|
|
86
|
+
* AN ENGAGED TRANSPORT IS THE SANCTIONED ADVANCE (orchestrator ruling,
|
|
87
|
+
* 2026-08-30). "Edit is static" was always about content running with NOTHING
|
|
88
|
+
* HAVING PRESSED ▶ — the sentence the row's own origin note uses. A document's
|
|
89
|
+
* animation/simulation transport is that press, so the invariant fires only
|
|
90
|
+
* when content time advances with NO transport engaged. The code missed this
|
|
91
|
+
* and stood violated for every frame of a rigged module document's playback:
|
|
92
|
+
* the ▶ a human pressed reddened every `vgai` verb. The surface therefore
|
|
93
|
+
* publishes `transportAdvances` beside its clock, and the row reads BOTH.
|
|
94
|
+
* The negative case is untouched: an ingested game whose ticker runs with no
|
|
95
|
+
* transport still violates, because it publishes no transport advance to point
|
|
96
|
+
* at (`ingest/ingest-play-control.ts` holds it in Edit for exactly that reason).
|
|
97
|
+
*/
|
|
98
|
+
export interface DesignTimeSurfaceFact {
|
|
99
|
+
readonly id: string;
|
|
100
|
+
readonly label: string;
|
|
101
|
+
/** `true`/`false` when the surface's content clock could be compared across a
|
|
102
|
+
* sample window; `null` when it publishes none. */
|
|
103
|
+
readonly advanced: boolean | null;
|
|
104
|
+
/** Why nothing could be compared, when `advanced` is `null`. */
|
|
105
|
+
readonly unavailable?: string;
|
|
106
|
+
/**
|
|
107
|
+
* Whether an ENGAGED transport advanced this surface over the SAME window
|
|
108
|
+
* `advanced` speaks for — the sanction. `false` when the surface publishes a
|
|
109
|
+
* transport counter that did not move; absent when it publishes none at all
|
|
110
|
+
* (a surface with no ▶ to press), which is the same verdict for this row:
|
|
111
|
+
* unsanctioned. See `design-time-surfaces.ts` §THE TRANSPORT IS THE SANCTION.
|
|
112
|
+
*/
|
|
113
|
+
readonly transportAdvanced?: boolean;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Everything the checks read. Assembled by the caller from the live session
|
|
118
|
+
* (`session-vitals.ts`), so this module imports no session state.
|
|
119
|
+
*
|
|
120
|
+
* A `null` field means the caller could not measure it — never "it is fine".
|
|
121
|
+
*/
|
|
122
|
+
export interface OntologyFacts {
|
|
123
|
+
/** What the editor believes it is doing right now. */
|
|
124
|
+
readonly mode: 'edit' | 'play';
|
|
125
|
+
/**
|
|
126
|
+
* Every game loop the editor can enumerate, with whether it is advancing.
|
|
127
|
+
* The row NAMES the loops it checked, so a reader can see the scope of the
|
|
128
|
+
* claim rather than take "static" on faith.
|
|
129
|
+
*/
|
|
130
|
+
readonly loops: readonly LoopFact[] | null;
|
|
131
|
+
/** Every live design-time surface, with whether its CONTENT time moved. `null`
|
|
132
|
+
* ⇒ nothing enumerated the surfaces at all. */
|
|
133
|
+
readonly designTimeSurfaces: readonly DesignTimeSurfaceFact[] | null;
|
|
134
|
+
/** The world ids of the `three`-surface roots this session presents at once. */
|
|
135
|
+
readonly presentedThreeRoots: readonly string[] | null;
|
|
136
|
+
/**
|
|
137
|
+
* Why NO canvas in this session is presenting, in the measurement's own
|
|
138
|
+
* words (`display: none`, a zero-size box), or `null` when at least one IS
|
|
139
|
+
* revealed. `undefined` means no canvas was found to measure.
|
|
140
|
+
*
|
|
141
|
+
* "At least one" is the whole rule, and it is what stopped this row from
|
|
142
|
+
* standing on healthy sessions: the derivation used to speak for a single
|
|
143
|
+
* area-ranked canvas that could easily be one somebody hid on purpose while
|
|
144
|
+
* the game rendered beside it. See `canvas-reveal.ts`.
|
|
145
|
+
*/
|
|
146
|
+
readonly canvasHiddenBy: string | null | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* Whether any hidden canvas is hidden by its OWN box or inline style, rather
|
|
149
|
+
* than by an ancestor (the editor showing a different document) or a
|
|
150
|
+
* stylesheet. `null` when nothing is hidden.
|
|
151
|
+
*
|
|
152
|
+
* This is what separates the defect from the ordinary case: with the
|
|
153
|
+
* workspace on a non-canvas document every canvas is hidden and the user is
|
|
154
|
+
* looking at exactly what they opened. See `canvas-reveal.ts`.
|
|
155
|
+
*/
|
|
156
|
+
readonly canvasHidesItself: boolean | null;
|
|
157
|
+
/** One line per hidden canvas — which, why, whose doing. Empty when none is
|
|
158
|
+
* hidden; `null` when nothing enumerated them. */
|
|
159
|
+
readonly hiddenCanvases: readonly string[] | null;
|
|
160
|
+
/** Frames the page produced in the sample window. */
|
|
161
|
+
readonly framesProduced: number | null;
|
|
162
|
+
readonly sampleWindowMs: number | null;
|
|
163
|
+
readonly tabVisible: boolean;
|
|
164
|
+
/** Whether a person can currently be waiting on direct manipulation. Browser
|
|
165
|
+
* automation renders for evidence, but its software-rendered frame cadence
|
|
166
|
+
* is not human interaction latency. Omitted defaults to true for callers
|
|
167
|
+
* constructing facts outside the live collector. */
|
|
168
|
+
readonly directManipulationExpected?: boolean;
|
|
169
|
+
/** Frames per second over the sample window, or `null` with a reason. */
|
|
170
|
+
readonly fps: number | null;
|
|
171
|
+
readonly fpsUnavailable: string | null;
|
|
172
|
+
/** The live play session, or `null` when nothing is playing. */
|
|
173
|
+
readonly play: {
|
|
174
|
+
readonly startedMsAgo: number;
|
|
175
|
+
readonly framesDrawn: number | null;
|
|
176
|
+
readonly framesUnavailable: string | null;
|
|
177
|
+
} | null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The floor a VISIBLE tab must render above. Not a performance target — a
|
|
182
|
+
* liveness one: below this the editor is not a direct-manipulation tool any
|
|
183
|
+
* more, which is the state the owner has profiled by hand more than once
|
|
184
|
+
* (~1.6fps on a saturated main thread).
|
|
185
|
+
*/
|
|
186
|
+
export const VISIBLE_TAB_FPS_FLOOR = 10;
|
|
187
|
+
|
|
188
|
+
/** How long play may run without drawing before it is a violation rather than a
|
|
189
|
+
* slow start. Generous: a cold R3F world with assets to fetch is legitimately
|
|
190
|
+
* slow, and a false positive here trains readers to ignore the banner. */
|
|
191
|
+
export const PLAY_FIRST_FRAME_DEADLINE_MS = 5_000;
|
|
192
|
+
|
|
193
|
+
type Check = (facts: OntologyFacts) => Omit<OntologyInvariantRow, 'id'>;
|
|
194
|
+
|
|
195
|
+
function editModeStatic(facts: OntologyFacts): Omit<OntologyInvariantRow, 'id'> {
|
|
196
|
+
if (facts.mode !== 'edit') {
|
|
197
|
+
return {
|
|
198
|
+
status: 'ok',
|
|
199
|
+
detail: 'not in Edit mode — the invariant does not apply while playing',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (facts.loops === null) {
|
|
203
|
+
return {
|
|
204
|
+
status: 'unmeasured',
|
|
205
|
+
detail: 'nothing enumerated this session’s game loops',
|
|
206
|
+
fix: 'the session vitals collector must report a loop fact per live runtime (play, ingest, module)',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const surfaces = facts.designTimeSurfaces;
|
|
210
|
+
// AN ENGAGED TRANSPORT IS THE SANCTIONED ADVANCE (orchestrator ruling,
|
|
211
|
+
// 2026-08-30). The row's own origin note is "nothing having pressed ▶": a
|
|
212
|
+
// document's animation/simulation transport IS that press, so a surface
|
|
213
|
+
// whose transport counter moved over the same window is doing exactly what
|
|
214
|
+
// the transport exists to do. The code did not know that and fired on every
|
|
215
|
+
// frame of a rigged module document's playback, which reddened every `vgai`
|
|
216
|
+
// verb while a human watched the clip they had asked for. The violation is
|
|
217
|
+
// content time advancing with NO transport engaged — and a surface that
|
|
218
|
+
// publishes no transport counter (a preview card, a turntable) has no ▶ to
|
|
219
|
+
// press, so any advance of its clock is still a violation.
|
|
220
|
+
const advancing = [
|
|
221
|
+
...facts.loops.filter((loop) => loop.running).map((loop) => loop.name),
|
|
222
|
+
...(surfaces ?? [])
|
|
223
|
+
.filter((surface) => surface.advanced === true && surface.transportAdvanced !== true)
|
|
224
|
+
.map((surface) => `${surface.label} (design-time surface)`),
|
|
225
|
+
];
|
|
226
|
+
const transported = (surfaces ?? []).filter(
|
|
227
|
+
(surface) => surface.advanced === true && surface.transportAdvanced === true,
|
|
228
|
+
);
|
|
229
|
+
if (advancing.length > 0) {
|
|
230
|
+
return {
|
|
231
|
+
status: 'violation',
|
|
232
|
+
detail: `Edit mode, but content time is advancing in ${advancing.length} place(s): ${advancing.join(', ')}`,
|
|
233
|
+
cause: `content time is advancing while the editor is in Edit: ${[...advancing].sort().join(', ')}`,
|
|
234
|
+
missing:
|
|
235
|
+
'authoring is happening on top of moving content: the thing under the gizmo moves while ' +
|
|
236
|
+
'you edit it, a pose you are reading is a frame of an animation rather than what the ' +
|
|
237
|
+
'source says, and every other instrument reports a still editor',
|
|
238
|
+
fix:
|
|
239
|
+
'one time policy at the shared viewport stack — presentation (orbit, turntable, dressing) ' +
|
|
240
|
+
'keeps running while CONTENT time (mixers, useFrame, simulation) is held at design time',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// No violation. Say honestly how much of the session that claim covers: a
|
|
244
|
+
// surface with no published content clock is UNMEASURED and named, never
|
|
245
|
+
// folded into a green "Edit is static".
|
|
246
|
+
const blind = (surfaces ?? []).filter((surface) => surface.advanced === null);
|
|
247
|
+
const loopNames = facts.loops.map((loop) => loop.name).join(', ');
|
|
248
|
+
if (surfaces === null) {
|
|
249
|
+
return {
|
|
250
|
+
status: 'unmeasured',
|
|
251
|
+
detail: `${facts.loops.length} enumerated loop(s) stopped (${loopNames}), but nothing enumerated this session's design-time surfaces`,
|
|
252
|
+
fix: 'the session vitals collector must enumerate the Object3DDocumentViewport stack’s live sessions',
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (blind.length > 0) {
|
|
256
|
+
return {
|
|
257
|
+
status: 'unmeasured',
|
|
258
|
+
detail:
|
|
259
|
+
`${facts.loops.length} enumerated loop(s) stopped (${loopNames}), and ${
|
|
260
|
+
surfaces.length - blind.length
|
|
261
|
+
} design-time surface(s) still — but ${blind.length} publish no content clock: ` +
|
|
262
|
+
blind
|
|
263
|
+
.map((surface) => `${surface.label} (${surface.unavailable ?? 'no reason given'})`)
|
|
264
|
+
.join(', '),
|
|
265
|
+
fix: 'each design-time surface host must publish its own content clock (`Object3DDocumentSession.contentClock`) so this row can speak for it',
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// Say WHICH surfaces are running under a transport rather than reporting a
|
|
269
|
+
// flat "all still": the claim this row makes is about unpressed content, and
|
|
270
|
+
// a reader must be able to see that a document IS playing on purpose.
|
|
271
|
+
const playing =
|
|
272
|
+
transported.length === 0
|
|
273
|
+
? ''
|
|
274
|
+
: `; ${transported.length} advancing under an engaged transport (${transported
|
|
275
|
+
.map((surface) => surface.label)
|
|
276
|
+
.join(', ')})`;
|
|
277
|
+
return {
|
|
278
|
+
status: 'ok',
|
|
279
|
+
detail: `Edit is static — ${facts.loops.length} enumerated loop(s) stopped (${loopNames}), and ${surfaces.length} design-time surface(s) hold their content time${playing}`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function singleRootScene(facts: OntologyFacts): Omit<OntologyInvariantRow, 'id'> {
|
|
284
|
+
if (facts.presentedThreeRoots === null) {
|
|
285
|
+
return {
|
|
286
|
+
status: 'unmeasured',
|
|
287
|
+
detail: 'nothing enumerated which three roots this session presents',
|
|
288
|
+
fix: 'the session vitals collector must read the mounted roots off the active authoring surface',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (facts.presentedThreeRoots.length <= 1) {
|
|
292
|
+
return {
|
|
293
|
+
status: 'ok',
|
|
294
|
+
detail: `the scene presents ${facts.presentedThreeRoots.length} three root(s)`,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
status: 'violation',
|
|
299
|
+
detail: `the scene presents ${facts.presentedThreeRoots.length} three roots at once: ${facts.presentedThreeRoots.join(', ')}`,
|
|
300
|
+
cause: `the scene presents more than one three root: ${[...facts.presentedThreeRoots].sort().join(', ')}`,
|
|
301
|
+
missing:
|
|
302
|
+
'a scene has ONE root by the authoring ontology — scenes swap inside it. Two presented at ' +
|
|
303
|
+
'once means selection, framing and the gizmo are working over a tree no single document owns',
|
|
304
|
+
fix: 'declare one three root and swap SCENES inside it (ARCHITECTURE-CORE §Roots); a second world belongs behind its own document',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function canvasRevealed(facts: OntologyFacts): Omit<OntologyInvariantRow, 'id'> {
|
|
309
|
+
if (facts.canvasHiddenBy === undefined) {
|
|
310
|
+
return {
|
|
311
|
+
status: 'unmeasured',
|
|
312
|
+
detail: 'no canvas was found to measure',
|
|
313
|
+
fix: 'the session vitals collector must enumerate this session’s canvases before this can be checked',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
if (facts.framesProduced === null) {
|
|
317
|
+
return {
|
|
318
|
+
status: 'unmeasured',
|
|
319
|
+
detail: 'nothing sampled whether frames are being produced',
|
|
320
|
+
fix: 'the session vitals collector must run its frame sampler before this can be checked',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (facts.canvasHiddenBy === null) {
|
|
324
|
+
return { status: 'ok', detail: 'this session presents a revealed canvas' };
|
|
325
|
+
}
|
|
326
|
+
if (facts.framesProduced === 0) {
|
|
327
|
+
return {
|
|
328
|
+
status: 'ok',
|
|
329
|
+
detail: `every canvas is hidden (largest: ${facts.canvasHiddenBy}) and nothing is drawing — not the failsafe's case`,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
if (facts.canvasHidesItself === false) {
|
|
333
|
+
return {
|
|
334
|
+
status: 'ok',
|
|
335
|
+
detail:
|
|
336
|
+
`every canvas is hidden but none is hiding ITSELF — the workspace is showing a ` +
|
|
337
|
+
`non-canvas document, which is what the user opened: ${(facts.hiddenCanvases ?? []).join('; ')}`,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
status: 'violation',
|
|
342
|
+
detail:
|
|
343
|
+
`${facts.framesProduced} frame(s) produced in ${facts.sampleWindowMs ?? 0}ms while every ` +
|
|
344
|
+
`canvas is hidden and one hides ITSELF: ${(facts.hiddenCanvases ?? []).join('; ')}`,
|
|
345
|
+
cause: `frames are being produced while every canvas is hidden and one hides itself (${facts.canvasHiddenBy})`,
|
|
346
|
+
missing:
|
|
347
|
+
'the session is burning frames onto a surface nobody can see — the user is looking at an ' +
|
|
348
|
+
'empty viewport while every instrument reports a healthy, rendering session',
|
|
349
|
+
fix: 'reveal the canvas as soon as it produces frames — the bounded failsafe in `coverage/canvas-reveal.ts` does it for inline hiding on the canvas itself and says so loudly; hiding from an ancestor or a stylesheet is its owner’s to undo',
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function visibleTabFpsFloor(facts: OntologyFacts): Omit<OntologyInvariantRow, 'id'> {
|
|
354
|
+
if (facts.directManipulationExpected === false) {
|
|
355
|
+
return {
|
|
356
|
+
status: 'ok',
|
|
357
|
+
detail:
|
|
358
|
+
'browser automation is rendering evidence — no person is waiting on direct manipulation',
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
if (!facts.tabVisible) {
|
|
362
|
+
return { status: 'ok', detail: 'the tab is hidden — a hidden tab is not owed a frame rate' };
|
|
363
|
+
}
|
|
364
|
+
if (facts.fps === null) {
|
|
365
|
+
return {
|
|
366
|
+
status: 'unmeasured',
|
|
367
|
+
detail: facts.fpsUnavailable ?? 'no frame-rate sample exists',
|
|
368
|
+
fix: 'the session vitals collector must sample frame cadence while the tab is visible',
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
if (facts.fps >= VISIBLE_TAB_FPS_FLOOR) {
|
|
372
|
+
return { status: 'ok', detail: `visible tab rendering at ${facts.fps.toFixed(1)}fps` };
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
status: 'violation',
|
|
376
|
+
detail: `visible tab rendering at ${facts.fps.toFixed(1)}fps, below the ${VISIBLE_TAB_FPS_FLOOR}fps floor`,
|
|
377
|
+
cause: `the visible tab is rendering below the ${VISIBLE_TAB_FPS_FLOOR}fps floor`,
|
|
378
|
+
missing:
|
|
379
|
+
'the editor has stopped being a direct-manipulation tool: a drag, a click and a keystroke ' +
|
|
380
|
+
'all land seconds after the user made them',
|
|
381
|
+
fix: 'find the cost with the Profiler’s Overview (long-animation-frame attribution) — main-thread saturation and GPU/compositor cost are separate hunts',
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
function playDrewAFrame(facts: OntologyFacts): Omit<OntologyInvariantRow, 'id'> {
|
|
386
|
+
if (facts.play === null) {
|
|
387
|
+
return { status: 'ok', detail: 'nothing is playing — the invariant does not apply' };
|
|
388
|
+
}
|
|
389
|
+
// A HIDDEN TAB DRAWS NOTHING BY DESIGN (the engine's idle throttle hidden-
|
|
390
|
+
// pauses the loop the moment play starts), so "play drew no frame" is the
|
|
391
|
+
// expected, deliberate state there — not a defect. Firing here would put a
|
|
392
|
+
// permanent false warning on every backgrounded agent session, and a banner
|
|
393
|
+
// that cries wolf is a banner nobody reads.
|
|
394
|
+
if (!facts.tabVisible) {
|
|
395
|
+
return {
|
|
396
|
+
status: 'ok',
|
|
397
|
+
detail: 'the tab is hidden — the engine hidden-pauses the loop, so no frame is owed',
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
if (facts.play.framesDrawn === null) {
|
|
401
|
+
return {
|
|
402
|
+
status: 'unmeasured',
|
|
403
|
+
detail:
|
|
404
|
+
facts.play.framesUnavailable ??
|
|
405
|
+
'the play session reports no frame count, so nothing can say whether it drew',
|
|
406
|
+
fix: 'the play session’s render loop must expose a frame count (its profiler source carries one only while telemetry is enabled)',
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
if (facts.play.framesDrawn > 0) {
|
|
410
|
+
return { status: 'ok', detail: `play has drawn ${facts.play.framesDrawn} frame(s)` };
|
|
411
|
+
}
|
|
412
|
+
if (facts.play.startedMsAgo < PLAY_FIRST_FRAME_DEADLINE_MS) {
|
|
413
|
+
return {
|
|
414
|
+
status: 'ok',
|
|
415
|
+
detail: `play started ${facts.play.startedMsAgo}ms ago and has not drawn yet — inside the ${PLAY_FIRST_FRAME_DEADLINE_MS}ms deadline`,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
status: 'violation',
|
|
420
|
+
detail: `play started ${facts.play.startedMsAgo}ms ago and has drawn no frame (deadline ${PLAY_FIRST_FRAME_DEADLINE_MS}ms)`,
|
|
421
|
+
cause: `play started and no frame has drawn within the ${PLAY_FIRST_FRAME_DEADLINE_MS}ms deadline`,
|
|
422
|
+
missing:
|
|
423
|
+
'the user pressed ▶ and the game is not running: the viewport shows whatever was there ' +
|
|
424
|
+
'before, and every other instrument reports a live play session',
|
|
425
|
+
fix: 'find why the run loop never rendered — the console’s own errors from the play session are the first read',
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** The pin: an id with no check does not compile, and a check with no id cannot
|
|
430
|
+
* be added. */
|
|
431
|
+
const CHECKS: Readonly<Record<OntologyInvariantId, Check>> = {
|
|
432
|
+
'edit-mode-static': editModeStatic,
|
|
433
|
+
'single-root-scene': singleRootScene,
|
|
434
|
+
'canvas-revealed': canvasRevealed,
|
|
435
|
+
'visible-tab-fps-floor': visibleTabFpsFloor,
|
|
436
|
+
'play-drew-a-frame': playDrewAFrame,
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
/** Report order — fixed, so two reports of the same session are diffable. */
|
|
440
|
+
export const ONTOLOGY_INVARIANTS: readonly OntologyInvariantId[] = Object.keys(
|
|
441
|
+
CHECKS,
|
|
442
|
+
) as OntologyInvariantId[];
|
|
443
|
+
|
|
444
|
+
/** THE derivation. One row per invariant, always — including the ones this
|
|
445
|
+
* session cannot measure. */
|
|
446
|
+
export function deriveOntologyInvariants(facts: OntologyFacts): readonly OntologyInvariantRow[] {
|
|
447
|
+
return ONTOLOGY_INVARIANTS.map((id) => ({ id, ...CHECKS[id](facts) }));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* The warning text for one violated invariant, in the same shape the coverage
|
|
452
|
+
* blocks use — a headline naming the invariant, then what it costs and what
|
|
453
|
+
* closes it. `null` for anything that is not a violation: `ok` is silence and
|
|
454
|
+
* `unmeasured` is a status the status facet carries, not a warning (warning
|
|
455
|
+
* about a fact we chose not to collect would train readers to ignore the
|
|
456
|
+
* banner, and the row is already visible where it matters).
|
|
457
|
+
*/
|
|
458
|
+
export function formatInvariantWarning(row: OntologyInvariantRow): string | null {
|
|
459
|
+
if (row.status !== 'violation') return null;
|
|
460
|
+
// `cause`, never `detail` — see `OntologyInvariantRow.cause` for why a
|
|
461
|
+
// warning built from a live measurement destroys the ledger it feeds.
|
|
462
|
+
const lines = [`invariant "${row.id}" VIOLATED — ${row.cause ?? row.id}`];
|
|
463
|
+
if (row.missing) lines.push(` cost: ${row.missing}`);
|
|
464
|
+
if (row.fix) lines.push(` fix: ${row.fix}`);
|
|
465
|
+
return lines.join('\n');
|
|
466
|
+
}
|