@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,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuse a source-checkout editor whose workspace packages resolve into a
|
|
3
|
+
* different checkout.
|
|
4
|
+
*
|
|
5
|
+
* The checkout Vite config deliberately dedupes the runtime packages from its own
|
|
6
|
+
* root. A whole-directory `node_modules` symlink (or stale individual
|
|
7
|
+
* workspace links) therefore does more than use old dependencies: generated
|
|
8
|
+
* project code can import `WorldProvider` from one checkout while its
|
|
9
|
+
* `useDebugProvider` hook comes from another. The game renders, but all of its
|
|
10
|
+
* game-scoped command/provider registrations silently see the wrong Context.
|
|
11
|
+
*
|
|
12
|
+
* LOCAL-DEV's worktree shim is the one repair owner. The server must not try to
|
|
13
|
+
* mutate an install tree whose donor it cannot know; it fails before Vite boot
|
|
14
|
+
* with the exact invariant and repair seam instead.
|
|
15
|
+
*
|
|
16
|
+
* WHAT A WORKSPACE MEMBER IS comes from the root `package.json`'s own
|
|
17
|
+
* `workspaces` globs, and from nothing else — not a package list here, not the
|
|
18
|
+
* lockfile, and above all not a named package used as a "am I a source
|
|
19
|
+
* checkout?" probe. Both of those drift with a rename and go VACUOUS-GREEN:
|
|
20
|
+
* this guard spent the engine split (2026-09-21, `packages/engine` → `project`
|
|
21
|
+
* + `threejs-runtime` + `game-runtime`) returning `null` on every source
|
|
22
|
+
* checkout in the estate, because its first line asked for
|
|
23
|
+
* `packages/engine/package.json` and that package no longer exists — measured
|
|
24
|
+
* with the five links present AND with `@vgai/project`'s link deleted, both
|
|
25
|
+
* `null`. A guard that can be switched off by a rename is not a guard, so the
|
|
26
|
+
* question it asks is now the monorepo's own self-description.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import {
|
|
30
|
+
type Dirent,
|
|
31
|
+
existsSync,
|
|
32
|
+
lstatSync,
|
|
33
|
+
readdirSync,
|
|
34
|
+
readFileSync,
|
|
35
|
+
realpathSync,
|
|
36
|
+
} from 'node:fs';
|
|
37
|
+
import path from 'node:path';
|
|
38
|
+
|
|
39
|
+
function canonical(candidate: string): string {
|
|
40
|
+
try {
|
|
41
|
+
return realpathSync(candidate);
|
|
42
|
+
} catch {
|
|
43
|
+
return path.resolve(candidate);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface WorkspaceIdentity {
|
|
48
|
+
packageName: string;
|
|
49
|
+
source: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const workspaceIdentityCache = new Map<string, WorkspaceIdentity[]>();
|
|
53
|
+
|
|
54
|
+
function readJson(file: string): unknown {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(readFileSync(file, 'utf8')) as unknown;
|
|
57
|
+
} catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The root manifest's own `workspaces` globs — `packages/*`, `examples/*`, … */
|
|
63
|
+
function workspaceGlobs(engineRoot: string): string[] {
|
|
64
|
+
const manifest = readJson(path.join(engineRoot, 'package.json')) as
|
|
65
|
+
| { workspaces?: string[] | { packages?: string[] } }
|
|
66
|
+
| undefined;
|
|
67
|
+
const declared = Array.isArray(manifest?.workspaces)
|
|
68
|
+
? manifest.workspaces
|
|
69
|
+
: (manifest?.workspaces?.packages ?? []);
|
|
70
|
+
return declared.filter((glob): glob is string => typeof glob === 'string');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Expand the globs to the members that are ON DISK. Only the two shapes npm's
|
|
75
|
+
* own workspaces use here are honoured — a literal directory and a trailing
|
|
76
|
+
* `/*` — because a member this cannot see is a member this cannot refuse for,
|
|
77
|
+
* and a half-understood pattern silently becomes the vacuous green above.
|
|
78
|
+
*/
|
|
79
|
+
function expandWorkspaceGlob(engineRoot: string, glob: string): string[] {
|
|
80
|
+
const normalized = glob.replaceAll('\\', '/').replace(/\/+$/, '');
|
|
81
|
+
if (!normalized.endsWith('/*')) {
|
|
82
|
+
return existsSync(path.join(engineRoot, normalized, 'package.json')) ? [normalized] : [];
|
|
83
|
+
}
|
|
84
|
+
const parent = normalized.slice(0, -2);
|
|
85
|
+
let entries: Dirent[];
|
|
86
|
+
try {
|
|
87
|
+
entries = readdirSync(path.join(engineRoot, parent), { withFileTypes: true });
|
|
88
|
+
} catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
return entries
|
|
92
|
+
.filter((entry) => !entry.name.startsWith('.'))
|
|
93
|
+
.map((entry) => `${parent}/${entry.name}`)
|
|
94
|
+
.filter((source) => existsSync(path.join(engineRoot, source, 'package.json')));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The workspace globs, not the lockfile and not a maintained package list, own
|
|
99
|
+
* the topology: a member added to `packages/` before anyone regenerates the
|
|
100
|
+
* lock is still a member, and a member deleted by a rename stops being one in
|
|
101
|
+
* the same gesture. A directory whose manifest has no `name` is not a package
|
|
102
|
+
* and is skipped by name rather than guessed at.
|
|
103
|
+
*/
|
|
104
|
+
function checkoutWorkspaceIdentities(engineRoot: string): WorkspaceIdentity[] {
|
|
105
|
+
const cacheKey = canonical(engineRoot);
|
|
106
|
+
const cached = workspaceIdentityCache.get(cacheKey);
|
|
107
|
+
if (cached) return cached;
|
|
108
|
+
const identities: WorkspaceIdentity[] = [];
|
|
109
|
+
for (const glob of workspaceGlobs(engineRoot)) {
|
|
110
|
+
for (const source of expandWorkspaceGlob(engineRoot, glob)) {
|
|
111
|
+
const manifest = readJson(path.join(engineRoot, source, 'package.json')) as
|
|
112
|
+
| { name?: string }
|
|
113
|
+
| undefined;
|
|
114
|
+
if (typeof manifest?.name !== 'string' || manifest.name.length === 0) continue;
|
|
115
|
+
identities.push({ packageName: manifest.name, source });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
identities.sort((a, b) => a.packageName.localeCompare(b.packageName));
|
|
119
|
+
workspaceIdentityCache.set(cacheKey, identities);
|
|
120
|
+
return identities;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Canonical top-level symlink topology participating in Vite resolution.
|
|
125
|
+
* Includes ordinary and scoped packages, but never crawls package contents.
|
|
126
|
+
*/
|
|
127
|
+
function installedLinkTopology(nodeModules: string): string[] {
|
|
128
|
+
const links: string[] = [];
|
|
129
|
+
let entries: Dirent[];
|
|
130
|
+
try {
|
|
131
|
+
entries = readdirSync(nodeModules, { withFileTypes: true });
|
|
132
|
+
} catch {
|
|
133
|
+
return links;
|
|
134
|
+
}
|
|
135
|
+
for (const entry of entries) {
|
|
136
|
+
if (entry.name.startsWith('.')) continue;
|
|
137
|
+
const installed = path.join(nodeModules, entry.name);
|
|
138
|
+
if (entry.isSymbolicLink()) {
|
|
139
|
+
links.push(`${entry.name}=${canonical(installed)}`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!entry.name.startsWith('@') || !entry.isDirectory()) continue;
|
|
143
|
+
let scopedEntries: Dirent[];
|
|
144
|
+
try {
|
|
145
|
+
scopedEntries = readdirSync(installed, { withFileTypes: true });
|
|
146
|
+
} catch {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
for (const scopedEntry of scopedEntries) {
|
|
150
|
+
if (!scopedEntry.isSymbolicLink()) continue;
|
|
151
|
+
const packageName = `${entry.name}/${scopedEntry.name}`;
|
|
152
|
+
links.push(`${packageName}=${canonical(path.join(installed, scopedEntry.name))}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return links.sort();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Identity input for the optimizer namespace. Vite's own config/lock hashes do
|
|
160
|
+
* not include symlink realpaths, so a relinked same-path project otherwise
|
|
161
|
+
* keeps accepting a cache built from a different checkout.
|
|
162
|
+
*/
|
|
163
|
+
export function editorResolutionTopology(engineRoot: string, projectPath?: string): string {
|
|
164
|
+
const parts = [
|
|
165
|
+
`engine-node-modules=${canonical(path.join(engineRoot, 'node_modules'))}`,
|
|
166
|
+
...installedLinkTopology(path.join(engineRoot, 'node_modules')).map((v) => `engine:${v}`),
|
|
167
|
+
];
|
|
168
|
+
if (projectPath) {
|
|
169
|
+
parts.push(
|
|
170
|
+
`project-node-modules=${canonical(path.join(projectPath, 'node_modules'))}`,
|
|
171
|
+
...installedLinkTopology(path.join(projectPath, 'node_modules')).map((v) => `project:${v}`),
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
return parts.join('\n');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function repairMessage(engineRoot: string, detail: string): string {
|
|
178
|
+
return (
|
|
179
|
+
`Editor startup refused: source-checkout workspace identity is split. ${detail}\n` +
|
|
180
|
+
`Vite resolves shared @vgai modules from ${engineRoot}/node_modules, so continuing could ` +
|
|
181
|
+
'render a game with a different WorldProvider/debug registry identity. Recreate this ' +
|
|
182
|
+
"checkout's node_modules with scripts/worktree-node-modules-shim.mjs as documented in " +
|
|
183
|
+
'docs/LOCAL-DEV.md; never symlink the whole node_modules directory.'
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function projectRepairMessage(
|
|
188
|
+
projectPath: string,
|
|
189
|
+
installed: string,
|
|
190
|
+
actual: string,
|
|
191
|
+
expected: string,
|
|
192
|
+
): string {
|
|
193
|
+
return (
|
|
194
|
+
`Editor startup refused: ${installed} resolves to ${actual}, but the serving checkout ` +
|
|
195
|
+
`requires ${expected}. A live editor cannot compose workspace packages from two checkouts. ` +
|
|
196
|
+
`Either launch this project from the checkout at ${actual} or relink it to this checkout ` +
|
|
197
|
+
`with \`cd ${projectPath} && npm link --no-save ${expected}\`.`
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Every member the globs found must have a link in the checkout's own
|
|
203
|
+
* `node_modules`, pointing at the checkout's own source. A member with NO link
|
|
204
|
+
* is refused by name: nothing later in the boot can tell that absence from a
|
|
205
|
+
* package nobody imports, and the shim is the one repair.
|
|
206
|
+
*/
|
|
207
|
+
function engineLinkError(
|
|
208
|
+
normalizedRoot: string,
|
|
209
|
+
nodeModules: string,
|
|
210
|
+
identities: WorkspaceIdentity[],
|
|
211
|
+
): string | null {
|
|
212
|
+
for (const { packageName, source: relativeSource } of identities) {
|
|
213
|
+
const installed = path.join(nodeModules, ...packageName.split('/'));
|
|
214
|
+
const expected = path.join(normalizedRoot, relativeSource);
|
|
215
|
+
if (!existsSync(installed)) {
|
|
216
|
+
return repairMessage(normalizedRoot, `${installed} is missing; expected ${expected}.`);
|
|
217
|
+
}
|
|
218
|
+
const actual = canonical(installed);
|
|
219
|
+
const expectedCanonical = canonical(expected);
|
|
220
|
+
if (actual !== expectedCanonical) {
|
|
221
|
+
return repairMessage(
|
|
222
|
+
normalizedRoot,
|
|
223
|
+
`${installed} resolves to ${actual}; expected this checkout's ${expectedCanonical}.`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A registry-installed project copy is intentionally collapsed by the
|
|
232
|
+
* checkout's Vite dedupe. A project-local SYMLINK is different: it is an
|
|
233
|
+
* explicit checkout selection, and if it names another checkout the active
|
|
234
|
+
* server must restart there rather than compose both graphs. Check every
|
|
235
|
+
* workspace member, not a hand-maintained `@vgai` subset.
|
|
236
|
+
*/
|
|
237
|
+
function projectLinkError(
|
|
238
|
+
normalizedRoot: string,
|
|
239
|
+
identities: WorkspaceIdentity[],
|
|
240
|
+
projectPath?: string,
|
|
241
|
+
): string | null {
|
|
242
|
+
if (projectPath === undefined) return null;
|
|
243
|
+
for (const { packageName, source: relativeSource } of identities) {
|
|
244
|
+
const installed = path.join(projectPath, 'node_modules', ...packageName.split('/'));
|
|
245
|
+
try {
|
|
246
|
+
if (!lstatSync(installed).isSymbolicLink()) continue;
|
|
247
|
+
} catch {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
const actual = canonical(installed);
|
|
251
|
+
const expected = canonical(path.join(normalizedRoot, relativeSource));
|
|
252
|
+
if (actual !== expected) {
|
|
253
|
+
return projectRepairMessage(projectPath, installed, actual, expected);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* No-op for a packaged editor: a published package declares no `workspaces`,
|
|
261
|
+
* so it has no members and nothing to split. A source checkout is recognized
|
|
262
|
+
* by that declaration alone — never by a package name, which a rename deletes.
|
|
263
|
+
*/
|
|
264
|
+
export function checkoutWorkspaceIdentityError(
|
|
265
|
+
engineRoot: string,
|
|
266
|
+
projectPath?: string,
|
|
267
|
+
): string | null {
|
|
268
|
+
const normalizedRoot = path.resolve(engineRoot);
|
|
269
|
+
if (workspaceGlobs(normalizedRoot).length === 0) return null;
|
|
270
|
+
|
|
271
|
+
const nodeModules = path.join(normalizedRoot, 'node_modules');
|
|
272
|
+
try {
|
|
273
|
+
if (lstatSync(nodeModules).isSymbolicLink()) {
|
|
274
|
+
return repairMessage(
|
|
275
|
+
normalizedRoot,
|
|
276
|
+
`${nodeModules} is a whole-directory symlink to ${canonical(nodeModules)}.`,
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
} catch {
|
|
280
|
+
// Missing/unreadable node_modules will already make this source server's
|
|
281
|
+
// dependency imports fail by name. Do not replace that useful native error.
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const identities = checkoutWorkspaceIdentities(normalizedRoot);
|
|
286
|
+
if (identities.length === 0) {
|
|
287
|
+
return repairMessage(
|
|
288
|
+
normalizedRoot,
|
|
289
|
+
`${path.join(normalizedRoot, 'package.json')} declares workspace globs ` +
|
|
290
|
+
`(${workspaceGlobs(normalizedRoot).join(', ')}) that match no package on disk.`,
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
return (
|
|
294
|
+
engineLinkError(normalizedRoot, nodeModules, identities) ??
|
|
295
|
+
projectLinkError(normalizedRoot, identities, projectPath)
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function assertCheckoutWorkspaceIdentity(engineRoot: string, projectPath?: string): void {
|
|
300
|
+
const error = checkoutWorkspaceIdentityError(engineRoot, projectPath);
|
|
301
|
+
if (error !== null) throw new Error(error);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export interface WorkspaceIdentityRestartMonitor {
|
|
305
|
+
checkNow(): void;
|
|
306
|
+
dispose(): void;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Poll the tiny top-level link set because npm relinking replaces symlinks in
|
|
311
|
+
* node_modules, a path source watchers intentionally ignore. Fires once: the
|
|
312
|
+
* existing exit-75 handoff owns the actual process replacement.
|
|
313
|
+
*/
|
|
314
|
+
export function createWorkspaceIdentityRestartMonitor(options: {
|
|
315
|
+
engineRoot: string;
|
|
316
|
+
projectPath: () => string | undefined;
|
|
317
|
+
onStale: (change: { changedPath: string; changedAt: string }) => void;
|
|
318
|
+
intervalMs?: number;
|
|
319
|
+
now?: () => Date;
|
|
320
|
+
setInterval?: (callback: () => void, ms: number) => unknown;
|
|
321
|
+
clearInterval?: (timer: unknown) => void;
|
|
322
|
+
}): WorkspaceIdentityRestartMonitor {
|
|
323
|
+
let fired = false;
|
|
324
|
+
const checkNow = (): void => {
|
|
325
|
+
if (fired) return;
|
|
326
|
+
if (checkoutWorkspaceIdentityError(options.engineRoot, options.projectPath()) === null) return;
|
|
327
|
+
fired = true;
|
|
328
|
+
options.onStale({
|
|
329
|
+
changedPath: 'node_modules workspace package links',
|
|
330
|
+
changedAt: (options.now ?? (() => new Date()))().toISOString(),
|
|
331
|
+
});
|
|
332
|
+
};
|
|
333
|
+
const setTimer =
|
|
334
|
+
options.setInterval ??
|
|
335
|
+
((callback: () => void, ms: number): unknown => {
|
|
336
|
+
const timer = setInterval(callback, ms);
|
|
337
|
+
timer.unref();
|
|
338
|
+
return timer;
|
|
339
|
+
});
|
|
340
|
+
const clearTimer =
|
|
341
|
+
options.clearInterval ?? ((timer: unknown): void => clearInterval(timer as NodeJS.Timeout));
|
|
342
|
+
const timer = setTimer(checkNow, options.intervalMs ?? 1_000);
|
|
343
|
+
return {
|
|
344
|
+
checkNow,
|
|
345
|
+
dispose(): void {
|
|
346
|
+
clearTimer(timer);
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node's client for the deployed `cloud-asset-library` Worker: it reads
|
|
3
|
+
* `VGAI_CLOUD_ASSET_URL` and resolves variants through GraphQL, neither of
|
|
4
|
+
* which a browser bundle can do — so the FETCHING here is genuinely its own.
|
|
5
|
+
*
|
|
6
|
+
* What the worker RETURNS is not. `CloudAssetObject`/`CloudAssetFile`/
|
|
7
|
+
* `CloudAssetRecord` and the manifest response are declared once, in
|
|
8
|
+
* `src/asset-workflow/cloud-asset-client.ts` (a browser-safe module `server/`
|
|
9
|
+
* can import but which cannot import back — see its header), and imported here.
|
|
10
|
+
* The mirror that used to live in this file had drifted into the worker's
|
|
11
|
+
* INTERNAL pre-projection shape: `familyId`/`label`/`categories`/`tags`
|
|
12
|
+
* optional, plus a `key` no editor path reads and this file's own GraphQL
|
|
13
|
+
* query does not select.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type {
|
|
17
|
+
CloudAssetManifestResponse,
|
|
18
|
+
CloudAssetRecord,
|
|
19
|
+
} from '../src/asset-workflow/cloud-asset-client';
|
|
20
|
+
|
|
21
|
+
export const DEFAULT_CLOUD_ASSET_BASE_URL = 'https://vgai-asset-library.aaron-0ed.workers.dev';
|
|
22
|
+
|
|
23
|
+
export type {
|
|
24
|
+
CloudAssetFile,
|
|
25
|
+
CloudAssetManifestResponse,
|
|
26
|
+
CloudAssetObject,
|
|
27
|
+
CloudAssetRecord,
|
|
28
|
+
} from '../src/asset-workflow/cloud-asset-client';
|
|
29
|
+
|
|
30
|
+
let cachedManifest:
|
|
31
|
+
| { value: CloudAssetManifestResponse; url: string; loadedAt: number }
|
|
32
|
+
| undefined;
|
|
33
|
+
const CACHE_MS = 5 * 60 * 1000;
|
|
34
|
+
const GRAPHQL_ID_BATCH = 500;
|
|
35
|
+
const graphqlAssetCache = new Map<
|
|
36
|
+
string,
|
|
37
|
+
{ baseUrl: string; value: CloudAssetRecord | null; loadedAt: number }
|
|
38
|
+
>();
|
|
39
|
+
|
|
40
|
+
export function getCloudAssetBaseUrl(): string {
|
|
41
|
+
return (process.env['VGAI_CLOUD_ASSET_URL'] ?? DEFAULT_CLOUD_ASSET_BASE_URL).replace(/\/+$/, '');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function loadCloudAssetManifest(): Promise<CloudAssetManifestResponse | null> {
|
|
45
|
+
const baseUrl = getCloudAssetBaseUrl();
|
|
46
|
+
if (
|
|
47
|
+
cachedManifest &&
|
|
48
|
+
cachedManifest.url === baseUrl &&
|
|
49
|
+
Date.now() - cachedManifest.loadedAt < CACHE_MS
|
|
50
|
+
) {
|
|
51
|
+
return cachedManifest.value;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(`${baseUrl}/v1/manifest`, { signal: AbortSignal.timeout(5_000) });
|
|
55
|
+
if (!response.ok) return null;
|
|
56
|
+
const value = (await response.json()) as CloudAssetManifestResponse;
|
|
57
|
+
if ((value.version !== 1 && value.version !== 2) || !Array.isArray(value.assets)) return null;
|
|
58
|
+
cachedManifest = { value, url: baseUrl, loadedAt: Date.now() };
|
|
59
|
+
return value;
|
|
60
|
+
} catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function findCloudAsset(id: string): Promise<CloudAssetRecord | null> {
|
|
66
|
+
return (await findCloudAssets([id]))[0] ?? null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function queryCloudAssets(ids: readonly string[]): Promise<CloudAssetRecord[] | null> {
|
|
70
|
+
if (ids.length === 0) return [];
|
|
71
|
+
const response = await fetch(`${getCloudAssetBaseUrl()}/graphql`, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: { 'Content-Type': 'application/json' },
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
query: `query CloudAssets($ids: [ID!]!) {
|
|
76
|
+
assetsByIds(ids: $ids) {
|
|
77
|
+
id familyId label status source name type license author sourceUrl attribution categories tags
|
|
78
|
+
files: deliveries {
|
|
79
|
+
label format
|
|
80
|
+
main { sha256 sizeBytes contentType relativePath }
|
|
81
|
+
dependencies { sha256 sizeBytes contentType relativePath }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}`,
|
|
85
|
+
variables: { ids },
|
|
86
|
+
}),
|
|
87
|
+
signal: AbortSignal.timeout(5_000),
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) return null;
|
|
90
|
+
const body = (await response.json()) as {
|
|
91
|
+
data?: { assetsByIds?: CloudAssetRecord[] };
|
|
92
|
+
errors?: unknown[];
|
|
93
|
+
};
|
|
94
|
+
return body.errors || !Array.isArray(body.data?.assetsByIds) ? null : body.data.assetsByIds;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Resolve exact hosted variants through GraphQL; REST manifest is rollout fallback only. */
|
|
98
|
+
export async function findCloudAssets(ids: readonly string[]): Promise<CloudAssetRecord[]> {
|
|
99
|
+
const uniqueIds = [...new Set(ids)];
|
|
100
|
+
const baseUrl = getCloudAssetBaseUrl();
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
const unresolved = uniqueIds.filter((id) => {
|
|
103
|
+
const cached = graphqlAssetCache.get(id);
|
|
104
|
+
return !cached || cached.baseUrl !== baseUrl || now - cached.loadedAt >= CACHE_MS;
|
|
105
|
+
});
|
|
106
|
+
try {
|
|
107
|
+
for (let offset = 0; offset < unresolved.length; offset += GRAPHQL_ID_BATCH) {
|
|
108
|
+
const batch = unresolved.slice(offset, offset + GRAPHQL_ID_BATCH);
|
|
109
|
+
const found = await queryCloudAssets(batch);
|
|
110
|
+
if (!found) throw new Error('GraphQL catalog unavailable.');
|
|
111
|
+
const byId = new Map(found.map((asset) => [asset.id, asset]));
|
|
112
|
+
for (const id of batch) {
|
|
113
|
+
graphqlAssetCache.set(id, { baseUrl, value: byId.get(id) ?? null, loadedAt: now });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return uniqueIds.flatMap((id) => {
|
|
117
|
+
const asset = graphqlAssetCache.get(id)?.value;
|
|
118
|
+
return asset ? [asset] : [];
|
|
119
|
+
});
|
|
120
|
+
} catch {
|
|
121
|
+
const manifest = await loadCloudAssetManifest();
|
|
122
|
+
const requested = new Set(uniqueIds);
|
|
123
|
+
return manifest?.assets.filter((asset) => requested.has(asset.id)) ?? [];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function cloudAssetObjectUrl(
|
|
128
|
+
assetId: string,
|
|
129
|
+
fileIndex: number,
|
|
130
|
+
dependencyIndex?: number,
|
|
131
|
+
): string {
|
|
132
|
+
const base = `${getCloudAssetBaseUrl()}/v1/assets/${encodeURIComponent(assetId)}/files/${fileIndex}`;
|
|
133
|
+
return dependencyIndex === undefined ? base : `${base}/dependencies/${dependencyIndex}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function parseCloudAssetObjectUrl(
|
|
137
|
+
value: string,
|
|
138
|
+
expectedAssetId: string,
|
|
139
|
+
): { fileIndex: number; dependencyIndex?: number } | null {
|
|
140
|
+
let url: URL;
|
|
141
|
+
try {
|
|
142
|
+
url = new URL(value);
|
|
143
|
+
} catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const expectedBase = new URL(getCloudAssetBaseUrl());
|
|
147
|
+
if (url.protocol !== 'https:' || url.origin !== expectedBase.origin || url.search || url.hash)
|
|
148
|
+
return null;
|
|
149
|
+
const prefix = expectedBase.pathname.replace(/\/$/, '');
|
|
150
|
+
const relativePath = url.pathname.slice(prefix.length);
|
|
151
|
+
const match = /^\/v1\/assets\/([a-f0-9]{24})\/files\/(\d+)(?:\/dependencies\/(\d+))?$/.exec(
|
|
152
|
+
relativePath,
|
|
153
|
+
);
|
|
154
|
+
if (!match || match[1] !== expectedAssetId) return null;
|
|
155
|
+
const parsed: { fileIndex: number; dependencyIndex?: number } = { fileIndex: Number(match[2]) };
|
|
156
|
+
if (match[3] !== undefined) parsed.dependencyIndex = Number(match[3]);
|
|
157
|
+
return parsed;
|
|
158
|
+
}
|