@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,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CONTRIBUTED CHROME — the registry behind `@volter/editor-sdk/chrome`: the
|
|
3
|
+
* palette actions, application-menu items and header items a package
|
|
4
|
+
* contributes.
|
|
5
|
+
*
|
|
6
|
+
* WHO READS IT, measured rather than assumed: `palette-action-publisher.tsx`
|
|
7
|
+
* takes {@link contributedActions} into the table the frame registers as
|
|
8
|
+
* `MenuId.CommandPalette` items (so ⌘⇧P lists a package's actions with its own
|
|
9
|
+
* labels); `components/ApplicationMenus.tsx` appends
|
|
10
|
+
* {@link contributedMenuItems} per menu id; `components/ProjectHeader.tsx` and
|
|
11
|
+
* `components/Object3DDocumentToolbar.tsx` draw {@link contributedHeaderItems}
|
|
12
|
+
* in the title bar and the document's own strip; `tool-loader.ts` registers
|
|
13
|
+
* what a package declares. Ids are namespaced `tool:` so they never collide
|
|
14
|
+
* with the host's.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
ActionContribution,
|
|
19
|
+
ContributableMenu,
|
|
20
|
+
ContributedAction,
|
|
21
|
+
ContributedMenuItem,
|
|
22
|
+
DocumentHeaderItemProps,
|
|
23
|
+
HeaderPlacement,
|
|
24
|
+
MenuContribution,
|
|
25
|
+
} from '@volter/editor-sdk/chrome';
|
|
26
|
+
import type { ComponentType } from 'react';
|
|
27
|
+
|
|
28
|
+
const CONTRIBUTABLE_MENUS: readonly ContributableMenu[] = [
|
|
29
|
+
'asset',
|
|
30
|
+
'view',
|
|
31
|
+
'window',
|
|
32
|
+
'debug',
|
|
33
|
+
'tools',
|
|
34
|
+
'help',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export interface ContributedHeaderItem {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly order: number;
|
|
40
|
+
readonly placement: HeaderPlacement;
|
|
41
|
+
readonly Component: ComponentType<DocumentHeaderItemProps>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let headerItems: ContributedHeaderItem[] = [];
|
|
45
|
+
let actionRegistrations: readonly ActionContribution[] = [];
|
|
46
|
+
let menuItems: Array<{ menu: ContributableMenu; item: ContributedMenuItem }> = [];
|
|
47
|
+
let version = 0;
|
|
48
|
+
const listeners = new Set<() => void>();
|
|
49
|
+
function notify(): void {
|
|
50
|
+
version++;
|
|
51
|
+
for (const listener of listeners) listener();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function subscribeContributedChrome(listener: () => void): () => void {
|
|
55
|
+
listeners.add(listener);
|
|
56
|
+
return () => listeners.delete(listener);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function contributedChromeVersion(): number {
|
|
60
|
+
return version;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Header items in `order`, ties by registration. */
|
|
64
|
+
export function contributedHeaderItems(
|
|
65
|
+
placement: HeaderPlacement = 'transport',
|
|
66
|
+
): readonly ContributedHeaderItem[] {
|
|
67
|
+
return headerItems
|
|
68
|
+
.filter((item) => item.placement === placement)
|
|
69
|
+
.sort((a, b) => a.order - b.order);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Register one header item (`.header.tsx`, `tool:<id>`). Returns the unregister. */
|
|
73
|
+
export function registerContributedHeaderItem(item: ContributedHeaderItem): () => void {
|
|
74
|
+
if (headerItems.some((existing) => existing.id === item.id))
|
|
75
|
+
throw new Error(`header item "${item.id}" is already contributed.`);
|
|
76
|
+
headerItems = [...headerItems, item];
|
|
77
|
+
notify();
|
|
78
|
+
return () => {
|
|
79
|
+
headerItems = headerItems.filter((existing) => existing !== item);
|
|
80
|
+
notify();
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function contributedActions(): readonly ContributedAction[] {
|
|
85
|
+
const seen = new Set<string>();
|
|
86
|
+
const out: ContributedAction[] = [];
|
|
87
|
+
for (const registration of actionRegistrations) {
|
|
88
|
+
const list =
|
|
89
|
+
typeof registration.actions === 'function' ? registration.actions() : registration.actions;
|
|
90
|
+
for (const action of list) {
|
|
91
|
+
const id = `tool:${action.id}`;
|
|
92
|
+
// A live set may repeat a static id across its own reads; first wins.
|
|
93
|
+
if (seen.has(id)) continue;
|
|
94
|
+
seen.add(id);
|
|
95
|
+
out.push({ ...action, id });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function contributedMenuItems(menu: ContributableMenu): readonly ContributedMenuItem[] {
|
|
102
|
+
return menuItems.filter((entry) => entry.menu === menu).map((entry) => entry.item);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function isContributableMenu(value: unknown): value is ContributableMenu {
|
|
106
|
+
return typeof value === 'string' && (CONTRIBUTABLE_MENUS as readonly string[]).includes(value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Register a contribution's actions, each under `tool:<id>`. A fixed list is
|
|
111
|
+
* checked for duplicate ids now; a live one (`actions` as a function) is read
|
|
112
|
+
* on every listing and re-listed whenever its `subscribe` fires. Returns the
|
|
113
|
+
* unregister.
|
|
114
|
+
*/
|
|
115
|
+
export function registerContributedActions(contribution: ActionContribution): () => void {
|
|
116
|
+
if (typeof contribution.actions !== 'function') {
|
|
117
|
+
const listed = contributedActions();
|
|
118
|
+
for (const action of contribution.actions)
|
|
119
|
+
if (listed.some((existing) => existing.id === `tool:${action.id}`))
|
|
120
|
+
throw new Error(`action "tool:${action.id}" is already contributed.`);
|
|
121
|
+
}
|
|
122
|
+
actionRegistrations = [...actionRegistrations, contribution];
|
|
123
|
+
const stop = contribution.subscribe?.(notify);
|
|
124
|
+
notify();
|
|
125
|
+
return () => {
|
|
126
|
+
stop?.();
|
|
127
|
+
actionRegistrations = actionRegistrations.filter((existing) => existing !== contribution);
|
|
128
|
+
notify();
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Register a contribution's menu items on one menu. Returns the unregister. */
|
|
133
|
+
export function registerContributedMenu(contribution: MenuContribution): () => void {
|
|
134
|
+
const added = contribution.items.map((item) => ({
|
|
135
|
+
menu: contribution.menu,
|
|
136
|
+
item: { ...item, id: `tool:${item.id}` },
|
|
137
|
+
}));
|
|
138
|
+
for (const entry of added)
|
|
139
|
+
if (menuItems.some((existing) => existing.item.id === entry.item.id))
|
|
140
|
+
throw new Error(`menu item "${entry.item.id}" is already contributed.`);
|
|
141
|
+
menuItems = [...menuItems, ...added];
|
|
142
|
+
notify();
|
|
143
|
+
return () => {
|
|
144
|
+
menuItems = menuItems.filter((entry) => !added.includes(entry));
|
|
145
|
+
notify();
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A fingerprint of every contributed item's CURRENT `disabled` answer, across
|
|
151
|
+
* every menu. The point (`@volter/editor-sdk/chrome`) promises that `disabled`
|
|
152
|
+
* is asked at render and may follow session state — which is only true if
|
|
153
|
+
* something re-renders the bar when that state moves. `ApplicationMenus`
|
|
154
|
+
* samples this on the shared availability tick while a menu is OPEN, so an
|
|
155
|
+
* item can go live or dead under the cursor and costs nothing when closed.
|
|
156
|
+
*/
|
|
157
|
+
export function contributedDisabledFingerprint(): string {
|
|
158
|
+
return menuItems.map((entry) => (entry.item.disabled?.({}) ? '1' : '0')).join('');
|
|
159
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A CHROME SLOT IS A PLACE, NOT A PANEL — the third registry in the same
|
|
3
|
+
* family as `workspace-document-restore.ts` (a kind owns its persisted state)
|
|
4
|
+
* and `document-open-registry.ts` (a kind owns how it opens). Here: the host
|
|
5
|
+
* owns WHERE something sits and how big it is; a package owns WHAT sits there.
|
|
6
|
+
*
|
|
7
|
+
* WHY IT EXISTS. The host's chrome had two places whose CONTENT was a product
|
|
8
|
+
* opinion rather than a workbench concern: the `agent` static panel
|
|
9
|
+
* (`components/workspace-static-panel-registry.tsx` imported
|
|
10
|
+
* `ConversationPanel`) and the bottom bar beside the status line
|
|
11
|
+
* (`components/EditorBottomBar.tsx` imported `HarnessConversationTray`). Both
|
|
12
|
+
* are an AGENT-HARNESS conversation surface — it talks to coding harnesses, not
|
|
13
|
+
* to a game, not to a document — so a base library for making IDEs should not
|
|
14
|
+
* carry it, and neither of the two existing seams fits: it is not a document,
|
|
15
|
+
* so it neither opens nor persists (WORK.md §The open-source launch, phase 1
|
|
16
|
+
* unit 6 half A).
|
|
17
|
+
*
|
|
18
|
+
* WHAT A SLOT ID IS. A plain string in the host's own vocabulary, spelled at
|
|
19
|
+
* the ONE host call site that renders the slot. The host declares the place in
|
|
20
|
+
* its own layout inventory (`workspace-static-panels.ts` still lists the
|
|
21
|
+
* `agent` panel's title, hotkey scope and placement, because the frame
|
|
22
|
+
* PERSISTS panel ids and the tab's own chrome is the dock's); what it no
|
|
23
|
+
* longer holds is the surface.
|
|
24
|
+
*
|
|
25
|
+
* NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
|
|
26
|
+
* filler for a slot renders nothing there — the same honest emptiness a
|
|
27
|
+
* document kind with no registered opener gives.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import type { ComponentType } from 'react';
|
|
31
|
+
|
|
32
|
+
export interface ChromeSlotFiller {
|
|
33
|
+
/** The place, in the host's vocabulary (`panel:agent`, `bottom-bar`). */
|
|
34
|
+
readonly slot: string;
|
|
35
|
+
/** Which module registered it. Re-registering the same owner+slot REPLACES,
|
|
36
|
+
* so an HMR re-evaluation leaves one filler, not two. */
|
|
37
|
+
readonly owner: string;
|
|
38
|
+
/** Ascending; ties keep registration order. */
|
|
39
|
+
readonly order?: number;
|
|
40
|
+
readonly Content: ComponentType;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const _fillers = new Map<string, ChromeSlotFiller[]>();
|
|
44
|
+
const listeners = new Set<() => void>();
|
|
45
|
+
let version = 0;
|
|
46
|
+
|
|
47
|
+
function publish(): void {
|
|
48
|
+
version++;
|
|
49
|
+
for (const listener of listeners) listener();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Install a filler. Returns the teardown. */
|
|
53
|
+
export function registerChromeSlot(filler: ChromeSlotFiller): () => void {
|
|
54
|
+
const existing = _fillers.get(filler.slot) ?? [];
|
|
55
|
+
const next = existing.filter((item) => item.owner !== filler.owner);
|
|
56
|
+
next.push(filler);
|
|
57
|
+
next.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
58
|
+
_fillers.set(filler.slot, next);
|
|
59
|
+
publish();
|
|
60
|
+
return () => {
|
|
61
|
+
const current = _fillers.get(filler.slot);
|
|
62
|
+
if (!current) return;
|
|
63
|
+
const remaining = current.filter((item) => item !== filler);
|
|
64
|
+
if (remaining.length === 0) _fillers.delete(filler.slot);
|
|
65
|
+
else _fillers.set(filler.slot, remaining);
|
|
66
|
+
publish();
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Everything registered for `slot`, in order. A stable array per version, so
|
|
71
|
+
* it is a safe `useSyncExternalStore` snapshot. */
|
|
72
|
+
export function chromeSlotFillers(slot: string): readonly ChromeSlotFiller[] {
|
|
73
|
+
return _fillers.get(slot) ?? EMPTY;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const EMPTY: readonly ChromeSlotFiller[] = [];
|
|
77
|
+
|
|
78
|
+
export function subscribeChromeSlots(listener: () => void): () => void {
|
|
79
|
+
listeners.add(listener);
|
|
80
|
+
return () => listeners.delete(listener);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function chromeSlotRegistryVersion(): number {
|
|
84
|
+
return version;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Test-only reset (mirrors the restore and open registries' own). */
|
|
88
|
+
export function __resetChromeSlotsForTest(): void {
|
|
89
|
+
_fillers.clear();
|
|
90
|
+
publish();
|
|
91
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CollaborationEvent,
|
|
3
|
+
CollaborationPresence,
|
|
4
|
+
CollaborationRole,
|
|
5
|
+
CollaborationSnapshot,
|
|
6
|
+
TeamMessage,
|
|
7
|
+
TeamMessageReference,
|
|
8
|
+
TeamPlaytest,
|
|
9
|
+
} from '@volter/editor-sdk/session/collaboration-types';
|
|
10
|
+
import { connectEvents, EDITOR_PARTICIPANT_ID, type EditorEventSource } from './editor-presence';
|
|
11
|
+
import { assertEditorServerAnswered } from './editor-server-response';
|
|
12
|
+
import { setCollaborationRevision } from './editor-session-attribution';
|
|
13
|
+
|
|
14
|
+
const BASE = '/__editor/collaboration';
|
|
15
|
+
const EVENT_CHANNELS = [
|
|
16
|
+
'participants',
|
|
17
|
+
'presence',
|
|
18
|
+
'messages',
|
|
19
|
+
'revisions',
|
|
20
|
+
'audit',
|
|
21
|
+
'team-test',
|
|
22
|
+
] as const;
|
|
23
|
+
let current: CollaborationSnapshot | null = null;
|
|
24
|
+
const listeners = new Set<(snapshot: CollaborationSnapshot) => void>();
|
|
25
|
+
const revisionListeners = new Set<(revision: number) => void>();
|
|
26
|
+
// High-water mark of already-published source revisions. Only a SOURCE
|
|
27
|
+
// revision advances `revision`; presence-only publishes reuse it. Tracked on
|
|
28
|
+
// EVERY publish (with or without revision listeners), so a subscriber's
|
|
29
|
+
// baseline is the current revision at subscribe time and it never fires
|
|
30
|
+
// retroactively for a revision already in effect.
|
|
31
|
+
let lastNotifiedRevision = 0;
|
|
32
|
+
|
|
33
|
+
function publish(snapshot: CollaborationSnapshot): void {
|
|
34
|
+
current = snapshot;
|
|
35
|
+
setCollaborationRevision(snapshot.revision);
|
|
36
|
+
for (const listener of listeners) listener(snapshot);
|
|
37
|
+
if (snapshot.revision > lastNotifiedRevision) {
|
|
38
|
+
lastNotifiedRevision = snapshot.revision;
|
|
39
|
+
for (const listener of revisionListeners) listener(snapshot.revision);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function json<T>(path: string, init?: RequestInit): Promise<T> {
|
|
44
|
+
const response = await fetch(`${BASE}${path}`, init);
|
|
45
|
+
// 204 carries no body and so no content type; everything else here is JSON,
|
|
46
|
+
// failures included. A shared session reaches this route through a TUNNEL,
|
|
47
|
+
// where a page fallback is a live possibility rather than a theoretical one.
|
|
48
|
+
if (response.status !== 204) {
|
|
49
|
+
assertEditorServerAnswered(response, `Collaboration request ${path} failed`);
|
|
50
|
+
}
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const body = (await response.json().catch(() => null)) as { error?: unknown } | null;
|
|
53
|
+
throw new Error(typeof body?.error === 'string' ? body.error : `Collaboration request failed.`);
|
|
54
|
+
}
|
|
55
|
+
return (response.status === 204 ? undefined : await response.json()) as T;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function collaborationSnapshot(): CollaborationSnapshot | null {
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let streamRelease: (() => void) | null = null;
|
|
63
|
+
let streamRefCount = 0;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Connect ONCE to the shared editor SSE stream and drive `publish` from it,
|
|
67
|
+
* ref-counted so every consumer — the collaboration panel AND a design
|
|
68
|
+
* session subscribing for revision advances — shares ONE set of collaboration
|
|
69
|
+
* listeners over the single page-lifetime `connectEvents()` socket. The last
|
|
70
|
+
* release removes those listeners and closes its `connectEvents` handle.
|
|
71
|
+
*/
|
|
72
|
+
function acquireCollaborationStream(): () => void {
|
|
73
|
+
streamRefCount++;
|
|
74
|
+
if (!streamRelease) {
|
|
75
|
+
const events: EditorEventSource = connectEvents();
|
|
76
|
+
const onSnapshot = (event: MessageEvent) => {
|
|
77
|
+
try {
|
|
78
|
+
publish(JSON.parse(event.data) as CollaborationSnapshot);
|
|
79
|
+
} catch {
|
|
80
|
+
// A malformed event is ignored; the next complete snapshot repairs it.
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
let refreshPending = false;
|
|
84
|
+
const refresh = () => {
|
|
85
|
+
if (refreshPending) return;
|
|
86
|
+
refreshPending = true;
|
|
87
|
+
void json<CollaborationSnapshot>('')
|
|
88
|
+
.then(publish)
|
|
89
|
+
.catch(() => {})
|
|
90
|
+
.finally(() => {
|
|
91
|
+
refreshPending = false;
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
const onTypedEvent = (message: MessageEvent) => {
|
|
95
|
+
try {
|
|
96
|
+
const event = JSON.parse(message.data) as CollaborationEvent;
|
|
97
|
+
if (!current || event.sequence <= current.sequence) return;
|
|
98
|
+
if (event.channel !== 'presence') {
|
|
99
|
+
refresh();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const payload = event.payload as { participantId?: unknown; presence?: unknown };
|
|
103
|
+
if (typeof payload.participantId !== 'string' || !payload.presence) return;
|
|
104
|
+
publish({
|
|
105
|
+
...current,
|
|
106
|
+
sequence: event.sequence,
|
|
107
|
+
participants: current.participants.map((participant) =>
|
|
108
|
+
participant.participantId === payload.participantId
|
|
109
|
+
? { ...participant, presence: payload.presence as CollaborationPresence }
|
|
110
|
+
: participant,
|
|
111
|
+
),
|
|
112
|
+
});
|
|
113
|
+
} catch {
|
|
114
|
+
// The next snapshot or typed event repairs malformed transient input.
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
events.addEventListener('collaboration-snapshot', onSnapshot);
|
|
118
|
+
for (const channel of EVENT_CHANNELS) {
|
|
119
|
+
events.addEventListener(`collaboration-${channel}`, onTypedEvent);
|
|
120
|
+
}
|
|
121
|
+
void json<CollaborationSnapshot>('')
|
|
122
|
+
.then(publish)
|
|
123
|
+
.catch(() => {});
|
|
124
|
+
streamRelease = () => {
|
|
125
|
+
events.removeEventListener('collaboration-snapshot', onSnapshot);
|
|
126
|
+
for (const channel of EVENT_CHANNELS) {
|
|
127
|
+
events.removeEventListener(`collaboration-${channel}`, onTypedEvent);
|
|
128
|
+
}
|
|
129
|
+
events.close();
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
let released = false;
|
|
133
|
+
return () => {
|
|
134
|
+
if (released) return;
|
|
135
|
+
released = true;
|
|
136
|
+
streamRefCount--;
|
|
137
|
+
if (streamRefCount <= 0) {
|
|
138
|
+
streamRefCount = 0;
|
|
139
|
+
streamRelease?.();
|
|
140
|
+
streamRelease = null;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function connectCollaboration(
|
|
146
|
+
listener: (snapshot: CollaborationSnapshot) => void,
|
|
147
|
+
): () => void {
|
|
148
|
+
listeners.add(listener);
|
|
149
|
+
if (current) listener(current);
|
|
150
|
+
const releaseStream = acquireCollaborationStream();
|
|
151
|
+
return () => {
|
|
152
|
+
listeners.delete(listener);
|
|
153
|
+
releaseStream();
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Fire `listener(revision)` whenever the collaboration snapshot's source
|
|
159
|
+
* revision strictly ADVANCES — the reliable signal that a collaborator (or
|
|
160
|
+
* this editor) changed project source, delivered over the same SSE stream
|
|
161
|
+
* presence rides rather than the fragile HMR websocket. It ensures that
|
|
162
|
+
* stream is connected, so a subscriber is self-sufficient even if the
|
|
163
|
+
* collaboration panel never opened, and shares the single ref-counted
|
|
164
|
+
* connection every other consumer uses (the last unsubscribe closes it). The
|
|
165
|
+
* current revision is the baseline: a subscriber never fires for a revision
|
|
166
|
+
* already in effect at subscribe time, only for a strictly greater one after.
|
|
167
|
+
*/
|
|
168
|
+
export function subscribeCollaborationRevision(listener: (revision: number) => void): () => void {
|
|
169
|
+
revisionListeners.add(listener);
|
|
170
|
+
const releaseStream = acquireCollaborationStream();
|
|
171
|
+
let released = false;
|
|
172
|
+
return () => {
|
|
173
|
+
if (released) return;
|
|
174
|
+
released = true;
|
|
175
|
+
revisionListeners.delete(listener);
|
|
176
|
+
releaseStream();
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export async function updateCollaborationPresence(presence: CollaborationPresence): Promise<void> {
|
|
181
|
+
await json<void>('/presence', {
|
|
182
|
+
method: 'POST',
|
|
183
|
+
headers: { 'Content-Type': 'application/json' },
|
|
184
|
+
body: JSON.stringify({ participantId: EDITOR_PARTICIPANT_ID, presence }),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export async function postTeamMessage(
|
|
189
|
+
text: string,
|
|
190
|
+
options: {
|
|
191
|
+
mentions?: readonly string[];
|
|
192
|
+
references?: readonly TeamMessageReference[];
|
|
193
|
+
threadId?: string | null;
|
|
194
|
+
} = {},
|
|
195
|
+
): Promise<TeamMessage> {
|
|
196
|
+
return json<TeamMessage>('/message', {
|
|
197
|
+
method: 'POST',
|
|
198
|
+
headers: { 'Content-Type': 'application/json' },
|
|
199
|
+
body: JSON.stringify({
|
|
200
|
+
authorId: EDITOR_PARTICIPANT_ID,
|
|
201
|
+
text,
|
|
202
|
+
mentions: options.mentions ?? [],
|
|
203
|
+
references: options.references ?? [],
|
|
204
|
+
threadId: options.threadId ?? null,
|
|
205
|
+
}),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export async function editTeamMessage(messageId: string, text: string): Promise<TeamMessage> {
|
|
210
|
+
return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}`, {
|
|
211
|
+
method: 'PATCH',
|
|
212
|
+
headers: { 'Content-Type': 'application/json' },
|
|
213
|
+
body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, text }),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export async function deleteTeamMessage(messageId: string): Promise<TeamMessage> {
|
|
218
|
+
return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}`, {
|
|
219
|
+
method: 'DELETE',
|
|
220
|
+
headers: { 'Content-Type': 'application/json' },
|
|
221
|
+
body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID }),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export async function toggleTeamMessageReaction(
|
|
226
|
+
messageId: string,
|
|
227
|
+
reaction: string,
|
|
228
|
+
): Promise<TeamMessage> {
|
|
229
|
+
return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}/reactions`, {
|
|
230
|
+
method: 'POST',
|
|
231
|
+
headers: { 'Content-Type': 'application/json' },
|
|
232
|
+
body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, reaction }),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export async function setCollaborationRole(
|
|
237
|
+
participantId: string,
|
|
238
|
+
role: CollaborationRole,
|
|
239
|
+
): Promise<void> {
|
|
240
|
+
await json<void>('/role', {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
headers: { 'Content-Type': 'application/json' },
|
|
243
|
+
body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, participantId, role }),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export async function startTeamTest(): Promise<TeamPlaytest> {
|
|
248
|
+
return json('/team-test', {
|
|
249
|
+
method: 'POST',
|
|
250
|
+
headers: { 'Content-Type': 'application/json' },
|
|
251
|
+
body: JSON.stringify({ participantId: EDITOR_PARTICIPANT_ID }),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export async function stopTeamTest(playtestId: string): Promise<void> {
|
|
256
|
+
await json<void>('/team-test/stop', {
|
|
257
|
+
method: 'POST',
|
|
258
|
+
headers: { 'Content-Type': 'application/json' },
|
|
259
|
+
body: JSON.stringify({
|
|
260
|
+
participantId: EDITOR_PARTICIPANT_ID,
|
|
261
|
+
playtestId,
|
|
262
|
+
}),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CollaborationPresence } from '@volter/editor-sdk/session/collaboration-types';
|
|
2
|
+
import { updateCollaborationPresence } from './collaboration-client';
|
|
3
|
+
|
|
4
|
+
let presence: CollaborationPresence = {
|
|
5
|
+
document: null,
|
|
6
|
+
file: null,
|
|
7
|
+
oid: null,
|
|
8
|
+
selection: [],
|
|
9
|
+
camera: null,
|
|
10
|
+
gesture: null,
|
|
11
|
+
};
|
|
12
|
+
let sent = '';
|
|
13
|
+
let scheduled = false;
|
|
14
|
+
let inFlight = false;
|
|
15
|
+
|
|
16
|
+
const PRESENCE_INTERVAL_MS = 100;
|
|
17
|
+
|
|
18
|
+
function schedulePresence(): void {
|
|
19
|
+
if (scheduled || inFlight) return;
|
|
20
|
+
scheduled = true;
|
|
21
|
+
globalThis.setTimeout(() => {
|
|
22
|
+
scheduled = false;
|
|
23
|
+
const serialized = JSON.stringify(presence);
|
|
24
|
+
if (serialized === sent) return;
|
|
25
|
+
sent = serialized;
|
|
26
|
+
inFlight = true;
|
|
27
|
+
void updateCollaborationPresence(presence)
|
|
28
|
+
.catch(() => {
|
|
29
|
+
sent = '';
|
|
30
|
+
})
|
|
31
|
+
.finally(() => {
|
|
32
|
+
inFlight = false;
|
|
33
|
+
if (JSON.stringify(presence) !== sent) schedulePresence();
|
|
34
|
+
});
|
|
35
|
+
}, PRESENCE_INTERVAL_MS);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function reportCollaborationPresence(patch: Partial<CollaborationPresence>): void {
|
|
39
|
+
presence = { ...presence, ...patch };
|
|
40
|
+
schedulePresence();
|
|
41
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EVERY RELAYED COMMAND, observed — the host's side of
|
|
3
|
+
* `host.session.onCommandDispatched`. `command-listener.ts` notes each
|
|
4
|
+
* command's type at the top of its dispatch; an idle watchdog (Play's
|
|
5
|
+
* recording: "an agent still driving through `vgai eval` is not idle,
|
|
6
|
+
* whatever the command was") subscribes rather than being named there.
|
|
7
|
+
*/
|
|
8
|
+
const listeners = new Set<(type: string) => void>();
|
|
9
|
+
|
|
10
|
+
export function onCommandDispatched(fn: (type: string) => void): () => void {
|
|
11
|
+
listeners.add(fn);
|
|
12
|
+
return () => {
|
|
13
|
+
listeners.delete(fn);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function noteCommandDispatched(type: string): void {
|
|
18
|
+
for (const fn of listeners) fn(type);
|
|
19
|
+
}
|