@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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The helpers shared across `register<Family>Routes` modules — extracted with
|
|
3
|
+
* the routes that already used them when they moved out of `editor-server.ts`.
|
|
4
|
+
* Route bodies themselves are byte-preserved by the split; nothing here
|
|
5
|
+
* changes what any route answers.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Request, Response } from 'express';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* An `AbortSignal` that fires when the CLIENT gives up, so a long git or
|
|
12
|
+
* network operation stops with the request that asked for it rather than
|
|
13
|
+
* running to completion for nobody.
|
|
14
|
+
*/
|
|
15
|
+
export function requestOperationSignal(req: Request): AbortSignal {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
req.once('aborted', () => controller.abort());
|
|
18
|
+
return controller.signal;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The share-host verbs' error answer. 409 for the one recoverable case (the
|
|
23
|
+
* owner has to open their editor tab before a host identity can be bound),
|
|
24
|
+
* 400 for everything else.
|
|
25
|
+
*/
|
|
26
|
+
export function shareControlError(res: Response, error: unknown): void {
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
28
|
+
res.status(message.includes('Open the local editor tab') ? 409 : 400).json({ error: message });
|
|
29
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/__editor/served-modules` — the ONE door by which the Code-OSS frame finds
|
|
3
|
+
* the editor.
|
|
4
|
+
*
|
|
5
|
+
* WHO ASKS. The fork's workbench contribution (docs/CODE-OSS.md). It boots into
|
|
6
|
+
* a VS Code page, hands over its parts, and then needs the vgai editor's own
|
|
7
|
+
* entry point to import — the PRODUCT's entry, which mounts the kit's bridge and
|
|
8
|
+
* so swaps the SDK layout host that renders our panels into those parts. The
|
|
9
|
+
* contribution reads `modules[].url` for the id `vscode-bridge`, imports exactly
|
|
10
|
+
* that, and reads `mountVgai` off it.
|
|
11
|
+
* `vgaiSessionOrigin.ts` also uses this route as its "is there a session here"
|
|
12
|
+
* probe, so it answers 200 even when it has nothing to serve.
|
|
13
|
+
*
|
|
14
|
+
* WHAT IT SERVES: the PRODUCT's one source entry — `@vgai/game-editor`'s or
|
|
15
|
+
* `@vgai/model-editor`'s `src/index.ts`, which composes the product and
|
|
16
|
+
* re-exports `mountVgai` (`packages/editor/src/frame/product.ts`). Which
|
|
17
|
+
* product that is comes from the project's own dependencies, resolved by the
|
|
18
|
+
* CLI and handed over (`session-product.ts`); the kit's own mount,
|
|
19
|
+
* `frame/bridge.tsx`'s `mountEditor`, is not served to anybody and names no
|
|
20
|
+
* product.
|
|
21
|
+
*
|
|
22
|
+
* WHERE THE URL COMES FROM is the host's, not this route's, because the two
|
|
23
|
+
* hosts serve the editor differently and only they know how:
|
|
24
|
+
*
|
|
25
|
+
* - `dev.ts` runs Vite over the checkout, so the product entry is an ordinary
|
|
26
|
+
* module in the graph and the URL is its path, stamped with its own mtime.
|
|
27
|
+
* - `packaged.ts` serves the PRODUCT's production build, so the URL is the
|
|
28
|
+
* built entry's hashed chunk.
|
|
29
|
+
*
|
|
30
|
+
* A host with no bundler behind it supplies no answer at all, and a session
|
|
31
|
+
* whose project declares no product supplies `null`; this route says either by
|
|
32
|
+
* name, with the id the contribution was looking for — a frame that cannot find
|
|
33
|
+
* the editor must read as a refusal, never as an empty list.
|
|
34
|
+
*
|
|
35
|
+
* THE QUERY KEY MAY NEVER BE `v` — see {@link ServedModuleAnswer.url}.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { PRODUCT_INSTALL_LINES } from '@volter/editor-sdk/session/product-locator';
|
|
39
|
+
import type { Request, Response } from 'express';
|
|
40
|
+
import type { EditorServerRouter } from '../editor-server';
|
|
41
|
+
import type { RouteContext } from './context';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The one id this door serves, and the one the fork's contribution looks for
|
|
45
|
+
* (`vgaiBlender.contribution.ts`). It is a wire constant shared by two
|
|
46
|
+
* repositories: changing it here without changing it there is a frame that
|
|
47
|
+
* mounts nothing.
|
|
48
|
+
*/
|
|
49
|
+
export const FRAME_BRIDGE_MODULE_ID = 'vscode-bridge';
|
|
50
|
+
|
|
51
|
+
export interface ServedModuleAnswer {
|
|
52
|
+
readonly id: string;
|
|
53
|
+
/**
|
|
54
|
+
* The import URL, carrying the file's own mtime in dev and the build's hash
|
|
55
|
+
* when packaged. A changed bridge is a changed URL and therefore a fresh
|
|
56
|
+
* transform; an unchanged one reuses Vite's cache.
|
|
57
|
+
*
|
|
58
|
+
* THE QUERY KEY IS `mtime` AND MAY NEVER BE `v`, and that spelling is the
|
|
59
|
+
* whole of walk 3's session-restart break (measured 2026-09-20). Vite's
|
|
60
|
+
* transform middleware decides its cache header with
|
|
61
|
+
* `DEP_VERSION_RE = /[?&](v=[\w.-]+)\b/` — any `?v=` at all — and answers a
|
|
62
|
+
* match with `Cache-Control: max-age=31536000, immutable`, the header meant
|
|
63
|
+
* for content-addressed dep chunks. So `?v=<mtime>` made the browser keep
|
|
64
|
+
* this module's TRANSFORMED BODY for a year without revalidating, and that
|
|
65
|
+
* body has Vite's rewritten imports baked into it:
|
|
66
|
+
* `…/node_modules/.vite-editor/v2-<key>/deps/react.js?v=<browserHash>`.
|
|
67
|
+
* Close the session, start another, and every ordinary editor module (served
|
|
68
|
+
* `no-cache`) revalidates onto the new generation while the cached bridge
|
|
69
|
+
* replays the old one — two React instances in one page, which the editor
|
|
70
|
+
* reports as `Invalid hook call` / `Cannot read properties of null (reading
|
|
71
|
+
* 'useState')` at `AppRoot`. That is why the documented recovery needed BOTH
|
|
72
|
+
* a fresh browser profile (the poison is the HTTP cache) and
|
|
73
|
+
* `rm -rf node_modules/.vite-editor` (so the stale generation stops
|
|
74
|
+
* resolving). With `mtime` the response is `no-cache`, the browser
|
|
75
|
+
* revalidates against the ETag, and an unchanged bridge still costs one 304.
|
|
76
|
+
*/
|
|
77
|
+
readonly url: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface ServedModuleRefusal {
|
|
81
|
+
readonly id: string | null;
|
|
82
|
+
readonly message: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function registerServedModuleRoutes(router: EditorServerRouter, ctx: RouteContext): void {
|
|
86
|
+
router.get('/__editor/served-modules', (_req: Request, res: Response) => {
|
|
87
|
+
res.set('Cache-Control', 'no-store');
|
|
88
|
+
const answer = ctx.options.frameBridgeUrl;
|
|
89
|
+
if (answer === undefined) {
|
|
90
|
+
res.json({
|
|
91
|
+
modules: [],
|
|
92
|
+
refusals: [
|
|
93
|
+
{
|
|
94
|
+
id: FRAME_BRIDGE_MODULE_ID,
|
|
95
|
+
message:
|
|
96
|
+
'This session serves no module graph, so it cannot serve the editor to the Code-OSS ' +
|
|
97
|
+
'frame (no bundler behind it). `volter-editor edit` sessions — the dev checkout and the ' +
|
|
98
|
+
"project's own installed @vgai/editor — both can.",
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let url: string | null;
|
|
105
|
+
try {
|
|
106
|
+
url = answer();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
res.json({
|
|
109
|
+
modules: [],
|
|
110
|
+
refusals: [
|
|
111
|
+
{
|
|
112
|
+
id: FRAME_BRIDGE_MODULE_ID,
|
|
113
|
+
message: error instanceof Error ? error.message : String(error),
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (url === null) {
|
|
120
|
+
res.json({
|
|
121
|
+
modules: [],
|
|
122
|
+
refusals: [
|
|
123
|
+
{
|
|
124
|
+
id: FRAME_BRIDGE_MODULE_ID,
|
|
125
|
+
message:
|
|
126
|
+
'This session is serving no vgai product, so there is no editor for the Code-OSS ' +
|
|
127
|
+
'frame to import. A product is the running program — the editor IS ' +
|
|
128
|
+
'@vgai/game-editor or @vgai/model-editor — and which one runs is what the project ' +
|
|
129
|
+
'installed. Install one and run `volter-editor edit` again:\n' +
|
|
130
|
+
`${PRODUCT_INSTALL_LINES.join('\n')}`,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
res.json({ modules: [{ id: FRAME_BRIDGE_MODULE_ID, url }], refusals: [] });
|
|
137
|
+
});
|
|
138
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/__editor/heartbeat`, the heartbeat worker script, `/__editor/tab/**` and
|
|
3
|
+
* `/__editor/tab-yielded` — the TAB BIJECTION's HTTP surface.
|
|
4
|
+
*
|
|
5
|
+
* Per edited game, one and only one tab: extras yield, a lost tab self-heals,
|
|
6
|
+
* shutdown closes it. These routes are deliberately trivial, because presence
|
|
7
|
+
* has to keep working no matter what is wrong with the rest of the page — the
|
|
8
|
+
* worker POSTs a beat whenever its own socket cannot carry one, and a yielded
|
|
9
|
+
* tab lands on a static page rather than a running editor.
|
|
10
|
+
*
|
|
11
|
+
* The decisions all live in `tab-lifecycle.ts` and the control plane; this
|
|
12
|
+
* module is the doorway.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { Request, Response } from 'express';
|
|
16
|
+
import { renderEditorBrandPage } from '../editor-brand-html';
|
|
17
|
+
import type { EditorServerRouter } from '../editor-server';
|
|
18
|
+
import { allowCrossOriginFrameEmbedding } from '../server-utils';
|
|
19
|
+
import { readTabBootstrapSource, TAB_BOOTSTRAP_PATH } from '../tab-bootstrap';
|
|
20
|
+
import {
|
|
21
|
+
parseBeat,
|
|
22
|
+
parseTabClose,
|
|
23
|
+
TAB_CLOSE_PATH,
|
|
24
|
+
TAB_HEARTBEAT_WORKER_PATH,
|
|
25
|
+
TAB_HEARTBEAT_WORKER_SOURCE,
|
|
26
|
+
} from '../tab-heartbeat';
|
|
27
|
+
import type { RouteContext } from './context';
|
|
28
|
+
import type { ControlPlane } from './control-plane';
|
|
29
|
+
|
|
30
|
+
export function registerSessionTabRoutes(
|
|
31
|
+
router: EditorServerRouter,
|
|
32
|
+
ctx: RouteContext,
|
|
33
|
+
plane: ControlPlane,
|
|
34
|
+
): void {
|
|
35
|
+
const { hostTabLifecycle, participantTabLifecycles, tabBijectionOptions, trustedShareIdentity } =
|
|
36
|
+
ctx;
|
|
37
|
+
const { handleTabRoute } = plane;
|
|
38
|
+
|
|
39
|
+
// ---- The tab bootstrap (tab-bootstrap.ts) ----
|
|
40
|
+
//
|
|
41
|
+
// What makes a PAGE a TAB, for a page vgai does not author: the Code-OSS
|
|
42
|
+
// frame loads this exact script — index.html's own inline bootstrap, read
|
|
43
|
+
// out of index.html, never copied — and from there it mints an identity,
|
|
44
|
+
// beats, and departs like any other tab. See tab-bootstrap.ts's header.
|
|
45
|
+
router.get(TAB_BOOTSTRAP_PATH, (_req: Request, res: Response) => {
|
|
46
|
+
let source: string;
|
|
47
|
+
try {
|
|
48
|
+
source = readTabBootstrapSource();
|
|
49
|
+
} catch (error) {
|
|
50
|
+
// A frame that cannot get this script is a tab that never beats, so the
|
|
51
|
+
// failure is stated in the body the page will have in its console —
|
|
52
|
+
// never an empty 200 that looks like it worked.
|
|
53
|
+
res.status(500).type('text/plain').send(String(error));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
|
|
57
|
+
// Never cached, for the heartbeat worker's reason and one more: Electron's
|
|
58
|
+
// HTTP cache is what made a desktop page straddle two module generations
|
|
59
|
+
// (docs/CODE-OSS.md §Desktop traps), and the bootstrap is the one script
|
|
60
|
+
// whose staleness the session cannot detect.
|
|
61
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
62
|
+
allowCrossOriginFrameEmbedding(res);
|
|
63
|
+
res.send(source);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// ---- The tab heartbeat (tab-heartbeat.ts) ----
|
|
67
|
+
//
|
|
68
|
+
// The worker script, and the POST the worker falls back to whenever its own
|
|
69
|
+
// socket cannot carry a beat. Both are deliberately trivial: presence must
|
|
70
|
+
// survive whatever is wrong with the rest of the page.
|
|
71
|
+
router.get(TAB_HEARTBEAT_WORKER_PATH, (_req: Request, res: Response) => {
|
|
72
|
+
res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
|
|
73
|
+
// Never cached: a stale worker is a tab that beats a protocol the server
|
|
74
|
+
// has moved on from, and the file is under 4 KB.
|
|
75
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
76
|
+
allowCrossOriginFrameEmbedding(res);
|
|
77
|
+
res.send(TAB_HEARTBEAT_WORKER_SOURCE);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
router.post('/__editor/heartbeat', (req: Request, res: Response) => {
|
|
81
|
+
const beat = parseBeat(req.body);
|
|
82
|
+
if (beat === null) {
|
|
83
|
+
res.status(400).json({ error: 'heartbeat requires { tabId, epoch, seq, visibility }' });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
res.json({ reply: hostTabLifecycle.onBeat(beat) });
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// THE PAGE'S GOODBYE. `pagehide` → `navigator.sendBeacon`, which is the one
|
|
90
|
+
// transport the browser promises to deliver for a document that is already
|
|
91
|
+
// gone — so this route must do nothing but record and answer. It is what
|
|
92
|
+
// lets the table say `closed`/`reloading` where it could previously only
|
|
93
|
+
// watch the beats stop and call it `crashed`. No response body: a beacon's
|
|
94
|
+
// sender is gone and cannot read one.
|
|
95
|
+
router.post(TAB_CLOSE_PATH, (req: Request, res: Response) => {
|
|
96
|
+
const beacon = parseTabClose(req.body);
|
|
97
|
+
if (beacon === null) {
|
|
98
|
+
res.status(400).json({ error: 'tab close requires { tabId, epoch }' });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
hostTabLifecycle.onTabClose(beacon);
|
|
102
|
+
for (const lifecycle of participantTabLifecycles.values()) lifecycle?.onTabClose(beacon);
|
|
103
|
+
res.status(204).end();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// ---- Tab bijection (one browser tab per edited game — tab-lifecycle.ts) ----
|
|
107
|
+
//
|
|
108
|
+
// POST /__editor/tab/ensure — `vgai edit`/`create`'s idempotent
|
|
109
|
+
// convergence: focus/retarget the blessed tab, wait for an arriving one,
|
|
110
|
+
// or open exactly one. `{ open: false }` (the caller's --no-open) never
|
|
111
|
+
// opens. When bijection is off for this session, answer honestly from the
|
|
112
|
+
// raw SSE count so the CLI can decide for itself.
|
|
113
|
+
router.post('/__editor/tab/ensure', (req: Request, res: Response) => {
|
|
114
|
+
const open = (req.body as { open?: unknown } | undefined)?.['open'] !== false;
|
|
115
|
+
if (!tabBijectionOptions) {
|
|
116
|
+
// Bijection is off for this session, but the TABLE still knows whether
|
|
117
|
+
// a tab is here — answer from it, not from a socket count.
|
|
118
|
+
res.json({
|
|
119
|
+
status: hostTabLifecycle.blessedTabId() !== null ? 'focused' : 'disabled',
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
res.json({ status: hostTabLifecycle.ensure(open) });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// POST /__editor/tab/route — the page saying which surface it is showing
|
|
127
|
+
// ('project' = the editor on this session's project; 'no-project' = the
|
|
128
|
+
// launcher or the startup-failure surface). A launcher tab holds the same
|
|
129
|
+
// SSE connection as an editor tab, so the bijection SEES it (before this it
|
|
130
|
+
// held none at all, and the lifecycle happily opened a second tab beside a
|
|
131
|
+
// perfectly good one); the route is what keeps `ensure` honest about
|
|
132
|
+
// whether that tab is on the project yet.
|
|
133
|
+
router.post('/__editor/tab/route', (req: Request, res: Response) => {
|
|
134
|
+
const outcome = handleTabRoute(
|
|
135
|
+
(req.body ?? {}) as Record<string, unknown>,
|
|
136
|
+
trustedShareIdentity(req),
|
|
137
|
+
);
|
|
138
|
+
if (outcome.status === 200) res.json({ ok: true });
|
|
139
|
+
else res.status(outcome.status).json({ error: outcome.error });
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// POST /__editor/tab/claim — the yield page's "Use here instead": the
|
|
143
|
+
// current blessed tab is told to yield; the claimant reloads `/` and its
|
|
144
|
+
// fresh connection takes the blessing.
|
|
145
|
+
router.post('/__editor/tab/claim', (req: Request, res: Response) => {
|
|
146
|
+
const claimedParticipantId = (req.body as { participantId?: unknown } | undefined)
|
|
147
|
+
?.participantId;
|
|
148
|
+
const trusted = trustedShareIdentity(req);
|
|
149
|
+
if (
|
|
150
|
+
trusted &&
|
|
151
|
+
typeof claimedParticipantId === 'string' &&
|
|
152
|
+
trusted.participantId !== claimedParticipantId
|
|
153
|
+
) {
|
|
154
|
+
res.status(403).json({ error: 'A shared tab can only claim its own participant.' });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const participantId = trusted?.participantId ?? claimedParticipantId;
|
|
158
|
+
const lifecycle =
|
|
159
|
+
typeof participantId === 'string'
|
|
160
|
+
? participantTabLifecycles.get(participantId)
|
|
161
|
+
: trusted
|
|
162
|
+
? undefined
|
|
163
|
+
: hostTabLifecycle;
|
|
164
|
+
lifecycle?.claim();
|
|
165
|
+
res.json({ ok: true });
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// POST /__editor/tab/expect-restart — a successor server is about to take
|
|
169
|
+
// this port (source-change restart): keep the tab, it will reconnect.
|
|
170
|
+
router.post('/__editor/tab/expect-restart', (_req: Request, res: Response) => {
|
|
171
|
+
for (const lifecycle of new Set([hostTabLifecycle, ...participantTabLifecycles.values()])) {
|
|
172
|
+
lifecycle?.expectRestart();
|
|
173
|
+
}
|
|
174
|
+
res.json({ ok: true });
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// GET /__editor/tab-yielded — the static page a yielded tab lands on when
|
|
178
|
+
// `window.close()` is refused (user-opened tabs). Minimal on purpose: the
|
|
179
|
+
// editor must never RUN in two tabs for one session.
|
|
180
|
+
router.get('/__editor/tab-yielded', (_req: Request, res: Response) => {
|
|
181
|
+
res.type('html').send(
|
|
182
|
+
renderEditorBrandPage({
|
|
183
|
+
subject: 'Editor open in another tab',
|
|
184
|
+
description: 'This Volter Editor session is active in another browser tab.',
|
|
185
|
+
contentHtml:
|
|
186
|
+
"<h1>Editor open in another tab</h1><p>This game's editor is active elsewhere.</p>" +
|
|
187
|
+
'<button id="claim">Use here instead</button>',
|
|
188
|
+
scriptHtml:
|
|
189
|
+
'document.getElementById("claim").addEventListener("click",async()=>{' +
|
|
190
|
+
'const participantId=new URLSearchParams(location.search).get("participantId");' +
|
|
191
|
+
'try{await fetch("/__editor/tab/claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({participantId})})}catch{}' +
|
|
192
|
+
'location.replace("/")});',
|
|
193
|
+
}),
|
|
194
|
+
);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TWO SHARED SETTINGS LAYERS on disk (ARCHITECTURE-CORE §Editor chrome,
|
|
3
|
+
* "Settings have four layers with named homes"):
|
|
4
|
+
*
|
|
5
|
+
* GET/POST /__editor/settings/user ~/.vgai/settings.json
|
|
6
|
+
* GET/POST /__editor/settings/project <project>/.vgai/settings.json
|
|
7
|
+
*
|
|
8
|
+
* A read validates the file against `EditorSettingsSchema` and, when it does
|
|
9
|
+
* not parse, answers `{ settings: {}, issues }` naming the file's problems so
|
|
10
|
+
* the editor still opens and the person sees exactly what to fix. A write is
|
|
11
|
+
* refused (400, same issues) rather than persisting a document the next read
|
|
12
|
+
* would reject. Whole-document replace, like `/__editor/editor-state`: the
|
|
13
|
+
* client store is the one writer and merges its own patches.
|
|
14
|
+
*
|
|
15
|
+
* The user file's home is `VGAI_USER_SETTINGS_PATH` when set (the same
|
|
16
|
+
* override idiom as `VGAI_ACCOUNT_PATH`), else `~/.vgai/settings.json`.
|
|
17
|
+
*/
|
|
18
|
+
import { randomUUID } from 'node:crypto';
|
|
19
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
20
|
+
import { homedir } from 'node:os';
|
|
21
|
+
import { dirname, join, resolve } from 'node:path';
|
|
22
|
+
import type { Request, Response } from 'express';
|
|
23
|
+
import { type EditorSettings, parseEditorSettings } from '@volter/editor-project/settings/schema';
|
|
24
|
+
import type { EditorServerRouter } from '../editor-server';
|
|
25
|
+
import type { RouteContext } from './context';
|
|
26
|
+
|
|
27
|
+
export const USER_SETTINGS_PATH = process.env['VGAI_USER_SETTINGS_PATH']
|
|
28
|
+
? resolve(process.env['VGAI_USER_SETTINGS_PATH'])
|
|
29
|
+
: join(homedir(), '.vgai', 'settings.json');
|
|
30
|
+
|
|
31
|
+
export function projectSettingsPath(projectRoot: string): string {
|
|
32
|
+
return join(projectRoot, '.vgai', 'settings.json');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface SettingsFileRead {
|
|
36
|
+
readonly settings: EditorSettings;
|
|
37
|
+
/** Validation problems with the file on disk, empty when it parsed (or is absent). */
|
|
38
|
+
readonly issues: readonly string[];
|
|
39
|
+
readonly path: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function readSettingsFile(path: string): Promise<SettingsFileRead> {
|
|
43
|
+
let raw: string;
|
|
44
|
+
try {
|
|
45
|
+
raw = await readFile(path, 'utf-8');
|
|
46
|
+
} catch {
|
|
47
|
+
return { settings: {}, issues: [], path };
|
|
48
|
+
}
|
|
49
|
+
let parsed: unknown;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(raw);
|
|
52
|
+
} catch (cause) {
|
|
53
|
+
return { settings: {}, issues: [`not JSON: ${(cause as Error).message}`], path };
|
|
54
|
+
}
|
|
55
|
+
const result = parseEditorSettings(parsed);
|
|
56
|
+
return result.settings
|
|
57
|
+
? { settings: result.settings, issues: [], path }
|
|
58
|
+
: { settings: {}, issues: result.issues, path };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const pendingWrites = new Map<string, Promise<void>>();
|
|
62
|
+
|
|
63
|
+
export async function writeSettingsFile(path: string, settings: EditorSettings): Promise<void> {
|
|
64
|
+
const text = `${JSON.stringify(settings, null, 2)}\n`;
|
|
65
|
+
// Applying a style sets several axes in one turn. Concurrent truncating
|
|
66
|
+
// writes used to interleave, leaving a JSON document with another's tail.
|
|
67
|
+
// Order this server's writes and publish atomically for other sessions.
|
|
68
|
+
const write = (pendingWrites.get(path) ?? Promise.resolve())
|
|
69
|
+
.catch(() => {})
|
|
70
|
+
.then(async () => {
|
|
71
|
+
await mkdir(dirname(path), { recursive: true });
|
|
72
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
73
|
+
try {
|
|
74
|
+
await writeFile(temporary, text, { encoding: 'utf-8', mode: 0o600 });
|
|
75
|
+
await rename(temporary, path);
|
|
76
|
+
} finally {
|
|
77
|
+
await rm(temporary, { force: true });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
pendingWrites.set(path, write);
|
|
81
|
+
try {
|
|
82
|
+
await write;
|
|
83
|
+
} finally {
|
|
84
|
+
if (pendingWrites.get(path) === write) pendingWrites.delete(path);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function registerSettingsRoutes(router: EditorServerRouter, ctx: RouteContext): void {
|
|
89
|
+
const register = (layer: 'user' | 'project', pathFor: () => string | null) => {
|
|
90
|
+
router.get(`/__editor/settings/${layer}`, async (_req: Request, res: Response) => {
|
|
91
|
+
const path = pathFor();
|
|
92
|
+
if (!path) {
|
|
93
|
+
res.json({ settings: {}, issues: [], path: null });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
res.json(await readSettingsFile(path));
|
|
97
|
+
});
|
|
98
|
+
router.post(`/__editor/settings/${layer}`, async (req: Request, res: Response) => {
|
|
99
|
+
const path = pathFor();
|
|
100
|
+
if (!path) {
|
|
101
|
+
res.status(400).json({ error: 'No project open.' });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const result = parseEditorSettings(req.body);
|
|
105
|
+
if (!result.settings) {
|
|
106
|
+
res.status(400).json({ error: `Invalid ${layer} settings.`, issues: result.issues });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
await writeSettingsFile(path, result.settings);
|
|
111
|
+
res.json({ ok: true, path });
|
|
112
|
+
} catch (cause) {
|
|
113
|
+
res.status(500).json({ error: `Could not write ${path}: ${(cause as Error).message}` });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
register('user', () => USER_SETTINGS_PATH);
|
|
118
|
+
register('project', () =>
|
|
119
|
+
ctx.projectRoot === ctx.engineRoot ? null : projectSettingsPath(ctx.projectRoot),
|
|
120
|
+
);
|
|
121
|
+
}
|