@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,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE ONE PERSISTENCE PIPE — `resolve(anchor) → write(dialect) → record(recorder)`.
|
|
3
|
+
*
|
|
4
|
+
* Every authored write, from every lane, runs through {@link runWritePipe}.
|
|
5
|
+
* The lanes that used to be parallel stacks are now this pipe's PLUG POINTS:
|
|
6
|
+
* a lane supplies a resolution (which anchor this edit lands at), a dialect
|
|
7
|
+
* writer (the bytes), and a recorder (history), and the pipe supplies the
|
|
8
|
+
* ordering, the awaiting, and the ack.
|
|
9
|
+
*
|
|
10
|
+
* ## The three defects it exists for, all measured on the vendored racing game
|
|
11
|
+
*
|
|
12
|
+
* 1. **The ack was the ADAPTER'S blanket answer, not this edit's.** The
|
|
13
|
+
* composite joined only its persist-CAPABLE children, so a three-root edit
|
|
14
|
+
* acked the DOM root's destination with `persisted: true`. Here the ack is
|
|
15
|
+
* produced by the component that performed the write, about that write, and
|
|
16
|
+
* there is nowhere else for a caller to get one.
|
|
17
|
+
* 2. **The classifier and the writer were different components.** A subject the
|
|
18
|
+
* adapter classified `live-only` still wrote a real prop into the game's
|
|
19
|
+
* source, because the code answering `TruthProvider.resolve` was not
|
|
20
|
+
* the code performing the write. Here the anchor is resolved ONCE, and a
|
|
21
|
+
* `live-only` resolution has no `write` member at all — reaching a dialect
|
|
22
|
+
* writer from it is a type error, not a discipline.
|
|
23
|
+
* 3. **The write was fired un-awaited, so the ack raced the byte.** Here the
|
|
24
|
+
* pipe awaits the dialect writer and the recorder before it acks.
|
|
25
|
+
*
|
|
26
|
+
* ## Why `live-only` is a destination and not a failure
|
|
27
|
+
*
|
|
28
|
+
* `live-only` (and its play-mode sibling, ephemeral) is a real
|
|
29
|
+
* {@link WriteAnchorKind}: the edit lands on the running object for the session
|
|
30
|
+
* and nothing else, and the contract of that kind is that the surface SAYS SO.
|
|
31
|
+
* So the pipe's live-only branch still applies the edit — the caller has
|
|
32
|
+
* already done that, synchronously, which is what keeps an `endEdit(); undo()`
|
|
33
|
+
* sequence working — and answers `persisted: false` with the reason reported
|
|
34
|
+
* where a user can read it. What the pipe forbids is the inverse: naming a
|
|
35
|
+
* destination no byte reached.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import type { WriteAck, WriteAnchorKind } from '@volter/editor-project/adapter';
|
|
39
|
+
|
|
40
|
+
export type { WriteAck } from '@volter/editor-project/adapter';
|
|
41
|
+
|
|
42
|
+
/** What a surface reports when nothing this session does reaches a file. */
|
|
43
|
+
export const LIVE_ONLY_DESTINATION = 'live-only (not saved)';
|
|
44
|
+
|
|
45
|
+
/** What a play-mode adoption reports: edits are real, and die with the session. */
|
|
46
|
+
export const EPHEMERAL_DESTINATION = 'ephemeral (discarded on stop)';
|
|
47
|
+
|
|
48
|
+
/** What `CompositeAuthoringAdapter.persistence` reports when no child of the
|
|
49
|
+
* composition can persist at all. That provider answers the SAVE-status
|
|
50
|
+
* question ("where do this surface's saves go"), never the per-edit one — the
|
|
51
|
+
* pipe's ack is the only answer to that. */
|
|
52
|
+
export const NO_PERSISTABLE_CHILD_DESTINATION = '(no persistable child)';
|
|
53
|
+
|
|
54
|
+
/** The honest floor, as a value: no write was performed, and saying so is the
|
|
55
|
+
* whole point. Frozen because it is shared by every lane that has no write. */
|
|
56
|
+
export const LIVE_ONLY_ACK: WriteAck = Object.freeze({
|
|
57
|
+
destination: LIVE_ONLY_DESTINATION,
|
|
58
|
+
persisted: false,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A CLIPBOARD gesture reports itself by its WRITE, never by the clipboard half
|
|
63
|
+
* that already succeeded.
|
|
64
|
+
*
|
|
65
|
+
* `StructuralClipboardOutcome` (`@volter/editor-project/adapter`) keeps `false` as the refusal
|
|
66
|
+
* channel and reserves the {@link WriteAck} for a SUCCESSFUL cut/paste. A cut
|
|
67
|
+
* whose removal reached no byte is a COPY: handing its `persisted: false` ack
|
|
68
|
+
* straight back is truthy, so every caller — `consumer-actions.ts`'s
|
|
69
|
+
* `clipboardStructureWrite`, which only shortcuts on `=== false`, and the
|
|
70
|
+
* composite's `cut`, which claims clipboard ownership on anything else — reads
|
|
71
|
+
* a refusal as a landed edit.
|
|
72
|
+
*
|
|
73
|
+
* ONE owner, because the four lanes each said this inline and one commit
|
|
74
|
+
* deleted all four collapses together while widening the return type.
|
|
75
|
+
*/
|
|
76
|
+
export function clipboardOutcome(ack: WriteAck): false | WriteAck {
|
|
77
|
+
return ack.persisted ? ack : false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** An anchor kind that has somewhere to land. `live-only` is excluded BY THE
|
|
81
|
+
* TYPE, which is what makes "a live-only resolution cannot reach a writer" a
|
|
82
|
+
* compile-time fact rather than a convention. */
|
|
83
|
+
export type AnchoredWriteKind = Exclude<WriteAnchorKind, 'live-only'>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Step 1's product: what THIS edit's anchor resolved to.
|
|
87
|
+
*
|
|
88
|
+
* The two arms are not "success" and "failure" — they are the two honest
|
|
89
|
+
* outcomes of asking where an edit lands. Only the `writer` arm carries a
|
|
90
|
+
* `write`, so a lane cannot accidentally write through a resolution that said
|
|
91
|
+
* there was nowhere to write.
|
|
92
|
+
*/
|
|
93
|
+
export type WriteResolution =
|
|
94
|
+
| {
|
|
95
|
+
readonly reaches: 'writer';
|
|
96
|
+
/** Which lane carries it — the SAME fact `TruthProvider.resolve`
|
|
97
|
+
* must report for this subject, because both read this resolution. */
|
|
98
|
+
readonly anchorKind: AnchoredWriteKind;
|
|
99
|
+
/** Where the bytes go, in the dialect writer's own words. */
|
|
100
|
+
readonly destination: string;
|
|
101
|
+
/** Step 2 — the dialect writer, already bound to this edit. `true` ⇒ the
|
|
102
|
+
* bytes landed and the writer's own transaction carries both halves. */
|
|
103
|
+
readonly write: () => Promise<boolean>;
|
|
104
|
+
}
|
|
105
|
+
| {
|
|
106
|
+
readonly reaches: 'live-only';
|
|
107
|
+
/** {@link LIVE_ONLY_DESTINATION} or {@link EPHEMERAL_DESTINATION}. */
|
|
108
|
+
readonly destination: string;
|
|
109
|
+
/** Why there is nowhere to write — reported to the user by the lane's
|
|
110
|
+
* own reporter, never swallowed. */
|
|
111
|
+
readonly reason: string;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** One edit, offered to the pipe. */
|
|
115
|
+
export interface PipedWrite {
|
|
116
|
+
/**
|
|
117
|
+
* Step 1 — resolve THIS edit's anchor. Called EXACTLY ONCE by the pipe, so
|
|
118
|
+
* the classification a caller reads and the route the write takes are the
|
|
119
|
+
* same object rather than two evaluations that can disagree.
|
|
120
|
+
*/
|
|
121
|
+
resolve(): WriteResolution;
|
|
122
|
+
/**
|
|
123
|
+
* Step 3 — the recorder. Called exactly once, after the write step settled,
|
|
124
|
+
* with what actually happened. `persisted: true` ⇒ the dialect writer's own
|
|
125
|
+
* transaction already carries both the file and the live half, so the
|
|
126
|
+
* recorder skips its session journal rather than adding a second entry.
|
|
127
|
+
*
|
|
128
|
+
* This is where undo/redo integrates, and it is the ONLY place: a lane that
|
|
129
|
+
* journals outside the pipe forks history, which is what the pipe replaced.
|
|
130
|
+
*/
|
|
131
|
+
record(persisted: boolean): void;
|
|
132
|
+
/**
|
|
133
|
+
* Show a live-only reason where the user can read it. Called only for the
|
|
134
|
+
* `live-only` arm, and only when the lane wants it said (an unarmed backend
|
|
135
|
+
* refusing on every frame of a game somebody is playing is noise, so lanes
|
|
136
|
+
* gate this themselves).
|
|
137
|
+
*/
|
|
138
|
+
report?(reason: string): void;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* RUN ONE EDIT THROUGH THE PIPE, and answer for it.
|
|
143
|
+
*
|
|
144
|
+
* The ordering is the contract: resolve, then write (awaited), then record
|
|
145
|
+
* (before the ack). A caller that awaits this ack has awaited the byte.
|
|
146
|
+
*
|
|
147
|
+
* A dialect writer that comes back `false` has already reported its own reason
|
|
148
|
+
* (that is its contract — every refusal names its gate), and the edit degrades
|
|
149
|
+
* to the live-only floor: the value is on the running object, the recorder
|
|
150
|
+
* journals it so it can be undone, and the ack says no byte moved.
|
|
151
|
+
*/
|
|
152
|
+
export async function runWritePipe(edit: PipedWrite): Promise<WriteAck> {
|
|
153
|
+
const resolution = edit.resolve();
|
|
154
|
+
if (resolution.reaches === 'live-only') {
|
|
155
|
+
edit.report?.(resolution.reason);
|
|
156
|
+
edit.record(false);
|
|
157
|
+
return { destination: resolution.destination, persisted: false };
|
|
158
|
+
}
|
|
159
|
+
const persisted = await resolution.write();
|
|
160
|
+
edit.record(persisted);
|
|
161
|
+
return persisted
|
|
162
|
+
? { destination: resolution.destination, persisted: true }
|
|
163
|
+
: { destination: LIVE_ONLY_DESTINATION, persisted: false };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Spell a live-only resolution — the one form, so no lane invents a second
|
|
167
|
+
* phrasing of "there is nowhere to write". */
|
|
168
|
+
export function resolvesLiveOnly(
|
|
169
|
+
reason: string,
|
|
170
|
+
destination: string = LIVE_ONLY_DESTINATION,
|
|
171
|
+
): WriteResolution {
|
|
172
|
+
return { reaches: 'live-only', destination, reason };
|
|
173
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONE shared 250ms availability tick replacing the three independent
|
|
3
|
+
* `setInterval(…, 250)` pollers that W4 left behind (utility availability,
|
|
4
|
+
* the Dev utility's live-plane gate, and ConnectionStatus's networking-adapter
|
|
5
|
+
* poll).
|
|
6
|
+
*
|
|
7
|
+
* These gates all watch the SAME kind of out-of-band signal — a live play
|
|
8
|
+
* session's adapters appearing/disappearing without any store/registry
|
|
9
|
+
* notification — so they don't need three timers, three wakeups, and three
|
|
10
|
+
* interleaved re-render schedules; they need one heartbeat. The interval is
|
|
11
|
+
* refcounted: it starts with the first subscriber and stops with the last,
|
|
12
|
+
* so an idle editor (none of the three consumers mounted) runs no timer at
|
|
13
|
+
* all — strictly better than the three always-on intervals it replaces.
|
|
14
|
+
*
|
|
15
|
+
* `useSyncExternalStore`-shaped on purpose: consumers subscribe and SELECT
|
|
16
|
+
* the derived value they actually read (`getActiveDebug()` presence, a
|
|
17
|
+
* connection state, an availability fingerprint) — they re-render only when
|
|
18
|
+
* that value changes, never on the tick itself. The former version-counter
|
|
19
|
+
* hook (`useAvailabilityTick`) re-rendered every subscriber 4×/s
|
|
20
|
+
* unconditionally; with the workspace and every panel subscribed
|
|
21
|
+
* that measured ~27ms of React work per tick (~110ms/s) in an idle editor —
|
|
22
|
+
* found 2026-07-31 by the Profiler's long-animation-frame attribution.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { useSyncExternalStore } from 'react';
|
|
26
|
+
|
|
27
|
+
const TICK_MS = 250;
|
|
28
|
+
|
|
29
|
+
let _version = 0;
|
|
30
|
+
let _intervalId: ReturnType<typeof setInterval> | null = null;
|
|
31
|
+
const _listeners = new Set<() => void>();
|
|
32
|
+
|
|
33
|
+
function onTick(): void {
|
|
34
|
+
_version++;
|
|
35
|
+
for (const fn of _listeners) fn();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Subscribe to the shared 250ms tick. Starts the timer on first subscriber,
|
|
39
|
+
* stops it with the last. Returns unsubscribe. */
|
|
40
|
+
export function subscribeAvailabilityTick(fn: () => void): () => void {
|
|
41
|
+
_listeners.add(fn);
|
|
42
|
+
if (_intervalId === null) _intervalId = setInterval(onTick, TICK_MS);
|
|
43
|
+
return () => {
|
|
44
|
+
_listeners.delete(fn);
|
|
45
|
+
if (_listeners.size === 0 && _intervalId !== null) {
|
|
46
|
+
clearInterval(_intervalId);
|
|
47
|
+
_intervalId = null;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Monotonic tick counter — exposed for tests that assert the timer runs. */
|
|
53
|
+
export function availabilityTickVersion(): number {
|
|
54
|
+
return _version;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Re-evaluate `select` on every shared availability tick, re-rendering the
|
|
59
|
+
* caller ONLY when its result changes (`Object.is`). `select` must return a
|
|
60
|
+
* primitive or a stable reference (an adapter identity, a joined-id string,
|
|
61
|
+
* a bitmask) — a fresh object every call would defeat the point and re-render
|
|
62
|
+
* per tick. It runs 4×/s plus once per render, so keep it a cheap read.
|
|
63
|
+
*/
|
|
64
|
+
export function useAvailabilitySelector<T>(select: () => T): T {
|
|
65
|
+
return useSyncExternalStore(subscribeAvailabilityTick, select, select);
|
|
66
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The 5x7 bitmap label drawn onto every contact sheet cell.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `asset-preview.ts` (where it was `drawBitmapLabel` plus its
|
|
5
|
+
* `LABEL_GLYPHS` table) when the STORY lane needed the same labels: a story
|
|
6
|
+
* variant sheet is composited from DOM captures and has no business importing
|
|
7
|
+
* the three.js asset-preview engine to draw a caption. Same pixels, one owner
|
|
8
|
+
* — a second hand-rolled label routine is exactly how two sheets start
|
|
9
|
+
* looking like two products.
|
|
10
|
+
*
|
|
11
|
+
* A bitmap font rather than `fillText`: the sheet is evidence, and canvas text
|
|
12
|
+
* rendering varies by platform font stack, which would make two runs of the
|
|
13
|
+
* same capture differ in a way that has nothing to do with the subject.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const LABEL_GLYPHS: Record<string, readonly string[]> = {
|
|
17
|
+
F: ['11111', '10000', '10000', '11110', '10000', '10000', '10000'],
|
|
18
|
+
R: ['11110', '10001', '10001', '11110', '10100', '10010', '10001'],
|
|
19
|
+
O: ['01110', '10001', '10001', '10001', '10001', '10001', '01110'],
|
|
20
|
+
N: ['10001', '11001', '11001', '10101', '10011', '10011', '10001'],
|
|
21
|
+
T: ['11111', '00100', '00100', '00100', '00100', '00100', '00100'],
|
|
22
|
+
I: ['11111', '00100', '00100', '00100', '00100', '00100', '11111'],
|
|
23
|
+
G: ['01110', '10001', '10000', '10111', '10001', '10001', '01110'],
|
|
24
|
+
H: ['10001', '10001', '10001', '11111', '10001', '10001', '10001'],
|
|
25
|
+
P: ['11110', '10001', '10001', '11110', '10000', '10000', '10000'],
|
|
26
|
+
'3': ['11110', '00001', '00001', '01110', '00001', '00001', '11110'],
|
|
27
|
+
'/': ['00001', '00010', '00100', '00100', '01000', '10000', '10000'],
|
|
28
|
+
'4': ['00010', '00110', '01010', '10010', '11111', '00010', '00010'],
|
|
29
|
+
// Labeled shot sets (project-defined labels like 'ZOOM-HEAD'/'BEND-Q')
|
|
30
|
+
// pull in these additional glyphs, same 5x7 bitmap style as the set
|
|
31
|
+
// above. The font covers A-Z and 0-9 outright rather than the subset the
|
|
32
|
+
// in-repo sets happen to spell: a missing glyph renders as a BLANK CELL,
|
|
33
|
+
// so a partial font mislabels a project's shot silently — the dragon set's
|
|
34
|
+
// 'ZOOM-WINGTIP-UP' drew as 'ZOOM- INGTIP-UP' for want of a W.
|
|
35
|
+
A: ['01110', '10001', '10001', '11111', '10001', '10001', '10001'],
|
|
36
|
+
B: ['11110', '10001', '10001', '11110', '10001', '10001', '11110'],
|
|
37
|
+
C: ['01111', '10000', '10000', '10000', '10000', '10000', '01111'],
|
|
38
|
+
D: ['11110', '10001', '10001', '10001', '10001', '10001', '11110'],
|
|
39
|
+
E: ['11111', '10000', '10000', '11110', '10000', '10000', '11111'],
|
|
40
|
+
K: ['10001', '10010', '10100', '11000', '10100', '10010', '10001'],
|
|
41
|
+
L: ['10000', '10000', '10000', '10000', '10000', '10000', '11111'],
|
|
42
|
+
M: ['10001', '11011', '10101', '10101', '10001', '10001', '10001'],
|
|
43
|
+
Q: ['01110', '10001', '10001', '10001', '10101', '10010', '01101'],
|
|
44
|
+
S: ['01111', '10000', '10000', '01110', '00001', '00001', '11110'],
|
|
45
|
+
U: ['10001', '10001', '10001', '10001', '10001', '10001', '01110'],
|
|
46
|
+
Z: ['11111', '00001', '00010', '00100', '01000', '10000', '11111'],
|
|
47
|
+
J: ['00111', '00010', '00010', '00010', '00010', '10010', '01100'],
|
|
48
|
+
V: ['10001', '10001', '10001', '10001', '10001', '01010', '00100'],
|
|
49
|
+
W: ['10001', '10001', '10001', '10101', '10101', '11011', '10001'],
|
|
50
|
+
X: ['10001', '10001', '01010', '00100', '01010', '10001', '10001'],
|
|
51
|
+
Y: ['10001', '10001', '01010', '00100', '00100', '00100', '00100'],
|
|
52
|
+
'0': ['01110', '10001', '10011', '10101', '11001', '10001', '01110'],
|
|
53
|
+
'1': ['00100', '01100', '00100', '00100', '00100', '00100', '01110'],
|
|
54
|
+
'2': ['01110', '10001', '00001', '00010', '00100', '01000', '11111'],
|
|
55
|
+
'5': ['11111', '10000', '11110', '00001', '00001', '10001', '01110'],
|
|
56
|
+
'6': ['00110', '01000', '10000', '11110', '10001', '10001', '01110'],
|
|
57
|
+
'7': ['11111', '00001', '00010', '00100', '01000', '01000', '01000'],
|
|
58
|
+
'8': ['01110', '10001', '10001', '01110', '10001', '10001', '01110'],
|
|
59
|
+
'9': ['01110', '10001', '10001', '01111', '00001', '00010', '01100'],
|
|
60
|
+
'-': ['00000', '00000', '00000', '11111', '00000', '00000', '00000'],
|
|
61
|
+
// Axis-orientation annotations (asset-preview's authored-axis markers).
|
|
62
|
+
'+': ['00000', '00100', '00100', '11111', '00100', '00100', '00000'],
|
|
63
|
+
'<': ['00010', '00100', '01000', '10000', '01000', '00100', '00010'],
|
|
64
|
+
'>': ['01000', '00100', '00010', '00001', '00010', '00100', '01000'],
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The pixel box {@link drawBitmapLabel} will paint for `label` in a cell of
|
|
69
|
+
* this size — exported so a caller can right- or bottom-align a label inside
|
|
70
|
+
* its cell instead of duplicating the font's scale arithmetic.
|
|
71
|
+
*/
|
|
72
|
+
export function measureBitmapLabel(
|
|
73
|
+
label: string,
|
|
74
|
+
cellWidth: number,
|
|
75
|
+
cellHeight: number,
|
|
76
|
+
): { width: number; height: number } {
|
|
77
|
+
const scale = Math.max(1, Math.floor(Math.min(cellWidth, cellHeight) / 128));
|
|
78
|
+
const padding = scale * 3;
|
|
79
|
+
return {
|
|
80
|
+
width: label.length * scale * 6 - scale + padding * 2,
|
|
81
|
+
height: scale * 7 + padding * 2,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function drawBitmapLabel(
|
|
86
|
+
context: CanvasRenderingContext2D,
|
|
87
|
+
label: string,
|
|
88
|
+
x: number,
|
|
89
|
+
y: number,
|
|
90
|
+
cellWidth: number,
|
|
91
|
+
cellHeight: number,
|
|
92
|
+
tone: 'normal' | 'warning' = 'normal',
|
|
93
|
+
): void {
|
|
94
|
+
const scale = Math.max(1, Math.floor(Math.min(cellWidth, cellHeight) / 128));
|
|
95
|
+
const padding = scale * 3;
|
|
96
|
+
const advance = scale * 6;
|
|
97
|
+
const width = label.length * advance - scale + padding * 2;
|
|
98
|
+
const height = scale * 7 + padding * 2;
|
|
99
|
+
context.fillStyle = tone === 'warning' ? 'rgba(154, 24, 24, 0.92)' : 'rgba(0, 0, 0, 0.62)';
|
|
100
|
+
context.fillRect(x, y, width, height);
|
|
101
|
+
context.fillStyle = '#ffffff';
|
|
102
|
+
for (let glyphIndex = 0; glyphIndex < label.length; glyphIndex++) {
|
|
103
|
+
// Labels are project data now — a character outside the bitmap font
|
|
104
|
+
// renders as a blank cell rather than crashing the capture.
|
|
105
|
+
const glyph = LABEL_GLYPHS[label[glyphIndex]!];
|
|
106
|
+
if (!glyph) continue;
|
|
107
|
+
for (let row = 0; row < glyph.length; row++) {
|
|
108
|
+
for (let column = 0; column < glyph[row]!.length; column++) {
|
|
109
|
+
if (glyph[row]![column] === '1') {
|
|
110
|
+
context.fillRect(
|
|
111
|
+
x + padding + glyphIndex * advance + column * scale,
|
|
112
|
+
y + padding + row * scale,
|
|
113
|
+
scale,
|
|
114
|
+
scale,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE BLENDER TWIN'S STALLS, measured by the page and carried to `vgai status`.
|
|
3
|
+
*
|
|
4
|
+
* WHY (measured 2026-09-16): one `blender-execute` held the Blender worker for
|
|
5
|
+
* over 1,800s and wedged the tab; the only report anyone got was a replay
|
|
6
|
+
* harness timing out. Separately, a 0.86s-per-call cost in a 225-mesh scene
|
|
7
|
+
* stretched under load into heartbeat timeouts that read as "tab present, did
|
|
8
|
+
* not respond". The product had a number for NEITHER. Owner ruling: a tab that
|
|
9
|
+
* stops answering is the product's defect regardless of what the machine is
|
|
10
|
+
* doing, and the product must surface it.
|
|
11
|
+
*
|
|
12
|
+
* TWO MEASUREMENTS, BOTH TAKEN FROM THE PAGE, because neither blocked party can
|
|
13
|
+
* report on itself:
|
|
14
|
+
* - the WORKER's call times come from `BlenderRuntime.metrics()`, which stamps
|
|
15
|
+
* each `postMessage` and its reply (`packages/blender-engine/browser/runtime.ts`);
|
|
16
|
+
* a blocked worker cannot send, but the side that posted still has a clock.
|
|
17
|
+
* - the MAIN THREAD's stalls come from the `longtask` PerformanceObserver kept
|
|
18
|
+
* here. (The sky work measured this ad hoc through a `window.__skyStall`
|
|
19
|
+
* global; this is that measurement as a proper field of the runtime host,
|
|
20
|
+
* with no global.)
|
|
21
|
+
*
|
|
22
|
+
* WHY A REGISTRY AND NOT A DIRECT IMPORT. The census sampler
|
|
23
|
+
* (`tab-census.ts`) must not pull the Blender stack — three.js, the display
|
|
24
|
+
* LUT contributions, the worker URL — into its import closure just to ask a
|
|
25
|
+
* question that is usually answered "no session". The lane publishes its meter
|
|
26
|
+
* here when it constructs its runtime, exactly the way a mounted game publishes
|
|
27
|
+
* its render-debug adapter to `authoring/active-systems`.
|
|
28
|
+
*
|
|
29
|
+
* THE LANE IS A PACKAGE AND REACHES THIS THROUGH THE DOOR (2026-09-19):
|
|
30
|
+
* `@volter/editor-blender` calls `host.session.reportWorkerCallMeter`
|
|
31
|
+
* (`editor-host-door.ts`), which is this module's `setBlenderCallMeter`. It
|
|
32
|
+
* used to import this file directly through `@editor/*` and also START the
|
|
33
|
+
* observer below, which is the half that was never the package's: the LONG
|
|
34
|
+
* TASKS are the host page's own, measured whether or not a lane is running,
|
|
35
|
+
* and a package cannot be the thing that decides the page is being watched.
|
|
36
|
+
* So publishing a meter is now what starts the watch.
|
|
37
|
+
*
|
|
38
|
+
* MEASUREMENT ONLY. Nothing here cancels, kills, or budgets a call, and no
|
|
39
|
+
* threshold is enforced anywhere: a budget is the owner's policy, and these are
|
|
40
|
+
* the numbers such a policy would have to be made from.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import type { EditorHostWorkerCallMetrics } from '@volter/editor-sdk/host';
|
|
44
|
+
import type { BlenderTabMetrics } from '@volter/editor-sdk/tab-census';
|
|
45
|
+
|
|
46
|
+
/** What the lane publishes: a read of the live call meter. The SHAPE is the
|
|
47
|
+
* SDK's (`host.session.reportWorkerCallMeter`), and structural, so this module
|
|
48
|
+
* does not import `@volter/blender-engine/browser` (and `BlenderRuntime` does not
|
|
49
|
+
* import the editor or the SDK). */
|
|
50
|
+
export type BlenderCallMeter = () => EditorHostWorkerCallMetrics;
|
|
51
|
+
|
|
52
|
+
let meter: BlenderCallMeter | null = null;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Publish (or retract, with null) the tab's Blender call meter, and start the
|
|
56
|
+
* page's own stall watch behind it.
|
|
57
|
+
*
|
|
58
|
+
* ONE OWNER: the lane's own runtime singleton — the same lifetime as the
|
|
59
|
+
* session itself. There is no per-document or per-play teardown that may
|
|
60
|
+
* retract it, because the session outlives both. ONE METER rides the census, so
|
|
61
|
+
* a second publisher replaces the first.
|
|
62
|
+
*/
|
|
63
|
+
export function setBlenderCallMeter(read: BlenderCallMeter | null): void {
|
|
64
|
+
meter = read;
|
|
65
|
+
// The observer's lifetime is the PAGE's (its history is what "during the
|
|
66
|
+
// last call" is answered from), so it is started, never stopped: a retracted
|
|
67
|
+
// meter simply stops the census from carrying a `blender` block at all.
|
|
68
|
+
if (read !== null) startStallObserver();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** A long task, kept only as long as it can still be attributed to a call. */
|
|
72
|
+
interface StallEntry {
|
|
73
|
+
readonly start: number;
|
|
74
|
+
readonly duration: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* How many recent long tasks to keep for the "during the last call" question.
|
|
79
|
+
*
|
|
80
|
+
* A long task is >50ms by spec, so this is minutes of a badly-stalled tab and
|
|
81
|
+
* nothing at all on a healthy one. Bounded because the observer runs for the
|
|
82
|
+
* life of the page.
|
|
83
|
+
*/
|
|
84
|
+
const STALL_HISTORY = 128;
|
|
85
|
+
|
|
86
|
+
let recent: StallEntry[] = [];
|
|
87
|
+
let longestTaskMs: number | null = null;
|
|
88
|
+
let tasksOver100ms = 0;
|
|
89
|
+
let observing = false;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Start watching the main thread. Idempotent, and silent where the Long Tasks
|
|
93
|
+
* API does not exist (Safari/Firefox): `longestTaskMs` then stays null, which
|
|
94
|
+
* says "nobody measured" rather than the falsehood a 0 would tell.
|
|
95
|
+
*
|
|
96
|
+
* Internal: {@link setBlenderCallMeter} is the one caller, so the page's watch
|
|
97
|
+
* begins the moment a lane has calls to attribute stalls to, and no package has
|
|
98
|
+
* to know the page is watched at all.
|
|
99
|
+
*/
|
|
100
|
+
function startStallObserver(): () => void {
|
|
101
|
+
if (observing) return () => {};
|
|
102
|
+
if (typeof PerformanceObserver === 'undefined') return () => {};
|
|
103
|
+
let observer: PerformanceObserver;
|
|
104
|
+
try {
|
|
105
|
+
observer = new PerformanceObserver((list) => {
|
|
106
|
+
for (const entry of list.getEntries()) {
|
|
107
|
+
const duration = entry.duration;
|
|
108
|
+
if (longestTaskMs === null || duration > longestTaskMs) longestTaskMs = duration;
|
|
109
|
+
if (duration >= 100) tasksOver100ms += 1;
|
|
110
|
+
recent.push({ start: entry.startTime, duration });
|
|
111
|
+
if (recent.length > STALL_HISTORY) recent = recent.slice(-STALL_HISTORY);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// `buffered` picks up the boot-time stalls that happened before this ran —
|
|
115
|
+
// a cold editor boot is one of the longest tasks a session ever has, and it
|
|
116
|
+
// is not measurable any other way.
|
|
117
|
+
observer.observe({ type: 'longtask', buffered: true });
|
|
118
|
+
} catch {
|
|
119
|
+
// An unsupported entry type throws here on some engines. Same answer as an
|
|
120
|
+
// absent API: no numbers, rather than invented ones.
|
|
121
|
+
return () => {};
|
|
122
|
+
}
|
|
123
|
+
observing = true;
|
|
124
|
+
return () => {
|
|
125
|
+
observer.disconnect();
|
|
126
|
+
observing = false;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The tab's Blender block, or null when this tab has no Blender session — the
|
|
132
|
+
* census then carries no `blender` key at all, because "absent" and "idle" are
|
|
133
|
+
* different claims.
|
|
134
|
+
*/
|
|
135
|
+
export function blenderTabMetrics(now: number = performance.now()): BlenderTabMetrics | null {
|
|
136
|
+
const read = meter;
|
|
137
|
+
if (read === null) return null;
|
|
138
|
+
const calls = read();
|
|
139
|
+
const window = calls.lastCallWindow;
|
|
140
|
+
let duringCall: number | null = null;
|
|
141
|
+
if (window !== null) {
|
|
142
|
+
const end = window.end ?? now;
|
|
143
|
+
for (const task of recent) {
|
|
144
|
+
// Overlap, not containment: the task that matters most is the one that
|
|
145
|
+
// was ALREADY running when the call was posted.
|
|
146
|
+
if (task.start + task.duration < window.start || task.start > end) continue;
|
|
147
|
+
if (duringCall === null || task.duration > duringCall) duringCall = task.duration;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
inFlightMs: calls.inFlightMs,
|
|
152
|
+
lastCallMs: calls.lastCallMs,
|
|
153
|
+
maxCallMs: calls.maxCallMs,
|
|
154
|
+
callsOver5s: calls.callsOver5s,
|
|
155
|
+
callsOver30s: calls.callsOver30s,
|
|
156
|
+
longestTaskMs: longestTaskMs === null ? null : Math.round(longestTaskMs),
|
|
157
|
+
tasksOver100ms,
|
|
158
|
+
lastCallLongestTaskMs: duringCall === null ? null : Math.round(duringCall),
|
|
159
|
+
wasmMemoryMB: calls.wasmMemoryMB,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Palette actions over discoverable component canvases, including closed tabs.
|
|
2
|
+
* The registry retains the board descriptor; opening does not create another board. */
|
|
3
|
+
|
|
4
|
+
import type { EditorAction } from './action-registry';
|
|
5
|
+
import {
|
|
6
|
+
availableWorkspaceDocuments,
|
|
7
|
+
openAvailableWorkspaceDocument,
|
|
8
|
+
} from './workspace-available-documents';
|
|
9
|
+
|
|
10
|
+
/** Commands stay available when a board's tab is closed. */
|
|
11
|
+
export function buildBoardOpenActions(): EditorAction[] {
|
|
12
|
+
return availableWorkspaceDocuments()
|
|
13
|
+
.filter((entry) => entry.category === 'canvas')
|
|
14
|
+
.map(({ descriptor }) => ({
|
|
15
|
+
id: `board:${descriptor.id}`,
|
|
16
|
+
label: `Open ${descriptor.title}`,
|
|
17
|
+
category: 'action',
|
|
18
|
+
execute: () => void openAvailableWorkspaceDocument(descriptor.id),
|
|
19
|
+
}));
|
|
20
|
+
}
|