@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,256 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { projectFiles } from '../files/project-files';
|
|
3
|
+
import type { StorageBackend } from '../storage';
|
|
4
|
+
import type { AssetCatalog } from './asset-types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The deterministic render profile a generated thumbnail is stamped with.
|
|
8
|
+
*
|
|
9
|
+
* Every key here is a recipe step something in this repo actually PERFORMS. A
|
|
10
|
+
* profile that describes work nobody does is a declaration with no reader — the
|
|
11
|
+
* inverse of the manifest-schema rule, and the way a heuristic acquires
|
|
12
|
+
* provenance it never earned.
|
|
13
|
+
*
|
|
14
|
+
* The representative STATE of a component is its STORY: the editor captures
|
|
15
|
+
* `StoryComponentThumbnail`'s registered story, which the author wrote and can
|
|
16
|
+
* change. That is a declaration, and it is why no name-matching pose heuristic
|
|
17
|
+
* lives here (ARCHITECTURE-CORE §The editor protocol, "Zero inference").
|
|
18
|
+
*/
|
|
19
|
+
export const THUMBNAIL_PROFILE = {
|
|
20
|
+
version: 'vgai-thumbnail-v2',
|
|
21
|
+
width: 256,
|
|
22
|
+
height: 256,
|
|
23
|
+
background: 'neutral',
|
|
24
|
+
framing: 'bounds-isometric-1.3',
|
|
25
|
+
lighting: 'studio-key-fill-v1',
|
|
26
|
+
colorManagement: 'srgb-aces-filmic',
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
export const thumbnailManifestSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
version: z.literal(1),
|
|
32
|
+
/**
|
|
33
|
+
* Which profile last REGENERATED this manifest — a record, not a gate.
|
|
34
|
+
*
|
|
35
|
+
* It was `z.literal(THUMBNAIL_PROFILE.version)`, which made a profile bump
|
|
36
|
+
* (v2 → v3) fail every manifest already on disk. The read collapsed that
|
|
37
|
+
* into `null`, the toolbar read `null` as "no manifest yet", and the next
|
|
38
|
+
* framing save wrote `entries: {}` — so bumping this constant silently
|
|
39
|
+
* DESTROYED every hand-authored camera framing in the project.
|
|
40
|
+
*
|
|
41
|
+
* A bump must migrate or preserve, and preserving is the honest answer here:
|
|
42
|
+
* each entry already carries its own `profileVersion`, which is precisely
|
|
43
|
+
* what tells a consumer that entry was rendered by an older profile and
|
|
44
|
+
* wants regenerating. Nothing is gained by throwing the framing away too.
|
|
45
|
+
* `version` below stays a literal on purpose — that is the DOCUMENT format,
|
|
46
|
+
* and an unrecognized one is refused rather than overwritten.
|
|
47
|
+
*/
|
|
48
|
+
profile: z.string().min(1),
|
|
49
|
+
generatedAt: z.string(),
|
|
50
|
+
entries: z.record(
|
|
51
|
+
z.string(),
|
|
52
|
+
z
|
|
53
|
+
.object({
|
|
54
|
+
state: z.enum(['generated', 'upstream', 'fallback', 'unsupported', 'failed']),
|
|
55
|
+
path: z.string().optional(),
|
|
56
|
+
profileVersion: z.string(),
|
|
57
|
+
sourceHash: z.string().optional(),
|
|
58
|
+
resultHash: z.string().optional(),
|
|
59
|
+
issueCode: z.string().optional(),
|
|
60
|
+
framing: z
|
|
61
|
+
.object({
|
|
62
|
+
position: z.tuple([z.number(), z.number(), z.number()]),
|
|
63
|
+
target: z.tuple([z.number(), z.number(), z.number()]),
|
|
64
|
+
fov: z.number().positive().lt(180).optional(),
|
|
65
|
+
})
|
|
66
|
+
.strict()
|
|
67
|
+
.optional(),
|
|
68
|
+
})
|
|
69
|
+
.strict(),
|
|
70
|
+
),
|
|
71
|
+
})
|
|
72
|
+
.strict();
|
|
73
|
+
export type ThumbnailManifest = z.infer<typeof thumbnailManifestSchema>;
|
|
74
|
+
|
|
75
|
+
export const THUMBNAIL_MANIFEST_PATH = '.vgai/thumbnails.json';
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The three OUTCOMES of reading `.vgai/thumbnails.json`, which used to be one
|
|
79
|
+
* `null`.
|
|
80
|
+
*
|
|
81
|
+
* `absent` and `unreadable` are opposite instructions and collapsing them lost
|
|
82
|
+
* a project's work: a rebuild-and-write is correct when the file is not there
|
|
83
|
+
* and DESTRUCTIVE when it is there and merely could not be parsed. Every
|
|
84
|
+
* consumer that only READS may treat both as "no thumbnails"; the one consumer
|
|
85
|
+
* that WRITES must refuse on `unreadable`.
|
|
86
|
+
*/
|
|
87
|
+
export type ThumbnailManifestRead =
|
|
88
|
+
| { readonly status: 'absent' }
|
|
89
|
+
| { readonly status: 'ok'; readonly manifest: ThumbnailManifest }
|
|
90
|
+
| { readonly status: 'unreadable'; readonly reason: string };
|
|
91
|
+
|
|
92
|
+
let manifestPromise: Promise<ThumbnailManifestRead> | null = null;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Optional project thumbnail metadata must never block live fallback previews,
|
|
96
|
+
* and must never be silently discarded either.
|
|
97
|
+
*
|
|
98
|
+
* `absent` covers the two ways the file genuinely is not there: `read` rejects
|
|
99
|
+
* (the documented `StorageBackend.read` contract for a missing path), and an
|
|
100
|
+
* HTTP-backed project answering with the Vite HTML shell instead of a 404.
|
|
101
|
+
* Everything else — a truncated or hand-broken JSON document, a shape this
|
|
102
|
+
* schema does not recognize — is `unreadable`, and the caller decides.
|
|
103
|
+
*/
|
|
104
|
+
export async function readProjectThumbnailManifest(
|
|
105
|
+
backend: Pick<StorageBackend, 'read'>,
|
|
106
|
+
): Promise<ThumbnailManifestRead> {
|
|
107
|
+
let text: string;
|
|
108
|
+
try {
|
|
109
|
+
text = await backend.read(THUMBNAIL_MANIFEST_PATH);
|
|
110
|
+
} catch {
|
|
111
|
+
return { status: 'absent' };
|
|
112
|
+
}
|
|
113
|
+
const trimmed = text.trim();
|
|
114
|
+
if (trimmed === '' || trimmed.startsWith('<')) return { status: 'absent' };
|
|
115
|
+
let json: unknown;
|
|
116
|
+
try {
|
|
117
|
+
json = JSON.parse(trimmed);
|
|
118
|
+
} catch (cause) {
|
|
119
|
+
return {
|
|
120
|
+
status: 'unreadable',
|
|
121
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const parsed = thumbnailManifestSchema.safeParse(json);
|
|
125
|
+
return parsed.success
|
|
126
|
+
? { status: 'ok', manifest: parsed.data }
|
|
127
|
+
: { status: 'unreadable', reason: parsed.error.issues.map((i) => i.message).join('; ') };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function loadProjectThumbnailManifest(): Promise<ThumbnailManifestRead> {
|
|
131
|
+
if (!manifestPromise) {
|
|
132
|
+
manifestPromise = readProjectThumbnailManifest(projectFiles).then(async (read) => {
|
|
133
|
+
// Reported ONCE per cache lifetime (the promise is memoized), and
|
|
134
|
+
// through the editor console because a file the editor refuses to
|
|
135
|
+
// rewrite is remaining work, not log noise.
|
|
136
|
+
if (read.status === 'unreadable') {
|
|
137
|
+
const { editorConsole } = await import('../editor-console');
|
|
138
|
+
editorConsole.error(
|
|
139
|
+
`${THUMBNAIL_MANIFEST_PATH} is present but could not be read (${read.reason}). ` +
|
|
140
|
+
'Thumbnail framing will not be saved until it is fixed or deleted; previews ' +
|
|
141
|
+
'fall back to live renders.',
|
|
142
|
+
'asset-workflow',
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
return read;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return manifestPromise;
|
|
149
|
+
}
|
|
150
|
+
export function resetProjectThumbnailManifestCache(): void {
|
|
151
|
+
manifestPromise = null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface QueueJob<T> {
|
|
155
|
+
key: string;
|
|
156
|
+
priority: number;
|
|
157
|
+
consumers: number;
|
|
158
|
+
started: boolean;
|
|
159
|
+
resolve(value: T): void;
|
|
160
|
+
reject(error: unknown): void;
|
|
161
|
+
promise: Promise<T>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Bounded, priority-aware, deduplicating fallback queue shared by all visible cards. */
|
|
165
|
+
export class ThumbnailJobQueue<T> {
|
|
166
|
+
private active = 0;
|
|
167
|
+
private readonly jobs = new Map<string, QueueJob<T>>();
|
|
168
|
+
private pending: QueueJob<T>[] = [];
|
|
169
|
+
constructor(
|
|
170
|
+
private readonly execute: (key: string) => Promise<T>,
|
|
171
|
+
readonly concurrency = 2,
|
|
172
|
+
) {}
|
|
173
|
+
request(key: string, priority = 0): { promise: Promise<T>; cancel(): void } {
|
|
174
|
+
let job = this.jobs.get(key);
|
|
175
|
+
if (!job) {
|
|
176
|
+
let resolve!: (value: T) => void;
|
|
177
|
+
let reject!: (error: unknown) => void;
|
|
178
|
+
const promise = new Promise<T>((ok, fail) => {
|
|
179
|
+
resolve = ok;
|
|
180
|
+
reject = fail;
|
|
181
|
+
});
|
|
182
|
+
job = { key, priority, consumers: 0, started: false, resolve, reject, promise };
|
|
183
|
+
this.jobs.set(key, job);
|
|
184
|
+
this.pending.push(job);
|
|
185
|
+
}
|
|
186
|
+
job.consumers++;
|
|
187
|
+
job.priority = Math.max(job.priority, priority);
|
|
188
|
+
this.pending.sort((a, b) => b.priority - a.priority);
|
|
189
|
+
this.pump();
|
|
190
|
+
let cancelled = false;
|
|
191
|
+
return {
|
|
192
|
+
promise: job.promise,
|
|
193
|
+
cancel: () => {
|
|
194
|
+
if (cancelled) return;
|
|
195
|
+
cancelled = true;
|
|
196
|
+
job!.consumers--;
|
|
197
|
+
if (!job!.started && job!.consumers === 0) {
|
|
198
|
+
this.pending = this.pending.filter((item) => item !== job);
|
|
199
|
+
this.jobs.delete(job!.key);
|
|
200
|
+
job!.reject(new DOMException('Thumbnail request cancelled', 'AbortError'));
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
snapshot(): { active: number; pending: number; keys: number } {
|
|
206
|
+
return { active: this.active, pending: this.pending.length, keys: this.jobs.size };
|
|
207
|
+
}
|
|
208
|
+
private pump(): void {
|
|
209
|
+
while (this.active < this.concurrency) {
|
|
210
|
+
const job = this.pending.shift();
|
|
211
|
+
if (!job) return;
|
|
212
|
+
if (job.consumers === 0) continue;
|
|
213
|
+
job.started = true;
|
|
214
|
+
this.active++;
|
|
215
|
+
void this.execute(job.key)
|
|
216
|
+
.then(job.resolve, job.reject)
|
|
217
|
+
.finally(() => {
|
|
218
|
+
this.active--;
|
|
219
|
+
this.jobs.delete(job.key);
|
|
220
|
+
this.pump();
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export interface ThumbnailQualitySample {
|
|
227
|
+
alphaCoverage: number;
|
|
228
|
+
luminanceVariance: number;
|
|
229
|
+
edgeCoverage: number;
|
|
230
|
+
}
|
|
231
|
+
export function auditThumbnailQuality(sample: ThumbnailQualitySample): string[] {
|
|
232
|
+
const issues: string[] = [];
|
|
233
|
+
if (sample.alphaCoverage < 0.01) issues.push('thumbnail.blank-transparent');
|
|
234
|
+
if (sample.luminanceVariance < 0.0005 && sample.edgeCoverage < 0.01)
|
|
235
|
+
issues.push('thumbnail.near-uniform');
|
|
236
|
+
if (sample.edgeCoverage > 0.45) issues.push('thumbnail.possibly-clipped');
|
|
237
|
+
return issues;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function catalogThumbnailCoverage(catalog: AssetCatalog): {
|
|
241
|
+
total: number;
|
|
242
|
+
generated: number;
|
|
243
|
+
upstream: number;
|
|
244
|
+
fallback: number;
|
|
245
|
+
unsupported: number;
|
|
246
|
+
failed: number;
|
|
247
|
+
} {
|
|
248
|
+
const result = { total: 0, generated: 0, upstream: 0, fallback: 0, unsupported: 0, failed: 0 };
|
|
249
|
+
for (const family of catalog.families) {
|
|
250
|
+
for (const variant of family.variants) {
|
|
251
|
+
result.total++;
|
|
252
|
+
result[variant.thumbnail.state]++;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The editor's active {@link AuthoringAdapter} handle.
|
|
3
|
+
*
|
|
4
|
+
* The editor UI talks to the authoring contract through THIS accessor rather than
|
|
5
|
+
* reaching into `EditorShellStore` or any adapter's private model directly. The accessor names no
|
|
6
|
+
* concrete adapter: a SURFACE's live adapter is REGISTERED by the integration
|
|
7
|
+
* that owns that surface's document model ({@link setBaseAuthoringFactory}), an
|
|
8
|
+
* ingest/play/edit-mode session can override it globally, and the UI code below
|
|
9
|
+
* it does not change either way.
|
|
10
|
+
*
|
|
11
|
+
* The adapter is a stateless delegating wrapper over the store, so we memoize one
|
|
12
|
+
* per store (a store's identity is stable for the editor session).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
16
|
+
import { inspectAuthoringAdapterSeams } from '../coverage/authoring-seam-evidence';
|
|
17
|
+
import type { EditorShellStore } from '../editor-shell-store';
|
|
18
|
+
import { makeNoAuthoringAdapter } from './no-authoring-adapter';
|
|
19
|
+
|
|
20
|
+
const byStore = new WeakMap<EditorShellStore, AuthoringAdapter>();
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The LIVE authoring adapter a declared world of one surface gets: the
|
|
24
|
+
* projection over whatever that surface has actually mounted, as opposed to
|
|
25
|
+
* the manifest-only `BoundaryAuthoringAdapter` a surface with no registration
|
|
26
|
+
* falls back to.
|
|
27
|
+
*
|
|
28
|
+
* The key is the world's `surface` (`three`, `canvas`, `dom`, …) because that
|
|
29
|
+
* is what decides which projection can read it, and the factory is a
|
|
30
|
+
* PACKAGE's code rather than a store's state — it takes the store as an
|
|
31
|
+
* argument. (It was keyed per STORE until 2026-09-21 and had no caller at all:
|
|
32
|
+
* `getActiveAuthoring` read a map nothing ever wrote. Its one real caller is
|
|
33
|
+
* `edit-mode-authoring.ts`'s installer, which is what this shape is for.)
|
|
34
|
+
*/
|
|
35
|
+
export type BaseAuthoringFactory = (store: EditorShellStore, worldId: string) => AuthoringAdapter;
|
|
36
|
+
|
|
37
|
+
const baseFactoryBySurface = new Map<string, BaseAuthoringFactory>();
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Register the live authoring adapter for one SURFACE. Returns the unregister.
|
|
41
|
+
*
|
|
42
|
+
* A registration arriving LATE is ordinary: the contribution pass that loads
|
|
43
|
+
* an integration is deferred behind the first viewport frame, so the
|
|
44
|
+
* edit-mode composite is routinely installed before it. The registrant asks
|
|
45
|
+
* for a rebuild (`queueEditModeRebuild`) — the same door a source change uses
|
|
46
|
+
* — rather than this seam growing a notification of its own.
|
|
47
|
+
*/
|
|
48
|
+
export function setBaseAuthoringFactory(
|
|
49
|
+
surface: string,
|
|
50
|
+
factory: BaseAuthoringFactory,
|
|
51
|
+
): () => void {
|
|
52
|
+
baseFactoryBySurface.set(surface, factory);
|
|
53
|
+
return () => {
|
|
54
|
+
if (baseFactoryBySurface.get(surface) === factory) baseFactoryBySurface.delete(surface);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The registered live adapter factory for `surface`, or null. */
|
|
59
|
+
export function baseAuthoringFactory(surface: string): BaseAuthoringFactory | null {
|
|
60
|
+
return baseFactoryBySurface.get(surface) ?? null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A non-first-party adapter (today: the ingest adapter for an unmodified game)
|
|
65
|
+
* that, while set, becomes the active authoring adapter. The editor renders its
|
|
66
|
+
* adapter-driven (format-neutral) hierarchy/inspector panels instead of the
|
|
67
|
+
* base adapter's while an override is active.
|
|
68
|
+
*/
|
|
69
|
+
let _override: AuthoringAdapter | null = null;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Change notification for the override slot.
|
|
73
|
+
*
|
|
74
|
+
* The slot is module state the shared panels READ every render, so it must
|
|
75
|
+
* tell them when it changes. Relying on a side effect instead is the trap:
|
|
76
|
+
* every ingest entry path also calls `store.setActiveViewportTab(…)`, which
|
|
77
|
+
* in a project WITH a Three root activates a different center document and
|
|
78
|
+
* the workspace-document registry's own `notifyChanged()` re-renders the
|
|
79
|
+
* panels for free. In a project with NO Three root there is exactly one
|
|
80
|
+
* center document (`workspace:game`), that activation is a no-op, nothing
|
|
81
|
+
* notifies, and the Hierarchy/Inspector keep rendering the adapter they
|
|
82
|
+
* resolved BEFORE the ingest session installed its own — `getAuthoringOverride()`
|
|
83
|
+
* returns the right adapter with `{transform, inspectorFields, persist}` all
|
|
84
|
+
* true while the panels still show "No authoring adapter". A stale render,
|
|
85
|
+
* not a resolution error.
|
|
86
|
+
*
|
|
87
|
+
* So the slot notifies for itself and the panels subscribe. One mechanism,
|
|
88
|
+
* no per-session choreography.
|
|
89
|
+
*/
|
|
90
|
+
const _listeners = new Set<() => void>();
|
|
91
|
+
let _version = 0;
|
|
92
|
+
|
|
93
|
+
/** Subscribe to override changes (`useSyncExternalStore` shape). */
|
|
94
|
+
export function subscribeActiveAuthoring(listener: () => void): () => void {
|
|
95
|
+
_listeners.add(listener);
|
|
96
|
+
return () => {
|
|
97
|
+
_listeners.delete(listener);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Monotonic version of the override slot (`useSyncExternalStore` snapshot). */
|
|
102
|
+
export function activeAuthoringVersion(): number {
|
|
103
|
+
return _version;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Install/clear the active authoring override (ingest enters/exits). */
|
|
107
|
+
export function setActiveAuthoring(adapter: AuthoringAdapter | null): void {
|
|
108
|
+
if (_override === adapter) return;
|
|
109
|
+
if (adapter) {
|
|
110
|
+
const evidence = inspectAuthoringAdapterSeams({ adapter, subject: 'active-authoring' });
|
|
111
|
+
const failures = [evidence.hierarchy, ...Object.values(evidence.providers)].filter(
|
|
112
|
+
(verdict) => verdict.state === 'failed',
|
|
113
|
+
);
|
|
114
|
+
if (failures.length > 0) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`authoring adapter refused: ${failures.map((failure) => failure.detail).join('; ')}`,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_override = adapter;
|
|
121
|
+
_version++;
|
|
122
|
+
for (const listener of [..._listeners]) listener();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** True when a non-first-party adapter is driving authoring (e.g. ingest). */
|
|
126
|
+
export function hasAuthoringOverride(): boolean {
|
|
127
|
+
return _override !== null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Brand for the edit-mode composite (`edit-mode-authoring.ts`). Unlike an
|
|
132
|
+
* ingest/play override — a FOREIGN adapter whose document the store does not
|
|
133
|
+
* own — the edit-mode composite's FOCUSED child writes through the store's
|
|
134
|
+
* own save path, so
|
|
135
|
+
* the store's save guard (`_blockedForSave`) must NOT block it: an edit to the
|
|
136
|
+
* focused world must Ctrl+S/autosave to disk exactly like a single-scene
|
|
137
|
+
* project. The brand lives on the composite instance and disappears the moment
|
|
138
|
+
* `setActiveAuthoring(null)` clears the slot (the predicate checks the CURRENT
|
|
139
|
+
* `_override`'s identity), so no separate lifecycle state can go stale.
|
|
140
|
+
*/
|
|
141
|
+
const EDIT_MODE_BRAND = Symbol('vgai.editModeComposite');
|
|
142
|
+
|
|
143
|
+
/** Mark `adapter` as the edit-mode composite. */
|
|
144
|
+
export function markEditModeOverride(adapter: AuthoringAdapter): void {
|
|
145
|
+
(adapter as unknown as Record<symbol, unknown>)[EDIT_MODE_BRAND] = true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** True when the ACTIVE override is the edit-mode composite — the store's
|
|
149
|
+
* save guard allows the focused first-party child to persist through it. */
|
|
150
|
+
export function activeOverrideIsEditMode(): boolean {
|
|
151
|
+
return (
|
|
152
|
+
_override !== null &&
|
|
153
|
+
(_override as unknown as Record<symbol, unknown>)[EDIT_MODE_BRAND] === true
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Peek the raw override slot (or null) without a store handle — for a session
|
|
159
|
+
* that needs to install ITS OWN override while preserving whatever was active
|
|
160
|
+
* before it, so it can restore that exact value on exit instead of assuming
|
|
161
|
+
* null (e.g. play-mode's ephemeral-persistence wrapper).
|
|
162
|
+
*/
|
|
163
|
+
export function getAuthoringOverride(): AuthoringAdapter | null {
|
|
164
|
+
return _override;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Every node id in an adapter's hierarchy (for select-all over an ingested tree). */
|
|
168
|
+
export function collectAllNodeIds(adapter: AuthoringAdapter): string[] {
|
|
169
|
+
const ids: string[] = [];
|
|
170
|
+
const walk = (node: { id: string; childIds: string[] }): void => {
|
|
171
|
+
ids.push(node.id);
|
|
172
|
+
for (const cid of node.childIds) {
|
|
173
|
+
const c = adapter.hierarchy.node(cid);
|
|
174
|
+
if (c) walk(c);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
for (const r of adapter.hierarchy.roots()) walk(r);
|
|
178
|
+
return ids;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* The authoring adapter the editor UI should drive for `store`.
|
|
183
|
+
*
|
|
184
|
+
* The floor is HONEST and not a fallback factory: a store nothing has claimed
|
|
185
|
+
* has no document model, and inventing one for it is what the no-authoring
|
|
186
|
+
* adapter exists to refuse. Who DOES claim it is `setActiveAuthoring` (the
|
|
187
|
+
* edit-mode composite, an ingest session, play) — a live adapter for a
|
|
188
|
+
* declared world is asked for by SURFACE through {@link baseAuthoringFactory},
|
|
189
|
+
* which is a different question from "what does this store fall back to".
|
|
190
|
+
*/
|
|
191
|
+
export function getActiveAuthoring(store: EditorShellStore): AuthoringAdapter {
|
|
192
|
+
if (_override) return _override;
|
|
193
|
+
let a = byStore.get(store);
|
|
194
|
+
if (!a) {
|
|
195
|
+
a = makeNoAuthoringAdapter(store, 'No authoring adapter');
|
|
196
|
+
byStore.set(store, a);
|
|
197
|
+
}
|
|
198
|
+
return a;
|
|
199
|
+
}
|