@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONE `canvasFrame` seam (`composite-screenshot.ts`), for every pixel door.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* A canvas is only `drawImage`-able after its frame when its WebGL context was
|
|
7
|
+
* created with `preserveDrawingBuffer: true`. Every canvas the vgai RUNTIME
|
|
8
|
+
* mounts sets it; a canvas a GAME created is the game's own and almost never
|
|
9
|
+
* does. Two different mechanisms recover those pixels, one per substrate:
|
|
10
|
+
*
|
|
11
|
+
* - a lane whose render pass owns the canvas (a three ingest) copies the
|
|
12
|
+
* drawing buffer INSIDE that pass, asked through the live registry
|
|
13
|
+
* (`LiveSession.snapshotFrame`, `ingest/ingest-frame-snapshot.ts`);
|
|
14
|
+
* - a Pixi surface re-renders the stage through the renderer's own extractor
|
|
15
|
+
* ({@link presentedPixiFrame}, `stories/story-pixi-preview.ts`).
|
|
16
|
+
*
|
|
17
|
+
* Both already existed. What did not was a single place that tries both, and
|
|
18
|
+
* that gap was VISIBLE AS A LIE: `command-listener.ts`'s `bridge-screenshot`
|
|
19
|
+
* passed only the three one and `editor-view-presentation.ts`'s
|
|
20
|
+
* `capture-active-document` passed only the Pixi one, so each door photographed
|
|
21
|
+
* one lane correctly and the other one BLANK — and a blank frame is the worst
|
|
22
|
+
* failure a look verb has, because nothing about it says it failed.
|
|
23
|
+
*
|
|
24
|
+
* Composing them is safe by construction: each half answers `null` — the seam's
|
|
25
|
+
* documented "read the canvas directly" — for a canvas it does not own, so a
|
|
26
|
+
* first-party runtime canvas still takes the ordinary path.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { presentedPixiFrame } from './canvas-preview-frames';
|
|
30
|
+
import { snapshotLiveFrame } from './live-session-registry';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Same-frame pixels for `canvas`, whichever live surface owns it, or `null`
|
|
34
|
+
* when none does.
|
|
35
|
+
*
|
|
36
|
+
* Order is the cheap test first: the registry's claim is an identity read
|
|
37
|
+
* against the mounted lane's canvas, while the Pixi leg walks the presented
|
|
38
|
+
* set and, on a hit, costs a real render.
|
|
39
|
+
*/
|
|
40
|
+
export async function liveCanvasFrame(
|
|
41
|
+
canvas: HTMLCanvasElement,
|
|
42
|
+
): Promise<CanvasImageSource | null> {
|
|
43
|
+
const live = snapshotLiveFrame(canvas);
|
|
44
|
+
if (live) return live;
|
|
45
|
+
return presentedPixiFrame(canvas);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A `CanvasImageSource` that can be read back as a PNG on its own — what the
|
|
49
|
+
* canvas-only capture leg needs when it has no compositor to draw into.
|
|
50
|
+
* Pixi's extractor hands back a real `HTMLCanvasElement`, but the seam's type
|
|
51
|
+
* is the wider `CanvasImageSource`, so the door asks rather than casts. */
|
|
52
|
+
export function readablePngSource(source: CanvasImageSource | null): HTMLCanvasElement | null {
|
|
53
|
+
const candidate = source as HTMLCanvasElement | null;
|
|
54
|
+
return candidate && typeof candidate.toDataURL === 'function' ? candidate : null;
|
|
55
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE LIVE DOCUMENT's lifetime — the host's one center document for running
|
|
3
|
+
* content (`workspace:game`, titled `Game`). When nothing runs there is no
|
|
4
|
+
* live document at all — no tab, no panel, no hidden-but-mounted host.
|
|
5
|
+
*
|
|
6
|
+
* The editor's standing center documents are the authoring ones (Scene / the
|
|
7
|
+
* world documents, `UI`, `3D`). The live document is not one of them: it is
|
|
8
|
+
* the running lane's own surface, so it EXISTS exactly as long as a runtime
|
|
9
|
+
* does. It is installed when a runtime is about to mount and closed when
|
|
10
|
+
* that runtime ends, through the ordinary `workspace-document-registry`
|
|
11
|
+
* path every other document uses — never a parallel host, never a
|
|
12
|
+
* permanently-mounted panel whose tab is hidden.
|
|
13
|
+
*
|
|
14
|
+
* ## Resource ownership (stated here, once)
|
|
15
|
+
*
|
|
16
|
+
* This module OWNS the open/close of `workspace:game`, the focus it borrows,
|
|
17
|
+
* and the CONTAINER element every lane mounts into. Sharers:
|
|
18
|
+
* `components/CenterDocuments.tsx` binds the session's tab hook
|
|
19
|
+
* ({@link bindLiveDocument}) and reports play-state edges
|
|
20
|
+
* ({@link syncLiveDocumentPlayState}); the package that runs things registers
|
|
21
|
+
* what the document DRAWS ({@link registerLiveDocumentContent}, through
|
|
22
|
+
* `@volter/editor-sdk/host`'s `workspace.liveDocument`) and its panel reports
|
|
23
|
+
* the container's attach/detach ({@link setLiveDocumentContainer} /
|
|
24
|
+
* {@link releaseLiveDocumentContainer}); the runtimes that {@link
|
|
25
|
+
* acquireLiveDocument} are exactly the ones that MOUNT INTO the container —
|
|
26
|
+
* Play, the module lane's two enter paths, and each per-surface ingest mount
|
|
27
|
+
* — each acquiring immediately before it reads {@link liveDocumentContainer}.
|
|
28
|
+
* A dispatcher above them (`ingest/mount-ingest-root.ts`) never acquires: a
|
|
29
|
+
* second, earlier acquire there could only refuse ahead of the mount that
|
|
30
|
+
* owns the answer. {@link releaseLiveDocument} is the ONE teardown path and
|
|
31
|
+
* it is idempotent — a failed play calls it directly, and every ordinary stop
|
|
32
|
+
* reaches it through the playing → stopped edge.
|
|
33
|
+
*
|
|
34
|
+
* ## Why acquiring is asynchronous
|
|
35
|
+
*
|
|
36
|
+
* A runtime mounts into the document's own DOM (the registered content's
|
|
37
|
+
* panel), so the element only exists once React has committed the panel
|
|
38
|
+
* that this module just opened. `acquireLiveDocument` therefore opens the
|
|
39
|
+
* document and then waits for that commit, which the panel reports through
|
|
40
|
+
* {@link setLiveDocumentContainer}.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import type { LiveDocumentContent, LiveDocumentContentProps } from '@volter/editor-sdk/host';
|
|
44
|
+
import type { ComponentType } from 'react';
|
|
45
|
+
import { GAME_DOCUMENT_ID } from './workspace-document-ids';
|
|
46
|
+
import {
|
|
47
|
+
activateWorkspaceDocument,
|
|
48
|
+
activeWorkspaceDocumentId,
|
|
49
|
+
closeWorkspaceDocument,
|
|
50
|
+
openWorkspaceDocument,
|
|
51
|
+
openWorkspaceDocuments,
|
|
52
|
+
type WorkspaceDocumentDescriptor,
|
|
53
|
+
} from './workspace-document-registry';
|
|
54
|
+
|
|
55
|
+
/** How long an acquire waits for the panel's first commit before giving up.
|
|
56
|
+
* The caller's failure message ("the game container is not mounted…") is the
|
|
57
|
+
* honest report; hanging forever would be worse than a bounded refusal. */
|
|
58
|
+
const CONTAINER_MOUNT_TIMEOUT_MS = 4000;
|
|
59
|
+
|
|
60
|
+
interface LiveDocumentHooks {
|
|
61
|
+
/** The tab hand-off: activating the live document selects the play tab. */
|
|
62
|
+
onActivate(): void;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let _hooks: LiveDocumentHooks | null = null;
|
|
66
|
+
let _content: LiveDocumentContent | null = null;
|
|
67
|
+
let _container: HTMLElement | null = null;
|
|
68
|
+
let _containerMounted = false;
|
|
69
|
+
let _restoreDocumentId: string | null = null;
|
|
70
|
+
let _wasLive = false;
|
|
71
|
+
const _mountWaiters = new Set<() => void>();
|
|
72
|
+
|
|
73
|
+
/** Reached only when a lane acquires the document before any package
|
|
74
|
+
* registered content — a build that mounts nothing never opens it. */
|
|
75
|
+
const NoLiveContent: ComponentType<LiveDocumentContentProps> = () => null;
|
|
76
|
+
|
|
77
|
+
function descriptor(): WorkspaceDocumentDescriptor | null {
|
|
78
|
+
const hooks = _hooks;
|
|
79
|
+
if (!hooks) return null;
|
|
80
|
+
const content = _content;
|
|
81
|
+
return {
|
|
82
|
+
id: GAME_DOCUMENT_ID,
|
|
83
|
+
title: 'Game',
|
|
84
|
+
kind: 'game',
|
|
85
|
+
workspaceRole: 'authored-subject',
|
|
86
|
+
Content: content?.Content ?? NoLiveContent,
|
|
87
|
+
// The document-local toolbar — the lane's own — appears only while the
|
|
88
|
+
// live document is active (§6.3).
|
|
89
|
+
...(content?.Toolbar ? { Toolbar: content.Toolbar } : {}),
|
|
90
|
+
closeable: false,
|
|
91
|
+
presentation: () => ({ kind: 'workspace', id: GAME_DOCUMENT_ID }),
|
|
92
|
+
onActivate: () => hooks.onActivate(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Bind this editor session's tab hook. `useCenterDocuments` calls this in
|
|
98
|
+
* the same effect that installs the other center documents, and the returned
|
|
99
|
+
* cleanup releases the document with the session.
|
|
100
|
+
*/
|
|
101
|
+
export function bindLiveDocument(hooks: LiveDocumentHooks): () => void {
|
|
102
|
+
_hooks = hooks;
|
|
103
|
+
return () => {
|
|
104
|
+
if (_hooks !== hooks) return;
|
|
105
|
+
releaseLiveDocument();
|
|
106
|
+
_hooks = null;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The package that runs things registers what the document draws. While
|
|
111
|
+
* the document is open, re-registering refreshes its mount slots. */
|
|
112
|
+
export function registerLiveDocumentContent(content: LiveDocumentContent): () => void {
|
|
113
|
+
_content = content;
|
|
114
|
+
if (liveDocumentOpen()) {
|
|
115
|
+
const next = descriptor();
|
|
116
|
+
if (next) openWorkspaceDocument(next, { activate: false });
|
|
117
|
+
}
|
|
118
|
+
return () => {
|
|
119
|
+
if (_content === content) _content = null;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Whether the live document is currently open. */
|
|
124
|
+
export function liveDocumentOpen(): boolean {
|
|
125
|
+
return openWorkspaceDocuments().some((d) => d.descriptor.id === GAME_DOCUMENT_ID);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Bring the live document to the front, if it is open. Answers whether it was.
|
|
130
|
+
*
|
|
131
|
+
* ▶ IS A DELIBERATE ACT ON THE GAME, and this is the half a BOOT-MOUNTED
|
|
132
|
+
* ingest was missing. `landIngestBootInEdit` puts the authoring Scene in front
|
|
133
|
+
* at mount — correctly, because that mount IS edit mode — and until 2026-09-20
|
|
134
|
+
* nothing moved it back: the ingest transport's ▶ released content time and
|
|
135
|
+
* left the person looking at the Scene, which for `three-points-waves` is the
|
|
136
|
+
* honest "No renderable content" card while the points ran unseen behind it
|
|
137
|
+
* (walk 3, beat 19). A play-time mount already does this for itself
|
|
138
|
+
* (`deferred-ingest-play.ts`'s `store.setActiveViewportTab('play')`).
|
|
139
|
+
*
|
|
140
|
+
* It activates rather than writing the viewport tab because THIS module owns
|
|
141
|
+
* `workspace:game`: activation fires the descriptor's `onActivate`, which is
|
|
142
|
+
* the one place that writes `activeViewportTab = 'play'` — so the tab, the
|
|
143
|
+
* registry and the input gate cannot drift apart. A caller with no store in
|
|
144
|
+
* hand (the ingest play control is a pure control surface) needs exactly this.
|
|
145
|
+
*/
|
|
146
|
+
export function activateLiveDocument(): boolean {
|
|
147
|
+
if (!liveDocumentOpen()) return false;
|
|
148
|
+
return activateWorkspaceDocument(GAME_DOCUMENT_ID);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** The container element every lane mounts into, or null while no panel is
|
|
152
|
+
* committed. */
|
|
153
|
+
export function liveDocumentContainer(): HTMLElement | null {
|
|
154
|
+
return _container;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** The panel's ATTACH half. */
|
|
158
|
+
export function setLiveDocumentContainer(el: HTMLElement): void {
|
|
159
|
+
_container = el;
|
|
160
|
+
_containerMounted = true;
|
|
161
|
+
for (const waiter of [..._mountWaiters]) waiter();
|
|
162
|
+
_mountWaiters.clear();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* The panel's DETACH half, keyed by the element it is letting go of — never
|
|
167
|
+
* a bare "set null".
|
|
168
|
+
*
|
|
169
|
+
* Two panel instances briefly coexist whenever the live document closes and
|
|
170
|
+
* reopens in one gesture (every ingest mount's `exitActiveIngest()` →
|
|
171
|
+
* `acquireLiveDocument()` sequence), and React gives no cross-component
|
|
172
|
+
* ordering promise between the old panel's cleanup ref and the new panel's
|
|
173
|
+
* attach ref. Measured on bubbo-bubbo (2026-08-21, probe in the mount path):
|
|
174
|
+
* the acquire resolved `true` in 36ms — the NEW panel's element had attached
|
|
175
|
+
* — and the container was null anyway, because the OLD panel's cleanup ran
|
|
176
|
+
* after the attach and clobbered the singleton. Keying the release on the
|
|
177
|
+
* element makes a stale panel's cleanup a no-op: only the panel that still
|
|
178
|
+
* OWNS the slot may empty it.
|
|
179
|
+
*/
|
|
180
|
+
export function releaseLiveDocumentContainer(el: HTMLElement): void {
|
|
181
|
+
if (_container !== el) return;
|
|
182
|
+
_container = null;
|
|
183
|
+
_containerMounted = false;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Install the live document and resolve once its container has mounted.
|
|
188
|
+
*
|
|
189
|
+
* Called by every runtime that mounts into that container — play, ingest and
|
|
190
|
+
* module mode — BEFORE it reads {@link liveDocumentContainer}. Resolves `false` when no
|
|
191
|
+
* session has bound a descriptor, or when the panel did not commit in time; the
|
|
192
|
+
* caller reports that as its own start failure rather than mounting into
|
|
193
|
+
* nothing.
|
|
194
|
+
*
|
|
195
|
+
* Opening ACTIVATES the document (entering a runtime is a deliberate act on the
|
|
196
|
+
* game), and remembers whichever document had focus so
|
|
197
|
+
* {@link releaseLiveDocument} can hand it back.
|
|
198
|
+
*/
|
|
199
|
+
export async function acquireLiveDocument(
|
|
200
|
+
timeoutMs = CONTAINER_MOUNT_TIMEOUT_MS,
|
|
201
|
+
): Promise<boolean> {
|
|
202
|
+
const next = descriptor();
|
|
203
|
+
if (!next) return false;
|
|
204
|
+
if (!liveDocumentOpen()) {
|
|
205
|
+
_restoreDocumentId = activeWorkspaceDocumentId();
|
|
206
|
+
openWorkspaceDocument(next);
|
|
207
|
+
} else {
|
|
208
|
+
activateWorkspaceDocument(next.id);
|
|
209
|
+
}
|
|
210
|
+
if (_containerMounted) return true;
|
|
211
|
+
return new Promise<boolean>((resolve) => {
|
|
212
|
+
const waiter = () => {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
resolve(true);
|
|
215
|
+
};
|
|
216
|
+
const timer = setTimeout(() => {
|
|
217
|
+
_mountWaiters.delete(waiter);
|
|
218
|
+
resolve(_containerMounted);
|
|
219
|
+
}, timeoutMs);
|
|
220
|
+
_mountWaiters.add(waiter);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* The ONE teardown path: close the live document and give focus back to
|
|
226
|
+
* whatever held it before the runtime borrowed it. Idempotent — safe from a
|
|
227
|
+
* failed start and from an ordinary stop, both of which reach it.
|
|
228
|
+
*/
|
|
229
|
+
export function releaseLiveDocument(): void {
|
|
230
|
+
if (!_hooks || !liveDocumentOpen()) {
|
|
231
|
+
_restoreDocumentId = null;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const restore = _restoreDocumentId;
|
|
235
|
+
_restoreDocumentId = null;
|
|
236
|
+
// THE LATCH GOES STALE-FALSE HERE, EAGERLY — before React has flushed the
|
|
237
|
+
// panel's unmount. Closing the document makes "the container is mounted"
|
|
238
|
+
// untrue at THIS line, but the panel's own detach only
|
|
239
|
+
// lands on the next React commit, so between here and that commit the latch
|
|
240
|
+
// used to still say true. A caller that tears a runtime down and
|
|
241
|
+
// immediately re-acquires (every ingest mount's `exitActiveIngest()` →
|
|
242
|
+
// `acquireLiveDocument()` sequence) then got an instant `true` from the
|
|
243
|
+
// stale latch, read the container in the unmount gap, and refused
|
|
244
|
+
// with "Game container not mounted" — measured on bubbo-bubbo (2026-08-21):
|
|
245
|
+
// every ▶ after a creation-site write failed this way, because the write is
|
|
246
|
+
// what first materializes the held ingest session the next play must tear
|
|
247
|
+
// down. Clearing the latch first makes the re-acquire genuinely WAIT for
|
|
248
|
+
// the reopened panel's commit, which is the contract its doc claims.
|
|
249
|
+
_containerMounted = false;
|
|
250
|
+
// `discardDirty` because the live document is never an authored draft — it
|
|
251
|
+
// has nothing to save and a close must never be refused.
|
|
252
|
+
closeWorkspaceDocument(GAME_DOCUMENT_ID, { discardDirty: true });
|
|
253
|
+
// Closing already activated a neighbour (the registry's own "there is always
|
|
254
|
+
// an active center document" fallback); restoring the pre-play document is
|
|
255
|
+
// only a correction of WHICH one, never a rescue from having none.
|
|
256
|
+
if (restore) activateWorkspaceDocument(restore);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Report the store's live/stopped state on every notify. A runtime ENDING is
|
|
261
|
+
* the edge that closes the document; the stopped state on its own must not,
|
|
262
|
+
* because {@link acquireLiveDocument} deliberately runs while the store still
|
|
263
|
+
* says stopped (a runtime needs the container before it can start).
|
|
264
|
+
*/
|
|
265
|
+
export function syncLiveDocumentPlayState(live: boolean): void {
|
|
266
|
+
if (_wasLive && !live) releaseLiveDocument();
|
|
267
|
+
_wasLive = live;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Test-only reset — drops the binding and every latch WITHOUT closing. */
|
|
271
|
+
export function __resetLiveDocumentForTest(): void {
|
|
272
|
+
_hooks = null;
|
|
273
|
+
_content = null;
|
|
274
|
+
_container = null;
|
|
275
|
+
_containerMounted = false;
|
|
276
|
+
_restoreDocumentId = null;
|
|
277
|
+
_wasLive = false;
|
|
278
|
+
_mountWaiters.clear();
|
|
279
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The module→`Object3D` step, IN THE BROWSER — the live twin of the bake
|
|
3
|
+
* lane's Node-side `module-source.ts`
|
|
4
|
+
* (`catalog/project-source/src/tools/module-source.ts`), and deliberately the
|
|
5
|
+
* SAME contract: a project TypeScript module whose export builds a native
|
|
6
|
+
* `THREE.Object3D`. `project.bake.module` / `project.bake.preview` /
|
|
7
|
+
* `vgai screenshot <module>` already define that contract; the live modeling
|
|
8
|
+
* document opens the same thing, so a module that bakes opens, and a module
|
|
9
|
+
* that opens bakes (docs/BLENDER-PARITY.md §The model file).
|
|
10
|
+
*
|
|
11
|
+
* TWO HALVES, ONE CONTRACT. Node imports a `file://` url and has no GPU; the
|
|
12
|
+
* browser imports the dev server's `/@fs/` url and IS the GPU. Nothing else
|
|
13
|
+
* differs, which is why this file re-states the resolution rather than
|
|
14
|
+
* importing the tool's copy: that copy is `host: 'node'` capability source
|
|
15
|
+
* (`node:fs/promises`, `node:url`) that a project's own tsconfig excludes from
|
|
16
|
+
* its browser build. Sharing the module would drag Node into the editor
|
|
17
|
+
* bundle; sharing the CONTRACT is what matters, and the contract is small
|
|
18
|
+
* enough to be stated twice and obviously identical.
|
|
19
|
+
*
|
|
20
|
+
* DETECTION IS STRUCTURAL, not a filename convention — the quarks precedent
|
|
21
|
+
* (`components/asset-viewers/JsonAssetDocument.tsx`: three.quarks names no
|
|
22
|
+
* extension of its own, so the file's own structure is what says whether it is
|
|
23
|
+
* a particle document). There is no `.model.ts`: a project `.ts`/`.tsx`
|
|
24
|
+
* whose export RESOLVES to an `Object3D` is a model module, and everything
|
|
25
|
+
* else falls back to the ordinary source viewer.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { liveModuleImportUrl } from '@volter/editor-sdk/session/project-module-url';
|
|
29
|
+
import type * as THREE from 'three';
|
|
30
|
+
|
|
31
|
+
/** Why this module is not a live model module — the sentence the document
|
|
32
|
+
* shows, and the reason it fell back to the source viewer. */
|
|
33
|
+
export type LiveModuleRefusal =
|
|
34
|
+
/** Nothing importable at all: a syntax error, a throwing top level, a
|
|
35
|
+
* missing dependency. The one refusal that is USUALLY a defect in a module
|
|
36
|
+
* that WAS a model module a moment ago, which is why the document keeps its
|
|
37
|
+
* last good root on screen for it. */
|
|
38
|
+
| { readonly kind: 'import-failed'; readonly message: string; readonly stack?: string }
|
|
39
|
+
/** It imported fine, it is simply not a model module. */
|
|
40
|
+
| { readonly kind: 'not-a-model'; readonly message: string };
|
|
41
|
+
|
|
42
|
+
export interface LiveModuleBuild {
|
|
43
|
+
readonly root: THREE.Object3D;
|
|
44
|
+
/** Which export produced it — `default`, or the single named export. */
|
|
45
|
+
readonly exportName: string;
|
|
46
|
+
/** The BUILDER's own teardown, when the export returned a build result that
|
|
47
|
+
* carried one. The document runs it in place of the generic graph dispose:
|
|
48
|
+
* a rig holds mixers, actions and materials a `traverse` walk cannot see. */
|
|
49
|
+
readonly dispose?: () => void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class LiveModuleError extends Error {
|
|
53
|
+
constructor(readonly refusal: LiveModuleRefusal) {
|
|
54
|
+
super(refusal.message);
|
|
55
|
+
this.name = 'LiveModuleError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** The module-namespace keys that are never a candidate export. */
|
|
60
|
+
function candidateExportNames(namespace: Record<string, unknown>): string[] {
|
|
61
|
+
return Object.keys(namespace).filter(
|
|
62
|
+
(name) => name !== '__esModule' && name !== 'Symbol.toStringTag',
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function isObject3D(value: unknown): value is THREE.Object3D {
|
|
67
|
+
return (
|
|
68
|
+
typeof value === 'object' &&
|
|
69
|
+
value !== null &&
|
|
70
|
+
(value as { isObject3D?: unknown }).isObject3D === true
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Pick the export this module offers as its subject, matching the bake lane's
|
|
76
|
+
* `exportName` default: the DEFAULT export, or — when there is no default —
|
|
77
|
+
* the single named export. Two named exports and no default is ambiguous and
|
|
78
|
+
* refuses by name rather than guessing; the bake verbs make the caller say
|
|
79
|
+
* which one, and a document has nobody to ask.
|
|
80
|
+
*/
|
|
81
|
+
export function pickLiveModuleExport(
|
|
82
|
+
namespace: Record<string, unknown>,
|
|
83
|
+
): { readonly name: string; readonly value: unknown } | LiveModuleRefusal {
|
|
84
|
+
if ('default' in namespace) return { name: 'default', value: namespace['default'] };
|
|
85
|
+
const named = candidateExportNames(namespace);
|
|
86
|
+
if (named.length === 0) {
|
|
87
|
+
return { kind: 'not-a-model', message: 'This module exports nothing.' };
|
|
88
|
+
}
|
|
89
|
+
if (named.length > 1) {
|
|
90
|
+
return {
|
|
91
|
+
kind: 'not-a-model',
|
|
92
|
+
message:
|
|
93
|
+
`This module has no default export and ${named.length} named exports ` +
|
|
94
|
+
`(${named.join(', ')}), so there is no single subject to build. A model module ` +
|
|
95
|
+
'default-exports its builder.',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return { name: named[0]!, value: namespace[named[0]!] };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* THE TWO SHAPES A MODEL MODULE MAY PRODUCE — the same pair the Node twin
|
|
103
|
+
* normalizes (`catalog/project-source/src/tools/module-source.ts`'s
|
|
104
|
+
* `asModuleBuild`), because a module that bakes must open and a module that
|
|
105
|
+
* opens must bake:
|
|
106
|
+
*
|
|
107
|
+
* 1. a bare `THREE.Object3D`;
|
|
108
|
+
* 2. a BUILD RESULT `{ root, animations?, dispose? }` — what every parametric
|
|
109
|
+
* lib in the kit returns (`createBird`'s `BirdBuild` and its descendants),
|
|
110
|
+
* and what `bakeObject3DSource`'s `build` callback has always taken.
|
|
111
|
+
*
|
|
112
|
+
* `animations` is written onto `root.animations`, three's own carrier for a
|
|
113
|
+
* model's clips — so the clip list travels with the graph the document mounts
|
|
114
|
+
* and every reader downstream (the Object3D document session, its animation
|
|
115
|
+
* transport) finds it where it finds a GLTF's.
|
|
116
|
+
*/
|
|
117
|
+
function asLiveModuleBuild(
|
|
118
|
+
built: unknown,
|
|
119
|
+
): { root: THREE.Object3D; dispose?: () => void } | undefined {
|
|
120
|
+
if (isObject3D(built)) return { root: built };
|
|
121
|
+
if (!built || typeof built !== 'object') return undefined;
|
|
122
|
+
const result = built as { root?: unknown; animations?: unknown; dispose?: unknown };
|
|
123
|
+
if (!isObject3D(result.root)) return undefined;
|
|
124
|
+
const root = result.root;
|
|
125
|
+
if (Array.isArray(result.animations) && root.animations.length === 0) {
|
|
126
|
+
root.animations = result.animations as THREE.AnimationClip[];
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
root,
|
|
130
|
+
...(typeof result.dispose === 'function'
|
|
131
|
+
? { dispose: () => (result.dispose as () => void).call(built) }
|
|
132
|
+
: {}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** What the export returned, for a refusal that can be acted on — `object`
|
|
137
|
+
* alone cannot tell a build result with a mistyped key from a wrong value. */
|
|
138
|
+
function describeReturn(built: unknown): string {
|
|
139
|
+
if (built === undefined) return 'undefined';
|
|
140
|
+
if (built === null) return 'null';
|
|
141
|
+
if (typeof built !== 'object') return typeof built;
|
|
142
|
+
if (Array.isArray(built)) return 'an array';
|
|
143
|
+
const keys = Object.keys(built);
|
|
144
|
+
return keys.length > 0
|
|
145
|
+
? `an object with keys ${keys.slice(0, 8).join(', ')}`
|
|
146
|
+
: 'an object with no own keys';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const ACCEPTED_SHAPES =
|
|
150
|
+
'a model module returns a THREE.Object3D, or a build result ' +
|
|
151
|
+
'`{ root, animations?, dispose? }` whose `root` is one.';
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Resolve a picked export to an `Object3D`. A FUNCTION is called (its result
|
|
155
|
+
* may be a promise — the bake lane awaits it too); a VALUE is taken as-is, so
|
|
156
|
+
* `export default new THREE.Group()` is as legitimate a model module as
|
|
157
|
+
* `export default () => …`.
|
|
158
|
+
*/
|
|
159
|
+
export async function resolveLiveModuleExport(
|
|
160
|
+
name: string,
|
|
161
|
+
value: unknown,
|
|
162
|
+
): Promise<LiveModuleBuild | LiveModuleRefusal> {
|
|
163
|
+
const direct = asLiveModuleBuild(value);
|
|
164
|
+
if (direct) return { ...direct, exportName: name };
|
|
165
|
+
if (typeof value !== 'function') {
|
|
166
|
+
return {
|
|
167
|
+
kind: 'not-a-model',
|
|
168
|
+
message:
|
|
169
|
+
`Export '${name}' is ${describeReturn(value)}, not a function and not a model — ` +
|
|
170
|
+
ACCEPTED_SHAPES,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
let built: unknown;
|
|
174
|
+
try {
|
|
175
|
+
built = await (value as () => unknown)();
|
|
176
|
+
} catch (error) {
|
|
177
|
+
return {
|
|
178
|
+
kind: 'import-failed',
|
|
179
|
+
message: `Export '${name}' threw while building: ${messageOf(error)}`,
|
|
180
|
+
...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const build = asLiveModuleBuild(built);
|
|
184
|
+
if (!build) {
|
|
185
|
+
return {
|
|
186
|
+
kind: 'not-a-model',
|
|
187
|
+
message: `Export '${name}' ran but returned ${describeReturn(built)} — ${ACCEPTED_SHAPES}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return { ...build, exportName: name };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function messageOf(error: unknown): string {
|
|
194
|
+
return error instanceof Error ? error.message : String(error);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Import `modulePath` from the dev server and build its `Object3D`.
|
|
199
|
+
*
|
|
200
|
+
* `revision` is the document's rebuild counter — see
|
|
201
|
+
* {@link liveModuleImportUrl} for why the url carries it and why that is only
|
|
202
|
+
* half the freshness story.
|
|
203
|
+
*
|
|
204
|
+
* Throws {@link LiveModuleError}; the `refusal.kind` is what the caller routes
|
|
205
|
+
* on (`not-a-model` falls back to the source viewer, `import-failed` keeps the
|
|
206
|
+
* last good root and shows the failure).
|
|
207
|
+
*/
|
|
208
|
+
export async function buildLiveModuleObject3D(
|
|
209
|
+
projectRoot: string,
|
|
210
|
+
modulePath: string,
|
|
211
|
+
revision: number,
|
|
212
|
+
): Promise<LiveModuleBuild> {
|
|
213
|
+
let namespace: Record<string, unknown>;
|
|
214
|
+
try {
|
|
215
|
+
namespace = (await import(
|
|
216
|
+
/* @vite-ignore */ liveModuleImportUrl(projectRoot, modulePath, revision)
|
|
217
|
+
)) as Record<string, unknown>;
|
|
218
|
+
} catch (error) {
|
|
219
|
+
throw new LiveModuleError({
|
|
220
|
+
kind: 'import-failed',
|
|
221
|
+
message: messageOf(error),
|
|
222
|
+
...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const picked = pickLiveModuleExport(namespace);
|
|
226
|
+
if ('kind' in picked) throw new LiveModuleError(picked);
|
|
227
|
+
const resolved = await resolveLiveModuleExport(picked.name, picked.value);
|
|
228
|
+
if ('kind' in resolved) throw new LiveModuleError(resolved);
|
|
229
|
+
return resolved;
|
|
230
|
+
}
|