@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,253 @@
|
|
|
1
|
+
import { normalizeUiState, type SupercodeUiState } from '@volter-ai-dev/supercode-ui/core';
|
|
2
|
+
import type { RemoteUiFrame } from '@volter-ai-dev/supercode-ui/host';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Browser/server contract for the permanent coding-agent surface.
|
|
6
|
+
*
|
|
7
|
+
* Supercode owns harness, session, transcript, and runtime semantics. This
|
|
8
|
+
* wire mirrors its frontend state instead of inventing a second state
|
|
9
|
+
* machine; VGAI adds only editor-specific presentation and context.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type JsonValue =
|
|
13
|
+
| string
|
|
14
|
+
| number
|
|
15
|
+
| boolean
|
|
16
|
+
| null
|
|
17
|
+
| JsonValue[]
|
|
18
|
+
| { [key: string]: JsonValue };
|
|
19
|
+
|
|
20
|
+
export type HarnessChatMode = 'none' | 'observe' | 'control';
|
|
21
|
+
export type HarnessChatStatus = 'loading' | 'ready' | 'working' | 'error' | 'unavailable';
|
|
22
|
+
/** Mirrors Supercode's passive/handshake authentication posture exactly. */
|
|
23
|
+
export type HarnessChatAuthState = 'ready' | 'configured' | 'required' | 'unknown';
|
|
24
|
+
export type HarnessChatRuntimeState = 'ready' | 'degraded' | 'unavailable';
|
|
25
|
+
export type HarnessChatOperation =
|
|
26
|
+
| 'refresh'
|
|
27
|
+
| 'observe'
|
|
28
|
+
| 'start'
|
|
29
|
+
| 'resume'
|
|
30
|
+
| 'attach'
|
|
31
|
+
| 'fork'
|
|
32
|
+
| 'reduce'
|
|
33
|
+
| 'restore'
|
|
34
|
+
| 'detach'
|
|
35
|
+
| 'openTerminal'
|
|
36
|
+
| 'send'
|
|
37
|
+
| 'steer'
|
|
38
|
+
| 'interrupt'
|
|
39
|
+
| 'respond'
|
|
40
|
+
| 'configureHarness'
|
|
41
|
+
| 'loadEarlier'
|
|
42
|
+
| 'load'
|
|
43
|
+
| 'import'
|
|
44
|
+
| 'export'
|
|
45
|
+
| 'translate'
|
|
46
|
+
| 'handoff'
|
|
47
|
+
| 'workspace'
|
|
48
|
+
| 'close'
|
|
49
|
+
| null;
|
|
50
|
+
|
|
51
|
+
export interface HarnessChatCapabilities {
|
|
52
|
+
startSession: boolean;
|
|
53
|
+
resumeSession: boolean;
|
|
54
|
+
attachExistingProcess: boolean;
|
|
55
|
+
sendInput: boolean;
|
|
56
|
+
streamEvents: boolean;
|
|
57
|
+
interrupt: boolean;
|
|
58
|
+
respondToRequests: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface HarnessChatHarness {
|
|
62
|
+
id: string;
|
|
63
|
+
label: string;
|
|
64
|
+
installed: boolean;
|
|
65
|
+
auth: HarnessChatAuthState;
|
|
66
|
+
runtime: HarnessChatRuntimeState;
|
|
67
|
+
protocol: string;
|
|
68
|
+
capabilities: HarnessChatCapabilities;
|
|
69
|
+
availableActions: {
|
|
70
|
+
start: boolean;
|
|
71
|
+
resume: boolean;
|
|
72
|
+
attach: boolean;
|
|
73
|
+
send: boolean;
|
|
74
|
+
interrupt: boolean;
|
|
75
|
+
respond: boolean;
|
|
76
|
+
};
|
|
77
|
+
reason: string | null;
|
|
78
|
+
repair: string | null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface HarnessChatSession {
|
|
82
|
+
/** Opaque, controller-scoped key used by actions. */
|
|
83
|
+
id: string;
|
|
84
|
+
/** Stable, non-display identity used only to restore this exact selection. */
|
|
85
|
+
identity: string;
|
|
86
|
+
/** Harness-native identity, display/diagnostics only. */
|
|
87
|
+
nativeId?: string;
|
|
88
|
+
harness: string;
|
|
89
|
+
title: string;
|
|
90
|
+
cwd: string | null;
|
|
91
|
+
updatedAt: number | null;
|
|
92
|
+
messageCount: number | null;
|
|
93
|
+
model: string | null;
|
|
94
|
+
storage: 'file' | 'sqlite';
|
|
95
|
+
/** What the session's process reports for itself RIGHT NOW — a live
|
|
96
|
+
* peer's status — or `null` for a persisted session with no process. */
|
|
97
|
+
live?: 'running' | 'busy' | 'idle' | null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface HarnessChatTaskPlanItem {
|
|
101
|
+
id: string;
|
|
102
|
+
title: string;
|
|
103
|
+
status: 'pending' | 'in_progress' | 'completed' | 'cancelled' | 'unknown';
|
|
104
|
+
nativeStatus?: string;
|
|
105
|
+
blockedBy?: string[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface HarnessChatTaskPlan {
|
|
109
|
+
source: 'codex-update-plan' | 'claude-tasks' | 'opencode-todos' | 'none';
|
|
110
|
+
items: HarnessChatTaskPlanItem[];
|
|
111
|
+
residue: unknown[];
|
|
112
|
+
observedAt: number | null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface HarnessChatRequestOption {
|
|
116
|
+
optionId: string;
|
|
117
|
+
name: string;
|
|
118
|
+
kind: 'allow_once' | 'allow_always' | 'reject_once' | 'reject_always' | 'other';
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface HarnessChatRequestEntry {
|
|
122
|
+
id: string;
|
|
123
|
+
kind: 'request';
|
|
124
|
+
requestId: JsonValue;
|
|
125
|
+
requestKind: string;
|
|
126
|
+
payload: JsonValue;
|
|
127
|
+
options: HarnessChatRequestOption[];
|
|
128
|
+
cancellable: boolean;
|
|
129
|
+
status: 'pending' | 'responded';
|
|
130
|
+
resolution: { optionId: string | null; name: string; kind: string } | null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface HarnessChatAvailableActions {
|
|
134
|
+
refresh: boolean;
|
|
135
|
+
observe: boolean;
|
|
136
|
+
start: boolean;
|
|
137
|
+
resume: boolean;
|
|
138
|
+
attach: boolean;
|
|
139
|
+
fork: boolean;
|
|
140
|
+
detach: boolean;
|
|
141
|
+
openTerminal: boolean;
|
|
142
|
+
send: boolean;
|
|
143
|
+
interrupt: boolean;
|
|
144
|
+
respond: boolean;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface HarnessChatError {
|
|
148
|
+
code: string;
|
|
149
|
+
message: string;
|
|
150
|
+
operation: Exclude<HarnessChatOperation, null> | 'runtime' | 'follow';
|
|
151
|
+
recoverable: boolean;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface HarnessChatSnapshot {
|
|
155
|
+
schema: 'vgai.harness-chat.v4';
|
|
156
|
+
/** Identifies the editor-server process that issued this snapshot. */
|
|
157
|
+
serverInstanceId: string | null;
|
|
158
|
+
revision: number;
|
|
159
|
+
/** Monotonic host generation. Revisions are only comparable within it. */
|
|
160
|
+
workspaceGeneration: number;
|
|
161
|
+
workspace: string | null;
|
|
162
|
+
status: HarnessChatStatus;
|
|
163
|
+
mode: HarnessChatMode;
|
|
164
|
+
operation: HarnessChatOperation;
|
|
165
|
+
harnesses: HarnessChatHarness[];
|
|
166
|
+
sessions: HarnessChatSession[];
|
|
167
|
+
activeHarness: string | null;
|
|
168
|
+
activeSessionId: string | null;
|
|
169
|
+
connection: {
|
|
170
|
+
strategy: 'start' | 'resume' | 'attach' | 'fork' | 'reduce' | null;
|
|
171
|
+
follow: 'inactive' | 'following' | 'retrying';
|
|
172
|
+
ownsRuntime: boolean;
|
|
173
|
+
};
|
|
174
|
+
turn: {
|
|
175
|
+
state: 'idle' | 'running' | 'interrupting' | 'reconciling';
|
|
176
|
+
id: string | null;
|
|
177
|
+
startedAt: number | null;
|
|
178
|
+
};
|
|
179
|
+
/** Ordered Supercode host frame. This is the sole messenger lifecycle authority. */
|
|
180
|
+
frame: RemoteUiFrame | null;
|
|
181
|
+
taskPlan: HarnessChatTaskPlan;
|
|
182
|
+
requests: HarnessChatRequestEntry[];
|
|
183
|
+
availableActions: HarnessChatAvailableActions;
|
|
184
|
+
error: HarnessChatError | null;
|
|
185
|
+
terminalCommand: string | null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** VGAI's one editor-host extension. Every reusable messenger mutation uses
|
|
189
|
+
* SupercodeUiIntent unchanged through the intent route. */
|
|
190
|
+
export type HarnessChatHostAction = {
|
|
191
|
+
type: 'restore';
|
|
192
|
+
sessionIdentity: string;
|
|
193
|
+
connection: 'observe' | 'attach';
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/** Read the sole canonical messenger projection. A frame-less loading/error
|
|
197
|
+
* snapshot gets a local empty view; it is never serialized as a second state. */
|
|
198
|
+
export function harnessChatUiState(snapshot: HarnessChatSnapshot): SupercodeUiState {
|
|
199
|
+
if (snapshot.frame) return snapshot.frame.state;
|
|
200
|
+
return normalizeUiState({
|
|
201
|
+
startup: snapshot.status === 'loading' ? 'connecting' : 'ready',
|
|
202
|
+
workspace: snapshot.workspace ?? '',
|
|
203
|
+
error: snapshot.error?.message ?? null,
|
|
204
|
+
recoverable: snapshot.error?.recoverable ?? true,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function unavailableHarnessChatSnapshot(
|
|
209
|
+
error: string,
|
|
210
|
+
options?: { code?: string; recoverable?: boolean },
|
|
211
|
+
): HarnessChatSnapshot {
|
|
212
|
+
return {
|
|
213
|
+
schema: 'vgai.harness-chat.v4',
|
|
214
|
+
serverInstanceId: null,
|
|
215
|
+
revision: 0,
|
|
216
|
+
workspaceGeneration: 0,
|
|
217
|
+
workspace: null,
|
|
218
|
+
status: 'unavailable',
|
|
219
|
+
mode: 'none',
|
|
220
|
+
operation: null,
|
|
221
|
+
harnesses: [],
|
|
222
|
+
sessions: [],
|
|
223
|
+
activeHarness: null,
|
|
224
|
+
activeSessionId: null,
|
|
225
|
+
connection: { strategy: null, follow: 'inactive', ownsRuntime: false },
|
|
226
|
+
turn: { state: 'idle', id: null, startedAt: null },
|
|
227
|
+
frame: null,
|
|
228
|
+
taskPlan: { source: 'none', items: [], residue: [], observedAt: null },
|
|
229
|
+
requests: [],
|
|
230
|
+
availableActions: {
|
|
231
|
+
refresh: false,
|
|
232
|
+
observe: false,
|
|
233
|
+
start: false,
|
|
234
|
+
resume: false,
|
|
235
|
+
attach: false,
|
|
236
|
+
fork: false,
|
|
237
|
+
detach: false,
|
|
238
|
+
openTerminal: false,
|
|
239
|
+
send: false,
|
|
240
|
+
interrupt: false,
|
|
241
|
+
respond: false,
|
|
242
|
+
},
|
|
243
|
+
error: error
|
|
244
|
+
? {
|
|
245
|
+
code: options?.code ?? 'unavailable',
|
|
246
|
+
message: error,
|
|
247
|
+
operation: 'load',
|
|
248
|
+
recoverable: options?.recoverable ?? true,
|
|
249
|
+
}
|
|
250
|
+
: null,
|
|
251
|
+
terminalCommand: null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panel's half of the hierarchy-presentation convention
|
|
3
|
+
* (`@volter/editor-threejs/adapter/hierarchy-marks`): a game classifies its
|
|
4
|
+
* component-instance roots and its implementation subtrees on the LIVE nodes,
|
|
5
|
+
* and this turns that classification into rows.
|
|
6
|
+
*
|
|
7
|
+
* CLASSIFICATION ONLY — NEVER FABRICATED STRUCTURE. Nothing here invents a
|
|
8
|
+
* parent. Where a node belongs is the TREE's answer, and a world whose tree
|
|
9
|
+
* disagrees with its own ownership is fixed in the world (three's
|
|
10
|
+
* `matrixWorldAutoUpdate = false` keeps a transform-independent object parented
|
|
11
|
+
* where it belongs), not papered over here. What this module decides is
|
|
12
|
+
* narrower and entirely presentational: which rows are the game and which are
|
|
13
|
+
* the implementation underneath it, and — since an implementation node may sit
|
|
14
|
+
* BETWEEN two things that are the game — where a row's nearest visible ancestor
|
|
15
|
+
* is. See {@link componentMarkView} point 5, promotion.
|
|
16
|
+
*
|
|
17
|
+
* WHY THIS IS A DECORATOR AND NOT A SECOND ROW PIPELINE. Exactly the reason
|
|
18
|
+
* `hierarchy-internals.ts` gives for reveal: the panel's cap, collapse, search,
|
|
19
|
+
* selection-reveal and virtualization all layer on ONE flatten of ONE
|
|
20
|
+
* `HierarchyProvider`. A marked tree composes by handing that flattener a
|
|
21
|
+
* richer provider — never by forking the walk. And it composes with reveal
|
|
22
|
+
* specifically by producing an {@link InternalsSource}: built-internals become
|
|
23
|
+
* internals of exactly the kind "Reveal Internals" already shows, so the
|
|
24
|
+
* read-only rule, the search exclusion and the drag refusal that already govern
|
|
25
|
+
* a revealed row govern these with no second policy.
|
|
26
|
+
*
|
|
27
|
+
* THE NO-MARKS FALLBACK IS IDENTITY, BY CONSTRUCTION. Every projection below
|
|
28
|
+
* short-circuits when a node carries no mark and no child carries one, and
|
|
29
|
+
* {@link componentMarkView} returns the source's own `hierarchy` object when the
|
|
30
|
+
* tree cannot carry marks at all (an adapter with no `Object3D` seam — React,
|
|
31
|
+
* Pixi, DOM). A world that adopts nothing renders exactly as it did.
|
|
32
|
+
*
|
|
33
|
+
* PURE ON PURPOSE: the marks arrive through the injected {@link NodeMarkReader},
|
|
34
|
+
* never by importing three or touching `userData` here, so the whole row
|
|
35
|
+
* decision is unit-testable with plain objects.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import type { EditorNode, HierarchyProvider } from '@volter/editor-project/adapter';
|
|
39
|
+
import type { InternalsSource } from './hierarchy-internals';
|
|
40
|
+
import type { HierarchyNodeRow } from './hierarchy-node-rows';
|
|
41
|
+
|
|
42
|
+
/** What the marks say about ONE node. Both absent is the ordinary node. */
|
|
43
|
+
export interface NodeMarks {
|
|
44
|
+
/** `vgaiComponentRoot` — the component name this node is one instance of. */
|
|
45
|
+
readonly componentRoot?: string | undefined;
|
|
46
|
+
/** A native authoring entity constructor. It stays an ordinary entity row, but like a
|
|
47
|
+
* component root it is authored content even when a host implementation node wraps it. */
|
|
48
|
+
readonly authoredEntity?: boolean | undefined;
|
|
49
|
+
/** `vgaiBuiltInternal` — this node is the root of an implementation subtree. */
|
|
50
|
+
readonly builtInternal?: boolean | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Reads the marks off one node id. `undefined` for an id the source has no
|
|
54
|
+
* live object for — indistinguishable from an unmarked node, deliberately. */
|
|
55
|
+
export type NodeMarkReader = (id: string) => NodeMarks | undefined;
|
|
56
|
+
|
|
57
|
+
/** The hierarchy half of an adapter, plus whatever internals capability it
|
|
58
|
+
* already had. Structurally satisfied by `AuthoringAdapter` /
|
|
59
|
+
* `CompositeAuthoringAdapter` without importing either — the same contract-only
|
|
60
|
+
* probe shape `hierarchy-internals.ts` and `hierarchy-row-model.ts` use. */
|
|
61
|
+
export interface MarkedTreeSource {
|
|
62
|
+
readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
|
|
63
|
+
readonly hasInternals?: ((id: string) => boolean) | undefined;
|
|
64
|
+
readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface MarkedTreeView extends InternalsSource {
|
|
68
|
+
/** True for a node whose live object carries `vgaiComponentRoot`. */
|
|
69
|
+
isComponentRoot(id: string): boolean;
|
|
70
|
+
/** True for a node that is, or descends from, a `vgaiBuiltInternal` root.
|
|
71
|
+
* Exposed for tests and for {@link componentMarkView}'s own reuse; the panel
|
|
72
|
+
* reads internal-ness off the reveal projection, which is the union of these
|
|
73
|
+
* and the adapter's own hidden children. */
|
|
74
|
+
isBuiltInternal(id: string): boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Depth backstop for a pathological live tree — the same belt-and-braces
|
|
78
|
+
* constant `hierarchy-internals.ts`/`hierarchy-node-rows.ts` keep. */
|
|
79
|
+
const MAX_DEPTH = 500;
|
|
80
|
+
|
|
81
|
+
/** The reader for a surface that has no node to read marks off. Identity-checked
|
|
82
|
+
* by {@link componentMarkView}, which is why it is a shared constant rather
|
|
83
|
+
* than a fresh closure per call. */
|
|
84
|
+
export const NO_MARKS: NodeMarkReader = () => undefined;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Decorate `source` so the marks become rows.
|
|
88
|
+
*
|
|
89
|
+
* Five things change, and nothing else:
|
|
90
|
+
*
|
|
91
|
+
* 1. A marked component root reports `role: 'component'` and
|
|
92
|
+
* `typeLabel: <mark name>`. That is all the panel needs — `rowIdentity`
|
|
93
|
+
* already prints `Coin1 ·Coin` for exactly this pair, and `ROLE_ICON`
|
|
94
|
+
* already has the component glyph. NO new presentation vocabulary: a second
|
|
95
|
+
* way to render "this is an instance" is how two of them drift.
|
|
96
|
+
* The mark REPLACES any `typeLabel` the adapter had, because a three
|
|
97
|
+
* projection reports the native class there (`Object3D`), and
|
|
98
|
+
* `Coin1 ·Object3D` is worse than no suffix at all.
|
|
99
|
+
* 2. Built-internal children disappear from every `childIds`, so what a
|
|
100
|
+
* collapsed tree shows is the game and not its implementation.
|
|
101
|
+
* 3. A built-internal ROOT disappears from `roots()` for the same reason, but
|
|
102
|
+
* meaningful content beneath it is promoted to roots in place. A root has
|
|
103
|
+
* no parent row to reveal it under, so the implementation wrapper itself
|
|
104
|
+
* stays unreachable while spawned content remains visible.
|
|
105
|
+
* 4. Both come back through `internalChildren`/`hasInternals` — unioned with
|
|
106
|
+
* whatever the adapter already hid — so "Reveal Internals" shows them,
|
|
107
|
+
* read-only, under their real parent, in the true chain.
|
|
108
|
+
* 5. PROMOTION. A component instance does not lose its row because
|
|
109
|
+
* implementation nodes sit between it and its owner. A weapon prefab
|
|
110
|
+
* attached to a hand bone, a nameplate on a head bone: content the author
|
|
111
|
+
* placed, inside a subtree a rig builder marked. `vgaiComponentRoot` beats
|
|
112
|
+
* `vgaiBuiltInternal` (see `isBuiltInternal`'s climb), and this lists such a
|
|
113
|
+
* row under its nearest VISIBLE ancestor — so a prefab reads as the parent
|
|
114
|
+
* of everything meaningful beneath it, however many bones the rig hangs in
|
|
115
|
+
* between. A subtree with no instance inside it still folds away whole,
|
|
116
|
+
* because there is nothing in it to promote. This is the elision half of the
|
|
117
|
+
* same classification: (2) removes an implementation row, (5) keeps what was
|
|
118
|
+
* under it from going with it.
|
|
119
|
+
*
|
|
120
|
+
* Built-internal is SUBTREE-scoped (see the engine module's header): a node
|
|
121
|
+
* whose ANCESTOR is marked is internal too, which is what lets a rig cost one
|
|
122
|
+
* mark. {@link MarkedTreeView.isBuiltInternal} memoizes that climb, so a
|
|
123
|
+
* repeated walk over the same tree pays once per node.
|
|
124
|
+
*/
|
|
125
|
+
export function componentMarkView(
|
|
126
|
+
source: MarkedTreeSource,
|
|
127
|
+
marksOf: NodeMarkReader,
|
|
128
|
+
): MarkedTreeView {
|
|
129
|
+
if (marksOf === NO_MARKS) {
|
|
130
|
+
// A surface with no `Object3D` seam (React, Pixi, DOM) cannot carry these
|
|
131
|
+
// marks at all. Hand back the source itself so the panel's provider is
|
|
132
|
+
// IDENTICAL, not merely equivalent.
|
|
133
|
+
return {
|
|
134
|
+
hierarchy: source.hierarchy,
|
|
135
|
+
isComponentRoot: () => false,
|
|
136
|
+
isBuiltInternal: () => false,
|
|
137
|
+
...(source.hasInternals ? { hasInternals: (id: string) => source.hasInternals!(id) } : {}),
|
|
138
|
+
...(source.internalChildren
|
|
139
|
+
? { internalChildren: (id: string) => source.internalChildren!(id) }
|
|
140
|
+
: {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** id -> "this node is inside a built subtree", memoized across the walk. */
|
|
145
|
+
const internalCache = new Map<string, boolean>();
|
|
146
|
+
|
|
147
|
+
const isBuiltInternal = (id: string): boolean => {
|
|
148
|
+
const cached = internalCache.get(id);
|
|
149
|
+
if (cached !== undefined) return cached;
|
|
150
|
+
// Climb to the first answer we already have (or to a root), then fill the
|
|
151
|
+
// whole chain in one pass — an ancestor walk per node would be O(depth²).
|
|
152
|
+
const chain: string[] = [];
|
|
153
|
+
let cursor: string | null = id;
|
|
154
|
+
let inherited = false;
|
|
155
|
+
let guard = 0;
|
|
156
|
+
while (cursor !== null && guard++ < MAX_DEPTH) {
|
|
157
|
+
const known = internalCache.get(cursor);
|
|
158
|
+
if (known !== undefined) {
|
|
159
|
+
inherited = known;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
chain.push(cursor);
|
|
163
|
+
// PRECEDENCE: an explicit component root is content even inside an
|
|
164
|
+
// implementation subtree. Otherwise an explicit implementation mark on
|
|
165
|
+
// THIS node wins over the automatic authored-entity stamp: generated
|
|
166
|
+
// native machinery is still source-addressable JSX, but its attach seam
|
|
167
|
+
// knows that it is implementation. An authored entity with no such mark
|
|
168
|
+
// remains content inside an implementation ancestor — a weapon attached
|
|
169
|
+
// to a rig bone, for example — which is what makes promotion (see
|
|
170
|
+
// `visibleChildIds`) reachable at all.
|
|
171
|
+
const marks = marksOf(cursor);
|
|
172
|
+
if (marks?.componentRoot !== undefined) break;
|
|
173
|
+
if (marks?.builtInternal === true) {
|
|
174
|
+
inherited = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
if (marks?.authoredEntity === true) break;
|
|
178
|
+
cursor = source.hierarchy.node(cursor)?.parentId ?? null;
|
|
179
|
+
}
|
|
180
|
+
// `chain` is innermost-first and every entry shares the verdict of the node
|
|
181
|
+
// that stopped the climb — either an already-known ancestor, or the marked
|
|
182
|
+
// node itself (which is the last entry pushed).
|
|
183
|
+
for (const entry of chain) internalCache.set(entry, inherited);
|
|
184
|
+
return inherited;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const isComponentRoot = (id: string): boolean => marksOf(id)?.componentRoot !== undefined;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The rows that belong directly under `node` — its own visible children,
|
|
191
|
+
* plus (point 5) the visible descendants that implementation children stand
|
|
192
|
+
* between. Recursive: an implementation node contributes ITS promoted rows in
|
|
193
|
+
* its own place, so a two-deep chain of them elides just as one does, and a
|
|
194
|
+
* subtree with nothing visible in it contributes nothing at all.
|
|
195
|
+
*/
|
|
196
|
+
const visibleChildIds = (node: EditorNode, depth = 0): string[] => {
|
|
197
|
+
if (depth > MAX_DEPTH) return [];
|
|
198
|
+
const out: string[] = [];
|
|
199
|
+
for (const childId of node.childIds) {
|
|
200
|
+
if (!isBuiltInternal(childId)) {
|
|
201
|
+
out.push(childId);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const child = source.hierarchy.node(childId);
|
|
205
|
+
if (child) out.push(...visibleChildIds(child, depth + 1));
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/** The children of `id` this view hides — its DIRECT implementation children,
|
|
211
|
+
* which is what "Reveal Internals" puts back and where the true chain lives. */
|
|
212
|
+
const hiddenChildIds = (node: EditorNode): string[] =>
|
|
213
|
+
node.childIds.filter((childId) => isBuiltInternal(childId));
|
|
214
|
+
|
|
215
|
+
const project = (node: EditorNode | null): EditorNode | null => {
|
|
216
|
+
if (!node) return null;
|
|
217
|
+
const componentRoot = marksOf(node.id)?.componentRoot;
|
|
218
|
+
const childIds = visibleChildIds(node);
|
|
219
|
+
const sameChildren =
|
|
220
|
+
childIds.length === node.childIds.length &&
|
|
221
|
+
childIds.every((childId, index) => childId === node.childIds[index]);
|
|
222
|
+
if (componentRoot === undefined && sameChildren) return node;
|
|
223
|
+
return {
|
|
224
|
+
...node,
|
|
225
|
+
...(componentRoot === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { role: 'component' as const, typeLabel: componentRoot }),
|
|
228
|
+
...(sameChildren ? {} : { childIds }),
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const hierarchy: Pick<HierarchyProvider, 'roots' | 'node'> = {
|
|
233
|
+
roots: () =>
|
|
234
|
+
source.hierarchy.roots().flatMap((root) => {
|
|
235
|
+
if (!isBuiltInternal(root.id)) return [project(root)!];
|
|
236
|
+
return visibleChildIds(root).flatMap((childId) => {
|
|
237
|
+
const child = project(source.hierarchy.node(childId));
|
|
238
|
+
return child ? [{ ...child, parentId: root.parentId }] : [];
|
|
239
|
+
});
|
|
240
|
+
}),
|
|
241
|
+
node: (id) => project(source.hierarchy.node(id)),
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
hierarchy,
|
|
246
|
+
isComponentRoot,
|
|
247
|
+
isBuiltInternal,
|
|
248
|
+
hasInternals: (id) => {
|
|
249
|
+
if (source.hasInternals?.(id) === true) return true;
|
|
250
|
+
const node = source.hierarchy.node(id);
|
|
251
|
+
return node ? hiddenChildIds(node).length > 0 : false;
|
|
252
|
+
},
|
|
253
|
+
internalChildren: (id) => {
|
|
254
|
+
const own = source.internalChildren?.(id);
|
|
255
|
+
const node = source.hierarchy.node(id);
|
|
256
|
+
const hidden = node
|
|
257
|
+
? hiddenChildIds(node).flatMap((childId) => {
|
|
258
|
+
// PROJECTED, not raw: this node's own implementation children are
|
|
259
|
+
// hidden from its `childIds` here too, and the reveal walk appends
|
|
260
|
+
// them back itself. Handing back the raw node would list every
|
|
261
|
+
// sub-bone twice. Reveal therefore shows the TRUE chain of
|
|
262
|
+
// implementation nodes — each under its real parent, one level per
|
|
263
|
+
// walk step — which is what the action is for.
|
|
264
|
+
const child = project(source.hierarchy.node(childId));
|
|
265
|
+
// Re-parented to `id` — a revealed subtree is displayed as the tree
|
|
266
|
+
// it literally is, the same rule `internalChildren` states on the
|
|
267
|
+
// source adapter.
|
|
268
|
+
return child ? [{ ...child, parentId: id }] : [];
|
|
269
|
+
})
|
|
270
|
+
: [];
|
|
271
|
+
if (own === undefined) return hidden.length > 0 ? hidden : undefined;
|
|
272
|
+
return [...own, ...hidden];
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* A marked component instance opens CLOSED. This is a default, applied on top
|
|
279
|
+
* of `defaultExpansionByNode`'s shape rule and under the author's own session /
|
|
280
|
+
* persisted preference — so "expandable on demand" is the panel's existing
|
|
281
|
+
* expansion state doing its existing job, and an instance the author opened
|
|
282
|
+
* stays open across renders.
|
|
283
|
+
*
|
|
284
|
+
* Takes the already-flattened structural rows rather than walking the tree
|
|
285
|
+
* again: the panel has them, and a second walk over a live graph is the cost
|
|
286
|
+
* this whole cycle exists to remove.
|
|
287
|
+
*/
|
|
288
|
+
export function applyComponentRootExpansionDefaults(
|
|
289
|
+
defaults: Map<string, boolean>,
|
|
290
|
+
rows: readonly HierarchyNodeRow[],
|
|
291
|
+
isComponentRoot: (id: string) => boolean,
|
|
292
|
+
): Map<string, boolean> {
|
|
293
|
+
for (const row of rows) {
|
|
294
|
+
if (row.more) continue;
|
|
295
|
+
if (isComponentRoot(row.node.id)) defaults.set(row.node.id, false);
|
|
296
|
+
}
|
|
297
|
+
return defaults;
|
|
298
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-world drop validity for the hierarchy shell (spec 29 §3): edge
|
|
3
|
+
* semantics belong to the kind, so `CompositeAuthoringAdapter`'s structure
|
|
4
|
+
* provider REFUSES cross-world reparents (loud warn + no-op) and cross-world
|
|
5
|
+
* reorder anchors. A drop the adapter will refuse must never LOOK valid in the
|
|
6
|
+
* panel — chrome advertising an operation that will be refused is a false
|
|
7
|
+
* claim — so `GameHierarchy`'s dragover path gates the drop indicator on this
|
|
8
|
+
* predicate instead of letting the drop fall through to the adapter's refusal.
|
|
9
|
+
*
|
|
10
|
+
* Rule zero: roots are resolved by ASKING the composite (`groupNodeId`/
|
|
11
|
+
* `ownerOf`), never by decoding adapter-minted id strings here.
|
|
12
|
+
*/
|
|
13
|
+
import type { AuthoringAdapter } from '@volter/editor-project/adapter';
|
|
14
|
+
import { CompositeAuthoringAdapter } from './authoring/composite-authoring-adapter';
|
|
15
|
+
|
|
16
|
+
/** The world that owns `nodeId` for drop purposes: the owning child's
|
|
17
|
+
* `worldId` for an ordinary row, the world itself for its synthetic
|
|
18
|
+
* `world:<id>` group row (dropping INTO a world's own group row is
|
|
19
|
+
* "become a root of my world" — valid), `null` for an organizational or
|
|
20
|
+
* unrecognized id
|
|
21
|
+
* no child recognizes. */
|
|
22
|
+
function dropRootOf(composite: CompositeAuthoringAdapter, nodeId: string): string | null {
|
|
23
|
+
for (const child of composite.childAdapters()) {
|
|
24
|
+
if (composite.groupNodeId(child.worldId) === nodeId) return child.worldId;
|
|
25
|
+
}
|
|
26
|
+
return composite.ownerOf(nodeId);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* True when reparenting/reordering `dragIds` at row `targetId` will be
|
|
31
|
+
* accepted by the active adapter's structure provider: the adapter is not a
|
|
32
|
+
* composite (a bare adapter is single-world by construction), or EVERY
|
|
33
|
+
* dragged id and the target row live in the same world. A mixed-world
|
|
34
|
+
* multi-select fails as a whole — the alternative is a drop that half-applies
|
|
35
|
+
* (same-world ids move, foreign ids warn), which is worse than refusing the
|
|
36
|
+
* affordance outright. Group-row / organizational drag ids fail the same way
|
|
37
|
+
* (`ownerOf` → null): roots are reordered through their zOrder, not by
|
|
38
|
+
* dragging one into another's subtree.
|
|
39
|
+
*/
|
|
40
|
+
export function isSameRootDrop(
|
|
41
|
+
adapter: AuthoringAdapter,
|
|
42
|
+
dragIds: string[],
|
|
43
|
+
targetId: string,
|
|
44
|
+
): boolean {
|
|
45
|
+
if (!(adapter instanceof CompositeAuthoringAdapter)) return true;
|
|
46
|
+
const targetWorld = dropRootOf(adapter, targetId);
|
|
47
|
+
if (targetWorld === null) return false;
|
|
48
|
+
return dragIds.every((id) => adapter.ownerOf(id) === targetWorld);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ------------------------------------------------------- refusal, by name
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A DEAD DRAG IS A BUG. Everything above answers "may the indicator show"; the
|
|
55
|
+
* two predicates below answer the question the owner actually hit on a
|
|
56
|
+
* translated port — *the row let me drag it, the drop did nothing, and nothing
|
|
57
|
+
* said why*. A refusal the panel cannot explain is indistinguishable from a
|
|
58
|
+
* broken editor, so every path that suppresses the indicator now carries the
|
|
59
|
+
* sentence that goes with it.
|
|
60
|
+
*
|
|
61
|
+
* The sentences are STRUCTURAL, not per-world prose: each names a fact about
|
|
62
|
+
* the row or the adapter that is true for every game in that state. Where an
|
|
63
|
+
* adapter has its own sentence for a refusal (`TransformProvider.editability`'s
|
|
64
|
+
* `reason`), that one is canonical and this module never paraphrases it — these
|
|
65
|
+
* two cases have no adapter-side reason to forward, because the capability is
|
|
66
|
+
* absent rather than declined.
|
|
67
|
+
*/
|
|
68
|
+
export const NO_STRUCTURE_WRITE_REFUSAL =
|
|
69
|
+
"This world's structure comes from its own source, which the editor can't rewrite here — reparenting is not wired for it.";
|
|
70
|
+
|
|
71
|
+
export const INTERNAL_TARGET_REFUSAL =
|
|
72
|
+
"That row is part of a component instance's own output, not authored content. Drop onto the instance itself to place relative to it.";
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Why this drop will do nothing, or `null` when it will work.
|
|
76
|
+
*
|
|
77
|
+
* Order matters and is the honest one: an adapter that cannot reparent AT ALL
|
|
78
|
+
* refuses first, because "expand the instance instead" would be advice that
|
|
79
|
+
* also fails. Pure — the caller resolves both facts from the adapter and the
|
|
80
|
+
* reveal projection it already has.
|
|
81
|
+
*/
|
|
82
|
+
export function hierarchyDropRefusal(input: {
|
|
83
|
+
/** The active adapter exposes a `structure` provider (reparent/reorder). */
|
|
84
|
+
readonly hasStructureWritePath: boolean;
|
|
85
|
+
/** The hovered row exists only because a component's internals were revealed. */
|
|
86
|
+
readonly targetIsInternal: boolean;
|
|
87
|
+
}): string | null {
|
|
88
|
+
if (!input.hasStructureWritePath) return NO_STRUCTURE_WRITE_REFUSAL;
|
|
89
|
+
if (input.targetIsInternal) return INTERNAL_TARGET_REFUSAL;
|
|
90
|
+
return null;
|
|
91
|
+
}
|