@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,31 @@
|
|
|
1
|
+
import type * as THREE from 'three';
|
|
2
|
+
import { isEntityObject } from './entity-object';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The selected object when it is itself a live THREE.LOD (the native R3F
|
|
6
|
+
* shape), otherwise the entity's live THREE.LOD preview object, or null while
|
|
7
|
+
* an async asset is still loading. A subtree search skips child authoring
|
|
8
|
+
* nodes so a nested LOD entity can never shadow this one's.
|
|
9
|
+
*
|
|
10
|
+
* Format-neutral: reads the caller's native-node membership answer and
|
|
11
|
+
* Three's own `isLOD` marker, never a scene descriptor. The default retains
|
|
12
|
+
* stamp-based compatibility for first-party callers. `editor-viewport.ts`'s
|
|
13
|
+
* per-frame forced-LOD-level enforcement is the only caller.
|
|
14
|
+
*/
|
|
15
|
+
export function findEntityLod(
|
|
16
|
+
obj: THREE.Object3D,
|
|
17
|
+
isNestedAuthoringNode: (object: THREE.Object3D) => boolean = isEntityObject,
|
|
18
|
+
): THREE.LOD | null {
|
|
19
|
+
// Adapter-backed worlds can expose the native LOD itself as the selected
|
|
20
|
+
// authored row (for example Drei Detailed), rather than wrapping it in the
|
|
21
|
+
// old entity preview object this helper was originally extracted for.
|
|
22
|
+
if ((obj as THREE.LOD).isLOD) return obj as THREE.LOD;
|
|
23
|
+
const stack = [...obj.children];
|
|
24
|
+
while (stack.length > 0) {
|
|
25
|
+
const node = stack.pop()!;
|
|
26
|
+
if (isNestedAuthoringNode(node)) continue; // nested entity subtree
|
|
27
|
+
if ((node as THREE.LOD).isLOD) return node as THREE.LOD;
|
|
28
|
+
stack.push(...node.children);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One answer to "which live `Object3D` is this entity id?", for every editor
|
|
3
|
+
* surface that needs one.
|
|
4
|
+
*
|
|
5
|
+
* There are TWO places an id can resolve, and neither is a superset of the
|
|
6
|
+
* other. The ACTIVE ADAPTER's `hierarchy.object3D` is authoritative: a
|
|
7
|
+
* source-backed component may select one identity and render its transform on a
|
|
8
|
+
* child, and an ADOPTED live scene (play mode) is walked by the adapter, so its
|
|
9
|
+
* ids exist there and nowhere else. `EditorShellStore.objectMap` is the shell's
|
|
10
|
+
* own map, which the adapter's answer falls back to.
|
|
11
|
+
*
|
|
12
|
+
* Asking only the store is how `editor.frame(id)` came to refuse an entity the
|
|
13
|
+
* same session had just selected and drawn a cage around. Measured live
|
|
14
|
+
* (2026-08-14, the translated platformer in play mode): `editor.status()`
|
|
15
|
+
* listed `r3f:world:o4a7fjmzo`, `editor.select` on it put a bracket cage on the
|
|
16
|
+
* coin — and `editor.frame` on that same id answered
|
|
17
|
+
* `Entity not found: r3f:world:o4a7fjmzo`, because the adopted play scene's
|
|
18
|
+
* nodes live in the adapter's walk and not in `objectMap`. A verb's EXISTENCE
|
|
19
|
+
* CHECK has to be the resolver its ACTION uses, or the refusal is about a
|
|
20
|
+
* different question than the one asked.
|
|
21
|
+
*
|
|
22
|
+
* ## The REVERSE direction lives here too, and that is the point
|
|
23
|
+
*
|
|
24
|
+
* `userData.entityId` is the stamp an adapter's walk writes when it ADMITS an
|
|
25
|
+
* object as an authoring node (`projection/three.ts`,
|
|
26
|
+
* `R3fSourceAuthoringAdapter.indexGraph`). Reading that stamp is the node → id
|
|
27
|
+
* half of the very same question `entityObject3D` answers id → node, so both
|
|
28
|
+
* halves are spelled once, here — and the surfaces that used to reach for
|
|
29
|
+
* `getUserData(object, 'entityId')` themselves (the viewport gizmo and its
|
|
30
|
+
* surface-snap, the raycast climb, the store's adoption index, the LOD walk)
|
|
31
|
+
* ask this module instead.
|
|
32
|
+
*
|
|
33
|
+
* Presence of the stamp is also the ADMISSION answer: an object the walk
|
|
34
|
+
* skipped (an editor helper, a library-built internal folded into its owner)
|
|
35
|
+
* carries none, which is exactly what {@link isEntityObject} and
|
|
36
|
+
* {@link nearestEntityObject} read. Do not re-derive that from a type test, a
|
|
37
|
+
* name convention or a layer — those disagree with the walk, and a surface that
|
|
38
|
+
* disagrees with the walk is the "one id, three answers" defect.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
42
|
+
import { getUserData, setUserData } from '@volter/editor-threejs/ecs/user-data';
|
|
43
|
+
import type * as THREE from 'three';
|
|
44
|
+
|
|
45
|
+
/** The live object `id` names, or `null` when nothing in this session answers to it. */
|
|
46
|
+
export function entityObject3D(
|
|
47
|
+
adapter: AuthoringAdapter,
|
|
48
|
+
objectMap: ReadonlyMap<string, THREE.Object3D>,
|
|
49
|
+
id: string,
|
|
50
|
+
): THREE.Object3D | null {
|
|
51
|
+
return adapter.hierarchy.object3D?.(id) ?? objectMap.get(id) ?? null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The id `object` answers to, or `undefined` when no adapter walk has admitted
|
|
56
|
+
* it as an authoring node.
|
|
57
|
+
*/
|
|
58
|
+
export function entityIdOf(object: THREE.Object3D | null | undefined): string | undefined {
|
|
59
|
+
const id = getUserData(object, 'entityId');
|
|
60
|
+
return typeof id === 'string' && id ? id : undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Whether `object` is an admitted authoring node — see {@link entityIdOf}. */
|
|
64
|
+
export function isEntityObject(object: THREE.Object3D | null | undefined): boolean {
|
|
65
|
+
return entityIdOf(object) !== undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The nearest ancestor-or-self of `object` that is an admitted authoring node,
|
|
70
|
+
* or `null` when the climb reaches the top without finding one.
|
|
71
|
+
*
|
|
72
|
+
* This is what a raycast hit has to do: the ray lands on whatever geometry is
|
|
73
|
+
* in front, which is routinely a library-built part folded INTO a node rather
|
|
74
|
+
* than the node itself.
|
|
75
|
+
*/
|
|
76
|
+
export function nearestEntityObject(
|
|
77
|
+
object: THREE.Object3D | null | undefined,
|
|
78
|
+
): THREE.Object3D | null {
|
|
79
|
+
let cursor: THREE.Object3D | null = object ?? null;
|
|
80
|
+
while (cursor && !isEntityObject(cursor)) cursor = cursor.parent;
|
|
81
|
+
return cursor;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Record that `object` is the authoring node `id` — called by the adapter walk
|
|
86
|
+
* that MINTED the id, and by nothing else. Every reader above is the other side
|
|
87
|
+
* of this one write.
|
|
88
|
+
*/
|
|
89
|
+
export function stampEntityId(object: THREE.Object3D, id: string): void {
|
|
90
|
+
setUserData(object, 'entityId', id);
|
|
91
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PROJECT'S FILES, WRITTEN THROUGH THE WORKBENCH — the provider it
|
|
3
|
+
* installs here, and the window before it lands.
|
|
4
|
+
*
|
|
5
|
+
* `EditorHost.files` is the door (`packages/editor/src/files/`) —
|
|
6
|
+
* read/readBytes/write/exists/list/watch over PROJECT-RELATIVE paths, the same
|
|
7
|
+
* spelling the history door hands over, so both resolve against one workspace
|
|
8
|
+
* folder.
|
|
9
|
+
*
|
|
10
|
+
* WHAT THE PROVIDER BUYS, measured (U5): a vgai write the workbench did not
|
|
11
|
+
* make is an EXTERNAL change to it — Monaco reloads the file,
|
|
12
|
+
* `modelService.updateModel` pushes a fresh text element through `EditStack`,
|
|
13
|
+
* and `IUndoRedoService.pushElement` clears that resource's FUTURE, so a gizmo
|
|
14
|
+
* drag's redo was lost whenever a text model for that file was open. A write
|
|
15
|
+
* made THROUGH the workbench is the workbench's own, so no reload fires and
|
|
16
|
+
* the future survives. That is what this buys, and nothing else.
|
|
17
|
+
*
|
|
18
|
+
* IT ARRIVES AFTER THE MOUNT, always: a `ServicesAccessor` is valid only for
|
|
19
|
+
* the synchronous part of a command, so the contribution cannot build the
|
|
20
|
+
* provider before the mount it is handed to. Until it does, the door falls
|
|
21
|
+
* back to the session's transports — a write in that window is a real write
|
|
22
|
+
* with nowhere else to go.
|
|
23
|
+
*/
|
|
24
|
+
import type { EditorHostFileEvent, EditorHostFileProvider } from '@volter/editor-sdk/host';
|
|
25
|
+
|
|
26
|
+
export type ProjectFileEvent = EditorHostFileEvent;
|
|
27
|
+
export type ProjectFileProvider = EditorHostFileProvider;
|
|
28
|
+
|
|
29
|
+
let provider: ProjectFileProvider | null = null;
|
|
30
|
+
const listeners = new Set<() => void>();
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Is the provider installed? False until it lands — later than the mount,
|
|
34
|
+
* because a `ServicesAccessor` is valid only for a command's synchronous part,
|
|
35
|
+
* so the contribution hands the provider over after the editor is running. In
|
|
36
|
+
* that window a caller reaches the session's transports instead, which is a
|
|
37
|
+
* real write with nowhere else to go rather than a refusal.
|
|
38
|
+
*/
|
|
39
|
+
export function filesProviderInstalled(): boolean {
|
|
40
|
+
return provider !== null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The installed provider, or `null` before it lands. */
|
|
44
|
+
export function filesProvider(): ProjectFileProvider | null {
|
|
45
|
+
return provider;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Install how the project's files are read and written, or `null` to withdraw
|
|
50
|
+
* it — the provider is the workbench's, and a workbench that went away takes
|
|
51
|
+
* it with it.
|
|
52
|
+
*/
|
|
53
|
+
export function setFilesProvider(next: ProjectFileProvider | null): void {
|
|
54
|
+
if (provider === next) return;
|
|
55
|
+
provider = next;
|
|
56
|
+
for (const listener of listeners) listener();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function subscribeFilesProvider(listener: () => void): () => void {
|
|
60
|
+
listeners.add(listener);
|
|
61
|
+
return () => listeners.delete(listener);
|
|
62
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE ONE FILE API over the open project, in PROJECT-RELATIVE paths — the
|
|
3
|
+
* editor's half of `@volter/editor-sdk/host`'s `files` door (U5).
|
|
4
|
+
*
|
|
5
|
+
* Under the FRAME this is VS Code's `IFileService`/`ITextFileService` over the
|
|
6
|
+
* workspace folder, installed as a provider by the Code-OSS bridge. Under the
|
|
7
|
+
* HOST — standalone `vgai edit`, and the hosted browser build — it is today's
|
|
8
|
+
* transports, and this module is the ONE place that says which transport owns
|
|
9
|
+
* which path. That statement used to be spread across five files' doc
|
|
10
|
+
* comments; it is written down once, here, because the fragmentation is the
|
|
11
|
+
* fact U5 measured:
|
|
12
|
+
*
|
|
13
|
+
* | path class | the session's route |
|
|
14
|
+
* |-----------------------|------------------------------|
|
|
15
|
+
* | read, anything | Vite `/@fs/<root>/<path>` |
|
|
16
|
+
* | write `public/**` | `POST /__editor/save-file` |
|
|
17
|
+
* | write `.vgai/**` | `POST /__editor/vgai-file` |
|
|
18
|
+
* | write `src/**` source | `POST /__ui-source/apply` | the storage source-write backend |
|
|
19
|
+
* | list `public/**` | `GET /__editor/assets` | StorageBackend |
|
|
20
|
+
* | watch | `EventSource /__editor/events` | StorageBackend.watch |
|
|
21
|
+
*
|
|
22
|
+
* A path class with no host transport is REFUSED BY NAME, naming the route
|
|
23
|
+
* that does own it. It is not this door's business to invent a general
|
|
24
|
+
* project-root write route on the session: each of those routes is
|
|
25
|
+
* deliberately narrow (`/__editor/vgai-file` accepts only `.vgai/**`,
|
|
26
|
+
* `/__editor/data-file` only `src/data/**\/*.data.json`), and their own header
|
|
27
|
+
* comments record that as defence in depth. Under the frame the question does
|
|
28
|
+
* not arise — the workbench's file service owns the whole folder.
|
|
29
|
+
*
|
|
30
|
+
* `StorageBackend`'s paths are NOT this door's paths, and that difference is
|
|
31
|
+
* the measurement the door exists for: `HttpStorage` is rooted at
|
|
32
|
+
* `<project>/public/` while a project-rooted backend is rooted at the
|
|
33
|
+
* project root. Callers that still speak `StorageBackend` keep doing so; what
|
|
34
|
+
* they get under the frame is `storage/host-files-storage.ts`, a `public/`
|
|
35
|
+
* view onto this door.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { bytesToBase64 } from '../bytes-codec';
|
|
39
|
+
import { getProjectDefinePath } from '../editor-mode';
|
|
40
|
+
import { assertEditorServerAnswered, editorServerJson } from '../editor-server-response';
|
|
41
|
+
import { sourceMutationAttribution } from '../editor-session-attribution';
|
|
42
|
+
import { filesProvider, filesProviderInstalled, type ProjectFileEvent } from './file-provider';
|
|
43
|
+
|
|
44
|
+
const BASE = '/__editor';
|
|
45
|
+
|
|
46
|
+
export interface ProjectFileEntry {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly path: string;
|
|
49
|
+
readonly type: 'file' | 'dir';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Project-relative, `/`-separated, no leading slash, no `..`. */
|
|
53
|
+
function normalize(path: string): string {
|
|
54
|
+
return path.replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/+$/, '');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function assertContained(path: string): string {
|
|
58
|
+
const normalized = normalize(path);
|
|
59
|
+
if (!normalized || normalized.split('/').includes('..')) {
|
|
60
|
+
throw new Error(`projectFiles: "${path}" is not a project-relative path.`);
|
|
61
|
+
}
|
|
62
|
+
return normalized;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The same containment check for a DIRECTORY, where the empty string is the
|
|
67
|
+
* project root and therefore legal.
|
|
68
|
+
*
|
|
69
|
+
* It exists because `list` ran bare {@link normalize} while every other member
|
|
70
|
+
* ran {@link assertContained} — so a `..` segment reached the frame's provider
|
|
71
|
+
* or a session route while the same segment in a `read` was refused here.
|
|
72
|
+
* `normalize` strips a LEADING slash; it has never removed a `..` segment, and
|
|
73
|
+
* a caller reading its name could be forgiven for thinking otherwise. The
|
|
74
|
+
* empty string is the one thing `assertContained` rejects that a directory
|
|
75
|
+
* legitimately needs (it is how the project root itself is listed), which is
|
|
76
|
+
* why this is a second function rather than a flag.
|
|
77
|
+
*/
|
|
78
|
+
function assertContainedDir(dir: string): string {
|
|
79
|
+
const normalized = normalize(dir);
|
|
80
|
+
if (normalized.split('/').includes('..')) {
|
|
81
|
+
throw new Error(`projectFiles: "${dir}" is not a project-relative directory.`);
|
|
82
|
+
}
|
|
83
|
+
return normalized;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The refusal a host-tier write to a path class no session route owns gets.
|
|
88
|
+
* It NAMES the owning route rather than failing generically, because the one
|
|
89
|
+
* thing a caller can do about it is use that route.
|
|
90
|
+
*/
|
|
91
|
+
function noHostWriteRoute(path: string): Error {
|
|
92
|
+
return new Error(
|
|
93
|
+
`projectFiles.write("${path}"): the standalone editor has no general project-root write route, ` +
|
|
94
|
+
'and this door does not invent one. Source files are written through `/__ui-source/apply` ' +
|
|
95
|
+
'(`ui-source/source-write-backend.ts`), `public/**` through `/__editor/save-file`, `.vgai/**` ' +
|
|
96
|
+
'through `/__editor/vgai-file`. Under the Code-OSS frame the workbench file service owns the ' +
|
|
97
|
+
'whole folder and this refusal cannot occur.',
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// The HOST fill — today's transports
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
|
|
105
|
+
async function hostRead(path: string): Promise<string> {
|
|
106
|
+
const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`);
|
|
107
|
+
if (!res.ok) throw new Error(`projectFiles.read "${path}": HTTP ${res.status}`);
|
|
108
|
+
return res.text();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function hostReadBytes(path: string): Promise<Uint8Array> {
|
|
112
|
+
const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`);
|
|
113
|
+
if (!res.ok) throw new Error(`projectFiles.readBytes "${path}": HTTP ${res.status}`);
|
|
114
|
+
return new Uint8Array(await res.arrayBuffer());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function hostWrite(path: string, data: string | Uint8Array): Promise<void> {
|
|
118
|
+
if (path.startsWith('public/')) {
|
|
119
|
+
const body =
|
|
120
|
+
typeof data === 'string'
|
|
121
|
+
? { path: path.slice('public/'.length), content: data, ...sourceMutationAttribution() }
|
|
122
|
+
: {
|
|
123
|
+
path: path.slice('public/'.length),
|
|
124
|
+
content: bytesToBase64(data),
|
|
125
|
+
encoding: 'base64' as const,
|
|
126
|
+
...sourceMutationAttribution(),
|
|
127
|
+
};
|
|
128
|
+
const res = await fetch(`${BASE}/save-file`, {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: { 'Content-Type': 'application/json' },
|
|
131
|
+
body: JSON.stringify(body),
|
|
132
|
+
});
|
|
133
|
+
assertEditorServerAnswered(res, `Write ${path} failed`);
|
|
134
|
+
if (!res.ok) throw new Error(`projectFiles.write "${path}": HTTP ${res.status}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (path.startsWith('.vgai/')) {
|
|
138
|
+
const body =
|
|
139
|
+
typeof data === 'string'
|
|
140
|
+
? { path, content: data, ...sourceMutationAttribution() }
|
|
141
|
+
: {
|
|
142
|
+
path,
|
|
143
|
+
content: bytesToBase64(data),
|
|
144
|
+
encoding: 'base64' as const,
|
|
145
|
+
...sourceMutationAttribution(),
|
|
146
|
+
};
|
|
147
|
+
const res = await fetch(`${BASE}/vgai-file`, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: { 'Content-Type': 'application/json' },
|
|
150
|
+
body: JSON.stringify(body),
|
|
151
|
+
});
|
|
152
|
+
assertEditorServerAnswered(res, `Write ${path} failed`);
|
|
153
|
+
if (!res.ok) throw new Error(`projectFiles.write "${path}": HTTP ${res.status}`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
throw noHostWriteRoute(path);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function hostExists(path: string): Promise<boolean> {
|
|
160
|
+
try {
|
|
161
|
+
const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`, { method: 'HEAD' });
|
|
162
|
+
// The dev server's SPA fallback answers 200 with `index.html` for a missing
|
|
163
|
+
// path, so `res.ok` alone cannot tell existence from absence — the same
|
|
164
|
+
// measured false positive `api/project-source.ts`'s `probeProjectFile`
|
|
165
|
+
// records. A real file never answers as an HTML DOCUMENT.
|
|
166
|
+
if (!res.ok) return false;
|
|
167
|
+
return !(res.headers.get('content-type') ?? '').toLowerCase().includes('text/html');
|
|
168
|
+
} catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
interface ServerAssetEntry {
|
|
174
|
+
name: string;
|
|
175
|
+
type: 'file' | 'directory';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function hostList(dir: string): Promise<readonly ProjectFileEntry[]> {
|
|
179
|
+
if (!dir.startsWith('public')) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`projectFiles.list("${dir}"): the standalone editor lists only \`public/**\` ` +
|
|
182
|
+
'(`/__editor/assets`); source trees are listed by glob through ' +
|
|
183
|
+
"`/__editor/source-files` (`api/project-source.ts`'s `listProjectSourceFiles`).",
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
const inner = dir === 'public' ? '' : dir.slice('public/'.length);
|
|
187
|
+
const res = await fetch(`${BASE}/assets?${new URLSearchParams({ dir: inner })}`);
|
|
188
|
+
const { entries } = await editorServerJson<{ entries: ServerAssetEntry[] }>(
|
|
189
|
+
res,
|
|
190
|
+
`projectFiles.list "${dir}" failed`,
|
|
191
|
+
);
|
|
192
|
+
return entries.map((entry) => ({
|
|
193
|
+
name: entry.name,
|
|
194
|
+
path: inner ? `public/${inner}/${entry.name}` : `public/${entry.name}`,
|
|
195
|
+
type: entry.type === 'directory' ? ('dir' as const) : ('file' as const),
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function hostWatch(listener: (event: ProjectFileEvent) => void): () => void {
|
|
200
|
+
const source = new EventSource(`${BASE}/events`);
|
|
201
|
+
const handler = (ev: MessageEvent) => {
|
|
202
|
+
try {
|
|
203
|
+
const data = JSON.parse(ev.data) as { type?: string; file?: string; path?: string };
|
|
204
|
+
const path = data.path ?? data.file;
|
|
205
|
+
if (!path) return;
|
|
206
|
+
listener({
|
|
207
|
+
type: (data.type as ProjectFileEvent['type']) ?? 'update',
|
|
208
|
+
path: normalize(path),
|
|
209
|
+
});
|
|
210
|
+
} catch {
|
|
211
|
+
// Non-JSON keepalive frame.
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
source.addEventListener('message', handler);
|
|
215
|
+
return () => {
|
|
216
|
+
source.removeEventListener('message', handler);
|
|
217
|
+
source.close();
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// The door
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
export const projectFiles = {
|
|
226
|
+
/** True while the workbench's own file service is answering. A caller with
|
|
227
|
+
* a transport of its own (the source-write lane) reads this to decide
|
|
228
|
+
* whether its write would be EXTERNAL to the workbench. */
|
|
229
|
+
frameOwned: filesProviderInstalled,
|
|
230
|
+
|
|
231
|
+
async read(path: string): Promise<string> {
|
|
232
|
+
const key = assertContained(path);
|
|
233
|
+
return filesProvider()?.read(key) ?? hostRead(key);
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
async readBytes(path: string): Promise<Uint8Array> {
|
|
237
|
+
const key = assertContained(path);
|
|
238
|
+
const provider = filesProvider();
|
|
239
|
+
return provider?.readBytes ? provider.readBytes(key) : hostReadBytes(key);
|
|
240
|
+
},
|
|
241
|
+
|
|
242
|
+
async write(path: string, data: string | Uint8Array): Promise<void> {
|
|
243
|
+
const key = assertContained(path);
|
|
244
|
+
const provider = filesProvider();
|
|
245
|
+
if (provider) return provider.write(key, data);
|
|
246
|
+
return hostWrite(key, data);
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
async exists(path: string): Promise<boolean> {
|
|
250
|
+
const key = assertContained(path);
|
|
251
|
+
return filesProvider()?.exists(key) ?? hostExists(key);
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
async list(dir: string): Promise<readonly ProjectFileEntry[]> {
|
|
255
|
+
const key = assertContainedDir(dir);
|
|
256
|
+
const provider = filesProvider();
|
|
257
|
+
return provider?.list ? provider.list(key) : hostList(key);
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
watch(listener: (event: ProjectFileEvent) => void): () => void {
|
|
261
|
+
const provider = filesProvider();
|
|
262
|
+
return provider?.watch ? provider.watch(listener) : hostWatch(listener);
|
|
263
|
+
},
|
|
264
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE FINDER NAMESPACE — host-owned discovery algorithms an adapter SELECTS.
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE-CORE §The editor protocol, "Zero inference": what zero
|
|
5
|
+
* inference forbids is the ENGINE running a finder nobody selected. A
|
|
6
|
+
* convention (`src/scenes/`, a story registration) is legitimate exactly when
|
|
7
|
+
* it is an adapter's declared finder parameter, and illegitimate as implicit
|
|
8
|
+
* engine behavior.
|
|
9
|
+
*
|
|
10
|
+
* That is enforced MECHANICALLY, not by policy: everything under this
|
|
11
|
+
* directory has exactly ONE sanctioned importer — the editor's adapter loader
|
|
12
|
+
* (`packages/editor/src/project-adapter.ts`) — and
|
|
13
|
+
* `packages/engine/test/finder-import-boundary.test.ts` fails by name when any
|
|
14
|
+
* other engine/editor file imports it. Do not add a second importer; make the
|
|
15
|
+
* loader answer instead.
|
|
16
|
+
*
|
|
17
|
+
* Dependency direction is one-way: finders import their parameter types from
|
|
18
|
+
* `../adapter-module`, and `adapter-module.ts` imports nothing from here. That
|
|
19
|
+
* is what keeps a game's `vgai.adapter.ts` free of finder implementations.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
EXPORTED_COMPOSITION_REGIONS,
|
|
24
|
+
type FinderSelection,
|
|
25
|
+
type ScenesFromEntrypointSelectionParams,
|
|
26
|
+
} from '@volter/editor-project/adapter/adapter-module';
|
|
27
|
+
import type { FinderResult } from '@volter/editor-project/adapter/finders/finder-result';
|
|
28
|
+
import { registerFinder, runRegisteredFinder } from '@volter/editor-project/adapter/finders/registry';
|
|
29
|
+
import { type ZodType, z } from 'zod';
|
|
30
|
+
import {
|
|
31
|
+
type ScenesFromEntrypointSelectionInput,
|
|
32
|
+
scenesFromEntrypointSelection,
|
|
33
|
+
} from './scenes-from-entrypoint-selection';
|
|
34
|
+
|
|
35
|
+
export type { FinderResult } from '@volter/editor-project/adapter/finders/finder-result';
|
|
36
|
+
export type {
|
|
37
|
+
FinderContribution,
|
|
38
|
+
FinderRegistration,
|
|
39
|
+
} from '@volter/editor-project/adapter/finders/registry';
|
|
40
|
+
export {
|
|
41
|
+
registerContributedFinder,
|
|
42
|
+
registeredFinderNames,
|
|
43
|
+
registerFinder,
|
|
44
|
+
runRegisteredFinder,
|
|
45
|
+
} from '@volter/editor-project/adapter/finders/registry';
|
|
46
|
+
export type {
|
|
47
|
+
EntrypointSource,
|
|
48
|
+
ScenesFromEntrypointSelectionInput,
|
|
49
|
+
} from './scenes-from-entrypoint-selection';
|
|
50
|
+
export { scenesFromEntrypointSelection } from './scenes-from-entrypoint-selection';
|
|
51
|
+
|
|
52
|
+
/** Everything any shipped finder can be handed, gathered once by the loader. */
|
|
53
|
+
/** A project source the host read for a selection's `include` globs. */
|
|
54
|
+
export interface ProjectSourceFile {
|
|
55
|
+
/** Project-relative path. */
|
|
56
|
+
readonly path: string;
|
|
57
|
+
readonly source: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** One entry of the host's project component index. */
|
|
61
|
+
export interface ProjectComponentRef {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
/** Project-relative source path of the component's own module. */
|
|
64
|
+
readonly path: string;
|
|
65
|
+
/** Region this component's surface belongs to, when the host knows it. */
|
|
66
|
+
readonly region?: string | null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type FinderInput = ScenesFromEntrypointSelectionInput & {
|
|
70
|
+
/**
|
|
71
|
+
* The project's component index — what a finder joins its own discovery
|
|
72
|
+
* against (a prefab's source path and region).
|
|
73
|
+
*
|
|
74
|
+
* There is deliberately no `stories` here. `prefabsFromStories` used to be
|
|
75
|
+
* an engine finder whose story registrations the EDITOR filled, which is how
|
|
76
|
+
* the editor's adapter loader came to import the story registry and, through
|
|
77
|
+
* it, Storybook. It is a registered finder that reads its own ledger now
|
|
78
|
+
* (`packages/editor/src/stories/prefabs-finder.ts`): a finder's data arrives
|
|
79
|
+
* with the finder.
|
|
80
|
+
*/
|
|
81
|
+
readonly components?: readonly ProjectComponentRef[];
|
|
82
|
+
/** The sources matching every selection's `include` globs — empty when
|
|
83
|
+
* no selection declares any. A contributed finder reads the project
|
|
84
|
+
* through this and {@link FinderInput.files} and nothing else. */
|
|
85
|
+
readonly sources?: readonly ProjectSourceFile[];
|
|
86
|
+
/**
|
|
87
|
+
* The PATHS matching those same globs — every one of them, including the
|
|
88
|
+
* files `sources` has no text for.
|
|
89
|
+
*
|
|
90
|
+
* A finder over BINARY documents needs this and could not use `sources`:
|
|
91
|
+
* `@volter/editor-blender`'s `modelsFromBlendFiles` lists `.blend` files, and there
|
|
92
|
+
* is nothing in a `.blend` a text walk could honestly read — the entry IS
|
|
93
|
+
* the file. Handing it a decoded binary instead would have been the shim.
|
|
94
|
+
*/
|
|
95
|
+
readonly files?: readonly string[];
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Run one adapter-declared selection. The switch is exhaustive over
|
|
100
|
+
* {@link FinderSelection}: a new finder that forgets a case fails to COMPILE
|
|
101
|
+
* here rather than silently contributing nothing.
|
|
102
|
+
*/
|
|
103
|
+
export function runFinderSelection(selection: FinderSelection, input: FinderInput): FinderResult {
|
|
104
|
+
return runRegisteredFinder(selection, input);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The engine's own finders register here, schemas beside them: what an
|
|
108
|
+
// adapter may select by name is exactly what this registry holds.
|
|
109
|
+
const ScenesFromEntrypointSelectionSchema = z
|
|
110
|
+
.object({
|
|
111
|
+
finder: z.literal('scenesFromEntrypointSelection'),
|
|
112
|
+
regions: z
|
|
113
|
+
.union([z.array(z.string().min(1)).min(1), z.literal(EXPORTED_COMPOSITION_REGIONS)])
|
|
114
|
+
.describe('Region ids whose entrypoints carry the selection, or the rule form'),
|
|
115
|
+
selection: z
|
|
116
|
+
.string()
|
|
117
|
+
.min(1)
|
|
118
|
+
.optional()
|
|
119
|
+
.describe(
|
|
120
|
+
"Identifier of the entrypoint's module-level scene selection table; omit for a " +
|
|
121
|
+
'single-composition entrypoint',
|
|
122
|
+
),
|
|
123
|
+
})
|
|
124
|
+
.strict()
|
|
125
|
+
.refine((value) => value.selection === undefined || Array.isArray(value.regions), {
|
|
126
|
+
message:
|
|
127
|
+
'scenesFromEntrypointSelection: `selection` names an identifier in ONE entrypoint’s ' +
|
|
128
|
+
`source, so it cannot be paired with the \`${EXPORTED_COMPOSITION_REGIONS}\` rule — ` +
|
|
129
|
+
'name the region explicitly (`regions: ["<rootId>"]`).',
|
|
130
|
+
});
|
|
131
|
+
registerFinder<ScenesFromEntrypointSelectionParams, FinderInput>({
|
|
132
|
+
name: 'scenesFromEntrypointSelection',
|
|
133
|
+
schema:
|
|
134
|
+
ScenesFromEntrypointSelectionSchema as unknown as ZodType<ScenesFromEntrypointSelectionParams>,
|
|
135
|
+
run: scenesFromEntrypointSelection,
|
|
136
|
+
});
|