@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,114 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { ProjectModuleLoader } from './project-tools';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Makes a live editor session see dependencies installed UNDER it.
|
|
7
|
+
*
|
|
8
|
+
* The problem, measured: `vgai add mesh` copies `src/lib/mesh/**` in and runs
|
|
9
|
+
* `npm install three-bvh-csg …`, but a session that is already running keeps
|
|
10
|
+
* failing every Node module-lane call with
|
|
11
|
+
* `Cannot find module 'three-bvh-csg' imported from …/src/lib/mesh/modifiers.ts`
|
|
12
|
+
* — while `require.resolve` from the very same project directory succeeds.
|
|
13
|
+
*
|
|
14
|
+
* The mechanism is a cached FAILURE, not a cached resolution. Vite's SSR
|
|
15
|
+
* module runner memoises a module's load promise on its module-graph node and
|
|
16
|
+
* never clears it when that promise REJECTS
|
|
17
|
+
* (`vite/dist/node/module-runner.js`, `cachedRequest`: `mod.promise = promise`
|
|
18
|
+
* inside a `try`/`finally` that only flips `evaluated`). So the first load of
|
|
19
|
+
* `modifiers.ts` attempted before the package existed poisons that module for
|
|
20
|
+
* the life of the process, and every later call replays the identical
|
|
21
|
+
* rejection — including calls from brand-new files that merely import it. The
|
|
22
|
+
* poison is per-module, not per-package: a fresh module importing
|
|
23
|
+
* `three-bvh-csg` DIRECTLY resolves it fine at the same moment.
|
|
24
|
+
*
|
|
25
|
+
* That also explains the two things the symptom report noted. Editing the
|
|
26
|
+
* importing file "fixes" it, because an HMR invalidation drops the module
|
|
27
|
+
* node together with its rejected promise. And `vgai restart` does not, because
|
|
28
|
+
* it re-issues `play` to the browser and never touches this Node process.
|
|
29
|
+
*
|
|
30
|
+
* The fix is to perform that same invalidation when the project's dependency
|
|
31
|
+
* set moves. This is checked ON USE rather than from a file watcher on
|
|
32
|
+
* purpose: `vgai add` installs and returns, and the next thing a caller does
|
|
33
|
+
* is run the tool. A debounced watcher races that window; a fingerprint read
|
|
34
|
+
* at load time cannot.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Files whose contents define which packages a project has. `package.json`
|
|
39
|
+
* alone is not enough — a bare `npm install` that only writes the lockfile
|
|
40
|
+
* still changes what is resolvable — and the lockfile alone is not enough
|
|
41
|
+
* either, since `vgai add` merges dependencies into `package.json` first.
|
|
42
|
+
*/
|
|
43
|
+
export const DEPENDENCY_MANIFEST_FILES = [
|
|
44
|
+
'package.json',
|
|
45
|
+
'package-lock.json',
|
|
46
|
+
'npm-shrinkwrap.json',
|
|
47
|
+
'pnpm-lock.yaml',
|
|
48
|
+
'yarn.lock',
|
|
49
|
+
'bun.lock',
|
|
50
|
+
'bun.lockb',
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Cheap stat-based fingerprint of a project's dependency manifests. Size is
|
|
55
|
+
* carried alongside mtime because an install that lands inside one filesystem
|
|
56
|
+
* timestamp tick still changes the file's length.
|
|
57
|
+
*/
|
|
58
|
+
export function dependencyManifestFingerprint(projectRoot: string): string {
|
|
59
|
+
return DEPENDENCY_MANIFEST_FILES.map((name) => {
|
|
60
|
+
try {
|
|
61
|
+
const stats = statSync(join(projectRoot, name));
|
|
62
|
+
return `${name}:${stats.mtimeMs}:${stats.size}`;
|
|
63
|
+
} catch {
|
|
64
|
+
return `${name}:-`;
|
|
65
|
+
}
|
|
66
|
+
}).join('|');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface DependencyChangeInvalidationDeps {
|
|
70
|
+
/** Read live — the open project changes at runtime. */
|
|
71
|
+
getProjectRoot: () => string;
|
|
72
|
+
/**
|
|
73
|
+
* Drop everything the Node module lane has cached for this project. The
|
|
74
|
+
* owning dev server implements it as
|
|
75
|
+
* `vite.environments.ssr.moduleGraph.invalidateAll()`; a host without a
|
|
76
|
+
* bundler (the static production server) has nothing to invalidate and
|
|
77
|
+
* omits it, leaving the loader a plain pass-through.
|
|
78
|
+
*/
|
|
79
|
+
invalidateModules?: (() => void) | undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Wraps a project-module loader so a dependency change invalidates the cached
|
|
84
|
+
* module graph before the next load. Returns `undefined` for an absent loader
|
|
85
|
+
* so hosts that never load project modules stay unchanged.
|
|
86
|
+
*/
|
|
87
|
+
export function withDependencyChangeInvalidation(
|
|
88
|
+
load: ProjectModuleLoader | undefined,
|
|
89
|
+
deps: DependencyChangeInvalidationDeps,
|
|
90
|
+
): ProjectModuleLoader | undefined {
|
|
91
|
+
if (!load) return undefined;
|
|
92
|
+
const { getProjectRoot, invalidateModules } = deps;
|
|
93
|
+
if (!invalidateModules) return load;
|
|
94
|
+
|
|
95
|
+
let lastProjectRoot: string | null = null;
|
|
96
|
+
let lastFingerprint: string | null = null;
|
|
97
|
+
|
|
98
|
+
return async (absoluteModuleId: string): Promise<unknown> => {
|
|
99
|
+
const projectRoot = getProjectRoot();
|
|
100
|
+
const fingerprint = dependencyManifestFingerprint(projectRoot);
|
|
101
|
+
// A different project is a fresh baseline, never an invalidation: opening
|
|
102
|
+
// a project already rebuilds what the graph holds for it.
|
|
103
|
+
if (
|
|
104
|
+
lastProjectRoot === projectRoot &&
|
|
105
|
+
lastFingerprint !== null &&
|
|
106
|
+
lastFingerprint !== fingerprint
|
|
107
|
+
) {
|
|
108
|
+
invalidateModules();
|
|
109
|
+
}
|
|
110
|
+
lastProjectRoot = projectRoot;
|
|
111
|
+
lastFingerprint = fingerprint;
|
|
112
|
+
return load(absoluteModuleId);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a project's files as FACTS: install its dependencies, hash a tree,
|
|
3
|
+
* snapshot it for collaboration, and name a file's content type.
|
|
4
|
+
*
|
|
5
|
+
* None of this holds session state — every function takes the paths it works
|
|
6
|
+
* on. The collaboration snapshot in particular is a pure read: it is what a
|
|
7
|
+
* joining participant is told the project currently contains.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { spawn } from 'node:child_process';
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { type Dirent, readFileSync } from 'node:fs';
|
|
13
|
+
import { readdir, readFile, stat, unlink } from 'node:fs/promises';
|
|
14
|
+
import type { IncomingMessage } from 'node:http';
|
|
15
|
+
import { join, relative, sep } from 'node:path';
|
|
16
|
+
import { isContainedRelativePath } from '@volter/editor-sdk/session/relative-path-guard';
|
|
17
|
+
|
|
18
|
+
export async function installProjectDependencies(projectPath: string): Promise<void> {
|
|
19
|
+
await new Promise<void>((resolveInstall, rejectInstall) => {
|
|
20
|
+
const child = spawn(
|
|
21
|
+
'npm',
|
|
22
|
+
['install', '--prefer-offline', '--no-audit', '--no-fund', '--loglevel=error'],
|
|
23
|
+
{
|
|
24
|
+
cwd: projectPath,
|
|
25
|
+
stdio: 'ignore',
|
|
26
|
+
shell: true,
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
child.once('error', rejectInstall);
|
|
30
|
+
child.once('close', (code) => {
|
|
31
|
+
if (code === 0) resolveInstall();
|
|
32
|
+
else rejectInstall(new Error(`npm install exited with code ${code ?? 'unknown'}`));
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function readRunningEngineVersion(engineRoot: string): string | null {
|
|
38
|
+
const candidates = [
|
|
39
|
+
join(engineRoot, 'packages', 'editor-core', 'package.json'),
|
|
40
|
+
join(engineRoot, 'node_modules', '@volter', 'editor-core', 'package.json'),
|
|
41
|
+
];
|
|
42
|
+
for (const path of candidates) {
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8')) as { version?: unknown };
|
|
45
|
+
if (typeof parsed.version === 'string') return parsed.version;
|
|
46
|
+
} catch {
|
|
47
|
+
// Try the next supported checkout/installed-package layout.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Packaged mode passes the installed `@vgai/editor` package as engineRoot.
|
|
51
|
+
// npm/pnpm may hoist its runtime-package dependencies to the PROJECT's
|
|
52
|
+
// node_modules, outside both candidates above; reading that project copy
|
|
53
|
+
// would merely echo the manifest pin and make every mismatch look healthy.
|
|
54
|
+
// Release-train package versions are synchronized, so the installed
|
|
55
|
+
// editor's own version is the authoritative identity in this layout. Keep
|
|
56
|
+
// the name check strict: the monorepo root has its own unrelated package
|
|
57
|
+
// version and must never masquerade as the engine version.
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(readFileSync(join(engineRoot, 'package.json'), 'utf-8')) as {
|
|
60
|
+
name?: unknown;
|
|
61
|
+
version?: unknown;
|
|
62
|
+
};
|
|
63
|
+
if (parsed.name === '@volter/editor-core' && typeof parsed.version === 'string') {
|
|
64
|
+
return parsed.version;
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
// No packaged-editor identity at this root.
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// File hashing — partial hash for large files (first 64KB + size)
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
|
|
76
|
+
const PARTIAL_HASH_THRESHOLD = 10 * 1024 * 1024; // 10MB
|
|
77
|
+
|
|
78
|
+
export async function hashAndSize(absPath: string): Promise<{ hash: string; size: number }> {
|
|
79
|
+
const data = await readFile(absPath);
|
|
80
|
+
const hash = createHash('sha256');
|
|
81
|
+
if (data.length > PARTIAL_HASH_THRESHOLD) {
|
|
82
|
+
hash.update(data.subarray(0, 65536));
|
|
83
|
+
hash.update(`\0size:${data.length}`);
|
|
84
|
+
} else {
|
|
85
|
+
hash.update(data);
|
|
86
|
+
}
|
|
87
|
+
return { hash: hash.digest('hex').slice(0, 16), size: data.length };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function unlinkIfPresent(path: string): Promise<void> {
|
|
91
|
+
try {
|
|
92
|
+
await unlink(path);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function scanDirForHashes(
|
|
99
|
+
dir: string,
|
|
100
|
+
hashCache: Map<string, string>,
|
|
101
|
+
sizeCache: Map<string, number>,
|
|
102
|
+
): Promise<void> {
|
|
103
|
+
let entries: Dirent[];
|
|
104
|
+
try {
|
|
105
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
106
|
+
} catch {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
if (entry.name.startsWith('.')) continue;
|
|
111
|
+
const full = join(dir, entry.name);
|
|
112
|
+
if (entry.isDirectory()) {
|
|
113
|
+
await scanDirForHashes(full, hashCache, sizeCache);
|
|
114
|
+
} else if (entry.isFile()) {
|
|
115
|
+
try {
|
|
116
|
+
const { hash, size } = await hashAndSize(full);
|
|
117
|
+
hashCache.set(full, hash);
|
|
118
|
+
sizeCache.set(full, size);
|
|
119
|
+
} catch {
|
|
120
|
+
/* skip unreadable files */
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const COLLABORATION_IGNORED_DIRS = new Set([
|
|
127
|
+
'node_modules',
|
|
128
|
+
'dist',
|
|
129
|
+
'coverage',
|
|
130
|
+
'logs',
|
|
131
|
+
'.git',
|
|
132
|
+
'.vgai',
|
|
133
|
+
]);
|
|
134
|
+
|
|
135
|
+
/** The project-owned estate: every file under the project root except the
|
|
136
|
+
* installed, generated and private directories above, and every dotfile.
|
|
137
|
+
* The same set `collaborationSourceSnapshot` publishes to a joining
|
|
138
|
+
* participant — one line, not a second weaker one. */
|
|
139
|
+
export function isProjectOwnedRelativePath(path: string): boolean {
|
|
140
|
+
if (!isContainedRelativePath(path)) return false;
|
|
141
|
+
return !path
|
|
142
|
+
.split('/')
|
|
143
|
+
.some((segment) => segment.startsWith('.') || COLLABORATION_IGNORED_DIRS.has(segment));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** The project's own files with size and mtime — a listing, not a read, so
|
|
147
|
+
* asking what is there does not cost what is in it. */
|
|
148
|
+
export async function projectFileIndex(
|
|
149
|
+
projectRoot: string,
|
|
150
|
+
): Promise<Array<{ path: string; size: number; mtime: number }>> {
|
|
151
|
+
const files: Array<{ path: string; size: number; mtime: number }> = [];
|
|
152
|
+
const visit = async (dir: string): Promise<void> => {
|
|
153
|
+
let entries: Dirent[];
|
|
154
|
+
try {
|
|
155
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
156
|
+
} catch {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
if (entry.name.startsWith('.') || COLLABORATION_IGNORED_DIRS.has(entry.name)) continue;
|
|
161
|
+
const full = join(dir, entry.name);
|
|
162
|
+
if (entry.isDirectory()) {
|
|
163
|
+
await visit(full);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (!entry.isFile()) continue;
|
|
167
|
+
try {
|
|
168
|
+
const info = await stat(full);
|
|
169
|
+
files.push({
|
|
170
|
+
path: relative(projectRoot, full).split(sep).join('/'),
|
|
171
|
+
size: info.size,
|
|
172
|
+
mtime: info.mtimeMs,
|
|
173
|
+
});
|
|
174
|
+
} catch {
|
|
175
|
+
/* vanished between readdir and stat: it is not in the project now */
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
await visit(projectRoot);
|
|
180
|
+
return files.sort((left, right) => left.path.localeCompare(right.path));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export async function collaborationSourceSnapshot(
|
|
184
|
+
projectRoot: string,
|
|
185
|
+
): Promise<Array<{ path: string; sha: string }>> {
|
|
186
|
+
const resources: Array<{ path: string; sha: string }> = [];
|
|
187
|
+
const visit = async (dir: string): Promise<void> => {
|
|
188
|
+
let entries: Dirent[];
|
|
189
|
+
try {
|
|
190
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
191
|
+
} catch {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
for (const entry of entries) {
|
|
195
|
+
if (entry.name.startsWith('.') || COLLABORATION_IGNORED_DIRS.has(entry.name)) continue;
|
|
196
|
+
const full = join(dir, entry.name);
|
|
197
|
+
if (entry.isDirectory()) {
|
|
198
|
+
await visit(full);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (!entry.isFile()) continue;
|
|
202
|
+
const { hash } = await hashAndSize(full);
|
|
203
|
+
resources.push({
|
|
204
|
+
path: relative(projectRoot, full).split(sep).join('/'),
|
|
205
|
+
sha: hash,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
await visit(projectRoot);
|
|
210
|
+
return resources.sort((left, right) => left.path.localeCompare(right.path));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// MIME type detection
|
|
215
|
+
export const mimeTypes: Record<string, string> = {
|
|
216
|
+
json: 'application/json',
|
|
217
|
+
glb: 'model/gltf-binary',
|
|
218
|
+
gltf: 'model/gltf+json',
|
|
219
|
+
png: 'image/png',
|
|
220
|
+
jpg: 'image/jpeg',
|
|
221
|
+
jpeg: 'image/jpeg',
|
|
222
|
+
webp: 'image/webp',
|
|
223
|
+
svg: 'image/svg+xml',
|
|
224
|
+
wav: 'audio/wav',
|
|
225
|
+
mp3: 'audio/mpeg',
|
|
226
|
+
ogg: 'audio/ogg',
|
|
227
|
+
gif: 'image/gif',
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/** One raw request header as a single string (Node hands back `string[]` for
|
|
231
|
+
* the repeatable ones). The share-claim headers are all single-valued. */
|
|
232
|
+
export function headerValue(request: IncomingMessage, name: string): string | undefined {
|
|
233
|
+
const value = request.headers[name.toLowerCase()];
|
|
234
|
+
return Array.isArray(value) ? value[0] : value;
|
|
235
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { isEditorLanePath } from '@volter/editor-sdk/session/tool-contribution-convention';
|
|
3
|
+
import ts from 'typescript';
|
|
4
|
+
import type { ImportersOf } from './project-root-surface';
|
|
5
|
+
import { resolveOidSurface } from './project-root-surface';
|
|
6
|
+
|
|
7
|
+
export type ProjectHotUpdateKind =
|
|
8
|
+
| 'outside'
|
|
9
|
+
| 'stock-data'
|
|
10
|
+
| 'react'
|
|
11
|
+
| 'r3f-refresh'
|
|
12
|
+
| 'r3f-entry'
|
|
13
|
+
| 'tool'
|
|
14
|
+
| 'restart'
|
|
15
|
+
| 'ignore';
|
|
16
|
+
|
|
17
|
+
/** Only locally proven component exports earn stock Fast Refresh. A wrong
|
|
18
|
+
* positive can reload the whole editor. Parse all declarations (including
|
|
19
|
+
* inline/indented exports), and never infer a component from an uppercase
|
|
20
|
+
* value, an arbitrary factory call, or an uninspected re-export.
|
|
21
|
+
*/
|
|
22
|
+
export function reactRefreshBoundaryExports(source: string): readonly string[] | null {
|
|
23
|
+
const file = ts.createSourceFile(
|
|
24
|
+
'boundary.tsx',
|
|
25
|
+
source,
|
|
26
|
+
ts.ScriptTarget.Latest,
|
|
27
|
+
true,
|
|
28
|
+
ts.ScriptKind.TSX,
|
|
29
|
+
);
|
|
30
|
+
const bindings = new Map<string, ts.Node>();
|
|
31
|
+
const reactWrappers = new Set<string>();
|
|
32
|
+
const reactNamespaces = new Set<string>();
|
|
33
|
+
for (const statement of file.statements) {
|
|
34
|
+
if (ts.isFunctionDeclaration(statement) && statement.name)
|
|
35
|
+
bindings.set(statement.name.text, statement);
|
|
36
|
+
if (ts.isVariableStatement(statement)) {
|
|
37
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
38
|
+
if (ts.isIdentifier(declaration.name) && declaration.initializer)
|
|
39
|
+
bindings.set(declaration.name.text, declaration.initializer);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (
|
|
43
|
+
ts.isImportDeclaration(statement) &&
|
|
44
|
+
ts.isStringLiteral(statement.moduleSpecifier) &&
|
|
45
|
+
statement.moduleSpecifier.text === 'react'
|
|
46
|
+
) {
|
|
47
|
+
const clause = statement.importClause;
|
|
48
|
+
if (clause?.name) reactNamespaces.add(clause.name.text);
|
|
49
|
+
if (clause?.namedBindings && ts.isNamespaceImport(clause.namedBindings))
|
|
50
|
+
reactNamespaces.add(clause.namedBindings.name.text);
|
|
51
|
+
if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {
|
|
52
|
+
for (const binding of clause.namedBindings.elements) {
|
|
53
|
+
if (['memo', 'forwardRef'].includes((binding.propertyName ?? binding.name).text))
|
|
54
|
+
reactWrappers.add(binding.name.text);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const component = (node: ts.Node, seen = new Set<string>()): boolean => {
|
|
60
|
+
if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node))
|
|
61
|
+
return !node.name || /^[A-Z]/.test(node.name.text);
|
|
62
|
+
if (ts.isArrowFunction(node)) return true;
|
|
63
|
+
if (
|
|
64
|
+
ts.isParenthesizedExpression(node) ||
|
|
65
|
+
ts.isAsExpression(node) ||
|
|
66
|
+
ts.isSatisfiesExpression(node)
|
|
67
|
+
)
|
|
68
|
+
return component(node.expression, seen);
|
|
69
|
+
if (ts.isIdentifier(node)) {
|
|
70
|
+
if (seen.has(node.text) || !/^[A-Z]/.test(node.text)) return false;
|
|
71
|
+
const binding = bindings.get(node.text);
|
|
72
|
+
seen.add(node.text);
|
|
73
|
+
return binding !== undefined && component(binding, seen);
|
|
74
|
+
}
|
|
75
|
+
if (ts.isCallExpression(node)) {
|
|
76
|
+
const callee = node.expression;
|
|
77
|
+
const wrapper = ts.isIdentifier(callee)
|
|
78
|
+
? reactWrappers.has(callee.text)
|
|
79
|
+
: ts.isPropertyAccessExpression(callee) &&
|
|
80
|
+
ts.isIdentifier(callee.expression) &&
|
|
81
|
+
reactNamespaces.has(callee.expression.text) &&
|
|
82
|
+
['memo', 'forwardRef'].includes(callee.name.text);
|
|
83
|
+
return wrapper && node.arguments[0] !== undefined && component(node.arguments[0], seen);
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
};
|
|
87
|
+
const exports: string[] = [];
|
|
88
|
+
for (const statement of file.statements) {
|
|
89
|
+
if (ts.isExportAssignment(statement)) {
|
|
90
|
+
if (
|
|
91
|
+
statement.isExportEquals ||
|
|
92
|
+
ts.isArrowFunction(statement.expression) ||
|
|
93
|
+
!component(statement.expression)
|
|
94
|
+
)
|
|
95
|
+
return null;
|
|
96
|
+
exports.push('default');
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (ts.isExportDeclaration(statement)) {
|
|
100
|
+
if (statement.isTypeOnly) continue;
|
|
101
|
+
if (
|
|
102
|
+
statement.moduleSpecifier ||
|
|
103
|
+
!statement.exportClause ||
|
|
104
|
+
!ts.isNamedExports(statement.exportClause)
|
|
105
|
+
)
|
|
106
|
+
return null;
|
|
107
|
+
for (const spec of statement.exportClause.elements) {
|
|
108
|
+
if (spec.isTypeOnly) continue;
|
|
109
|
+
if (spec.name.text !== 'default' && !/^[A-Z]/.test(spec.name.text)) return null;
|
|
110
|
+
if (!component(spec.propertyName ?? spec.name)) return null;
|
|
111
|
+
exports.push(spec.name.text);
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const modifiers = ts.canHaveModifiers(statement) ? ts.getModifiers(statement) : undefined;
|
|
116
|
+
if (!modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) continue;
|
|
117
|
+
if (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) continue;
|
|
118
|
+
if (ts.isFunctionDeclaration(statement)) {
|
|
119
|
+
if (!statement.name || !/^[A-Z]/.test(statement.name.text)) return null;
|
|
120
|
+
exports.push(
|
|
121
|
+
modifiers.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword)
|
|
122
|
+
? 'default'
|
|
123
|
+
: statement.name.text,
|
|
124
|
+
);
|
|
125
|
+
} else if (ts.isVariableStatement(statement)) {
|
|
126
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
127
|
+
if (
|
|
128
|
+
!ts.isIdentifier(declaration.name) ||
|
|
129
|
+
!/^[A-Z]/.test(declaration.name.text) ||
|
|
130
|
+
!declaration.initializer ||
|
|
131
|
+
!component(declaration.initializer)
|
|
132
|
+
)
|
|
133
|
+
return null;
|
|
134
|
+
exports.push(declaration.name.text);
|
|
135
|
+
}
|
|
136
|
+
} else return null;
|
|
137
|
+
}
|
|
138
|
+
return exports.length ? exports.sort() : null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function isReactRefreshBoundary(source: string): boolean {
|
|
142
|
+
return reactRefreshBoundaryExports(source) !== null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Classify a Vite watcher update for the editor's project-script HMR seam.
|
|
147
|
+
*
|
|
148
|
+
* Only modules below the project's `src/` directory are game code. Build
|
|
149
|
+
* output, tests, one-off scripts, and dependency caches may also contain
|
|
150
|
+
* JavaScript, but importing them into the live game is both surprising and
|
|
151
|
+
* unsafe (a project build used to make the editor import `dist/assets/*`).
|
|
152
|
+
*/
|
|
153
|
+
export function classifyProjectHotUpdate(
|
|
154
|
+
file: string,
|
|
155
|
+
projectRoot: string,
|
|
156
|
+
source = '',
|
|
157
|
+
importersOf?: ImportersOf,
|
|
158
|
+
): ProjectHotUpdateKind {
|
|
159
|
+
const normalizedFile = file.replaceAll('\\', '/');
|
|
160
|
+
const normalizedRoot = projectRoot.replaceAll('\\', '/').replace(/\/$/, '');
|
|
161
|
+
const relative = path.posix.relative(normalizedRoot, normalizedFile);
|
|
162
|
+
|
|
163
|
+
if (relative === '' || relative === '..' || relative.startsWith('../')) {
|
|
164
|
+
// A repo-vendored game's source (`vendor/games/<id>/…`) is the OPEN
|
|
165
|
+
// GAME's own code even though it lives outside the project folder — the
|
|
166
|
+
// project's ingest root maps to it. Classifying it `outside` handed it to
|
|
167
|
+
// STOCK Vite HMR, whose unbounded propagation re-stamped ~33 editor
|
|
168
|
+
// modules per creation-site write (the write route writes these files),
|
|
169
|
+
// fanned an HMR update at the tab, and split editor singletons
|
|
170
|
+
// (`play-mode.ts`'s game container) so every ▶ after a write refused —
|
|
171
|
+
// measured on bubbo-bubbo, 2026-08-21. `restart` is the honest kind: the
|
|
172
|
+
// ingest world re-derives from source on its next mount, and the
|
|
173
|
+
// swallowed-HMR path stamps the module graph with the editor-chrome
|
|
174
|
+
// boundary instead of letting stock HMR walk into the editor.
|
|
175
|
+
if (normalizedFile.includes('/vendor/games/') && /\.(ts|tsx|js|jsx)$/.test(normalizedFile)) {
|
|
176
|
+
return 'restart';
|
|
177
|
+
}
|
|
178
|
+
return 'outside';
|
|
179
|
+
}
|
|
180
|
+
if (relative === 'vgai.project.json') return 'restart';
|
|
181
|
+
if (!relative.startsWith('src/')) return 'ignore';
|
|
182
|
+
if (/\.data\.json$/.test(relative)) return 'stock-data';
|
|
183
|
+
if (!/\.(ts|tsx|js|jsx)$/.test(relative)) return 'ignore';
|
|
184
|
+
// Project-tool definitions, surfaces, documents, and their local helpers
|
|
185
|
+
// are editor tooling. They remount through the tool contribution store's
|
|
186
|
+
// own cache-busted import, never through game restart or React Refresh.
|
|
187
|
+
if (isEditorLanePath(relative)) return 'tool';
|
|
188
|
+
// R3F is a React renderer: a component-only module can refresh without
|
|
189
|
+
// replacing its scene. Mixed component/data exports still need the editor's
|
|
190
|
+
// remount boundary, because React Refresh cannot safely accept them.
|
|
191
|
+
//
|
|
192
|
+
// `resolveOidSurface` — the SAME single decision `vite-plugin-ui-oid.ts`'s
|
|
193
|
+
// OID-stamping transform stamps with, not a separate copy kept in lockstep
|
|
194
|
+
// by hand. It decides from the manifest when this exact file is a root's
|
|
195
|
+
// `entry`, from the live import graph when it's reachable from exactly one
|
|
196
|
+
// root's `entry` (`importersOf`, when the caller has one — see
|
|
197
|
+
// `dev.ts`/`packaged.ts`'s `handleHotUpdate`), and otherwise from the file's
|
|
198
|
+
// own dialect evidence (a direct `@react-three/fiber` /
|
|
199
|
+
// `@vgai/game-runtime/world3d-react` import, OR an R3F-only intrinsic tag like
|
|
200
|
+
// `<mesh>`). Reading its ATTRIBUTE rather than its surface is what keeps the
|
|
201
|
+
// two halves identical by construction: a file stamped `userData-oid` is, by
|
|
202
|
+
// definition, an R3F module. Its export shape decides whether the renderer
|
|
203
|
+
// can refresh or needs the design-session remount.
|
|
204
|
+
if (/\.(tsx|jsx)$/.test(relative)) {
|
|
205
|
+
if (resolveOidSurface(file, source, importersOf).attribute === 'userData-oid')
|
|
206
|
+
return isReactRefreshBoundary(source) ? 'r3f-refresh' : 'r3f-entry';
|
|
207
|
+
// Stock Fast Refresh ONLY when the module provably is a Fast Refresh
|
|
208
|
+
// boundary. Anything else the editor owns (swallow + stamp the module
|
|
209
|
+
// graph + `vgai:restart-required`), because letting Vite propagate a
|
|
210
|
+
// project module that is not a boundary full-reloads the editor page and
|
|
211
|
+
// silently destroys the running game — see `isReactRefreshBoundary`.
|
|
212
|
+
return isReactRefreshBoundary(source) ? 'react' : 'restart';
|
|
213
|
+
}
|
|
214
|
+
return 'restart';
|
|
215
|
+
}
|