@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,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CONTRIBUTED COMMANDS — the registry behind `@volter/editor-sdk/commands`.
|
|
3
|
+
* `command-listener.ts` asks here before its own table, so a package's verb
|
|
4
|
+
* is answered by the package's handler with the host's relay, ack and
|
|
5
|
+
* status-derivation machinery unchanged around it. The rows are also what the
|
|
6
|
+
* loader reports to the server (`/__editor/contributed-commands`), which
|
|
7
|
+
* sizes its wait per verb from them.
|
|
8
|
+
*/
|
|
9
|
+
import type {
|
|
10
|
+
CommandContribution,
|
|
11
|
+
CommandDerivedRefresh,
|
|
12
|
+
CommandSpec,
|
|
13
|
+
ContributedCommandRow,
|
|
14
|
+
} from '@volter/editor-sdk/commands';
|
|
15
|
+
import {
|
|
16
|
+
DEFAULT_RELAY_COMMAND_TIMEOUT_MS,
|
|
17
|
+
isRelayCommandType,
|
|
18
|
+
} from '@volter/editor-sdk/session/command-table';
|
|
19
|
+
|
|
20
|
+
interface Registered {
|
|
21
|
+
readonly entryPath: string;
|
|
22
|
+
readonly spec: CommandSpec;
|
|
23
|
+
}
|
|
24
|
+
const registered = new Map<string, Registered>();
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Register a contribution's commands. Every type is checked before any is
|
|
28
|
+
* claimed, so a module with one bad row registers nothing. Returns the
|
|
29
|
+
* unregister.
|
|
30
|
+
*/
|
|
31
|
+
export function registerContributedCommands(
|
|
32
|
+
entryPath: string,
|
|
33
|
+
commands: CommandContribution['commands'],
|
|
34
|
+
): () => void {
|
|
35
|
+
const types = Object.keys(commands);
|
|
36
|
+
for (const type of types) {
|
|
37
|
+
if (isRelayCommandType(type))
|
|
38
|
+
throw new Error(`command "${type}" is the editor's own; a contribution cannot redefine it.`);
|
|
39
|
+
const other = registered.get(type);
|
|
40
|
+
if (other) throw new Error(`command "${type}" is already contributed by ${other.entryPath}.`);
|
|
41
|
+
const spec = commands[type];
|
|
42
|
+
if (typeof spec?.handle !== 'function')
|
|
43
|
+
throw new Error(`command "${type}" must carry a \`handle\` function.`);
|
|
44
|
+
if (spec.timeoutMs !== undefined && !(Number.isFinite(spec.timeoutMs) && spec.timeoutMs > 0))
|
|
45
|
+
throw new Error(`command "${type}" has a timeoutMs that is not a positive number.`);
|
|
46
|
+
}
|
|
47
|
+
for (const type of types) registered.set(type, { entryPath, spec: commands[type]! });
|
|
48
|
+
return () => {
|
|
49
|
+
for (const type of types)
|
|
50
|
+
if (registered.get(type)?.entryPath === entryPath) registered.delete(type);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function contributedCommand(type: unknown): CommandSpec | null {
|
|
55
|
+
return typeof type === 'string' ? (registered.get(type)?.spec ?? null) : null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function contributedCommandDerivedRefresh(type: unknown): CommandDerivedRefresh | null {
|
|
59
|
+
const spec = contributedCommand(type);
|
|
60
|
+
return spec ? (spec.derivedRefresh ?? 'always') : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Every registered row, as reported to the server. */
|
|
64
|
+
export function contributedCommandRows(): ContributedCommandRow[] {
|
|
65
|
+
return [...registered.entries()].map(([type, { spec }]) => ({
|
|
66
|
+
type,
|
|
67
|
+
timeoutMs: spec.timeoutMs ?? DEFAULT_RELAY_COMMAND_TIMEOUT_MS,
|
|
68
|
+
derivedRefresh: spec.derivedRefresh ?? 'always',
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A COMPONENT BOARD IS REGISTERED — the sixth registry in the family of
|
|
3
|
+
* `workspace-document-restore.ts` (a kind owns its persisted state),
|
|
4
|
+
* `document-open-registry.ts` (a kind owns how it opens),
|
|
5
|
+
* `chrome-slot-registry.ts` (the host owns the place, a package owns what sits
|
|
6
|
+
* there), `content-entry-source-registry.ts` (the host owns the Content scope,
|
|
7
|
+
* a package owns why a component is content) and
|
|
8
|
+
* `authoring/design-time-mount-registry.ts` (the host owns the layer stack, a
|
|
9
|
+
* package owns how a medium mounts). Here: the host owns WHERE a project's
|
|
10
|
+
* component boards sit in the workspace — installing one, closing one,
|
|
11
|
+
* answering why one is absent — and a package owns WHICH medium it is a board
|
|
12
|
+
* of, whether this project has one, and what goes in it.
|
|
13
|
+
*
|
|
14
|
+
* WHY IT EXISTS. `components/world-documents.tsx` held a literal table of
|
|
15
|
+
* three media with an installer each (`COMPONENT_BOARDS`), reconciled against
|
|
16
|
+
* `getStoryMediaPresence()`, plus two absence thunks gated on
|
|
17
|
+
* `projectStoriesReady()`. Three statements about CSF, made in the host: that
|
|
18
|
+
* a project's boards are `dom`/`three`/`canvas`; that a board exists because
|
|
19
|
+
* the project has stories of that medium; and that "no board yet" and "no
|
|
20
|
+
* board ever" are told apart by a story-DISCOVERY flag. The host does not
|
|
21
|
+
* author portable CSF and must not know any of it (WORK.md §The open-source
|
|
22
|
+
* launch item 18a).
|
|
23
|
+
*
|
|
24
|
+
* THE SHAPE is transcribed from `content-entry-source-registry.ts:80-149`:
|
|
25
|
+
* register / list / subscribe with the owner-replaces-owner rule, and the
|
|
26
|
+
* registry RE-FANS each board's own `subscribe` into one signal, because the
|
|
27
|
+
* host's single reconciler must re-read when any board's verdict moves and
|
|
28
|
+
* which board moved is never its question (`:89-91`, `:122`). Three
|
|
29
|
+
* deliberate differences from `design-time-mount-registry.ts`, the sibling
|
|
30
|
+
* this door most resembles, each with its reason:
|
|
31
|
+
*
|
|
32
|
+
* - NO VERSION COUNTER, for that registry's reason: the only reader is
|
|
33
|
+
* `installRootDocuments`, which subscribes and re-reads. A counter with no
|
|
34
|
+
* caller is a name that got built because it was named.
|
|
35
|
+
* - PRESENCE IS RE-FANNED, where a design-time mount's staleness deliberately
|
|
36
|
+
* is not. The distinction is the one that registry's own note draws: a
|
|
37
|
+
* staleness signal must reach the ONE stack that mounted that medium
|
|
38
|
+
* carrying which action to take, while board presence is a registration-wide
|
|
39
|
+
* fact the single reconciler acts on uniformly.
|
|
40
|
+
* - NO `remountWhen`, AND THAT IS A MEASUREMENT. The membership rule this door
|
|
41
|
+
* was specified to absorb (a story added or deleted while a board is
|
|
42
|
+
* mounted must put the new frame on screen without F5) is a statement about
|
|
43
|
+
* a MEDIUM's mounted layers, which is exactly `DesignTimeMount.remountWhen`
|
|
44
|
+
* / `reprojectWhen` — already bound per medium by `mountDesignTimeLayers`
|
|
45
|
+
* (`design-time-layers.ts:717-742`) and already carrying this lane's two
|
|
46
|
+
* other staleness rules. A second hook here would fire on a board whose
|
|
47
|
+
* layers are not stories at all: the rule lived in `RootDocumentContent`,
|
|
48
|
+
* which mounts the dom board AND the canvas Scene, so a canvas world was
|
|
49
|
+
* being torn down and rebuilt every time an unrelated dom story was saved.
|
|
50
|
+
* It travels with the dom mount instead.
|
|
51
|
+
*
|
|
52
|
+
* PRESENCE IS TRI-STATE, and the third state is the whole point. `null` means
|
|
53
|
+
* "cannot answer yet" — a board whose census has not run. The host used to
|
|
54
|
+
* spell that condition itself as `projectStoriesReady()`, so it knew that a
|
|
55
|
+
* board waits on story discovery; now it knows only that a registration may
|
|
56
|
+
* not have a verdict, which is the same thing a document opener's `ready` and
|
|
57
|
+
* a design-time mount's late registration already say. An absence is spoken
|
|
58
|
+
* only when the owner has a verdict.
|
|
59
|
+
*
|
|
60
|
+
* NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
|
|
61
|
+
* board installs none and says so through the generic "no workspace document
|
|
62
|
+
* is named …" — the same honest emptiness a document kind with no registered
|
|
63
|
+
* opener gives.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
import type { CompositeAuthoringAdapter } from './authoring/composite-authoring-adapter';
|
|
67
|
+
import type { EditorShellStore } from './editor-shell-store';
|
|
68
|
+
|
|
69
|
+
/** Everything a board reads from the HOST at install, and deliberately
|
|
70
|
+
* nothing more — measured against the three installers as they stood:
|
|
71
|
+
* `installThreeBoardDocument` and `installCanvasBoardDocument` read the shell
|
|
72
|
+
* store alone; the UI board additionally reads the session's composite,
|
|
73
|
+
* because it is a document OF a root and carries that root's provenance. */
|
|
74
|
+
export interface ComponentBoardContext {
|
|
75
|
+
/** The ONE format-neutral shell store the session's documents are opened
|
|
76
|
+
* against. */
|
|
77
|
+
readonly store: EditorShellStore;
|
|
78
|
+
/** The live session's composite authoring adapter — the roots this project
|
|
79
|
+
* actually mounted, for a board that is also a root's document. */
|
|
80
|
+
readonly composite: CompositeAuthoringAdapter;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface ComponentBoard {
|
|
84
|
+
/**
|
|
85
|
+
* The medium this is the board of, in the registering package's own
|
|
86
|
+
* vocabulary. The host never spells one: it compares this against a
|
|
87
|
+
* design-time root descriptor's `kind` to decide whether that root's
|
|
88
|
+
* document IS this board, and otherwise only passes it back.
|
|
89
|
+
*/
|
|
90
|
+
readonly medium: string;
|
|
91
|
+
/** Which module registered it. Re-registering the same owner+medium
|
|
92
|
+
* REPLACES, so an HMR re-evaluation leaves one board, not two. */
|
|
93
|
+
readonly owner: string;
|
|
94
|
+
/** The workspace document id this board installs under. The host closes by
|
|
95
|
+
* it and answers "why is this id absent" from it. */
|
|
96
|
+
readonly documentId: string;
|
|
97
|
+
/** How the board is named to a human, for the host's own absence prose
|
|
98
|
+
* ("this project has no <title> board"). */
|
|
99
|
+
readonly title: string;
|
|
100
|
+
/**
|
|
101
|
+
* Does this project have this board? `'present'` installs it, `'absent'`
|
|
102
|
+
* closes it, and `null` is "no verdict yet" — the host neither installs nor
|
|
103
|
+
* speaks an absence, because a census that has not run is not a No.
|
|
104
|
+
*/
|
|
105
|
+
readonly presence: () => 'present' | 'absent' | null;
|
|
106
|
+
/** The board's OWN change signal — its census settling, its discovery pass
|
|
107
|
+
* finishing. The host re-reconciles on it without knowing what moved. */
|
|
108
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
109
|
+
/**
|
|
110
|
+
* Open this board's workspace document. Called once per transition into
|
|
111
|
+
* `'present'`; the host closes it by {@link documentId}, exactly as it did
|
|
112
|
+
* when the table was a literal. Never activates: a board arrives
|
|
113
|
+
* asynchronously and must not yank the author off what they were looking at.
|
|
114
|
+
*
|
|
115
|
+
* MAY BE ASYNCHRONOUS — a board whose renderer costs a whole substrate
|
|
116
|
+
* (the 2D board initializes Pixi) loads its implementation only for a
|
|
117
|
+
* project that has one. A rejected promise or a throw un-reserves the id
|
|
118
|
+
* here, so the next verdict retries; saying WHAT failed is the board's own
|
|
119
|
+
* job, because only it knows what it was loading.
|
|
120
|
+
*/
|
|
121
|
+
readonly install: (context: ComponentBoardContext) => void | Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Why THIS project has no board of this medium, and what would make one
|
|
124
|
+
* appear — the fix text, in the lane's own vocabulary. Read only while
|
|
125
|
+
* {@link presence} says `'absent'`.
|
|
126
|
+
*/
|
|
127
|
+
readonly absentReason: () => string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const _boards: ComponentBoard[] = [];
|
|
131
|
+
const listeners = new Set<() => void>();
|
|
132
|
+
/** Live teardowns for the per-board presence subscriptions the registry
|
|
133
|
+
* re-fans (`content-entry-source-registry.ts:102`). */
|
|
134
|
+
const boardSubscriptions = new Map<ComponentBoard, () => void>();
|
|
135
|
+
|
|
136
|
+
function publish(): void {
|
|
137
|
+
for (const listener of listeners) listener();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Install a board. Returns the teardown. */
|
|
141
|
+
export function registerComponentBoard(board: ComponentBoard): () => void {
|
|
142
|
+
const stale = _boards.findIndex(
|
|
143
|
+
(item) => item.owner === board.owner && item.medium === board.medium,
|
|
144
|
+
);
|
|
145
|
+
if (stale >= 0) {
|
|
146
|
+
const [removed] = _boards.splice(stale, 1);
|
|
147
|
+
if (removed) {
|
|
148
|
+
boardSubscriptions.get(removed)?.();
|
|
149
|
+
boardSubscriptions.delete(removed);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
_boards.push(board);
|
|
153
|
+
boardSubscriptions.set(board, board.subscribe(publish));
|
|
154
|
+
publish();
|
|
155
|
+
return () => {
|
|
156
|
+
const at = _boards.indexOf(board);
|
|
157
|
+
if (at < 0) return;
|
|
158
|
+
_boards.splice(at, 1);
|
|
159
|
+
boardSubscriptions.get(board)?.();
|
|
160
|
+
boardSubscriptions.delete(board);
|
|
161
|
+
publish();
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const EMPTY: readonly ComponentBoard[] = [];
|
|
166
|
+
|
|
167
|
+
/** Everything registered, in registration order. A stable array while nothing
|
|
168
|
+
* changes, so a reader can compare identities across a notification. */
|
|
169
|
+
export function componentBoards(): readonly ComponentBoard[] {
|
|
170
|
+
return _boards.length === 0 ? EMPTY : _boards;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The board of one medium, or `null` — "no package registered one", which is
|
|
174
|
+
* a real answer and never an error. The LAST registration wins, the same way
|
|
175
|
+
* a later design-time mount of the same kind does. */
|
|
176
|
+
export function componentBoardForMedium(medium: string): ComponentBoard | null {
|
|
177
|
+
for (let i = _boards.length - 1; i >= 0; i--) {
|
|
178
|
+
const board = _boards[i];
|
|
179
|
+
if (board && board.medium === medium) return board;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** The board installed under a workspace document id, or `null`. */
|
|
185
|
+
export function componentBoardForDocument(documentId: string): ComponentBoard | null {
|
|
186
|
+
return _boards.find((board) => board.documentId === documentId) ?? null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** ONE subscription for the reconciler: the registry's own changes AND every
|
|
190
|
+
* registered board's presence signal. What changed is never its question. */
|
|
191
|
+
export function subscribeComponentBoards(listener: () => void): () => void {
|
|
192
|
+
listeners.add(listener);
|
|
193
|
+
return () => {
|
|
194
|
+
listeners.delete(listener);
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Test-only reset (mirrors the restore, open, chrome-slot, content-source and
|
|
199
|
+
* design-time-mount registries'). */
|
|
200
|
+
export function __resetComponentBoardsForTest(): void {
|
|
201
|
+
for (const stop of boardSubscriptions.values()) stop();
|
|
202
|
+
boardSubscriptions.clear();
|
|
203
|
+
_boards.length = 0;
|
|
204
|
+
publish();
|
|
205
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A COMPONENT'S NAMED STATES ARE SOURCED, NOT CONSTRUCTED — the seventh
|
|
3
|
+
* registry in the family, and the direct sibling of the member unit 11 minted
|
|
4
|
+
* next door: `content-entry-source-registry.ts:166-176`'s
|
|
5
|
+
* `contentEntryForComponent(ref)` answers "what does this component LOOK
|
|
6
|
+
* like?" by registration; this answers "what named STATES does it have, and
|
|
7
|
+
* what does applying one do?".
|
|
8
|
+
*
|
|
9
|
+
* WHY IT EXISTS. `StoriesProvider` (`@volter/editor-project/adapter` authoring.ts:706) is the
|
|
10
|
+
* ENGINE's contract and does not change — an adapter says which named states a
|
|
11
|
+
* node has, in its own vocabulary. What changed is who FILLS it. Three
|
|
12
|
+
* keep-bucket host adapters CONSTRUCTED the CSF implementation inside their own
|
|
13
|
+
* constructors:
|
|
14
|
+
*
|
|
15
|
+
* authoring/r3f-source-authoring-adapter.ts:637 unconditional
|
|
16
|
+
* authoring/three-authoring-adapter.ts:506 gated on `sourceDeclaresStories`
|
|
17
|
+
* authoring/pixi-authoring-adapter.ts:773 gated on the target's identity
|
|
18
|
+
*
|
|
19
|
+
* and no registry reaches into a constructor, so no existing point carried it
|
|
20
|
+
* — which is why `authoring/project-three-stories.ts` (and through it
|
|
21
|
+
* `stories/story-registry.ts`, and through THAT `storybook/internal/preview-api`)
|
|
22
|
+
* could not leave the host however many boards moved (WORK.md §The open-source
|
|
23
|
+
* launch item 18b).
|
|
24
|
+
*
|
|
25
|
+
* WHAT THE MEASUREMENT SAID THE THREE CONSTRUCTIONS DIFFER BY, and therefore
|
|
26
|
+
* what a source must be handed rather than hold:
|
|
27
|
+
*
|
|
28
|
+
* - THE COMPONENT-IDENTITY CLOSURE. All three produce the same SHAPE
|
|
29
|
+
* ({@link ComponentStatesRef}) by three different routes: the R3F source
|
|
30
|
+
* adapter resolves a definition/callsite and can name the defining FILE;
|
|
31
|
+
* the three adapter reads its hierarchy node's `typeLabel` and has no file;
|
|
32
|
+
* the pixi adapter delegates to its write target's `componentIdentity`.
|
|
33
|
+
* That closure stays with the adapter — it is the adapter's own semantic
|
|
34
|
+
* knowledge of what a node IS — and travels per call.
|
|
35
|
+
* - THE SURFACE. The three-flavoured construction applied a state by opening
|
|
36
|
+
* the Object3D turntable; the canvas one opened the ordinary isolated story
|
|
37
|
+
* document. That was the ONLY difference between the two factory functions.
|
|
38
|
+
* A source is handed the asking adapter's surface and dispatches on it, the
|
|
39
|
+
* way the story opener's own readiness does.
|
|
40
|
+
*
|
|
41
|
+
* WHAT THE HOST KEEPS, and why it is not a leak: the per-node ACTIVE map and
|
|
42
|
+
* the change notification — identical in all three constructions, about the
|
|
43
|
+
* editor session rather than about states — and the refusal when an `apply`
|
|
44
|
+
* names a state that does not belong to the node. {@link componentStatesProvider}
|
|
45
|
+
* is that bookkeeping and nothing else.
|
|
46
|
+
*
|
|
47
|
+
* NOTHING REGISTERED IS A REAL ANSWER, and here it is a SPOKEN one: the
|
|
48
|
+
* provider's `unavailable()` says that no package registered a source, which
|
|
49
|
+
* is precisely the distinction that member exists to draw ("an empty
|
|
50
|
+
* `storiesFor` and an UNREAD one look identical from the section that draws
|
|
51
|
+
* them, and only the provider knows which").
|
|
52
|
+
*
|
|
53
|
+
* DELIBERATELY ABSENT: `isolate` and `title`. `StoriesProvider` publishes
|
|
54
|
+
* both, no CSF construction ever supplied either (`resolveComposeStoriesInput`
|
|
55
|
+
* passes `isolation: null` unconditionally), and a member on a registry gets
|
|
56
|
+
* built whether or not anything wants it. They belong here the day a source
|
|
57
|
+
* has one.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
import type { AdapterSurface, StoriesProvider, StoryRef } from '@volter/editor-project/adapter';
|
|
61
|
+
import { editorConsole } from './editor-console';
|
|
62
|
+
import type { EditorShellStore } from './editor-shell-store';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A component as a STATES source sees it — the exact shape all three adapter
|
|
66
|
+
* closures already produced. `sourcePath` is absent for an adapter that knows
|
|
67
|
+
* the component's NAME but not the module it is defined in.
|
|
68
|
+
*/
|
|
69
|
+
export interface ComponentStatesRef {
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly sourcePath?: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** What a source is asked the question IN. */
|
|
75
|
+
export interface ComponentStatesContext {
|
|
76
|
+
/** The authoring surface the asking adapter mounts on. A source that means
|
|
77
|
+
* different things on different surfaces (opening a state in the Object3D
|
|
78
|
+
* turntable versus the isolated story document) dispatches on it; the host
|
|
79
|
+
* never reads it. */
|
|
80
|
+
readonly surface: AdapterSurface;
|
|
81
|
+
/** The ONE format-neutral shell store, for a state whose application opens a
|
|
82
|
+
* document or moves the session. */
|
|
83
|
+
readonly store: EditorShellStore;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface ComponentStatesSource {
|
|
87
|
+
/** The source's id, in its own vocabulary. */
|
|
88
|
+
readonly id: string;
|
|
89
|
+
/** Which module registered it. Re-registering the same owner+id REPLACES,
|
|
90
|
+
* so an HMR re-evaluation leaves one source, not two. */
|
|
91
|
+
readonly owner: string;
|
|
92
|
+
/** Ascending; ties keep registration order. */
|
|
93
|
+
readonly order?: number;
|
|
94
|
+
/** This component's named states, or `[]` — "none of mine", which lets the
|
|
95
|
+
* next source answer. */
|
|
96
|
+
readonly statesFor: (
|
|
97
|
+
component: ComponentStatesRef,
|
|
98
|
+
context: ComponentStatesContext,
|
|
99
|
+
) => readonly StoryRef[];
|
|
100
|
+
/** Apply one of the states this source just named. Whether that opens a
|
|
101
|
+
* document, swaps a world or writes source is the source's business. */
|
|
102
|
+
readonly apply: (
|
|
103
|
+
component: ComponentStatesRef,
|
|
104
|
+
stateId: string,
|
|
105
|
+
context: ComponentStatesContext,
|
|
106
|
+
) => void;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const _sources: ComponentStatesSource[] = [];
|
|
110
|
+
|
|
111
|
+
/** Install a source. Returns the teardown. */
|
|
112
|
+
export function registerComponentStatesSource(source: ComponentStatesSource): () => void {
|
|
113
|
+
const stale = _sources.findIndex((item) => item.owner === source.owner && item.id === source.id);
|
|
114
|
+
if (stale >= 0) _sources.splice(stale, 1);
|
|
115
|
+
_sources.push(source);
|
|
116
|
+
_sources.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
117
|
+
return () => {
|
|
118
|
+
const at = _sources.indexOf(source);
|
|
119
|
+
if (at >= 0) _sources.splice(at, 1);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const EMPTY: readonly ComponentStatesSource[] = [];
|
|
124
|
+
|
|
125
|
+
/** Everything registered, in order. */
|
|
126
|
+
export function componentStatesSources(): readonly ComponentStatesSource[] {
|
|
127
|
+
return _sources.length === 0 ? EMPTY : _sources;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* THE ADAPTER'S `stories` MEMBER, bound over the registry — a thin binding an
|
|
132
|
+
* adapter constructs instead of constructing an implementation.
|
|
133
|
+
*
|
|
134
|
+
* `componentForNode` is the adapter's own semantic knowledge of what a node
|
|
135
|
+
* IS; everything past it is a registered source's. The FIRST source that names
|
|
136
|
+
* a state for a component owns that component, the way
|
|
137
|
+
* `contentEntryForComponent` takes the first source that admits one.
|
|
138
|
+
*/
|
|
139
|
+
export function componentStatesProvider(
|
|
140
|
+
surface: AdapterSurface,
|
|
141
|
+
store: EditorShellStore,
|
|
142
|
+
componentForNode: (nodeId: string) => ComponentStatesRef | null,
|
|
143
|
+
): StoriesProvider {
|
|
144
|
+
const activeByNode = new Map<string, string>();
|
|
145
|
+
const context: ComponentStatesContext = { surface, store };
|
|
146
|
+
|
|
147
|
+
/** The source that answers for this node, and what it answered. */
|
|
148
|
+
const resolve = (
|
|
149
|
+
nodeId: string,
|
|
150
|
+
): { source: ComponentStatesSource; states: readonly StoryRef[] } | null => {
|
|
151
|
+
const component = componentForNode(nodeId);
|
|
152
|
+
if (!component) return null;
|
|
153
|
+
for (const source of _sources) {
|
|
154
|
+
const states = source.statesFor(component, context);
|
|
155
|
+
if (states.length > 0) return { source, states };
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
storiesFor: (nodeId) => [...(resolve(nodeId)?.states ?? [])],
|
|
162
|
+
active: (nodeId) => activeByNode.get(nodeId) ?? null,
|
|
163
|
+
apply: (nodeId, stateId) => {
|
|
164
|
+
if (stateId === null) {
|
|
165
|
+
activeByNode.delete(nodeId);
|
|
166
|
+
store.notifyIngestEdit();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const answer = resolve(nodeId);
|
|
170
|
+
if (!answer?.states.some((state) => state.id === stateId)) {
|
|
171
|
+
editorConsole.warn(
|
|
172
|
+
`[component-states] stories.apply: state "${stateId}" does not belong to node ` +
|
|
173
|
+
`"${nodeId}" on the ${surface} surface — ignoring.`,
|
|
174
|
+
'authoring',
|
|
175
|
+
);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const component = componentForNode(nodeId);
|
|
179
|
+
if (!component) return;
|
|
180
|
+
activeByNode.set(nodeId, stateId);
|
|
181
|
+
answer.source.apply(component, stateId, context);
|
|
182
|
+
store.notifyIngestEdit();
|
|
183
|
+
},
|
|
184
|
+
// The distinction this member exists to draw: an empty list because this
|
|
185
|
+
// component has no states, and an empty list because nothing in this
|
|
186
|
+
// editor can read them, are different answers.
|
|
187
|
+
unavailable: () =>
|
|
188
|
+
_sources.length > 0
|
|
189
|
+
? null
|
|
190
|
+
: 'No package in this editor registered a source of component states, so this ' +
|
|
191
|
+
"component's named states could not be read. A build ships the packages its own " +
|
|
192
|
+
'entry in `builds/` lists.',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Test-only reset (mirrors the restore, open, chrome-slot, content-source,
|
|
197
|
+
* design-time-mount and component-board registries'). */
|
|
198
|
+
export function __resetComponentStatesSourcesForTest(): void {
|
|
199
|
+
_sources.length = 0;
|
|
200
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Agent presented this view" — published as a NOTIFICATION
|
|
3
|
+
* (`editor-notifications.ts`), with Copy Link and Return inline. It used to be
|
|
4
|
+
* a banner floated over the document's top centre, across the tab row; the
|
|
5
|
+
* owner named that shape as wrong (2026-09-04) and the notification stack is
|
|
6
|
+
* where an event like this goes. This component keeps no DOM: it watches the
|
|
7
|
+
* presentation-notice store and mirrors it into a card.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useEffect, useSyncExternalStore } from 'react';
|
|
11
|
+
import { editorConsole } from '../editor-console';
|
|
12
|
+
import { dismissNotification, notify } from '../editor-notifications';
|
|
13
|
+
import {
|
|
14
|
+
clearEditorPresentationNotice,
|
|
15
|
+
editorPresentationNotice,
|
|
16
|
+
editorPresentationNoticeVersion,
|
|
17
|
+
subscribeEditorPresentationNotice,
|
|
18
|
+
} from '../editor-presentation-notice';
|
|
19
|
+
import { useEditorStore } from '../editor-runtime';
|
|
20
|
+
import { presentEditorView } from '../editor-view-presentation';
|
|
21
|
+
|
|
22
|
+
const NOTIFICATION_ID = 'agent-presented-view';
|
|
23
|
+
|
|
24
|
+
export function AgentPresentationNotice() {
|
|
25
|
+
const store = useEditorStore();
|
|
26
|
+
useSyncExternalStore(
|
|
27
|
+
subscribeEditorPresentationNotice,
|
|
28
|
+
editorPresentationNoticeVersion,
|
|
29
|
+
editorPresentationNoticeVersion,
|
|
30
|
+
);
|
|
31
|
+
const notice = editorPresentationNotice();
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!notice) {
|
|
34
|
+
dismissNotification(NOTIFICATION_ID);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
notify({
|
|
38
|
+
id: NOTIFICATION_ID,
|
|
39
|
+
tone: 'info',
|
|
40
|
+
title: 'Agent presented this view.',
|
|
41
|
+
...(notice.presented.warnings.length > 0
|
|
42
|
+
? { detail: notice.presented.warnings.join(' ') }
|
|
43
|
+
: {}),
|
|
44
|
+
onDismiss: clearEditorPresentationNotice,
|
|
45
|
+
actions: [
|
|
46
|
+
{
|
|
47
|
+
label: 'Copy Link',
|
|
48
|
+
keeps: true,
|
|
49
|
+
run: () => {
|
|
50
|
+
void Promise.resolve()
|
|
51
|
+
.then(() => navigator.clipboard.writeText(notice.presented.url))
|
|
52
|
+
.catch(() => {
|
|
53
|
+
editorConsole.warn('Could not copy the view link to the clipboard.', 'editor');
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
label: 'Return',
|
|
59
|
+
primary: true,
|
|
60
|
+
run: () => {
|
|
61
|
+
void presentEditorView(store, notice.previousView, { origin: 'return' }).catch(
|
|
62
|
+
(error) => {
|
|
63
|
+
editorConsole.error(
|
|
64
|
+
`Could not return to the previous editor view: ${error instanceof Error ? error.message : String(error)}`,
|
|
65
|
+
'editor',
|
|
66
|
+
);
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
});
|
|
73
|
+
}, [notice, store]);
|
|
74
|
+
return null;
|
|
75
|
+
}
|