@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,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/__editor/configurations` — the RUNNER for a project's declared run configurations
|
|
3
|
+
* (ARCHITECTURE-CORE §The project model: the `run[]` axis). The manifest
|
|
4
|
+
* declares an entrypoint by registered kind; this is the host that starts
|
|
5
|
+
* and stops the `process` kind beside the editor and reports it, and
|
|
6
|
+
* expands a `compound` into its members (`play` is the browser's own mount,
|
|
7
|
+
* never started here). The editor's transport, `vgai run <id>` and a
|
|
8
|
+
* harness all come through this one door, so a process started by any of
|
|
9
|
+
* them is the same process, listed the same way, and dies with the session.
|
|
10
|
+
*
|
|
11
|
+
* GET /__editor/configurations → { configurations: [{ id, kind, status, pid?, port?, entry? }] }
|
|
12
|
+
* POST /__editor/configurations/:id/start → { ok, started: [id…], attached: [id…], ready }
|
|
13
|
+
* POST /__editor/configurations/:id/stop → { ok, stopped: [id…] }
|
|
14
|
+
* GET /__editor/configurations/:id/log → { lines }
|
|
15
|
+
*
|
|
16
|
+
* A port already answering before a start is ATTACHED, not fought over: the
|
|
17
|
+
* caller wanted "a server on that port", and one is there. A port nothing
|
|
18
|
+
* answers on after the readiness timeout is reported as not ready, with the
|
|
19
|
+
* process's own last lines, never as success.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { type ChildProcess, spawn } from 'node:child_process';
|
|
23
|
+
import net from 'node:net';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import type { Request, Response } from 'express';
|
|
26
|
+
import type { DeclaredConfiguration } from '@volter/editor-project/manifest/configuration-kinds';
|
|
27
|
+
import {
|
|
28
|
+
configurationKind,
|
|
29
|
+
PLAY_CONFIGURATION_ID,
|
|
30
|
+
} from '@volter/editor-project/manifest/configuration-kinds';
|
|
31
|
+
import { loadGameManifestDir } from '@volter/editor-project/manifest/load-file';
|
|
32
|
+
import { nodeRuntimeIssue } from '@volter/editor-project/manifest/runtime-environment';
|
|
33
|
+
import type { EditorServerRouter } from '../editor-server';
|
|
34
|
+
import { packageProjectWebBuild } from '../project-build-artifact';
|
|
35
|
+
import { ensureProjectConfigurationKinds, kindModuleLoader } from '../project-kinds';
|
|
36
|
+
import { executeProjectTool } from '../project-tools';
|
|
37
|
+
import type { RouteContext } from './context';
|
|
38
|
+
|
|
39
|
+
const READY_TIMEOUT_MS = 30_000;
|
|
40
|
+
const READY_POLL_MS = 300;
|
|
41
|
+
const LOG_LINES = 200;
|
|
42
|
+
|
|
43
|
+
interface RunningProcess {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly child: ChildProcess;
|
|
46
|
+
readonly port: number | null;
|
|
47
|
+
readonly log: string[];
|
|
48
|
+
startedAt: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const running = new Map<string, RunningProcess>();
|
|
52
|
+
|
|
53
|
+
function portAnswers(port: number): Promise<boolean> {
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const socket = net.connect({ host: '127.0.0.1', port });
|
|
56
|
+
const done = (value: boolean) => {
|
|
57
|
+
socket.destroy();
|
|
58
|
+
resolve(value);
|
|
59
|
+
};
|
|
60
|
+
socket.once('connect', () => done(true));
|
|
61
|
+
socket.once('error', () => done(false));
|
|
62
|
+
socket.setTimeout(500, () => done(false));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function httpAnswers(port: number, path: string): Promise<boolean> {
|
|
67
|
+
try {
|
|
68
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`);
|
|
69
|
+
return res.ok;
|
|
70
|
+
} catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function waitReady(port: number | null, http: string | undefined): Promise<boolean> {
|
|
76
|
+
if (port === null) return true;
|
|
77
|
+
const deadline = Date.now() + READY_TIMEOUT_MS;
|
|
78
|
+
while (Date.now() < deadline) {
|
|
79
|
+
const up = http ? await httpAnswers(port, http) : await portAnswers(port);
|
|
80
|
+
if (up) return true;
|
|
81
|
+
await new Promise((r) => setTimeout(r, READY_POLL_MS));
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function pushLog(entry: RunningProcess, chunk: string): void {
|
|
87
|
+
for (const line of chunk.split(/\r?\n/)) {
|
|
88
|
+
if (!line) continue;
|
|
89
|
+
entry.log.push(line);
|
|
90
|
+
if (entry.log.length > LOG_LINES) entry.log.splice(0, entry.log.length - LOG_LINES);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function declaredRun(ctx: RouteContext): Promise<readonly DeclaredConfiguration[]> {
|
|
95
|
+
const kindErrors = await ensureProjectConfigurationKinds(ctx.projectRoot);
|
|
96
|
+
if (kindErrors.length > 0) throw new Error(kindErrors.join('\n'));
|
|
97
|
+
return loadGameManifestDir(ctx.projectRoot).configurations;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function processFields(configuration: DeclaredConfiguration): {
|
|
101
|
+
entry: string;
|
|
102
|
+
command: string | undefined;
|
|
103
|
+
port: number | null;
|
|
104
|
+
cwd: string | undefined;
|
|
105
|
+
env: Record<string, string> | undefined;
|
|
106
|
+
http: string | undefined;
|
|
107
|
+
} {
|
|
108
|
+
return {
|
|
109
|
+
entry: configuration['entry'] as string,
|
|
110
|
+
command: configuration['command'] as string | undefined,
|
|
111
|
+
port: typeof configuration['port'] === 'number' ? (configuration['port'] as number) : null,
|
|
112
|
+
cwd: configuration['cwd'] as string | undefined,
|
|
113
|
+
env: configuration['env'] as Record<string, string> | undefined,
|
|
114
|
+
http: (configuration['ready'] as { http?: string } | undefined)?.http,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function startProcess(
|
|
119
|
+
ctx: RouteContext,
|
|
120
|
+
configuration: DeclaredConfiguration,
|
|
121
|
+
): Promise<{ started: boolean; attached: boolean; ready: boolean; log: string[] }> {
|
|
122
|
+
const live = running.get(configuration.id);
|
|
123
|
+
if (live && live.child.exitCode === null) {
|
|
124
|
+
return { started: false, attached: true, ready: true, log: [...live.log] };
|
|
125
|
+
}
|
|
126
|
+
const fields = processFields(configuration);
|
|
127
|
+
if (fields.port !== null && (await portAnswers(fields.port))) {
|
|
128
|
+
// Something already serves the port. Attach: the caller asked for a
|
|
129
|
+
// server there, and one is there — a foreign one is still one.
|
|
130
|
+
return { started: false, attached: true, ready: true, log: [] };
|
|
131
|
+
}
|
|
132
|
+
const isWin = process.platform === 'win32';
|
|
133
|
+
const cwd = fields.cwd ? join(ctx.projectRoot, fields.cwd) : ctx.projectRoot;
|
|
134
|
+
const command = fields.command ?? `npx tsx ${fields.entry}`;
|
|
135
|
+
const child = spawn(command, {
|
|
136
|
+
cwd,
|
|
137
|
+
env: { ...process.env, ...(fields.env ?? {}) },
|
|
138
|
+
shell: true,
|
|
139
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
140
|
+
detached: !isWin,
|
|
141
|
+
});
|
|
142
|
+
const entry: RunningProcess = {
|
|
143
|
+
id: configuration.id,
|
|
144
|
+
child,
|
|
145
|
+
port: fields.port,
|
|
146
|
+
log: [],
|
|
147
|
+
startedAt: Date.now(),
|
|
148
|
+
};
|
|
149
|
+
child.stdout?.on('data', (d: Buffer) => pushLog(entry, d.toString('utf8')));
|
|
150
|
+
child.stderr?.on('data', (d: Buffer) => pushLog(entry, d.toString('utf8')));
|
|
151
|
+
child.once('exit', (code, signal) => {
|
|
152
|
+
pushLog(entry, `[exited: code ${code ?? 'null'}${signal ? `, signal ${signal}` : ''}]`);
|
|
153
|
+
});
|
|
154
|
+
running.set(configuration.id, entry);
|
|
155
|
+
const ready = await waitReady(fields.port, fields.http);
|
|
156
|
+
return { started: true, attached: false, ready, log: [...entry.log] };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function stopProcess(id: string): boolean {
|
|
160
|
+
const live = running.get(id);
|
|
161
|
+
if (!live) return false;
|
|
162
|
+
running.delete(id);
|
|
163
|
+
if (live.child.exitCode !== null) return false;
|
|
164
|
+
const pid = live.child.pid;
|
|
165
|
+
try {
|
|
166
|
+
if (process.platform !== 'win32' && pid !== undefined) process.kill(-pid, 'SIGTERM');
|
|
167
|
+
else live.child.kill('SIGTERM');
|
|
168
|
+
} catch {
|
|
169
|
+
// already gone
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Kill every process this runner started — the session is ending. */
|
|
175
|
+
export function stopAllConfigurations(): void {
|
|
176
|
+
for (const id of [...running.keys()]) stopProcess(id);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function membersOf(
|
|
180
|
+
configuration: DeclaredConfiguration,
|
|
181
|
+
all: readonly DeclaredConfiguration[],
|
|
182
|
+
): DeclaredConfiguration[] {
|
|
183
|
+
if (configuration.kind !== 'compound') return [configuration];
|
|
184
|
+
const ids = (configuration['run'] as readonly string[]) ?? [];
|
|
185
|
+
return ids
|
|
186
|
+
.filter((id) => id !== PLAY_CONFIGURATION_ID)
|
|
187
|
+
.flatMap((id) => {
|
|
188
|
+
const member = all.find((c) => c.id === id);
|
|
189
|
+
return member ? membersOf(member, all) : [];
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function registerConfigurationRoutes(router: EditorServerRouter, ctx: RouteContext): void {
|
|
194
|
+
router.get('/__editor/configurations', async (_req: Request, res: Response) => {
|
|
195
|
+
let declared: readonly DeclaredConfiguration[];
|
|
196
|
+
try {
|
|
197
|
+
declared = await declaredRun(ctx);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
res.json({
|
|
203
|
+
configurations: declared.map((configuration) => {
|
|
204
|
+
const live = running.get(configuration.id);
|
|
205
|
+
const alive = live !== undefined && live.child.exitCode === null;
|
|
206
|
+
return {
|
|
207
|
+
id: configuration.id,
|
|
208
|
+
kind: configuration.kind,
|
|
209
|
+
role: configurationKind(configuration.kind)?.role ?? null,
|
|
210
|
+
describe: configurationKind(configuration.kind)?.describe ?? null,
|
|
211
|
+
status: alive ? 'running' : 'stopped',
|
|
212
|
+
...(alive ? { pid: live.child.pid, since: live.startedAt } : {}),
|
|
213
|
+
...(configuration.kind === 'process'
|
|
214
|
+
? { entry: configuration['entry'], port: configuration['port'] ?? null }
|
|
215
|
+
: {}),
|
|
216
|
+
...(configuration.kind === 'compound'
|
|
217
|
+
? { run: configuration['run'], instances: configuration['instances'] ?? null }
|
|
218
|
+
: {}),
|
|
219
|
+
};
|
|
220
|
+
}),
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
router.post('/__editor/configurations/:id/start', async (req: Request, res: Response) => {
|
|
225
|
+
const id = String(req.params['id']);
|
|
226
|
+
let declared: readonly DeclaredConfiguration[];
|
|
227
|
+
try {
|
|
228
|
+
declared = await declaredRun(ctx);
|
|
229
|
+
} catch (error) {
|
|
230
|
+
res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const configuration = declared.find((c) => c.id === id);
|
|
234
|
+
if (!configuration) {
|
|
235
|
+
res.status(404).json({
|
|
236
|
+
error: `No run configuration "${id}" — declared: ${declared.map((c) => `"${c.id}"`).join(', ') || 'none'}`,
|
|
237
|
+
});
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const members = membersOf(configuration, declared);
|
|
241
|
+
const unrunnable = members.filter((m) => m.kind !== 'process');
|
|
242
|
+
if (unrunnable.length > 0) {
|
|
243
|
+
res.status(400).json({
|
|
244
|
+
error: `No runner for kind ${unrunnable.map((m) => `"${m.kind}"`).join(', ')} — this host starts "process" (and "compound" of them)`,
|
|
245
|
+
});
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// The runtime a process needs is package.json `engines.node`, declared
|
|
249
|
+
// once and read here (ARCHITECTURE-CORE §The project model, environment).
|
|
250
|
+
const runtimeIssue = nodeRuntimeIssue(ctx.projectRoot);
|
|
251
|
+
if (runtimeIssue) {
|
|
252
|
+
res.status(400).json({ error: `Configuration "${id}" cannot start: ${runtimeIssue}` });
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const started: string[] = [];
|
|
256
|
+
const attached: string[] = [];
|
|
257
|
+
let ready = true;
|
|
258
|
+
const logs: Record<string, string[]> = {};
|
|
259
|
+
for (const member of members) {
|
|
260
|
+
const outcome = await startProcess(ctx, member);
|
|
261
|
+
if (outcome.started) started.push(member.id);
|
|
262
|
+
if (outcome.attached) attached.push(member.id);
|
|
263
|
+
if (!outcome.ready) ready = false;
|
|
264
|
+
logs[member.id] = outcome.log;
|
|
265
|
+
}
|
|
266
|
+
res.json({ ok: ready, started, attached, ready, logs });
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// ---- build-role configurations: run to completion, stream the log, package
|
|
270
|
+
let activeBuild: ChildProcess | null = null;
|
|
271
|
+
let packaging = false;
|
|
272
|
+
router.post('/__editor/configurations/:id/build', async (req: Request, res: Response) => {
|
|
273
|
+
const id = String(req.params['id']);
|
|
274
|
+
if (activeBuild || packaging) {
|
|
275
|
+
res.status(409).json({ error: 'A build is already running.' });
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
let declared: readonly DeclaredConfiguration[];
|
|
279
|
+
try {
|
|
280
|
+
declared = await declaredRun(ctx);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const configuration = declared.find((c) => c.id === id);
|
|
286
|
+
if (!configuration) {
|
|
287
|
+
res.status(404).json({
|
|
288
|
+
error: `No configuration "${id}" — declared: ${declared.map((c) => `"${c.id}"`).join(', ') || 'none'}`,
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const kind = configurationKind(configuration.kind);
|
|
293
|
+
if (kind?.role !== 'build') {
|
|
294
|
+
res.status(400).json({
|
|
295
|
+
error: `Configuration "${id}" is ${kind ? `a ${kind.role}-role ${configuration.kind}` : 'of an unregistered kind'} — build starts a build-role configuration`,
|
|
296
|
+
});
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (configuration.kind !== 'bundle') {
|
|
300
|
+
// A contributed build kind runs as the project TOOL it names.
|
|
301
|
+
const bridge = kind.build;
|
|
302
|
+
if (!bridge) {
|
|
303
|
+
res.status(400).json({
|
|
304
|
+
error: `No runner for build kind "${configuration.kind}" — this host builds "bundle" and any kind whose contribution names a tool`,
|
|
305
|
+
});
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
res.writeHead(200, {
|
|
309
|
+
'Content-Type': 'text/event-stream',
|
|
310
|
+
'Cache-Control': 'no-cache',
|
|
311
|
+
Connection: 'keep-alive',
|
|
312
|
+
});
|
|
313
|
+
res.write(':ok\n\n');
|
|
314
|
+
const say = (line: string) => res.write(`event: log\ndata: ${JSON.stringify(line)}\n\n`);
|
|
315
|
+
say(`Running tool ${bridge.tool} for configuration "${id}"…`);
|
|
316
|
+
try {
|
|
317
|
+
const outcome = await executeProjectTool({
|
|
318
|
+
account: ctx.account,
|
|
319
|
+
projectRoot: ctx.projectRoot,
|
|
320
|
+
loadModule: kindModuleLoader() ?? undefined,
|
|
321
|
+
name: bridge.tool,
|
|
322
|
+
input: bridge.input(configuration),
|
|
323
|
+
confirmed: true,
|
|
324
|
+
});
|
|
325
|
+
const ok = outcome.status === 200 && (outcome.body as { ok?: boolean }).ok !== false;
|
|
326
|
+
if (!ok) {
|
|
327
|
+
const detail = (outcome.body as { error?: { message?: string } }).error?.message;
|
|
328
|
+
say(`Tool refused: ${detail ?? JSON.stringify(outcome.body).slice(0, 300)}`);
|
|
329
|
+
}
|
|
330
|
+
res.write(
|
|
331
|
+
`event: done\ndata: ${JSON.stringify({ ok, code: ok ? 0 : 1, report: ok ? outcome.body : undefined })}\n\n`,
|
|
332
|
+
);
|
|
333
|
+
} catch (error) {
|
|
334
|
+
say(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
335
|
+
res.write(`event: done\ndata: ${JSON.stringify({ ok: false, code: null })}\n\n`);
|
|
336
|
+
} finally {
|
|
337
|
+
res.end();
|
|
338
|
+
}
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const script = (configuration['script'] as string | undefined) ?? 'build';
|
|
342
|
+
const args = (configuration['args'] as readonly string[] | undefined) ?? [];
|
|
343
|
+
res.writeHead(200, {
|
|
344
|
+
'Content-Type': 'text/event-stream',
|
|
345
|
+
'Cache-Control': 'no-cache',
|
|
346
|
+
Connection: 'keep-alive',
|
|
347
|
+
});
|
|
348
|
+
res.write(':ok\n\n');
|
|
349
|
+
const child = spawn('npm', ['run', script, ...(args.length > 0 ? ['--', ...args] : [])], {
|
|
350
|
+
cwd: ctx.projectRoot,
|
|
351
|
+
// The editor runs in development mode. A bundled artifact must compile
|
|
352
|
+
// production branches, including the exported-game boundary.
|
|
353
|
+
env: { ...process.env, NODE_ENV: 'production' },
|
|
354
|
+
shell: true,
|
|
355
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
356
|
+
});
|
|
357
|
+
activeBuild = child;
|
|
358
|
+
const sendLine = (line: string) => {
|
|
359
|
+
res.write(`event: log\ndata: ${JSON.stringify(line)}\n\n`);
|
|
360
|
+
};
|
|
361
|
+
let buffer = '';
|
|
362
|
+
const flushLines = (chunk: Buffer) => {
|
|
363
|
+
buffer += chunk.toString('utf-8');
|
|
364
|
+
const lines = buffer.split('\n');
|
|
365
|
+
buffer = lines.pop() ?? '';
|
|
366
|
+
for (const line of lines) sendLine(line);
|
|
367
|
+
};
|
|
368
|
+
child.stdout?.on('data', flushLines);
|
|
369
|
+
child.stderr?.on('data', flushLines);
|
|
370
|
+
child.on('close', async (code) => {
|
|
371
|
+
if (buffer) sendLine(buffer);
|
|
372
|
+
buffer = '';
|
|
373
|
+
activeBuild = null;
|
|
374
|
+
if (code !== 0) {
|
|
375
|
+
res.write(`event: done\ndata: ${JSON.stringify({ ok: false, code })}\n\n`);
|
|
376
|
+
res.end();
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
packaging = true;
|
|
380
|
+
try {
|
|
381
|
+
const report = await packageProjectWebBuild(ctx.projectRoot);
|
|
382
|
+
sendLine(
|
|
383
|
+
`Packaged ${report.fileCount} files (${report.outputBytes} bytes) as ` +
|
|
384
|
+
`${report.artifact} (${report.artifactBytes} bytes).`,
|
|
385
|
+
);
|
|
386
|
+
res.write(`event: done\ndata: ${JSON.stringify({ ok: true, code, report })}\n\n`);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
sendLine(`Error: ${(error as Error).message}`);
|
|
389
|
+
res.write(`event: done\ndata: ${JSON.stringify({ ok: false, code: null })}\n\n`);
|
|
390
|
+
} finally {
|
|
391
|
+
packaging = false;
|
|
392
|
+
res.end();
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
req.on('close', () => {
|
|
396
|
+
if (activeBuild === child && child.exitCode === null) child.kill();
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
router.post('/__editor/configurations/:id/stop', async (req: Request, res: Response) => {
|
|
401
|
+
const id = String(req.params['id']);
|
|
402
|
+
let declared: readonly DeclaredConfiguration[] = [];
|
|
403
|
+
try {
|
|
404
|
+
declared = await declaredRun(ctx);
|
|
405
|
+
} catch {
|
|
406
|
+
// a manifest that no longer parses still lets a running child be stopped by id
|
|
407
|
+
}
|
|
408
|
+
const configuration = declared.find((c) => c.id === id);
|
|
409
|
+
const targets = configuration ? membersOf(configuration, declared).map((m) => m.id) : [id];
|
|
410
|
+
const stopped = targets.filter((t) => stopProcess(t));
|
|
411
|
+
res.json({ ok: true, stopped });
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
router.get('/__editor/configurations/:id/log', (req: Request, res: Response) => {
|
|
415
|
+
const id = String(req.params['id']);
|
|
416
|
+
const live = running.get(id);
|
|
417
|
+
res.json({ lines: live ? [...live.log] : [] });
|
|
418
|
+
});
|
|
419
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `RouteContext` — the editor server's closure, named once.
|
|
3
|
+
*
|
|
4
|
+
* `createEditorServer` used to be a single ~7,700-line function body: every
|
|
5
|
+
* route handler was a closure over the same pile of `const`/`let` bindings, so
|
|
6
|
+
* the only way to know what a route touched was to read the whole file. The
|
|
7
|
+
* split moves route bodies OUT, into `register<Family>Routes(router, ctx)`
|
|
8
|
+
* modules, and this interface is what crosses that boundary: the same
|
|
9
|
+
* bindings, materialized once, in one place a reader can enumerate.
|
|
10
|
+
*
|
|
11
|
+
* Two rules keep it honest:
|
|
12
|
+
*
|
|
13
|
+
* - **Immutable bindings are plain properties.** A family module destructures
|
|
14
|
+
* them (`const { account } = ctx`), which is why the moved route bodies are
|
|
15
|
+
* otherwise byte-for-byte what they were.
|
|
16
|
+
* - **Mutable session state is a getter/setter pair**, and a route reads it as
|
|
17
|
+
* `ctx.projectRoot`. Destructuring a `let` would copy it, and the copy would
|
|
18
|
+
* silently go stale the moment the project changed — the one failure this
|
|
19
|
+
* boundary could plausibly introduce, so it is made unrepresentable.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type {
|
|
23
|
+
CollaborationParticipantLocation,
|
|
24
|
+
CollaborationRole,
|
|
25
|
+
SourceRevision,
|
|
26
|
+
} from '@volter/editor-sdk/session/collaboration-types';
|
|
27
|
+
import type { EditorServerCompatibility } from '@volter/editor-sdk/session/editor-compatibility';
|
|
28
|
+
import type { Request, Response } from 'express';
|
|
29
|
+
import type { TripwireGate } from '../support/project/build-discipline';
|
|
30
|
+
import type {
|
|
31
|
+
SessionJournal,
|
|
32
|
+
SessionJournalEvent,
|
|
33
|
+
} from '../support/project/session-journal';
|
|
34
|
+
import type { ProjectComponentEntry } from '../../src/asset-workflow/project-content';
|
|
35
|
+
import type { HarnessChatSnapshot } from '../../src/harness-chat-types';
|
|
36
|
+
import type { EditorAccountService } from '../account-service';
|
|
37
|
+
import type { CollaborationSession } from '../collaboration-session';
|
|
38
|
+
import type { ConsoleLedger } from '../console-ledger';
|
|
39
|
+
import type { EditorServerOptions } from '../editor-server';
|
|
40
|
+
import type { EngineProvenance } from '../engine-provenance';
|
|
41
|
+
import type { HarnessChatService } from '../harness-chat-service';
|
|
42
|
+
import type { PlayPhaseRecord } from '../play-stall';
|
|
43
|
+
import type { ProjectModuleLoader } from '../project-tools';
|
|
44
|
+
import type { ProjectWorkCoordinator } from '../project-work-coordinator';
|
|
45
|
+
import type { ShareGatewayClaims } from '../share-claims';
|
|
46
|
+
import type { ShareHost } from '../share-host';
|
|
47
|
+
import type { TabHeartbeatServer } from '../tab-heartbeat';
|
|
48
|
+
import type { TabLifecycleController } from '../tab-lifecycle';
|
|
49
|
+
import type { TeamAgentMirror } from '../team-agent-mirror';
|
|
50
|
+
import type { WorktreeIdentity } from '../worktree-identity';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The three fields share-claim verification actually reads. Structural so a
|
|
54
|
+
* raw WebSocket upgrade request can be checked by the same function an Express
|
|
55
|
+
* `Request` is.
|
|
56
|
+
*/
|
|
57
|
+
export interface ShareClaimSource {
|
|
58
|
+
readonly method: string;
|
|
59
|
+
readonly originalUrl: string;
|
|
60
|
+
header(name: string): string | undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** A verified share claim, as the routes read it. */
|
|
64
|
+
export interface TrustedShareIdentity extends Omit<ShareGatewayClaims, 'role'> {
|
|
65
|
+
role: CollaborationRole;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* What a control message answers with. A tab reports four facts upstream — it
|
|
70
|
+
* picked a command up, the command finished, its state snapshot, which surface
|
|
71
|
+
* it is showing — over its control socket OR as a POST, and both land on the
|
|
72
|
+
* same handler so the two transports cannot answer differently.
|
|
73
|
+
*/
|
|
74
|
+
export type ControlOutcome = { status: 200 } | { status: 400 | 403 | 409; error: string };
|
|
75
|
+
|
|
76
|
+
/** Whether the `<project>/src` validation watcher is running, and why not. */
|
|
77
|
+
export type SourceValidationState = 'active' | 'awaiting-src' | 'no-project';
|
|
78
|
+
|
|
79
|
+
export interface RouteContext {
|
|
80
|
+
// ---- Roots ------------------------------------------------------------
|
|
81
|
+
/** The engine checkout serving this editor. Also the "no project" sentinel. */
|
|
82
|
+
readonly engineRoot: string;
|
|
83
|
+
/** Where the shared scaffolder reads templates and capabilities from. */
|
|
84
|
+
/** The open project, or `engineRoot` when none is open. Reassigned by open. */
|
|
85
|
+
projectRoot: string;
|
|
86
|
+
/** `<projectRoot>/public` — the served asset root. Follows `projectRoot`. */
|
|
87
|
+
publicRoot: string;
|
|
88
|
+
|
|
89
|
+
// ---- Project mutation (the ONE write path for project-owned files) ----
|
|
90
|
+
/**
|
|
91
|
+
* Write a set of project resources as one attributed, conflict-checked
|
|
92
|
+
* transaction, returning the collaboration revision it produced (or `null`
|
|
93
|
+
* when no session is recording). Every family that writes the project's own
|
|
94
|
+
* files goes through this — there is no second write path.
|
|
95
|
+
*/
|
|
96
|
+
readonly commitProjectMutation: (
|
|
97
|
+
req: Request,
|
|
98
|
+
resources: readonly { path: string; content: string | Buffer | null }[],
|
|
99
|
+
) => Promise<SourceRevision | null | undefined>;
|
|
100
|
+
/** The matching error answer, including the structured conflict shape. */
|
|
101
|
+
readonly projectMutationError: (res: Response, error: unknown) => void;
|
|
102
|
+
/**
|
|
103
|
+
* Live conflict tickets: a 409 hands the client an id, and the client's
|
|
104
|
+
* resolve call redeems it. Written by `projectMutationError`, read by the
|
|
105
|
+
* source-conflict routes.
|
|
106
|
+
*/
|
|
107
|
+
readonly sourceConflictTickets: Map<string, { paths: Set<string>; expiresAt: number }>;
|
|
108
|
+
/** The open project's parsed manifest, or `null` when it cannot be read. */
|
|
109
|
+
readonly readProjectManifest: () => unknown;
|
|
110
|
+
|
|
111
|
+
// ---- Loading the project's own modules on the Node side ---------------
|
|
112
|
+
readonly loadProjectModule: ProjectModuleLoader | undefined;
|
|
113
|
+
|
|
114
|
+
// ---- Global account (never project state) -----------------------------
|
|
115
|
+
readonly account: EditorAccountService;
|
|
116
|
+
|
|
117
|
+
/** The project's component index (cached, invalidated by the src watcher). */
|
|
118
|
+
readonly currentProjectComponents: () => Promise<ProjectComponentEntry[]>;
|
|
119
|
+
|
|
120
|
+
/** WHICH engine source this server is running, resolved once at boot. */
|
|
121
|
+
readonly enginePromise: Promise<EngineProvenance>;
|
|
122
|
+
|
|
123
|
+
// ---- Session identity -------------------------------------------------
|
|
124
|
+
/** This process's registered session, as other editors and the CLI see it. */
|
|
125
|
+
readonly currentSessionIdentity: () => WorktreeIdentity | null;
|
|
126
|
+
|
|
127
|
+
// ---- Owner-local authority --------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Loopback AND not carrying a share-gateway claim — i.e. the person who
|
|
130
|
+
* launched this editor, not one of their session's guests.
|
|
131
|
+
*/
|
|
132
|
+
readonly localOwnerRequest: (req: Request) => boolean;
|
|
133
|
+
/** `localOwnerRequest`, having already answered 403 when it is false. */
|
|
134
|
+
readonly requireLocalOwner: (req: Request, res: Response) => boolean;
|
|
135
|
+
|
|
136
|
+
// ---- Opening a project (the runtime switch) ---------------------------
|
|
137
|
+
/** Where the launcher's user-global settings live. */
|
|
138
|
+
readonly launcherSettingsPath: string;
|
|
139
|
+
/** Where the recent-projects list lives. */
|
|
140
|
+
readonly recentProjectsPath: string;
|
|
141
|
+
/** Record a visit, unless this session is not somebody's launcher. */
|
|
142
|
+
readonly recordRecentProject: (name: string, projectDir: string) => Promise<void>;
|
|
143
|
+
/** (Re)start the project file watchers for whatever `projectRoot` now is. */
|
|
144
|
+
readonly startWatcher: () => void;
|
|
145
|
+
/** Re-poll generation jobs for the open project. */
|
|
146
|
+
readonly reconcileGenerations: () => Promise<void>;
|
|
147
|
+
/** This server's editor/project compatibility identity. */
|
|
148
|
+
readonly compatibilityIdentity: () => EditorServerCompatibility;
|
|
149
|
+
/** When this server started serving THIS project. Reset by a switch. */
|
|
150
|
+
servingProjectSince: number;
|
|
151
|
+
/** The project-local session journal, reopened on a switch. */
|
|
152
|
+
journal: SessionJournal | null;
|
|
153
|
+
/** The two build-discipline gates, reset to idle on a switch. */
|
|
154
|
+
cadenceGate: TripwireGate;
|
|
155
|
+
unplayedGate: TripwireGate;
|
|
156
|
+
|
|
157
|
+
// ---- The live session's own vitals -----------------------------------
|
|
158
|
+
/** The unresolved error/warning ledger every `vgai` command reprints. */
|
|
159
|
+
readonly consoleLedger: ConsoleLedger;
|
|
160
|
+
/** Per-file validation state, as the watchers computed it. */
|
|
161
|
+
readonly projectValidation: Map<string, { errors: string[]; at: number }>;
|
|
162
|
+
readonly projectWarnings: Map<string, { warnings: string[]; at: number }>;
|
|
163
|
+
/** The same validation state, pre-formatted as replayable `server-log`s. */
|
|
164
|
+
readonly currentValidationLogEntries: () => { level: 'error' | 'warn'; message: string }[];
|
|
165
|
+
/** Server-OBSERVED writes under `public/` — never browser-reported. */
|
|
166
|
+
publicAssetsLastChangedAt: number | null;
|
|
167
|
+
publicAssetsLastPath: string | null;
|
|
168
|
+
publicAssetsChangedCount: number;
|
|
169
|
+
/** When a GET last produced genuine editor HTML — the verified-open signal. */
|
|
170
|
+
lastIndexRequestAt: number | null;
|
|
171
|
+
/** Whether the `<project>/src` validation watcher is actually running. */
|
|
172
|
+
sourceValidation: SourceValidationState;
|
|
173
|
+
|
|
174
|
+
// ---- Tabs, clients and the command relay ------------------------------
|
|
175
|
+
/** Every SSE client id currently attached to one tab. */
|
|
176
|
+
readonly clientIdsForTab: (tabId: string) => string[];
|
|
177
|
+
/** Which tab an SSE client belongs to, and the reverse map. */
|
|
178
|
+
readonly tabIdForClient: (clientId: string | null) => string | null;
|
|
179
|
+
readonly clientTabIds: Map<string, string>;
|
|
180
|
+
/** The tab bijection's tables. `hostTabLifecycle` is the local owner's. */
|
|
181
|
+
readonly hostTabLifecycle: TabLifecycleController;
|
|
182
|
+
/** Subscribe to a tab's page reloading under the same tabId (any table). */
|
|
183
|
+
readonly onTabReloaded: (listener: (tabId: string, epochCount: number) => void) => void;
|
|
184
|
+
readonly participantTabLifecycles: Map<string, TabLifecycleController>;
|
|
185
|
+
readonly clientTabLifecycles: Map<string, TabLifecycleController>;
|
|
186
|
+
readonly tabLifecycleForParticipant: (
|
|
187
|
+
participantId: string,
|
|
188
|
+
hostEligible?: boolean,
|
|
189
|
+
) => TabLifecycleController;
|
|
190
|
+
/** `null` when this session runs headless — the whole loop is off. */
|
|
191
|
+
readonly tabBijectionOptions: {
|
|
192
|
+
enabled: boolean;
|
|
193
|
+
editorUrl: string;
|
|
194
|
+
openUrl?: ((url: string) => void) | undefined;
|
|
195
|
+
} | null;
|
|
196
|
+
/** The tab heartbeat server (worker beats and their socket fallback). */
|
|
197
|
+
readonly heartbeat: TabHeartbeatServer;
|
|
198
|
+
/** Pre-listener page errors, per SSE client. */
|
|
199
|
+
readonly pageErrorsByClient: Map<string, string[]>;
|
|
200
|
+
/** Debounced leave timers, so a reload is not read as a departure. */
|
|
201
|
+
readonly participantLeaveTimers: Map<string, ReturnType<typeof setTimeout>>;
|
|
202
|
+
/** An id's first 8 characters — every log line in the relay uses it. */
|
|
203
|
+
readonly short: (id: string | null | undefined) => string;
|
|
204
|
+
/** The play phase the running game last reported. */
|
|
205
|
+
livePlayPhase: PlayPhaseRecord | null;
|
|
206
|
+
/** Live connection counts per collaboration participant. */
|
|
207
|
+
readonly participantConnections: Map<string, number>;
|
|
208
|
+
/** Which participant IS the local host, once a tab has claimed it. */
|
|
209
|
+
hostParticipantId: string | null;
|
|
210
|
+
|
|
211
|
+
// ---- Editor state, as tabs report it ----------------------------------
|
|
212
|
+
editorState: Record<string, unknown>;
|
|
213
|
+
editorStateUpdatedAt: number | null;
|
|
214
|
+
readonly editorStatesByClient: Map<string, { state: Record<string, unknown>; updatedAt: number }>;
|
|
215
|
+
|
|
216
|
+
// ---- The session journal & build-discipline tripwires ------------------
|
|
217
|
+
/** Append one event to `<project>/logs/editor-*.jsonl`. */
|
|
218
|
+
readonly journalEvent: (event: SessionJournalEvent) => void;
|
|
219
|
+
/** Re-evaluate the commit-cadence / never-played banners. Guarded inside. */
|
|
220
|
+
readonly announceBuildDisciplineTripwires: () => void;
|
|
221
|
+
/** The play-run log file currently being appended to, or `null`. */
|
|
222
|
+
activeLogFile: string | null;
|
|
223
|
+
|
|
224
|
+
// ---- Agent harness ----------------------------------------------------
|
|
225
|
+
readonly harnessChat: HarnessChatService;
|
|
226
|
+
/** The standing reason the Chat view has no agent, or `null` (`frontend-handoff.ts`). */
|
|
227
|
+
readonly frontendRefusal: () => string | null;
|
|
228
|
+
/** The project's own work tracker, as a snapshot + one action endpoint. */
|
|
229
|
+
readonly projectWork: ProjectWorkCoordinator;
|
|
230
|
+
|
|
231
|
+
// ---- How this server was constructed ----------------------------------
|
|
232
|
+
readonly options: EditorServerOptions;
|
|
233
|
+
|
|
234
|
+
// ---- Collaboration ----------------------------------------------------
|
|
235
|
+
/** The open project's collaboration session, or `null` when none is open. */
|
|
236
|
+
readonly currentCollaboration: () => CollaborationSession | null;
|
|
237
|
+
/** Where a joining participant is, as the session records it. */
|
|
238
|
+
readonly currentCollaborationLocation: () => CollaborationParticipantLocation | undefined;
|
|
239
|
+
/** `currentCollaboration()`, having already answered 400 when it is null. */
|
|
240
|
+
readonly collaborationOr400: (res: Response) => CollaborationSession | null;
|
|
241
|
+
/** The role a joining participant gets when their invitation names none. */
|
|
242
|
+
readonly defaultCollaborationRole: (
|
|
243
|
+
participantId: string,
|
|
244
|
+
invitedRole?: CollaborationRole,
|
|
245
|
+
) => CollaborationRole;
|
|
246
|
+
/** Agent-turn bookkeeping, shared with the harness-chat snapshot listener. */
|
|
247
|
+
readonly markAgentTurnRunning: (participantId: string) => void;
|
|
248
|
+
readonly markAgentTurnEnded: (participantId: string) => void;
|
|
249
|
+
/** Mirrors harness output into the team thread. */
|
|
250
|
+
readonly teamMirror: TeamAgentMirror;
|
|
251
|
+
readonly postMirroredTeamMessages: (snapshot: HarnessChatSnapshot) => void;
|
|
252
|
+
/** Participants attributed to THIS machine rather than a gateway credential. */
|
|
253
|
+
readonly localParticipantIds: Set<string>;
|
|
254
|
+
|
|
255
|
+
// ---- Sharing ----------------------------------------------------------
|
|
256
|
+
/** The verified share claim on a request, or `null` for the local owner. */
|
|
257
|
+
readonly trustedShareIdentity: (req: ShareClaimSource) => TrustedShareIdentity | null;
|
|
258
|
+
/** The cookie secret the local tab presents to reach `/__editor/share-control`. */
|
|
259
|
+
readonly browserShareControlSecret: string;
|
|
260
|
+
/** The live share host, once one has been started. */
|
|
261
|
+
shareHost: ShareHost | null;
|
|
262
|
+
/** Which local participant IS the owner, once their account is verified. */
|
|
263
|
+
localShareHost: { participantId: string; account: ShareGatewayClaims['account'] } | null;
|
|
264
|
+
}
|