@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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT THE SESSION IS DOING RIGHT NOW, and the agent-facing doors that read
|
|
3
|
+
* it: `/__editor/state`, `/__editor/validation-log`, `/__editor/editor-state`
|
|
4
|
+
* and the `/__vgai*` family.
|
|
5
|
+
*
|
|
6
|
+
* `/__vgai` is the agent poke surface — one self-describing index over the
|
|
7
|
+
* status, validation, provider-state and screenshot reads beneath it. The
|
|
8
|
+
* screenshot route is deliberately SERVER-side: the server owns the
|
|
9
|
+
* filesystem, so the PNG lands under the project where an agent's file reader
|
|
10
|
+
* can open it without leaving its sandbox.
|
|
11
|
+
*
|
|
12
|
+
* `/__editor/editor-state` is the durable half (`.vgai/editor-state.json`);
|
|
13
|
+
* `/__editor/state` is the live half a browser tab reports and the CLI reads.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { join, relative } from 'node:path';
|
|
18
|
+
import {
|
|
19
|
+
assertEditorCompatibility,
|
|
20
|
+
assertProjectCompatibility,
|
|
21
|
+
ProjectCompatibilityError,
|
|
22
|
+
} from '@volter/editor-sdk/session/editor-compatibility';
|
|
23
|
+
import type { Request, Response } from 'express';
|
|
24
|
+
import type { EditorServerRouter } from '../editor-server';
|
|
25
|
+
import { clientCount } from '../editor-sse';
|
|
26
|
+
import { readProjectView } from '../project-view';
|
|
27
|
+
import { commandResponseFor } from '../server-utils';
|
|
28
|
+
import type { RouteContext } from './context';
|
|
29
|
+
import type { ControlPlane } from './control-plane';
|
|
30
|
+
|
|
31
|
+
export function registerProjectStateRoutes(
|
|
32
|
+
router: EditorServerRouter,
|
|
33
|
+
ctx: RouteContext,
|
|
34
|
+
plane: ControlPlane,
|
|
35
|
+
): void {
|
|
36
|
+
const {
|
|
37
|
+
compatibilityIdentity,
|
|
38
|
+
consoleLedger,
|
|
39
|
+
currentValidationLogEntries,
|
|
40
|
+
editorStatesByClient,
|
|
41
|
+
engineRoot,
|
|
42
|
+
participantConnections,
|
|
43
|
+
projectValidation,
|
|
44
|
+
projectWarnings,
|
|
45
|
+
trustedShareIdentity,
|
|
46
|
+
} = ctx;
|
|
47
|
+
const {
|
|
48
|
+
clientsInDeliveryOrder,
|
|
49
|
+
decorateWithCommandListener,
|
|
50
|
+
handleEditorState,
|
|
51
|
+
relayCommandResult,
|
|
52
|
+
tabTableFor,
|
|
53
|
+
} = plane;
|
|
54
|
+
|
|
55
|
+
// ---- Editor state (browser reports / CLI reads) ----
|
|
56
|
+
router.get('/__editor/state', async (req: Request, res: Response) => {
|
|
57
|
+
// `ctx.editorState` is the last snapshot a browser POSTed; it persists even
|
|
58
|
+
// after every tab closes. Stamp the response with the TAB TABLE so callers
|
|
59
|
+
// can distinguish "a tab is here now" from "this is stale cache from a tab
|
|
60
|
+
// that has since gone away" — and, when a tab is here but quiet, see the
|
|
61
|
+
// heartbeat ages that say so.
|
|
62
|
+
const stateParticipantId =
|
|
63
|
+
trustedShareIdentity(req)?.participantId ??
|
|
64
|
+
ctx.hostParticipantId ??
|
|
65
|
+
(participantConnections.size > 0 ? '__vgai_missing_local_host__' : undefined);
|
|
66
|
+
const table = tabTableFor(stateParticipantId ?? null);
|
|
67
|
+
// `connected`/`editorsConnected` derive from the TABLE, never from a
|
|
68
|
+
// socket count: a tab mid-reload holds no socket and is still here, and a
|
|
69
|
+
// socket without a tab behind it was never worth counting.
|
|
70
|
+
const reported = table?.report() ?? [];
|
|
71
|
+
const connected = reported.length;
|
|
72
|
+
// P36: the table's `channel`/`unresponsive` are facts about the CONTROL
|
|
73
|
+
// CHANNEL, which the pre-React entry opens before any module loads. A page
|
|
74
|
+
// that dies during boot therefore reads as fully healthy there. This is the
|
|
75
|
+
// fact about the DOCUMENT, decorated on per tab from the receipt/attach
|
|
76
|
+
// paths the relay already uses — never synthesized when a tab is unknown.
|
|
77
|
+
const tabs = decorateWithCommandListener(reported, table, Date.now());
|
|
78
|
+
// TABS THAT ARE GONE, and what happened to them. `closed` and `crashed`
|
|
79
|
+
// are verdicts about a tab that is no longer present, so they can only be
|
|
80
|
+
// said from the table's short departure memory — and they are the two
|
|
81
|
+
// answers nobody could get before (2026-09-17: a renderer killed by a
|
|
82
|
+
// dev-server reload and a wedged main thread reached every reader as the
|
|
83
|
+
// same silence). A SEPARATE array from `tabs` above, because
|
|
84
|
+
// `editorsConnected` counts that one and a dead row inside it would make a
|
|
85
|
+
// crashed tab read as a connected one.
|
|
86
|
+
const departedTabs = table?.departedReport() ?? [];
|
|
87
|
+
// The snapshot to report is the BLESSED TAB's own — one truth, the same
|
|
88
|
+
// one the relay routes to. Reading it from a separately-computed
|
|
89
|
+
// "controller" was how `vgai status` and `vgai play` could disagree about
|
|
90
|
+
// which tab they were talking about.
|
|
91
|
+
const blessed = table?.blessedTabId() ?? null;
|
|
92
|
+
const controllerClientId =
|
|
93
|
+
blessed === null ? undefined : clientsInDeliveryOrder(blessed, table)[0];
|
|
94
|
+
// A reload can leave the outgoing page registered for minutes. Select
|
|
95
|
+
// the relay's preferred page before looking up its snapshot: falling
|
|
96
|
+
// through to an older page would report stopped while the successor runs,
|
|
97
|
+
// or playing before the successor has mounted anything.
|
|
98
|
+
const controlledState =
|
|
99
|
+
controllerClientId === undefined ? undefined : editorStatesByClient.get(controllerClientId);
|
|
100
|
+
const useUnscopedState = blessed === null && !stateParticipantId;
|
|
101
|
+
const state = controlledState?.state ?? (useUnscopedState ? ctx.editorState : {});
|
|
102
|
+
const stateUpdatedAt =
|
|
103
|
+
controlledState?.updatedAt ?? (useUnscopedState ? ctx.editorStateUpdatedAt : null);
|
|
104
|
+
// #124: project identity, server-computed exactly like `projectValidation`
|
|
105
|
+
// below (never part of the browser-POSTed snapshot) — lets a watcher/relay
|
|
106
|
+
// holding only a port number tell which project that port serves. Mirrors
|
|
107
|
+
// `/__editor/project`'s own `ctx.projectRoot === engineRoot` -> "no project"
|
|
108
|
+
// convention rather than introducing a new one.
|
|
109
|
+
const projectOpen = ctx.projectRoot !== engineRoot;
|
|
110
|
+
const view = projectOpen ? await readProjectView(ctx.projectRoot) : null;
|
|
111
|
+
const nameField = view?.['name'];
|
|
112
|
+
// The compatibility verdict for the project this server is SERVING.
|
|
113
|
+
//
|
|
114
|
+
// The gate itself is not new: the browser preflights it on activation and
|
|
115
|
+
// renders the refusal, and the project-switch endpoint enforces it. But an
|
|
116
|
+
// editor started on an incompatible project serves happily — the server
|
|
117
|
+
// never activates anything — so the refusal lived only in the tab, and
|
|
118
|
+
// every CLI surface reported a healthy session. `vgai status` said
|
|
119
|
+
// `connected: true` with empty validation, and `vgai play` timed out into
|
|
120
|
+
// "Editor reloaded during play startup; retrying…", which reads as a flaky
|
|
121
|
+
// socket and sends you bisecting the toolchain. An agent drives this editor
|
|
122
|
+
// THROUGH the CLI, so a gate that reports itself only in pixels is
|
|
123
|
+
// invisible by construction, and the retry message actively misdirects.
|
|
124
|
+
//
|
|
125
|
+
// Server-computed on every read like its `projectValidation` neighbour, so
|
|
126
|
+
// it cannot go stale against a project switch or an edited manifest.
|
|
127
|
+
const projectCompatibility = (() => {
|
|
128
|
+
if (!view) return null;
|
|
129
|
+
try {
|
|
130
|
+
const identity = compatibilityIdentity();
|
|
131
|
+
assertEditorCompatibility(identity);
|
|
132
|
+
assertProjectCompatibility(view, identity);
|
|
133
|
+
return null;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (error instanceof ProjectCompatibilityError) {
|
|
136
|
+
return { error: error.message, recovery: error.recovery };
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
})();
|
|
141
|
+
res.json({
|
|
142
|
+
// FIRST key, for the same reason `commandResponseFor` puts it first: the
|
|
143
|
+
// unresolved console set is the one fact a reader must not scroll past.
|
|
144
|
+
// Server-computed, so it is current even when the browser-POSTed
|
|
145
|
+
// snapshot below is stale cache from a tab that has since died — which
|
|
146
|
+
// is exactly the case the whole ledger exists for.
|
|
147
|
+
unresolvedConsole: consoleLedger.summary(),
|
|
148
|
+
...state,
|
|
149
|
+
// The session's own children, computed here on every read like
|
|
150
|
+
// `projectValidation` below — never part of the browser-POSTed snapshot,
|
|
151
|
+
// which is a page's report about itself and knows nothing about a
|
|
152
|
+
// workbench this process spawned.
|
|
153
|
+
workbench: ctx.options.workbench?.() ?? null,
|
|
154
|
+
product: ctx.options.product?.() ?? null,
|
|
155
|
+
editorsConnected: connected,
|
|
156
|
+
connected: connected > 0,
|
|
157
|
+
// The whole table, one row per present tab. Owner: "if they DO get
|
|
158
|
+
// disconnected make it clear that it happened" — `lastBeatAgo` and
|
|
159
|
+
// `epochCount` are how an agent sees a gap or a reload loop without
|
|
160
|
+
// reading a log.
|
|
161
|
+
tabs,
|
|
162
|
+
departedTabs,
|
|
163
|
+
// The auto-open runaway guard's state, so a session that gave up
|
|
164
|
+
// opening windows says so where somebody will read it.
|
|
165
|
+
tabAutoOpen: {},
|
|
166
|
+
// #run2-cold-vite: null until the FIRST genuine index-page GET this
|
|
167
|
+
// server has served (see the response-observing middleware above).
|
|
168
|
+
// P20 also reads it as "when the running document last fully loaded",
|
|
169
|
+
// which is what the asset-divergence comparison below needs.
|
|
170
|
+
lastIndexRequestAt: ctx.lastIndexRequestAt,
|
|
171
|
+
// P20 — server-OBSERVED writes under `public/` (the same chokidar
|
|
172
|
+
// watcher that broadcasts `assets-changed`), never browser-reported.
|
|
173
|
+
// `lastChangedAt: null` means nothing has changed this server lifetime,
|
|
174
|
+
// which is not the same as "the page's caches are current".
|
|
175
|
+
publicAssets: {
|
|
176
|
+
lastChangedAt: ctx.publicAssetsLastChangedAt,
|
|
177
|
+
lastPath: ctx.publicAssetsLastPath,
|
|
178
|
+
changedCount: ctx.publicAssetsChangedCount,
|
|
179
|
+
},
|
|
180
|
+
...(stateUpdatedAt !== null ? { stateUpdatedAt } : {}),
|
|
181
|
+
// WHEN THIS ANSWER WAS COMPOSED. `stateUpdatedAt` above is the PAGE's
|
|
182
|
+
// reading (when a tab last POSTed its snapshot); this is the SERVER's,
|
|
183
|
+
// and every field it computes itself — the tab table, project
|
|
184
|
+
// validation, public-asset writes — is as of this instant. A reader with
|
|
185
|
+
// both can age each half against the right clock instead of assuming a
|
|
186
|
+
// snapshot is current because it arrived just now. Always present: an
|
|
187
|
+
// answer with no time on it is the whole defect this closes.
|
|
188
|
+
servedAt: Date.now(),
|
|
189
|
+
// #103: server-computed (never part of the browser-POSTed snapshot
|
|
190
|
+
// above), so it's always current — a file present here is currently
|
|
191
|
+
// failing validation; a clean project reports `{}`. `vgai status`
|
|
192
|
+
// prints this whole object as-is, so no CLI changes were needed to
|
|
193
|
+
// surface it.
|
|
194
|
+
projectValidation: Object.fromEntries(projectValidation),
|
|
195
|
+
projectWarnings: Object.fromEntries(projectWarnings),
|
|
196
|
+
// PD-14: the qualifier on the two maps above — `'awaiting-src'` means
|
|
197
|
+
// the source half of that pass is not running at all, so an empty
|
|
198
|
+
// `projectValidation` says nothing about `src/`. Server-computed like
|
|
199
|
+
// its neighbors, so it is always current.
|
|
200
|
+
sourceValidation: ctx.sourceValidation,
|
|
201
|
+
// `null` when the project and this editor agree — the same always-present
|
|
202
|
+
// shape as the two maps above, so an absent key never has to be read as
|
|
203
|
+
// either "compatible" or "not checked".
|
|
204
|
+
projectCompatibility,
|
|
205
|
+
projectRoot: projectOpen ? ctx.projectRoot : null,
|
|
206
|
+
projectName: typeof nameField === 'string' ? nameField : null,
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
router.post('/__editor/state', (req: Request, res: Response) => {
|
|
211
|
+
const outcome = handleEditorState(req.body as Record<string, unknown>);
|
|
212
|
+
if (outcome.status === 200) res.json({ ok: true });
|
|
213
|
+
else res.status(outcome.status).json({ error: outcome.error });
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// ---- #146: the agent poke surface (rung 2)
|
|
217
|
+
//
|
|
218
|
+
// Plain-GET reads for the operations an agent repeats most — check state,
|
|
219
|
+
// check validation, grab a frame. Deliberately curl-shaped: no JSON body to
|
|
220
|
+
// quote, terse output, and bulky payloads returned as PATHS inside the
|
|
221
|
+
// project (never blobs — an agent's context budget is metered, and a
|
|
222
|
+
// sandboxed agent can read project-internal paths without permission
|
|
223
|
+
// prompts). Mutations stay on POST `/__editor/command`. The index below is
|
|
224
|
+
// the wire's self-discovery: arbitrary endpoint names are fine when
|
|
225
|
+
// queryable, fatal when memorized.
|
|
226
|
+
router.get('/__vgai', (_req: Request, res: Response) => {
|
|
227
|
+
res.json({
|
|
228
|
+
project: ctx.projectRoot !== engineRoot ? ctx.projectRoot : null,
|
|
229
|
+
connected: clientCount() > 0,
|
|
230
|
+
endpoints: {
|
|
231
|
+
'GET /__vgai': 'this index',
|
|
232
|
+
'GET /__vgai/state': 'every observable game-state provider (play mode must be running)',
|
|
233
|
+
'GET /__vgai/state/:provider': 'one provider, e.g. /__vgai/state/gemGame',
|
|
234
|
+
'GET /__vgai/validation':
|
|
235
|
+
'validate-on-save results for this project (failing: {} means clean)',
|
|
236
|
+
'GET /__vgai/screenshot':
|
|
237
|
+
'capture the live game canvas to <project>/.vgai/captures/<ts>.png and return its path',
|
|
238
|
+
'POST /__editor/command': 'the full command relay (bridge-call, play, stop, select, …)',
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// The edit→verify loop's other half: after writing a scene/manifest/asset
|
|
244
|
+
// file, one cheap GET answers "was my last save accepted?" instead of
|
|
245
|
+
// tailing the (detached) dev-server log. Same server-computed map
|
|
246
|
+
// `/__editor/state` exposes as `projectValidation`, purpose-shaped.
|
|
247
|
+
// PD-13: the same validation state, pre-formatted as `server-log` payloads
|
|
248
|
+
// so a tab can PULL what it missed.
|
|
249
|
+
//
|
|
250
|
+
// `server-log` is a live broadcast and nothing replays it, but both maps are
|
|
251
|
+
// routinely populated with no tab attached: the boot scan
|
|
252
|
+
// (`validateSourceTree`, run from `startWatcher()` while the server is still
|
|
253
|
+
// coming up) precedes every browser connection, and `runFileValidation`
|
|
254
|
+
// deliberately re-broadcasts a warning only when its SET CHANGES. So the
|
|
255
|
+
// terminal carried the R3F00x findings, `/__editor/state` carried them, and
|
|
256
|
+
// the editor console — the third surface the project manual promises — was
|
|
257
|
+
// empty. This is a GET rather than a write-on-SSE-connect because
|
|
258
|
+
// `connectEvents()` hands back a SHARED, ref-counted EventSource: whichever
|
|
259
|
+
// consumer opens it first wins the socket, so anything the server writes at
|
|
260
|
+
// connect time can land before `connectServerLogs()` has attached its
|
|
261
|
+
// listener (measured — the same race the tab-lifecycle listeners are
|
|
262
|
+
// installed in-tick to avoid). A pull cannot race.
|
|
263
|
+
//
|
|
264
|
+
// The server stays the single formatter: these are byte-identical to the
|
|
265
|
+
// live broadcast's payloads, so a replayed line and a live one render
|
|
266
|
+
// through exactly one path in `editor-console.ts`.
|
|
267
|
+
router.get('/__editor/validation-log', (_req: Request, res: Response) => {
|
|
268
|
+
res.json({ entries: currentValidationLogEntries() });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
router.get('/__vgai/validation', (_req: Request, res: Response) => {
|
|
272
|
+
res.json({
|
|
273
|
+
clean: projectValidation.size === 0,
|
|
274
|
+
failing: Object.fromEntries(projectValidation),
|
|
275
|
+
warnings: Object.fromEntries(projectWarnings),
|
|
276
|
+
// PD-14: "was my last save accepted?" has a third answer — "nothing
|
|
277
|
+
// under src/ was looked at". `clean: true` alone would be a lie while
|
|
278
|
+
// this reads `'awaiting-src'`.
|
|
279
|
+
sourceValidation: ctx.sourceValidation,
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
router.get('/__vgai/state', async (_req: Request, res: Response) => {
|
|
284
|
+
const result = await relayCommandResult({
|
|
285
|
+
type: 'bridge-call',
|
|
286
|
+
method: 'stateAll',
|
|
287
|
+
callArgs: [],
|
|
288
|
+
});
|
|
289
|
+
const { status, body } = commandResponseFor(result, consoleLedger.summary());
|
|
290
|
+
res.status(status).json(body);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
router.get('/__vgai/state/:provider', async (req: Request, res: Response) => {
|
|
294
|
+
const result = await relayCommandResult({
|
|
295
|
+
type: 'bridge-call',
|
|
296
|
+
method: 'state',
|
|
297
|
+
callArgs: [req.params['provider']],
|
|
298
|
+
});
|
|
299
|
+
const { status, body } = commandResponseFor(result, consoleLedger.summary());
|
|
300
|
+
res.status(status).json(body);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// Paths-not-blobs: the page hands back base64 over the relay
|
|
304
|
+
// (`bridge-screenshot` — a pure "hand back the pixels" primitive), and THIS
|
|
305
|
+
// side owns the filesystem, so the PNG lands under the project where the
|
|
306
|
+
// agent's Read tool can open it without leaving the sandbox.
|
|
307
|
+
router.get('/__vgai/screenshot', async (_req: Request, res: Response) => {
|
|
308
|
+
if (ctx.projectRoot === engineRoot) {
|
|
309
|
+
res.status(400).json({ ok: false, error: 'no project open' });
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
let result = await relayCommandResult({ type: 'bridge-screenshot' });
|
|
313
|
+
// A starved host loop is not a dead end. The page refuses its provably
|
|
314
|
+
// stale canvas with `BRIDGE_SCREENSHOT_STALE`
|
|
315
|
+
// and names the recovery — but a poke surface has nobody to read the
|
|
316
|
+
// sentence and no way to foreground a browser tab, so it takes the
|
|
317
|
+
// recovery itself: one deterministic tick, captured, and stamped
|
|
318
|
+
// `loopRecoveryFrame` in the response so the frame is never mistaken for
|
|
319
|
+
// ordinary presentation. The refusal survives only if the refresh fails.
|
|
320
|
+
if (!result.ok && result.data?.['code'] === 'BRIDGE_SCREENSHOT_STALE') {
|
|
321
|
+
result = await relayCommandResult({ type: 'bridge-screenshot', refreshStarvedFrame: true });
|
|
322
|
+
}
|
|
323
|
+
if (!result.ok) {
|
|
324
|
+
const { status, body } = commandResponseFor(result, consoleLedger.summary());
|
|
325
|
+
res.status(status).json(body);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const base64 = result.data?.['base64'];
|
|
329
|
+
if (typeof base64 !== 'string') {
|
|
330
|
+
res.status(500).json({ ok: false, error: 'bridge-screenshot returned no image data' });
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const capturesDir = join(ctx.projectRoot, '.vgai', 'captures');
|
|
334
|
+
await mkdir(capturesDir, { recursive: true });
|
|
335
|
+
const file = join(capturesDir, `capture-${new Date().toISOString().replace(/[:.]/g, '-')}.png`);
|
|
336
|
+
await writeFile(file, Buffer.from(base64, 'base64'));
|
|
337
|
+
// Paths-not-blobs means the caller never sees the pixels, so whatever the
|
|
338
|
+
// pixels are worth has to travel as data: `flatness.warning` when the
|
|
339
|
+
// frame is one flat surface, `loopRecoveryFrame` when it exists because we
|
|
340
|
+
// ticked a starved runtime to make it.
|
|
341
|
+
const flatness = result.data?.['flatness'] as { warning?: string } | undefined;
|
|
342
|
+
res.json({
|
|
343
|
+
ok: true,
|
|
344
|
+
path: file,
|
|
345
|
+
relativePath: relative(ctx.projectRoot, file),
|
|
346
|
+
...(flatness ? { flatness } : {}),
|
|
347
|
+
...(result.data?.['loopRecoveryFrame'] === true ? { loopRecoveryFrame: true } : {}),
|
|
348
|
+
...(typeof flatness?.warning === 'string' ? { warning: flatness.warning } : {}),
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
// ---- Persistent editor state (.vgai/editor-state.json) ----
|
|
352
|
+
router.get('/__editor/editor-state', async (_req: Request, res: Response) => {
|
|
353
|
+
if (ctx.projectRoot === engineRoot) {
|
|
354
|
+
res.json({});
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
const raw = await readFile(join(ctx.projectRoot, '.vgai', 'editor-state.json'), 'utf-8');
|
|
359
|
+
res.json(JSON.parse(raw));
|
|
360
|
+
} catch {
|
|
361
|
+
res.json({});
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
router.post('/__editor/editor-state', async (req: Request, res: Response) => {
|
|
366
|
+
if (ctx.projectRoot === engineRoot) {
|
|
367
|
+
res.status(400).json({ error: 'No project open.' });
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
try {
|
|
371
|
+
const vgaiDir = join(ctx.projectRoot, '.vgai');
|
|
372
|
+
await mkdir(vgaiDir, { recursive: true });
|
|
373
|
+
await writeFile(
|
|
374
|
+
join(vgaiDir, 'editor-state.json'),
|
|
375
|
+
JSON.stringify(req.body, null, 2),
|
|
376
|
+
'utf-8',
|
|
377
|
+
);
|
|
378
|
+
res.json({ ok: true });
|
|
379
|
+
} catch {
|
|
380
|
+
res.status(500).json({ error: 'Failed to save editor state.' });
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
}
|