@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,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A story's MEDIUM is a declaration, never a mount.
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE-CORE §Zero inference: the system answers a question by reading
|
|
5
|
+
* a declaration, walking ground truth, or diagnosing declared-vs-measured
|
|
6
|
+
* drift loudly. Mounting a story to guess whether it is a DOM / three /
|
|
7
|
+
* canvas member is the third thing that section forbids.
|
|
8
|
+
*
|
|
9
|
+
* The ONE rung: **the story file's region** — `resolveFileRegion` over the
|
|
10
|
+
* project's adapter `include` / `mounts` and the manifest root entries. Prefab
|
|
11
|
+
* stories match the adapter's `src/prefabs` include glob because that glob is
|
|
12
|
+
* an adapter-selected finder, not because a sibling file exists.
|
|
13
|
+
*
|
|
14
|
+
* Anything it cannot place is {@link DeclaredStoryMedium.via}
|
|
15
|
+
* `'undeclared'` — a named gap, never a candidate on any board, never a
|
|
16
|
+
* mount. Presence names it; board membership skips it.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ProjectRegionEntry } from '../asset-workflow/project-source-index';
|
|
20
|
+
import {
|
|
21
|
+
type FileRegionAnswer,
|
|
22
|
+
type RegionBinding,
|
|
23
|
+
resolveFileRegion,
|
|
24
|
+
} from '../ui-source/file-region-resolver';
|
|
25
|
+
|
|
26
|
+
/** The three boards a declared story can belong to. */
|
|
27
|
+
export type StoryMedium = 'three' | 'canvas' | 'dom';
|
|
28
|
+
|
|
29
|
+
export type DeclaredStoryVia = 'declared-include' | 'root-entry' | 'undeclared';
|
|
30
|
+
|
|
31
|
+
export interface DeclaredStoryMedium {
|
|
32
|
+
readonly medium?: StoryMedium;
|
|
33
|
+
readonly via: DeclaredStoryVia;
|
|
34
|
+
/** Set only when {@link DeclaredStoryVia} is `'undeclared'`. */
|
|
35
|
+
readonly reason?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function normalizeRelative(path: string): string {
|
|
39
|
+
return path.replaceAll('\\', '/').replace(/^\.\//, '').replace(/^\//, '');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function regionOfEntryLookup(
|
|
43
|
+
regions: readonly ProjectRegionEntry[],
|
|
44
|
+
): (file: string) => RegionBinding | undefined {
|
|
45
|
+
const byEntry = new Map<string, ProjectRegionEntry>();
|
|
46
|
+
for (const region of regions) {
|
|
47
|
+
if (region.entry) byEntry.set(normalizeRelative(region.entry), region);
|
|
48
|
+
}
|
|
49
|
+
return (file) => byEntry.get(normalizeRelative(file));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function resolvePath(
|
|
53
|
+
projectRelative: string,
|
|
54
|
+
regions: readonly ProjectRegionEntry[],
|
|
55
|
+
): FileRegionAnswer {
|
|
56
|
+
const file = normalizeRelative(projectRelative);
|
|
57
|
+
return resolveFileRegion({
|
|
58
|
+
file,
|
|
59
|
+
projectRelative: file,
|
|
60
|
+
regions,
|
|
61
|
+
regionOfEntry: regionOfEntryLookup(regions),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function surfaceAsMedium(surface: FileRegionAnswer['surface']): StoryMedium | undefined {
|
|
66
|
+
return surface === 'three' || surface === 'canvas' || surface === 'dom' ? surface : undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function viaForAnswer(
|
|
70
|
+
answer: FileRegionAnswer,
|
|
71
|
+
): Exclude<DeclaredStoryVia, 'undeclared'> | undefined {
|
|
72
|
+
if (answer.via === 'declared-include') return 'declared-include';
|
|
73
|
+
if (answer.via === 'root-entry') return 'root-entry';
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Read the declared medium of one story. Pure: regions and the CSF identity
|
|
79
|
+
* are the only inputs. Does not import, compose, or mount anything.
|
|
80
|
+
*/
|
|
81
|
+
export function declaredStoryMedium(input: {
|
|
82
|
+
readonly modulePath?: string | undefined;
|
|
83
|
+
readonly regions?: readonly ProjectRegionEntry[] | undefined;
|
|
84
|
+
}): DeclaredStoryMedium {
|
|
85
|
+
const regions = input.regions ?? [];
|
|
86
|
+
const modulePath = input.modulePath ? normalizeRelative(input.modulePath) : '';
|
|
87
|
+
if (!modulePath) {
|
|
88
|
+
return { via: 'undeclared', reason: 'story has no module path' };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const own = resolvePath(modulePath, regions);
|
|
92
|
+
const ownMedium = surfaceAsMedium(own.surface);
|
|
93
|
+
const ownVia = viaForAnswer(own);
|
|
94
|
+
if (ownMedium && ownVia) return { medium: ownMedium, via: ownVia };
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
via: 'undeclared',
|
|
98
|
+
reason: `${modulePath} is not named by a region include/mount and is not a manifest root entry`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const reportedUndeclared = new Set<string>();
|
|
103
|
+
|
|
104
|
+
/** Name an undeclared story once. Nothing may mount it to guess a medium. */
|
|
105
|
+
export function reportUndeclaredStoryMedium(modulePath: string, reason?: string): void {
|
|
106
|
+
const key = normalizeRelative(modulePath);
|
|
107
|
+
if (reportedUndeclared.has(key)) return;
|
|
108
|
+
reportedUndeclared.add(key);
|
|
109
|
+
// biome-ignore lint/suspicious/noConsole: declared-vs-measured gap — the doctrine's third arm, same instrument as reportUnreadableRegions.
|
|
110
|
+
console.warn(
|
|
111
|
+
`[story-media] ${key} has no declared medium` +
|
|
112
|
+
(reason ? ` — ${reason}` : '') +
|
|
113
|
+
'. It is not a candidate on any board. Declare it via ' +
|
|
114
|
+
'`vgai.adapter.ts` regionIncludes or a manifest root entry.',
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Forget which gaps have already been named — project switch, or a test. */
|
|
119
|
+
export function resetUndeclaredStoryMediumReports(): void {
|
|
120
|
+
reportedUndeclared.clear();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Test-only alias. */
|
|
124
|
+
export function __resetUndeclaredStoryMediumReportsForTest(): void {
|
|
125
|
+
resetUndeclaredStoryMediumReports();
|
|
126
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story discovery — C3 (spec §9, "Add CSF Discovery and Portable Story
|
|
3
|
+
* Mounting"). The story sibling of `tool-loader.ts`: conventional
|
|
4
|
+
* `src/**\/*.stories.tsx` / `*.stories.ts` files of the open project are found
|
|
5
|
+
* via the editor server's folder scan (`GET /__editor/story-files`,
|
|
6
|
+
* `editor-server.ts`) — the SAME "discovery IS a live folder scan, never a
|
|
7
|
+
* cached manifest" physics `tool-loader.ts`/ `DataPanel.tsx` already use.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately paths-only, same reasoning as tool discovery: the CSF MODULE
|
|
10
|
+
* itself is loaded client-side through Vite's `/@fs/` dynamic-import path
|
|
11
|
+
* (`compose-project-stories.ts` calls `load()` below), so it arrives
|
|
12
|
+
* transpiled with HMR and the editor never stores a duplicate story
|
|
13
|
+
* definition anywhere — the CSF module on disk stays the single source of
|
|
14
|
+
* truth (spec §9 C3 "Story source remains the CSF module").
|
|
15
|
+
*
|
|
16
|
+
* A HOST THAT DOES NOT SERVE `/__editor/story-files` is recognised by the
|
|
17
|
+
* ANSWER's content type, never by `res.ok`: a host with an SPA fallback
|
|
18
|
+
* answers any unmatched path `200` with HTML, so `res.ok` is TRUE and the only
|
|
19
|
+
* failure is `res.json()` throwing into a `catch` that returned `undefined`.
|
|
20
|
+
* Discovery then resolved to `[]`,
|
|
21
|
+
* which the Stories panel renders as "this root has no portable CSF previews"
|
|
22
|
+
* — a claim about the PROJECT, produced by a build that never read it.
|
|
23
|
+
*
|
|
24
|
+
* The browser (server-less) tier discovers and loads stories from STORAGE:
|
|
25
|
+
* the scan is a `StorageBackend` walk for the same `*.stories.tsx?` shape the
|
|
26
|
+
* server route matches, regions come from the project's own manifest/adapter
|
|
27
|
+
* through the session's own route, and `load()` imports the CSF module the
|
|
28
|
+
* way every project module loads.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import type { ProjectRegionEntry } from '../asset-workflow/project-source-index';
|
|
32
|
+
import { editorServerJson } from '../editor-server-response';
|
|
33
|
+
import { setProjectStoryRegions } from './project-story-regions';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Why this session could not discover stories, or `null` when discovery
|
|
37
|
+
* genuinely ran (in which case an empty list IS "no stories").
|
|
38
|
+
*
|
|
39
|
+
* Set by every path that returns early, so no caller has to tell "the project
|
|
40
|
+
* has none" apart from "nobody looked" by inspecting an empty array.
|
|
41
|
+
*/
|
|
42
|
+
let _unavailable: string | null = null;
|
|
43
|
+
|
|
44
|
+
/** Why story discovery could not run this session, or `null` when it did.
|
|
45
|
+
* An empty module list with `null` here is a real "no stories" answer. */
|
|
46
|
+
export function storyDiscoveryUnavailable(): string | null {
|
|
47
|
+
return _unavailable;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** One discovered story module — path only; the module is loaded on demand. */
|
|
51
|
+
export interface DiscoveredStoryModule {
|
|
52
|
+
/** Project-relative path, e.g. `src/ui/Button.stories.tsx`. */
|
|
53
|
+
modulePath: string;
|
|
54
|
+
/** Dynamically imports the CSF module via Vite's `/@fs/` path, cache-busted
|
|
55
|
+
* so a re-discover (or an explicit re-load) always gets fresh code — same
|
|
56
|
+
* contract as `tool-loader.ts`'s `refreshProjectTools`. Returns the raw
|
|
57
|
+
* module namespace (default export = Meta, named exports = stories). */
|
|
58
|
+
load: () => Promise<unknown>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Minimal shape `discoverProjectStories` needs from the open project — the
|
|
62
|
+
* same fields `getCurrentProject()` (`project-manager.ts`) already returns,
|
|
63
|
+
* kept as a narrow parameter so this module doesn't need to import the
|
|
64
|
+
* whole project-manager (and stays trivially testable with a fixture). */
|
|
65
|
+
export interface StoryDiscoveryProject {
|
|
66
|
+
rootPath: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Shape of `/__editor/story-files` (editor-server.ts) — a live folder scan,
|
|
70
|
+
* never a cached manifest (D3), plus a server-truthed existence check for
|
|
71
|
+
* the project's optional `.storybook/preview.ts(x)`. */
|
|
72
|
+
interface StoryFilesPayload {
|
|
73
|
+
files: Array<{ path: string }>;
|
|
74
|
+
/** Project-relative path to whichever preview-config candidate exists on
|
|
75
|
+
* disk, or `null` when the project has no `.storybook/` folder at all
|
|
76
|
+
* (the common case — this repo's own template ships none). */
|
|
77
|
+
previewModulePath?: string | null;
|
|
78
|
+
/** Adapter + manifest regions the server already read — story medium is
|
|
79
|
+
* declared from these, never from a mount. Absent on older payloads. */
|
|
80
|
+
regions?: ProjectRegionEntry[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// No project param: the editor server is single-project (`projectRoot` is
|
|
84
|
+
// server-side session state — `/__editor/open-project`), so this GET is
|
|
85
|
+
// never parameterized by project, same as `/__editor/tool-files`/
|
|
86
|
+
// `/__editor/data-files`.
|
|
87
|
+
async function fetchStoryFilesPayload(): Promise<StoryFilesPayload | undefined> {
|
|
88
|
+
try {
|
|
89
|
+
const res = await fetch('/__editor/story-files');
|
|
90
|
+
// Content type BEFORE parsing — see `editor-server-response.ts` for why
|
|
91
|
+
// `res.ok` cannot tell a real scan apart from this origin's page fallback.
|
|
92
|
+
const payload = await editorServerJson<StoryFilesPayload>(
|
|
93
|
+
res,
|
|
94
|
+
'Scanning this project for stories failed',
|
|
95
|
+
);
|
|
96
|
+
if (Array.isArray(payload.regions)) setProjectStoryRegions(payload.regions);
|
|
97
|
+
return payload;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
_unavailable = error instanceof Error ? error.message : String(error);
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Scan the open project for `*.stories.tsx` / `*.stories.ts` files (via the
|
|
106
|
+
* editor server's `/__editor/story-files` route) and return one
|
|
107
|
+
* `DiscoveredStoryModule` per file, each carrying a lazy `load()`.
|
|
108
|
+
*
|
|
109
|
+
* Never throws: a missing/unreachable route or no project open resolves to
|
|
110
|
+
* `[]`, mirroring `refreshProjectTools`'s "keep the editor alive" discipline —
|
|
111
|
+
* a broken discovery pass must not crash the Stories panel. Every early return
|
|
112
|
+
* records {@link storyDiscoveryUnavailable} first, so an empty list is only
|
|
113
|
+
* ever read as "this project has no stories" when discovery actually ran.
|
|
114
|
+
*/
|
|
115
|
+
export async function discoverProjectStories(
|
|
116
|
+
project: StoryDiscoveryProject | null,
|
|
117
|
+
): Promise<DiscoveredStoryModule[]> {
|
|
118
|
+
_unavailable = null;
|
|
119
|
+
if (!project) return [];
|
|
120
|
+
|
|
121
|
+
// Guard the REALM, not the response — the server-less tier scans storage
|
|
122
|
+
// and bundles in-browser; the dev/packaged tier asks its server and loads
|
|
123
|
+
// through `/@fs/`. Same split as `tool-loader.ts`'s contribution catalog.
|
|
124
|
+
|
|
125
|
+
const payload = await fetchStoryFilesPayload();
|
|
126
|
+
if (!payload) return [];
|
|
127
|
+
|
|
128
|
+
return payload.files.map(({ path: modulePath }) => ({
|
|
129
|
+
modulePath,
|
|
130
|
+
load: () =>
|
|
131
|
+
import(
|
|
132
|
+
/* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
|
|
133
|
+
) as Promise<unknown>,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Load the open project's `.storybook/preview.ts(x)` module namespace, if it
|
|
139
|
+
* has one — the project-level annotations `setProjectAnnotations` applies
|
|
140
|
+
* once per session (`compose-project-stories.ts`'s `ensureProjectAnnotations`,
|
|
141
|
+
* called from `story-registry.ts`'s `refreshProjectStories`). Resolves to
|
|
142
|
+
* `undefined` when the project has no `.storybook/` folder (this repo's own
|
|
143
|
+
* template ships none — Storybook's own documented default project
|
|
144
|
+
* annotations apply, same as running with no preview config at all) or when
|
|
145
|
+
* the file fails to import for any other reason; never throws — a project
|
|
146
|
+
* config error here must not block story discovery from working.
|
|
147
|
+
*
|
|
148
|
+
* Asks the server (`/__editor/story-files`'s `previewModulePath`) which
|
|
149
|
+
* candidate, if any, actually exists on disk BEFORE importing anything — no
|
|
150
|
+
* more blind `/@fs/` probing of a path that almost always isn't there. A
|
|
151
|
+
* project with no `.storybook/` folder now costs zero network requests here
|
|
152
|
+
* instead of one guaranteed-to-fail one (that failure was invisible to this
|
|
153
|
+
* function's own try/catch, since a browser reports a failed `/@fs/` fetch
|
|
154
|
+
* as a page-level network error regardless of how the JS that triggered it
|
|
155
|
+
* handles the rejection — see `check-vgai-generated-project-p2p.ts`, which
|
|
156
|
+
* caught this as a generated-project "browser error").
|
|
157
|
+
*/
|
|
158
|
+
export async function loadProjectPreviewAnnotations(
|
|
159
|
+
project: StoryDiscoveryProject | null,
|
|
160
|
+
): Promise<unknown> {
|
|
161
|
+
if (!project) return undefined;
|
|
162
|
+
// Same realm split as `discoverProjectStories`. Deliberately does NOT touch
|
|
163
|
+
// `_unavailable` — discovery owns that record, and this runs beside it.
|
|
164
|
+
const payload = await fetchStoryFilesPayload();
|
|
165
|
+
const modulePath = payload?.previewModulePath;
|
|
166
|
+
if (!modulePath) return undefined;
|
|
167
|
+
try {
|
|
168
|
+
return await import(
|
|
169
|
+
/* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
|
|
170
|
+
);
|
|
171
|
+
} catch {
|
|
172
|
+
// Reported as present but failed to import for some other reason (a
|
|
173
|
+
// genuine config error) — degrade the same way as "not present".
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ADDRESSES a portable CSF story opens under, and the request shape that
|
|
3
|
+
* carries one — the story kind's half of `document-open-registry.ts`.
|
|
4
|
+
*
|
|
5
|
+
* It lives here, in the host's story estate (the registry, discovery, the
|
|
6
|
+
* declared medium, the arg descriptors, the three mount), and NOT in the
|
|
7
|
+
* documents, because the documents are a contribution: `@vgai/game` registers
|
|
8
|
+
* openers for these ids, the host asks for them, and neither side imports the
|
|
9
|
+
* other. A build that does not carry that package simply has no opener, which
|
|
10
|
+
* every call site already handles — `null` is the same answer an undeclared
|
|
11
|
+
* medium has always given.
|
|
12
|
+
*
|
|
13
|
+
* Three ids, because a story opens on three genuinely different surfaces and
|
|
14
|
+
* the CHOICE between them is made in three different places: by the story's
|
|
15
|
+
* declared medium (`story-opener.ts`'s `story` opener), by the owning component's
|
|
16
|
+
* surface (the Content grid), and by the caller asking for Docs explicitly.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** A story rendered on the Object3D document surface — the turntable. */
|
|
20
|
+
export const THREE_STORY_DOCUMENT_OPENER = 'story:three';
|
|
21
|
+
/** A story rendered in its own isolated DOM/canvas preview root. */
|
|
22
|
+
export const ISOLATED_STORY_DOCUMENT_OPENER = 'story:isolated';
|
|
23
|
+
/** The Storybook Docs companion for one story. */
|
|
24
|
+
export const STORY_DOCS_DOCUMENT_OPENER = 'story:docs';
|
|
25
|
+
|
|
26
|
+
export interface StoryDocumentOpenRequest {
|
|
27
|
+
/** Project-relative CSF module path. */
|
|
28
|
+
readonly modulePath: string;
|
|
29
|
+
/** The story's authored export name. */
|
|
30
|
+
readonly storyName: string;
|
|
31
|
+
/** Tab title; the export name when absent. */
|
|
32
|
+
readonly title?: string;
|
|
33
|
+
/** Whether opening also FOCUSES the tab. A click-through opens and focuses;
|
|
34
|
+
* the Edit tab row offers a standing tab instead and passes `false`. */
|
|
35
|
+
readonly activate?: boolean;
|
|
36
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Storybook/React-DOM primitives selected from the graph that owns a
|
|
2
|
+
* project's CSF modules — the DOM-mount sibling of
|
|
3
|
+
* `story-three-preview-runtime.ts`, same seam, same reason (see
|
|
4
|
+
* `vite-plugin-module-doorways.ts`'s doc comment for the dual-React failure
|
|
5
|
+
* this closes). */
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
composeStories as staticComposeStories,
|
|
9
|
+
setProjectAnnotations as staticSetProjectAnnotations,
|
|
10
|
+
} from '@storybook/react';
|
|
11
|
+
// The doorway's ADDRESS is the host's own statement about what it serves, and
|
|
12
|
+
// it is spelled ONCE — in `@volter/editor-sdk/host`, the published door. It used
|
|
13
|
+
// to be read from the plugin that SERVES it through a `@editor/../` specifier
|
|
14
|
+
// that stepped out of the editor's `src/` into its build tier, which is a
|
|
15
|
+
// reach no package gets; the plugin now imports the same constant.
|
|
16
|
+
import { STORY_RUNTIME_PATH } from '@volter/editor-sdk/host';
|
|
17
|
+
import { flushSync as staticFlushSync } from 'react-dom';
|
|
18
|
+
import { createRoot as staticCreateRoot } from 'react-dom/client';
|
|
19
|
+
import { isPackagedRuntime } from '../packaged-runtime';
|
|
20
|
+
|
|
21
|
+
export interface StoryDomRuntime {
|
|
22
|
+
readonly packaged: boolean;
|
|
23
|
+
readonly composeStories: typeof staticComposeStories;
|
|
24
|
+
readonly setProjectAnnotations: typeof staticSetProjectAnnotations;
|
|
25
|
+
readonly createRoot: typeof staticCreateRoot;
|
|
26
|
+
readonly flushSync: typeof staticFlushSync;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const STATIC_RUNTIME: StoryDomRuntime = {
|
|
30
|
+
packaged: false,
|
|
31
|
+
composeStories: staticComposeStories,
|
|
32
|
+
setProjectAnnotations: staticSetProjectAnnotations,
|
|
33
|
+
createRoot: staticCreateRoot,
|
|
34
|
+
flushSync: staticFlushSync,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
let cachedPackagedRuntime: Promise<StoryDomRuntime> | null = null;
|
|
38
|
+
|
|
39
|
+
async function loadPackagedRuntime(): Promise<StoryDomRuntime> {
|
|
40
|
+
let mod: Record<string, unknown>;
|
|
41
|
+
try {
|
|
42
|
+
mod = (await import(/* @vite-ignore */ STORY_RUNTIME_PATH)) as Record<string, unknown>;
|
|
43
|
+
} catch (err) {
|
|
44
|
+
// The one legitimate cause besides a server bug: the opened project has
|
|
45
|
+
// CSF files but no installed `@storybook/react` (the virtual module's
|
|
46
|
+
// re-export then fails to resolve). Name it — this error surfaces
|
|
47
|
+
// per-module through composeProjectStories/mountIsolatedStory callers.
|
|
48
|
+
throw new Error(
|
|
49
|
+
'The story runtime failed to load from the project module graph — is `@storybook/react` ' +
|
|
50
|
+
`installed in the project? (${String(err instanceof Error ? err.message : err)})`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
for (const name of ['composeStories', 'setProjectAnnotations', 'createRoot', 'flushSync']) {
|
|
54
|
+
if (typeof mod[name] !== 'function') {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`The packaged story runtime did not export ${name} as a function — see ` +
|
|
57
|
+
'vite-plugin-module-doorways.ts.',
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
packaged: true,
|
|
63
|
+
composeStories: mod['composeStories'] as typeof staticComposeStories,
|
|
64
|
+
setProjectAnnotations: mod['setProjectAnnotations'] as typeof staticSetProjectAnnotations,
|
|
65
|
+
createRoot: mod['createRoot'] as typeof staticCreateRoot,
|
|
66
|
+
flushSync: mod['flushSync'] as typeof staticFlushSync,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function resolveStoryDomRuntime(): Promise<StoryDomRuntime> {
|
|
71
|
+
if (!(await isPackagedRuntime())) return STATIC_RUNTIME;
|
|
72
|
+
if (!cachedPackagedRuntime) cachedPackagedRuntime = loadPackagedRuntime();
|
|
73
|
+
return cachedPackagedRuntime;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function resetStoryDomRuntimeCacheForTest(): void {
|
|
77
|
+
cachedPackagedRuntime = null;
|
|
78
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story grouping — the ONE optional grouping model for stories, shared by
|
|
3
|
+
* every story surface. The React design-time board and hierarchy both turn
|
|
4
|
+
* this path into Storybook's Category → Folder → Component → Story tree;
|
|
5
|
+
* later surfaces reuse it rather than deriving a second organization.
|
|
6
|
+
*
|
|
7
|
+
* It is PRESENTATION-ONLY. A group never affects story↔component
|
|
8
|
+
* association, default-story picking, mounting, or any other runtime
|
|
9
|
+
* meaning — it decides layout and labels and nothing else. Nothing here is
|
|
10
|
+
* a new authored vgai parameter either: the two inputs are facts the story
|
|
11
|
+
* already carries.
|
|
12
|
+
*
|
|
13
|
+
* The group path is Storybook's own convention, in Storybook's own order of
|
|
14
|
+
* precedence:
|
|
15
|
+
* 1. the CSF meta `title` when the module authored one (slash-separated),
|
|
16
|
+
* parsed by Storybook's exported `parseKind` rather than a local split
|
|
17
|
+
* so the separator semantics stay theirs;
|
|
18
|
+
* 2. otherwise DERIVED from the module's own project-relative path — the
|
|
19
|
+
* same thing Storybook does for an untitled CSF file (its automatic
|
|
20
|
+
* title comes from the file path) — relative to the project's `src/`
|
|
21
|
+
* and with the `*.stories.*` suffix stripped.
|
|
22
|
+
*
|
|
23
|
+
* `segments` is the category/folder ancestry (empty for an ungrouped story);
|
|
24
|
+
* `leaf` is the component name inside that ancestry.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { parseKind } from 'storybook/internal/csf';
|
|
28
|
+
import { userOrAutoTitleFromSpecifier } from 'storybook/internal/preview-api';
|
|
29
|
+
import type { NormalizedStoriesSpecifier } from 'storybook/internal/types';
|
|
30
|
+
|
|
31
|
+
/** One story module's place in the grouping model. */
|
|
32
|
+
export interface StoryGroupPath {
|
|
33
|
+
/** Ancestor group segments. EMPTY means ungrouped — the flat case, which
|
|
34
|
+
* every surface must render exactly as it did before grouping existed. */
|
|
35
|
+
readonly segments: readonly string[];
|
|
36
|
+
/** The component/document name within {@link segments}. */
|
|
37
|
+
readonly leaf: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Only `.stories.ts(x)` files are discovered (`story-discovery.ts`); the
|
|
41
|
+
* `j` variants cost nothing and keep a JS project's derivation honest. */
|
|
42
|
+
const STORY_MODULE_SUFFIX = /\.stories\.[jt]sx?$/i;
|
|
43
|
+
|
|
44
|
+
/** A project's story modules live under its `src/`, so that prefix is the
|
|
45
|
+
* derivation's root — it is shared by every module and would only ever be a
|
|
46
|
+
* group everything belongs to. */
|
|
47
|
+
function titleSegments(title: string): string[] {
|
|
48
|
+
// Storybook's own parse. `rootSeparator`/`groupSeparator` are its documented
|
|
49
|
+
// defaults; `root` is simply the first segment for our purposes, since a
|
|
50
|
+
// group path here has no separate "root" concept.
|
|
51
|
+
const { root, groups } = parseKind(title, { rootSeparator: '|', groupSeparator: '/' });
|
|
52
|
+
return [...(root ? [root] : []), ...groups].map((part) => part.trim()).filter(Boolean);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function conventionalStorySpecifier(modulePath: string): NormalizedStoriesSpecifier {
|
|
56
|
+
const normalized = modulePath.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
57
|
+
const nestedSource = normalized.lastIndexOf('/src/');
|
|
58
|
+
const directory = normalized.startsWith('src/')
|
|
59
|
+
? 'src'
|
|
60
|
+
: nestedSource >= 0
|
|
61
|
+
? normalized.slice(0, nestedSource + 4)
|
|
62
|
+
: normalized.slice(0, Math.max(0, normalized.lastIndexOf('/')));
|
|
63
|
+
return {
|
|
64
|
+
directory,
|
|
65
|
+
files: '**/*.stories.@(js|jsx|mjs|ts|tsx)',
|
|
66
|
+
titlePrefix: '',
|
|
67
|
+
importPathMatcher: STORY_MODULE_SUFFIX,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The group path of one composed story module: its authored CSF title when
|
|
73
|
+
* it has one, else its module path relative to the project `src/`.
|
|
74
|
+
*/
|
|
75
|
+
export function deriveStoryGroupPath(input: {
|
|
76
|
+
modulePath: string;
|
|
77
|
+
title?: string | undefined;
|
|
78
|
+
}): StoryGroupPath {
|
|
79
|
+
const modulePath = input.modulePath.replaceAll('\\', '/').replace(/^\.\//, '');
|
|
80
|
+
const userTitle = input.title && titleSegments(input.title).length > 0 ? input.title : undefined;
|
|
81
|
+
const nativeTitle = userOrAutoTitleFromSpecifier(
|
|
82
|
+
modulePath,
|
|
83
|
+
conventionalStorySpecifier(modulePath),
|
|
84
|
+
userTitle,
|
|
85
|
+
);
|
|
86
|
+
// Storybook's auto-title only speaks for files its own specifier matches, so
|
|
87
|
+
// it returns nothing for a row that is not a discovered CSF module at all —
|
|
88
|
+
// the `2D` board's ghost slots, which name a COMPONENT that has no story yet
|
|
89
|
+
// (`canvas-board/canvas-board-model.ts`). An explicitly supplied title is the
|
|
90
|
+
// caller's own statement about where the row belongs and stands either way;
|
|
91
|
+
// without this, such a row falls back to its raw path and every ghost lands
|
|
92
|
+
// in a district of its own.
|
|
93
|
+
const parts = nativeTitle
|
|
94
|
+
? titleSegments(nativeTitle)
|
|
95
|
+
: userTitle
|
|
96
|
+
? titleSegments(userTitle)
|
|
97
|
+
: [modulePath];
|
|
98
|
+
return { segments: parts.slice(0, -1), leaf: parts.at(-1) ?? input.modulePath };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The clustering key of a group path — the ancestors alone, so every story
|
|
102
|
+
* of one group shares it. `''` is the ungrouped/flat case. */
|
|
103
|
+
export function storyGroupKey(group: StoryGroupPath): string {
|
|
104
|
+
return group.segments.join('/');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** The full, human-facing group path (`UI/Button`) — what a surface labels a
|
|
108
|
+
* story document with. */
|
|
109
|
+
export function formatStoryGroupPath(group: StoryGroupPath): string {
|
|
110
|
+
return [...group.segments, group.leaf].join('/');
|
|
111
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PORTABLE CSF's page-side lane, installed by the kit itself.
|
|
3
|
+
*
|
|
4
|
+
* WHAT IT INSTALLS, and which registry each piece reaches: the Content
|
|
5
|
+
* scope's story-backed entries (`content-entry-source-registry.ts`), the named
|
|
6
|
+
* states a component has (`component-states-registry.ts`), the addresses a
|
|
7
|
+
* story opens under (`document-open-registry.ts`, through `story-opener.ts`),
|
|
8
|
+
* the palette's one action per composed story (`chrome-registry.ts`), the
|
|
9
|
+
* `capture-story-variants` session verb (`command-registry.ts`) and the
|
|
10
|
+
* discovery lifecycle that finds a project's `*.stories.ts(x)` modules and
|
|
11
|
+
* re-composes them on project switches, CSF file add/remove events and content
|
|
12
|
+
* writes under `src/` (`project-story-discovery.ts`).
|
|
13
|
+
*
|
|
14
|
+
* WHY THE KIT AND NOT A PACKAGE. Portable CSF is the design-time state the
|
|
15
|
+
* three, DOM and canvas surfaces all read — a file three siblings import lives
|
|
16
|
+
* in none of them — so it is the kit's, not an integration's
|
|
17
|
+
* (ARCHITECTURE-CORE §The target shape, "`stories` is NOT React"). The kit's
|
|
18
|
+
* own CSF therefore needs no contribution to exist: these are direct
|
|
19
|
+
* registrations, at the registries a contribution would have reached.
|
|
20
|
+
*
|
|
21
|
+
* THE COST, stated rather than rounded away: `story-registry.ts` imports
|
|
22
|
+
* `storybook/internal/preview-api`, so the kit's boot closure carries
|
|
23
|
+
* Storybook's preview API and every product pays for it — the closure meter's
|
|
24
|
+
* bridge pin names the number.
|
|
25
|
+
*
|
|
26
|
+
* WHY EVERYTHING HERE IS EAGER. There is no lazy half to find: the content
|
|
27
|
+
* source, the states source and the opener each reach `story-registry.ts`
|
|
28
|
+
* directly, so deferring the discovery scan alone would move no file out of
|
|
29
|
+
* the closure and would only make the install order harder to read.
|
|
30
|
+
*
|
|
31
|
+
* WHAT IS NOT HERE, and why. `@volter/editor-project/adapter`'s `StoriesProvider` is the
|
|
32
|
+
* CONTRACT — an adapter says which named states a node has, in its own
|
|
33
|
+
* vocabulary, and answers `unavailable()` itself — so it and
|
|
34
|
+
* `components/InspectorStoriesSection.tsx` (the section that DRAWS a contract)
|
|
35
|
+
* stay where they are, with `components/inspector-stories-gating.ts` and
|
|
36
|
+
* `authoring/stories-scope.ts`. The `prefabsFromStories` finder is registered
|
|
37
|
+
* by `project-adapter.ts`, the one sanctioned importer of the engine's finder
|
|
38
|
+
* namespace.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import { registerContributedActions } from '../chrome-registry';
|
|
42
|
+
import { registerContributedCommands } from '../command-registry';
|
|
43
|
+
import { registerComponentStatesSource } from '../component-states-registry';
|
|
44
|
+
import { registerContentEntrySource } from '../content-entry-source-registry';
|
|
45
|
+
import { refreshProjectAdapter } from '../project-adapter';
|
|
46
|
+
import { storyComponentContentSource } from './component-content-source';
|
|
47
|
+
import { componentStatesSource } from './component-states-source';
|
|
48
|
+
import { startProjectStoryDiscovery } from './project-story-discovery';
|
|
49
|
+
import { storyPaletteActions } from './story-actions';
|
|
50
|
+
import { STORY_CAPTURE_COMMAND_SOURCE, storyCaptureCommands } from './story-capture-command';
|
|
51
|
+
import { registerStoryOpener } from './story-opener';
|
|
52
|
+
import { subscribeProjectStoryModules } from './story-registry';
|
|
53
|
+
|
|
54
|
+
/** Install the whole lane. Returns the teardown, in reverse order. */
|
|
55
|
+
export function installStoryLane(): () => void {
|
|
56
|
+
const stopSource = registerContentEntrySource(storyComponentContentSource);
|
|
57
|
+
// The SIBLING question: the content source says what a component LOOKS
|
|
58
|
+
// LIKE, this one what named STATES it has. Three authoring adapters used to
|
|
59
|
+
// construct the second answer inside their own constructors, which is why
|
|
60
|
+
// the story registry could not be reached through a seam at all.
|
|
61
|
+
const stopStates = registerComponentStatesSource(componentStatesSource);
|
|
62
|
+
const stopOpener = registerStoryOpener();
|
|
63
|
+
const stopActions = registerContributedActions(storyPaletteActions);
|
|
64
|
+
const stopCommands = registerContributedCommands(
|
|
65
|
+
STORY_CAPTURE_COMMAND_SOURCE,
|
|
66
|
+
storyCaptureCommands,
|
|
67
|
+
);
|
|
68
|
+
// The scan's own first step is to await the first authored viewport frame
|
|
69
|
+
// (`waitForFirstViewportFrame`, for the recorded reason that a cold GPU must
|
|
70
|
+
// not spend its first context on prefab thumbnails), so starting it at boot
|
|
71
|
+
// costs nothing before that frame.
|
|
72
|
+
const stopDiscovery = startProjectStoryDiscovery();
|
|
73
|
+
// A SETTLED LEDGER IS ANNOUNCED HERE. The document table holds prefab rows
|
|
74
|
+
// the `prefabsFromStories` finder produced, and the table re-resolves when
|
|
75
|
+
// the finder SET changes — not when one finder's own data does.
|
|
76
|
+
const stopTableRefresh = subscribeProjectStoryModules(() => {
|
|
77
|
+
void refreshProjectAdapter();
|
|
78
|
+
});
|
|
79
|
+
return () => {
|
|
80
|
+
stopTableRefresh();
|
|
81
|
+
stopDiscovery();
|
|
82
|
+
stopCommands();
|
|
83
|
+
stopActions();
|
|
84
|
+
stopOpener();
|
|
85
|
+
stopStates();
|
|
86
|
+
stopSource();
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE ONE process-wide story-mount turn queue, shared by every medium.
|
|
3
|
+
*
|
|
4
|
+
* Extracted verbatim from `story-three-preview.ts`'s own `storyMountTurn`
|
|
5
|
+
* (which owned it alone until the canvas surface got a preview mount too) for
|
|
6
|
+
* the reason that module already states: portable-story LOADERS are allowed to
|
|
7
|
+
* touch process-global state, so two mounts running at once interleave their
|
|
8
|
+
* setup and collide. That reason is not three-specific — a canvas story's
|
|
9
|
+
* loader initializes Pixi's global `Assets` cache and its component catalogue —
|
|
10
|
+
* and two queues would not serialize a three mount against a canvas mount at
|
|
11
|
+
* all, which is exactly the pair that now runs over the same project.
|
|
12
|
+
*
|
|
13
|
+
* Every caller takes a turn either for ONE mount or for a compound operation
|
|
14
|
+
* (a whole board build). A rejected turn never poisons its successor.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
let storyMountTurn: Promise<unknown> = Promise.resolve();
|
|
18
|
+
|
|
19
|
+
/** Run one story-mount operation with no other mount interleaving it. */
|
|
20
|
+
export function runInStoryMountTurn<T>(task: () => Promise<T>): Promise<T> {
|
|
21
|
+
const turn = storyMountTurn.then(task, task);
|
|
22
|
+
storyMountTurn = turn.then(
|
|
23
|
+
() => undefined,
|
|
24
|
+
() => undefined,
|
|
25
|
+
);
|
|
26
|
+
return turn;
|
|
27
|
+
}
|