@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,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B8.4 — the Asset Lab COMPARE surface (`vgai screenshot <model.glb>
|
|
3
|
+
* --compare <ref.glb>`): renders the project asset AND a caller-supplied reference GLB
|
|
4
|
+
* with matched orthographic front + side framing, then scores their
|
|
5
|
+
* silhouettes (IoU) and composes review overlays, so an agent can
|
|
6
|
+
* numerically converge a procedural character toward a reference.
|
|
7
|
+
*
|
|
8
|
+
* Framing is DELIBERATELY bounding-box based (equal-height normalization,
|
|
9
|
+
* shared ground plane, centered footprint) rather than the humanoid shot
|
|
10
|
+
* set's Mixamo-skeleton anchors: the reference may carry any rig (UE joint
|
|
11
|
+
* names, no rig at all), and the bone-anchored path throws on missing joints
|
|
12
|
+
* by design. Both models are yaw-normalized to FACE the front camera —
|
|
13
|
+
* forward read from GLB `extras`/`userData.forward` when present (our
|
|
14
|
+
* generated rigs persist `[0,0,-1]`), else the glTF +Z convention, with an
|
|
15
|
+
* explicit reference override for models whose extras lie.
|
|
16
|
+
*
|
|
17
|
+
* Pure scoring math lives in `asset-compare-core.ts` (unit-tested in node);
|
|
18
|
+
* this module owns only loading, scene assembly, and WebGL capture. Fixed
|
|
19
|
+
* cameras + fixed resolution + flat unlit override ⇒ identical IoU numbers
|
|
20
|
+
* across runs (a stated acceptance gate).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { markHostRenderer } from '@volter/editor-threejs/viewport/renderer-ownership';
|
|
24
|
+
import * as THREE from 'three';
|
|
25
|
+
import {
|
|
26
|
+
ASSET_COMPARE_VIEWS,
|
|
27
|
+
type AssetCompareView,
|
|
28
|
+
COMPARE_FRAME_CENTER_Y,
|
|
29
|
+
COMPARE_FRAME_HALF_HEIGHT,
|
|
30
|
+
forwardYawRadians,
|
|
31
|
+
maskIoU,
|
|
32
|
+
normalizedPlacement,
|
|
33
|
+
overlayRgba,
|
|
34
|
+
silhouetteMaskFromRgba,
|
|
35
|
+
} from './asset-compare-core';
|
|
36
|
+
import {
|
|
37
|
+
checkedDimension,
|
|
38
|
+
createAssetPreviewSnapshot,
|
|
39
|
+
disposeAssetPreviewSnapshot,
|
|
40
|
+
disposeProjectAssetModel,
|
|
41
|
+
loadProjectAssetModel,
|
|
42
|
+
measureAssetPreview,
|
|
43
|
+
parseGlbBytesModel,
|
|
44
|
+
pngBase64,
|
|
45
|
+
readModelForward,
|
|
46
|
+
} from './asset-preview';
|
|
47
|
+
|
|
48
|
+
export type { AssetCompareView } from './asset-compare-core';
|
|
49
|
+
// The forward detection moved to `asset-preview.ts` (the shot sets need it
|
|
50
|
+
// too); re-exported here so compare-mode consumers keep their import path.
|
|
51
|
+
export { readModelForward } from './asset-preview';
|
|
52
|
+
|
|
53
|
+
export interface AssetCompareImage {
|
|
54
|
+
base64: string;
|
|
55
|
+
mimeType: 'image/png';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface AssetCompareViewResult {
|
|
59
|
+
view: AssetCompareView;
|
|
60
|
+
/** Silhouette intersection-over-union in [0, 1]. */
|
|
61
|
+
iou: number;
|
|
62
|
+
/** Both silhouettes in distinct colors (orange asset / cyan ref / white agreement). */
|
|
63
|
+
overlay: AssetCompareImage;
|
|
64
|
+
/** The asset's own silhouette (white on black), as captured for scoring. */
|
|
65
|
+
asset: AssetCompareImage;
|
|
66
|
+
/** The reference's silhouette (white on black), as captured for scoring. */
|
|
67
|
+
ref: AssetCompareImage;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface AssetCompareCapture {
|
|
71
|
+
width: number;
|
|
72
|
+
height: number;
|
|
73
|
+
views: AssetCompareViewResult[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface AssetCompareOptions {
|
|
77
|
+
width?: number;
|
|
78
|
+
height?: number;
|
|
79
|
+
/** Override the reference GLB's forward vector (its facing in the ground
|
|
80
|
+
* plane). Defaults to the GLB's own `userData.forward` extras, else +Z. */
|
|
81
|
+
refForward?: [number, number, number];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const SILHOUETTE_BACKGROUND = 0x000000;
|
|
85
|
+
const SILHOUETTE_FOREGROUND = 0xffffff;
|
|
86
|
+
const COMPARE_CAMERA_DISTANCE = 10;
|
|
87
|
+
|
|
88
|
+
/** The base64-GLB decoder moved to `asset-preview.ts` (`parseGlbBytesModel`)
|
|
89
|
+
* when the module-look lane needed the same wire-carried bytes; this keeps
|
|
90
|
+
* compare's own error wording. */
|
|
91
|
+
function parseRefGlb(base64: string): Promise<THREE.Object3D> {
|
|
92
|
+
return parseGlbBytesModel(base64, 'Compare reference GLB');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Snapshot + face-the-camera yaw + equal-height ground-aligned placement,
|
|
96
|
+
* as one disposable wrapper ready to drop into a silhouette scene. */
|
|
97
|
+
function buildNormalizedSubject(
|
|
98
|
+
source: THREE.Object3D,
|
|
99
|
+
forward: [number, number, number],
|
|
100
|
+
): { wrapper: THREE.Object3D; dispose: () => void } {
|
|
101
|
+
const snapshot = createAssetPreviewSnapshot(source);
|
|
102
|
+
const pivot = new THREE.Group();
|
|
103
|
+
pivot.rotation.y = forwardYawRadians(forward);
|
|
104
|
+
pivot.add(snapshot);
|
|
105
|
+
const wrapper = new THREE.Group();
|
|
106
|
+
wrapper.add(pivot);
|
|
107
|
+
wrapper.updateWorldMatrix(true, true);
|
|
108
|
+
const bounds = measureAssetPreview(wrapper, 'front');
|
|
109
|
+
const min: [number, number, number] = [
|
|
110
|
+
bounds.center.x - bounds.size.x / 2,
|
|
111
|
+
bounds.center.y - bounds.size.y / 2,
|
|
112
|
+
bounds.center.z - bounds.size.z / 2,
|
|
113
|
+
];
|
|
114
|
+
const max: [number, number, number] = [
|
|
115
|
+
bounds.center.x + bounds.size.x / 2,
|
|
116
|
+
bounds.center.y + bounds.size.y / 2,
|
|
117
|
+
bounds.center.z + bounds.size.z / 2,
|
|
118
|
+
];
|
|
119
|
+
const placement = normalizedPlacement(min, max);
|
|
120
|
+
wrapper.scale.setScalar(placement.scale);
|
|
121
|
+
wrapper.position.set(...placement.position);
|
|
122
|
+
wrapper.updateWorldMatrix(true, true);
|
|
123
|
+
return { wrapper, dispose: () => disposeAssetPreviewSnapshot(snapshot) };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function compareCamera(view: AssetCompareView, aspect: number): THREE.OrthographicCamera {
|
|
127
|
+
const halfHeight = COMPARE_FRAME_HALF_HEIGHT;
|
|
128
|
+
const halfWidth = halfHeight * aspect;
|
|
129
|
+
const camera = new THREE.OrthographicCamera(
|
|
130
|
+
-halfWidth,
|
|
131
|
+
halfWidth,
|
|
132
|
+
halfHeight,
|
|
133
|
+
-halfHeight,
|
|
134
|
+
0.01,
|
|
135
|
+
COMPARE_CAMERA_DISTANCE * 4,
|
|
136
|
+
);
|
|
137
|
+
const direction = view === 'front' ? new THREE.Vector3(0, 0, 1) : new THREE.Vector3(1, 0, 0);
|
|
138
|
+
camera.position
|
|
139
|
+
.set(0, COMPARE_FRAME_CENTER_Y, 0)
|
|
140
|
+
.addScaledVector(direction, COMPARE_CAMERA_DISTANCE);
|
|
141
|
+
camera.up.set(0, 1, 0);
|
|
142
|
+
camera.lookAt(0, COMPARE_FRAME_CENTER_Y, 0);
|
|
143
|
+
camera.updateProjectionMatrix();
|
|
144
|
+
camera.updateMatrixWorld(true);
|
|
145
|
+
return camera;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface SilhouetteShot {
|
|
149
|
+
image: AssetCompareImage;
|
|
150
|
+
mask: Uint8Array;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Compare an already-loaded asset model against an already-loaded reference:
|
|
155
|
+
* the shared capture core behind both the asset-path and entity entry
|
|
156
|
+
* points. Neither input is mutated (both are snapshotted).
|
|
157
|
+
*/
|
|
158
|
+
export function captureAssetComparePreview(
|
|
159
|
+
assetSource: THREE.Object3D,
|
|
160
|
+
refSource: THREE.Object3D,
|
|
161
|
+
options: AssetCompareOptions = {},
|
|
162
|
+
): AssetCompareCapture {
|
|
163
|
+
const width = checkedDimension(options.width);
|
|
164
|
+
const height = checkedDimension(options.height);
|
|
165
|
+
const aspect = width / height;
|
|
166
|
+
const disposers: Array<() => void> = [];
|
|
167
|
+
let renderer: THREE.WebGLRenderer | null = null;
|
|
168
|
+
try {
|
|
169
|
+
const asset = buildNormalizedSubject(assetSource, readModelForward(assetSource));
|
|
170
|
+
disposers.push(asset.dispose);
|
|
171
|
+
const ref = buildNormalizedSubject(
|
|
172
|
+
refSource,
|
|
173
|
+
options.refForward ?? readModelForward(refSource),
|
|
174
|
+
);
|
|
175
|
+
disposers.push(ref.dispose);
|
|
176
|
+
|
|
177
|
+
const override = new THREE.MeshBasicMaterial({ color: SILHOUETTE_FOREGROUND });
|
|
178
|
+
disposers.push(() => override.dispose());
|
|
179
|
+
const sceneFor = (subject: THREE.Object3D): THREE.Scene => {
|
|
180
|
+
const scene = new THREE.Scene();
|
|
181
|
+
scene.background = new THREE.Color(SILHOUETTE_BACKGROUND);
|
|
182
|
+
scene.overrideMaterial = override;
|
|
183
|
+
scene.add(subject);
|
|
184
|
+
return scene;
|
|
185
|
+
};
|
|
186
|
+
const assetScene = sceneFor(asset.wrapper);
|
|
187
|
+
const refScene = sceneFor(ref.wrapper);
|
|
188
|
+
|
|
189
|
+
// Antialiasing off: silhouette masks want a crisp, deterministic
|
|
190
|
+
// coverage decision per pixel, not blended edge ramps.
|
|
191
|
+
const activeRenderer = markHostRenderer(
|
|
192
|
+
new THREE.WebGLRenderer({
|
|
193
|
+
antialias: false,
|
|
194
|
+
alpha: false,
|
|
195
|
+
preserveDrawingBuffer: true,
|
|
196
|
+
}),
|
|
197
|
+
);
|
|
198
|
+
renderer = activeRenderer;
|
|
199
|
+
activeRenderer.setPixelRatio(1);
|
|
200
|
+
activeRenderer.toneMapping = THREE.NoToneMapping;
|
|
201
|
+
activeRenderer.setClearColor(SILHOUETTE_BACKGROUND, 1);
|
|
202
|
+
activeRenderer.setSize(width, height, false);
|
|
203
|
+
|
|
204
|
+
const readCanvas = document.createElement('canvas');
|
|
205
|
+
readCanvas.width = width;
|
|
206
|
+
readCanvas.height = height;
|
|
207
|
+
const readContext = readCanvas.getContext('2d');
|
|
208
|
+
if (!readContext) throw new Error('Unable to create the compare readback canvas.');
|
|
209
|
+
|
|
210
|
+
const captureSilhouette = (
|
|
211
|
+
scene: THREE.Scene,
|
|
212
|
+
camera: THREE.Camera,
|
|
213
|
+
label: string,
|
|
214
|
+
view: AssetCompareView,
|
|
215
|
+
): SilhouetteShot => {
|
|
216
|
+
activeRenderer.render(scene, camera);
|
|
217
|
+
readContext.clearRect(0, 0, width, height);
|
|
218
|
+
readContext.drawImage(activeRenderer.domElement, 0, 0);
|
|
219
|
+
const rgba = readContext.getImageData(0, 0, width, height).data;
|
|
220
|
+
const mask = silhouetteMaskFromRgba(rgba, width * height);
|
|
221
|
+
if (!mask.some((value) => value !== 0)) {
|
|
222
|
+
throw new Error(
|
|
223
|
+
`Compare ${view} view rendered an empty ${label} silhouette — nothing to score.`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
image: { base64: pngBase64(readCanvas), mimeType: 'image/png' },
|
|
228
|
+
mask,
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const overlayCanvas = document.createElement('canvas');
|
|
233
|
+
overlayCanvas.width = width;
|
|
234
|
+
overlayCanvas.height = height;
|
|
235
|
+
const overlayContext = overlayCanvas.getContext('2d');
|
|
236
|
+
if (!overlayContext) throw new Error('Unable to create the compare overlay canvas.');
|
|
237
|
+
|
|
238
|
+
const views: AssetCompareViewResult[] = [];
|
|
239
|
+
for (const view of ASSET_COMPARE_VIEWS) {
|
|
240
|
+
const camera = compareCamera(view, aspect);
|
|
241
|
+
const assetShot = captureSilhouette(assetScene, camera, 'asset', view);
|
|
242
|
+
const refShot = captureSilhouette(refScene, camera, 'reference', view);
|
|
243
|
+
const stats = maskIoU(assetShot.mask, refShot.mask);
|
|
244
|
+
overlayContext.putImageData(
|
|
245
|
+
new ImageData(overlayRgba(assetShot.mask, refShot.mask), width, height),
|
|
246
|
+
0,
|
|
247
|
+
0,
|
|
248
|
+
);
|
|
249
|
+
views.push({
|
|
250
|
+
view,
|
|
251
|
+
iou: stats.iou,
|
|
252
|
+
overlay: { base64: pngBase64(overlayCanvas), mimeType: 'image/png' },
|
|
253
|
+
asset: assetShot.image,
|
|
254
|
+
ref: refShot.image,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return { width, height, views };
|
|
258
|
+
} finally {
|
|
259
|
+
renderer?.dispose();
|
|
260
|
+
renderer?.forceContextLoss();
|
|
261
|
+
for (const dispose of disposers.reverse()) dispose();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** The `--asset <path> --compare` entry point: loads the project GLB the
|
|
266
|
+
* same bounded/validated way the other asset-path captures do, parses the
|
|
267
|
+
* relayed reference GLB bytes, and scores them. */
|
|
268
|
+
export async function captureModelComparePreview(
|
|
269
|
+
assetPath: string,
|
|
270
|
+
refGlbBase64: string,
|
|
271
|
+
options: AssetCompareOptions = {},
|
|
272
|
+
): Promise<AssetCompareCapture> {
|
|
273
|
+
const model = await loadProjectAssetModel(assetPath);
|
|
274
|
+
try {
|
|
275
|
+
return await captureEntityComparePreview(model, refGlbBase64, options);
|
|
276
|
+
} finally {
|
|
277
|
+
disposeProjectAssetModel(model);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** The `--entity <id> --compare` entry point (also the shared tail of the
|
|
282
|
+
* asset-path leg): parses the reference and runs the capture core. */
|
|
283
|
+
export async function captureEntityComparePreview(
|
|
284
|
+
entity: THREE.Object3D,
|
|
285
|
+
refGlbBase64: string,
|
|
286
|
+
options: AssetCompareOptions = {},
|
|
287
|
+
): Promise<AssetCompareCapture> {
|
|
288
|
+
const refModel = await parseRefGlb(refGlbBase64);
|
|
289
|
+
try {
|
|
290
|
+
return captureAssetComparePreview(entity, refModel, options);
|
|
291
|
+
} finally {
|
|
292
|
+
disposeProjectAssetModel(refModel);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context contributed by the active typed Asset Editor to the existing editor
|
|
3
|
+
* shell. Asset documents own content; the workspace owns placement. Keeping
|
|
4
|
+
* this as a tiny external store lets the status bar and the workspace's
|
|
5
|
+
* inspection surface resolution know WHICH document is active without an
|
|
6
|
+
* Asset Editor recreating those panes inside the center.
|
|
7
|
+
*
|
|
8
|
+
* It carries FACTS ONLY — id, title, type, status. Never markup: an open
|
|
9
|
+
* asset document is a SUBJECT PRODUCER, and what it produces goes through the
|
|
10
|
+
* one composer into the one inspector box like everything else. A React node
|
|
11
|
+
* put on this store would be a second, invisible way for a document to render
|
|
12
|
+
* somewhere else, and there is exactly one.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useSyncExternalStore } from 'react';
|
|
16
|
+
import { createHmrRegistrationGroup } from './hmr-registration-group';
|
|
17
|
+
import { registerWorkspaceStatus } from './workspace-status-registry';
|
|
18
|
+
|
|
19
|
+
export interface AssetEditorContextValue {
|
|
20
|
+
readonly documentId: string;
|
|
21
|
+
readonly title: string;
|
|
22
|
+
readonly type: string;
|
|
23
|
+
readonly status?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface ActiveAssetEditorContext extends AssetEditorContextValue {
|
|
27
|
+
readonly token: symbol;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let active: ActiveAssetEditorContext | null = null;
|
|
31
|
+
let version = 0;
|
|
32
|
+
const listeners = new Set<() => void>();
|
|
33
|
+
|
|
34
|
+
function notifyChanged(): void {
|
|
35
|
+
version++;
|
|
36
|
+
for (const listener of listeners) listener();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function subscribeAssetEditorContext(listener: () => void): () => void {
|
|
40
|
+
listeners.add(listener);
|
|
41
|
+
return () => listeners.delete(listener);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function assetEditorContextVersion(): number {
|
|
45
|
+
return version;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function getActiveAssetEditorContext(): AssetEditorContextValue | null {
|
|
49
|
+
return active;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Activate one document contribution. The returned disposer only clears the
|
|
53
|
+
* exact activation it created, so an older tab unmount cannot erase a newer
|
|
54
|
+
* active tab's context. */
|
|
55
|
+
export function activateAssetEditorContext(value: AssetEditorContextValue): () => void {
|
|
56
|
+
const token = Symbol(value.documentId);
|
|
57
|
+
active = { ...value, token };
|
|
58
|
+
notifyChanged();
|
|
59
|
+
return () => {
|
|
60
|
+
if (active?.token !== token) return;
|
|
61
|
+
active = null;
|
|
62
|
+
notifyChanged();
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function AssetEditorStatus() {
|
|
67
|
+
useSyncExternalStore(subscribeAssetEditorContext, assetEditorContextVersion);
|
|
68
|
+
const context = getActiveAssetEditorContext();
|
|
69
|
+
return context?.status ? (
|
|
70
|
+
<span className="vgai-status-copy" data-testid="status-asset-editor" data-status-tone="muted">
|
|
71
|
+
{context.status}
|
|
72
|
+
</span>
|
|
73
|
+
) : null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const registrationGroup = createHmrRegistrationGroup(
|
|
77
|
+
import.meta.hot,
|
|
78
|
+
'asset-editor-shell-contributions',
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
export function ensureAssetEditorShellContributionsRegistered(): void {
|
|
82
|
+
registrationGroup.ensure((track) => {
|
|
83
|
+
track(
|
|
84
|
+
registerWorkspaceStatus({
|
|
85
|
+
id: 'asset-editor-status',
|
|
86
|
+
name: 'Asset editor',
|
|
87
|
+
align: 'left',
|
|
88
|
+
order: 40,
|
|
89
|
+
Content: AssetEditorStatus,
|
|
90
|
+
}),
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
ensureAssetEditorShellContributionsRegistered();
|
|
96
|
+
|
|
97
|
+
export function __resetAssetEditorContextForTest(): void {
|
|
98
|
+
active = null;
|
|
99
|
+
notifyChanged();
|
|
100
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { connectEvents } from './editor-api';
|
|
2
|
+
import { announceAssetReload, evictLoaderCaches } from './project-asset-refresh';
|
|
3
|
+
|
|
4
|
+
export interface AssetMovedEvent {
|
|
5
|
+
oldPath: string;
|
|
6
|
+
newPath: string;
|
|
7
|
+
updatedFiles: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface AssetsChangedEvent {
|
|
11
|
+
readonly paths?: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Connect to the editor server's SSE endpoint for asset events.
|
|
16
|
+
* Returns a cleanup function to disconnect.
|
|
17
|
+
*/
|
|
18
|
+
export function connectAssetEvents(
|
|
19
|
+
onAssetMoved: (event: AssetMovedEvent) => void,
|
|
20
|
+
onAssetsChanged: (event: AssetsChangedEvent) => void = () => {},
|
|
21
|
+
): () => void {
|
|
22
|
+
// Browser mode (Phase A2): no Node dev server / SSE. A rename can't be
|
|
23
|
+
// reconstructed from self-derived watch events — a move surfaces as an
|
|
24
|
+
// unlinked `remove` + `create` with no old→new pairing — so asset-move sync
|
|
25
|
+
// stays a server-only signal (revisit with A4's external-change detection).
|
|
26
|
+
const source = connectEvents();
|
|
27
|
+
|
|
28
|
+
source.addEventListener('asset-moved', (e: MessageEvent) => {
|
|
29
|
+
try {
|
|
30
|
+
const data = JSON.parse(e.data) as AssetMovedEvent;
|
|
31
|
+
onAssetMoved(data);
|
|
32
|
+
} catch {
|
|
33
|
+
/* ignore malformed events */
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
source.addEventListener('assets-changed', async (event: MessageEvent) => {
|
|
37
|
+
let detail: AssetsChangedEvent;
|
|
38
|
+
try {
|
|
39
|
+
detail = JSON.parse(event.data) as AssetsChangedEvent;
|
|
40
|
+
} catch {
|
|
41
|
+
detail = {};
|
|
42
|
+
}
|
|
43
|
+
const paths =
|
|
44
|
+
detail.paths?.map((path) => `/${path.replace(/^\/?public\//, '').replace(/^\//, '')}`) ?? [];
|
|
45
|
+
await evictLoaderCaches(paths);
|
|
46
|
+
announceAssetReload(paths);
|
|
47
|
+
onAssetsChanged(detail);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return () => source.close();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function connectToolFileEvents(onChanged: () => void): () => void {
|
|
54
|
+
const source = connectEvents();
|
|
55
|
+
source.addEventListener('tool-files-changed', () => onChanged());
|
|
56
|
+
return () => source.close();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Root declarations affect project configuration and adapter capabilities. */
|
|
60
|
+
export function connectProjectDeclarationEvents(onChanged: () => void): () => void {
|
|
61
|
+
const source = connectEvents();
|
|
62
|
+
source.addEventListener('project-declarations-changed', onChanged);
|
|
63
|
+
return () => source.close();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Connect to the editor server's SSE endpoint for project STORY file
|
|
68
|
+
* add/unlink events (C3, spec §9). Mirrors `connectToolFileEvents` for
|
|
69
|
+
* `*.stories.tsx` / `*.stories.ts` anywhere under `src/` — the React hierarchy's
|
|
70
|
+
* `refreshProjectStories()` is a cheap full rescan, same discipline as
|
|
71
|
+
* `refreshProjectTools`.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* The editor server's `source-files-changed`: any `src/` file that is neither
|
|
75
|
+
* a tool nor a story — the files contributed FINDERS read (a models project's
|
|
76
|
+
* `src/models/*.ts`). Carries the project-relative path; the browser lane
|
|
77
|
+
* cannot name one and reports `''`.
|
|
78
|
+
*/
|
|
79
|
+
export function connectSourceFileEvents(onChanged: (path: string) => void): () => void {
|
|
80
|
+
const source = connectEvents();
|
|
81
|
+
source.addEventListener('source-files-changed', (event) => {
|
|
82
|
+
let path = '';
|
|
83
|
+
try {
|
|
84
|
+
path = String((JSON.parse((event as MessageEvent).data) as { path?: string }).path ?? '');
|
|
85
|
+
} catch {
|
|
86
|
+
/* a payload without a path still means "something changed" */
|
|
87
|
+
}
|
|
88
|
+
onChanged(path);
|
|
89
|
+
});
|
|
90
|
+
return () => source.close();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function connectStoryFileEvents(onChanged: () => void): () => void {
|
|
94
|
+
const source = connectEvents();
|
|
95
|
+
source.addEventListener('story-files-changed', () => onChanged());
|
|
96
|
+
return () => source.close();
|
|
97
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The verbs an `asset.inspector` contribution offers for the asset it is
|
|
3
|
+
* currently showing — published BY the section, because the section is what
|
|
4
|
+
* knows.
|
|
5
|
+
*
|
|
6
|
+
* WHY NOT A STATIC EXPORT. The first shape of this was `export const
|
|
7
|
+
* actions(asset)`, resolved synchronously beside `match(asset)`. It could
|
|
8
|
+
* only filter on the path, while the section itself decides structurally —
|
|
9
|
+
* the Edit Mesh door imports the module and calls `build()` — so the panel
|
|
10
|
+
* and `inspect().quickActions` disagreed: measured 2026-09-03, every `src/**`
|
|
11
|
+
* script offered "Edit mesh" through the control API while the human saw the
|
|
12
|
+
* button on mesh modules alone. A verb the human cannot see is exactly what
|
|
13
|
+
* `editor.inspect()` promises never to report, so the declaration moved to
|
|
14
|
+
* where the answer is.
|
|
15
|
+
*
|
|
16
|
+
* The section calls `props.setActions(...)` when it knows (and `[]` when it
|
|
17
|
+
* knows the answer is no); this store keys the list by contribution and
|
|
18
|
+
* asset, so a stale answer for a previous selection can never be served, and
|
|
19
|
+
* bumps a version `inspection/use-active-inspection.ts` subscribes to, the
|
|
20
|
+
* same way the section registry does.
|
|
21
|
+
*/
|
|
22
|
+
import type { ToolAssetInspectorAction } from '@volter/editor-sdk/contributions';
|
|
23
|
+
|
|
24
|
+
interface Published {
|
|
25
|
+
readonly assetPath: string;
|
|
26
|
+
readonly actions: readonly ToolAssetInspectorAction[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const published = new Map<string, Published>();
|
|
30
|
+
let version = 0;
|
|
31
|
+
const listeners = new Set<() => void>();
|
|
32
|
+
|
|
33
|
+
function changed(): void {
|
|
34
|
+
version += 1;
|
|
35
|
+
for (const listener of listeners) listener();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Publish (or clear) one contribution's verbs for the asset it is showing. */
|
|
39
|
+
export function setAssetInspectorActions(
|
|
40
|
+
contributionId: string,
|
|
41
|
+
assetPath: string,
|
|
42
|
+
actions: readonly ToolAssetInspectorAction[],
|
|
43
|
+
): void {
|
|
44
|
+
const current = published.get(contributionId);
|
|
45
|
+
if (
|
|
46
|
+
current &&
|
|
47
|
+
current.assetPath === assetPath &&
|
|
48
|
+
current.actions.length === actions.length &&
|
|
49
|
+
current.actions.every((action, i) => action === actions[i])
|
|
50
|
+
) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
published.set(contributionId, { assetPath, actions });
|
|
54
|
+
changed();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Forget a contribution's verbs (its section unmounted). */
|
|
58
|
+
export function clearAssetInspectorActions(contributionId: string): void {
|
|
59
|
+
if (!published.delete(contributionId)) return;
|
|
60
|
+
changed();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Every verb published FOR this asset, in contribution registration order.
|
|
64
|
+
* A list published for a different asset is ignored rather than served. */
|
|
65
|
+
export function assetInspectorActionsFor(assetPath: string): readonly ToolAssetInspectorAction[] {
|
|
66
|
+
const out: ToolAssetInspectorAction[] = [];
|
|
67
|
+
for (const entry of published.values()) {
|
|
68
|
+
if (entry.assetPath !== assetPath) continue;
|
|
69
|
+
out.push(...entry.actions);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function subscribeAssetInspectorActions(listener: () => void): () => void {
|
|
75
|
+
listeners.add(listener);
|
|
76
|
+
return () => listeners.delete(listener);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function assetInspectorActionsVersion(): number {
|
|
80
|
+
return version;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Test seam, mirroring the other module-scope stores. */
|
|
84
|
+
export function __resetAssetInspectorActionsForTest(): void {
|
|
85
|
+
published.clear();
|
|
86
|
+
version = 0;
|
|
87
|
+
}
|