@volter/sdk 0.0.0-stage → 0.5.204
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1168 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +329 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +669 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The creation-site registry — the host-side half of the index whose
|
|
3
|
+
* source half is `server/creation-site-transform.ts`.
|
|
4
|
+
*
|
|
5
|
+
* ANTI-SHIM: the record NEVER touches the object. A `WeakMap` keyed by the
|
|
6
|
+
* constructed object is the whole storage, so an ingested game cannot see that
|
|
7
|
+
* it is being indexed — no new property, no symbol, no `userData` key, nothing
|
|
8
|
+
* enumerable, nothing a `for…in`/`Object.keys`/JSON round-trip can pick up.
|
|
9
|
+
* (This is the same rule the ingest adapter follows for its structural ids'
|
|
10
|
+
* sole exception, `userData.entityId`, which is a deliberate, documented
|
|
11
|
+
* identity tag; a provenance record has no such justification.)
|
|
12
|
+
*
|
|
13
|
+
* RESOURCE OWNERSHIP (brief-rule 4).
|
|
14
|
+
* - THE MAP is owned by this module and scoped to the editor page's realm.
|
|
15
|
+
* Every same-realm mount in the page shares it, which is correct: the
|
|
16
|
+
* stamped modules are ordinary modules in that one realm and their `new`
|
|
17
|
+
* expressions have exactly one place to report to.
|
|
18
|
+
* - IT IS NEVER CLEARED, deliberately. A `WeakMap` holds no strong reference,
|
|
19
|
+
* so a record dies with the object it describes — a game teardown that
|
|
20
|
+
* dropped its scene has already emptied the registry of everything that
|
|
21
|
+
* mattered. An explicit `clear()` on teardown would be a no-op dressed as
|
|
22
|
+
* cleanup, and it would be WRONG for the upgrade path, where a late-captured
|
|
23
|
+
* mount reuses objects constructed before the capture.
|
|
24
|
+
* - THE INSTALLED GLOBAL is the ownable resource, and it has one owner:
|
|
25
|
+
* `installGatedGameGlobals` (`gated-globals.ts`) installs it alongside the
|
|
26
|
+
* other `__volter*` game-realm globals, once, at the same point in the
|
|
27
|
+
* lifecycle. {@link installCreationSiteRecorder} returns an uninstall for
|
|
28
|
+
* tests, which is the only caller that needs to take it back down.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/** A source location a stamped `new` expression reported. */
|
|
32
|
+
export interface CreationSite {
|
|
33
|
+
/** Project-root-RELATIVE path, POSIX separators (e.g. `src/scripts/sim/city.js`). */
|
|
34
|
+
file: string;
|
|
35
|
+
/** 1-based. */
|
|
36
|
+
line: number;
|
|
37
|
+
/** 0-based character offset. */
|
|
38
|
+
col: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* What the read surfaces show for one object: either the anchor, or a NAMED
|
|
43
|
+
* reason there is none. There is no third, blank state — an unanchored object
|
|
44
|
+
* says why (the honest-floor rule).
|
|
45
|
+
*/
|
|
46
|
+
export type CreationSiteAnchor =
|
|
47
|
+
| ({ anchored: true; kind: 'source'; display: string } & CreationSite)
|
|
48
|
+
| { anchored: false; reason: string };
|
|
49
|
+
|
|
50
|
+
/** The reason for an object that exists but was not constructed by a `new`
|
|
51
|
+
* expression in a served project module — a three.js internal, a GLTF
|
|
52
|
+
* loader's mesh, anything from a bundled dependency. The anchoring does not
|
|
53
|
+
* reach these, so this is what the surfaces say, verbatim. */
|
|
54
|
+
export const UNANCHORED_REASON =
|
|
55
|
+
'constructed outside project source (library internals or loader output)';
|
|
56
|
+
|
|
57
|
+
/** The reason for a selection with no live object behind it at all. */
|
|
58
|
+
export const NO_OBJECT_REASON = 'no live object for this selection';
|
|
59
|
+
|
|
60
|
+
const sites = new WeakMap<object, CreationSite>();
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* How many objects each anchor has constructed — the MULTIPLICITY signal.
|
|
64
|
+
*
|
|
65
|
+
* SimCity builds all 256 tiles from one line (`const tile = new Tile(x, y)`,
|
|
66
|
+
* `src/scripts/sim/city.js:59`), so "can this edit be written at its creation
|
|
67
|
+
* site?" has a second answer beyond "is there a literal there": writing that
|
|
68
|
+
* line would move every tile, and writing it for one tile is a lie about what
|
|
69
|
+
* the source says. Nothing else in the system knows the count — the WeakMap
|
|
70
|
+
* above is deliberately un-enumerable — so it is counted here, at the one place
|
|
71
|
+
* every construction reports to.
|
|
72
|
+
*
|
|
73
|
+
* A PLAIN `Map`, not a WeakMap, and never decremented: the count is over
|
|
74
|
+
* CONSTRUCTIONS, not live objects. That is the conservative direction — a site
|
|
75
|
+
* that built and dropped a hundred objects still refuses, which costs a refusal
|
|
76
|
+
* the user can read, where a count that forgot its history would eventually let
|
|
77
|
+
* a shared site be written as if it were unique. It is keyed by the site string,
|
|
78
|
+
* so it holds no reference to anything the game owns and cannot leak an object.
|
|
79
|
+
*/
|
|
80
|
+
const instances = new Map<string, number>();
|
|
81
|
+
|
|
82
|
+
function siteKey(site: CreationSite): string {
|
|
83
|
+
return `${site.file}:${site.line}:${site.col}`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The global name the served prelude calls through (must match
|
|
87
|
+
* `CREATION_SITE_GLOBAL` in `server/creation-site-transform.ts`; the pairing is
|
|
88
|
+
* asserted by `creation-site-registry.test.ts`). */
|
|
89
|
+
export const CREATION_SITE_GLOBAL = '__volterRecordCreationSite';
|
|
90
|
+
|
|
91
|
+
type Recorder = (o: unknown, file: string, line: number, col: number) => void;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Record one construction. FIRST WRITE WINS: a constructor that returns an
|
|
95
|
+
* already-registered object (a cache, a singleton, an interned value) must not
|
|
96
|
+
* have its true creation site overwritten by the call site that merely asked
|
|
97
|
+
* for it again.
|
|
98
|
+
*/
|
|
99
|
+
export function recordCreationSite(o: unknown, file: string, line: number, col: number): void {
|
|
100
|
+
if (o === null || (typeof o !== 'object' && typeof o !== 'function')) return;
|
|
101
|
+
if (sites.has(o as object)) return;
|
|
102
|
+
const site: CreationSite = { file, line, col };
|
|
103
|
+
sites.set(o as object, site);
|
|
104
|
+
const key = siteKey(site);
|
|
105
|
+
instances.set(key, (instances.get(key) ?? 0) + 1);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* How many objects this anchor has constructed. `0` for a site nothing was ever
|
|
110
|
+
* recorded at. Only `1` may be written by a single-object edit; a deliberate
|
|
111
|
+
* creation-site-default edit may address the full count after naming it — see
|
|
112
|
+
* `creation-site-edit.ts`'s `CreationSiteWriteScope`.
|
|
113
|
+
*/
|
|
114
|
+
export function instancesAtSite(site: CreationSite): number {
|
|
115
|
+
return instances.get(siteKey(site)) ?? 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Test-only: forget every recorded construction count. The WeakMap needs no
|
|
119
|
+
* equivalent (it is collected with its keys) and deliberately has none. */
|
|
120
|
+
export function resetCreationSiteCountsForTest(): void {
|
|
121
|
+
instances.clear();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The raw record for an object, or `null`. */
|
|
125
|
+
export function creationSiteOf(o: unknown): CreationSite | null {
|
|
126
|
+
if (o === null || (typeof o !== 'object' && typeof o !== 'function')) return null;
|
|
127
|
+
return sites.get(o as object) ?? null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** `src/scripts/sim/city.js:59` — the text the inspector shows and the editor's `eval` command reads. */
|
|
131
|
+
export function formatCreationSite(site: CreationSite): string {
|
|
132
|
+
return `${site.file}:${site.line}`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The read-surface answer for one object: the anchor, or the named reason there
|
|
137
|
+
* isn't one. `null`/a non-object means the caller had no live object to ask
|
|
138
|
+
* about, which is a DIFFERENT honest answer from "the library built it".
|
|
139
|
+
*/
|
|
140
|
+
export function creationSiteAnchor(o: unknown): CreationSiteAnchor {
|
|
141
|
+
if (o === null || o === undefined) return { anchored: false, reason: NO_OBJECT_REASON };
|
|
142
|
+
const site = creationSiteOf(o);
|
|
143
|
+
if (!site) return { anchored: false, reason: UNANCHORED_REASON };
|
|
144
|
+
return { anchored: true, kind: 'source', ...site, display: formatCreationSite(site) };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Publish {@link recordCreationSite} on `globalThis` for the served prelude.
|
|
149
|
+
* Idempotent. Returns an uninstall — see the module header for who owns this.
|
|
150
|
+
*/
|
|
151
|
+
export function installCreationSiteRecorder(): () => void {
|
|
152
|
+
const g = globalThis as unknown as Record<string, unknown>;
|
|
153
|
+
const existing = g[CREATION_SITE_GLOBAL];
|
|
154
|
+
if (typeof existing === 'function') return () => {};
|
|
155
|
+
const recorder: Recorder = recordCreationSite;
|
|
156
|
+
g[CREATION_SITE_GLOBAL] = recorder;
|
|
157
|
+
return () => {
|
|
158
|
+
if (g[CREATION_SITE_GLOBAL] === recorder) delete g[CREATION_SITE_GLOBAL];
|
|
159
|
+
};
|
|
160
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHICH CODING HARNESSES CAN BE DELEGATED TO — the eleventh registry in the
|
|
3
|
+
* family of `workspace-document-restore.ts` (a kind owns its persisted state),
|
|
4
|
+
* `document-open-registry.ts` (a kind owns how it opens), `chrome-slot-registry
|
|
5
|
+
* .ts` (the host owns the place, a package owns what sits there),
|
|
6
|
+
* `content-entry-source-registry.ts` (the host owns the Content scope, a
|
|
7
|
+
* package owns why a component is content) and the seven since. Here: the host
|
|
8
|
+
* owns the DELEGATE FORM — the task text, the isolation choice, the branch
|
|
9
|
+
* name, the button, the notice line and `delegateEditorTask` itself — and a
|
|
10
|
+
* package owns WHICH AGENTS EXIST.
|
|
11
|
+
*
|
|
12
|
+
* WHY IT EXISTS. `components/WorktreeSwitcher.tsx`'s Delegate form was the
|
|
13
|
+
* single edge holding `api/agents.ts` and its three wire modules in the
|
|
14
|
+
* editor's eager import closure (WORK.md §The open-source launch, the four
|
|
15
|
+
* that remained of the harness bucket): it called `getHarnessChatSnapshot()`
|
|
16
|
+
* to list which harnesses are installed, and it named two of them by hand
|
|
17
|
+
* (`claude`, `codex`). A base library for making IDEs should not know the
|
|
18
|
+
* name of a coding agent.
|
|
19
|
+
*
|
|
20
|
+
* THE DOOR THE RECORD NAMED WAS A BIGGER ONE, AND THE CODE DID NOT WANT IT.
|
|
21
|
+
* Unit 21 specified "a chrome slot that can hand its filler a dismiss/refresh
|
|
22
|
+
* callback", i.e. the whole form becoming `@volter/agents`' surface. Measured
|
|
23
|
+
* against the form: of its ~120 lines, everything but the harness `<Select>`
|
|
24
|
+
* is the worktree board's own vocabulary — the branch slug, the two
|
|
25
|
+
* isolations, the copy about sibling checkouts, and
|
|
26
|
+
* `delegateEditorTask` (`api/worktrees.ts`, a `keep`-bucket module whose wire
|
|
27
|
+
* already takes a `harness` string). Moving it would have put the board's
|
|
28
|
+
* delegation UI inside the agents package AND changed `ChromeSlotFiller` —
|
|
29
|
+
* whose whole claim is that a slot is a PLACE, rendered `<filler.Content />`
|
|
30
|
+
* with no props — for every existing filler. What the host actually cannot
|
|
31
|
+
* answer is one question, so one question is what it asks.
|
|
32
|
+
*
|
|
33
|
+
* ASKED PER ISOLATION, so a source whose answer depends on where the task runs
|
|
34
|
+
* can say so; the host passes the isolation and reads a list.
|
|
35
|
+
*
|
|
36
|
+
* THE KIT ANSWERS FIRST. `WorktreeSwitcher.tsx` registers the harnesses supercode
|
|
37
|
+
* reports able to start (`/__editor/worktrees/harnesses`); a package may add more.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/** How a delegated task is isolated from the caller's checkout — the board's
|
|
41
|
+
* own vocabulary, passed to a source as the question's context. */
|
|
42
|
+
export type DelegateIsolation = 'worktree' | 'current';
|
|
43
|
+
|
|
44
|
+
export interface DelegateHarness {
|
|
45
|
+
/** The value `delegateEditorTask({ harness })` takes. */
|
|
46
|
+
readonly id: string;
|
|
47
|
+
/** What the picker shows. */
|
|
48
|
+
readonly label: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface DelegateHarnessSource {
|
|
52
|
+
/** Which module registered it. Re-registering the same owner REPLACES, so
|
|
53
|
+
* an HMR re-evaluation leaves one source, not two. */
|
|
54
|
+
readonly owner: string;
|
|
55
|
+
/** Ascending; ties keep registration order. */
|
|
56
|
+
readonly order?: number;
|
|
57
|
+
/** Asking is a fetch, so this is async; the form re-asks whenever the
|
|
58
|
+
* isolation or the registry version changes. */
|
|
59
|
+
readonly harnesses: (isolation: DelegateIsolation) => Promise<readonly DelegateHarness[]>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const _sources: DelegateHarnessSource[] = [];
|
|
63
|
+
const listeners = new Set<() => void>();
|
|
64
|
+
let version = 0;
|
|
65
|
+
|
|
66
|
+
function publish(): void {
|
|
67
|
+
version++;
|
|
68
|
+
for (const listener of listeners) listener();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Install a source. Returns the teardown. */
|
|
72
|
+
export function registerDelegateHarnessSource(source: DelegateHarnessSource): () => void {
|
|
73
|
+
const stale = _sources.findIndex((item) => item.owner === source.owner);
|
|
74
|
+
if (stale >= 0) _sources.splice(stale, 1);
|
|
75
|
+
_sources.push(source);
|
|
76
|
+
_sources.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
77
|
+
publish();
|
|
78
|
+
return () => {
|
|
79
|
+
const at = _sources.indexOf(source);
|
|
80
|
+
if (at < 0) return;
|
|
81
|
+
_sources.splice(at, 1);
|
|
82
|
+
publish();
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* THE HOST'S ONE QUESTION. Every source's answer, in registration order, with
|
|
88
|
+
* the first claim on an id winning — two packages offering the same harness is
|
|
89
|
+
* one harness, and the one that registered earlier named it.
|
|
90
|
+
*
|
|
91
|
+
* A source that throws is skipped rather than taking the form down with it:
|
|
92
|
+
* the picker degrades to the harnesses that did answer, which is the same
|
|
93
|
+
* shape as no source at all.
|
|
94
|
+
*/
|
|
95
|
+
export async function delegateHarnesses(
|
|
96
|
+
isolation: DelegateIsolation,
|
|
97
|
+
): Promise<readonly DelegateHarness[]> {
|
|
98
|
+
const seen = new Set<string>();
|
|
99
|
+
const out: DelegateHarness[] = [];
|
|
100
|
+
for (const source of _sources) {
|
|
101
|
+
let answered: readonly DelegateHarness[];
|
|
102
|
+
try {
|
|
103
|
+
answered = await source.harnesses(isolation);
|
|
104
|
+
} catch {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
for (const harness of answered) {
|
|
108
|
+
if (seen.has(harness.id)) continue;
|
|
109
|
+
seen.add(harness.id);
|
|
110
|
+
out.push(harness);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The form's `useSyncExternalStore` subscription: a source arriving with a
|
|
117
|
+
* contribution pass re-asks the question. */
|
|
118
|
+
export function subscribeDelegateHarnessSources(listener: () => void): () => void {
|
|
119
|
+
listeners.add(listener);
|
|
120
|
+
return () => {
|
|
121
|
+
listeners.delete(listener);
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function delegateHarnessRegistryVersion(): number {
|
|
126
|
+
return version;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Test-only reset (mirrors the restore, open, chrome-slot and content-entry
|
|
130
|
+
* registries'). */
|
|
131
|
+
export function __resetDelegateHarnessSourcesForTest(): void {
|
|
132
|
+
_sources.length = 0;
|
|
133
|
+
publish();
|
|
134
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A DOCUMENT'S SECOND AREA, and the host chrome it borrows.
|
|
3
|
+
*
|
|
4
|
+
* The host draws one header strip over a document (the document's own header, then the stage's
|
|
5
|
+
* controls) and one tool shelf at its leading edge. A document that divides its body into two
|
|
6
|
+
* AREAS side by side (Blender's split 3D viewport) needs that chrome divided the same way,
|
|
7
|
+
* because each of Blender's areas carries its own header over itself and its own tool shelf. So
|
|
8
|
+
* the document declares its second area ({@link setDocumentSecondArea}):
|
|
9
|
+
*
|
|
10
|
+
* - `headerWidth`: the host reserves that width at the strip's trailing edge, after its own
|
|
11
|
+
* controls, which then end where the first area ends, and hands the region's element back
|
|
12
|
+
* ({@link documentSecondAreaHeader}) for the document to draw the second area's header in;
|
|
13
|
+
* - `shelf`: an element inside the second area, which the host fills with the same tool strip
|
|
14
|
+
* its own shelf carries (the tools are the workspace's, not an area's).
|
|
15
|
+
*
|
|
16
|
+
* With no second area declared, the host draws its chrome as it always does.
|
|
17
|
+
*/
|
|
18
|
+
export interface DocumentSecondArea {
|
|
19
|
+
readonly headerWidth: number;
|
|
20
|
+
readonly shelf: HTMLElement | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const areas = new Map<string, DocumentSecondArea>();
|
|
24
|
+
const headers = new Map<string, HTMLElement>();
|
|
25
|
+
const listeners = new Set<() => void>();
|
|
26
|
+
let version = 0;
|
|
27
|
+
|
|
28
|
+
function changed(): void {
|
|
29
|
+
version++;
|
|
30
|
+
for (const listener of [...listeners]) listener();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Declare `documentId`'s second area, or remove it with null. */
|
|
34
|
+
export function setDocumentSecondArea(documentId: string, area: DocumentSecondArea | null): void {
|
|
35
|
+
const current = areas.get(documentId);
|
|
36
|
+
const width = area === null ? null : Math.max(0, Math.round(area.headerWidth));
|
|
37
|
+
if (area === null ? current === undefined : current?.headerWidth === width && current.shelf === area.shelf) return;
|
|
38
|
+
if (area === null || width === null) areas.delete(documentId);
|
|
39
|
+
else areas.set(documentId, { headerWidth: width, shelf: area.shelf });
|
|
40
|
+
changed();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** `documentId`'s second area, or null. */
|
|
44
|
+
export function documentSecondArea(documentId: string): DocumentSecondArea | null {
|
|
45
|
+
return areas.get(documentId) ?? null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** The host's header region for the second area, once drawn; null before and after. */
|
|
49
|
+
export function documentSecondAreaHeader(documentId: string): HTMLElement | null {
|
|
50
|
+
return headers.get(documentId) ?? null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Called by the host as it draws and removes the second area's header region. */
|
|
54
|
+
export function bindDocumentSecondAreaHeader(documentId: string, element: HTMLElement | null): void {
|
|
55
|
+
if ((headers.get(documentId) ?? null) === element) return;
|
|
56
|
+
if (element === null) headers.delete(documentId);
|
|
57
|
+
else headers.set(documentId, element);
|
|
58
|
+
changed();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function subscribeDocumentAreas(listener: () => void): () => void {
|
|
62
|
+
listeners.add(listener);
|
|
63
|
+
return () => {
|
|
64
|
+
listeners.delete(listener);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function documentAreasVersion(): number {
|
|
69
|
+
return version;
|
|
70
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { documentStageAnnounced, documentViewport } from '@volter/sdk/kit/document-viewports';
|
|
2
|
+
import { DOCUMENT_REGISTRATION_TIMEOUT_MS, waitUntil } from './wait-until';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* THE OPEN DOCUMENT'S OWN CONTEXT, published for the REPL door.
|
|
6
|
+
*
|
|
7
|
+
* A tool document (`workspace.document`) may hand the host ONE object — the
|
|
8
|
+
* live session it edits through — and `editor.document.run(ctx => …)`
|
|
9
|
+
* (the editor's `eval` command) runs a wire-carried step against it, in Edit mode, without
|
|
10
|
+
* play. This is the "explore in the REPL, commit as source" half of the
|
|
11
|
+
* parity program's one spine (docs/BLENDER-PARITY.md §Execution model): the
|
|
12
|
+
* mesh document publishes its `MeshEditSession`, whose `ctx` is the
|
|
13
|
+
* bpy-shaped edit context, so an agent phrases a modeling step the way the
|
|
14
|
+
* corpus does — context + selection + op — and reads the result back.
|
|
15
|
+
*
|
|
16
|
+
* Keyed by workspace document id; the door resolves the ACTIVE document and
|
|
17
|
+
* refuses by name when it published nothing (a data sheet, a story). A
|
|
18
|
+
* document re-publishes whenever its session object changes (a reload swaps
|
|
19
|
+
* it); publishing returns the unpublish.
|
|
20
|
+
*
|
|
21
|
+
* ITS SIBLING FACT, and the reason they share a module: whether a contributed
|
|
22
|
+
* document has MOUNTED AT ALL. Both are things a contribution's own React root
|
|
23
|
+
* tells the host about itself, and both exist because `ToolHost.tsx` renders
|
|
24
|
+
* that contribution into a SEPARATE root (`createEditorRoot(...).render(...)`),
|
|
25
|
+
* which React schedules — so nothing in the host's own commit can say whether
|
|
26
|
+
* the contribution has rendered yet. Every door that must not read a document
|
|
27
|
+
* "before it decided what it is" waits on one of these two.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const _contexts = new Map<string, unknown>();
|
|
31
|
+
const _contextOwners = new Map<string, symbol>();
|
|
32
|
+
const _listeners = new Set<() => void>();
|
|
33
|
+
const _mounted = new Set<string>();
|
|
34
|
+
const _mountListeners = new Set<() => void>();
|
|
35
|
+
|
|
36
|
+
let _version = 0;
|
|
37
|
+
let _notificationPending = false;
|
|
38
|
+
|
|
39
|
+
function _notifyContexts(): void {
|
|
40
|
+
// Contributions publish from their own React roots' effects. A host store
|
|
41
|
+
// update here can synchronously re-enter a pending host commit when React
|
|
42
|
+
// flushes passive effects. Publish the React snapshot after that stack has
|
|
43
|
+
// unwound; direct context readers still see the new handle immediately.
|
|
44
|
+
if (_notificationPending) return;
|
|
45
|
+
_notificationPending = true;
|
|
46
|
+
queueMicrotask(() => {
|
|
47
|
+
_notificationPending = false;
|
|
48
|
+
_version += 1;
|
|
49
|
+
for (const listener of [..._listeners]) listener();
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function publishDocumentContext(documentId: string, context: unknown): () => void {
|
|
54
|
+
// Remounted panes can publish the same long-lived view object. Cleanup
|
|
55
|
+
// belongs to this registration, not to the identity of that shared view.
|
|
56
|
+
const owner = Symbol(documentId);
|
|
57
|
+
_contextOwners.set(documentId, owner);
|
|
58
|
+
_contexts.set(documentId, context);
|
|
59
|
+
_notifyContexts();
|
|
60
|
+
return () => {
|
|
61
|
+
if (_contextOwners.get(documentId) !== owner) return;
|
|
62
|
+
_contextOwners.delete(documentId);
|
|
63
|
+
_contexts.delete(documentId);
|
|
64
|
+
_notifyContexts();
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* THE PUBLISHED CONTEXT HAS MOVED — said by the package that DRIVES the
|
|
70
|
+
* document, not by the one that published it.
|
|
71
|
+
*
|
|
72
|
+
* The context object is a live handle, so a package can change what it answers
|
|
73
|
+
* without ever republishing: `@volter/editor-blender` reads the engine through its RNA
|
|
74
|
+
* door and the answer decides which Properties TABS exist for the selected
|
|
75
|
+
* datablock (an armature has a Bone tab, a cube does not). Nothing in the
|
|
76
|
+
* host's own stores moves when that answer arrives, so before this existed the
|
|
77
|
+
* inspector had no reason to re-compose and the rail stayed at whatever the
|
|
78
|
+
* first render could see.
|
|
79
|
+
*
|
|
80
|
+
* `use-active-inspection.ts` subscribes to {@link documentContextVersion}, so
|
|
81
|
+
* this makes the whole inspection re-derive — matches included.
|
|
82
|
+
*/
|
|
83
|
+
export function notifyDocumentContextChanged(documentId: string): void {
|
|
84
|
+
if (!_contexts.has(documentId)) return;
|
|
85
|
+
_notifyContexts();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function subscribeDocumentContexts(listener: () => void): () => void {
|
|
89
|
+
_listeners.add(listener);
|
|
90
|
+
return () => {
|
|
91
|
+
_listeners.delete(listener);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function documentContextVersion(): number {
|
|
96
|
+
return _version;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function documentContextFor(documentId: string): unknown {
|
|
100
|
+
return _contexts.get(documentId);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Opening a document activates its tab before an async model import can
|
|
104
|
+
* publish its context. The REPL waits for that publication; it never executes
|
|
105
|
+
* against a placeholder or mistakes a loading document for an unsupported one. */
|
|
106
|
+
export function waitForDocumentContext(documentId: string, timeoutMs = 10_000): Promise<unknown> {
|
|
107
|
+
const current = documentContextFor(documentId);
|
|
108
|
+
if (current !== undefined) return Promise.resolve(current);
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
const onPublish = () => {
|
|
111
|
+
const context = documentContextFor(documentId);
|
|
112
|
+
if (context === undefined) return;
|
|
113
|
+
clearTimeout(timeout);
|
|
114
|
+
_listeners.delete(onPublish);
|
|
115
|
+
resolve(context);
|
|
116
|
+
};
|
|
117
|
+
const timeout = setTimeout(() => {
|
|
118
|
+
_listeners.delete(onPublish);
|
|
119
|
+
resolve(undefined);
|
|
120
|
+
}, timeoutMs);
|
|
121
|
+
_listeners.add(onPublish);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function __resetDocumentContextsForTest(): void {
|
|
126
|
+
_contexts.clear();
|
|
127
|
+
_contextOwners.clear();
|
|
128
|
+
_mounted.clear();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A CONTRIBUTED DOCUMENT'S REACT ROOT HAS COMMITTED — published by the host's
|
|
133
|
+
* own wrapper INSIDE that root (`ToolHost.tsx`), so every child effect has run
|
|
134
|
+
* by the time it fires. That ordering is the whole point: it is what lets an
|
|
135
|
+
* opener's `ready` read an absent stage announcement as "this document has no
|
|
136
|
+
* stage" rather than "the stage has not rendered yet"
|
|
137
|
+
* (`authoring/object3d-document-session-registry.ts`).
|
|
138
|
+
*/
|
|
139
|
+
export function markContributedDocumentMounted(documentId: string): () => void {
|
|
140
|
+
_mounted.add(documentId);
|
|
141
|
+
for (const listener of [..._mountListeners]) listener();
|
|
142
|
+
return () => {
|
|
143
|
+
_mounted.delete(documentId);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Resolves once this document's contribution has committed, `false` if the
|
|
148
|
+
* bounded window elapses first — the same shape and reason as
|
|
149
|
+
* {@link waitForDocumentContext} above. */
|
|
150
|
+
export function waitForContributedDocumentMount(
|
|
151
|
+
documentId: string,
|
|
152
|
+
timeoutMs = 10_000,
|
|
153
|
+
): Promise<boolean> {
|
|
154
|
+
if (_mounted.has(documentId)) return Promise.resolve(true);
|
|
155
|
+
return new Promise((resolve) => {
|
|
156
|
+
const onMount = () => {
|
|
157
|
+
if (!_mounted.has(documentId)) return;
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
_mountListeners.delete(onMount);
|
|
160
|
+
resolve(true);
|
|
161
|
+
};
|
|
162
|
+
const timeout = setTimeout(() => {
|
|
163
|
+
_mountListeners.delete(onMount);
|
|
164
|
+
resolve(false);
|
|
165
|
+
}, timeoutMs);
|
|
166
|
+
_mountListeners.add(onMount);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* THE SHARED HALF OF EVERY OPENER'S `ready` (`document-open-registry.ts`): a
|
|
172
|
+
* document whose stage announced itself
|
|
173
|
+
* (`authoring/object3d-document-session-registry.ts`) is not ready to be
|
|
174
|
+
* driven until that stage has registered its session, and one that announced
|
|
175
|
+
* nothing is ready already. Each caller has already waited for its own MOUNT
|
|
176
|
+
* to settle — the asset family for its Inspector, a contributed document for
|
|
177
|
+
* the React root above — which is what makes an absent announcement mean
|
|
178
|
+
* "this document has no stage" rather than "the stage has not rendered yet".
|
|
179
|
+
*
|
|
180
|
+
* The refusal sentence is the one `editor-view-presentation.ts` used to throw,
|
|
181
|
+
* moved to the kinds' own side unchanged.
|
|
182
|
+
*/
|
|
183
|
+
export async function awaitAnnouncedObject3DDocumentSession(documentId: string): Promise<void> {
|
|
184
|
+
if (!documentStageAnnounced(documentId)) return;
|
|
185
|
+
if (
|
|
186
|
+
await waitUntil(
|
|
187
|
+
() => documentViewport(documentId) !== null,
|
|
188
|
+
DOCUMENT_REGISTRATION_TIMEOUT_MS,
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
return;
|
|
192
|
+
throw new Error(`The requested Object3D view did not mount for document: ${documentId}`);
|
|
193
|
+
}
|