@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,20 @@
|
|
|
1
|
+
import type { EditorCameraState } from '@volter/editor-sdk';
|
|
2
|
+
|
|
3
|
+
export const DOCUMENT_PREVIEW_WIDTH = 320;
|
|
4
|
+
export const DOCUMENT_PREVIEW_HEIGHT = 180;
|
|
5
|
+
export const DOCUMENT_PREVIEW_RECIPE = 'document-preview-v4';
|
|
6
|
+
|
|
7
|
+
export interface DocumentPreviewCaptureRequest {
|
|
8
|
+
readonly width: number;
|
|
9
|
+
readonly height: number;
|
|
10
|
+
readonly camera?: EditorCameraState | undefined;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** The document owner supplies pixels and dependency identity; the host owns
|
|
14
|
+
* scheduling, disk cache, visibility priority, and tile state. */
|
|
15
|
+
export interface DocumentPreviewSource {
|
|
16
|
+
/** Stable identity for source and imported-dependency state. */
|
|
17
|
+
revision(): string;
|
|
18
|
+
subscribe(listener: () => void): () => void;
|
|
19
|
+
capture(request: DocumentPreviewCaptureRequest): Promise<string>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isEditorPresentationActive,
|
|
3
|
+
subscribeEditorPresentationActivity,
|
|
4
|
+
} from './editor-presentation-activity';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The frame-loop + renderer lifetime for one Object3D document viewport.
|
|
8
|
+
*
|
|
9
|
+
* Deactivate ≠ dispose.
|
|
10
|
+
*
|
|
11
|
+
* The layout host keeps every open document mounted. A tab
|
|
12
|
+
* flip only flips `active`. Destroying the `WebGLRenderer` on deactivate is
|
|
13
|
+
* a full context teardown + recreate on the next flip — measured live on
|
|
14
|
+
* `examples/third-person` at 4296 ms for the first 3D-board activation and
|
|
15
|
+
* 4015 ms for the second (doctor `--timings-only`). Pause the RAF loop
|
|
16
|
+
* instead; the canvas keeps its last frame and the program cache / IBL bake
|
|
17
|
+
* survive. Real document CLOSE unmounts the host, and {@link dispose} is the
|
|
18
|
+
* one path that frees the context.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export class DocumentRendererSession {
|
|
22
|
+
private rafId = 0;
|
|
23
|
+
private running = false;
|
|
24
|
+
private disposed = false;
|
|
25
|
+
private active = false;
|
|
26
|
+
private readonly unsubscribeActivity: () => void;
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
private readonly frame: (time: number, resumed: boolean) => void,
|
|
30
|
+
private readonly releaseRenderer: () => void,
|
|
31
|
+
) {
|
|
32
|
+
this.unsubscribeActivity = subscribeEditorPresentationActivity(() => this.syncActivity());
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get isDisposed(): boolean {
|
|
36
|
+
return this.disposed;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get isRunning(): boolean {
|
|
40
|
+
return this.running;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Tab flip. `false` pauses the loop and keeps the GPU surface. `true`
|
|
45
|
+
* resumes it. Neither constructs nor disposes a renderer.
|
|
46
|
+
*/
|
|
47
|
+
setActive(active: boolean): void {
|
|
48
|
+
if (this.disposed) return;
|
|
49
|
+
this.active = active;
|
|
50
|
+
this.syncActivity();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private syncActivity(): void {
|
|
54
|
+
if (this.active && isEditorPresentationActive()) this.start();
|
|
55
|
+
else this.stop();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Resizing clears the drawing buffer. Repaint immediately while visible;
|
|
59
|
+
* a suspended document redraws as soon as its presentation resumes. */
|
|
60
|
+
redraw(): void {
|
|
61
|
+
if (this.running && !this.disposed && isEditorPresentationActive()) {
|
|
62
|
+
this.guardedFrame(performance.now());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The one teardown path — document CLOSE / host unmount. */
|
|
67
|
+
dispose(): void {
|
|
68
|
+
this.stop();
|
|
69
|
+
if (this.disposed) return;
|
|
70
|
+
this.disposed = true;
|
|
71
|
+
this.unsubscribeActivity();
|
|
72
|
+
this.releaseRenderer();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private start(): void {
|
|
76
|
+
if (this.disposed || this.running) return;
|
|
77
|
+
this.running = true;
|
|
78
|
+
// A tab activation is a direct request to present this document. Draw one
|
|
79
|
+
// frame in the activation turn, then join the browser's animation clock.
|
|
80
|
+
// Waiting for the first rAF made a visible tab inherit Chromium's former
|
|
81
|
+
// background cadence (the 1 Hz signature) even when the page itself was
|
|
82
|
+
// visible; users saw the old canvas for that whole interval. Subsequent
|
|
83
|
+
// presentation remains ordinary rAF-driven work.
|
|
84
|
+
// Let content reset its delta baseline without advancing by the hidden interval.
|
|
85
|
+
this.guardedFrame(performance.now(), true);
|
|
86
|
+
if (!this.running || this.disposed) return;
|
|
87
|
+
this.rafId = requestAnimationFrame(this.tick);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The last frame's failure text, so a persistent fault narrates ONCE
|
|
91
|
+
* rather than sixty times a second, and a recovered loop resets. */
|
|
92
|
+
private lastFrameFailure: string | null = null;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* One frame, and the loop survives it. A throw out of a rAF callback used
|
|
96
|
+
* to be the end of this document's presentation: the exception left
|
|
97
|
+
* `tick` before it rescheduled, so the stage froze on whatever it last
|
|
98
|
+
* drew and nothing said why. Measured (2026-09-04, the mesh document's
|
|
99
|
+
* session swap): three's "Cannot read properties of null (reading
|
|
100
|
+
* 'precision')" from one frame drawn between a disposed overlay and the
|
|
101
|
+
* scene swap killed the stage for the rest of the session. The frame's
|
|
102
|
+
* failure goes to the console WITH its stack — that is what reaches the
|
|
103
|
+
* doors — and the next frame is drawn, because a transient race recovers
|
|
104
|
+
* on its own and a persistent fault is still better shown than frozen.
|
|
105
|
+
*/
|
|
106
|
+
private guardedFrame(time: number, resumed = false): void {
|
|
107
|
+
try {
|
|
108
|
+
this.frame(time, resumed);
|
|
109
|
+
this.lastFrameFailure = null;
|
|
110
|
+
} catch (caught) {
|
|
111
|
+
const text = caught instanceof Error ? caught.message : String(caught);
|
|
112
|
+
if (text !== this.lastFrameFailure) {
|
|
113
|
+
this.lastFrameFailure = text;
|
|
114
|
+
// biome-ignore lint/suspicious/noConsole: a document frame that threw must narrate itself
|
|
115
|
+
console.error('[document renderer] a frame threw; the loop continues:', caught);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private stop(): void {
|
|
121
|
+
this.running = false;
|
|
122
|
+
if (this.rafId !== 0) {
|
|
123
|
+
cancelAnimationFrame(this.rafId);
|
|
124
|
+
this.rafId = 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private readonly tick = (time: number): void => {
|
|
129
|
+
if (!this.running || this.disposed) return;
|
|
130
|
+
if (!isEditorPresentationActive()) {
|
|
131
|
+
this.stop();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.guardedFrame(time);
|
|
135
|
+
if (!this.running || this.disposed) return;
|
|
136
|
+
this.rafId = requestAnimationFrame(this.tick);
|
|
137
|
+
};
|
|
138
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editor server SDK.
|
|
3
|
+
*
|
|
4
|
+
* All frontend code should use this module instead of calling fetch()/EventSource
|
|
5
|
+
* with raw endpoint URLs.
|
|
6
|
+
*
|
|
7
|
+
* The project's `public/` file operations (`listAssets`, `saveFile`) are routed
|
|
8
|
+
* through the backend-agnostic `StorageBackend` (see ./storage): `HttpStorage`
|
|
9
|
+
* over the same `/__editor/*` routes, wrapped by the frame's file door once
|
|
10
|
+
* that lands. The remaining endpoints are NOT `public/` file ops — the
|
|
11
|
+
* launcher's own reads, the play-log writes, the asset library, and the
|
|
12
|
+
* user-triggered actions (`createProject`, `browseFolder`,
|
|
13
|
+
* `openProjectOnServer`, `revealInFinder`, `startExport`,
|
|
14
|
+
* `downloadOnlineAsset`).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type { EditorEventSource } from './editor-presence';
|
|
18
|
+
export { connectEvents, connectTabPresence, reportTabRoute } from './editor-presence';
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// The families. This path stays the ONE import site for the editor server SDK
|
|
22
|
+
// — every name below was exported from here before the split and still is, so
|
|
23
|
+
// no caller changed. What changed is that a reader looking for "how does the
|
|
24
|
+
// editor talk to the worktree board" now opens `api/worktrees.ts` instead of
|
|
25
|
+
// scrolling an 1,900-line file.
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
// `./api/agents` is DELIBERATELY NOT RE-EXPORTED HERE (phase 1 unit 22). It is
|
|
29
|
+
// the page-side client for the coding-harness routes, and `@vgai/agents`'s
|
|
30
|
+
// modules have always imported `@editor/api/agents` directly rather than
|
|
31
|
+
// through this barrel — so the family's claim above ("every name was exported
|
|
32
|
+
// from here before the split and still is") was already not how its one
|
|
33
|
+
// consumer reads it. What the row bought instead was a static edge from every
|
|
34
|
+
// importer of this file into the agents lane's whole wire, which is what held
|
|
35
|
+
// four files in the editor's eager closure after the last host caller left.
|
|
36
|
+
// The rule is unit 13's, found on the view presenter: a door every package
|
|
37
|
+
// calls must not carry every lane's implementation.
|
|
38
|
+
export * from './api/assets';
|
|
39
|
+
export * from './api/build';
|
|
40
|
+
export * from './api/logs';
|
|
41
|
+
export * from './api/project-identity';
|
|
42
|
+
export * from './api/project-open';
|
|
43
|
+
export * from './api/project-source';
|
|
44
|
+
export * from './api/project-state';
|
|
45
|
+
export * from './api/relay';
|
|
46
|
+
export * from './api/worktrees';
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE CHROME-CAPTURE DOOR: photograph the editor PAGE — every panel, every
|
|
3
|
+
* tab strip, the Inspector, the viewport inside it — as the person is seeing
|
|
4
|
+
* it. `vgai screenshot editor` / `editor.captureEditorChrome()`.
|
|
5
|
+
*
|
|
6
|
+
* WHY IT EXISTS. Every other capture door photographs a SUBJECT: the running
|
|
7
|
+
* game, the active document, the Scene viewport, a model. None photographs
|
|
8
|
+
* the editor itself, so a contribution author — human or agent — could not
|
|
9
|
+
* run the sighted render→look→revise loop on a panel through the product, and
|
|
10
|
+
* every dev-surface wave so far was built blind, on DOM probes (WORK.md, "The
|
|
11
|
+
* chrome-capture door"). A skin, a workspace arrangement or a new region
|
|
12
|
+
* cannot be judged at all without this.
|
|
13
|
+
*
|
|
14
|
+
* HOW. The same compositor the active-document door uses
|
|
15
|
+
* (`composite-screenshot.ts`), pointed at `#editor-chrome-root` — the ONE
|
|
16
|
+
* theme scope (ARCHITECTURE-CORE §Editor chrome) — with `includeDocumentStyles`
|
|
17
|
+
* on, so the design system's stylesheet rides the clone and chrome
|
|
18
|
+
* photographs as it appears. Three kinds of canvas sit inside that root and
|
|
19
|
+
* only one of them can be read late:
|
|
20
|
+
*
|
|
21
|
+
* - the Scene viewport's canvas has no `preserveDrawingBuffer`; its pixels
|
|
22
|
+
* come from its registered presenter, including camera preview and helpers;
|
|
23
|
+
* the store's offscreen render is the fallback before registration;
|
|
24
|
+
* - an Asset Lab 3D document's canvas is the same story through its
|
|
25
|
+
* session (`Object3DDocumentSession.captureImage`);
|
|
26
|
+
* - a live game or Pixi canvas goes through the one `canvasFrame` seam
|
|
27
|
+
* every pixel door shares (`live-canvas-frame.ts`).
|
|
28
|
+
*
|
|
29
|
+
* Everything else reads directly. A canvas this module cannot recognise or
|
|
30
|
+
* re-render photographs as the browser hands it back — possibly black — and
|
|
31
|
+
* `layers.canvases` says how many were drawn, so a reader can tell a black
|
|
32
|
+
* panel from a missing one.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { EditorView } from '@volter/editor-sdk';
|
|
36
|
+
import { allObject3DDocumentSessions } from './authoring/object3d-document-session-registry';
|
|
37
|
+
import { type CompositeCapture, capturePlayComposite } from './composite-screenshot';
|
|
38
|
+
import { currentEditorView } from './editor-current-view';
|
|
39
|
+
import type { EditorShellStore } from './editor-shell-store';
|
|
40
|
+
import { liveCanvasFrame } from './live-canvas-frame';
|
|
41
|
+
|
|
42
|
+
export const EDITOR_CHROME_ROOT_ID = 'editor-chrome-root';
|
|
43
|
+
|
|
44
|
+
export interface EditorChromeCapture extends CompositeCapture {
|
|
45
|
+
/** The view the page was showing when the frame was taken. */
|
|
46
|
+
view: EditorView;
|
|
47
|
+
/** The frame's own size, in OUTPUT pixels. */
|
|
48
|
+
size: { width: number; height: number };
|
|
49
|
+
/** Output pixels per CSS pixel — what one pixel of {@link size} is. A
|
|
50
|
+
* reference frame captured on a 2x display is judged against `scale: 2`. */
|
|
51
|
+
scale: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface EditorChromeCaptureOptions {
|
|
55
|
+
/**
|
|
56
|
+
* Output pixels per CSS pixel. Defaults to the page's own
|
|
57
|
+
* `devicePixelRatio`, so the default frame is the pixels the display holds.
|
|
58
|
+
*
|
|
59
|
+
* A stroke weight, a 1 px border or a glyph edge cannot be judged below the
|
|
60
|
+
* resolution it is being compared against — on a DPR-1 monitor the default
|
|
61
|
+
* is 1 and a reference captured at 2x is only comparable if this is asked
|
|
62
|
+
* for explicitly. It scales the DOM leg by rasterizing it through a viewBox
|
|
63
|
+
* (crisp at any factor); canvases are limited by their own backing store and
|
|
64
|
+
* are upscaled past it.
|
|
65
|
+
*/
|
|
66
|
+
scale?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** A data URL as something `drawImage` accepts. */
|
|
70
|
+
async function imageOf(dataUrl: string): Promise<HTMLImageElement> {
|
|
71
|
+
const image = new Image();
|
|
72
|
+
image.src = dataUrl;
|
|
73
|
+
await image.decode();
|
|
74
|
+
return image;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Same-frame pixels for every canvas the page holds — the seam described in
|
|
79
|
+
* the header. `null` means "read the canvas directly".
|
|
80
|
+
*/
|
|
81
|
+
function chromeCanvasFrame(store: EditorShellStore, scale: number) {
|
|
82
|
+
return async (canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> => {
|
|
83
|
+
// The re-render fallbacks below draw at a size WE choose, so they are asked
|
|
84
|
+
// for the frame's own scale — a 2x capture whose viewport had to be
|
|
85
|
+
// re-rendered gets a 2x render, not a 1x one stretched. The presented-frame
|
|
86
|
+
// paths above them hand back the live buffer at its own backing-store size,
|
|
87
|
+
// which is the ceiling those legs have.
|
|
88
|
+
const size = {
|
|
89
|
+
width: Math.max(1, Math.round(canvas.clientWidth * scale)),
|
|
90
|
+
height: Math.max(1, Math.round(canvas.clientHeight * scale)),
|
|
91
|
+
};
|
|
92
|
+
if (store.viewportCanvas() === canvas) {
|
|
93
|
+
const presented = await liveCanvasFrame(canvas);
|
|
94
|
+
if (presented) return presented;
|
|
95
|
+
const dataUrl = store.captureViewportImage(size);
|
|
96
|
+
return dataUrl ? imageOf(dataUrl) : null;
|
|
97
|
+
}
|
|
98
|
+
for (const session of allObject3DDocumentSessions()) {
|
|
99
|
+
if (session.renderer.domElement !== canvas) continue;
|
|
100
|
+
// The PRESENTED frame first: everything the host drew over the
|
|
101
|
+
// document's own render — the compass above all — lives only in the
|
|
102
|
+
// default framebuffer, and `captureImage` is an offscreen re-render of
|
|
103
|
+
// the subject alone (see `requestPresentedFrame`). Falling back to it
|
|
104
|
+
// keeps a stopped loop photographable.
|
|
105
|
+
const presented = await session.requestPresentedFrame();
|
|
106
|
+
if (presented) return presented;
|
|
107
|
+
const dataUrl = session.captureImage(size);
|
|
108
|
+
return dataUrl ? imageOf(dataUrl) : null;
|
|
109
|
+
}
|
|
110
|
+
return liveCanvasFrame(canvas);
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Photograph the editor page. Throws, by name, when the chrome root is not
|
|
115
|
+
* mounted — a page that is not the editor has nothing to photograph. */
|
|
116
|
+
export async function captureEditorChrome(
|
|
117
|
+
store: EditorShellStore,
|
|
118
|
+
options?: EditorChromeCaptureOptions,
|
|
119
|
+
): Promise<EditorChromeCapture> {
|
|
120
|
+
const root = document.getElementById(EDITOR_CHROME_ROOT_ID);
|
|
121
|
+
if (!root) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
`The editor chrome root (#${EDITOR_CHROME_ROOT_ID}) is not mounted, so there is no editor ` +
|
|
124
|
+
'page to photograph.',
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
const scale = options?.scale ?? window.devicePixelRatio ?? 1;
|
|
128
|
+
const rect = root.getBoundingClientRect();
|
|
129
|
+
const size = {
|
|
130
|
+
width: Math.max(1, Math.round(rect.width * scale)),
|
|
131
|
+
height: Math.max(1, Math.round(rect.height * scale)),
|
|
132
|
+
};
|
|
133
|
+
const composite = await capturePlayComposite(root, {
|
|
134
|
+
canvasFrame: chromeCanvasFrame(store, scale),
|
|
135
|
+
includeDocumentStyles: true,
|
|
136
|
+
size,
|
|
137
|
+
});
|
|
138
|
+
return { ...composite, view: currentEditorView(store), size, scale };
|
|
139
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE EDITOR'S COMMANDS: the ONE table of what its palette actions ARE, and
|
|
3
|
+
* the ONE door to running a command by id.
|
|
4
|
+
*
|
|
5
|
+
* 1. **The ACTION TABLE.** What the palette lists, published as DATA so the
|
|
6
|
+
* frame can register one VS Code command plus one
|
|
7
|
+
* `MenuId.CommandPalette` item per entry — which is what makes ⌘⇧P list
|
|
8
|
+
* OUR actions with OUR labels. `components/palette-action-publisher.tsx`
|
|
9
|
+
* is its one author.
|
|
10
|
+
*
|
|
11
|
+
* ## Why this is published at RUNTIME and the keymap is GENERATED
|
|
12
|
+
*
|
|
13
|
+
* The chords are a generated built-in extension because a keybinding rule
|
|
14
|
+
* registered after `workbench.common.main.ts` has loaded is INERT, and the
|
|
15
|
+
* chords are package data known at build time. Neither half holds here,
|
|
16
|
+
* measured 2026-09-19:
|
|
17
|
+
*
|
|
18
|
+
* - A MENU ITEM registered late is not inert. `MenuRegistry` fires
|
|
19
|
+
* `onDidChangeMenu` and the palette rebuilds its picks on every open
|
|
20
|
+
* (`commandsQuickAccess.ts`'s `getGlobalCommandPicks`), which is how
|
|
21
|
+
* every extension-contributed command reaches ⌘⇧P.
|
|
22
|
+
* - The table is not static. Its ids are a different namespace from the
|
|
23
|
+
* keymap's (`editor.undo` here, `edit.undo` there), several labels are
|
|
24
|
+
* templated per selection (`View Through <camera name>`), and the
|
|
25
|
+
* entity, tool-document, board-open and package-contributed (`tool:*`)
|
|
26
|
+
* entries do not exist until something mounts or a package loads.
|
|
27
|
+
*
|
|
28
|
+
* So the generator is left alone and the frame reads a live table instead.
|
|
29
|
+
*
|
|
30
|
+
* 2. **`editor.command(id, args)`**, the door a product surface drives a VIEW
|
|
31
|
+
* through. `editor.document.*` reaches only the ACTIVE CENTRE DOCUMENT by
|
|
32
|
+
* its own contract, so every drawer utility — Console, Profiler, Network,
|
|
33
|
+
* the node editor — was undrivable until this existed; a walk looking for
|
|
34
|
+
* one tried `editor.view`, `editor.frame` and `editor.present` in turn and
|
|
35
|
+
* was refused by each, because there was no door.
|
|
36
|
+
*
|
|
37
|
+
* It is the frame's `ICommandService.executeCommand`, installed by the
|
|
38
|
+
* contribution, so ANY workbench command id is reachable — ours and
|
|
39
|
+
* upstream's alike. That is the point of running inside a workbench.
|
|
40
|
+
* Before the executor lands, a `vgai.<view>.<verb>` id still resolves off
|
|
41
|
+
* `@volter/editor-sdk/views` — the same table the frame's command would have
|
|
42
|
+
* called — and any OTHER id is refused BY NAME, because a silent nothing
|
|
43
|
+
* is how an agent concludes a command "did not work".
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* How the frame opens ITS palette when one of our own actions asks for one
|
|
47
|
+
* (`view.commandPalette`, whose chord U6 left unbound under the frame because
|
|
48
|
+
* ⌘K is VS Code's chord prefix). Installed by the contribution after the
|
|
49
|
+
* bridge has mounted; absent, the action is refused rather than silently
|
|
50
|
+
* toggling a palette nobody renders.
|
|
51
|
+
*/
|
|
52
|
+
let paletteOpener: (() => void) | null = null;
|
|
53
|
+
|
|
54
|
+
export function setPaletteOpener(open: (() => void) | null): void {
|
|
55
|
+
paletteOpener = open;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Open the command palette. `false` before the opener lands — the window
|
|
59
|
+
* between the bridge mounting and the contribution's `setPaletteOpener`. */
|
|
60
|
+
export function openCommandPalette(): boolean {
|
|
61
|
+
if (!paletteOpener) return false;
|
|
62
|
+
paletteOpener();
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface PaletteActionEntry {
|
|
67
|
+
readonly id: string;
|
|
68
|
+
readonly label: string;
|
|
69
|
+
/** `action` | `entity` | `asset`, as `action-registry.ts` spells it. */
|
|
70
|
+
readonly category: string;
|
|
71
|
+
readonly run: () => void | Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let entries: readonly PaletteActionEntry[] = [];
|
|
75
|
+
let entriesVersion = 0;
|
|
76
|
+
const entryListeners = new Set<() => void>();
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Publish the table the palette would list. Called from the editor's own
|
|
80
|
+
* tree (`components/palette-action-publisher.tsx`) so the hooks that build it
|
|
81
|
+
* — the shell store, the history commands, the contributed-chrome version —
|
|
82
|
+
* are read exactly where React reads them, rather than reached for out of
|
|
83
|
+
* band. The array is replaced, never merged: the builders return the whole
|
|
84
|
+
* live set each time.
|
|
85
|
+
*/
|
|
86
|
+
export function publishPaletteActions(next: readonly PaletteActionEntry[]): void {
|
|
87
|
+
entries = next;
|
|
88
|
+
entriesVersion++;
|
|
89
|
+
for (const listener of entryListeners) listener();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Every palette action the editor currently offers. */
|
|
93
|
+
export function paletteActions(): readonly PaletteActionEntry[] {
|
|
94
|
+
return entries;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function paletteActionsVersion(): number {
|
|
98
|
+
return entriesVersion;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function subscribePaletteActions(listener: () => void): () => void {
|
|
102
|
+
entryListeners.add(listener);
|
|
103
|
+
return () => entryListeners.delete(listener);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Run one palette action by id — the door the workbench's own command calls.
|
|
108
|
+
* `false` means the editor no longer has that entry (a selection changed, a
|
|
109
|
+
* tool document closed, a package unloaded), which the caller reports by name
|
|
110
|
+
* rather than swallowing.
|
|
111
|
+
*/
|
|
112
|
+
export function invokePaletteAction(id: string): boolean {
|
|
113
|
+
const entry = entries.find((candidate) => candidate.id === id);
|
|
114
|
+
if (!entry) return false;
|
|
115
|
+
void entry.run();
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The workbench's command service, handed over by the contribution once it has
|
|
121
|
+
* one. Installed AFTER the bridge mounts, for the reason every other seam
|
|
122
|
+
* here states: a `ServicesAccessor` is valid only inside the synchronous part
|
|
123
|
+
* of a command's invocation.
|
|
124
|
+
*/
|
|
125
|
+
let commandExecutor: ((id: string, args?: unknown) => unknown) | null = null;
|
|
126
|
+
|
|
127
|
+
export function setCommandExecutor(run: ((id: string, args?: unknown) => unknown) | null): void {
|
|
128
|
+
commandExecutor = run;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The `vgai.<view>.<verb>` shape the views registry keys, and the ONLY id
|
|
132
|
+
* shape standalone can answer. */
|
|
133
|
+
const VIEW_VERB_COMMAND = /^vgai\.([^.]+)\.(.+)$/;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Run a command by id — `editor.command(id, args)`'s one implementation.
|
|
137
|
+
*
|
|
138
|
+
* The workbench's `ICommandService` when it has landed; before that, the
|
|
139
|
+
* views registry, reached through a DYNAMIC import so a module only a
|
|
140
|
+
* `vgai eval` reaches never joins the editor entry's static closure.
|
|
141
|
+
*
|
|
142
|
+
* A refusal is always BY NAME. `invokeViewVerb` names the view's whole
|
|
143
|
+
* vocabulary when it does not carry the verb (that refusal is the VIEW's, and
|
|
144
|
+
* moving it here would put it somewhere the view does not draw), and an id
|
|
145
|
+
* that is not a view verb at all is refused with the shape that would have
|
|
146
|
+
* worked.
|
|
147
|
+
*/
|
|
148
|
+
export async function executeCommand(id: string, args?: unknown): Promise<unknown> {
|
|
149
|
+
if (commandExecutor) return await commandExecutor(id, args);
|
|
150
|
+
const parts = VIEW_VERB_COMMAND.exec(id);
|
|
151
|
+
if (!parts) {
|
|
152
|
+
throw new Error(
|
|
153
|
+
`No command "${id}". Without the Code-OSS frame there is no command service, so the ` +
|
|
154
|
+
"only commands this editor answers are a view's own verbs, spelled " +
|
|
155
|
+
'vgai.<view>.<verb> (for example vgai.blender-node-view.view-all).',
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
const { invokeViewVerb } = await import('@volter/editor-sdk/views');
|
|
159
|
+
return invokeViewVerb(
|
|
160
|
+
parts[1] as string,
|
|
161
|
+
parts[2] as string,
|
|
162
|
+
args as Record<string, unknown> | undefined,
|
|
163
|
+
);
|
|
164
|
+
}
|