@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,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE A PROJECT'S MODULES REALLY LIVE ON DISK — the directory set a
|
|
3
|
+
* project-rooted Vite instance must be allowed to serve from
|
|
4
|
+
* (`server.fs.allow`).
|
|
5
|
+
*
|
|
6
|
+
* ## The measured defect
|
|
7
|
+
*
|
|
8
|
+
* `packaged.ts` used to allow exactly three paths: the project directory, the
|
|
9
|
+
* realpath of `<project>/node_modules` *when that directory exists*, and the
|
|
10
|
+
* editor package root. That set is correct for one shape of install — a
|
|
11
|
+
* standalone scaffold with its own flat `node_modules` — and wrong for every
|
|
12
|
+
* other shape a real project takes:
|
|
13
|
+
*
|
|
14
|
+
* - an npm WORKSPACE MEMBER (every `examples/<id>`, and any user monorepo
|
|
15
|
+
* game) has no `node_modules` of its own at all; npm hoists the install to
|
|
16
|
+
* the workspace root ABOVE the project folder;
|
|
17
|
+
* - a workspace member's own sibling packages resolve through SYMLINKS that
|
|
18
|
+
* land outside the project entirely (`@vgai/game-runtime` → `<repo>/packages/
|
|
19
|
+
* engine`), and Vite's `fs.allow` matches the symlink-RESOLVED path;
|
|
20
|
+
* - a git worktree shares one install, so even the walk-up `node_modules`
|
|
21
|
+
* can be a tree of links into another checkout.
|
|
22
|
+
*
|
|
23
|
+
* Measured live before this module existed, packaged editor + `examples/
|
|
24
|
+
* retro-shooter`: `/@fs/<repo>/packages/project/src/adapter/index.ts` → HTTP
|
|
25
|
+
* 403, i.e. the world's own engine imports were unreachable; and
|
|
26
|
+
* `react-data-grid/lib/styles.css?inline` (the data-tables document's grid
|
|
27
|
+
* stylesheet) came back `200 text/css` — RAW CSS where the importer expects a
|
|
28
|
+
* JS module — because with the file outside `fs.allow` the transform never ran
|
|
29
|
+
* and a raw-file route answered instead, which is what the browser reports as
|
|
30
|
+
* "Failed to fetch dynamically imported module".
|
|
31
|
+
*
|
|
32
|
+
* ## What this computes instead
|
|
33
|
+
*
|
|
34
|
+
* The same directories NODE would resolve from, asked the same way Node asks:
|
|
35
|
+
*
|
|
36
|
+
* 1. every `node_modules` directory on the walk UP from the project (this is
|
|
37
|
+
* literally Node's module lookup path), realpath'd, existing ones only; and
|
|
38
|
+
* 2. for each dependency the project's own `package.json` DECLARES, the real
|
|
39
|
+
* install root that dependency actually resolves to — the enclosing
|
|
40
|
+
* `node_modules` directory when it is a normal install (covering hoisting,
|
|
41
|
+
* symlinked worktree trees and pnpm's nested store), or the package's own
|
|
42
|
+
* real directory when it is a linked workspace sibling that lives outside
|
|
43
|
+
* any `node_modules` at all.
|
|
44
|
+
*
|
|
45
|
+
* Resolution is Node's (`createRequire` rooted at the project), never a
|
|
46
|
+
* hand-rolled path guess, so a shape this comment did not anticipate is still
|
|
47
|
+
* answered correctly. Entries contained in another entry are dropped, so the
|
|
48
|
+
* result is the smallest set that covers the project's real module graph — it
|
|
49
|
+
* never widens to "allow the whole filesystem" and never allows a directory no
|
|
50
|
+
* declared dependency resolves into.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
54
|
+
import { createRequire } from 'node:module';
|
|
55
|
+
import path from 'node:path';
|
|
56
|
+
import { searchForWorkspaceRoot } from 'vite';
|
|
57
|
+
import { isPathInside } from './server-utils';
|
|
58
|
+
|
|
59
|
+
/** Dependency fields whose entries a project's module graph can reach at
|
|
60
|
+
* serve time. `devDependencies` counts: the editor serves stories, tools and
|
|
61
|
+
* capability source, which import dev-only packages by design. */
|
|
62
|
+
const DEPENDENCY_FIELDS = [
|
|
63
|
+
'dependencies',
|
|
64
|
+
'devDependencies',
|
|
65
|
+
'optionalDependencies',
|
|
66
|
+
'peerDependencies',
|
|
67
|
+
] as const;
|
|
68
|
+
|
|
69
|
+
function realDirectory(candidate: string): string | null {
|
|
70
|
+
try {
|
|
71
|
+
const real = realpathSync(candidate);
|
|
72
|
+
return statSync(real).isDirectory() ? real : null;
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Every `node_modules` directory Node would consult on the walk up from `dir`
|
|
80
|
+
* — BOUNDED by the enclosing workspace root.
|
|
81
|
+
*
|
|
82
|
+
* The bound is Vite's own `searchForWorkspaceRoot` (lockfile / `workspaces`
|
|
83
|
+
* field / `.git`), which is exactly what Vite uses to compute its DEFAULT
|
|
84
|
+
* `fs.allow`, so this half of the set is no wider than the default a
|
|
85
|
+
* project-rooted Vite would have chosen for itself. Unbounded, the walk keeps
|
|
86
|
+
* climbing past the repository into `~/node_modules` and `/node_modules` —
|
|
87
|
+
* directories no project's resolution meaningfully depends on and which have
|
|
88
|
+
* no business in a serving allowlist. A dependency that genuinely does resolve
|
|
89
|
+
* from above the workspace root is still covered, one package at a time, by
|
|
90
|
+
* {@link packageServingRoot}.
|
|
91
|
+
*/
|
|
92
|
+
function walkUpNodeModules(dir: string): string[] {
|
|
93
|
+
const found: string[] = [];
|
|
94
|
+
const bound = path.resolve(searchForWorkspaceRoot(dir));
|
|
95
|
+
let current = path.resolve(dir);
|
|
96
|
+
for (;;) {
|
|
97
|
+
if (path.basename(current) !== 'node_modules') {
|
|
98
|
+
const real = realDirectory(path.join(current, 'node_modules'));
|
|
99
|
+
if (real) found.push(real);
|
|
100
|
+
}
|
|
101
|
+
const parent = path.dirname(current);
|
|
102
|
+
if (current === bound || parent === current) return found;
|
|
103
|
+
current = parent;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** The declared dependency names of the project at `projectDir`, or `[]` when
|
|
108
|
+
* it has no readable `package.json` (a project that has not been installed
|
|
109
|
+
* yet still serves its own source; the walk-up set covers what exists). */
|
|
110
|
+
function declaredDependencies(projectDir: string): string[] {
|
|
111
|
+
let manifest: Record<string, unknown>;
|
|
112
|
+
try {
|
|
113
|
+
manifest = JSON.parse(readFileSync(path.join(projectDir, 'package.json'), 'utf-8')) as Record<
|
|
114
|
+
string,
|
|
115
|
+
unknown
|
|
116
|
+
>;
|
|
117
|
+
} catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const names = new Set<string>();
|
|
121
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
122
|
+
const value = manifest[field];
|
|
123
|
+
if (value && typeof value === 'object') {
|
|
124
|
+
for (const name of Object.keys(value)) names.add(name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return [...names];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The real directory serving `packageName` for a project rooted at
|
|
132
|
+
* `projectDir`, or `null` when it does not resolve.
|
|
133
|
+
*
|
|
134
|
+
* For an ordinary install this is the ENCLOSING `node_modules` directory (so
|
|
135
|
+
* one entry covers every package installed beside it, including the ones the
|
|
136
|
+
* project only reaches transitively). For a linked workspace sibling — whose
|
|
137
|
+
* real path contains no `node_modules` segment — it is that package's own
|
|
138
|
+
* directory, which is as tight as the allow entry can honestly be.
|
|
139
|
+
*/
|
|
140
|
+
export function packageServingRoot(projectDir: string, packageName: string): string | null {
|
|
141
|
+
// Rooted at the project's own `package.json`, the same discipline
|
|
142
|
+
// `resolveInstalledPackageSrcDir` (server-utils.ts) uses.
|
|
143
|
+
const require = createRequire(path.join(projectDir, 'package.json'));
|
|
144
|
+
let resolved: string;
|
|
145
|
+
try {
|
|
146
|
+
// The manifest resolves for any package, including one whose `exports`
|
|
147
|
+
// map hides its entry point from a bare specifier resolve.
|
|
148
|
+
resolved = require.resolve(`${packageName}/package.json`);
|
|
149
|
+
} catch {
|
|
150
|
+
try {
|
|
151
|
+
resolved = require.resolve(packageName);
|
|
152
|
+
} catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
let real: string;
|
|
157
|
+
try {
|
|
158
|
+
real = realpathSync(resolved);
|
|
159
|
+
} catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const segments = real.split(path.sep);
|
|
163
|
+
const enclosing = segments.lastIndexOf('node_modules');
|
|
164
|
+
if (enclosing >= 0) return segments.slice(0, enclosing + 1).join(path.sep);
|
|
165
|
+
// A linked workspace sibling, which lives in no `node_modules` at all: allow
|
|
166
|
+
// the package's own ROOT. Walking up to the nearest `package.json` rather
|
|
167
|
+
// than taking the resolved file's directory, because the fallback resolve
|
|
168
|
+
// above lands on the package's ENTRY (`<pkg>/src/index.ts` for a package
|
|
169
|
+
// whose `exports` map hides `./package.json`), and allowing `<pkg>/src`
|
|
170
|
+
// would serve the entry while 403'ing every sibling file it imports.
|
|
171
|
+
return packageRootOf(path.dirname(real));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** The nearest ancestor of `dir` (inclusive) that holds a `package.json`. */
|
|
175
|
+
function packageRootOf(dir: string): string | null {
|
|
176
|
+
let current = dir;
|
|
177
|
+
for (;;) {
|
|
178
|
+
if (existsSync(path.join(current, 'package.json'))) return realDirectory(current);
|
|
179
|
+
const parent = path.dirname(current);
|
|
180
|
+
if (parent === current) return null;
|
|
181
|
+
current = parent;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Drop every entry contained in another entry. */
|
|
186
|
+
function minimalRoots(roots: readonly string[]): string[] {
|
|
187
|
+
const unique = [...new Set(roots)].filter((root) => root.length > 0);
|
|
188
|
+
return unique.filter(
|
|
189
|
+
(root) => !unique.some((other) => other !== root && isPathInside(other, root)),
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Every real directory a project-rooted Vite instance must be able to serve
|
|
195
|
+
* from for the project's own module graph to resolve — the project itself
|
|
196
|
+
* plus its real install roots.
|
|
197
|
+
*
|
|
198
|
+
* Boot-time (and open-project-time) computation: an install that appears
|
|
199
|
+
* later is a dependency change, which already restarts or invalidates the
|
|
200
|
+
* module graph through its own path.
|
|
201
|
+
*/
|
|
202
|
+
export function projectServingRoots(projectDir: string): string[] {
|
|
203
|
+
const projectReal = realDirectory(projectDir) ?? path.resolve(projectDir);
|
|
204
|
+
const roots = [projectReal, ...walkUpNodeModules(projectReal)];
|
|
205
|
+
for (const name of declaredDependencies(projectReal)) {
|
|
206
|
+
const root = packageServingRoot(projectReal, name);
|
|
207
|
+
if (root && existsSync(root)) roots.push(root);
|
|
208
|
+
}
|
|
209
|
+
return minimalRoots(roots);
|
|
210
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The editor server's intake of a project's CONFIGURATION-KIND
|
|
3
|
+
* CONTRIBUTIONS (ARCHITECTURE-CORE §The project model): every
|
|
4
|
+
* `src/contributions/*.kind.ts` is evaluated through the same Vite SSR loader the
|
|
5
|
+
* operation catalog uses, and its `kind` export is registered in THIS
|
|
6
|
+
* process's engine registry before the manifest is read. Memoized on the
|
|
7
|
+
* modules' paths and mtimes, so a route pays nothing until a kind file
|
|
8
|
+
* changes.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { statSync } from 'node:fs';
|
|
12
|
+
import {
|
|
13
|
+
contributedKindModulePaths,
|
|
14
|
+
registerKindModule,
|
|
15
|
+
} from '@volter/editor-project/manifest/kind-modules';
|
|
16
|
+
import type { ProjectModuleLoader } from './project-tools';
|
|
17
|
+
|
|
18
|
+
let loader: ProjectModuleLoader | null = null;
|
|
19
|
+
let signature = '';
|
|
20
|
+
let unregister: Array<() => void> = [];
|
|
21
|
+
let loadErrors: string[] = [];
|
|
22
|
+
|
|
23
|
+
/** The loader the server evaluates project modules with; set once at boot. */
|
|
24
|
+
export function setKindModuleLoader(next: ProjectModuleLoader | null): void {
|
|
25
|
+
loader = next;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function kindModuleLoader(): ProjectModuleLoader | null {
|
|
29
|
+
return loader;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function currentSignature(paths: readonly string[]): string {
|
|
33
|
+
return paths
|
|
34
|
+
.map((path) => {
|
|
35
|
+
try {
|
|
36
|
+
return `${path}@${statSync(path).mtimeMs}`;
|
|
37
|
+
} catch {
|
|
38
|
+
return `${path}@gone`;
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.join('|');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Register the project's kinds if their files changed since the last call.
|
|
45
|
+
* Returns the load errors, which the caller surfaces by name. */
|
|
46
|
+
export async function ensureProjectConfigurationKinds(
|
|
47
|
+
projectRoot: string,
|
|
48
|
+
): Promise<readonly string[]> {
|
|
49
|
+
const paths = contributedKindModulePaths(projectRoot);
|
|
50
|
+
const next = `${projectRoot}::${currentSignature(paths)}`;
|
|
51
|
+
if (next === signature) return loadErrors;
|
|
52
|
+
for (const off of unregister) off();
|
|
53
|
+
unregister = [];
|
|
54
|
+
loadErrors = [];
|
|
55
|
+
if (paths.length > 0 && !loader) {
|
|
56
|
+
loadErrors.push(
|
|
57
|
+
"configuration kinds need the editor server's module host, which this session has not started",
|
|
58
|
+
);
|
|
59
|
+
} else {
|
|
60
|
+
for (const path of paths) {
|
|
61
|
+
try {
|
|
62
|
+
const module = await (loader as ProjectModuleLoader)(path);
|
|
63
|
+
unregister.push(registerKindModule(module, path));
|
|
64
|
+
} catch (error) {
|
|
65
|
+
loadErrors.push(`${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
signature = next;
|
|
70
|
+
return loadErrors;
|
|
71
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PROJECT'S OWN MCP SERVERS, handed to the runtime the session starts.
|
|
3
|
+
*
|
|
4
|
+
* Every scaffolded project ships `.mcp.json` naming its own two servers — `vgai` and
|
|
5
|
+
* `blender` — and that file is how a person's Claude Code, run by hand in the project,
|
|
6
|
+
* reaches them. The AI IN THE TAB is the same agent (ARCHITECTURE-CORE §The core is
|
|
7
|
+
* Code-OSS, rule 7) and must reach the same servers.
|
|
8
|
+
*
|
|
9
|
+
* WHY IT CANNOT BE LEFT TO DISCOVERY, measured 2026-09-21 on a freshly scaffolded model
|
|
10
|
+
* project: Claude Code records per-project approval of a `.mcp.json` in `~/.claude.json`
|
|
11
|
+
* (`enabledMcpjsonServers`), and a project the person has never opened by hand has no
|
|
12
|
+
* entry — so a PROJECT-scoped server is not loaded. The runtime the session starts is
|
|
13
|
+
* `claude --print …`, which has no trust dialog to answer, so discovery can never turn
|
|
14
|
+
* into approval there. A freshly created project's agent would simply have no `blender`
|
|
15
|
+
* tool, silently.
|
|
16
|
+
*
|
|
17
|
+
* THE DOOR IS SUPERCODE'S AND ALREADY EXISTS: `RuntimeStartParams.mcp_servers`. Supercode's
|
|
18
|
+
* Claude backend writes them to a file and passes `--mcp-config <file>`
|
|
19
|
+
* (`crates/harness/src/runtime/adapters.rs`), which is an EXPLICIT caller-supplied config
|
|
20
|
+
* and therefore not subject to the project-approval gate at all. This module is only the
|
|
21
|
+
* read: the project's declaration, in the SDK's shape.
|
|
22
|
+
*
|
|
23
|
+
* IT IS NOT A SECOND DECLARATION. `.mcp.json` stays the one place a project names its
|
|
24
|
+
* servers; nothing here invents, defaults or merges one, and a project without the file
|
|
25
|
+
* hands over nothing.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { readFileSync } from 'node:fs';
|
|
29
|
+
import { join } from 'node:path';
|
|
30
|
+
|
|
31
|
+
/** `RuntimeStartParams.mcp_servers`'s element, structurally — the SDK is an optional peer. */
|
|
32
|
+
export interface ProjectMcpServer {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly command: string;
|
|
35
|
+
readonly arguments?: readonly string[];
|
|
36
|
+
readonly env?: Readonly<Record<string, string>>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function stringRecord(value: unknown): Record<string, string> | undefined {
|
|
40
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined;
|
|
41
|
+
const entries = Object.entries(value as Record<string, unknown>).filter(
|
|
42
|
+
(entry): entry is [string, string] => typeof entry[1] === 'string',
|
|
43
|
+
);
|
|
44
|
+
return entries.length > 0 ? Object.fromEntries(entries) : undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The project's `.mcp.json`, as the SDK's `mcp_servers`. Empty for a project that declares
|
|
49
|
+
* none, and empty rather than thrown for a malformed one: a broken `.mcp.json` is the dev
|
|
50
|
+
* server's to report against the file, and failing the whole runtime start over it would
|
|
51
|
+
* cost the person their agent to say so.
|
|
52
|
+
*
|
|
53
|
+
* Only the STDIO shape is carried, because that is the shape the harnesses take as a
|
|
54
|
+
* launch: an entry with no string `command` is skipped rather than guessed at.
|
|
55
|
+
*/
|
|
56
|
+
export function projectMcpServers(projectRoot: string): ProjectMcpServer[] {
|
|
57
|
+
let parsed: unknown;
|
|
58
|
+
try {
|
|
59
|
+
parsed = JSON.parse(readFileSync(join(projectRoot, '.mcp.json'), 'utf8'));
|
|
60
|
+
} catch {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
const declared = (parsed as { mcpServers?: unknown } | null)?.mcpServers;
|
|
64
|
+
if (declared === null || typeof declared !== 'object' || Array.isArray(declared)) return [];
|
|
65
|
+
const servers: ProjectMcpServer[] = [];
|
|
66
|
+
for (const [name, value] of Object.entries(declared as Record<string, unknown>)) {
|
|
67
|
+
if (value === null || typeof value !== 'object') continue;
|
|
68
|
+
const entry = value as { command?: unknown; args?: unknown; env?: unknown };
|
|
69
|
+
if (typeof entry.command !== 'string' || entry.command === '') continue;
|
|
70
|
+
const args = Array.isArray(entry.args)
|
|
71
|
+
? entry.args.filter((argument): argument is string => typeof argument === 'string')
|
|
72
|
+
: undefined;
|
|
73
|
+
const env = stringRecord(entry.env);
|
|
74
|
+
servers.push({
|
|
75
|
+
name,
|
|
76
|
+
command: entry.command,
|
|
77
|
+
...(args && args.length > 0 ? { arguments: args } : {}),
|
|
78
|
+
...(env ? { env } : {}),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return servers;
|
|
82
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A project module loaded ON USE is as fresh as the file on disk — never as
|
|
3
|
+
* fresh as the file watcher happens to be.
|
|
4
|
+
*
|
|
5
|
+
* The problem, measured on the blind modeling bench (2026-09-05): an agent
|
|
6
|
+
* edits `src/models/barrel.ts` and runs `vgai screenshot src/models/barrel.ts`
|
|
7
|
+
* in the same breath. The look verb's Node half loads the module through
|
|
8
|
+
* Vite's SSR runner, whose module graph is invalidated by the FILE WATCHER —
|
|
9
|
+
* and the watcher's change event lands seconds after the write (FSEvents on
|
|
10
|
+
* macOS, a poll tick on drvfs). Inside that window the runner hands back the
|
|
11
|
+
* previous evaluation, the four views come out byte-identical to the last
|
|
12
|
+
* look, and the agent concludes its edit did nothing. Four sessions in five
|
|
13
|
+
* hit it; one restarted the editor before every look, one tried to rewrite
|
|
14
|
+
* the project's own module loader and broke it, one shipped on a stale
|
|
15
|
+
* picture.
|
|
16
|
+
*
|
|
17
|
+
* The fix is the pattern `project-dependency-invalidation.ts` already uses
|
|
18
|
+
* for installs: check ON USE. Before a load, every module reachable from the
|
|
19
|
+
* requested one that lives under the project root is stat'ed; a file whose
|
|
20
|
+
* mtime moved since it was last evaluated has its graph node invalidated
|
|
21
|
+
* explicitly (the same invalidation the watcher performs — clears the
|
|
22
|
+
* transform, so the runner's next `fetchModule` re-transforms and
|
|
23
|
+
* re-evaluates). After a load, the reachable set's mtimes are recorded. A
|
|
24
|
+
* watcher event that arrives later is harmless: an already-invalidated node
|
|
25
|
+
* invalidates again for nothing.
|
|
26
|
+
*
|
|
27
|
+
* Scope is the PROJECT's own files. `node_modules` and the engine checkout are
|
|
28
|
+
* not stat'ed: the first is immutable between installs (and installs have
|
|
29
|
+
* their own door), the second restarts the server when it moves.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { statSync } from 'node:fs';
|
|
33
|
+
import { sep } from 'node:path';
|
|
34
|
+
import type { ViteDevServer } from 'vite';
|
|
35
|
+
import type { ProjectModuleLoader } from './project-tools';
|
|
36
|
+
|
|
37
|
+
interface GraphNode {
|
|
38
|
+
readonly id: string | null;
|
|
39
|
+
readonly file: string | null;
|
|
40
|
+
readonly importedModules: Set<GraphNode>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface Graph {
|
|
44
|
+
getModuleById(id: string): GraphNode | undefined;
|
|
45
|
+
invalidateModule(node: GraphNode): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function mtimeOf(file: string): number | undefined {
|
|
49
|
+
try {
|
|
50
|
+
return statSync(file).mtimeMs;
|
|
51
|
+
} catch {
|
|
52
|
+
return undefined; // deleted: the load itself will say so
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Every graph node reachable from `entry` whose file sits under `root`. */
|
|
57
|
+
function reachableProjectNodes(entry: GraphNode, root: string): GraphNode[] {
|
|
58
|
+
const prefix = root.endsWith(sep) ? root : `${root}${sep}`;
|
|
59
|
+
const seen = new Set<GraphNode>();
|
|
60
|
+
const out: GraphNode[] = [];
|
|
61
|
+
const stack = [entry];
|
|
62
|
+
while (stack.length) {
|
|
63
|
+
const node = stack.pop() as GraphNode;
|
|
64
|
+
if (seen.has(node)) continue;
|
|
65
|
+
seen.add(node);
|
|
66
|
+
const file = node.file;
|
|
67
|
+
if (!file || !file.startsWith(prefix) || file.includes(`${sep}node_modules${sep}`)) continue;
|
|
68
|
+
out.push(node);
|
|
69
|
+
for (const child of node.importedModules) stack.push(child);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function freshProjectModuleLoader(
|
|
75
|
+
vite: ViteDevServer,
|
|
76
|
+
getProjectRoot: () => string | undefined,
|
|
77
|
+
): ProjectModuleLoader {
|
|
78
|
+
const graph = vite.environments.ssr.moduleGraph as unknown as Graph;
|
|
79
|
+
const evaluatedAt = new Map<string, number>();
|
|
80
|
+
return async (moduleId: string) => {
|
|
81
|
+
const root = getProjectRoot();
|
|
82
|
+
if (root) {
|
|
83
|
+
const entry = graph.getModuleById(moduleId);
|
|
84
|
+
if (entry) {
|
|
85
|
+
for (const node of reachableProjectNodes(entry, root)) {
|
|
86
|
+
const file = node.file as string;
|
|
87
|
+
const recorded = evaluatedAt.get(file);
|
|
88
|
+
const current = mtimeOf(file);
|
|
89
|
+
if (recorded !== undefined && current !== undefined && current !== recorded) {
|
|
90
|
+
graph.invalidateModule(node);
|
|
91
|
+
evaluatedAt.delete(file);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const loaded = await vite.ssrLoadModule(moduleId);
|
|
97
|
+
if (root) {
|
|
98
|
+
const entry = graph.getModuleById(moduleId);
|
|
99
|
+
if (entry) {
|
|
100
|
+
for (const node of reachableProjectNodes(entry, root)) {
|
|
101
|
+
const file = node.file as string;
|
|
102
|
+
const current = mtimeOf(file);
|
|
103
|
+
if (current !== undefined) evaluatedAt.set(file, current);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return loaded;
|
|
108
|
+
};
|
|
109
|
+
}
|