@volter/sdk 0.0.0-stage → 0.5.203
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 +1166 -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 +317 -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 +403 -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,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A DOCUMENT'S VIEWPORT, as the stage that shows it answers for it: the camera,
|
|
3
|
+
* the diagnostic view, the grid, framing, a document's own selection and a
|
|
4
|
+
* photograph of what it draws. The kit's view presentation and its current-view
|
|
5
|
+
* readout (`EditorView.viewport`) ask here for the active document, so a view
|
|
6
|
+
* link reaches whichever medium draws that document. A document no stage
|
|
7
|
+
* registered has no viewport, which is what `EditorView` then says.
|
|
8
|
+
*/
|
|
9
|
+
import type { ComponentType } from 'react';
|
|
10
|
+
import type { CaptureDimensions, EditorView } from '../types';
|
|
11
|
+
|
|
12
|
+
export type EditorViewViewport = NonNullable<EditorView['viewport']>;
|
|
13
|
+
|
|
14
|
+
export interface DocumentViewport {
|
|
15
|
+
/** Camera pose, diagnostic and grid now; null while nothing is drawn yet. */
|
|
16
|
+
read(): Pick<EditorViewViewport, 'camera' | 'diagnostic' | 'grid'> | null;
|
|
17
|
+
/** False when this viewport has no such diagnostic view. */
|
|
18
|
+
setDiagnostic(diagnostic: NonNullable<EditorViewViewport['diagnostic']>): boolean;
|
|
19
|
+
/** False when this viewport has no such camera. */
|
|
20
|
+
setCamera(camera: NonNullable<EditorViewViewport['camera']>): boolean;
|
|
21
|
+
/** False when there is nothing to frame. */
|
|
22
|
+
frame(target: NonNullable<EditorViewViewport['frame']>): boolean;
|
|
23
|
+
/** A document that keeps its own selection (an Object3D document) answers
|
|
24
|
+
* and applies it here; one that does not uses the shell's. */
|
|
25
|
+
readonly selection?: {
|
|
26
|
+
read(): readonly string[];
|
|
27
|
+
apply(ids: readonly string[]): void;
|
|
28
|
+
};
|
|
29
|
+
/** The ids of the objects this stage draws under `name` (a layout selecting
|
|
30
|
+
* one named native object). */
|
|
31
|
+
idsNamed?(name: string): readonly string[];
|
|
32
|
+
/** Arm the stage's own transform gizmo. */
|
|
33
|
+
setTransformMode?(mode: 'combined' | 'translate' | 'rotate' | 'scale'): void;
|
|
34
|
+
/** A PNG data URL of what it draws, when it can render one on demand. */
|
|
35
|
+
capture?(size?: CaptureDimensions): string | null;
|
|
36
|
+
/** Settles before a view is applied (an asynchronously mounting document). */
|
|
37
|
+
prepare?(): Promise<void>;
|
|
38
|
+
/** The controls this stage adds to its document's header (its shading,
|
|
39
|
+
* helpers and capture menus). */
|
|
40
|
+
readonly HeaderControls?: ComponentType<{ readonly documentId: string; readonly assetPath?: string }>;
|
|
41
|
+
/**
|
|
42
|
+
* What the host's transform tools drive on this stage right now: `gizmo` (the
|
|
43
|
+
* stage's own transform handles, whose header wells configure them), `modal`
|
|
44
|
+
* (the stage transforms through a door it declared, and has no gizmo to
|
|
45
|
+
* configure) or `none` (nothing of this stage takes them).
|
|
46
|
+
*/
|
|
47
|
+
transformTools?(): 'gizmo' | 'modal' | 'none';
|
|
48
|
+
/** The transform tool strip on the document's shelf. */
|
|
49
|
+
readonly TransformTools?: ComponentType<{ readonly documentId: string }>;
|
|
50
|
+
/** The gizmo's header wells (orientation, pivot, snap, options). */
|
|
51
|
+
readonly TransformControls?: ComponentType<{ readonly documentId: string }>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const viewports = new Map<string, DocumentViewport>();
|
|
55
|
+
const listeners = new Set<() => void>();
|
|
56
|
+
let version = 0;
|
|
57
|
+
let notificationPending = false;
|
|
58
|
+
|
|
59
|
+
function changed(): void {
|
|
60
|
+
// A stage registers from a contribution root's effect. Keep the viewport
|
|
61
|
+
// immediately readable, but publish its React snapshot outside that commit
|
|
62
|
+
// so a host subscriber cannot re-enter a pending host commit through it.
|
|
63
|
+
if (notificationPending) return;
|
|
64
|
+
notificationPending = true;
|
|
65
|
+
queueMicrotask(() => {
|
|
66
|
+
notificationPending = false;
|
|
67
|
+
version += 1;
|
|
68
|
+
for (const listener of [...listeners]) listener();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Register the viewport of one document. Returns the removal. */
|
|
73
|
+
export function registerDocumentViewport(documentId: string, viewport: DocumentViewport): () => void {
|
|
74
|
+
viewports.set(documentId, viewport);
|
|
75
|
+
changed();
|
|
76
|
+
return () => {
|
|
77
|
+
if (viewports.get(documentId) !== viewport) return;
|
|
78
|
+
viewports.delete(documentId);
|
|
79
|
+
changed();
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function subscribeDocumentViewports(listener: () => void): () => void {
|
|
84
|
+
listeners.add(listener);
|
|
85
|
+
return () => listeners.delete(listener);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function documentViewportsVersion(): number {
|
|
89
|
+
return version;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function documentViewport(documentId: string | null | undefined): DocumentViewport | null {
|
|
93
|
+
return documentId ? (viewports.get(documentId) ?? null) : null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const announced = new Map<string, number>();
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A DOCUMENT'S STAGE ANNOUNCES ITSELF AS IT RENDERS, before the viewport it will
|
|
100
|
+
* register exists — the fact an opener's `ready` needs and cannot get from
|
|
101
|
+
* anywhere else: whether a document mounts a stage is a fact of its MOUNT,
|
|
102
|
+
* never of its address. Counted, so overlapping mounts of one document (a
|
|
103
|
+
* revision swap) release in any order. Returns the release.
|
|
104
|
+
*/
|
|
105
|
+
export function announceDocumentStage(documentId: string): () => void {
|
|
106
|
+
announced.set(documentId, (announced.get(documentId) ?? 0) + 1);
|
|
107
|
+
let released = false;
|
|
108
|
+
return () => {
|
|
109
|
+
if (released) return;
|
|
110
|
+
released = true;
|
|
111
|
+
const open = (announced.get(documentId) ?? 0) - 1;
|
|
112
|
+
if (open > 0) announced.set(documentId, open);
|
|
113
|
+
else announced.delete(documentId);
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Whether a stage for this document has begun mounting. */
|
|
118
|
+
export function documentStageAnnounced(documentId: string): boolean {
|
|
119
|
+
return (announced.get(documentId) ?? 0) > 0;
|
|
120
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editor server SDK.
|
|
3
|
+
*
|
|
4
|
+
* All frontend code should use this module instead of calling fetch()/EventSource
|
|
5
|
+
* with raw endpoint URLs.
|
|
6
|
+
*
|
|
7
|
+
* The project's `public/` file operations (`listAssets`, `saveFile`) are routed
|
|
8
|
+
* through the backend-agnostic `StorageBackend` (see ./storage): `HttpStorage`
|
|
9
|
+
* over the same `/__editor/*` routes, wrapped by the frame's file door once
|
|
10
|
+
* that lands. The remaining endpoints are NOT `public/` file ops — the
|
|
11
|
+
* launcher's own reads, the play-log writes, the asset library, and the
|
|
12
|
+
* user-triggered actions (`createProject`, `browseFolder`,
|
|
13
|
+
* `openProjectOnServer`, `revealInFinder`, `startExport`,
|
|
14
|
+
* `downloadOnlineAsset`).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type { EditorEventSource } from './editor-presence';
|
|
18
|
+
export { connectEvents, connectTabPresence, reportTabRoute } from './editor-presence';
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// The families. This path stays the ONE import site for the editor server SDK
|
|
22
|
+
// — every name below was exported from here before the split and still is, so
|
|
23
|
+
// no caller changed. What changed is that a reader looking for "how does the
|
|
24
|
+
// editor talk to the worktree board" now opens `api/worktrees.ts` instead of
|
|
25
|
+
// scrolling an 1,900-line file.
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
// `./api/agents` is DELIBERATELY NOT RE-EXPORTED HERE (phase 1 unit 22). It is
|
|
29
|
+
// the page-side client for the coding-harness routes, and `@volter/agents`'s
|
|
30
|
+
// modules have always imported `@editor/api/agents` directly rather than
|
|
31
|
+
// through this barrel — so the family's claim above ("every name was exported
|
|
32
|
+
// from here before the split and still is") was already not how its one
|
|
33
|
+
// consumer reads it. What the row bought instead was a static edge from every
|
|
34
|
+
// importer of this file into the agents lane's whole wire, which is what held
|
|
35
|
+
// four files in the editor's eager closure after the last host caller left.
|
|
36
|
+
// The rule is unit 13's, found on the view presenter: a door every package
|
|
37
|
+
// calls must not carry every lane's implementation.
|
|
38
|
+
export * from './api/assets';
|
|
39
|
+
export * from '@volter/sdk/kit/api-build';
|
|
40
|
+
export * from '@volter/sdk/kit/api-logs';
|
|
41
|
+
export * from '@volter/sdk/kit/api-project-identity';
|
|
42
|
+
export * from './api/project-open';
|
|
43
|
+
export * from './api/project-source';
|
|
44
|
+
export * from './api/project-state';
|
|
45
|
+
export * from './api/relay';
|
|
46
|
+
export * from '@volter/sdk/kit/api-worktrees';
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE CHROME-CAPTURE DOOR: photograph the editor PAGE — every panel, every
|
|
3
|
+
* tab strip, the Inspector, the viewport inside it — as the person is seeing
|
|
4
|
+
* it. the editor's `screenshot editor` command / `editor.captureEditorChrome()`.
|
|
5
|
+
*
|
|
6
|
+
* WHY IT EXISTS. Every other capture door photographs a SUBJECT: the running
|
|
7
|
+
* game, the active document, the Scene viewport, a model. None photographs
|
|
8
|
+
* the editor itself, so a contribution author — human or agent — could not
|
|
9
|
+
* run the sighted render→look→revise loop on a panel through the product, and
|
|
10
|
+
* every dev-surface wave so far was built blind, on DOM probes (WORK.md, "The
|
|
11
|
+
* chrome-capture door"). A skin, a workspace arrangement or a new region
|
|
12
|
+
* cannot be judged at all without this.
|
|
13
|
+
*
|
|
14
|
+
* HOW. The same compositor the active-document door uses
|
|
15
|
+
* (`composite-screenshot.ts`), pointed at `#editor-chrome-root` — the ONE
|
|
16
|
+
* theme scope (ARCHITECTURE-CORE §Editor chrome) — with `includeDocumentStyles`
|
|
17
|
+
* on, so the design system's stylesheet rides the clone and chrome
|
|
18
|
+
* photographs as it appears. Three kinds of canvas sit inside that root and
|
|
19
|
+
* only one of them can be read late:
|
|
20
|
+
*
|
|
21
|
+
* - a canvas a medium re-renders at a chosen size — a three.js viewport or
|
|
22
|
+
* Object3D document with no `preserveDrawingBuffer` — is drawn by that
|
|
23
|
+
* medium (`@volter/sdk/kit/canvas-frames`'s `renderedCanvasFrame`);
|
|
24
|
+
* - a live game or Pixi canvas goes through the one `canvasFrame` seam
|
|
25
|
+
* every pixel door shares (`live-canvas-frame.ts`).
|
|
26
|
+
*
|
|
27
|
+
* Visible iframes are refused: cloning a frame does not capture its browsing
|
|
28
|
+
* context, so an extension's working UI would otherwise look blank.
|
|
29
|
+
* Everything else reads directly. A canvas this module cannot recognise or
|
|
30
|
+
* re-render photographs as the browser hands it back — possibly black — and
|
|
31
|
+
* `layers.canvases` says how many were drawn, so a reader can tell a black
|
|
32
|
+
* panel from a missing one.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { EditorChromeCaptureOptions, EditorView } from '@volter/sdk';
|
|
36
|
+
import { renderedCanvasFrame } from '@volter/sdk/kit/canvas-frames';
|
|
37
|
+
import { type CompositeCapture, capturePlayComposite } from '@volter/sdk/kit/composite-screenshot';
|
|
38
|
+
import { currentEditorView } from './editor-current-view';
|
|
39
|
+
import type { ShellStore } from '@volter/sdk/kit/shell-store';
|
|
40
|
+
import { liveCanvasFrame } from '@volter/sdk/kit/live-canvas-frame';
|
|
41
|
+
import { activeDocumentContainer } from './editor-document-probe';
|
|
42
|
+
import { activeWorkspaceDocumentId } from '@volter/sdk/kit/workspace-document-registry';
|
|
43
|
+
|
|
44
|
+
export const EDITOR_CHROME_ROOT_ID = 'editor-chrome-root';
|
|
45
|
+
|
|
46
|
+
export interface EditorChromeCapture extends CompositeCapture {
|
|
47
|
+
/** The view the page was showing when the frame was taken. */
|
|
48
|
+
view: EditorView;
|
|
49
|
+
/** The frame's own size, in OUTPUT pixels. */
|
|
50
|
+
size: { width: number; height: number };
|
|
51
|
+
/** Output pixels per CSS pixel — what one pixel of {@link size} is. A
|
|
52
|
+
* reference frame captured on a 2x display is judged against `scale: 2`. */
|
|
53
|
+
scale: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The capture's options: the SDK's public type, so the client and this kit cannot drift. */
|
|
57
|
+
export type { EditorChromeCaptureOptions };
|
|
58
|
+
|
|
59
|
+
/** A data URL as something `drawImage` accepts. */
|
|
60
|
+
/**
|
|
61
|
+
* Same-frame pixels for every canvas the page holds — the seam described in
|
|
62
|
+
* the header. `null` means "read the canvas directly".
|
|
63
|
+
*/
|
|
64
|
+
function chromeCanvasFrame(scale: number) {
|
|
65
|
+
return async (canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> => {
|
|
66
|
+
// A medium's re-render draws at a size WE choose, so it is asked for the
|
|
67
|
+
// frame's own scale — a 2x capture whose viewport had to be re-rendered gets
|
|
68
|
+
// a 2x render, not a 1x one stretched (`@volter/sdk/kit/canvas-frames`).
|
|
69
|
+
const size = {
|
|
70
|
+
width: Math.max(1, Math.round(canvas.clientWidth * scale)),
|
|
71
|
+
height: Math.max(1, Math.round(canvas.clientHeight * scale)),
|
|
72
|
+
};
|
|
73
|
+
return (await renderedCanvasFrame(canvas, size)) ?? liveCanvasFrame(canvas);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Photograph the editor page. Throws, by name, when the chrome root is not
|
|
78
|
+
* mounted — a page that is not the editor has nothing to photograph. */
|
|
79
|
+
export async function captureEditorChrome(
|
|
80
|
+
store: ShellStore,
|
|
81
|
+
options?: EditorChromeCaptureOptions,
|
|
82
|
+
): Promise<EditorChromeCapture> {
|
|
83
|
+
const page = document.getElementById(EDITOR_CHROME_ROOT_ID);
|
|
84
|
+
if (!page) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`The editor chrome root (#${EDITOR_CHROME_ROOT_ID}) is not mounted, so there is no editor ` +
|
|
87
|
+
'page to photograph.',
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
// THE DOCUMENT REGION: the same compositor over the active document's own box, so a stage is
|
|
91
|
+
// photographed with what the person sees over it (its navigation gizmo, its readouts), not
|
|
92
|
+
// as the document's render alone.
|
|
93
|
+
let root: HTMLElement = page;
|
|
94
|
+
if (options?.region === 'document' || options?.region === 'play') {
|
|
95
|
+
const documentId = activeWorkspaceDocumentId();
|
|
96
|
+
const box = documentId ? activeDocumentContainer(documentId) : null;
|
|
97
|
+
if (!box) throw new Error('No active document is showing, so there is no document region to photograph.');
|
|
98
|
+
root = box;
|
|
99
|
+
if (options.region === 'play') {
|
|
100
|
+
const frame = box.querySelector<HTMLElement>('[data-volter-play-frame]');
|
|
101
|
+
if (!frame || !frame.checkVisibility({checkVisibilityCSS: true, checkOpacity: true})) {
|
|
102
|
+
throw new Error('The active document has no visible live frame to photograph.');
|
|
103
|
+
}
|
|
104
|
+
root = frame;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const scale = options?.scale ?? window.devicePixelRatio ?? 1;
|
|
108
|
+
const rect = root.getBoundingClientRect();
|
|
109
|
+
// cloneNode does not copy a frame's browsing context. In particular, a
|
|
110
|
+
// working extension webview becomes an empty rectangle in the SVG clone.
|
|
111
|
+
// Refuse that misleading evidence instead of reporting a successful capture.
|
|
112
|
+
// The workbench also has a zero-size extension-host frame; it paints nothing.
|
|
113
|
+
for (const frame of root.querySelectorAll('iframe')) {
|
|
114
|
+
const box = frame.getBoundingClientRect();
|
|
115
|
+
if (
|
|
116
|
+
box.width <= 0 || box.height <= 0 || box.right <= rect.left ||
|
|
117
|
+
box.left >= rect.right || box.bottom <= rect.top || box.top >= rect.bottom ||
|
|
118
|
+
!frame.checkVisibility({ checkOpacity: true, checkVisibilityCSS: true })
|
|
119
|
+
) continue;
|
|
120
|
+
throw new Error(
|
|
121
|
+
'Editor chrome capture cannot include a visible iframe or extension webview. ' +
|
|
122
|
+
'Its content would be missing from the image; this does not mean the live panel is blank. ' +
|
|
123
|
+
'Use a browser window capture for the whole page, or region: "document" for the active document.',
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
const size = {
|
|
127
|
+
width: Math.max(1, Math.round(rect.width * scale)),
|
|
128
|
+
height: Math.max(1, Math.round(rect.height * scale)),
|
|
129
|
+
};
|
|
130
|
+
const composite = await capturePlayComposite(root, {
|
|
131
|
+
canvasFrame: chromeCanvasFrame(scale),
|
|
132
|
+
includeDocumentStyles: true,
|
|
133
|
+
size,
|
|
134
|
+
});
|
|
135
|
+
return { ...composite, view: currentEditorView(store), size, scale };
|
|
136
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE EDITOR'S COMMANDS: the ONE table of what its palette actions ARE, and
|
|
3
|
+
* the ONE door to running a command by id.
|
|
4
|
+
*
|
|
5
|
+
* 1. **The ACTION TABLE.** What the palette lists, published as DATA so the
|
|
6
|
+
* frame can register one VS Code command plus one
|
|
7
|
+
* `MenuId.CommandPalette` item per entry — which is what makes ⌘⇧P list
|
|
8
|
+
* OUR actions with OUR labels. `components/palette-action-publisher.tsx`
|
|
9
|
+
* is its one author.
|
|
10
|
+
*
|
|
11
|
+
* ## Why this is published at RUNTIME and the keymap is GENERATED
|
|
12
|
+
*
|
|
13
|
+
* The chords are a generated built-in extension because a keybinding rule
|
|
14
|
+
* registered after `workbench.common.main.ts` has loaded is INERT, and the
|
|
15
|
+
* chords are package data known at build time. Neither half holds here,
|
|
16
|
+
* measured 2026-09-19:
|
|
17
|
+
*
|
|
18
|
+
* - A MENU ITEM registered late is not inert. `MenuRegistry` fires
|
|
19
|
+
* `onDidChangeMenu` and the palette rebuilds its picks on every open
|
|
20
|
+
* (`commandsQuickAccess.ts`'s `getGlobalCommandPicks`), which is how
|
|
21
|
+
* every extension-contributed command reaches ⌘⇧P.
|
|
22
|
+
* - The table is not static. Its ids are a different namespace from the
|
|
23
|
+
* keymap's (`editor.undo` here, `edit.undo` there), several labels are
|
|
24
|
+
* templated per selection (`View Through <camera name>`), and the
|
|
25
|
+
* entity, tool-document, board-open and package-contributed (`tool:*`)
|
|
26
|
+
* entries do not exist until something mounts or a package loads.
|
|
27
|
+
*
|
|
28
|
+
* So the generator is left alone and the frame reads a live table instead.
|
|
29
|
+
*
|
|
30
|
+
* 2. **`editor.command(id, args)`**, the door a product surface drives a VIEW
|
|
31
|
+
* through. `editor.document.*` reaches only the ACTIVE CENTRE DOCUMENT by
|
|
32
|
+
* its own contract, so every drawer utility — Console, Profiler, Network,
|
|
33
|
+
* the node editor — was undrivable until this existed; a walk looking for
|
|
34
|
+
* one tried `editor.view`, `editor.frame` and `editor.present` in turn and
|
|
35
|
+
* was refused by each, because there was no door.
|
|
36
|
+
*
|
|
37
|
+
* It is the frame's `ICommandService.executeCommand`, installed by the
|
|
38
|
+
* contribution, so ANY workbench command id is reachable — ours and
|
|
39
|
+
* upstream's alike. That is the point of running inside a workbench.
|
|
40
|
+
* Before the executor lands, a `volter.<view>.<verb>` id still resolves off
|
|
41
|
+
* `@volter/sdk/views` — the same table the frame's command would have
|
|
42
|
+
* called — and any OTHER id is refused BY NAME, because a silent nothing
|
|
43
|
+
* is how an agent concludes a command "did not work".
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* How the frame opens ITS palette when one of our own actions asks for one
|
|
47
|
+
* (`view.commandPalette`, whose chord U6 left unbound under the frame because
|
|
48
|
+
* ⌘K is VS Code's chord prefix). Installed by the contribution after the
|
|
49
|
+
* bridge has mounted; absent, the action is refused rather than silently
|
|
50
|
+
* toggling a palette nobody renders.
|
|
51
|
+
*/
|
|
52
|
+
let paletteOpener: (() => void) | null = null;
|
|
53
|
+
|
|
54
|
+
export function setPaletteOpener(open: (() => void) | null): void {
|
|
55
|
+
paletteOpener = open;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Open the command palette. `false` before the opener lands — the window
|
|
59
|
+
* between the bridge mounting and the contribution's `setPaletteOpener`. */
|
|
60
|
+
export function openCommandPalette(): boolean {
|
|
61
|
+
if (!paletteOpener) return false;
|
|
62
|
+
paletteOpener();
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface PaletteActionEntry {
|
|
67
|
+
readonly id: string;
|
|
68
|
+
readonly label: string;
|
|
69
|
+
/** `action` | `entity` | `asset`, as `action-registry.ts` spells it. */
|
|
70
|
+
readonly category: string;
|
|
71
|
+
readonly run: () => void | Promise<void>;
|
|
72
|
+
/** The application menu it is an item of, and its label there. */
|
|
73
|
+
readonly menu?: { readonly id: string; readonly label: string };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let entries: readonly PaletteActionEntry[] = [];
|
|
77
|
+
let entriesVersion = 0;
|
|
78
|
+
const entryListeners = new Set<() => void>();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Publish the table the palette would list. Called from the editor's own
|
|
82
|
+
* tree (`components/palette-action-publisher.tsx`) so the hooks that build it
|
|
83
|
+
* — the shell store, the history commands, the contributed-chrome version —
|
|
84
|
+
* are read exactly where React reads them, rather than reached for out of
|
|
85
|
+
* band. The array is replaced, never merged: the builders return the whole
|
|
86
|
+
* live set each time.
|
|
87
|
+
*/
|
|
88
|
+
export function publishPaletteActions(next: readonly PaletteActionEntry[]): void {
|
|
89
|
+
entries = next;
|
|
90
|
+
entriesVersion++;
|
|
91
|
+
for (const listener of entryListeners) listener();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Every palette action the editor currently offers. */
|
|
95
|
+
export function paletteActions(): readonly PaletteActionEntry[] {
|
|
96
|
+
return entries;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function paletteActionsVersion(): number {
|
|
100
|
+
return entriesVersion;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function subscribePaletteActions(listener: () => void): () => void {
|
|
104
|
+
entryListeners.add(listener);
|
|
105
|
+
return () => entryListeners.delete(listener);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Run one palette action by id — the door the workbench's own command calls.
|
|
110
|
+
* `false` means the editor no longer has that entry (a selection changed, a
|
|
111
|
+
* tool document closed, a package unloaded), which the caller reports by name
|
|
112
|
+
* rather than swallowing.
|
|
113
|
+
*/
|
|
114
|
+
export function invokePaletteAction(id: string): boolean {
|
|
115
|
+
const entry = entries.find((candidate) => candidate.id === id);
|
|
116
|
+
if (!entry) return false;
|
|
117
|
+
void entry.run();
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The workbench's command service, handed over by the contribution once it has
|
|
123
|
+
* one. Installed AFTER the bridge mounts, for the reason every other seam
|
|
124
|
+
* here states: a `ServicesAccessor` is valid only inside the synchronous part
|
|
125
|
+
* of a command's invocation.
|
|
126
|
+
*/
|
|
127
|
+
let commandExecutor: ((id: string, args?: unknown) => unknown) | null = null;
|
|
128
|
+
|
|
129
|
+
export function setCommandExecutor(run: ((id: string, args?: unknown) => unknown) | null): void {
|
|
130
|
+
commandExecutor = run;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Reveal a workbench view by id (`volter.properties`, `volter.outliner`) through its `.focus`
|
|
135
|
+
* command, which the workbench registers for every view. Without the Code-OSS frame there is
|
|
136
|
+
* no workbench and the editor's own panels are in the page, so there is nothing to reveal.
|
|
137
|
+
*/
|
|
138
|
+
export function revealWorkbenchView(viewId: string): void {
|
|
139
|
+
if (!commandExecutor) return;
|
|
140
|
+
void Promise.resolve(commandExecutor(`${viewId}.focus`)).catch(() => {});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** The `volter.<view>.<verb>` shape the views registry keys, and the ONLY id
|
|
144
|
+
* shape standalone can answer. */
|
|
145
|
+
const VIEW_VERB_COMMAND = /^volter\.([^.]+)\.(.+)$/;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Run a command by id — `editor.command(id, args)`'s one implementation.
|
|
149
|
+
*
|
|
150
|
+
* The workbench's `ICommandService` when it has landed; before that, the
|
|
151
|
+
* views registry, reached through a DYNAMIC import so a module only a
|
|
152
|
+
* the editor's `eval` command reaches never joins the editor entry's static closure.
|
|
153
|
+
*
|
|
154
|
+
* A refusal is always BY NAME. `invokeViewVerb` names the view's whole
|
|
155
|
+
* vocabulary when it does not carry the verb (that refusal is the VIEW's, and
|
|
156
|
+
* moving it here would put it somewhere the view does not draw), and an id
|
|
157
|
+
* that is not a view verb at all is refused with the shape that would have
|
|
158
|
+
* worked.
|
|
159
|
+
*/
|
|
160
|
+
export async function executeCommand(id: string, args?: unknown): Promise<unknown> {
|
|
161
|
+
if (commandExecutor) return await commandExecutor(id, args);
|
|
162
|
+
const parts = VIEW_VERB_COMMAND.exec(id);
|
|
163
|
+
if (!parts) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
`No command "${id}". Without the Code-OSS frame there is no command service, so the ` +
|
|
166
|
+
"only commands this editor answers are a view's own verbs, spelled " +
|
|
167
|
+
'volter.<view>.<verb> (for example volter.blender-node-view.view-all).',
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
const { invokeViewVerb } = await import('@volter/sdk/views');
|
|
171
|
+
return invokeViewVerb(
|
|
172
|
+
parts[1] as string,
|
|
173
|
+
parts[2] as string,
|
|
174
|
+
args as Record<string, unknown> | undefined,
|
|
175
|
+
);
|
|
176
|
+
}
|