@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,367 @@
|
|
|
1
|
+
export interface PerformanceTiming {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly ms: number;
|
|
4
|
+
/**
|
|
5
|
+
* Offset (ms) from THIS frame's start (`frameStart`) at which the timing
|
|
6
|
+
* began — a MEASURED value (e.g. a phase's `phaseStart - frameStart`), never
|
|
7
|
+
* synthesized. Present on per-frame phase timings (W4b, so a Chrome trace
|
|
8
|
+
* can place each phase span under its frame at the real offset). OMITTED on
|
|
9
|
+
* cross-frame aggregate rollups (`PerformanceSnapshot.phases`/`systems`/
|
|
10
|
+
* `components`), where no single start point exists — absent, never a
|
|
11
|
+
* fabricated 0.
|
|
12
|
+
*/
|
|
13
|
+
readonly startMs?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* One MEASURED span within a frame (W4b) — a system or component invocation,
|
|
18
|
+
* with the phase it ran in and its measured start offset from `frameStart`.
|
|
19
|
+
* Distinct from {@link PerformanceTiming}: a span is a single timed
|
|
20
|
+
* invocation carrying `phase` + always-present `startMs` (the trace/flame
|
|
21
|
+
* unit), whereas a `PerformanceTiming` may be a cross-frame rollup.
|
|
22
|
+
*/
|
|
23
|
+
export interface PerformanceSpan {
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly phase: string;
|
|
26
|
+
/** Measured offset (ms) from `frameStart` at which this span began. */
|
|
27
|
+
readonly startMs: number;
|
|
28
|
+
readonly ms: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Renderer counters accumulated over a frame (from `renderer.info`). */
|
|
32
|
+
export interface PerformanceRenderStats {
|
|
33
|
+
readonly gpuMs: number | null;
|
|
34
|
+
readonly drawCalls: number;
|
|
35
|
+
readonly triangles: number;
|
|
36
|
+
readonly geometries: number;
|
|
37
|
+
readonly textures: number;
|
|
38
|
+
/**
|
|
39
|
+
* How many top-level `renderer.render()` submissions the last presentation
|
|
40
|
+
* took (`renderer.info.render.frame`'s delta across one draw) — a composer
|
|
41
|
+
* chain, a shadow pass and a post stack each cost one. `null` (never a
|
|
42
|
+
* fabricated 0, same rule as `gpuMs`) when no reporter counted them: a
|
|
43
|
+
* reporter that omits `renderPasses` is saying it does not know, which is
|
|
44
|
+
* different from saying nothing was drawn.
|
|
45
|
+
*/
|
|
46
|
+
readonly renderPasses: number | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface PerformanceFrame {
|
|
50
|
+
readonly id: number;
|
|
51
|
+
readonly timestamp: number;
|
|
52
|
+
readonly intervalMs: number;
|
|
53
|
+
readonly cpuMs: number;
|
|
54
|
+
readonly phases: readonly PerformanceTiming[];
|
|
55
|
+
/**
|
|
56
|
+
* Per-invocation system spans measured this frame (W4b). Ordered by
|
|
57
|
+
* `startMs` (execution order), NOT accumulated — a system that ran twice
|
|
58
|
+
* (two substeps) appears twice. Empty when the profiler saw no named
|
|
59
|
+
* systems this frame.
|
|
60
|
+
*/
|
|
61
|
+
readonly systems: readonly PerformanceSpan[];
|
|
62
|
+
/**
|
|
63
|
+
* Per-invocation component spans measured this frame (W4b) — populated ONLY
|
|
64
|
+
* while `recording` (component timing is gated on recording, matching
|
|
65
|
+
* `beginComponent`/`endComponent`). Empty otherwise.
|
|
66
|
+
*/
|
|
67
|
+
readonly components: readonly PerformanceSpan[];
|
|
68
|
+
/**
|
|
69
|
+
* Renderer counters reported during this frame (W4b) — a snapshot of the
|
|
70
|
+
* accumulated `reportRender` totals taken at `endFrame`. `gpuMs` is `null`
|
|
71
|
+
* when no GPU timer reported (headless/SwiftShader), never a fabricated 0.
|
|
72
|
+
*/
|
|
73
|
+
readonly render: PerformanceRenderStats;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface PerformanceSnapshot {
|
|
77
|
+
readonly enabled: boolean;
|
|
78
|
+
readonly recording: boolean;
|
|
79
|
+
readonly fps: number;
|
|
80
|
+
readonly cpuMs: number;
|
|
81
|
+
readonly p95Ms: number;
|
|
82
|
+
readonly p99Ms: number;
|
|
83
|
+
readonly frames: readonly PerformanceFrame[];
|
|
84
|
+
readonly phases: readonly PerformanceTiming[];
|
|
85
|
+
readonly systems: readonly PerformanceTiming[];
|
|
86
|
+
readonly components: readonly PerformanceTiming[];
|
|
87
|
+
readonly render: PerformanceRenderStats;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const now = () => globalThis.performance?.now() ?? Date.now();
|
|
91
|
+
|
|
92
|
+
function percentile(sorted: readonly number[], fraction: number): number {
|
|
93
|
+
if (sorted.length === 0) return 0;
|
|
94
|
+
return sorted[Math.min(sorted.length - 1, Math.floor((sorted.length - 1) * fraction))] ?? 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Game-owned, bounded external store for browser-native performance diagnostics. */
|
|
98
|
+
export function createPerformanceProfiler(initiallyEnabled = false) {
|
|
99
|
+
const listeners = new Set<() => void>();
|
|
100
|
+
const frames: PerformanceFrame[] = [];
|
|
101
|
+
const currentPhases = new Map<string, { ms: number; startMs: number }>();
|
|
102
|
+
const currentSystems = new Map<string, number>();
|
|
103
|
+
const currentComponents = new Map<string, number>();
|
|
104
|
+
// Per-frame span logs (W4b) — cleared each beginFrame, snapshotted into the
|
|
105
|
+
// frame at endFrame. Distinct from the accumulate-by-name aggregate maps
|
|
106
|
+
// above (which back the cross-frame snapshot rollups): these preserve every
|
|
107
|
+
// individual invocation and its measured start offset, for the trace.
|
|
108
|
+
let frameSystems: PerformanceSpan[] = [];
|
|
109
|
+
let frameComponents: PerformanceSpan[] = [];
|
|
110
|
+
let enabled = initiallyEnabled;
|
|
111
|
+
// The header's always-visible FPS sparkline needs frame INTERVALS without
|
|
112
|
+
// turning on the full profiler. Full profiling measures phases/systems,
|
|
113
|
+
// issues GPU timer queries at render sites, and intentionally warns about
|
|
114
|
+
// overhead; a glanceable heartbeat must not silently opt the user into all
|
|
115
|
+
// of that work. `telemetryEnabled` records only the frame envelope.
|
|
116
|
+
let telemetryEnabled = false;
|
|
117
|
+
let recording = false;
|
|
118
|
+
let frameId = 0;
|
|
119
|
+
let frameStart = 0;
|
|
120
|
+
let lastFrameStart = 0;
|
|
121
|
+
/**
|
|
122
|
+
* Phase start times, innermost last. A STACK rather than the single slot
|
|
123
|
+
* this used to be, because phases NEST: the three adapter brackets its CPU
|
|
124
|
+
* render submission as its own phase (`render.submit`,
|
|
125
|
+
* `dev/render-vitals.ts`) from inside the frame's enclosing `render` phase.
|
|
126
|
+
* With one slot the inner `beginPhase()` overwrote the outer's start, so the
|
|
127
|
+
* outer `endPhase('render')` measured only the tail after the inner phase —
|
|
128
|
+
* silently under-reporting the very phase the inner one was decomposing.
|
|
129
|
+
* Balanced callers are unaffected; `endPhase` with an empty stack falls back
|
|
130
|
+
* to `frameStart` rather than a stale start from a previous frame.
|
|
131
|
+
*/
|
|
132
|
+
const phaseStack: number[] = [];
|
|
133
|
+
let systemStart = 0;
|
|
134
|
+
let componentStart = 0;
|
|
135
|
+
let render: PerformanceRenderStats = {
|
|
136
|
+
gpuMs: null,
|
|
137
|
+
drawCalls: 0,
|
|
138
|
+
triangles: 0,
|
|
139
|
+
geometries: 0,
|
|
140
|
+
textures: 0,
|
|
141
|
+
renderPasses: null,
|
|
142
|
+
};
|
|
143
|
+
let snapshot: PerformanceSnapshot = {
|
|
144
|
+
enabled,
|
|
145
|
+
recording,
|
|
146
|
+
fps: 0,
|
|
147
|
+
cpuMs: 0,
|
|
148
|
+
p95Ms: 0,
|
|
149
|
+
p99Ms: 0,
|
|
150
|
+
frames: [],
|
|
151
|
+
phases: [],
|
|
152
|
+
systems: [],
|
|
153
|
+
components: [],
|
|
154
|
+
render,
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
function publish(): void {
|
|
158
|
+
const latest = frames.at(-1);
|
|
159
|
+
// Frame-only subscribers need no percentile work. Keep this window stable
|
|
160
|
+
// so a retained snapshot's first percentile read still describes its frames.
|
|
161
|
+
const snapshotFrames = frames.slice();
|
|
162
|
+
let sortedIntervals: number[] | undefined;
|
|
163
|
+
const readPercentile = (fraction: number): number => {
|
|
164
|
+
sortedIntervals ??= snapshotFrames
|
|
165
|
+
.map((frame) => frame.intervalMs)
|
|
166
|
+
.filter((value) => value > 0)
|
|
167
|
+
.sort((a, b) => a - b);
|
|
168
|
+
return percentile(sortedIntervals, fraction);
|
|
169
|
+
};
|
|
170
|
+
snapshot = {
|
|
171
|
+
enabled,
|
|
172
|
+
recording,
|
|
173
|
+
fps: latest?.intervalMs ? 1000 / latest.intervalMs : 0,
|
|
174
|
+
cpuMs: latest?.cpuMs ?? 0,
|
|
175
|
+
get p95Ms() {
|
|
176
|
+
return readPercentile(0.95);
|
|
177
|
+
},
|
|
178
|
+
get p99Ms() {
|
|
179
|
+
return readPercentile(0.99);
|
|
180
|
+
},
|
|
181
|
+
frames: snapshotFrames,
|
|
182
|
+
phases: latest?.phases ?? [],
|
|
183
|
+
systems: [...currentSystems].map(([name, ms]) => ({ name, ms })).sort((a, b) => b.ms - a.ms),
|
|
184
|
+
components: [...currentComponents]
|
|
185
|
+
.map(([name, ms]) => ({ name, ms }))
|
|
186
|
+
.sort((a, b) => b.ms - a.ms),
|
|
187
|
+
render,
|
|
188
|
+
};
|
|
189
|
+
for (const listener of listeners) listener();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
get enabled() {
|
|
194
|
+
return enabled;
|
|
195
|
+
},
|
|
196
|
+
set enabled(value: boolean) {
|
|
197
|
+
if (enabled === value) return;
|
|
198
|
+
enabled = value;
|
|
199
|
+
if (value && !telemetryEnabled) lastFrameStart = 0;
|
|
200
|
+
publish();
|
|
201
|
+
},
|
|
202
|
+
get telemetryEnabled() {
|
|
203
|
+
return telemetryEnabled;
|
|
204
|
+
},
|
|
205
|
+
set telemetryEnabled(value: boolean) {
|
|
206
|
+
if (telemetryEnabled === value) return;
|
|
207
|
+
const wasInactive = !enabled && !telemetryEnabled;
|
|
208
|
+
telemetryEnabled = value;
|
|
209
|
+
if (value && wasInactive) lastFrameStart = 0;
|
|
210
|
+
publish();
|
|
211
|
+
},
|
|
212
|
+
get recording() {
|
|
213
|
+
return recording;
|
|
214
|
+
},
|
|
215
|
+
startRecording() {
|
|
216
|
+
const wasInactive = !enabled && !telemetryEnabled;
|
|
217
|
+
enabled = true;
|
|
218
|
+
if (wasInactive) lastFrameStart = 0;
|
|
219
|
+
recording = true;
|
|
220
|
+
frames.length = 0;
|
|
221
|
+
publish();
|
|
222
|
+
},
|
|
223
|
+
stopRecording() {
|
|
224
|
+
recording = false;
|
|
225
|
+
publish();
|
|
226
|
+
},
|
|
227
|
+
clear() {
|
|
228
|
+
frames.length = 0;
|
|
229
|
+
publish();
|
|
230
|
+
},
|
|
231
|
+
beginFrame() {
|
|
232
|
+
if (!enabled && !telemetryEnabled) return;
|
|
233
|
+
currentPhases.clear();
|
|
234
|
+
currentSystems.clear();
|
|
235
|
+
currentComponents.clear();
|
|
236
|
+
frameSystems = [];
|
|
237
|
+
frameComponents = [];
|
|
238
|
+
// A frame that threw mid-phase leaves entries on the stack; a fresh
|
|
239
|
+
// frame starts from nothing rather than inheriting them.
|
|
240
|
+
phaseStack.length = 0;
|
|
241
|
+
render = {
|
|
242
|
+
gpuMs: null,
|
|
243
|
+
drawCalls: 0,
|
|
244
|
+
triangles: 0,
|
|
245
|
+
geometries: 0,
|
|
246
|
+
textures: 0,
|
|
247
|
+
renderPasses: null,
|
|
248
|
+
};
|
|
249
|
+
frameStart = now();
|
|
250
|
+
},
|
|
251
|
+
beginPhase() {
|
|
252
|
+
if (!enabled) return;
|
|
253
|
+
phaseStack.push(now());
|
|
254
|
+
},
|
|
255
|
+
endPhase(name: string) {
|
|
256
|
+
if (!enabled) return;
|
|
257
|
+
// See `phaseStack`: pop restores the ENCLOSING phase's own start, so a
|
|
258
|
+
// nested bracket measures itself without truncating its parent.
|
|
259
|
+
const phaseStart = phaseStack.pop() ?? frameStart;
|
|
260
|
+
const elapsed = now() - phaseStart;
|
|
261
|
+
const existing = currentPhases.get(name);
|
|
262
|
+
// Accumulate ms across re-entries of the same phase, but keep the FIRST
|
|
263
|
+
// measured start offset (earliest entry) as the span's startMs.
|
|
264
|
+
currentPhases.set(name, {
|
|
265
|
+
ms: (existing?.ms ?? 0) + elapsed,
|
|
266
|
+
startMs: existing?.startMs ?? phaseStart - frameStart,
|
|
267
|
+
});
|
|
268
|
+
if (recording)
|
|
269
|
+
performance.measure(`vgai.phase.${name}`, { start: phaseStart, duration: elapsed });
|
|
270
|
+
},
|
|
271
|
+
systemObserver: {
|
|
272
|
+
beginSystem() {
|
|
273
|
+
if (!enabled) return;
|
|
274
|
+
systemStart = now();
|
|
275
|
+
},
|
|
276
|
+
endSystem(scope: string, phase: string, name: string) {
|
|
277
|
+
if (!enabled) return;
|
|
278
|
+
const end = now();
|
|
279
|
+
const key = `${scope} / ${phase} / ${name}`;
|
|
280
|
+
currentSystems.set(key, (currentSystems.get(key) ?? 0) + end - systemStart);
|
|
281
|
+
frameSystems.push({
|
|
282
|
+
name: key,
|
|
283
|
+
phase,
|
|
284
|
+
startMs: systemStart - frameStart,
|
|
285
|
+
ms: end - systemStart,
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
beginComponent() {
|
|
290
|
+
if (!recording) return;
|
|
291
|
+
componentStart = now();
|
|
292
|
+
},
|
|
293
|
+
endComponent(name: string, phase = '') {
|
|
294
|
+
if (!recording) return;
|
|
295
|
+
const end = now();
|
|
296
|
+
currentComponents.set(name, (currentComponents.get(name) ?? 0) + end - componentStart);
|
|
297
|
+
frameComponents.push({
|
|
298
|
+
name,
|
|
299
|
+
phase,
|
|
300
|
+
startMs: componentStart - frameStart,
|
|
301
|
+
ms: end - componentStart,
|
|
302
|
+
});
|
|
303
|
+
},
|
|
304
|
+
reportRender(stats: {
|
|
305
|
+
gpuMs: number | null;
|
|
306
|
+
drawCalls: number;
|
|
307
|
+
triangles: number;
|
|
308
|
+
geometries: number;
|
|
309
|
+
textures: number;
|
|
310
|
+
/** Omit when this reporter does not count passes — see
|
|
311
|
+
* {@link PerformanceRenderStats.renderPasses}. */
|
|
312
|
+
renderPasses?: number;
|
|
313
|
+
}) {
|
|
314
|
+
if (!enabled) return;
|
|
315
|
+
render = {
|
|
316
|
+
gpuMs: stats.gpuMs ?? render.gpuMs,
|
|
317
|
+
drawCalls: render.drawCalls + stats.drawCalls,
|
|
318
|
+
triangles: render.triangles + stats.triangles,
|
|
319
|
+
geometries: render.geometries + stats.geometries,
|
|
320
|
+
textures: render.textures + stats.textures,
|
|
321
|
+
renderPasses:
|
|
322
|
+
stats.renderPasses === undefined
|
|
323
|
+
? render.renderPasses
|
|
324
|
+
: (render.renderPasses ?? 0) + stats.renderPasses,
|
|
325
|
+
};
|
|
326
|
+
},
|
|
327
|
+
endFrame() {
|
|
328
|
+
if (!enabled && !telemetryEnabled) return;
|
|
329
|
+
const timestamp = now();
|
|
330
|
+
const intervalMs = lastFrameStart === 0 ? 0 : frameStart - lastFrameStart;
|
|
331
|
+
lastFrameStart = frameStart;
|
|
332
|
+
const frame: PerformanceFrame = {
|
|
333
|
+
id: ++frameId,
|
|
334
|
+
timestamp,
|
|
335
|
+
intervalMs,
|
|
336
|
+
cpuMs: timestamp - frameStart,
|
|
337
|
+
phases: [...currentPhases]
|
|
338
|
+
.map(([name, { ms, startMs }]) => ({ name, ms, startMs }))
|
|
339
|
+
.sort((a, b) => b.ms - a.ms),
|
|
340
|
+
systems: frameSystems.slice(),
|
|
341
|
+
components: frameComponents.slice(),
|
|
342
|
+
render: { ...render },
|
|
343
|
+
};
|
|
344
|
+
frames.push(frame);
|
|
345
|
+
if (frames.length > 600) frames.splice(0, frames.length - 600);
|
|
346
|
+
if (recording)
|
|
347
|
+
performance.measure('vgai.frame', { start: frameStart, duration: frame.cpuMs });
|
|
348
|
+
publish();
|
|
349
|
+
},
|
|
350
|
+
subscribe(listener: () => void) {
|
|
351
|
+
listeners.add(listener);
|
|
352
|
+
return () => {
|
|
353
|
+
listeners.delete(listener);
|
|
354
|
+
};
|
|
355
|
+
},
|
|
356
|
+
getSnapshot() {
|
|
357
|
+
return snapshot;
|
|
358
|
+
},
|
|
359
|
+
exportJSON() {
|
|
360
|
+
// version 2 (W4b): frames now carry per-frame `systems`/`components`
|
|
361
|
+
// spans, per-frame `render` counters, and `startMs` on phase timings.
|
|
362
|
+
return JSON.stringify({ version: 2, capturedAt: new Date().toISOString(), frames }, null, 2);
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export type PerformanceProfiler = ReturnType<typeof createPerformanceProfiler>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { PerformanceProfiler } from './performance-profiler';
|
|
2
|
+
|
|
3
|
+
export interface EditorPerformanceSource {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly kind: 'scene' | 'source' | 'asset' | 'game';
|
|
7
|
+
readonly profiler: PerformanceProfiler;
|
|
8
|
+
/** Mount identity for a Game runtime source. Document identity stays
|
|
9
|
+
* `workspace:game`; this disambiguates the runtime inspected inside it. */
|
|
10
|
+
readonly instanceId?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const sources = new Map<string, EditorPerformanceSource>();
|
|
14
|
+
const listeners = new Set<() => void>();
|
|
15
|
+
let version = 0;
|
|
16
|
+
|
|
17
|
+
function notify(): void {
|
|
18
|
+
version++;
|
|
19
|
+
for (const listener of listeners) listener();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Register one real render loop as a profiler source. */
|
|
23
|
+
export function registerPerformanceSource(source: EditorPerformanceSource): () => void {
|
|
24
|
+
sources.set(source.id, source);
|
|
25
|
+
notify();
|
|
26
|
+
return () => {
|
|
27
|
+
if (sources.get(source.id) !== source) return;
|
|
28
|
+
sources.delete(source.id);
|
|
29
|
+
notify();
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function performanceSourceForDocument(
|
|
34
|
+
documentId: string | null,
|
|
35
|
+
): EditorPerformanceSource | null {
|
|
36
|
+
return documentId ? (sources.get(documentId) ?? null) : null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Every registered render loop. The self-vitals checks
|
|
40
|
+
* (`coverage/session-vitals.ts`) ask "did the thing that is running draw a
|
|
41
|
+
* frame", which is a question about whichever loop exists, not about the
|
|
42
|
+
* document the user happens to be looking at. */
|
|
43
|
+
export function allPerformanceSources(): readonly EditorPerformanceSource[] {
|
|
44
|
+
return [...sources.values()];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function performanceSourceForGameInstance(
|
|
48
|
+
instanceId: string | null,
|
|
49
|
+
): EditorPerformanceSource | null {
|
|
50
|
+
if (instanceId === null) return null;
|
|
51
|
+
for (const source of sources.values()) {
|
|
52
|
+
if (source.kind === 'game' && source.instanceId === instanceId) return source;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function subscribePerformanceSources(listener: () => void): () => void {
|
|
58
|
+
listeners.add(listener);
|
|
59
|
+
return () => listeners.delete(listener);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function performanceSourcesVersion(): number {
|
|
63
|
+
return version;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function __resetPerformanceSourcesForTest(): void {
|
|
67
|
+
sources.clear();
|
|
68
|
+
notify();
|
|
69
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT PLAY WAS DOING WHEN IT STOPPED ANSWERING.
|
|
3
|
+
*
|
|
4
|
+
* ## The measurement this exists for
|
|
5
|
+
*
|
|
6
|
+
* 2026-08-20, `packages/editor/scripts/scale-harness` at N=20000 on the canvas
|
|
7
|
+
* lane. `vgai play` burned its whole 120s budget and was refused with
|
|
8
|
+
*
|
|
9
|
+
* Command timed out — the tab is present (last heartbeat 0.8s ago) and
|
|
10
|
+
* did not respond.
|
|
11
|
+
*
|
|
12
|
+
* then `screenshot` (15s) and `stop` (30s) were refused with the same sentence.
|
|
13
|
+
* Every one of those statements was TRUE and none of them was the answer: the
|
|
14
|
+
* heartbeat is a WORKER, so it kept beating at 0.4s while the page's main
|
|
15
|
+
* thread sat inside one 199.5-second synchronous block. Four consecutive runs,
|
|
16
|
+
* three silent timeouts each, against a session every reader called healthy.
|
|
17
|
+
*
|
|
18
|
+
* The defect the fix closed was a quadratic name derivation
|
|
19
|
+
* (`@vgai/game-runtime/pixi/authoring`). The defect THIS closes is that nothing anywhere
|
|
20
|
+
* could say which of play's eight steps the page was in — the relay knows only
|
|
21
|
+
* that it asked, the tab table knows only that the tab exists, and the page
|
|
22
|
+
* itself, being wedged, is the one party that cannot speak.
|
|
23
|
+
*
|
|
24
|
+
* ## The mechanism
|
|
25
|
+
*
|
|
26
|
+
* A phase is published BEFORE its work starts, on the control channel, as its
|
|
27
|
+
* own tiny message — never folded into the state snapshot, which is the
|
|
28
|
+
* expensive derivation a wedged page cannot produce and which is exactly the
|
|
29
|
+
* thing that goes silent. So the server always holds the phase the page was
|
|
30
|
+
* ENTERING when it went quiet, and the relay's refusal can name it.
|
|
31
|
+
*
|
|
32
|
+
* This module is the page's half and is deliberately pure apart from one
|
|
33
|
+
* injected reporter: the latch, the phase vocabulary, and the sentence are all
|
|
34
|
+
* unit-testable without a browser.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The steps of a play boot, in the order `play-mode.ts` runs them.
|
|
39
|
+
*
|
|
40
|
+
* The vocabulary is shared with `play-boot-stall.ts`: the three network-shaped
|
|
41
|
+
* steps it already guards use the SAME wording here, so the hidden-tab stall
|
|
42
|
+
* message and a stuck-play refusal cannot describe the same step differently.
|
|
43
|
+
* The steps that guard does not wrap — the runtime mount and the authoring
|
|
44
|
+
* install, which must never be abandoned mid-flight — are the ones that had no
|
|
45
|
+
* name at all, and they are where the 199.5s block was measured.
|
|
46
|
+
*/
|
|
47
|
+
export const PLAY_BOOT_PHASES = [
|
|
48
|
+
'waiting for the editor to bind Play',
|
|
49
|
+
'waiting for the project bootstrap to settle',
|
|
50
|
+
'starting the play log session',
|
|
51
|
+
'opening the Game document',
|
|
52
|
+
'fetching the project manifest',
|
|
53
|
+
"resolving the project's root entries",
|
|
54
|
+
'mounting the runtime roots',
|
|
55
|
+
'installing play authoring for each root',
|
|
56
|
+
'binding the editor to the running game',
|
|
57
|
+
] as const;
|
|
58
|
+
|
|
59
|
+
export type PlayBootPhase = (typeof PLAY_BOOT_PHASES)[number];
|
|
60
|
+
|
|
61
|
+
/** The page's standing answer to "what is play doing right now". */
|
|
62
|
+
/** Any main-thread work the page announces before starting it: a play boot
|
|
63
|
+
* step, or a document's `building src/models/x.ts`. */
|
|
64
|
+
export type PagePhase = PlayBootPhase | `building ${string}`;
|
|
65
|
+
|
|
66
|
+
export interface PlayBootPhaseState {
|
|
67
|
+
/** The phase being ENTERED, or `null` once the boot settled either way. */
|
|
68
|
+
readonly phase: PagePhase | null;
|
|
69
|
+
/** Epoch ms the page entered it (or left the last one). */
|
|
70
|
+
readonly at: number;
|
|
71
|
+
/** This play attempt's ordinal, so a stale report is recognizable as stale. */
|
|
72
|
+
readonly run: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let _state: PlayBootPhaseState = { phase: null, at: 0, run: 0 };
|
|
76
|
+
let _report: ((state: PlayBootPhaseState) => void) | null = null;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Install the upstream reporter. Wired once at editor boot; left unset in
|
|
80
|
+
* tests, where the latch is read directly.
|
|
81
|
+
*/
|
|
82
|
+
export function setPlayBootPhaseReporter(
|
|
83
|
+
report: ((state: PlayBootPhaseState) => void) | null,
|
|
84
|
+
): void {
|
|
85
|
+
_report = report;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function publish(next: PlayBootPhaseState): void {
|
|
89
|
+
_state = next;
|
|
90
|
+
// A reporter that throws must never break a play boot — the phase is
|
|
91
|
+
// diagnostics, and diagnostics that can fail the thing they describe are
|
|
92
|
+
// worse than none.
|
|
93
|
+
try {
|
|
94
|
+
_report?.(next);
|
|
95
|
+
} catch {
|
|
96
|
+
/* the boot continues; the reader loses one phase line */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Begin a play attempt. Returns its run ordinal. */
|
|
101
|
+
export function beginPlayBoot(now: number = Date.now()): number {
|
|
102
|
+
publish({ phase: null, at: now, run: _state.run + 1 });
|
|
103
|
+
return _state.run;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Enter one phase. Called BEFORE the phase's work, never after it. */
|
|
107
|
+
export function markPlayBootPhase(phase: PlayBootPhase, now: number = Date.now()): void {
|
|
108
|
+
publish({ phase, at: now, run: _state.run });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The boot settled — started, failed, or was superseded. Clearing the phase is
|
|
113
|
+
* what makes a LATER stuck command ("stop", "screenshot") report honestly that
|
|
114
|
+
* play was not booting rather than blaming the last phase of a boot that
|
|
115
|
+
* finished minutes ago.
|
|
116
|
+
*/
|
|
117
|
+
export function endPlayBoot(now: number = Date.now()): void {
|
|
118
|
+
publish({ phase: null, at: now, run: _state.run });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Announce main-thread work that is NOT a play boot — a model document about
|
|
123
|
+
* to run a module's `build()` — so a command that times out while the page is
|
|
124
|
+
* inside it is refused by name ("the page is still inside building
|
|
125
|
+
* src/models/mushroom.ts") instead of "never answered". A blind session on a
|
|
126
|
+
* swapped box read the generic refusal as its own module hanging and bisected
|
|
127
|
+
* a parameter for five minutes (2026-09-06). Returns the end call; nested
|
|
128
|
+
* work is not tracked — the latest announcement stands until it ends.
|
|
129
|
+
*/
|
|
130
|
+
export function beginPageWork(label: `building ${string}`, now: number = Date.now()): () => void {
|
|
131
|
+
publish({ phase: label, at: now, run: _state.run });
|
|
132
|
+
return () => {
|
|
133
|
+
if (_state.phase === label) publish({ phase: null, at: Date.now(), run: _state.run });
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function currentPlayBootPhase(): PlayBootPhaseState {
|
|
138
|
+
return _state;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Test-only reset — drops the latch and the reporter. */
|
|
142
|
+
export function __resetPlayBootPhaseForTest(): void {
|
|
143
|
+
_state = { phase: null, at: 0, run: 0 };
|
|
144
|
+
_report = null;
|
|
145
|
+
}
|