@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,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TAB RESOURCE CENSUS, page side — what this tab is holding, sampled
|
|
3
|
+
* cheaply and handed to the heartbeat worker to ride out on the next beat.
|
|
4
|
+
*
|
|
5
|
+
* WHY (measured 2026-08-10): a game tab's Chrome renderer process was killed
|
|
6
|
+
* repeatedly — WS close code 1006, no goodbye — deterministically on one user
|
|
7
|
+
* flow, with a 3840x2080 WebGL world and an HDR bloom chain resident and
|
|
8
|
+
* painting. JS heap stayed flat at ~190 MB the whole time, so the kill was
|
|
9
|
+
* GPU/compositor-side, at a per-process ceiling Chrome neither documents nor
|
|
10
|
+
* announces. The tab-presence system recovered perfectly and recorded NOTHING
|
|
11
|
+
* about why. This is the "why".
|
|
12
|
+
*
|
|
13
|
+
* The failure class is agent-native: an agent authors lush effects with zero
|
|
14
|
+
* cost feedback, because the quality loop grades looks and never cost.
|
|
15
|
+
*
|
|
16
|
+
* IT ALSO CARRIES THE BLENDER BLOCK. The Blender worker's call times and this
|
|
17
|
+
* thread's long-task stalls (`blender-tab-metrics.ts`) ride the same sample,
|
|
18
|
+
* because the beat is the one channel that still moves while the page or the
|
|
19
|
+
* worker is blocked — which is exactly when those numbers are the whole story.
|
|
20
|
+
* Absent, not zeroed, in a tab with no Blender session.
|
|
21
|
+
*
|
|
22
|
+
* MEASUREMENT ONLY — nothing here enforces a budget. Budgets are a later
|
|
23
|
+
* decision, made from real profiles rather than from a guess about them.
|
|
24
|
+
*
|
|
25
|
+
* WHAT IT COSTS. One sample every five seconds on the main thread, skipped
|
|
26
|
+
* entirely while the tab is hidden: a `querySelectorAll('canvas')`, two
|
|
27
|
+
* property reads, a scan of the bounded Resource Timing buffer, and — only
|
|
28
|
+
* when a game is actually mounted — the render-debug adapter's existing
|
|
29
|
+
* memory snapshot, which the Profiler's Memory view already polls five times
|
|
30
|
+
* as often. Never per frame.
|
|
31
|
+
*
|
|
32
|
+
* WHAT IT DOES NOT DO. It adds no global, no new endpoint, and no second way
|
|
33
|
+
* to reach a renderer: the renderer counts come from `RenderDebugAdapter`
|
|
34
|
+
* (`authoring/active-systems.ts`), the one seam a mounted game already
|
|
35
|
+
* registers, and they are ABSENT — not zero — when nothing has registered one.
|
|
36
|
+
* A zero would read as "no textures", which is a different claim from "nobody
|
|
37
|
+
* measured".
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import { PROJECT_MOUNT_QUERY } from '@volter/editor-sdk/session/project-module-url';
|
|
41
|
+
import type { BlenderTabMetrics, TabCensus } from '@volter/editor-sdk/tab-census';
|
|
42
|
+
import { getActiveRenderDebug } from './authoring/active-systems';
|
|
43
|
+
import { blenderTabMetrics } from './blender-tab-metrics';
|
|
44
|
+
import { isJsHeapReading, type JsHeapReading, readJsHeap } from './js-heap';
|
|
45
|
+
|
|
46
|
+
/** How often the page samples itself. Slow on purpose — see the header. */
|
|
47
|
+
export const TAB_CENSUS_INTERVAL_MS = 5_000;
|
|
48
|
+
|
|
49
|
+
/** Bytes a canvas backing store holds per pixel (RGBA8). */
|
|
50
|
+
const CANVAS_BYTES_PER_PIXEL = 4;
|
|
51
|
+
|
|
52
|
+
const BYTES_PER_MB = 1024 * 1024;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* One resource profile — THIS module is its producer, and `@volter/editor-sdk/tab-census`
|
|
56
|
+
* is where the shape is declared for every unit that speaks it (the node server
|
|
57
|
+
* that files it, the SDK status response, the journal line that prints it).
|
|
58
|
+
* Re-exported here because this file's own callers look for it here.
|
|
59
|
+
*/
|
|
60
|
+
export type { TabCensus };
|
|
61
|
+
|
|
62
|
+
/** The three readings a sample is made of, injected so the sampler is pure. */
|
|
63
|
+
export interface TabCensusSources {
|
|
64
|
+
/** Feature-detected JS heap (`readJsHeap`), or its unavailable-reason. */
|
|
65
|
+
heap(): JsHeapReading | { readonly unavailable: string };
|
|
66
|
+
/** Distinct `?vgai-mount=<id>` generations in Resource Timing. */
|
|
67
|
+
mountEpochs(): number;
|
|
68
|
+
/** Every canvas in the document, in BACKING-BUFFER pixels (not CSS px). */
|
|
69
|
+
canvases(): readonly { readonly width: number; readonly height: number }[];
|
|
70
|
+
/** Renderer resource counts, or null when no render-debug adapter is up. */
|
|
71
|
+
rendererCounts(): {
|
|
72
|
+
readonly geometries: number;
|
|
73
|
+
readonly textures: number;
|
|
74
|
+
readonly programs: number | null;
|
|
75
|
+
} | null;
|
|
76
|
+
/** The Blender worker's call times and the main thread's stalls, or null when
|
|
77
|
+
* this tab has no Blender session (`blender-tab-metrics.ts`). Optional so a
|
|
78
|
+
* caller measuring only the resource half omits it and gets no block, rather
|
|
79
|
+
* than having to fabricate one. */
|
|
80
|
+
blender?(): BlenderTabMetrics | null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Two decimals of an MB — enough to see a 4K framebuffer, short enough to read. */
|
|
84
|
+
function mb(bytes: number): number {
|
|
85
|
+
return Math.round((bytes / BYTES_PER_MB) * 100) / 100;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Take one census. PURE: everything it reads comes from `sources`, so the test
|
|
90
|
+
* drives the absent-heap, absent-adapter and populated branches without a
|
|
91
|
+
* browser.
|
|
92
|
+
*/
|
|
93
|
+
export function sampleTabCensus(sources: TabCensusSources): TabCensus {
|
|
94
|
+
const heap = sources.heap();
|
|
95
|
+
const canvases = sources.canvases();
|
|
96
|
+
const counts = sources.rendererCounts();
|
|
97
|
+
const blender = sources.blender?.() ?? null;
|
|
98
|
+
let canvasBytes = 0;
|
|
99
|
+
for (const canvas of canvases) {
|
|
100
|
+
canvasBytes += canvas.width * canvas.height * CANVAS_BYTES_PER_PIXEL;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
heapUsedMB: isJsHeapReading(heap) ? mb(heap.usedBytes) : null,
|
|
104
|
+
heapLimitMB: isJsHeapReading(heap) && heap.limitBytes !== null ? mb(heap.limitBytes) : null,
|
|
105
|
+
mountEpochs: sources.mountEpochs(),
|
|
106
|
+
canvases: canvases.length,
|
|
107
|
+
canvasMB: mb(canvasBytes),
|
|
108
|
+
...(blender === null ? {} : { blender }),
|
|
109
|
+
...(counts === null
|
|
110
|
+
? {}
|
|
111
|
+
: {
|
|
112
|
+
textures: counts.textures,
|
|
113
|
+
geometries: counts.geometries,
|
|
114
|
+
// `renderer.info.programs` is populated only after a first render,
|
|
115
|
+
// and a count nobody could read stays absent rather than becoming 0.
|
|
116
|
+
...(counts.programs === null ? {} : { programs: counts.programs }),
|
|
117
|
+
}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Count the project module generations this document has fetched.
|
|
123
|
+
*
|
|
124
|
+
* Resource Timing is the browser-visible population we can measure without
|
|
125
|
+
* instrumenting project modules or pretending the ES-module registry exposes
|
|
126
|
+
* an enumeration API. The entries live for the document lifetime (the same
|
|
127
|
+
* lifetime as its module registry), and the project mount split watch raises
|
|
128
|
+
* the resource buffer before imports begin. A reload resets both populations.
|
|
129
|
+
*/
|
|
130
|
+
export function countProjectMountEpochs(resources: readonly { readonly name: string }[]): number {
|
|
131
|
+
const epochs = new Set<string>();
|
|
132
|
+
for (const resource of resources) {
|
|
133
|
+
try {
|
|
134
|
+
const epoch = new URL(resource.name, 'http://vgai.invalid').searchParams.get(
|
|
135
|
+
PROJECT_MOUNT_QUERY,
|
|
136
|
+
);
|
|
137
|
+
if (epoch !== null && epoch.length > 0) epochs.add(epoch);
|
|
138
|
+
} catch {
|
|
139
|
+
// Resource Timing normally supplies absolute URLs. A malformed entry is
|
|
140
|
+
// not evidence of a mount and must not sink the rest of the census.
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return epochs.size;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** The real readings: this document, this browser, whatever game is mounted. */
|
|
147
|
+
export function documentCensusSources(): TabCensusSources {
|
|
148
|
+
return {
|
|
149
|
+
heap: () => readJsHeap(),
|
|
150
|
+
mountEpochs: () => countProjectMountEpochs(performance.getEntriesByType('resource')),
|
|
151
|
+
canvases: () => [...document.querySelectorAll('canvas')],
|
|
152
|
+
rendererCounts: () => getActiveRenderDebug()?.memorySnapshot?.().counts ?? null,
|
|
153
|
+
blender: () => blenderTabMetrics(),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let latest: TabCensus | null = null;
|
|
158
|
+
|
|
159
|
+
/** The newest census this page took, for the stats overlay to print. Null
|
|
160
|
+
* until the first sample (and while the tab has only ever been hidden). */
|
|
161
|
+
export function latestTabCensus(): TabCensus | null {
|
|
162
|
+
return latest;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface TabCensusLoopOptions {
|
|
166
|
+
/** Hand the profile to the heartbeat worker (`editor-presence.ts`). */
|
|
167
|
+
report(census: TabCensus): void;
|
|
168
|
+
sources?: TabCensusSources;
|
|
169
|
+
intervalMs?: number;
|
|
170
|
+
/** True while the tab is backgrounded — a hidden tab is not sampled. */
|
|
171
|
+
hidden?(): boolean;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Start sampling. Returns the stop function.
|
|
176
|
+
*
|
|
177
|
+
* A HIDDEN tab is skipped rather than throttled: it is painting nothing, so a
|
|
178
|
+
* sample would only re-report the moment it was backgrounded. Skipping is
|
|
179
|
+
* SAFE — and only safe — because the worker carries each profile on one beat
|
|
180
|
+
* and then drops it, so a tab that stops sampling stops sending and its
|
|
181
|
+
* profile's reported age climbs honestly. (When the worker echoed its cache
|
|
182
|
+
* instead, this skip is precisely what turned into the lie: a background tab
|
|
183
|
+
* killed under memory pressure — a mainline path for this feature — reported
|
|
184
|
+
* a half-second-old profile that was half an hour old.)
|
|
185
|
+
*/
|
|
186
|
+
export function startTabCensus(options: TabCensusLoopOptions): () => void {
|
|
187
|
+
const sources = options.sources ?? documentCensusSources();
|
|
188
|
+
const hidden = options.hidden ?? (() => document.visibilityState === 'hidden');
|
|
189
|
+
const tick = (): void => {
|
|
190
|
+
if (hidden()) return;
|
|
191
|
+
const census = sampleTabCensus(sources);
|
|
192
|
+
latest = census;
|
|
193
|
+
options.report(census);
|
|
194
|
+
};
|
|
195
|
+
tick();
|
|
196
|
+
const timer = setInterval(tick, options.intervalMs ?? TAB_CENSUS_INTERVAL_MS);
|
|
197
|
+
return () => clearInterval(timer);
|
|
198
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client half of the tab bijection (server: server/tab-lifecycle.ts) — the
|
|
3
|
+
* page-lifetime handlers for the tab-maintenance SSE events. The inline boot
|
|
4
|
+
* queues these events from the moment it creates the shared EventSource;
|
|
5
|
+
* editor-presence.ts installs these typed handlers and replays that queue.
|
|
6
|
+
*
|
|
7
|
+
* - `tab-refocus` — this is the session's one blessed tab: focus it, and
|
|
8
|
+
* navigate only if the server says the URL should change.
|
|
9
|
+
* - `tab-yield` — another tab is blessed. Try `window.close()` (script/CLI
|
|
10
|
+
* opened tabs with a single history entry close); otherwise leave the app
|
|
11
|
+
* for the server's static "open in another tab — Use here instead" page.
|
|
12
|
+
* Navigation tears the whole editor app down, so the editor never RUNS in
|
|
13
|
+
* two tabs for one session.
|
|
14
|
+
* - `tab-close` — the session ended. Run every terminator, TELL THE SERVER
|
|
15
|
+
* they ran, then try to close; a user-opened tab that refuses shows a
|
|
16
|
+
* minimal inline "session ended" state instead (the server is exiting, so
|
|
17
|
+
* there is no page left to navigate to).
|
|
18
|
+
* - `tab-adopt` — this tab is the session's one tab but it is showing the
|
|
19
|
+
* launcher/startup-failure surface. Focus it and re-run project detection
|
|
20
|
+
* so it lands on the project the server serves, instead of the server
|
|
21
|
+
* opening a SECOND tab beside it. The app registers the handler
|
|
22
|
+
* (`onTabAdopt`, AppRoot); with none registered — the yield page, or a
|
|
23
|
+
* teardown window — a reload is the same convergence by a blunter route.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { editorAppIconSvg, editorDocumentTitle } from '@volter/editor-sdk/session/editor-brand';
|
|
27
|
+
import { markSessionEnded } from './session-tombstone';
|
|
28
|
+
|
|
29
|
+
/** How long `window.close()` gets to take effect before the fallback runs. */
|
|
30
|
+
const CLOSE_FALLBACK_DELAY_MS = 300;
|
|
31
|
+
|
|
32
|
+
function closeOrFallback(fallback: () => void): void {
|
|
33
|
+
window.close();
|
|
34
|
+
// If close() was refused (user-opened tab), the timer still runs.
|
|
35
|
+
window.setTimeout(fallback, CLOSE_FALLBACK_DELAY_MS);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function handleRefocus(event: MessageEvent): void {
|
|
39
|
+
try {
|
|
40
|
+
window.focus();
|
|
41
|
+
const data = JSON.parse(event.data as string) as { url?: unknown };
|
|
42
|
+
if (typeof data.url !== 'string') return;
|
|
43
|
+
const target = new URL(data.url, window.location.href);
|
|
44
|
+
if (
|
|
45
|
+
target.origin === window.location.origin &&
|
|
46
|
+
target.pathname + target.search !== window.location.pathname + window.location.search
|
|
47
|
+
) {
|
|
48
|
+
window.location.assign(target.href);
|
|
49
|
+
}
|
|
50
|
+
} catch {
|
|
51
|
+
/* a malformed maintenance event must never break the editor */
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function handleYield(base: string, event: MessageEvent): void {
|
|
56
|
+
let participantId: string | null = null;
|
|
57
|
+
try {
|
|
58
|
+
const data = JSON.parse(event.data as string) as { participantId?: unknown };
|
|
59
|
+
if (typeof data.participantId === 'string') participantId = data.participantId;
|
|
60
|
+
} catch {
|
|
61
|
+
// The unscoped legacy route remains a safe fallback.
|
|
62
|
+
}
|
|
63
|
+
closeOrFallback(() => {
|
|
64
|
+
const query = participantId ? `?participantId=${encodeURIComponent(participantId)}` : '';
|
|
65
|
+
window.location.replace(`${base}/tab-yielded${query}`);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Session end now reaches EVERY connected tab, not just the blessed one (an
|
|
70
|
+
// extra tab that only learned of the shutdown by its socket dying fell
|
|
71
|
+
// through to the generic "Editor disconnected" overlay). A tab can therefore
|
|
72
|
+
// see more than one `tab-close`; acting twice would re-run `window.close()`
|
|
73
|
+
// and repaint the notice under itself.
|
|
74
|
+
let sessionEndHandled = false;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* THE PAGE'S ACKNOWLEDGEMENT — "I got `tab-close`, and everything it turns off
|
|
78
|
+
* is already off."
|
|
79
|
+
*
|
|
80
|
+
* The same beacon route and the same transport as index.html's `pagehide`
|
|
81
|
+
* goodbye (`server/tab-presence.ts`'s `TabCloseBeacon`), with `reason` telling
|
|
82
|
+
* the two apart; `sendBeacon` and not `fetch` because `window.close()` runs a
|
|
83
|
+
* line later and this must survive the document going away.
|
|
84
|
+
*
|
|
85
|
+
* Sent AFTER `markSessionEnded` returns, never before: its listeners run
|
|
86
|
+
* synchronously, so by the time it comes back every terminator — the Blender
|
|
87
|
+
* engine worker's included — has run, and that is precisely what this sentence
|
|
88
|
+
* claims. Sending it first would make it a lie the server then waits on.
|
|
89
|
+
*/
|
|
90
|
+
function acknowledgeSessionEnd(base: string, identity: TabIdentity): void {
|
|
91
|
+
if (identity.tabId === undefined || identity.epoch === undefined) return;
|
|
92
|
+
try {
|
|
93
|
+
navigator.sendBeacon?.(
|
|
94
|
+
`${base}/tab/close`,
|
|
95
|
+
new Blob(
|
|
96
|
+
[
|
|
97
|
+
JSON.stringify({
|
|
98
|
+
tabId: identity.tabId,
|
|
99
|
+
epoch: identity.epoch,
|
|
100
|
+
persisted: false,
|
|
101
|
+
reason: 'session-ended',
|
|
102
|
+
}),
|
|
103
|
+
],
|
|
104
|
+
{ type: 'application/json' },
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
} catch {
|
|
108
|
+
/* an ack that cannot be sent degrades to the unacked line the server
|
|
109
|
+
journals — which is the truth about this page either way */
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function handleSessionEnded(base: string, identity: TabIdentity): void {
|
|
114
|
+
if (sessionEndHandled) return;
|
|
115
|
+
sessionEndHandled = true;
|
|
116
|
+
// The latch FIRST, and unconditionally: `window.close()` is refused for a
|
|
117
|
+
// user-opened tab, so the page below may well keep running. Everything that
|
|
118
|
+
// would let it go on impersonating a live editor reads this
|
|
119
|
+
// (`session-tombstone.ts`).
|
|
120
|
+
markSessionEnded('session-closed');
|
|
121
|
+
acknowledgeSessionEnd(base, identity);
|
|
122
|
+
closeOrFallback(() => {
|
|
123
|
+
document.title = editorDocumentTitle('Session ended');
|
|
124
|
+
document.body.innerHTML = `<style>
|
|
125
|
+
:root{color-scheme:dark;background:#101318;color:#e8edf3;font-family:Inter,ui-sans-serif,system-ui,sans-serif}
|
|
126
|
+
body{margin:0;min-height:100vh;display:grid;place-items:center;padding:24px;background:radial-gradient(circle at 50% 30%,#1c2a3a 0,#101318 52%,#0b0e13 100%)}
|
|
127
|
+
main{width:min(440px,100%);box-sizing:border-box;padding:34px;text-align:center;border:1px solid rgba(255,255,255,.1);border-radius:20px;background:rgba(23,28,35,.92);box-shadow:0 22px 60px rgba(0,0,0,.38)}
|
|
128
|
+
.brand-mark{width:68px;height:68px;margin:0 auto 20px}.brand-mark svg{display:block;width:100%;height:100%}h1{margin:0 0 10px;font-size:22px}p{margin:0;color:#aeb9c6;font-size:14px;line-height:1.6}
|
|
129
|
+
</style><main><div class="brand-mark">${editorAppIconSvg()}</div><h1>Session ended</h1><p>This editor session has ended. You can close this tab.</p></main>`;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Which surface this tab is showing, as the server's tab bijection accounts
|
|
135
|
+
* for it (`POST /__editor/tab/route`; server vocabulary:
|
|
136
|
+
* server/tab-lifecycle.ts `TabRoute`). `'no-project'` covers BOTH the
|
|
137
|
+
* launcher and the startup-failure surface — from the bijection's side they
|
|
138
|
+
* are the same fact: a live tab that is not on the served project and can be
|
|
139
|
+
* adopted into it.
|
|
140
|
+
*/
|
|
141
|
+
export type EditorTabRoute = 'project' | 'no-project';
|
|
142
|
+
|
|
143
|
+
const adoptHandlers = new Set<() => void>();
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Register the app's response to `tab-adopt` (AppRoot: re-run detection).
|
|
147
|
+
* Returns an unsubscribe. Kept as a registry rather than an import from the
|
|
148
|
+
* component so this module stays free of React and of the editor's graph.
|
|
149
|
+
*/
|
|
150
|
+
export function onTabAdopt(handler: () => void): () => void {
|
|
151
|
+
adoptHandlers.add(handler);
|
|
152
|
+
return () => {
|
|
153
|
+
adoptHandlers.delete(handler);
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function handleAdopt(): void {
|
|
158
|
+
try {
|
|
159
|
+
window.focus();
|
|
160
|
+
} catch {
|
|
161
|
+
/* focus is a nicety; adoption is the point */
|
|
162
|
+
}
|
|
163
|
+
if (adoptHandlers.size === 0) {
|
|
164
|
+
window.location.reload();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
for (const handler of [...adoptHandlers]) handler();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* This tab's identity as the inline bootstrap minted it — passed in rather
|
|
172
|
+
* than read here, because `editor-presence.ts` owns the one read of
|
|
173
|
+
* `__VGAI_EDITOR_PRESENCE_BOOTSTRAP__` and a second reader would be a second
|
|
174
|
+
* opinion about who this tab is. Both fields are absent wherever there is no
|
|
175
|
+
* inline bootstrap at all (browser-mode builds, jsdom): such a page is not in
|
|
176
|
+
* the server's tab table and has nothing to acknowledge with.
|
|
177
|
+
*/
|
|
178
|
+
export interface TabIdentity {
|
|
179
|
+
readonly tabId?: string | undefined;
|
|
180
|
+
readonly epoch?: string | undefined;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Install the tab-maintenance listeners on the (one) real EventSource.
|
|
185
|
+
* `base` is the editor API prefix (`/__editor`).
|
|
186
|
+
*/
|
|
187
|
+
export function installTabLifecycleListeners(
|
|
188
|
+
source: Pick<EventSource, 'addEventListener'>,
|
|
189
|
+
base: string,
|
|
190
|
+
identity: TabIdentity = {},
|
|
191
|
+
): void {
|
|
192
|
+
source.addEventListener('tab-refocus', (event) => handleRefocus(event as MessageEvent));
|
|
193
|
+
source.addEventListener('tab-yield', (event) => handleYield(base, event as MessageEvent));
|
|
194
|
+
source.addEventListener('tab-close', () => handleSessionEnded(base, identity));
|
|
195
|
+
source.addEventListener('tab-adopt', () => handleAdopt());
|
|
196
|
+
}
|