@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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, headless facts about a `three` STORY: whether a mounted story holds
|
|
3
|
+
* three content, and how a story's preview thumbnail is keyed in an in-memory
|
|
4
|
+
* cache. Kept pure and off the React tree so every one of them is
|
|
5
|
+
* unit-testable with no renderer.
|
|
6
|
+
*
|
|
7
|
+
* Membership belongs to the CONSUMER, never to the registry, and it is
|
|
8
|
+
* DECLARED (`story-declared-medium.ts`). The `3D Components` board admits
|
|
9
|
+
* stories whose medium is `three`, the canvas board admits `canvas`, the
|
|
10
|
+
* DOM design board admits `dom` ({@link domStoryBoardMembers}). An
|
|
11
|
+
* undeclared story is a named gap and is not a candidate on any board —
|
|
12
|
+
* nothing here mounts to guess. The project's story registry stays
|
|
13
|
+
* deliberately unfiltered.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type * as THREE from 'three';
|
|
17
|
+
import { getProjectStoryRegions } from './project-story-regions';
|
|
18
|
+
import { declaredStoryMedium, reportUndeclaredStoryMedium } from './story-declared-medium';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Whether a mounted story's root wrapper actually holds `three` content.
|
|
22
|
+
*
|
|
23
|
+
* A story that renders nothing (or renders only React fragments/null) commits
|
|
24
|
+
* successfully into the wrapper group and yields an EMPTY `Object3D` — a
|
|
25
|
+
* successful mount with nothing in it. A surface shows a story that rendered
|
|
26
|
+
* something; "the mount succeeded" alone is not the test.
|
|
27
|
+
*/
|
|
28
|
+
export function mountedStoryHasThreeContent(root: THREE.Object3D): boolean {
|
|
29
|
+
return root.children.length > 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The DOM design board's membership — every story DECLARED as `dom`.
|
|
34
|
+
*
|
|
35
|
+
* An undeclared story is named once and is not a member. Nothing here
|
|
36
|
+
* mounts: medium is a declaration, and a last-resort mount would make
|
|
37
|
+
* "residue 0" unfalsifiable (the orphan would land on this board).
|
|
38
|
+
*
|
|
39
|
+
* The board (`authoring/design-time-layers.ts`) renders each member through
|
|
40
|
+
* `react-dom`, so a three story landing on it renders `<group>`/`<primitive>`
|
|
41
|
+
* as unknown DOM tags. Declaration is what keeps those stories off this
|
|
42
|
+
* board; the project's story registry stays deliberately unfiltered.
|
|
43
|
+
*/
|
|
44
|
+
export function domStoryBoardMembers<
|
|
45
|
+
T extends {
|
|
46
|
+
readonly id?: string;
|
|
47
|
+
readonly name?: string;
|
|
48
|
+
readonly modulePath?: string;
|
|
49
|
+
readonly tags?: readonly string[];
|
|
50
|
+
},
|
|
51
|
+
>(stories: readonly T[]): T[] {
|
|
52
|
+
const regions = getProjectStoryRegions();
|
|
53
|
+
const members: T[] = [];
|
|
54
|
+
for (const story of stories) {
|
|
55
|
+
const declared = declaredStoryMedium({ modulePath: story.modulePath, regions });
|
|
56
|
+
if (declared.medium === 'dom') {
|
|
57
|
+
members.push(story);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (declared.via === 'undeclared' && story.modulePath) {
|
|
61
|
+
reportUndeclaredStoryMedium(story.modulePath, declared.reason);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return members;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The in-memory thumbnail cache key: the story's identity plus the identity of
|
|
69
|
+
* the args it was captured with, so an arg edit re-captures rather than showing
|
|
70
|
+
* a stale picture of the previous value. Args are ordered by key so two equal
|
|
71
|
+
* arg sets never key differently.
|
|
72
|
+
*
|
|
73
|
+
* Non-serializable arg values (functions, symbols, cycles) are represented by
|
|
74
|
+
* their type rather than dropped — an arg that cannot be stringified must still
|
|
75
|
+
* take part in identity, and it must never make the key THROW.
|
|
76
|
+
*/
|
|
77
|
+
export function threeStoryThumbnailKey(storyId: string, args: Record<string, unknown>): string {
|
|
78
|
+
const parts: string[] = [];
|
|
79
|
+
for (const name of Object.keys(args).sort()) {
|
|
80
|
+
parts.push(`${name}=${stableArgValue(args[name])}`);
|
|
81
|
+
}
|
|
82
|
+
return `${storyId}|${parts.join('&')}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function stableArgValue(value: unknown): string {
|
|
86
|
+
if (typeof value === 'function') return 'fn';
|
|
87
|
+
if (typeof value === 'symbol') return 'symbol';
|
|
88
|
+
if (value === undefined) return 'undefined';
|
|
89
|
+
try {
|
|
90
|
+
return JSON.stringify(value) ?? 'undefined';
|
|
91
|
+
} catch {
|
|
92
|
+
// A cyclic or otherwise unserializable object: identity by type, which is
|
|
93
|
+
// stable for the lifetime of one composed story.
|
|
94
|
+
return `[${typeof value}]`;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** React/Fiber primitives selected from the graph that owns a project story. */
|
|
2
|
+
|
|
3
|
+
import { createRoot as staticCreateR3FRoot, extend as staticExtendThree } from '@react-three/fiber';
|
|
4
|
+
import { createElement as staticCreateElement } from 'react';
|
|
5
|
+
import * as staticThree from 'three';
|
|
6
|
+
import { R3F_RUNTIME_PATH } from '@volter/editor-sdk/host';
|
|
7
|
+
import { isPackagedRuntime } from './packaged-runtime';
|
|
8
|
+
|
|
9
|
+
export interface StoryThreePreviewRuntime {
|
|
10
|
+
readonly packaged: boolean;
|
|
11
|
+
readonly createElement: typeof staticCreateElement;
|
|
12
|
+
readonly createR3FRoot: typeof staticCreateR3FRoot;
|
|
13
|
+
readonly extendThree: typeof staticExtendThree;
|
|
14
|
+
readonly three: typeof staticThree;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const STATIC_RUNTIME: StoryThreePreviewRuntime = {
|
|
18
|
+
packaged: false,
|
|
19
|
+
createElement: staticCreateElement,
|
|
20
|
+
createR3FRoot: staticCreateR3FRoot,
|
|
21
|
+
extendThree: staticExtendThree,
|
|
22
|
+
three: staticThree,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let cachedPackagedRuntime: Promise<StoryThreePreviewRuntime> | null = null;
|
|
26
|
+
|
|
27
|
+
async function loadPackagedRuntime(): Promise<StoryThreePreviewRuntime> {
|
|
28
|
+
const mod = (await import(/* @vite-ignore */ R3F_RUNTIME_PATH)) as Record<string, unknown>;
|
|
29
|
+
for (const name of ['createElement', 'createR3FRoot', 'extendThree']) {
|
|
30
|
+
if (typeof mod[name] !== 'function') {
|
|
31
|
+
throw new Error(
|
|
32
|
+
`The packaged R3F preview runtime did not export ${name} as a function — see ` +
|
|
33
|
+
'vite-plugin-module-doorways.ts.',
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (typeof mod['projectThree'] !== 'object' || mod['projectThree'] === null) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
'The packaged R3F preview runtime did not export projectThree — see ' +
|
|
40
|
+
'vite-plugin-module-doorways.ts.',
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
packaged: true,
|
|
45
|
+
createElement: mod['createElement'] as typeof staticCreateElement,
|
|
46
|
+
createR3FRoot: mod['createR3FRoot'] as typeof staticCreateR3FRoot,
|
|
47
|
+
extendThree: mod['extendThree'] as typeof staticExtendThree,
|
|
48
|
+
three: mod['projectThree'] as typeof staticThree,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function resolveStoryThreePreviewRuntime(): Promise<StoryThreePreviewRuntime> {
|
|
53
|
+
if (!(await isPackagedRuntime())) return STATIC_RUNTIME;
|
|
54
|
+
if (!cachedPackagedRuntime) cachedPackagedRuntime = loadPackagedRuntime();
|
|
55
|
+
return cachedPackagedRuntime;
|
|
56
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOES OUR SURFACE HOLD THE KEYBOARD? — the term the play-input predicate was
|
|
3
|
+
* missing, and it was missing because until the Code-OSS frame there was
|
|
4
|
+
* nothing else on the page that could want a keystroke.
|
|
5
|
+
*
|
|
6
|
+
* The documented rule is "game input only fires while play is running AND the
|
|
7
|
+
* Game tab is active" (the repo's CLAUDE.md, §Play-mode input isolation), and
|
|
8
|
+
* standalone `vgai edit` those two clauses are the whole truth: the editor page
|
|
9
|
+
* IS the surface, so a keystroke that reaches it was meant for it. Under the
|
|
10
|
+
* frame (WORK.md §The core is Code-OSS, U2) the page is a VS Code workbench and
|
|
11
|
+
* our stage is ONE EDITOR PANE in it. A person typing into Monaco in the group
|
|
12
|
+
* beside a running game is typing into the same `document` the game's listeners
|
|
13
|
+
* are on, and both clauses above are still true — the game is playing and the
|
|
14
|
+
* Game document is still the active vgai document, because activating another
|
|
15
|
+
* EDITOR did not close it. So the keystroke lands in the file AND moves the
|
|
16
|
+
* game. That is U6's incident (keys typed into Monaco reaching the vgai
|
|
17
|
+
* viewport as hotkeys, twice measured) repeated one layer down, on the GAME's
|
|
18
|
+
* input rather than the editor's, and U6's fix does not cover it: keyboard
|
|
19
|
+
* OWNERSHIP decides which dispatcher owns a chord, while this decides whether a
|
|
20
|
+
* running game hears raw DOM events at all.
|
|
21
|
+
*
|
|
22
|
+
* ## Why this is a third TERM and not a correction to the second
|
|
23
|
+
*
|
|
24
|
+
* The obvious-looking fix — have the frame write `activeViewportTab = 'edit'`
|
|
25
|
+
* when the pane stops being the active editor — is a defect, and the code says
|
|
26
|
+
* so out loud: `syncCenterDocuments` (`components/CenterDocuments.tsx`) reads an
|
|
27
|
+
* `'edit'` tab with the GAME document active as a genuine disagreement and
|
|
28
|
+
* activates the SCENE document to correct it. Under the frame the layout host
|
|
29
|
+
* renders the ACTIVE document into the editor pane, so that correction would
|
|
30
|
+
* unmount the Game document, release the live document's container out from
|
|
31
|
+
* under the running runtime, and end the game. The tab is about WHICH DOCUMENT
|
|
32
|
+
* is open, the probe below is about WHO IS TYPING, and conflating them costs
|
|
33
|
+
* the game.
|
|
34
|
+
*
|
|
35
|
+
* ## The shape
|
|
36
|
+
*
|
|
37
|
+
* A single installed probe, default absent, and absent means TRUE. Standalone
|
|
38
|
+
* nothing installs one and every predicate reads exactly as it did before this
|
|
39
|
+
* module existed — the same "an unset value is upstream's own behaviour"
|
|
40
|
+
* discipline U9's core edit follows. The frame installs one from the workbench's
|
|
41
|
+
* own notion of the active editor (`ActiveEditorContext` over the vgai pane's
|
|
42
|
+
* type id), which is the right question rather than DOM focus: clicking a game
|
|
43
|
+
* canvas that carries no `tabindex` moves focus to `body` while the pane stays
|
|
44
|
+
* the active editor, and gating on focus would have killed input on the first
|
|
45
|
+
* click into the game.
|
|
46
|
+
*
|
|
47
|
+
* ## Its readers, both of them, and why they are both needed
|
|
48
|
+
*
|
|
49
|
+
* `gated-globals.ts` covers every RAW `window`/`document` listener a project
|
|
50
|
+
* module registers — first-party games, ingest mounts and the module lane
|
|
51
|
+
* alike, since the dev server's lexical shadow is what they all go through.
|
|
52
|
+
* `@vgai/game`'s `play-mode.ts` covers the engine's own `InputManager`, which
|
|
53
|
+
* is NOT a project module (it is `@vgai/game-runtime`, resolved as a dependency) and
|
|
54
|
+
* therefore attaches to the real `window` unshadowed; it reads this through
|
|
55
|
+
* `instanceInputActive` and re-gates on this module's notification.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
type SurfaceKeyboardProbe = () => boolean;
|
|
59
|
+
|
|
60
|
+
let probe: SurfaceKeyboardProbe | null = null;
|
|
61
|
+
const listeners = new Set<() => void>();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* True while the surface a game is mounted in holds the keyboard.
|
|
65
|
+
*
|
|
66
|
+
* Absent probe = true, deliberately: the standalone editor page is the only
|
|
67
|
+
* surface there is, and a host that has not answered must never be read as a
|
|
68
|
+
* refusal — a silently dead keyboard is the worst failure this module could
|
|
69
|
+
* have.
|
|
70
|
+
*/
|
|
71
|
+
export function surfaceHoldsKeyboard(): boolean {
|
|
72
|
+
if (!probe) return true;
|
|
73
|
+
try {
|
|
74
|
+
return probe();
|
|
75
|
+
} catch {
|
|
76
|
+
// A probe that throws is a broken frame, not a person who stopped typing.
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Install the frame's answer. Returns the uninstall, which restores the
|
|
83
|
+
* always-true default rather than leaving the last answer pinned — a frame
|
|
84
|
+
* going away must not leave a game deaf.
|
|
85
|
+
*/
|
|
86
|
+
export function setSurfaceKeyboardProbe(next: SurfaceKeyboardProbe | null): () => void {
|
|
87
|
+
probe = next;
|
|
88
|
+
notifySurfaceKeyboard();
|
|
89
|
+
return () => {
|
|
90
|
+
if (probe !== next) return;
|
|
91
|
+
probe = null;
|
|
92
|
+
notifySurfaceKeyboard();
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The frame calls this when its answer changes; `gated-globals`' gates re-read
|
|
97
|
+
* per event and need no notification, but `InputManager` is a latched
|
|
98
|
+
* `setEnabled` and does. */
|
|
99
|
+
export function notifySurfaceKeyboard(): void {
|
|
100
|
+
for (const listener of listeners) listener();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function subscribeSurfaceKeyboard(listener: () => void): () => void {
|
|
104
|
+
listeners.add(listener);
|
|
105
|
+
return () => listeners.delete(listener);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Test-only reset. */
|
|
109
|
+
export function __resetSurfaceKeyboardForTest(): void {
|
|
110
|
+
probe = null;
|
|
111
|
+
listeners.clear();
|
|
112
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { MountFailureReport } from './authoring/mount-failure-report';
|
|
2
|
+
import type { RootReadiness } from './readiness';
|
|
3
|
+
|
|
4
|
+
export type SurfaceContentState = 'unknown' | 'present' | 'empty';
|
|
5
|
+
export type SurfacePhase = 'loading' | 'ready';
|
|
6
|
+
|
|
7
|
+
export interface SurfaceExplanation {
|
|
8
|
+
readonly tone: 'loading' | 'error' | 'neutral';
|
|
9
|
+
readonly title: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ExplainSurfaceInput {
|
|
14
|
+
/** Human name of the surface, e.g. Scene, Game, or Story. */
|
|
15
|
+
readonly surface: string;
|
|
16
|
+
/** True when the surface's design mount is DELIBERATELY suspended because
|
|
17
|
+
* the game is playing — the wait is not progress and must not read as one
|
|
18
|
+
* (a human sat on "waiting for world to finish mounting" on an auto-played
|
|
19
|
+
* example and reported the Scene tab broken — runhuman pass 37). */
|
|
20
|
+
readonly playSuspended?: boolean;
|
|
21
|
+
/** Exact root identities owned by this surface. Empty means not identified yet. */
|
|
22
|
+
readonly rootIds: readonly string[];
|
|
23
|
+
readonly phase: SurfacePhase;
|
|
24
|
+
readonly content: SurfaceContentState;
|
|
25
|
+
readonly readiness?: readonly RootReadiness[];
|
|
26
|
+
readonly failures?: readonly MountFailureReport[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function quoted(ids: readonly string[]): string {
|
|
30
|
+
return ids.map((id) => `“${id}”`).join(', ');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function failureExplanation(
|
|
34
|
+
surface: string,
|
|
35
|
+
failures: readonly MountFailureReport[],
|
|
36
|
+
): SurfaceExplanation {
|
|
37
|
+
const failedIds = failures.map((failure) => failure.worldId);
|
|
38
|
+
return {
|
|
39
|
+
tone: 'error',
|
|
40
|
+
title:
|
|
41
|
+
failedIds.length === 1
|
|
42
|
+
? `${surface} root ${quoted(failedIds)} failed`
|
|
43
|
+
: `${failedIds.length} ${surface} roots failed`,
|
|
44
|
+
description: `${failures
|
|
45
|
+
.map(
|
|
46
|
+
(failure) =>
|
|
47
|
+
`${failure.worldId} (${failure.kind}, ${failure.identity}): ${failure.message}`,
|
|
48
|
+
)
|
|
49
|
+
.join(
|
|
50
|
+
'\n',
|
|
51
|
+
)}\nIf this followed an edit, Undo (Ctrl+Z) restores the previous source and remounts.`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function loadingExplanation(surface: string, rootIds: readonly string[]): SurfaceExplanation {
|
|
56
|
+
const title =
|
|
57
|
+
rootIds.length === 0
|
|
58
|
+
? `Loading ${surface}`
|
|
59
|
+
: rootIds.length === 1
|
|
60
|
+
? `Loading ${surface} root ${quoted(rootIds)}`
|
|
61
|
+
: `Loading ${rootIds.length} ${surface} roots`;
|
|
62
|
+
return {
|
|
63
|
+
tone: 'loading',
|
|
64
|
+
title,
|
|
65
|
+
description:
|
|
66
|
+
rootIds.length === 0
|
|
67
|
+
? 'Reading the project declaration to identify the root that belongs here.'
|
|
68
|
+
: `Waiting for ${quoted(rootIds)} to finish mounting.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function emptyExplanation(surface: string, rootIds: readonly string[]): SurfaceExplanation {
|
|
73
|
+
if (rootIds.length === 0) {
|
|
74
|
+
return {
|
|
75
|
+
tone: 'neutral',
|
|
76
|
+
title: `No ${surface} root`,
|
|
77
|
+
description: 'No declared root belongs to this surface.',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
tone: 'neutral',
|
|
82
|
+
title: 'No renderable content',
|
|
83
|
+
// The second sentence is load-bearing: a world whose content exists only
|
|
84
|
+
// under its game systems (the shipped shooters and strategy examples all
|
|
85
|
+
// do this) presents exactly this card the moment Play stops, and a human
|
|
86
|
+
// tester read it as breakage ("why did it stop? no renderable content" —
|
|
87
|
+
// runhuman pass 13, 2026-08-28). Name the way forward on the card itself.
|
|
88
|
+
description:
|
|
89
|
+
(rootIds.length === 1
|
|
90
|
+
? `Root ${quoted(rootIds)} mounted successfully but currently produces no renderable content.`
|
|
91
|
+
: `Roots ${quoted(rootIds)} mounted successfully but currently produce no renderable content.`) +
|
|
92
|
+
' If this world builds its content under its game systems, press Play (▶) to run it.',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The one precedence rule for a surface which otherwise has nothing to draw.
|
|
98
|
+
* A real rendered result always wins. When there is no result, a named failure
|
|
99
|
+
* wins over a named wait, which wins over the honest successful-empty state.
|
|
100
|
+
*/
|
|
101
|
+
export function explainSurface(input: ExplainSurfaceInput): SurfaceExplanation | null {
|
|
102
|
+
if (input.content === 'present') return null;
|
|
103
|
+
|
|
104
|
+
if (input.playSuspended) {
|
|
105
|
+
return {
|
|
106
|
+
tone: 'neutral',
|
|
107
|
+
title: 'Editing paused during Play',
|
|
108
|
+
description: `${quoted(input.rootIds)} is running in the Game tab. Press Stop (⏹) to edit it here.`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const owned = new Set(input.rootIds);
|
|
113
|
+
const scopedFailures = (input.failures ?? []).filter((failure) => owned.has(failure.worldId));
|
|
114
|
+
if (scopedFailures.length > 0) return failureExplanation(input.surface, scopedFailures);
|
|
115
|
+
|
|
116
|
+
const waitingIds = (input.readiness ?? [])
|
|
117
|
+
.filter((entry) => entry.state === 'waiting' && owned.has(entry.rootId))
|
|
118
|
+
.map((entry) => entry.rootId);
|
|
119
|
+
const loadingIds = waitingIds.length > 0 ? waitingIds : input.rootIds;
|
|
120
|
+
if (input.phase === 'loading' || waitingIds.length > 0 || input.content === 'unknown') {
|
|
121
|
+
return loadingExplanation(input.surface, loadingIds);
|
|
122
|
+
}
|
|
123
|
+
return emptyExplanation(input.surface, input.rootIds);
|
|
124
|
+
}
|