@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,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate-on-change (owner decision, GitHub issue #103): hand-editing
|
|
3
|
+
* project files is an accepted authoring path, so the dev server validates
|
|
4
|
+
* `vgai.project.json` on every write and
|
|
5
|
+
* surfaces failures immediately — instead of the previous behavior, where a
|
|
6
|
+
* bad hand-edit only errored at next load.
|
|
7
|
+
*
|
|
8
|
+
* This module owns CONTENT validation only — classify a path, then either
|
|
9
|
+
* parse+validate its JSON or, for a `src/` module, PARSE IT AS A PROGRAM and
|
|
10
|
+
* run the authoring detectors over it. It deliberately reuses the exact
|
|
11
|
+
* Zod-backed parser
|
|
12
|
+
* `validate-manifest.ts` ships to every project
|
|
13
|
+
* (`loadGameManifest`), never
|
|
14
|
+
* re-implementing schema logic. Debouncing, terminal/SSE/state reporting,
|
|
15
|
+
* and file-watcher wiring live in `editor-server.ts`, which owns the
|
|
16
|
+
* chokidar watchers and mutable project state this needs no knowledge of.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { readFile } from 'node:fs/promises';
|
|
20
|
+
import { transform } from 'esbuild';
|
|
21
|
+
import { ZodError } from 'zod';
|
|
22
|
+
import { AssetParseError } from '@volter/editor-threejs/asset-parse-error';
|
|
23
|
+
import { loadGameManifest } from '@volter/editor-project/manifest/load';
|
|
24
|
+
import { r3fAuthoringDiagnostics } from '../src/ui-source/r3f-project-contracts';
|
|
25
|
+
import { oidSurfaceSourceConflicts, resolveProjectFileRegion } from './project-root-surface';
|
|
26
|
+
import { findVendoredTarget } from './vendored-lock-recorder';
|
|
27
|
+
|
|
28
|
+
export type ValidatableKind = 'manifest' | 'source';
|
|
29
|
+
|
|
30
|
+
export interface ValidateProjectFileOptions {
|
|
31
|
+
/** The engine checkout, so a source file can be tested against the vendored
|
|
32
|
+
* game locks (`vendor/games/<id>.UPSTREAM.lock`). Omitted by callers that
|
|
33
|
+
* have no checkout to test against, which simply validates everything. */
|
|
34
|
+
readonly engineRoot?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Classify an absolute file path as one of the validate-on-change formats, or
|
|
39
|
+
* `null` if it's none of them. The manifest is a single fixed-name file at
|
|
40
|
+
* the project root (matched by basename — `vgai.project.json` never appears anywhere
|
|
41
|
+
* else in a project).
|
|
42
|
+
*/
|
|
43
|
+
export function classifyValidatableFile(absPath: string): ValidatableKind | null {
|
|
44
|
+
if (/[/\\]src[/\\].*\.[cm]?[jt]sx?$/.test(absPath)) return 'source';
|
|
45
|
+
const base = absPath.split(/[/\\]/).pop();
|
|
46
|
+
if (base === 'vgai.project.json') return 'manifest';
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ValidationOk {
|
|
51
|
+
ok: true;
|
|
52
|
+
warnings?: string[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ValidationFail {
|
|
56
|
+
ok: false;
|
|
57
|
+
/** One formatted message per issue — `path.to.field: message` for Zod
|
|
58
|
+
* issues, or the raw error message for read/parse/cross-field failures. */
|
|
59
|
+
errors: string[];
|
|
60
|
+
warnings?: string[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type ValidationResult = ValidationOk | ValidationFail;
|
|
64
|
+
|
|
65
|
+
function formatIssues(
|
|
66
|
+
issues: readonly { path: readonly PropertyKey[]; message: string }[],
|
|
67
|
+
): string[] {
|
|
68
|
+
// Zod v4's issue `path` is typed `PropertyKey[]` (it can carry a `symbol`
|
|
69
|
+
// for branded keys) — `Array.prototype.join` calls the implicit `ToString`
|
|
70
|
+
// coercion on each element, which THROWS for a bare symbol. Map through
|
|
71
|
+
// `String()` explicitly so this stays safe even on that rare path.
|
|
72
|
+
return issues.map((issue) => `${issue.path.map(String).join('.') || '(root)'}: ${issue.message}`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Run the Zod-backed manifest parser. Throws on failure (same contract as
|
|
76
|
+
* `loadGameManifest`) — `validateProjectFile` below is the one place that
|
|
77
|
+
* catches it. */
|
|
78
|
+
function parseByKind(json: unknown): void {
|
|
79
|
+
loadGameManifest(json);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Map a thrown parse error to its reported message list — one formatted
|
|
83
|
+
* entry per Zod issue for schema violations, or the raw message for a
|
|
84
|
+
* manifest cross-field `Error` (`loadGameManifest` throws those directly).
|
|
85
|
+
*
|
|
86
|
+
* Exported because it is the ONE readable rendering of a manifest failure:
|
|
87
|
+
* `project-view.ts` reports the same failure over `/__editor/project`'s
|
|
88
|
+
* `serving.error`, and a raw `ZodError.message` there is a pretty-printed
|
|
89
|
+
* JSON array of issue objects — the failing key is in it, buried twelve lines
|
|
90
|
+
* deep, which is not a diagnosis anyone reads. */
|
|
91
|
+
export function errorsFor(err: unknown): string[] {
|
|
92
|
+
if (err instanceof AssetParseError) return formatIssues(err.issues);
|
|
93
|
+
if (err instanceof ZodError) return formatIssues(err.issues);
|
|
94
|
+
return [err instanceof Error ? err.message : String(err)];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The esbuild loader for a project source file, chosen exactly the way the
|
|
98
|
+
* dev server's own transform chooses it. That parity is the whole point:
|
|
99
|
+
* anything Vite will serve has to survive this parse, and anything that fails
|
|
100
|
+
* here would have failed the dev server's transform too. `.js` is `jsx`, not
|
|
101
|
+
* `js`, for the same parity reason: the dev server accepts JSX inside a
|
|
102
|
+
* project's `.js` files (the CRA-era idiom — `vite-plugin-project-jsx-js.ts`
|
|
103
|
+
* is the serving half and names all three seams), so redding them here would
|
|
104
|
+
* fill `vgai status` with false errors for a game that mounts fine. `jsx` is
|
|
105
|
+
* a strict parse superset of `js`, so nothing formerly valid now reds. */
|
|
106
|
+
function sourceLoader(absPath: string): 'ts' | 'tsx' | 'jsx' {
|
|
107
|
+
if (/\.tsx$/i.test(absPath)) return 'tsx';
|
|
108
|
+
if (/\.[cm]?ts$/i.test(absPath)) return 'ts';
|
|
109
|
+
return 'jsx';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Does this file PARSE? Returns one formatted message per syntax error, or an
|
|
114
|
+
* empty array when the file is syntactically fine.
|
|
115
|
+
*
|
|
116
|
+
* Nothing else in this module answers that question — the detectors below are
|
|
117
|
+
* regexes and an error-TOLERANT `ts.createSourceFile`, so a project file that
|
|
118
|
+
* cannot be compiled at all used to validate `{ ok: true }` and the promised
|
|
119
|
+
* loud path stayed silent. The failure then surfaced only when the browser
|
|
120
|
+
* re-fetched the module, as a Vite transform error, which is the channel this
|
|
121
|
+
* verdict exists to make redundant.
|
|
122
|
+
*
|
|
123
|
+
* esbuild's `transform` (already a declared dependency of this package) is the
|
|
124
|
+
* cheapest real parser available and is the same one Vite runs, so the verdict
|
|
125
|
+
* matches what the dev server will do with the file. `target: 'esnext'` keeps
|
|
126
|
+
* it a PARSE: no syntax lowering, so nothing is reported for an environment
|
|
127
|
+
* this check has no opinion about.
|
|
128
|
+
*/
|
|
129
|
+
async function parseErrors(raw: string, absPath: string): Promise<string[]> {
|
|
130
|
+
try {
|
|
131
|
+
await transform(raw, { loader: sourceLoader(absPath), sourcefile: absPath, target: 'esnext' });
|
|
132
|
+
return [];
|
|
133
|
+
} catch (err) {
|
|
134
|
+
const messages = (err as { errors?: { text?: string; location?: EsbuildLocation }[] }).errors;
|
|
135
|
+
if (!Array.isArray(messages) || messages.length === 0) {
|
|
136
|
+
return [err instanceof Error ? err.message : String(err)];
|
|
137
|
+
}
|
|
138
|
+
return messages.map((message) => {
|
|
139
|
+
const text = message.text ?? 'syntax error';
|
|
140
|
+
const at = message.location;
|
|
141
|
+
// esbuild columns are 0-based; `+ 1` matches the 1-based `line:col` the
|
|
142
|
+
// R3F authoring warnings below already print.
|
|
143
|
+
return at ? `line ${at.line}:${at.column + 1}: ${text}` : text;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface EsbuildLocation {
|
|
149
|
+
line: number;
|
|
150
|
+
column: number;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async function validateSource(
|
|
154
|
+
raw: string,
|
|
155
|
+
absPath: string,
|
|
156
|
+
opts?: ValidateProjectFileOptions,
|
|
157
|
+
): Promise<ValidationResult> {
|
|
158
|
+
// Parse FIRST and short-circuit. Every detector below reads a source it
|
|
159
|
+
// cannot trust once the file is unparseable, so their findings would be
|
|
160
|
+
// noise stacked on top of the one error that actually matters.
|
|
161
|
+
const syntax = await parseErrors(raw, absPath);
|
|
162
|
+
if (syntax.length > 0) return { ok: false, errors: syntax };
|
|
163
|
+
|
|
164
|
+
// PARSE-ONLY inside a lock-recorded vendored game. Everything below this line
|
|
165
|
+
// is ADVICE TO EDIT THE FILE — "declare a react adapter root", "accept and
|
|
166
|
+
// spread the matching ThreeElements props", "add the ordinary R3F name prop"
|
|
167
|
+
// — and a vendored game's bytes are pinned by `vendor/games/<id>.UPSTREAM.lock`
|
|
168
|
+
// to the upstream commit. A real deviation there is a RECORDED PATCH with a
|
|
169
|
+
// written rationale, a deliberate act; a background linter repeating
|
|
170
|
+
// unactionable advice about upstream code on every boot is noise a reader
|
|
171
|
+
// cannot act on and cannot clear. The parse verdict above still applies,
|
|
172
|
+
// because that one is actionable: a vendored file that does not parse is a
|
|
173
|
+
// mount that will fail.
|
|
174
|
+
//
|
|
175
|
+
// Measured on the repo-vendored racing-game the moment the boot scan started
|
|
176
|
+
// covering the manifest's real source tree: 1 error + 13 warnings, all of
|
|
177
|
+
// them asking for edits to pinned upstream bytes — including
|
|
178
|
+
// `src/main.tsx`'s `createRoot`, the game's own standalone page entry, which
|
|
179
|
+
// the host shim deliberately never imports.
|
|
180
|
+
if (opts?.engineRoot && findVendoredTarget(absPath, opts.engineRoot)) return { ok: true };
|
|
181
|
+
|
|
182
|
+
// The R3F authoring rules apply to a `three` region and to nothing else, and
|
|
183
|
+
// "which region?" is the resolver's answer, never the file's own text. This
|
|
184
|
+
// call site has no live import graph, so it gets the graph-FREE half —
|
|
185
|
+
// declared region `include` globs and root entries — exactly as its
|
|
186
|
+
// `oidSurfaceSourceConflicts` sibling below does, and for the same reason:
|
|
187
|
+
// without a graph every non-entry file looks unplaced, and reporting on that
|
|
188
|
+
// basis is a claim the tier cannot support. The reach-dependent files are
|
|
189
|
+
// analyzed at stamp time (`vite-plugin-ui-oid.ts`), where the graph exists.
|
|
190
|
+
const knownThreeSurface = resolveProjectFileRegion(absPath).surface === 'three';
|
|
191
|
+
const warnings = [
|
|
192
|
+
...r3fAuthoringDiagnostics(raw, absPath, { knownThreeSurface }).map(
|
|
193
|
+
(diagnostic) =>
|
|
194
|
+
`line ${diagnostic.line}:${diagnostic.col + 1} [${diagnostic.code}] ${diagnostic.message}`,
|
|
195
|
+
),
|
|
196
|
+
// Task #45 — the OID-stamping surface conflicts that make an element
|
|
197
|
+
// unselectable in the editor. Only the graph-FREE subset belongs here (see
|
|
198
|
+
// `oidSurfaceSourceConflicts`); the reach-dependent ones are reported at
|
|
199
|
+
// stamp time by `vite-plugin-ui-oid.ts`, where a live import graph exists.
|
|
200
|
+
...oidSurfaceSourceConflicts(absPath, raw).map(
|
|
201
|
+
(diagnostic) => `[${diagnostic.code}] ${diagnostic.message}`,
|
|
202
|
+
),
|
|
203
|
+
];
|
|
204
|
+
return { ok: true, ...(warnings.length > 0 ? { warnings } : {}) };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Validate one project file's on-disk content against the same schema the
|
|
209
|
+
* engine's runtime loader and `validate-scenes.ts`/`validate-manifest.ts`
|
|
210
|
+
* enforce. Never throws — a file-watcher callback has no caller to catch a
|
|
211
|
+
* throw, so every failure mode (unreadable file, malformed JSON, schema
|
|
212
|
+
* violation, manifest cross-field rule) collapses into a `ValidationFail`
|
|
213
|
+
* with one or more human-readable messages.
|
|
214
|
+
*/
|
|
215
|
+
export async function validateProjectFile(
|
|
216
|
+
absPath: string,
|
|
217
|
+
kind: ValidatableKind,
|
|
218
|
+
opts?: ValidateProjectFileOptions,
|
|
219
|
+
): Promise<ValidationResult> {
|
|
220
|
+
let raw: string;
|
|
221
|
+
try {
|
|
222
|
+
raw = await readFile(absPath, 'utf-8');
|
|
223
|
+
} catch (err) {
|
|
224
|
+
// Most commonly ENOENT — a delete (or a rename's transient unlink) racing
|
|
225
|
+
// the debounce timer. Not this module's job to distinguish; just report.
|
|
226
|
+
return {
|
|
227
|
+
ok: false,
|
|
228
|
+
errors: [`could not read file: ${err instanceof Error ? err.message : String(err)}`],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
let json: unknown;
|
|
233
|
+
if (kind === 'source') return validateSource(raw, absPath, opts);
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
json = JSON.parse(raw);
|
|
237
|
+
} catch (err) {
|
|
238
|
+
return {
|
|
239
|
+
ok: false,
|
|
240
|
+
errors: [`invalid JSON: ${err instanceof Error ? err.message : String(err)}`],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
parseByKind(json);
|
|
246
|
+
return { ok: true };
|
|
247
|
+
} catch (err) {
|
|
248
|
+
return { ok: false, errors: errorsFor(err) };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PROJECT'S OWN FILES, AS FACTS — the server half of the `project.*`
|
|
3
|
+
* coverage family (`src/coverage/project-verb-coverage.ts`).
|
|
4
|
+
*
|
|
5
|
+
* Two files the browser cannot read for itself, and neither is served as part
|
|
6
|
+
* of the project's asset tree: the project's `package.json` (the dev server
|
|
7
|
+
* serves `public/`-scoped assets, and a root-level read there returns the SPA
|
|
8
|
+
* fallback — the same trap that once hid `vgai.project.json` from a manifest
|
|
9
|
+
* reader), and the resolved manifest's root adapters.
|
|
10
|
+
*
|
|
11
|
+
* FACTS ONLY. Nothing here decides whether a verb is present: it reports the
|
|
12
|
+
* script names that exist and the adapter each root resolved to, and the pure
|
|
13
|
+
* rules on the client turn those into rows. Keeping the verdict client-side is
|
|
14
|
+
* what lets the whole table be unit-tested with no server, and keeps ONE place
|
|
15
|
+
* to read when a row's wording is wrong.
|
|
16
|
+
*
|
|
17
|
+
* `scripts: null` is reserved for "this project has no package.json" — which is
|
|
18
|
+
* a different answer from an empty scripts block, and the rules say so.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { readFile } from 'node:fs/promises';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { loadGameManifestDir } from '@volter/editor-project/manifest/load-file';
|
|
24
|
+
|
|
25
|
+
export interface ProjectVerbRootFact {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly type: string;
|
|
28
|
+
readonly identity: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ProjectVerbFactsResponse {
|
|
32
|
+
/** Script NAMES only — a command line is not a fact any row reads, and not
|
|
33
|
+
* something to hand a browser. `null` ⇒ the question could not be answered;
|
|
34
|
+
* `[]` with {@link ProjectVerbFactsResponse.hasPackageJson} `false` is the
|
|
35
|
+
* MEASURED answer "there is no package.json here", which is a different
|
|
36
|
+
* thing and produces a different row. */
|
|
37
|
+
readonly scripts: readonly string[] | null;
|
|
38
|
+
/** Whether a readable `package.json` exists at the project root. */
|
|
39
|
+
readonly hasPackageJson: boolean;
|
|
40
|
+
/** Dependency NAMES (runtime + dev, merged), on the same discipline as
|
|
41
|
+
* {@link ProjectVerbFactsResponse.scripts}: names are facts a row reads, a
|
|
42
|
+
* version range is not. `null` ⇒ the question could not be answered.
|
|
43
|
+
*
|
|
44
|
+
* Read by the `system.*` family's DETECTOR half: a project that ships a
|
|
45
|
+
* physics library while nothing binds a physics adapter is a contradiction,
|
|
46
|
+
* and the host's "nothing built a physics world" inference is not safe to
|
|
47
|
+
* print as settled over it. */
|
|
48
|
+
readonly dependencies: readonly string[] | null;
|
|
49
|
+
/** Resolved manifest roots, or `null` when the manifest could not be read
|
|
50
|
+
* (which the client reports as unmeasured, never as a clean answer). */
|
|
51
|
+
readonly roots: readonly ProjectVerbRootFact[] | null;
|
|
52
|
+
/** Why a `null` above is null, in this module's own words. */
|
|
53
|
+
readonly unavailable: string | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Read both facts for `projectRoot`. Never throws: every failure becomes a
|
|
57
|
+
* named `unavailable`, because "I could not look" is a real answer here and
|
|
58
|
+
* an exception would be reported as "no project" by the caller. */
|
|
59
|
+
export async function readProjectVerbFacts(
|
|
60
|
+
projectRoot: string | null,
|
|
61
|
+
): Promise<ProjectVerbFactsResponse> {
|
|
62
|
+
if (!projectRoot) {
|
|
63
|
+
return {
|
|
64
|
+
scripts: null,
|
|
65
|
+
hasPackageJson: false,
|
|
66
|
+
dependencies: null,
|
|
67
|
+
roots: null,
|
|
68
|
+
unavailable: 'no project folder is open, so there are no project files to read',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const reasons: string[] = [];
|
|
72
|
+
let scripts: readonly string[] | null = null;
|
|
73
|
+
let dependencies: readonly string[] | null = null;
|
|
74
|
+
let hasPackageJson = false;
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(await readFile(join(projectRoot, 'package.json'), 'utf-8')) as {
|
|
77
|
+
scripts?: unknown;
|
|
78
|
+
dependencies?: unknown;
|
|
79
|
+
devDependencies?: unknown;
|
|
80
|
+
};
|
|
81
|
+
hasPackageJson = true;
|
|
82
|
+
scripts =
|
|
83
|
+
parsed.scripts && typeof parsed.scripts === 'object'
|
|
84
|
+
? Object.keys(parsed.scripts as Record<string, unknown>)
|
|
85
|
+
: [];
|
|
86
|
+
const names = new Set<string>();
|
|
87
|
+
for (const block of [parsed.dependencies, parsed.devDependencies]) {
|
|
88
|
+
if (block && typeof block === 'object') {
|
|
89
|
+
for (const name of Object.keys(block as Record<string, unknown>)) names.add(name);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
dependencies = [...names];
|
|
93
|
+
} catch (error) {
|
|
94
|
+
// ENOENT is the MEASURED answer "this project has no package.json" — an
|
|
95
|
+
// empty script set with `hasPackageJson: false`, which the rules report as
|
|
96
|
+
// a real gap. Any OTHER failure (unreadable, malformed JSON) is a fact
|
|
97
|
+
// nobody could read, and is named instead of being flattened into it.
|
|
98
|
+
const code = (error as { code?: unknown }).code;
|
|
99
|
+
if (code === 'ENOENT') {
|
|
100
|
+
scripts = [];
|
|
101
|
+
dependencies = [];
|
|
102
|
+
} else {
|
|
103
|
+
reasons.push(
|
|
104
|
+
`this project's package.json could not be read (${error instanceof Error ? error.message : String(error)})`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let roots: readonly ProjectVerbRootFact[] | null = null;
|
|
109
|
+
try {
|
|
110
|
+
roots = loadGameManifestDir(projectRoot).roots.map((root) => ({
|
|
111
|
+
id: root.id,
|
|
112
|
+
type: root.adapter.type,
|
|
113
|
+
identity: root.adapter.identity,
|
|
114
|
+
}));
|
|
115
|
+
} catch (error) {
|
|
116
|
+
reasons.push(
|
|
117
|
+
`this project's vgai.project.json could not be resolved (${error instanceof Error ? error.message : String(error)})`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
scripts,
|
|
122
|
+
hasPackageJson,
|
|
123
|
+
dependencies,
|
|
124
|
+
roots,
|
|
125
|
+
unavailable: reasons.length > 0 ? reasons.join('; ') : null,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Server-side editor view of the single v2 project configuration. */
|
|
2
|
+
|
|
3
|
+
import { hasRootOnSurface } from '@volter/editor-project/adapter/manifest-interpreter';
|
|
4
|
+
import { loadGameManifestDir } from '@volter/editor-project/manifest/load-file';
|
|
5
|
+
import { ensureProjectConfigurationKinds } from './project-kinds';
|
|
6
|
+
import { errorsFor } from './project-validation';
|
|
7
|
+
|
|
8
|
+
export type ProjectView = Record<string, unknown>;
|
|
9
|
+
|
|
10
|
+
export type ProjectViewResult = { ok: true; view: ProjectView } | { ok: false; error: string };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Read `vgai.project.json`, keeping the REASON a read failed.
|
|
14
|
+
*
|
|
15
|
+
* Boot routing needs that reason: a server serving a project whose manifest it
|
|
16
|
+
* cannot read is not the same thing as a server with no project open, and
|
|
17
|
+
* collapsing the two is what dropped the editor page onto the launcher for a
|
|
18
|
+
* project the server was — and still is — serving. There is no fallback config
|
|
19
|
+
* file; a missing or invalid manifest is still not a loadable project, it is
|
|
20
|
+
* just a loud one.
|
|
21
|
+
*
|
|
22
|
+
* The reason is rendered by `project-validation.ts`'s `errorsFor` — the same
|
|
23
|
+
* `path.to.field: message` form the watcher's terminal/console/`vgai status`
|
|
24
|
+
* legs already print — because this string is read by people and by agents:
|
|
25
|
+
* the editor's startup-error screen, `vgai sessions`, and `@vgai/live`'s
|
|
26
|
+
* refusal all quote it. A bare `ZodError.message` is a pretty-printed JSON
|
|
27
|
+
* array of issue objects; it contains the failing key and hides it.
|
|
28
|
+
*/
|
|
29
|
+
export async function readProjectViewResult(root: string): Promise<ProjectViewResult> {
|
|
30
|
+
try {
|
|
31
|
+
const kindErrors = await ensureProjectConfigurationKinds(root);
|
|
32
|
+
if (kindErrors.length > 0) return { ok: false, error: kindErrors.join('\n') };
|
|
33
|
+
const manifest = loadGameManifestDir(root);
|
|
34
|
+
return {
|
|
35
|
+
ok: true,
|
|
36
|
+
view: {
|
|
37
|
+
...manifest,
|
|
38
|
+
hasThreeRoot: hasRootOnSurface(manifest, 'three'),
|
|
39
|
+
rootCount: manifest.roots.length,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
} catch (error) {
|
|
43
|
+
return { ok: false, error: errorsFor(error).join('\n') };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The view, or null when it could not be read. See `readProjectViewResult`
|
|
48
|
+
* when the caller must be able to say WHY. */
|
|
49
|
+
export async function readProjectView(root: string): Promise<ProjectView | null> {
|
|
50
|
+
const result = await readProjectViewResult(root);
|
|
51
|
+
return result.ok ? result.view : null;
|
|
52
|
+
}
|