@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,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONE breadth-first walk of an authoring hierarchy, and the reason it is not
|
|
3
|
+
* written inline four more times.
|
|
4
|
+
*
|
|
5
|
+
* WHAT THIS REPLACES, AND WHY IT IS A BUG AND NOT A STYLE PREFERENCE. Four
|
|
6
|
+
* modules carried the same hand-rolled BFS — `activeHierarchyRows`,
|
|
7
|
+
* `authoringDocumentSourcePath`, the Content panel's `hierarchyNodes`, the
|
|
8
|
+
* composite adapter's `childAssetEntries`, the Light Explorer's `lightNodes` —
|
|
9
|
+
* and every one of them drained its queue with `Array.prototype.shift()`.
|
|
10
|
+
* `shift` is not O(1) on a large array: V8 moves the remaining elements down,
|
|
11
|
+
* so a queue that grows to thousands makes the walk QUADRATIC in node count.
|
|
12
|
+
*
|
|
13
|
+
* Measured with the page's own `Profiler` on the scale harness's 20 000-node
|
|
14
|
+
* canvas world (2026-08-20), profiling the 1.4s window around one relayed
|
|
15
|
+
* `select`: **1471 of 1606 samples were inside `activeHierarchyRows`** — one
|
|
16
|
+
* deferred `collectState` refresh spending 1.4 seconds walking a tree whose
|
|
17
|
+
* every other reader answers in single-digit milliseconds. The study's
|
|
18
|
+
* superlinear growth ratios (canvas ×22-×55, three ×12-×42 from N=1000 to
|
|
19
|
+
* N=5000, where linear is ×5) are what a quadratic walk read through a
|
|
20
|
+
* linear-looking API produces.
|
|
21
|
+
*
|
|
22
|
+
* The cursor below is the whole fix. Nothing about the traversal ORDER,
|
|
23
|
+
* de-duplication, or the set of nodes visited changes — a caller gets exactly
|
|
24
|
+
* the sequence its own loop produced, and the dedup guard (first occurrence
|
|
25
|
+
* wins, a cycle terminates) is the one every copy already had.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { EditorNode, HierarchyProvider } from '@volter/editor-project/adapter';
|
|
29
|
+
|
|
30
|
+
/** The two members every walker here needs; deliberately not the whole provider. */
|
|
31
|
+
export type WalkableHierarchy = Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
32
|
+
|
|
33
|
+
export interface HierarchyWalkOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Extra children to enqueue behind `id`'s own — the Light Explorer's revealed
|
|
36
|
+
* internals, which are reachable through the adapter but not through
|
|
37
|
+
* `childIds`. Already-visited ids are dropped by the same guard as any other
|
|
38
|
+
* child, so an internal that is also a projected child is visited once.
|
|
39
|
+
*/
|
|
40
|
+
readonly extraChildren?: (id: string) => Iterable<EditorNode> | undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Visit every reachable node breadth-first, each id exactly once.
|
|
45
|
+
*
|
|
46
|
+
* Return `false` from `visit` to STOP the walk — the early-exit searches
|
|
47
|
+
* (`authoringDocumentSourcePath`) are why this takes a callback rather than
|
|
48
|
+
* only returning an array: a search that answers on the first row must not pay
|
|
49
|
+
* for a full walk of a 20 000-node tree first.
|
|
50
|
+
*/
|
|
51
|
+
export function forEachHierarchyNode(
|
|
52
|
+
hierarchy: WalkableHierarchy,
|
|
53
|
+
visit: (node: EditorNode) => boolean | void,
|
|
54
|
+
options: HierarchyWalkOptions = {},
|
|
55
|
+
): void {
|
|
56
|
+
const queue: EditorNode[] = [...hierarchy.roots()];
|
|
57
|
+
const seen = new Set<string>();
|
|
58
|
+
// A CURSOR, never `shift()`. See this file's header for the measurement.
|
|
59
|
+
for (let cursor = 0; cursor < queue.length; cursor += 1) {
|
|
60
|
+
const node = queue[cursor]!;
|
|
61
|
+
if (seen.has(node.id)) continue;
|
|
62
|
+
seen.add(node.id);
|
|
63
|
+
if (visit(node) === false) return;
|
|
64
|
+
for (const childId of node.childIds) {
|
|
65
|
+
const child = hierarchy.node(childId);
|
|
66
|
+
if (child) queue.push(child);
|
|
67
|
+
}
|
|
68
|
+
for (const extra of options.extraChildren?.(node.id) ?? []) queue.push(extra);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Every reachable node, breadth-first, de-duplicated by id. */
|
|
73
|
+
export function hierarchyNodesBreadthFirst(
|
|
74
|
+
hierarchy: WalkableHierarchy,
|
|
75
|
+
options: HierarchyWalkOptions = {},
|
|
76
|
+
): EditorNode[] {
|
|
77
|
+
const nodes: EditorNode[] = [];
|
|
78
|
+
forEachHierarchyNode(
|
|
79
|
+
hierarchy,
|
|
80
|
+
(node) => {
|
|
81
|
+
nodes.push(node);
|
|
82
|
+
},
|
|
83
|
+
options,
|
|
84
|
+
);
|
|
85
|
+
return nodes;
|
|
86
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HistoryCommands } from './history-commands';
|
|
2
|
+
import { connectHistoryLimitNotices } from './history-limit-notices';
|
|
3
|
+
import { HistoryService, type HistoryServiceOptions } from './history-service';
|
|
4
|
+
|
|
5
|
+
/** Owns project-lifetime editor services; disposed when EditorProvider unmounts. */
|
|
6
|
+
export class EditorSession {
|
|
7
|
+
readonly history: HistoryService;
|
|
8
|
+
readonly historyCommands: HistoryCommands;
|
|
9
|
+
private readonly releaseLimitNotices: () => void;
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
readonly projectIdentity: string,
|
|
13
|
+
historyOptions: HistoryServiceOptions = {},
|
|
14
|
+
) {
|
|
15
|
+
this.history = new HistoryService(historyOptions);
|
|
16
|
+
this.historyCommands = new HistoryCommands(this.history);
|
|
17
|
+
this.releaseLimitNotices = connectHistoryLimitNotices(this.history);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
dispose(): void {
|
|
21
|
+
this.releaseLimitNotices();
|
|
22
|
+
this.historyCommands.dispose();
|
|
23
|
+
this.history.dispose();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import type { HistoryService } from './history-service';
|
|
2
|
+
|
|
3
|
+
export interface HistoryCommandSnapshot {
|
|
4
|
+
readonly version: number;
|
|
5
|
+
readonly busy: boolean;
|
|
6
|
+
readonly canUndo: boolean;
|
|
7
|
+
readonly canRedo: boolean;
|
|
8
|
+
readonly undoLabel: string | null;
|
|
9
|
+
readonly redoLabel: string | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Shell command surface for the one project HistoryService timeline. */
|
|
13
|
+
export class HistoryCommands {
|
|
14
|
+
private tail: Promise<void> = Promise.resolve();
|
|
15
|
+
private readonly listeners = new Set<() => void>();
|
|
16
|
+
private pending = 0;
|
|
17
|
+
private version = 0;
|
|
18
|
+
private disposed = false;
|
|
19
|
+
private readonly idleWaiters = new Set<{
|
|
20
|
+
unsubscribe: () => void;
|
|
21
|
+
reject: (error: Error) => void;
|
|
22
|
+
}>();
|
|
23
|
+
private readonly unsubscribeHistory: () => void;
|
|
24
|
+
private snapshot: HistoryCommandSnapshot;
|
|
25
|
+
|
|
26
|
+
constructor(private readonly history: HistoryService) {
|
|
27
|
+
this.snapshot = this.buildSnapshot();
|
|
28
|
+
this.unsubscribeHistory = history.subscribe(this.notify);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
subscribe = (listener: () => void): (() => void) => {
|
|
32
|
+
if (this.disposed) return () => undefined;
|
|
33
|
+
this.listeners.add(listener);
|
|
34
|
+
return () => this.listeners.delete(listener);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
getSnapshot = (): HistoryCommandSnapshot => this.snapshot;
|
|
38
|
+
|
|
39
|
+
undo(): Promise<boolean> {
|
|
40
|
+
return this.enqueue(async () => {
|
|
41
|
+
await this.waitForServiceIdle();
|
|
42
|
+
this.assertNotDisposed();
|
|
43
|
+
return this.history.undo();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
redo(): Promise<boolean> {
|
|
48
|
+
return this.enqueue(async () => {
|
|
49
|
+
await this.waitForServiceIdle();
|
|
50
|
+
this.assertNotDisposed();
|
|
51
|
+
return this.history.redo();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
jumpTo(cursor: number): Promise<boolean> {
|
|
56
|
+
return this.enqueue(async () => {
|
|
57
|
+
await this.waitForServiceIdle();
|
|
58
|
+
this.assertNotDisposed();
|
|
59
|
+
return this.history.jumpTo(cursor);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
get canUndo(): boolean {
|
|
64
|
+
return this.snapshot.canUndo;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get canRedo(): boolean {
|
|
68
|
+
return this.snapshot.canRedo;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
dispose(): void {
|
|
72
|
+
if (this.disposed) return;
|
|
73
|
+
this.disposed = true;
|
|
74
|
+
this.unsubscribeHistory();
|
|
75
|
+
const error = new Error('History commands are disposed.');
|
|
76
|
+
for (const waiter of this.idleWaiters) {
|
|
77
|
+
waiter.unsubscribe();
|
|
78
|
+
waiter.reject(error);
|
|
79
|
+
}
|
|
80
|
+
this.idleWaiters.clear();
|
|
81
|
+
this.listeners.clear();
|
|
82
|
+
this.notify();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private enqueue(operation: () => Promise<boolean>): Promise<boolean> {
|
|
86
|
+
if (this.disposed) return Promise.reject(new Error('History commands are disposed.'));
|
|
87
|
+
this.pending++;
|
|
88
|
+
this.notify();
|
|
89
|
+
const run = () => {
|
|
90
|
+
if (this.disposed) throw new Error('History commands are disposed.');
|
|
91
|
+
return operation();
|
|
92
|
+
};
|
|
93
|
+
const result = this.tail.then(run, run);
|
|
94
|
+
this.tail = result.then(
|
|
95
|
+
() => undefined,
|
|
96
|
+
() => undefined,
|
|
97
|
+
);
|
|
98
|
+
return result.finally(() => {
|
|
99
|
+
this.pending--;
|
|
100
|
+
this.notify();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private assertNotDisposed(): void {
|
|
105
|
+
if (this.disposed) throw new Error('History commands are disposed.');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private waitForServiceIdle(): Promise<void> {
|
|
109
|
+
if (this.disposed) return Promise.reject(new Error('History commands are disposed.'));
|
|
110
|
+
if (!this.history.getSnapshot().busy) return Promise.resolve();
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const waiter: {
|
|
113
|
+
unsubscribe: () => void;
|
|
114
|
+
reject: (error: Error) => void;
|
|
115
|
+
} = { unsubscribe: () => undefined, reject };
|
|
116
|
+
const finish = () => {
|
|
117
|
+
waiter.unsubscribe();
|
|
118
|
+
this.idleWaiters.delete(waiter);
|
|
119
|
+
};
|
|
120
|
+
waiter.unsubscribe = this.history.subscribe(() => {
|
|
121
|
+
if (this.history.getSnapshot().busy) return;
|
|
122
|
+
finish();
|
|
123
|
+
resolve();
|
|
124
|
+
});
|
|
125
|
+
this.idleWaiters.add(waiter);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private notify = (): void => {
|
|
130
|
+
this.version++;
|
|
131
|
+
this.snapshot = this.buildSnapshot();
|
|
132
|
+
for (const listener of this.listeners) listener();
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
private buildSnapshot(): HistoryCommandSnapshot {
|
|
136
|
+
const current = this.history.getSnapshot();
|
|
137
|
+
const busy = this.pending > 0 || current.busy;
|
|
138
|
+
return {
|
|
139
|
+
version: this.version,
|
|
140
|
+
busy,
|
|
141
|
+
canUndo: !this.disposed && !busy && current.canUndo,
|
|
142
|
+
canRedo: !this.disposed && !busy && current.canRedo,
|
|
143
|
+
undoLabel: current.undoLabel,
|
|
144
|
+
redoLabel: current.redoLabel,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THERE IS ONE UNDO STACK AND IT IS VS CODE'S `IUndoRedoService`
|
|
3
|
+
* (ARCHITECTURE-CORE §The core is Code-OSS, "there is one Cmd+Z").
|
|
4
|
+
*
|
|
5
|
+
* Two directions cross this module:
|
|
6
|
+
*
|
|
7
|
+
* 1. **OUT** — every committed transaction is offered as an ELEMENT
|
|
8
|
+
* ({@link emitHistoryElement}), keyed on the document's own file, and the
|
|
9
|
+
* frame pushes it as an `IResourceUndoRedoElement` (or an
|
|
10
|
+
* `IWorkspaceUndoRedoElement` when it spans several). That is the one-stack
|
|
11
|
+
* property: a drag on `MainScene.tsx` and a keystroke in `MainScene.tsx`'s
|
|
12
|
+
* text editor undo in order from one list. Elements are recorded even
|
|
13
|
+
* before the delegate arrives, so a frame that mounts after the editor's
|
|
14
|
+
* first edits pushes what it missed, in order, rather than starting with a
|
|
15
|
+
* stack missing its beginning.
|
|
16
|
+
*
|
|
17
|
+
* 2. **IN** — the DELEGATE, the frame's own undo, because the editor has undo
|
|
18
|
+
* affordances that are not the keyboard: its Edit menu's "Undo <label>",
|
|
19
|
+
* the palette, `vgai eval`'s undo verb. Every one of them must reach the
|
|
20
|
+
* ONE stack. Without it the Edit menu still names the step (the label comes
|
|
21
|
+
* from the last recorded entry) while the click refuses, which is worse
|
|
22
|
+
* than no menu item at all.
|
|
23
|
+
*
|
|
24
|
+
* `history-service.ts` is the RECORDER: it still stages, applies and can
|
|
25
|
+
* revert ONE entry by id, and it no longer decides which entry is next.
|
|
26
|
+
*/
|
|
27
|
+
/** One recorded edit, as the owner of undo sees it. */
|
|
28
|
+
export interface HistoryElement {
|
|
29
|
+
/** The transaction's id — stable, and what {@link HistoryElement.undo}
|
|
30
|
+
* addresses back in the service. */
|
|
31
|
+
readonly id: string;
|
|
32
|
+
/** User-presentable, already trimmed ("Transform Selection"). */
|
|
33
|
+
readonly label: string;
|
|
34
|
+
/**
|
|
35
|
+
* The project-relative files this edit changed, in the order the
|
|
36
|
+
* transaction declared them. EMPTY for a session-scoped edit (a live
|
|
37
|
+
* journal), which is a fact the frame must decide about rather than a
|
|
38
|
+
* default it may paper over.
|
|
39
|
+
*/
|
|
40
|
+
readonly resources: readonly string[];
|
|
41
|
+
/**
|
|
42
|
+
* THE WORKSPACE DOCUMENT THIS EDIT WAS MADE IN, at the moment it was
|
|
43
|
+
* recorded — the id, or null when nothing was active.
|
|
44
|
+
*
|
|
45
|
+
* MEASURED, and the reason it exists (2026-09-19, the game template in the
|
|
46
|
+
* frame): a three root's document is NOT one file. Its adapter's own source
|
|
47
|
+
* path is the root entry `src/world.tsx`, while a gizmo drag on the scene's
|
|
48
|
+
* HeroBox instance writes `src/scenes/MainScene.tsx` — so "the document's
|
|
49
|
+
* resource" is a SET that grows with what the person edits, and asking the
|
|
50
|
+
* undo service about the entry file alone would find nothing to undo. The
|
|
51
|
+
* document id is the stable thing; WHICH FILE its next undo acts on is the
|
|
52
|
+
* newest element recorded in it, and this is what lets the frame ask that.
|
|
53
|
+
*
|
|
54
|
+
* It is also what keeps the stacks apart: a component view's elements carry
|
|
55
|
+
* that view's own document id, so a ⌘Z there can never reach the main
|
|
56
|
+
* scene's — which is the whole of "Component-view Ctrl+Z acts on the MAIN
|
|
57
|
+
* scene's history".
|
|
58
|
+
*/
|
|
59
|
+
readonly document: string | null;
|
|
60
|
+
/** Revert this one entry. `false` when the service refused (conflict,
|
|
61
|
+
* expired resource, blocked history) — never a silent no-op. */
|
|
62
|
+
undo(): Promise<boolean>;
|
|
63
|
+
redo(): Promise<boolean>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* WHAT THE FRAME DOES WHEN THE EDITOR'S OWN UNDO IS ASKED FOR.
|
|
68
|
+
*
|
|
69
|
+
* The keyboard door has `invoke` (frame → editor); this is the other
|
|
70
|
+
* direction, and it exists because the editor has undo AFFORDANCES that are
|
|
71
|
+
* not the keyboard: its Edit menu's "Undo <label>", the command palette, and
|
|
72
|
+
* `vgai eval`'s undo verb all call the same `edit.undo` action. Under the
|
|
73
|
+
* frame that action must reach the ONE stack, not walk a cursor nobody is
|
|
74
|
+
* driving — so the frame installs its own undo here and every one of those
|
|
75
|
+
* affordances keeps working, unchanged, against VS Code's service.
|
|
76
|
+
*
|
|
77
|
+
* MEASURED (2026-09-19, the game template in the frame): without this the Edit
|
|
78
|
+
* menu still read "Undo Set position" — the label comes from the last recorded
|
|
79
|
+
* entry — while the click refused. A menu that names the step it will not take
|
|
80
|
+
* is worse than one that is absent.
|
|
81
|
+
*/
|
|
82
|
+
export interface HistoryDelegate {
|
|
83
|
+
undo(): void;
|
|
84
|
+
redo(): void;
|
|
85
|
+
canUndo(): boolean;
|
|
86
|
+
canRedo(): boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let delegate: HistoryDelegate | null = null;
|
|
90
|
+
/** Who can say which document is active. The host door installs it (that is
|
|
91
|
+
* the module that already reads the workspace registry); without one every
|
|
92
|
+
* element is honestly document-less rather than wrongly attributed. */
|
|
93
|
+
let documentResolver: (() => string | null) | null = null;
|
|
94
|
+
const ownerListeners = new Set<() => void>();
|
|
95
|
+
const elementListeners = new Set<(element: HistoryElement) => void>();
|
|
96
|
+
/** Everything recorded while a delegate was installed, so a LATE subscriber
|
|
97
|
+
* (the bridge mounts after the editor's first edits are possible) can catch
|
|
98
|
+
* up rather than start with a stack that is missing its beginning. */
|
|
99
|
+
let recorded: HistoryElement[] = [];
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Is the delegate installed? False until it lands — later than the mount,
|
|
103
|
+
* because a `ServicesAccessor` is valid only for a command's synchronous part,
|
|
104
|
+
* so the contribution hands the delegate over after the editor is running.
|
|
105
|
+
* Until then the editor's own cursor answers, which is a real undo with
|
|
106
|
+
* nowhere else to go rather than a refusal.
|
|
107
|
+
*/
|
|
108
|
+
export function historyDelegateInstalled(): boolean {
|
|
109
|
+
return delegate !== null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Install the undo stack every gesture records into, or `null` to withdraw it
|
|
114
|
+
* — the stack is the workbench's, and a workbench that went away takes it (and
|
|
115
|
+
* the catch-up buffer of elements recorded for it) with it.
|
|
116
|
+
*/
|
|
117
|
+
export function setHistoryDelegate(next: HistoryDelegate | null): void {
|
|
118
|
+
if (delegate === next) return;
|
|
119
|
+
delegate = next;
|
|
120
|
+
if (!delegate) recorded = [];
|
|
121
|
+
for (const listener of ownerListeners) listener();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The installed delegate, or `null` before it lands. */
|
|
125
|
+
export function historyDelegate(): HistoryDelegate | null {
|
|
126
|
+
return delegate;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function subscribeHistoryDelegate(listener: () => void): () => void {
|
|
130
|
+
ownerListeners.add(listener);
|
|
131
|
+
return () => ownerListeners.delete(listener);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Offer one committed transaction to the frame. Recorded even before the
|
|
136
|
+
* delegate arrives — that buffer is what lets a frame that mounts after the
|
|
137
|
+
* editor's first edits push what it missed, in order, rather than start with a
|
|
138
|
+
* stack missing its beginning.
|
|
139
|
+
*/
|
|
140
|
+
export function emitHistoryElement(element: Omit<HistoryElement, 'document'>): void {
|
|
141
|
+
const stamped: HistoryElement = { ...element, document: documentResolver?.() ?? null };
|
|
142
|
+
recorded.push(stamped);
|
|
143
|
+
for (const listener of elementListeners) listener(stamped);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Install the reader of "which document is active". Called once by the host
|
|
147
|
+
* door at boot; passing null removes it (tests). */
|
|
148
|
+
export function setHistoryDocumentResolver(next: (() => string | null) | null): void {
|
|
149
|
+
documentResolver = next;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Every element recorded so far under frame ownership. The frame reads this
|
|
154
|
+
* once when it subscribes and pushes what it missed, in order.
|
|
155
|
+
*/
|
|
156
|
+
export function recordedHistoryElements(): readonly HistoryElement[] {
|
|
157
|
+
return recorded;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function onHistoryElement(listener: (element: HistoryElement) => void): () => void {
|
|
161
|
+
elementListeners.add(listener);
|
|
162
|
+
return () => elementListeners.delete(listener);
|
|
163
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Puts undo-depth pressure in front of the user through the editor's EXISTING
|
|
3
|
+
* non-fatal channels — no new notification system.
|
|
4
|
+
*
|
|
5
|
+
* - `showTransientHint` is the editor's one toast: it reaches a user whose
|
|
6
|
+
* History panel is closed, which is the normal case while editing.
|
|
7
|
+
* - `editorConsole.warn` is the durable log, so someone who has already lost
|
|
8
|
+
* undo depth can find out that it happened and why.
|
|
9
|
+
*
|
|
10
|
+
* The same two snapshot fields are also readable through the history door;
|
|
11
|
+
* this module is only the "you are not looking at that panel" half.
|
|
12
|
+
*
|
|
13
|
+
* Evictions are logged but deliberately NOT hinted: once a budget is at its
|
|
14
|
+
* ceiling every further commit evicts, and a toast per commit is noise. The
|
|
15
|
+
* eviction message carries no running total precisely so `editorConsole`'s
|
|
16
|
+
* consecutive-duplicate folding collapses the repeats into one counted entry.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { editorConsole } from '../editor-console';
|
|
20
|
+
import { showTransientHint } from '../transient-hint';
|
|
21
|
+
import type { HistoryService } from './history-service';
|
|
22
|
+
import type { HistoryEviction, HistoryLimitWarning } from './types';
|
|
23
|
+
|
|
24
|
+
export function connectHistoryLimitNotices(history: HistoryService): () => void {
|
|
25
|
+
let seenWarning: HistoryLimitWarning | null = history.getSnapshot().limitWarning;
|
|
26
|
+
let seenEviction: HistoryEviction | null = history.getSnapshot().lastEviction;
|
|
27
|
+
return history.subscribe(() => {
|
|
28
|
+
const { limitWarning, lastEviction } = history.getSnapshot();
|
|
29
|
+
if (limitWarning !== seenWarning) {
|
|
30
|
+
seenWarning = limitWarning;
|
|
31
|
+
// A still-standing warning keeps its object identity, so this fires once
|
|
32
|
+
// per crossing rather than once per commit spent over the threshold.
|
|
33
|
+
if (limitWarning) {
|
|
34
|
+
showTransientHint(limitWarning.message);
|
|
35
|
+
editorConsole.warn(limitWarning.message, 'history');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (lastEviction !== seenEviction) {
|
|
39
|
+
seenEviction = lastEviction;
|
|
40
|
+
if (lastEviction) editorConsole.warn(lastEviction.message, 'history');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|