@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,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE LIVE MODELING VIEW (docs/BLENDER-PARITY.md §Live modeling view, Gap 1):
|
|
3
|
+
* a project TypeScript module that builds an `Object3D`, opened as an Asset
|
|
4
|
+
* Lab document that RE-EXECUTES ON EVERY SAVE with the camera untouched —
|
|
5
|
+
* "watch it model".
|
|
6
|
+
*
|
|
7
|
+
* WHAT IS NEW HERE IS ONE THING: the re-execution. Everything else is the
|
|
8
|
+
* surface every other Object3D document already opens on
|
|
9
|
+
* (`StageHost.tsx`'s `Object3DDocumentViewport` — orbit, pick,
|
|
10
|
+
* framing, the document toolbar, the ordinary Object3D inspector subject), and
|
|
11
|
+
* the contract it resolves is the bake lane's, unchanged
|
|
12
|
+
* (`live-module-source.ts`).
|
|
13
|
+
*
|
|
14
|
+
* ## Why the camera survives a rebuild: ONE ROOT, SWAPPED CHILDREN
|
|
15
|
+
*
|
|
16
|
+
* `Object3DDocumentViewport` re-runs its whole lifetime effect — renderer,
|
|
17
|
+
* scene, camera, adapter — whenever the `build` callback's IDENTITY changes.
|
|
18
|
+
* That is how the parametric Builder documents rebuild
|
|
19
|
+
* (`catalog/project-source/src/tools/builder-document.tsx`: a param edit makes
|
|
20
|
+
* a new `build`, the viewport tears down and stands back up), and it is
|
|
21
|
+
* exactly why those documents snap the camera back to `cameraDirection` on
|
|
22
|
+
* every slider nudge. A modeling loop cannot do that: the whole point is to
|
|
23
|
+
* keep looking at the model from where you put yourself while it changes
|
|
24
|
+
* underneath you.
|
|
25
|
+
*
|
|
26
|
+
* So `build` here is STABLE FOR THE DOCUMENT'S LIFETIME. It returns a
|
|
27
|
+
* container `THREE.Group` this component owns, and a rebuild swaps that
|
|
28
|
+
* container's single CHILD. The viewport never learns a rebuild happened; the
|
|
29
|
+
* camera, the renderer and the GPU state are never touched. This is the
|
|
30
|
+
* "OWNED graph" shape `ToolObject3DAuthoringProps.build` documents (the same
|
|
31
|
+
* one the 3D board and the story turntable take, for the same reason: the
|
|
32
|
+
* graph is async to create), so the returned `dispose` is deliberately empty
|
|
33
|
+
* and THIS component's effect is the one teardown path.
|
|
34
|
+
*
|
|
35
|
+
* ## The probe decides which document this is
|
|
36
|
+
*
|
|
37
|
+
* Detection is structural, never a filename convention — the quarks precedent
|
|
38
|
+
* (`JsonAssetDocument.tsx`). The module is imported and its export resolved
|
|
39
|
+
* ONCE before anything mounts; only an `Object3D` gets the live viewport, and
|
|
40
|
+
* anything else falls through to the `fallback` the caller passed (the
|
|
41
|
+
* ordinary source viewer). Mounting the viewport first and retreating would
|
|
42
|
+
* flash a 3D panel at every `.ts` file in the project.
|
|
43
|
+
*
|
|
44
|
+
* ## A broken save is never a blank pane
|
|
45
|
+
*
|
|
46
|
+
* Once live, a failing rebuild KEEPS THE LAST GOOD MODEL on screen, dimmed,
|
|
47
|
+
* under a banner carrying the message and stack. The document does not
|
|
48
|
+
* unmount, the workspace does not crash, and the next good save clears the
|
|
49
|
+
* banner in place. A failure at FIRST open has no last-good root to keep, so
|
|
50
|
+
* it shows the source viewer with the same banner above it and recovers to the
|
|
51
|
+
* live view when the module compiles.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
import { beginLiveModuleRevision } from '@volter/editor-sdk/session/project-module-url';
|
|
55
|
+
import { themeVars } from '@volter/editor-sdk/widgets';
|
|
56
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
57
|
+
import * as THREE from 'three';
|
|
58
|
+
import { disposeProjectAssetModel } from '../../asset-preview';
|
|
59
|
+
import {
|
|
60
|
+
object3DDocumentSession,
|
|
61
|
+
registerObject3DDocumentPreparation,
|
|
62
|
+
} from '../../authoring/object3d-document-session-registry';
|
|
63
|
+
import { editorConsole } from '../../editor-console';
|
|
64
|
+
import {
|
|
65
|
+
buildLiveModuleObject3D,
|
|
66
|
+
LiveModuleError,
|
|
67
|
+
type LiveModuleRefusal,
|
|
68
|
+
} from '../../live-module-source';
|
|
69
|
+
import { probePasteboardModule } from '../../pasteboard-module';
|
|
70
|
+
import {
|
|
71
|
+
clearProjectModuleTransformError,
|
|
72
|
+
projectModuleChangeMatches,
|
|
73
|
+
projectModuleTransformError,
|
|
74
|
+
subscribeProjectModuleChange,
|
|
75
|
+
} from '../../project-module-changes';
|
|
76
|
+
import { notifyWorkspaceDocumentSelectionChanged } from '../../workspace-document-registry';
|
|
77
|
+
import { Object3DDocumentViewport } from '../Object3DDocumentViewport';
|
|
78
|
+
import { STANDARD_COMPONENT_CAMERA_DIRECTION } from '../standard-viewport-dressing';
|
|
79
|
+
import { PasteboardModuleDocument } from './PasteboardModuleDocument';
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The asset-document host (`components/asset-documents.tsx`) hands its content
|
|
83
|
+
* a plain BLOCK container of the panel's full height, not a flex parent — so
|
|
84
|
+
* `flex: 1` on this component's own root measures ZERO and the viewport
|
|
85
|
+
* canvas comes up 1241×0 (measured, 2026-08-29). Height 100% is what fills it;
|
|
86
|
+
* the flex column below it is this component's own layout.
|
|
87
|
+
*/
|
|
88
|
+
const FILL = {
|
|
89
|
+
height: '100%',
|
|
90
|
+
width: '100%',
|
|
91
|
+
minHeight: 0,
|
|
92
|
+
display: 'flex',
|
|
93
|
+
position: 'relative',
|
|
94
|
+
} as const;
|
|
95
|
+
|
|
96
|
+
/** The one growing child inside {@link FILL}. Both axes, because a flex ROW
|
|
97
|
+
* child with no grow measures 1×388 (also measured) — the mirror of the
|
|
98
|
+
* block-parent trap above. */
|
|
99
|
+
const FILL_CHILD = { flex: 1, minWidth: 0, minHeight: 0, display: 'flex' } as const;
|
|
100
|
+
|
|
101
|
+
/** A project module is a live-model document, a plain source file, or not
|
|
102
|
+
* decided yet. `fallback` covers the last two the same way — the caller's
|
|
103
|
+
* ordinary viewer — and `reason` is why. */
|
|
104
|
+
type ProbeState =
|
|
105
|
+
| { readonly status: 'probing' }
|
|
106
|
+
| { readonly status: 'live'; readonly exportName: string }
|
|
107
|
+
/** The default export is a pasteboard component — the design-canvas
|
|
108
|
+
* document, not a model and not plain source (`pasteboard-module.ts`). */
|
|
109
|
+
| { readonly status: 'pasteboard' }
|
|
110
|
+
| { readonly status: 'fallback'; readonly reason: string };
|
|
111
|
+
|
|
112
|
+
interface BuildFailure {
|
|
113
|
+
readonly message: string;
|
|
114
|
+
readonly stack?: string | undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* What the banner says. A transform failure PREFERS the server's own reason:
|
|
119
|
+
* the browser's `import()` rejection for a module the dev server refused to
|
|
120
|
+
* transform is the opaque `Failed to fetch dynamically imported module: <url>`
|
|
121
|
+
* (measured), while Vite reported `Unexpected ";"` at line:col with a source
|
|
122
|
+
* frame on the HMR channel — and the second one is the only one a person
|
|
123
|
+
* mid-edit can act on. The rejection then becomes the detail line, because it
|
|
124
|
+
* is still the truth about what this document tried to do.
|
|
125
|
+
*/
|
|
126
|
+
function describeRefusal(refusal: LiveModuleRefusal, modulePath: string): BuildFailure {
|
|
127
|
+
if (refusal.kind !== 'import-failed') return { message: refusal.message };
|
|
128
|
+
const transform = projectModuleTransformError(modulePath);
|
|
129
|
+
if (transform) return { message: transform, stack: refusal.message };
|
|
130
|
+
return { message: refusal.message, stack: refusal.stack };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function LiveModuleDocument({
|
|
134
|
+
documentId,
|
|
135
|
+
projectRoot,
|
|
136
|
+
modulePath,
|
|
137
|
+
displayName,
|
|
138
|
+
active,
|
|
139
|
+
fallback,
|
|
140
|
+
}: {
|
|
141
|
+
readonly documentId: string;
|
|
142
|
+
/** Absolute path of the open project — the `/@fs/` import url's root. */
|
|
143
|
+
readonly projectRoot: string;
|
|
144
|
+
/** Project-relative module path, e.g. `src/prefabs/probe.ts`. */
|
|
145
|
+
readonly modulePath: string;
|
|
146
|
+
readonly displayName: string;
|
|
147
|
+
readonly active: boolean;
|
|
148
|
+
/** Shown when this module is not a model module (and while one that WAS is
|
|
149
|
+
* failing to import at first open). */
|
|
150
|
+
readonly fallback: React.ReactNode;
|
|
151
|
+
}) {
|
|
152
|
+
const [probe, setProbe] = useState<ProbeState>({ status: 'probing' });
|
|
153
|
+
const [failure, setFailure] = useState<BuildFailure | null>(null);
|
|
154
|
+
|
|
155
|
+
/** The one graph the viewport ever sees. Created per document/module, never
|
|
156
|
+
* per rebuild — see this module's header. */
|
|
157
|
+
const container = useMemo(() => {
|
|
158
|
+
const group = new THREE.Group();
|
|
159
|
+
group.name = modulePath.split('/').pop() ?? modulePath;
|
|
160
|
+
return group;
|
|
161
|
+
}, [modulePath]);
|
|
162
|
+
|
|
163
|
+
const framedRef = useRef(false);
|
|
164
|
+
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
let disposed = false;
|
|
167
|
+
let revision = 0;
|
|
168
|
+
let mounted: THREE.Object3D | null = null;
|
|
169
|
+
let pending: Promise<void> = Promise.resolve();
|
|
170
|
+
let captureFailure: Error | null = null;
|
|
171
|
+
// The BUILDER's own teardown for what is mounted, when its export returned
|
|
172
|
+
// a build result carrying one. A rig's mixers, actions and cached
|
|
173
|
+
// materials are invisible to the generic graph walk, so the builder's
|
|
174
|
+
// disposer runs INSTEAD of it — never both, which is how a double-free
|
|
175
|
+
// starts.
|
|
176
|
+
let mountedDispose: (() => void) | null = null;
|
|
177
|
+
|
|
178
|
+
const unmount = (): void => {
|
|
179
|
+
if (!mounted) return;
|
|
180
|
+
container.remove(mounted);
|
|
181
|
+
container.animations = [];
|
|
182
|
+
if (mountedDispose) mountedDispose();
|
|
183
|
+
else disposeProjectAssetModel(mounted);
|
|
184
|
+
mounted = null;
|
|
185
|
+
mountedDispose = null;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const swapIn = (root: THREE.Object3D, dispose: (() => void) | null): void => {
|
|
189
|
+
unmount();
|
|
190
|
+
mounted = root;
|
|
191
|
+
mountedDispose = dispose;
|
|
192
|
+
container.add(root);
|
|
193
|
+
// THE CLIPS RIDE THE CONTAINER TOO. `live-module-source.ts` writes a
|
|
194
|
+
// build result's `animations` onto the built root "so the clip list
|
|
195
|
+
// travels with the graph the document mounts and every reader downstream
|
|
196
|
+
// (the Object3D document session, its animation transport) finds it where
|
|
197
|
+
// it finds a GLTF's" — but the graph this document MOUNTS is the stable
|
|
198
|
+
// container, and every one of those readers reads `root.animations` on
|
|
199
|
+
// the document root exactly (`ToolObject3DAuthoring`'s
|
|
200
|
+
// `source.root.animations.length > 0` gate builds the mixer and the
|
|
201
|
+
// transport; `model-inspection.ts`'s `root.animations.map` builds the
|
|
202
|
+
// Animation section). Measured on a rigged module with two looping clips:
|
|
203
|
+
// no transport, no Animation section, `editor.inspect()` listing only
|
|
204
|
+
// Preview/Geometry/Rig/Ragdoll/Materials/Source. Copying the reference
|
|
205
|
+
// here is what makes the container the same subject the child is.
|
|
206
|
+
container.animations = root.animations;
|
|
207
|
+
// The hierarchy/inspector project the live graph on every render, so the
|
|
208
|
+
// swap is visible the moment the panels re-render — but nothing else
|
|
209
|
+
// notifies for a graph the document mutated behind the viewport's back.
|
|
210
|
+
notifyWorkspaceDocumentSelectionChanged(documentId);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const fail = (refusal: LiveModuleRefusal, hasLastGood: boolean): void => {
|
|
214
|
+
// Not a model module, and never was: this is an ordinary source file.
|
|
215
|
+
// Silent by design — the project is full of them.
|
|
216
|
+
if (refusal.kind === 'not-a-model' && !hasLastGood) {
|
|
217
|
+
setProbe({ status: 'fallback', reason: refusal.message });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const described = describeRefusal(refusal, modulePath);
|
|
221
|
+
setFailure(described);
|
|
222
|
+
// A project module that does not build is a real defect the session must
|
|
223
|
+
// surface, not document-local noise. It retires on the next page load
|
|
224
|
+
// that does not reproduce it (`server/console-ledger.ts`).
|
|
225
|
+
editorConsole.error(`${modulePath}: ${described.message}`, 'live-module');
|
|
226
|
+
if (!hasLastGood) setProbe({ status: 'fallback', reason: refusal.message });
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
/** A save that lands mid-import supersedes this one; its own swap wins. */
|
|
230
|
+
const superseded = (attempt: number): boolean => disposed || attempt !== revision;
|
|
231
|
+
|
|
232
|
+
const buildOnce = async (): Promise<void> => {
|
|
233
|
+
revision += 1;
|
|
234
|
+
const attempt = revision;
|
|
235
|
+
const importRevision = beginLiveModuleRevision();
|
|
236
|
+
let built: Awaited<ReturnType<typeof buildLiveModuleObject3D>>;
|
|
237
|
+
try {
|
|
238
|
+
built = await buildLiveModuleObject3D(projectRoot, modulePath, importRevision);
|
|
239
|
+
} catch (error) {
|
|
240
|
+
if (superseded(attempt)) return;
|
|
241
|
+
if (!(error instanceof LiveModuleError)) throw error;
|
|
242
|
+
// Not a model: it may still be the OTHER structural document a project
|
|
243
|
+
// `.tsx` can be — a pasteboard (same revisioned import url, so this
|
|
244
|
+
// probe rides the fetch the model probe already paid for).
|
|
245
|
+
if (error.refusal.kind === 'not-a-model' && mounted === null) {
|
|
246
|
+
const pasteboard = await probePasteboardModule(projectRoot, modulePath, importRevision);
|
|
247
|
+
if (superseded(attempt)) return;
|
|
248
|
+
if (pasteboard) {
|
|
249
|
+
setFailure(null);
|
|
250
|
+
setProbe({ status: 'pasteboard' });
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
captureFailure = error;
|
|
255
|
+
fail(error.refusal, mounted !== null);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (superseded(attempt)) {
|
|
259
|
+
if (built.dispose) built.dispose();
|
|
260
|
+
else disposeProjectAssetModel(built.root);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
swapIn(built.root, built.dispose ?? null);
|
|
264
|
+
captureFailure = null;
|
|
265
|
+
clearProjectModuleTransformError(modulePath);
|
|
266
|
+
setFailure(null);
|
|
267
|
+
setProbe({ status: 'live', exportName: built.exportName });
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const rebuild = (): Promise<void> => {
|
|
271
|
+
pending = buildOnce();
|
|
272
|
+
return pending;
|
|
273
|
+
};
|
|
274
|
+
const unregisterPreparation = registerObject3DDocumentPreparation(documentId, async () => {
|
|
275
|
+
let current = rebuild();
|
|
276
|
+
for (;;) {
|
|
277
|
+
await current;
|
|
278
|
+
if (disposed) throw new Error(`Document closed while rebuilding: ${modulePath}`);
|
|
279
|
+
if (current === pending) break;
|
|
280
|
+
current = pending;
|
|
281
|
+
}
|
|
282
|
+
if (captureFailure) throw captureFailure;
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
void rebuild();
|
|
286
|
+
const unsubscribe = subscribeProjectModuleChange((changed) => {
|
|
287
|
+
if (projectModuleChangeMatches(changed, modulePath)) void rebuild();
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
return () => {
|
|
291
|
+
disposed = true;
|
|
292
|
+
unregisterPreparation();
|
|
293
|
+
unsubscribe();
|
|
294
|
+
unmount();
|
|
295
|
+
};
|
|
296
|
+
}, [container, documentId, modulePath, projectRoot]);
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* FRAME ONCE, on the first model this document ever shows — a rebuild must
|
|
300
|
+
* never move the camera, which is the one thing this document exists to
|
|
301
|
+
* avoid. The viewport registers its session in its own mount effect, a
|
|
302
|
+
* render AFTER the state flip that mounts it, so this waits for the session
|
|
303
|
+
* rather than assuming it: bounded, because "no session after a second" is a
|
|
304
|
+
* mount failure, not something to poll forever.
|
|
305
|
+
*/
|
|
306
|
+
useEffect(() => {
|
|
307
|
+
if (probe.status !== 'live' || framedRef.current) return;
|
|
308
|
+
let frame = 0;
|
|
309
|
+
let attempts = 0;
|
|
310
|
+
const tick = (): void => {
|
|
311
|
+
const session = object3DDocumentSession(documentId);
|
|
312
|
+
if (session) {
|
|
313
|
+
framedRef.current = true;
|
|
314
|
+
// An empty authored scene is valid. Keep its initial camera instead
|
|
315
|
+
// of invoking a frame operation that has no geometric subject.
|
|
316
|
+
if (!new THREE.Box3().setFromObject(container).isEmpty()) session.frame();
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (++attempts > 60) return;
|
|
320
|
+
frame = requestAnimationFrame(tick);
|
|
321
|
+
};
|
|
322
|
+
frame = requestAnimationFrame(tick);
|
|
323
|
+
return () => cancelAnimationFrame(frame);
|
|
324
|
+
}, [container, documentId, probe.status]);
|
|
325
|
+
|
|
326
|
+
const build = useCallback(
|
|
327
|
+
() => ({
|
|
328
|
+
root: container,
|
|
329
|
+
// Deliberately empty: the effect above owns this graph's whole lifetime.
|
|
330
|
+
// Two disposers for one graph is how a double-free starts.
|
|
331
|
+
dispose(): void {},
|
|
332
|
+
}),
|
|
333
|
+
[container],
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
if (probe.status === 'probing') {
|
|
337
|
+
return (
|
|
338
|
+
<div style={{ padding: 20, color: themeVars.content.muted }}>Inspecting {displayName}…</div>
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
if (probe.status === 'pasteboard') {
|
|
342
|
+
return (
|
|
343
|
+
<PasteboardModuleDocument documentId={documentId} active={active} modulePath={modulePath} />
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
if (probe.status === 'fallback') {
|
|
347
|
+
return (
|
|
348
|
+
<div style={FILL}>
|
|
349
|
+
{failure ? <BuildFailureBanner failure={failure} /> : null}
|
|
350
|
+
<div style={{ ...FILL_CHILD, overflow: 'auto' }}>{fallback}</div>
|
|
351
|
+
</div>
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
return (
|
|
355
|
+
<div style={FILL}>
|
|
356
|
+
<div
|
|
357
|
+
style={{
|
|
358
|
+
...FILL_CHILD,
|
|
359
|
+
// The last good model stays visible while a save is broken; dimming
|
|
360
|
+
// is what says "this is not what your file says right now".
|
|
361
|
+
opacity: failure ? 0.35 : 1,
|
|
362
|
+
}}
|
|
363
|
+
>
|
|
364
|
+
<Object3DDocumentViewport
|
|
365
|
+
documentId={documentId}
|
|
366
|
+
sourcePath={modulePath}
|
|
367
|
+
displayName={displayName}
|
|
368
|
+
build={build}
|
|
369
|
+
active={active}
|
|
370
|
+
assetType="model module"
|
|
371
|
+
cameraDirection={STANDARD_COMPONENT_CAMERA_DIRECTION}
|
|
372
|
+
modelSource={{ kind: 'project-file', path: modulePath }}
|
|
373
|
+
/>
|
|
374
|
+
</div>
|
|
375
|
+
{failure ? <BuildFailureBanner failure={failure} /> : null}
|
|
376
|
+
</div>
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** The in-document failure report: what broke, and where. Never a blank pane
|
|
381
|
+
* and never a toast — the document itself has to say why it is stale. */
|
|
382
|
+
function BuildFailureBanner({ failure }: { readonly failure: BuildFailure }) {
|
|
383
|
+
return (
|
|
384
|
+
<div
|
|
385
|
+
role="alert"
|
|
386
|
+
data-testid="live-module-error"
|
|
387
|
+
style={{
|
|
388
|
+
position: 'absolute',
|
|
389
|
+
top: 8,
|
|
390
|
+
left: 8,
|
|
391
|
+
right: 8,
|
|
392
|
+
zIndex: 2,
|
|
393
|
+
maxHeight: '60%',
|
|
394
|
+
overflow: 'auto',
|
|
395
|
+
padding: '8px 10px',
|
|
396
|
+
borderRadius: themeVars.shape.small,
|
|
397
|
+
background: themeVars.surface.raised,
|
|
398
|
+
border: `1px solid ${themeVars.semantic.danger}`,
|
|
399
|
+
color: themeVars.semantic.danger,
|
|
400
|
+
fontFamily: themeVars.typography.mono,
|
|
401
|
+
fontSize: 11,
|
|
402
|
+
lineHeight: 1.5,
|
|
403
|
+
whiteSpace: 'pre-wrap',
|
|
404
|
+
wordBreak: 'break-word',
|
|
405
|
+
pointerEvents: 'auto',
|
|
406
|
+
}}
|
|
407
|
+
>
|
|
408
|
+
<div style={{ fontWeight: 600 }}>
|
|
409
|
+
This module did not build — showing the last good model.
|
|
410
|
+
</div>
|
|
411
|
+
<div style={{ marginTop: 4 }}>{failure.message}</div>
|
|
412
|
+
{failure.stack ? (
|
|
413
|
+
<div style={{ marginTop: 6, color: themeVars.content.muted }}>{failure.stack}</div>
|
|
414
|
+
) : null}
|
|
415
|
+
</div>
|
|
416
|
+
);
|
|
417
|
+
}
|