@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,517 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story registry (C3, spec §9) — the story sibling of `tool-loader.ts`'s
|
|
3
|
+
* registry half: ties `story-discovery.ts` (find modules) and
|
|
4
|
+
* `compose-project-stories.ts` (portable-mount one loaded module) together
|
|
5
|
+
* into a live, `useSyncExternalStore`-shaped list consumed by React design-time
|
|
6
|
+
* world mounting and its document/story hierarchy.
|
|
7
|
+
*
|
|
8
|
+
* Same discipline as the tool registry: discovery is a live rescan (never a
|
|
9
|
+
* cached manifest, D3), re-run on project open/change and on the server's
|
|
10
|
+
* `story-files-changed` SSE broadcast (a new/removed `*.stories.tsx`).
|
|
11
|
+
* Per-module failures (a module that fails to import, or fails to compose)
|
|
12
|
+
* are collected alongside successes rather than dropped — the panel shows a
|
|
13
|
+
* broken module's error inline, naming the module (spec §9 "errors identify
|
|
14
|
+
* the source module"), instead of silently omitting it.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { sortStoriesV7 } from 'storybook/internal/preview-api';
|
|
18
|
+
import type { Addon_StorySortParameterV7, IndexEntry } from 'storybook/internal/types';
|
|
19
|
+
import { activeProjectKey } from '../active-project';
|
|
20
|
+
import {
|
|
21
|
+
recordStoryDiscoveryTiming,
|
|
22
|
+
waitForFirstViewportFrame,
|
|
23
|
+
} from '../viewport-activation-timings';
|
|
24
|
+
import {
|
|
25
|
+
type ComposedProjectStory,
|
|
26
|
+
composeProjectStories,
|
|
27
|
+
ensureProjectAnnotations,
|
|
28
|
+
} from './compose-project-stories';
|
|
29
|
+
import { getProjectStoryRegions } from './project-story-regions';
|
|
30
|
+
import { declaredStoryMedium } from './story-declared-medium';
|
|
31
|
+
import { deriveStoryGroupPath, formatStoryGroupPath } from './story-grouping';
|
|
32
|
+
|
|
33
|
+
/** One composed portable CSF story of the open project, carrying the source
|
|
34
|
+
* module it came from. A story belongs to the PROJECT, not to a root: the
|
|
35
|
+
* design-time board is the project's component gallery, and which root a
|
|
36
|
+
* story previews is DERIVED from the component its CSF meta renders
|
|
37
|
+
* ({@link pickComponentPreviewStory}). No story args/decorators/loaders are
|
|
38
|
+
* copied or reinterpreted. */
|
|
39
|
+
export interface ProjectPreviewStory extends ComposedProjectStory {
|
|
40
|
+
readonly modulePath: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
import { discoverProjectStories, loadProjectPreviewAnnotations } from './story-discovery';
|
|
44
|
+
|
|
45
|
+
/** One discovered module's outcome after load + compose. */
|
|
46
|
+
export type ProjectStoryModule =
|
|
47
|
+
| { modulePath: string; ok: true; stories: ComposedProjectStory[] }
|
|
48
|
+
| { modulePath: string; ok: false; error: string };
|
|
49
|
+
|
|
50
|
+
interface StoryDiscoveryProjectLike {
|
|
51
|
+
rootPath: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let _modules: ProjectStoryModule[] = [];
|
|
55
|
+
let _ready = false;
|
|
56
|
+
let _refreshGeneration = 0;
|
|
57
|
+
let _registryProjectKey: string | null = null;
|
|
58
|
+
const _requestedModules = new Map<string, Promise<void>>();
|
|
59
|
+
const _listeners = new Set<() => void>();
|
|
60
|
+
|
|
61
|
+
function adoptRegistryProject(): void {
|
|
62
|
+
const key = activeProjectKey();
|
|
63
|
+
if (_registryProjectKey === key) return;
|
|
64
|
+
_registryProjectKey = key;
|
|
65
|
+
_refreshGeneration++;
|
|
66
|
+
_requestedModules.clear();
|
|
67
|
+
publish([], false);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Current story modules (stable reference between refreshes). */
|
|
71
|
+
export function getProjectStoryModules(): ProjectStoryModule[] {
|
|
72
|
+
return _modules;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** True only after the current project's discovery pass has published. An
|
|
76
|
+
* empty ready registry is a real "no stories" answer; an empty unready one is
|
|
77
|
+
* boot in flight and must never be graded as a missing component surface. */
|
|
78
|
+
export function projectStoriesReady(): boolean {
|
|
79
|
+
return _ready;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Subscribe to story-registry changes. Returns an unsubscribe function. */
|
|
83
|
+
export function subscribeProjectStoryModules(fn: () => void): () => void {
|
|
84
|
+
_listeners.add(fn);
|
|
85
|
+
return () => _listeners.delete(fn);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resolve once the registry is READY — which is not the same as awaiting your
|
|
90
|
+
* own {@link refreshProjectStories}.
|
|
91
|
+
*
|
|
92
|
+
* A refresh that a LATER refresh supersedes returns EARLY, by design (a
|
|
93
|
+
* second concurrent pass aborts the first), and it returns with `_modules`
|
|
94
|
+
* still emptied by `_ready = false`. A caller that only awaited its own call
|
|
95
|
+
* therefore reads an empty registry and cannot tell it from "this project has
|
|
96
|
+
* no stories" — measured 2026-09-18 on a `full` scaffold, where the boot
|
|
97
|
+
* document restore raced the discovery lifecycle's own pass and dropped the
|
|
98
|
+
* open story document as a failed verification.
|
|
99
|
+
*
|
|
100
|
+
* Deliberately unbounded: every path that clears `_ready` is a refresh that
|
|
101
|
+
* publishes ready again when it finishes, succeeded or failed, and the
|
|
102
|
+
* workspace restore that calls this is itself time-boxed by the host
|
|
103
|
+
* (`workspace-state-persistence.ts`'s `RESTORE_TIMEOUT_MS` bounds when
|
|
104
|
+
* write-through installs, never the restore). A number here would be an
|
|
105
|
+
* invented tolerance over a condition that already resolves itself.
|
|
106
|
+
*/
|
|
107
|
+
export function whenProjectStoriesReady(): Promise<void> {
|
|
108
|
+
if (_ready) return Promise.resolve();
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
const stop = subscribeProjectStoryModules(() => {
|
|
111
|
+
if (!_ready) return;
|
|
112
|
+
stop();
|
|
113
|
+
resolve();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function vgaiParameters(story: ComposedProjectStory): Record<string, unknown> | null {
|
|
119
|
+
const value = story.parameters['vgai'];
|
|
120
|
+
return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Every composed story the project declares, in discovery/export order —
|
|
124
|
+
* the whole membership of the React design-time board and of the hierarchy's
|
|
125
|
+
* story documents. Deliberately unfiltered: the board is the project's
|
|
126
|
+
* component gallery, so a story earns its place by existing, and only the
|
|
127
|
+
* root's own default preview is derived from a component
|
|
128
|
+
* ({@link getComponentPreviewStory}). */
|
|
129
|
+
export function getProjectPreviewStories(): ProjectPreviewStory[] {
|
|
130
|
+
const out: ProjectPreviewStory[] = [];
|
|
131
|
+
for (const module_ of _modules) {
|
|
132
|
+
if (!module_.ok) continue;
|
|
133
|
+
for (const story of module_.stories) {
|
|
134
|
+
out.push({ ...story, modulePath: module_.modulePath });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const storySort = out
|
|
138
|
+
.map((story) => {
|
|
139
|
+
const options = story.parameters['options'];
|
|
140
|
+
return options && typeof options === 'object'
|
|
141
|
+
? (options as Record<string, unknown>)['storySort']
|
|
142
|
+
: undefined;
|
|
143
|
+
})
|
|
144
|
+
.find((value) => value !== undefined) as Addon_StorySortParameterV7 | undefined;
|
|
145
|
+
if (!storySort) return out;
|
|
146
|
+
|
|
147
|
+
const byId = new Map(out.map((story) => [story.id, story]));
|
|
148
|
+
const entries: IndexEntry[] = out.map((story) => ({
|
|
149
|
+
type: 'story',
|
|
150
|
+
id: story.id,
|
|
151
|
+
name: story.label,
|
|
152
|
+
title:
|
|
153
|
+
story.title ?? formatStoryGroupPath(deriveStoryGroupPath({ modulePath: story.modulePath })),
|
|
154
|
+
importPath: story.modulePath,
|
|
155
|
+
tags: [...(story.tags ?? [])],
|
|
156
|
+
}));
|
|
157
|
+
return sortStoriesV7(entries, storySort, [...new Set(out.map((story) => story.modulePath))])
|
|
158
|
+
.map((entry) => byId.get(entry.id))
|
|
159
|
+
.filter((story): story is ProjectPreviewStory => story !== undefined);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Whether a CSF module declares this story as its component's default:
|
|
163
|
+
* `parameters.vgai.default === true` on the story itself, or a
|
|
164
|
+
* `vgai.defaultStory` naming it (a meta-level parameter, which Storybook
|
|
165
|
+
* composes down onto every story in the module). */
|
|
166
|
+
export function isDeclaredDefaultStory(story: ComposedProjectStory): boolean {
|
|
167
|
+
const vgai = vgaiParameters(story);
|
|
168
|
+
if (!vgai) return false;
|
|
169
|
+
if (vgai['default'] === true) return true;
|
|
170
|
+
return typeof vgai['defaultStory'] === 'string' && vgai['defaultStory'] === story.name;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The directory portion of a project-relative source path, normalized. */
|
|
174
|
+
function sourceDir(path: string): string {
|
|
175
|
+
const normalized = path.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
176
|
+
const slash = normalized.lastIndexOf('/');
|
|
177
|
+
return slash >= 0 ? normalized.slice(0, slash) : '';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Choose the best composed story for one component, joined on
|
|
182
|
+
* `meta.component`'s name (the registry's own `componentName`) — pure over a
|
|
183
|
+
* module list so it is unit-testable without the live registry. This is THE
|
|
184
|
+
* story↔component join: a `three` prefab's own declaration and
|
|
185
|
+
* THUMBNAIL (mounted off-screen by `story-three-preview.ts`; no live instance
|
|
186
|
+
* or referenced asset substitutes for it) and a React root's composed default
|
|
187
|
+
* preview (`design-time-layers.ts`, joined against the root entry's
|
|
188
|
+
* default-exported component) both go through it.
|
|
189
|
+
*
|
|
190
|
+
* `componentPath` (the component's own source file) disambiguates the known
|
|
191
|
+
* weak spot of a name-only join: two files can export a same-named component,
|
|
192
|
+
* so a story is PREFERRED when its module sits in the same source directory as
|
|
193
|
+
* the component. Within the chosen set, a story the module declares as the
|
|
194
|
+
* default ({@link isDeclaredDefaultStory}) wins; otherwise discovery order.
|
|
195
|
+
*/
|
|
196
|
+
export function pickComponentPreviewStory(
|
|
197
|
+
modules: readonly ProjectStoryModule[],
|
|
198
|
+
componentName: string,
|
|
199
|
+
componentPath?: string,
|
|
200
|
+
): ProjectPreviewStory | null {
|
|
201
|
+
const pool = componentPreviewStories(modules, componentName, componentPath);
|
|
202
|
+
return pool.find(isDeclaredDefaultStory) ?? pool[0] ?? null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Every portable state declared for one component. The same source-directory
|
|
207
|
+
* preference as {@link pickComponentPreviewStory} disambiguates equal export
|
|
208
|
+
* names without hiding sibling stories from the component's Inspector.
|
|
209
|
+
*/
|
|
210
|
+
export function componentPreviewStories(
|
|
211
|
+
modules: readonly ProjectStoryModule[],
|
|
212
|
+
componentName: string,
|
|
213
|
+
componentPath?: string,
|
|
214
|
+
): ProjectPreviewStory[] {
|
|
215
|
+
const matches: ProjectPreviewStory[] = [];
|
|
216
|
+
for (const module_ of modules) {
|
|
217
|
+
if (!module_.ok) continue;
|
|
218
|
+
for (const story of module_.stories) {
|
|
219
|
+
if (story.componentName === componentName) {
|
|
220
|
+
matches.push({ ...story, modulePath: module_.modulePath });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (matches.length === 0) return [];
|
|
225
|
+
const sameDir = componentPath
|
|
226
|
+
? matches.filter((story) => sourceDir(story.modulePath) === sourceDir(componentPath))
|
|
227
|
+
: [];
|
|
228
|
+
return sameDir.length > 0 ? sameDir : matches;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** {@link pickComponentPreviewStory} over the LIVE registry — what the content
|
|
232
|
+
* gallery calls to find a prefab's thumbnail story, and what
|
|
233
|
+
* `design-time-layers.ts` calls to find a React root's composed default
|
|
234
|
+
* preview from the root entry's own component. */
|
|
235
|
+
export function getComponentPreviewStory(
|
|
236
|
+
componentName: string,
|
|
237
|
+
componentPath?: string,
|
|
238
|
+
): ProjectPreviewStory | null {
|
|
239
|
+
return pickComponentPreviewStory(_modules, componentName, componentPath);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Live-registry form of {@link componentPreviewStories}. */
|
|
243
|
+
export function getComponentPreviewStories(
|
|
244
|
+
componentName: string,
|
|
245
|
+
componentPath?: string,
|
|
246
|
+
): ProjectPreviewStory[] {
|
|
247
|
+
return componentPreviewStories(_modules, componentName, componentPath);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function publish(next: ProjectStoryModule[], ready: boolean): void {
|
|
251
|
+
_modules = next;
|
|
252
|
+
_ready = ready;
|
|
253
|
+
for (const fn of _listeners) fn();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
interface TimedStoryModule {
|
|
257
|
+
readonly result: ProjectStoryModule;
|
|
258
|
+
readonly loadMs: number;
|
|
259
|
+
readonly composeMs: number;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async function loadStoryModule({
|
|
263
|
+
modulePath,
|
|
264
|
+
load,
|
|
265
|
+
}: {
|
|
266
|
+
readonly modulePath: string;
|
|
267
|
+
readonly load: () => Promise<unknown>;
|
|
268
|
+
}): Promise<TimedStoryModule> {
|
|
269
|
+
const loadStartedAtMs = Date.now();
|
|
270
|
+
let mod: unknown;
|
|
271
|
+
try {
|
|
272
|
+
mod = await load();
|
|
273
|
+
} catch (err) {
|
|
274
|
+
return {
|
|
275
|
+
result: {
|
|
276
|
+
modulePath,
|
|
277
|
+
ok: false,
|
|
278
|
+
error: `[stories] failed to load ${modulePath} — ${String(err instanceof Error ? err.message : err)}`,
|
|
279
|
+
},
|
|
280
|
+
loadMs: Date.now() - loadStartedAtMs,
|
|
281
|
+
composeMs: 0,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
const loadMs = Date.now() - loadStartedAtMs;
|
|
285
|
+
const composeStartedAtMs = Date.now();
|
|
286
|
+
const result = await composeProjectStories(modulePath, mod);
|
|
287
|
+
return {
|
|
288
|
+
result: result.ok
|
|
289
|
+
? { modulePath, ok: true, stories: result.stories }
|
|
290
|
+
: { modulePath, ok: false, error: result.error },
|
|
291
|
+
loadMs,
|
|
292
|
+
composeMs: Date.now() - composeStartedAtMs,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Open one explicit story without evaluating every other project example.
|
|
297
|
+
* Full discovery still owns catalog completeness; this only publishes the
|
|
298
|
+
* requested module into that same registry, without marking it complete. */
|
|
299
|
+
export function ensureProjectStoryModule(
|
|
300
|
+
project: StoryDiscoveryProjectLike | null,
|
|
301
|
+
modulePath: string,
|
|
302
|
+
): Promise<void> {
|
|
303
|
+
adoptRegistryProject();
|
|
304
|
+
const projectKey = activeProjectKey();
|
|
305
|
+
const key = `${projectKey}\n${modulePath}`;
|
|
306
|
+
const existing = _requestedModules.get(key);
|
|
307
|
+
if (existing) return existing;
|
|
308
|
+
const pending = loadRequestedStoryModule(project, projectKey, modulePath).finally(() => {
|
|
309
|
+
if (_requestedModules.get(key) === pending) _requestedModules.delete(key);
|
|
310
|
+
});
|
|
311
|
+
_requestedModules.set(key, pending);
|
|
312
|
+
return pending;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
async function loadRequestedStoryModule(
|
|
316
|
+
project: StoryDiscoveryProjectLike | null,
|
|
317
|
+
projectKey: string,
|
|
318
|
+
modulePath: string,
|
|
319
|
+
): Promise<void> {
|
|
320
|
+
while (activeProjectKey() === projectKey) {
|
|
321
|
+
// A published composition is immediately usable. The document subscribes
|
|
322
|
+
// to subsequent source refreshes; opening never waits on unrelated modules.
|
|
323
|
+
const prior = _modules.find((module_) => module_.modulePath === modulePath);
|
|
324
|
+
if (prior?.ok) return;
|
|
325
|
+
const generation = _refreshGeneration;
|
|
326
|
+
const current = () => activeProjectKey() === projectKey && generation === _refreshGeneration;
|
|
327
|
+
const annotations = await loadProjectPreviewAnnotations(project);
|
|
328
|
+
if (!current()) continue;
|
|
329
|
+
await ensureProjectAnnotations(annotations);
|
|
330
|
+
if (!current()) continue;
|
|
331
|
+
const discovered = await discoverProjectStories(project);
|
|
332
|
+
if (!current()) continue;
|
|
333
|
+
const requested = discovered.find((module_) => module_.modulePath === modulePath);
|
|
334
|
+
if (!requested) throw new Error(`Story module not found: ${modulePath}`);
|
|
335
|
+
const { result } = await loadStoryModule(requested);
|
|
336
|
+
if (!current()) continue;
|
|
337
|
+
// Full discovery can publish this module while its demanded load runs.
|
|
338
|
+
// That publication owns the row; a slower request must not replace it.
|
|
339
|
+
const published = _modules.find((module_) => module_.modulePath === modulePath);
|
|
340
|
+
if (published && published !== prior) {
|
|
341
|
+
if (!published.ok) throw new Error(published.error);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
publish([..._modules.filter((module_) => module_.modulePath !== modulePath), result], _ready);
|
|
345
|
+
if (!result.ok) throw new Error(result.error);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
throw new Error(`Project changed while opening story: ${modulePath}`);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/** Let the first visible editor work finish before evaluating story modules
|
|
352
|
+
* whose medium cannot be known from the project's declared regions. Those
|
|
353
|
+
* modules commonly hold dense DOM kits; loading them eagerly made a 3D board
|
|
354
|
+
* wait on code it cannot display. Storybook uses the same broad architecture:
|
|
355
|
+
* index first, evaluate a story module only when its surface needs it. */
|
|
356
|
+
async function waitForStoryImportIdle(): Promise<void> {
|
|
357
|
+
// `requestIdleCallback` only means the browser main thread is momentarily
|
|
358
|
+
// idle; it fired while the first Scene was still driving ~1,000 Vite module
|
|
359
|
+
// requests and pulled the data-grid story graph into that same
|
|
360
|
+
// queue. Wait for an authored frame first. The timeout preserves recovery
|
|
361
|
+
// for a genuinely broken viewport without making background stories part
|
|
362
|
+
// of the ordinary startup path.
|
|
363
|
+
await Promise.race([
|
|
364
|
+
waitForFirstViewportFrame(),
|
|
365
|
+
new Promise<void>((resolve) => setTimeout(resolve, 5_000)),
|
|
366
|
+
]);
|
|
367
|
+
await new Promise<void>((resolve) => {
|
|
368
|
+
const idle = globalThis.requestIdleCallback;
|
|
369
|
+
if (typeof idle === 'function') {
|
|
370
|
+
idle(() => resolve(), { timeout: 2_000 });
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
setTimeout(resolve, 0);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Re-run the whole discovery + load + compose pass. Never throws: a broken
|
|
379
|
+
* module (import failure, or a `composeProjectStories` failure) becomes an
|
|
380
|
+
* `{ ok: false, error }` entry naming the module, and every other module
|
|
381
|
+
* still loads — the same "one bad file never takes the rest down" physics
|
|
382
|
+
* `refreshProjectTools` uses.
|
|
383
|
+
*
|
|
384
|
+
* Applies the project's `.storybook/preview.ts(x)` annotations (if the
|
|
385
|
+
* project has one — `loadProjectPreviewAnnotations`) via
|
|
386
|
+
* `ensureProjectAnnotations` before composing anything, exactly once per
|
|
387
|
+
* session. `explicitPreviewAnnotations` is a test/caller override — pass it
|
|
388
|
+
* to skip the `/@fs/` discovery and thread a fixture's annotations directly.
|
|
389
|
+
*/
|
|
390
|
+
export async function refreshProjectStories(
|
|
391
|
+
project: StoryDiscoveryProjectLike | null,
|
|
392
|
+
explicitPreviewAnnotations?: unknown,
|
|
393
|
+
options: {
|
|
394
|
+
readonly deferUndeclared?: boolean;
|
|
395
|
+
/**
|
|
396
|
+
* The source paths a CONTENT write changed, when that is what triggered
|
|
397
|
+
* this refresh. With it, a story module whose bundled closure holds none
|
|
398
|
+
* of them keeps its published result instead of being re-evaluated, and
|
|
399
|
+
* the modules that do reload go ONE AT A TIME with a frame between them:
|
|
400
|
+
* re-bundling all ten of a project's story modules at once, on the main
|
|
401
|
+
* thread, beside the world's own remount, is what held the editor at 7–12
|
|
402
|
+
* FPS for seconds after every prefab drop (three human passes; profiled
|
|
403
|
+
* 2026-09-03). Boot and explicit refreshes pass nothing and load in
|
|
404
|
+
* parallel, as before.
|
|
405
|
+
*/
|
|
406
|
+
readonly changedPaths?: ReadonlySet<string>;
|
|
407
|
+
} = {},
|
|
408
|
+
): Promise<void> {
|
|
409
|
+
adoptRegistryProject();
|
|
410
|
+
const generation = ++_refreshGeneration;
|
|
411
|
+
const projectKey = activeProjectKey();
|
|
412
|
+
const current = () => generation === _refreshGeneration && projectKey === activeProjectKey();
|
|
413
|
+
const loadAll = async (
|
|
414
|
+
list: readonly { readonly modulePath: string; readonly load: () => Promise<unknown> }[],
|
|
415
|
+
): Promise<TimedStoryModule[]> => {
|
|
416
|
+
if (!options.changedPaths) return Promise.all(list.map(loadStoryModule));
|
|
417
|
+
// A write-driven refresh loads one module per frame instead: the reload
|
|
418
|
+
// itself is a module-cache hit, but COMPOSING every story on one turn
|
|
419
|
+
// beside the world's own remount is what held the editor at 7-12 FPS
|
|
420
|
+
// after a prefab drop.
|
|
421
|
+
const out: TimedStoryModule[] = [];
|
|
422
|
+
for (const item of list) {
|
|
423
|
+
out.push(await loadStoryModule(item));
|
|
424
|
+
// Give the viewport a frame between modules.
|
|
425
|
+
await new Promise((resolve) => setTimeout(resolve, 16));
|
|
426
|
+
if (!current()) break;
|
|
427
|
+
}
|
|
428
|
+
return out;
|
|
429
|
+
};
|
|
430
|
+
_ready = false;
|
|
431
|
+
for (const fn of _listeners) fn();
|
|
432
|
+
const startedAtMs = Date.now();
|
|
433
|
+
const previewStartedAtMs = Date.now();
|
|
434
|
+
const previewAnnotations =
|
|
435
|
+
explicitPreviewAnnotations ?? (await loadProjectPreviewAnnotations(project));
|
|
436
|
+
if (!current()) return;
|
|
437
|
+
const previewAnnotationsMs = Date.now() - previewStartedAtMs;
|
|
438
|
+
const annotationsStartedAtMs = Date.now();
|
|
439
|
+
await ensureProjectAnnotations(previewAnnotations);
|
|
440
|
+
if (!current()) return;
|
|
441
|
+
const runtimeAnnotationsMs = Date.now() - annotationsStartedAtMs;
|
|
442
|
+
|
|
443
|
+
const scanStartedAtMs = Date.now();
|
|
444
|
+
const discovered = await discoverProjectStories(project);
|
|
445
|
+
if (!current()) return;
|
|
446
|
+
const fileScanMs = Date.now() - scanStartedAtMs;
|
|
447
|
+
// Module evaluation is independent; only STORY MOUNTING is serialized
|
|
448
|
+
// (`story-mount-turn.ts`) because loaders may mutate shared preview state.
|
|
449
|
+
// Loading every CSF module one after another made editor boot scale with the
|
|
450
|
+
// SUM of Vite transforms and network round trips (measured at 16s for the
|
|
451
|
+
// template and 23s for third-person). Preserve discovery order by mapping
|
|
452
|
+
// `Promise.all` over the ordered input rather than pushing as jobs finish.
|
|
453
|
+
const regions = getProjectStoryRegions();
|
|
454
|
+
const deferred = options.deferUndeclared
|
|
455
|
+
? discovered.filter(
|
|
456
|
+
({ modulePath }) => declaredStoryMedium({ modulePath, regions }).via === 'undeclared',
|
|
457
|
+
)
|
|
458
|
+
: [];
|
|
459
|
+
const deferredPaths = new Set(deferred.map(({ modulePath }) => modulePath));
|
|
460
|
+
const immediate = discovered.filter(({ modulePath }) => !deferredPaths.has(modulePath));
|
|
461
|
+
const modulesStartedAtMs = Date.now();
|
|
462
|
+
const immediateLoaded = await loadAll(immediate);
|
|
463
|
+
const moduleLoadAndComposeMs = Date.now() - modulesStartedAtMs;
|
|
464
|
+
const immediateResults = immediateLoaded.map(({ result }) => result);
|
|
465
|
+
if (!current()) return;
|
|
466
|
+
|
|
467
|
+
// Publish the declared surfaces as soon as they are usable. The registry is
|
|
468
|
+
// deliberately not "ready" until the background tail has also landed, so
|
|
469
|
+
// acceptance/coverage cannot mistake a partial index for the final answer.
|
|
470
|
+
const immediateByPath = new Map(
|
|
471
|
+
[
|
|
472
|
+
// A demanded story may already be open while the catalog evaluates its
|
|
473
|
+
// immediate set. Keep that row (and other last-good deferred rows) until
|
|
474
|
+
// their replacements arrive; a partial catalog must not remove them.
|
|
475
|
+
..._modules.filter(({ modulePath }) => deferredPaths.has(modulePath)),
|
|
476
|
+
...immediateResults,
|
|
477
|
+
].map((result) => [result.modulePath, result]),
|
|
478
|
+
);
|
|
479
|
+
publish(
|
|
480
|
+
discovered
|
|
481
|
+
.map(({ modulePath }) => immediateByPath.get(modulePath))
|
|
482
|
+
.filter((result): result is ProjectStoryModule => result !== undefined),
|
|
483
|
+
deferred.length === 0,
|
|
484
|
+
);
|
|
485
|
+
recordStoryDiscoveryTiming({
|
|
486
|
+
ms: Date.now() - startedAtMs,
|
|
487
|
+
completedAtMs: Date.now(),
|
|
488
|
+
moduleCount: immediateResults.length,
|
|
489
|
+
storyCount: immediateResults.reduce(
|
|
490
|
+
(count, module_) => count + (module_.ok ? module_.stories.length : 0),
|
|
491
|
+
0,
|
|
492
|
+
),
|
|
493
|
+
previewAnnotationsMs,
|
|
494
|
+
runtimeAnnotationsMs,
|
|
495
|
+
fileScanMs,
|
|
496
|
+
moduleLoadAndComposeMs,
|
|
497
|
+
modules: immediateLoaded.map(({ result, loadMs, composeMs }) => ({
|
|
498
|
+
modulePath: result.modulePath,
|
|
499
|
+
loadMs,
|
|
500
|
+
composeMs,
|
|
501
|
+
ok: result.ok,
|
|
502
|
+
})),
|
|
503
|
+
});
|
|
504
|
+
if (deferred.length === 0) return;
|
|
505
|
+
|
|
506
|
+
await waitForStoryImportIdle();
|
|
507
|
+
if (!current()) return;
|
|
508
|
+
const deferredResults = (await loadAll(deferred)).map(({ result }) => result);
|
|
509
|
+
if (!current()) return;
|
|
510
|
+
const resultByPath = new Map(
|
|
511
|
+
[...immediateResults, ...deferredResults].map((result) => [result.modulePath, result]),
|
|
512
|
+
);
|
|
513
|
+
const next = discovered
|
|
514
|
+
.map(({ modulePath }) => resultByPath.get(modulePath))
|
|
515
|
+
.filter((result): result is ProjectStoryModule => result !== undefined);
|
|
516
|
+
publish(next, true);
|
|
517
|
+
}
|