@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,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE EDITOR RUNTIME CONTEXT — the light half of what `EditorContext.tsx`
|
|
3
|
+
* used to be: the `EditorRuntime` shape (store, stats, init promise,
|
|
4
|
+
* session), the React context that carries it, `EditorRuntimeProvider`,
|
|
5
|
+
* and every `use*` hook that reads it. Nothing here starts a lifecycle:
|
|
6
|
+
* no project discovery, no command listener, no save wiring. That is the
|
|
7
|
+
* point of the split — a connected component's only dependency on the
|
|
8
|
+
* editor is this module (closure: the shell store, the history session and
|
|
9
|
+
* two context helpers), so a bounded host (a document mounted alone,
|
|
10
|
+
* Storybook, a component test) mounts the same components without the
|
|
11
|
+
* application's whole boot graph. `EditorContext.tsx` keeps the
|
|
12
|
+
* application-level `EditorProvider` that owns those lifecycles.
|
|
13
|
+
*
|
|
14
|
+
* Measured 2026-09-03 (`scripts/validate-editor-closure.mjs --rank`): the
|
|
15
|
+
* bounded entry's closure was 505 files, 500 of them through
|
|
16
|
+
* `EditorContext.tsx`'s lifecycle imports, and the web build put 6.5 MB of
|
|
17
|
+
* the editor into that page for one Provider. This module is the cut.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { type InteractiveEditScope, InteractiveEditScopeContext } from '@volter/editor-sdk/widgets';
|
|
21
|
+
import { type ReactNode, Suspense, useContext, useMemo, useSyncExternalStore } from 'react';
|
|
22
|
+
import type { EditorShellStore } from './editor-shell-store';
|
|
23
|
+
import type { EditorSession } from './history/editor-session';
|
|
24
|
+
import type { HistoryCommandSnapshot, HistoryCommands } from './history/history-commands';
|
|
25
|
+
import type { HistoryService, HistorySnapshot } from './history/history-service';
|
|
26
|
+
import { createHmrStableReactContext } from './hmr-stable-react-context';
|
|
27
|
+
|
|
28
|
+
export interface EditorStats {
|
|
29
|
+
fps: number;
|
|
30
|
+
frameTime: number;
|
|
31
|
+
drawCalls: number;
|
|
32
|
+
triangles: number;
|
|
33
|
+
cameraPosition: { x: number; y: number; z: number };
|
|
34
|
+
cameraTarget: { x: number; y: number; z: number };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface EditorRuntime {
|
|
38
|
+
store: EditorShellStore;
|
|
39
|
+
stats: EditorStats;
|
|
40
|
+
initPromise: Promise<void>;
|
|
41
|
+
session: EditorSession;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const EditorContext = createHmrStableReactContext<EditorRuntime | null>(
|
|
45
|
+
import.meta.hot?.data,
|
|
46
|
+
'EditorContext',
|
|
47
|
+
null,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Provide an already-constructed editor runtime without starting project
|
|
52
|
+
* discovery, filesystem initialization, command listeners, or global bridges.
|
|
53
|
+
*
|
|
54
|
+
* The application-level {@link EditorProvider} below owns those lifecycles.
|
|
55
|
+
* Bounded production hosts (Storybook, component tests, embedded tools) use
|
|
56
|
+
* this provider so they render the same connected components against explicit
|
|
57
|
+
* dependencies instead of cloning the UI or accidentally booting a project.
|
|
58
|
+
*/
|
|
59
|
+
export function EditorRuntimeProvider({
|
|
60
|
+
runtime,
|
|
61
|
+
children,
|
|
62
|
+
}: {
|
|
63
|
+
readonly runtime: EditorRuntime;
|
|
64
|
+
readonly children: ReactNode;
|
|
65
|
+
}) {
|
|
66
|
+
// The shell's interactive-edit scope is INERT by design: coalescing a drag
|
|
67
|
+
// into one undo entry is each adapter's own business, done next to the
|
|
68
|
+
// writes it owns, so nothing here needs to bracket them.
|
|
69
|
+
const editScope = useMemo<InteractiveEditScope>(() => ({ begin: () => {}, end: () => {} }), []);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<EditorContext.Provider value={runtime}>
|
|
73
|
+
<InteractiveEditScopeContext.Provider value={editScope}>
|
|
74
|
+
<Suspense>{children}</Suspense>
|
|
75
|
+
</InteractiveEditScopeContext.Provider>
|
|
76
|
+
</EditorContext.Provider>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function useEditorStore(): EditorShellStore {
|
|
81
|
+
const ctx = useContext(EditorContext);
|
|
82
|
+
if (!ctx) throw new Error('useEditorStore must be used within <EditorProvider>');
|
|
83
|
+
return ctx.store;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function useEditorStats(): EditorStats {
|
|
87
|
+
const ctx = useContext(EditorContext);
|
|
88
|
+
if (!ctx) throw new Error('useEditorStats must be used within <EditorProvider>');
|
|
89
|
+
return ctx.stats;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function useEditorInit(): Promise<void> {
|
|
93
|
+
const ctx = useContext(EditorContext);
|
|
94
|
+
if (!ctx) throw new Error('useEditorInit must be used within <EditorProvider>');
|
|
95
|
+
return ctx.initPromise;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function useHistoryService(): HistoryService {
|
|
99
|
+
const ctx = useContext(EditorContext);
|
|
100
|
+
if (!ctx) throw new Error('useHistoryService must be used within <EditorProvider>');
|
|
101
|
+
return ctx.session.history;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** History-aware panels may still be rendered in isolated component tests. */
|
|
105
|
+
export function useOptionalHistoryService(): HistoryService | null {
|
|
106
|
+
return useContext(EditorContext)?.session.history ?? null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The shell store WHEN THERE IS A SHELL — `null` in a bounded host.
|
|
111
|
+
*
|
|
112
|
+
* Same contract as {@link useOptionalHistoryService}, and it exists for the
|
|
113
|
+
* same reason: the surfaces `scripts/validate-editor-closure.mjs` pins are
|
|
114
|
+
* exactly the ones a bounded host mounts with no `EditorProvider` above them
|
|
115
|
+
* (`@volter/editor-blender`'s Model document mounts `ToolObject3DAuthoring` that way).
|
|
116
|
+
* A stage asking what the WORKSPACE is showing must be able to hear "there is
|
|
117
|
+
* no workspace" instead of throwing the host's own document off the screen.
|
|
118
|
+
*/
|
|
119
|
+
export function useOptionalEditorStore(): EditorShellStore | null {
|
|
120
|
+
return useContext(EditorContext)?.store ?? null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The shell's frame/camera readout WHEN THERE IS A SHELL — same contract as
|
|
124
|
+
* {@link useOptionalEditorStore}, for the stage host: the world root's stage
|
|
125
|
+
* writes this every frame and the shell's own readouts (`CameraInfo`,
|
|
126
|
+
* `StatsOverlay`) read it, while a bounded host has neither. */
|
|
127
|
+
export function useOptionalEditorStats(): EditorStats | null {
|
|
128
|
+
return useContext(EditorContext)?.stats ?? null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function useHistoryCommands(): HistoryCommands {
|
|
132
|
+
const ctx = useContext(EditorContext);
|
|
133
|
+
if (!ctx) throw new Error('useHistoryCommands must be used within <EditorProvider>');
|
|
134
|
+
return ctx.session.historyCommands;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function useHistoryCommandSnapshot(): HistoryCommandSnapshot {
|
|
138
|
+
const history = useHistoryCommands();
|
|
139
|
+
return useSyncExternalStore(history.subscribe, history.getSnapshot, history.getSnapshot);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function useHistorySnapshot(): HistorySnapshot {
|
|
143
|
+
const history = useHistoryService();
|
|
144
|
+
return useSyncExternalStore(history.subscribe, history.getSnapshot, history.getSnapshot);
|
|
145
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One reader for "did the EDITOR SERVER answer this, and what did it say?"
|
|
3
|
+
*
|
|
4
|
+
* ## Why `response.ok` is not that question
|
|
5
|
+
*
|
|
6
|
+
* Every editor route lives under `/__editor/*` on the same origin as the
|
|
7
|
+
* editor page. When no editor server is in front of that origin — a static
|
|
8
|
+
* preview of `dist/`, a misconfigured deployment — the host still answers:
|
|
9
|
+
* with the SPA FALLBACK, which is `200 OK` and
|
|
10
|
+
* `text/html`. So `response.ok` is TRUE for a request nothing handled.
|
|
11
|
+
*
|
|
12
|
+
* That turned into two different fabrications, depending on what the caller did
|
|
13
|
+
* next:
|
|
14
|
+
*
|
|
15
|
+
* - callers that PARSED died inside `res.json()` on `Unexpected token '<'`, an
|
|
16
|
+
* error naming neither the route nor the cause, usually into a bare `catch`
|
|
17
|
+
* that returned an empty value the UI then reported as a fact about the
|
|
18
|
+
* project ("No project tools registered", "no portable CSF previews");
|
|
19
|
+
* - callers that did NOT parse — a POST whose only interest is "did it work?"
|
|
20
|
+
* — read the fallback as SUCCESS. Marking a generation job read, forgetting
|
|
21
|
+
* one, reconciling providers: each reported done, having reached nothing.
|
|
22
|
+
*
|
|
23
|
+
* The second is the worse half, and it is invisible: there is no exception to
|
|
24
|
+
* catch, so the only symptom is state that never actually changed.
|
|
25
|
+
*
|
|
26
|
+
* ## The rule
|
|
27
|
+
*
|
|
28
|
+
* A response is from the editor server when its content type is JSON. Every
|
|
29
|
+
* `/__editor/*` route answers JSON — including its FAILURES, which carry
|
|
30
|
+
* `{ error }` — while the page fallback never does, so the check has no false
|
|
31
|
+
* negatives to trade against. Callers that already guard the REALM
|
|
32
|
+
* (`getEditorMode()`) still use this: the realm guard says "don't ask", this
|
|
33
|
+
* says "that answer isn't ours", and a deployment can put a page fallback in
|
|
34
|
+
* front of a mode the client believes is served.
|
|
35
|
+
*
|
|
36
|
+
* The header's question is really two, so there are two entry points:
|
|
37
|
+
*
|
|
38
|
+
* - {@link assertEditorServerAnswered} — "did the editor server answer this?"
|
|
39
|
+
* alone, for the many callers that then read the server's OWN `{ error }`
|
|
40
|
+
* body on a non-OK status. Asserting `ok` for them would replace a real,
|
|
41
|
+
* user-facing server message ("Insufficient credits") with a bare status
|
|
42
|
+
* code, so they get the fallback check and keep their own status handling.
|
|
43
|
+
* - {@link assertEditorServerResponse} / {@link editorServerJson} — answered
|
|
44
|
+
* AND OK, for callers with no interest in the failure body.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/** The single sentence a page-fallback answer gets, so the reader is sent to
|
|
48
|
+
* the host rather than to their own project. */
|
|
49
|
+
function fallbackMessage(what: string, contentType: string): string {
|
|
50
|
+
return (
|
|
51
|
+
`${what}: this origin answered with its page fallback (${contentType || 'no content-type'}) ` +
|
|
52
|
+
'rather than JSON, so no editor server handled the request.'
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Throw unless `response` came from the editor server AT ALL — ignoring its
|
|
58
|
+
* status, which is the caller's own business.
|
|
59
|
+
*
|
|
60
|
+
* For callers that read the route's `{ error }` body on failure: run this
|
|
61
|
+
* BEFORE `response.json()`, so a page fallback reports itself instead of dying
|
|
62
|
+
* as `Unexpected token '<'` in the parse.
|
|
63
|
+
*/
|
|
64
|
+
export function assertEditorServerAnswered(response: Response, what: string): void {
|
|
65
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
66
|
+
if (!contentType.includes('application/json')) {
|
|
67
|
+
throw new Error(fallbackMessage(what, contentType));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Throw unless `response` really came from the editor server AND succeeded.
|
|
73
|
+
*
|
|
74
|
+
* For callers whose only question is whether the call took effect (POST/DELETE
|
|
75
|
+
* routes with no interesting body).
|
|
76
|
+
*/
|
|
77
|
+
export function assertEditorServerResponse(response: Response, what: string): void {
|
|
78
|
+
if (!response.ok) throw new Error(`${what} (${response.status}).`);
|
|
79
|
+
assertEditorServerAnswered(response, what);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** {@link assertEditorServerResponse}, then the parsed body. */
|
|
83
|
+
export async function editorServerJson<T>(response: Response, what: string): Promise<T> {
|
|
84
|
+
assertEditorServerResponse(response, what);
|
|
85
|
+
return (await response.json()) as T;
|
|
86
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHO THIS EDITOR SESSION IS, AND WHAT REVISION IT LAST SAW — the stamp every
|
|
3
|
+
* host source write carries.
|
|
4
|
+
*
|
|
5
|
+
* Three facts, all of them the page's own:
|
|
6
|
+
* - the PARTICIPANT ID this tab writes under, seeded by the server's
|
|
7
|
+
* bootstrap global and otherwise persisted per browser. `editor-presence.ts`
|
|
8
|
+
* re-exports it as `EDITOR_PARTICIPANT_ID`, which is the name the rest of
|
|
9
|
+
* the host knows it by.
|
|
10
|
+
* - the session's GUEST flag: this page reached the editor through a shared
|
|
11
|
+
* tunnel, so three host surfaces disable what a guest may not do
|
|
12
|
+
* (`account.ts`, `components/ProjectHeader.tsx`,
|
|
13
|
+
* `components/WorktreeSwitcher.tsx`).
|
|
14
|
+
* - the last source REVISION this page observed, which every write sends as
|
|
15
|
+
* `expectedRevision` so the server can refuse a stale one. That is
|
|
16
|
+
* optimistic concurrency on the storage seam, not a feature: the readers
|
|
17
|
+
* are `storage/http-storage.ts`, `ui-source/source-write-backend.ts`,
|
|
18
|
+
* `history/project-root-history-backends.ts`,
|
|
19
|
+
* `authoring/edit-mode-authoring.ts` and `source-conflict.ts`.
|
|
20
|
+
*
|
|
21
|
+
* IT WAS CALLED `collaboration-attribution.ts` UNTIL THE FINAL AUDIT, and the
|
|
22
|
+
* name was the only thing that ever made it an opinion — two audits filed it
|
|
23
|
+
* under 'collaboration and presence' and named a door for it that the host
|
|
24
|
+
* does not need, because nothing here is a lane's: a page identifies itself
|
|
25
|
+
* and stamps its writes whether or not anyone else is connected. TWO sibling
|
|
26
|
+
* packages read it (`@vgai/collaboration` takes the guest flag,
|
|
27
|
+
* `@vgai/game` takes the write stamp), which by the rule `@vgai/dom` was
|
|
28
|
+
* landed on means it lives in neither. `WORK.md` §THE FINAL AUDIT.
|
|
29
|
+
*/
|
|
30
|
+
const participantKey = 'vgai.collaboration.participant.v1';
|
|
31
|
+
const remoteShareKey = 'vgai.collaboration.remote-share.v1';
|
|
32
|
+
const bootstrap = (
|
|
33
|
+
globalThis as typeof globalThis & {
|
|
34
|
+
__VGAI_EDITOR_PRESENCE_BOOTSTRAP__?: {
|
|
35
|
+
participantId?: string;
|
|
36
|
+
displayName?: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
).__VGAI_EDITOR_PRESENCE_BOOTSTRAP__;
|
|
40
|
+
|
|
41
|
+
function storedParticipantId(): string {
|
|
42
|
+
if (bootstrap?.participantId) return bootstrap.participantId;
|
|
43
|
+
const generated = globalThis.crypto?.randomUUID?.() ?? `participant-${Date.now()}`;
|
|
44
|
+
try {
|
|
45
|
+
const stored = globalThis.localStorage?.getItem(participantKey);
|
|
46
|
+
if (stored) return stored;
|
|
47
|
+
globalThis.localStorage?.setItem(participantKey, generated);
|
|
48
|
+
} catch {
|
|
49
|
+
// Storage can be blocked; page-lifetime identity is still usable.
|
|
50
|
+
}
|
|
51
|
+
return generated;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const COLLABORATION_PARTICIPANT_ID = storedParticipantId();
|
|
55
|
+
export const COLLABORATION_REMOTE_SHARE = (() => {
|
|
56
|
+
try {
|
|
57
|
+
return globalThis.localStorage?.getItem(remoteShareKey) === '1';
|
|
58
|
+
} catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
export const COLLABORATION_PARTICIPANT_NAME = bootstrap?.displayName || 'Local editor';
|
|
63
|
+
|
|
64
|
+
let revision = 0;
|
|
65
|
+
|
|
66
|
+
export function setCollaborationRevision(value: number): void {
|
|
67
|
+
if (Number.isInteger(value) && value >= revision) revision = value;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function sourceMutationAttribution(): {
|
|
71
|
+
participantId: string;
|
|
72
|
+
expectedRevision: number;
|
|
73
|
+
} {
|
|
74
|
+
return { participantId: COLLABORATION_PARTICIPANT_ID, expectedRevision: revision };
|
|
75
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHICH MODE THE EDITOR IS IN — one predicate, in a leaf module.
|
|
3
|
+
*
|
|
4
|
+
* It lives here rather than beside its first reader because it has two kinds of
|
|
5
|
+
* reader now, and they must never drift: `coverage/session-vitals.ts` asks so
|
|
6
|
+
* the `edit-mode-static` invariant can judge the session, and the ingest mount
|
|
7
|
+
* paths ask so a freshly-loaded game can be HELD at design time
|
|
8
|
+
* (`ingest/ingest-play-control.ts`'s `ingestContentTimeForMode`). An instrument
|
|
9
|
+
* must not be an import of the thing it measures, so neither owns it.
|
|
10
|
+
*
|
|
11
|
+
* MODE IS A SESSION, NOT A LOOP — and reading it off the loops is the one
|
|
12
|
+
* mistake that would make the Edit-static check unable to fire.
|
|
13
|
+
*
|
|
14
|
+
* A first-party play, deferred-ingest play, module session, or explicit ingest
|
|
15
|
+
* ▶ exists because somebody asked the host to run content; that is the editor
|
|
16
|
+
* being in Play. An ingest loop merely TURNING is still not a mode — it is the
|
|
17
|
+
* condition "ingested games autoplay in Edit" describes. `ingestPlaying()` is
|
|
18
|
+
* safe to use here because it is NOT inferred from a moving loop: it is the
|
|
19
|
+
* host play-control latch, written only when that control releases or holds the
|
|
20
|
+
* required ingest pause surface. A game advancing behind the host's back cannot
|
|
21
|
+
* set it and therefore remains visible to the Edit-static invariant.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { anyLiveSessionPlaying } from './live-session-registry';
|
|
25
|
+
|
|
26
|
+
/** The editor is in Play when any registered lane is playing
|
|
27
|
+
* (`live-session-registry.ts`): first-party Play, a deferred-ingest play, an
|
|
28
|
+
* ingest ▶ held by the host play-control latch, a module session. */
|
|
29
|
+
export function editorIsPlaying(): boolean {
|
|
30
|
+
return anyLiveSessionPlaying();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Whether a gesture closed RIGHT NOW is an AUTHORING edit — the question every
|
|
35
|
+
* source-write backend asks before it moves a byte
|
|
36
|
+
* (`authoring/source-persistence-backend.ts` and the two backends behind it).
|
|
37
|
+
*
|
|
38
|
+
* What an edit means is decided by the surface it is made on: a HELD world is
|
|
39
|
+
* being authored and the gesture belongs in the game's own source; a RUNNING
|
|
40
|
+
* one is being played, and a play-time edit is session-local.
|
|
41
|
+
* {@link editorIsPlaying} owns that whole answer, including the ingest play
|
|
42
|
+
* control, rather than making every caller remember a second condition. Play
|
|
43
|
+
* adoption normally hands its adapters no source backend at all, but not every
|
|
44
|
+
* world in a play session gets that treatment (`play-mode.ts` composes
|
|
45
|
+
* non-presented worlds with `structuralThree`, which carries one), so the
|
|
46
|
+
* mode is asked here rather than trusted to the composition.
|
|
47
|
+
*
|
|
48
|
+
* The converse case is what decides the shape: an ingest boot-mounted into the
|
|
49
|
+
* Game document and HELD on its title screen is being AUTHORED. So the test is
|
|
50
|
+
* the loop's state, never which document the mount happens to live in.
|
|
51
|
+
*/
|
|
52
|
+
export function editorIsAuthoring(): boolean {
|
|
53
|
+
return !editorIsPlaying();
|
|
54
|
+
}
|