@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IS THIS REJECTION A CANCELLATION? — the one predicate, shared by the two
|
|
3
|
+
* page-level `unhandledrejection` listeners this editor installs
|
|
4
|
+
* (`editor-presence.ts`'s boot reporter and `editor-console.ts`'s
|
|
5
|
+
* session-lifetime capture).
|
|
6
|
+
*
|
|
7
|
+
* ## Why this is not "exempting a source"
|
|
8
|
+
*
|
|
9
|
+
* The recorded doctrine at `installEditorConsoleCapture` is that SEVERITY
|
|
10
|
+
* decides what reaches the ledger and never SOURCE, "because exempting a
|
|
11
|
+
* source would teach the gate to find less". This is not that. A cancellation
|
|
12
|
+
* is not a low-severity error, it is the platform's word for *an operation
|
|
13
|
+
* that was asked to stop and did* — the same judgement the workbench makes
|
|
14
|
+
* about its own (`onUnexpectedError` returns early on `isCancellationError`)
|
|
15
|
+
* and the same one the Fetch and Streams specs make (`AbortError`). It is
|
|
16
|
+
* applied identically to OUR rejections and to anyone else's: a volter fetch
|
|
17
|
+
* abandoned because the document moved on is exactly as much of a non-event.
|
|
18
|
+
*
|
|
19
|
+
* ## What made it necessary
|
|
20
|
+
*
|
|
21
|
+
* MEASURED 2026-09-19, the Code-OSS frame's blind walk, beat 9: a
|
|
22
|
+
* `--template game` scaffold reported
|
|
23
|
+
* `[runtime] editor app failed to start: Canceled: Canceled` while its editor
|
|
24
|
+
* was running fine. Under the frame the page is a WORKBENCH, and a workbench
|
|
25
|
+
* raises `CancellationError` (`name === 'Canceled'`) whenever a quick input is
|
|
26
|
+
* dismissed or a search is superseded — none of which any page-level listener
|
|
27
|
+
* can attribute, because a rejection carries no author. The ledger spans two
|
|
28
|
+
* codebases there (docs/CODE-OSS.md, "The console ledger now spans two
|
|
29
|
+
* codebases"), and this is the one class of line that can be ruled on without
|
|
30
|
+
* asking WHOSE it is.
|
|
31
|
+
*
|
|
32
|
+
* ## Its own file, deliberately
|
|
33
|
+
*
|
|
34
|
+
* `editor-presence.ts` is the pre-React bootstrap module and is
|
|
35
|
+
* dependency-light on purpose (its own comments say so); importing the console
|
|
36
|
+
* from it would pull the console's whole closure into the page's first script.
|
|
37
|
+
* A five-line predicate copied into both is the duplication this codebase
|
|
38
|
+
* treats as a defect, so it is one module with no imports of its own.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* True when a rejection reason means "this was cancelled", by any of the three
|
|
43
|
+
* spellings in play on our page:
|
|
44
|
+
*
|
|
45
|
+
* - VS Code's `CancellationError`, whose constructor sets
|
|
46
|
+
* `name = message = 'Canceled'`;
|
|
47
|
+
* - the platform's `AbortError` — a `DOMException` from `AbortSignal`, and
|
|
48
|
+
* what `fetch` rejects with when its signal fires;
|
|
49
|
+
* - the older `AbortError` shape any library may throw as a plain `Error`.
|
|
50
|
+
*
|
|
51
|
+
* Deliberately NOT a message match: a message is prose and drifts, while these
|
|
52
|
+
* names are contract.
|
|
53
|
+
*/
|
|
54
|
+
export function isCancellationReason(reason: unknown): boolean {
|
|
55
|
+
if (typeof reason !== 'object' || reason === null) return false;
|
|
56
|
+
const name = (reason as { name?: unknown }).name;
|
|
57
|
+
return name === 'Canceled' || name === 'CancellationError' || name === 'AbortError';
|
|
58
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A CANVAS'S SAME-FRAME PIXELS, answered by the medium that draws into it. A
|
|
3
|
+
* canvas a medium renders without `preserveDrawingBuffer` photographs blank if
|
|
4
|
+
* it is read after its frame, so the kit's compositor asks here instead of
|
|
5
|
+
* reading such a canvas directly. Two doors: the canvases a live surface is
|
|
6
|
+
* presenting now, and the canvases a mount the kit is about to photograph
|
|
7
|
+
* creates (a story's own `<Application>`). With no medium registered the kit
|
|
8
|
+
* reads every canvas directly.
|
|
9
|
+
*/
|
|
10
|
+
export type CanvasFrame = (canvas: HTMLCanvasElement) => Promise<CanvasImageSource | null>;
|
|
11
|
+
|
|
12
|
+
let sources: readonly CanvasFrame[] = [];
|
|
13
|
+
|
|
14
|
+
/** A medium's reader for the canvases its live surfaces present; it answers
|
|
15
|
+
* `null` for a canvas it does not own. Returns the removal. */
|
|
16
|
+
export function registerCanvasFrameSource(source: CanvasFrame): () => void {
|
|
17
|
+
sources = [...sources, source];
|
|
18
|
+
return () => {
|
|
19
|
+
sources = sources.filter((existing) => existing !== source);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The first registered source's pixels for `canvas`, or null when none owns it. */
|
|
24
|
+
export async function presentedCanvasFrame(canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> {
|
|
25
|
+
for (const source of sources) {
|
|
26
|
+
const frame = await source(canvas);
|
|
27
|
+
if (frame) return frame;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** What a medium learned while a mount ran: when its surfaces have drawn their
|
|
33
|
+
* first frame, and how to read their canvases. */
|
|
34
|
+
export interface ObservedCanvasMount<T> {
|
|
35
|
+
readonly result: T;
|
|
36
|
+
settled(): Promise<void>;
|
|
37
|
+
readonly frame: CanvasFrame;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface CanvasMountObserver {
|
|
41
|
+
observe<T>(task: () => Promise<T>): Promise<ObservedCanvasMount<T>>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let observer: CanvasMountObserver | null = null;
|
|
45
|
+
|
|
46
|
+
/** The one medium that observes mounts for canvases it creates. Returns the removal. */
|
|
47
|
+
export function registerCanvasMountObserver(next: CanvasMountObserver): () => void {
|
|
48
|
+
observer = next;
|
|
49
|
+
return () => {
|
|
50
|
+
if (observer === next) observer = null;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Run a mount under the registered observer, or plainly when none is. */
|
|
55
|
+
export async function observeCanvasMount<T>(task: () => Promise<T>): Promise<ObservedCanvasMount<T>> {
|
|
56
|
+
if (observer) return observer.observe(task);
|
|
57
|
+
return { result: await task(), settled: async () => {}, frame: async () => null };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** A medium's re-render of a canvas it owns at a requested size, for a caller
|
|
61
|
+
* that photographs at its own scale (the editor chrome); `null` when the
|
|
62
|
+
* canvas is not its. */
|
|
63
|
+
export type CanvasRender = (
|
|
64
|
+
canvas: HTMLCanvasElement,
|
|
65
|
+
size: { readonly width: number; readonly height: number },
|
|
66
|
+
) => Promise<CanvasImageSource | null> | null;
|
|
67
|
+
|
|
68
|
+
let renders: readonly CanvasRender[] = [];
|
|
69
|
+
|
|
70
|
+
export function registerCanvasRender(render: CanvasRender): () => void {
|
|
71
|
+
renders = [...renders, render];
|
|
72
|
+
return () => {
|
|
73
|
+
renders = renders.filter((existing) => existing !== render);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The first registered medium's rendering of `canvas` at `size`, or null. */
|
|
78
|
+
export async function renderedCanvasFrame(
|
|
79
|
+
canvas: HTMLCanvasElement,
|
|
80
|
+
size: { readonly width: number; readonly height: number },
|
|
81
|
+
): Promise<CanvasImageSource | null> {
|
|
82
|
+
for (const render of renders) {
|
|
83
|
+
const pending = render(canvas, size);
|
|
84
|
+
if (pending === null) continue;
|
|
85
|
+
return pending;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE FREE CAPTURE CAMERA AND CLIP POSE, validated at the relay boundary —
|
|
3
|
+
* `--azimuth/--elevation/--distance` and `--clip/--time` as they arrive on a
|
|
4
|
+
* capture command.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from `command-listener.ts:1016,1053`, where both parsers were
|
|
7
|
+
* private to that module and already served TWO verbs:
|
|
8
|
+
* `capture-asset-preview`, which stays in that table, and
|
|
9
|
+
* `capture-story-variants`, which carries its own relay budget and so is a
|
|
10
|
+
* registered command (`stories/story-capture-command.ts`). Two callers before
|
|
11
|
+
* the move and two after; nothing here is new.
|
|
12
|
+
*
|
|
13
|
+
* THE VERB NAMES ITSELF. Both refusals used to spell `capture-asset-preview`
|
|
14
|
+
* unconditionally, so a bad `--azimuth` on the editor's `screenshot <module>.stories.tsx` command
|
|
15
|
+
* refused in the name of a command the caller never ran. The verb is a
|
|
16
|
+
* parameter now, which the extraction is what made visible.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** Validate an untrusted `camera` payload: the parsed choice, `undefined` when
|
|
20
|
+
* absent, or the refusal message naming `verb`. */
|
|
21
|
+
export function parseCameraChoice(
|
|
22
|
+
verb: string,
|
|
23
|
+
value: unknown,
|
|
24
|
+
): { azimuthDegrees: number; elevationDegrees: number; distance?: number } | undefined | string {
|
|
25
|
+
if (value === undefined) return undefined;
|
|
26
|
+
const record = value as {
|
|
27
|
+
azimuthDegrees?: unknown;
|
|
28
|
+
elevationDegrees?: unknown;
|
|
29
|
+
distance?: unknown;
|
|
30
|
+
} | null;
|
|
31
|
+
if (
|
|
32
|
+
record === null ||
|
|
33
|
+
typeof record !== 'object' ||
|
|
34
|
+
typeof record.azimuthDegrees !== 'number' ||
|
|
35
|
+
!Number.isFinite(record.azimuthDegrees) ||
|
|
36
|
+
typeof record.elevationDegrees !== 'number' ||
|
|
37
|
+
!Number.isFinite(record.elevationDegrees) ||
|
|
38
|
+
record.elevationDegrees < -90 ||
|
|
39
|
+
record.elevationDegrees > 90 ||
|
|
40
|
+
(record.distance !== undefined &&
|
|
41
|
+
(typeof record.distance !== 'number' ||
|
|
42
|
+
!Number.isFinite(record.distance) ||
|
|
43
|
+
record.distance <= 0))
|
|
44
|
+
) {
|
|
45
|
+
return (
|
|
46
|
+
`${verb} camera must be {azimuthDegrees, elevationDegrees in [-90, 90], ` +
|
|
47
|
+
'distance? > 0 meters}.'
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
azimuthDegrees: record.azimuthDegrees,
|
|
52
|
+
elevationDegrees: record.elevationDegrees,
|
|
53
|
+
...(record.distance === undefined ? {} : { distance: record.distance }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Validate an untrusted `pose` payload: the parsed pose, `undefined` when
|
|
58
|
+
* absent, or the refusal message naming `verb`. */
|
|
59
|
+
export function parsePoseChoice(
|
|
60
|
+
verb: string,
|
|
61
|
+
value: unknown,
|
|
62
|
+
): { clip: string; timeSeconds: number } | undefined | string {
|
|
63
|
+
if (value === undefined) return undefined;
|
|
64
|
+
const record = value as { clip?: unknown; timeSeconds?: unknown } | null;
|
|
65
|
+
if (
|
|
66
|
+
record === null ||
|
|
67
|
+
typeof record !== 'object' ||
|
|
68
|
+
typeof record.clip !== 'string' ||
|
|
69
|
+
record.clip.length === 0 ||
|
|
70
|
+
typeof record.timeSeconds !== 'number' ||
|
|
71
|
+
!Number.isFinite(record.timeSeconds) ||
|
|
72
|
+
record.timeSeconds < 0
|
|
73
|
+
) {
|
|
74
|
+
return `${verb} pose must be {clip: non-empty string, timeSeconds >= 0}.`;
|
|
75
|
+
}
|
|
76
|
+
return { clip: record.clip, timeSeconds: record.timeSeconds };
|
|
77
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { CaptureDimensions } from '@volter/sdk';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The dimensions a capture verb was asked for, or the refusal that names the
|
|
5
|
+
* value it was handed.
|
|
6
|
+
*
|
|
7
|
+
* SQUARE IS THE DEFAULT and `size` is how you ask for one. `width`+`height`
|
|
8
|
+
* together ask for a SHAPED frame — a video-aspect look that needs no crop
|
|
9
|
+
* afterwards — and are bounded per side and in TOTAL by the same relay budget
|
|
10
|
+
* the square ceiling comes from. Mixing the two forms is refused rather than
|
|
11
|
+
* silently resolved: a caller who sent both does not know which one they meant.
|
|
12
|
+
*
|
|
13
|
+
* `cmd` is WIRE INPUT — a JSON object from another process — so `cmd['size']`
|
|
14
|
+
* had never been anything but a cast (`as number | undefined`). A caller that
|
|
15
|
+
* sent a non-number got that value multiplied by 2 deep inside
|
|
16
|
+
* `_renderViewportImage` and `createImageData(NaN, NaN)` threw
|
|
17
|
+
* `TypeError: Value is not of type 'long'` from the middle of the render path;
|
|
18
|
+
* because the dispatcher's `.then()` had no rejection leg, the throw answered
|
|
19
|
+
* nobody and the caller waited out its whole budget for
|
|
20
|
+
* "the tab is present … and did not respond" — a message about the TAB for a
|
|
21
|
+
* defect in the argument. Measured on a racing-game ingest mount, 2026-08-15.
|
|
22
|
+
*/
|
|
23
|
+
export function captureSizeFromCommand(
|
|
24
|
+
cmd: Readonly<Record<string, unknown>>,
|
|
25
|
+
): { size?: CaptureDimensions } | { error: string } {
|
|
26
|
+
const raw = cmd['size'];
|
|
27
|
+
const rawWidth = cmd['width'];
|
|
28
|
+
const rawHeight = cmd['height'];
|
|
29
|
+
const shaped = rawWidth !== undefined || rawHeight !== undefined;
|
|
30
|
+
if (shaped) {
|
|
31
|
+
if (raw !== undefined && raw !== null) {
|
|
32
|
+
return {
|
|
33
|
+
error:
|
|
34
|
+
`${String(cmd['type'])}: pass "size" (a square) OR "width"+"height" (a shaped frame), ` +
|
|
35
|
+
'never both.',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const dimension = (name: string, value: unknown): number | string => {
|
|
39
|
+
if (typeof value !== 'number' || !Number.isInteger(value)) {
|
|
40
|
+
return (
|
|
41
|
+
`${String(cmd['type'])}: "${name}" must be a whole number — got ` +
|
|
42
|
+
`${typeof value} ${JSON.stringify(value) ?? String(value)}.`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
if (value < MIN_CAPTURE_DIMENSION || value > MAX_CAPTURE_DIMENSION) {
|
|
46
|
+
return `${String(cmd['type'])}: "${name}" must be ${MIN_CAPTURE_DIMENSION}-${MAX_CAPTURE_DIMENSION} — ${CAPTURE_BUDGET_REASON}`;
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
};
|
|
50
|
+
const width = dimension('width', rawWidth);
|
|
51
|
+
if (typeof width === 'string') return { error: width };
|
|
52
|
+
const height = dimension('height', rawHeight);
|
|
53
|
+
if (typeof height === 'string') return { error: height };
|
|
54
|
+
if (width * height > MAX_CAPTURE_DIMENSION * MAX_CAPTURE_DIMENSION) {
|
|
55
|
+
return {
|
|
56
|
+
error:
|
|
57
|
+
`${String(cmd['type'])}: ${width}x${height} is ${width * height} pixels, past the ` +
|
|
58
|
+
`${MAX_CAPTURE_DIMENSION}x${MAX_CAPTURE_DIMENSION} total — ${CAPTURE_BUDGET_REASON}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return { size: { width, height } };
|
|
62
|
+
}
|
|
63
|
+
if (raw === undefined || raw === null) return {};
|
|
64
|
+
if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 1) {
|
|
65
|
+
return {
|
|
66
|
+
error:
|
|
67
|
+
`${String(cmd['type'])}: "size" must be a finite number >= 1 — got ` +
|
|
68
|
+
`${typeof raw} ${JSON.stringify(raw) ?? String(raw)}.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return { size: raw };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The editor's own capture ceiling, and WHY it is this number.
|
|
76
|
+
*
|
|
77
|
+
* 64..1024 per side is `asset-preview.ts`'s `MIN_SIZE`/`MAX_SIZE`: the pixels
|
|
78
|
+
* cross the editor relay as base64 JSON, and 1024 is where even incompressible
|
|
79
|
+
* RGBA still fits its 50 MB request limit. A shaped frame is held to the same
|
|
80
|
+
* BUDGET rather than a laxer one — its total may not exceed a 1024 square —
|
|
81
|
+
* because the budget is about bytes on the wire, not about shape.
|
|
82
|
+
*/
|
|
83
|
+
const MIN_CAPTURE_DIMENSION = 64;
|
|
84
|
+
const MAX_CAPTURE_DIMENSION = 1024;
|
|
85
|
+
const CAPTURE_BUDGET_REASON =
|
|
86
|
+
"the editor's own ceiling: the pixels cross the relay as base64 JSON, and 1024 is where even " +
|
|
87
|
+
'incompressible RGBA still fits its 50 MB request limit. For more picture, take more views, ' +
|
|
88
|
+
'not bigger ones.';
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CONTRIBUTED CHROME — the registry behind `@volter/sdk/chrome`: the
|
|
3
|
+
* palette actions, application-menu items and header items a package
|
|
4
|
+
* contributes.
|
|
5
|
+
*
|
|
6
|
+
* WHO READS IT, measured rather than assumed: `palette-action-publisher.tsx`
|
|
7
|
+
* takes {@link contributedActions} into the table the frame registers as
|
|
8
|
+
* `MenuId.CommandPalette` items (so ⌘⇧P lists a package's actions with its own
|
|
9
|
+
* labels); `components/ApplicationMenus.tsx` appends
|
|
10
|
+
* {@link contributedMenuItems} per menu id; `components/ProjectHeader.tsx` and
|
|
11
|
+
* `components/Object3DDocumentToolbar.tsx` draw {@link contributedHeaderItems}
|
|
12
|
+
* in the title bar and the document's own strip; `tool-loader.ts` registers
|
|
13
|
+
* what a package declares. Ids are namespaced `tool:` so they never collide
|
|
14
|
+
* with the host's.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
ActionContribution,
|
|
19
|
+
ContributableMenu,
|
|
20
|
+
ContributedAction,
|
|
21
|
+
ContributedMenuItem,
|
|
22
|
+
DocumentHeaderItemProps,
|
|
23
|
+
HeaderPlacement,
|
|
24
|
+
MenuContribution,
|
|
25
|
+
} from '@volter/sdk/chrome';
|
|
26
|
+
import type { ComponentType } from 'react';
|
|
27
|
+
|
|
28
|
+
const CONTRIBUTABLE_MENUS: readonly ContributableMenu[] = [
|
|
29
|
+
'asset',
|
|
30
|
+
'view',
|
|
31
|
+
'window',
|
|
32
|
+
'debug',
|
|
33
|
+
'tools',
|
|
34
|
+
'help',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export interface ContributedHeaderItem {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly order: number;
|
|
40
|
+
readonly placement: HeaderPlacement;
|
|
41
|
+
readonly Component: ComponentType<DocumentHeaderItemProps>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let headerItems: ContributedHeaderItem[] = [];
|
|
45
|
+
let actionRegistrations: readonly ActionContribution[] = [];
|
|
46
|
+
let menuItems: Array<{ menu: ContributableMenu; item: ContributedMenuItem }> = [];
|
|
47
|
+
let version = 0;
|
|
48
|
+
const listeners = new Set<() => void>();
|
|
49
|
+
function notify(): void {
|
|
50
|
+
version++;
|
|
51
|
+
for (const listener of listeners) listener();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function subscribeContributedChrome(listener: () => void): () => void {
|
|
55
|
+
listeners.add(listener);
|
|
56
|
+
return () => listeners.delete(listener);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function contributedChromeVersion(): number {
|
|
60
|
+
return version;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Header items in `order`, ties by registration. */
|
|
64
|
+
export function contributedHeaderItems(
|
|
65
|
+
placement: HeaderPlacement = 'transport',
|
|
66
|
+
): readonly ContributedHeaderItem[] {
|
|
67
|
+
return headerItems
|
|
68
|
+
.filter((item) => item.placement === placement)
|
|
69
|
+
.sort((a, b) => a.order - b.order);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Register one header item (`.header.tsx`, `tool:<id>`). Returns the unregister. */
|
|
73
|
+
export function registerContributedHeaderItem(item: ContributedHeaderItem): () => void {
|
|
74
|
+
if (headerItems.some((existing) => existing.id === item.id))
|
|
75
|
+
throw new Error(`header item "${item.id}" is already contributed.`);
|
|
76
|
+
headerItems = [...headerItems, item];
|
|
77
|
+
notify();
|
|
78
|
+
return () => {
|
|
79
|
+
headerItems = headerItems.filter((existing) => existing !== item);
|
|
80
|
+
notify();
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function contributedActions(): readonly ContributedAction[] {
|
|
85
|
+
const seen = new Set<string>();
|
|
86
|
+
const out: ContributedAction[] = [];
|
|
87
|
+
for (const registration of actionRegistrations) {
|
|
88
|
+
const list =
|
|
89
|
+
typeof registration.actions === 'function' ? registration.actions() : registration.actions;
|
|
90
|
+
for (const action of list) {
|
|
91
|
+
const id = `tool:${action.id}`;
|
|
92
|
+
// A live set may repeat a static id across its own reads; first wins.
|
|
93
|
+
if (seen.has(id)) continue;
|
|
94
|
+
seen.add(id);
|
|
95
|
+
out.push({ ...action, id });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function contributedMenuItems(menu: ContributableMenu): readonly ContributedMenuItem[] {
|
|
102
|
+
return menuItems.filter((entry) => entry.menu === menu).map((entry) => entry.item);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function isContributableMenu(value: unknown): value is ContributableMenu {
|
|
106
|
+
return typeof value === 'string' && (CONTRIBUTABLE_MENUS as readonly string[]).includes(value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Register a contribution's actions, each under `tool:<id>`. A fixed list is
|
|
111
|
+
* checked for duplicate ids now; a live one (`actions` as a function) is read
|
|
112
|
+
* on every listing and re-listed whenever its `subscribe` fires. Returns the
|
|
113
|
+
* unregister.
|
|
114
|
+
*/
|
|
115
|
+
export function registerContributedActions(contribution: ActionContribution): () => void {
|
|
116
|
+
if (typeof contribution.actions !== 'function') {
|
|
117
|
+
const listed = contributedActions();
|
|
118
|
+
for (const action of contribution.actions)
|
|
119
|
+
if (listed.some((existing) => existing.id === `tool:${action.id}`))
|
|
120
|
+
throw new Error(`action "tool:${action.id}" is already contributed.`);
|
|
121
|
+
}
|
|
122
|
+
actionRegistrations = [...actionRegistrations, contribution];
|
|
123
|
+
const stop = contribution.subscribe?.(notify);
|
|
124
|
+
notify();
|
|
125
|
+
return () => {
|
|
126
|
+
stop?.();
|
|
127
|
+
actionRegistrations = actionRegistrations.filter((existing) => existing !== contribution);
|
|
128
|
+
notify();
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Register a contribution's menu items on one menu. Returns the unregister. */
|
|
133
|
+
export function registerContributedMenu(contribution: MenuContribution): () => void {
|
|
134
|
+
const added = contribution.items.map((item) => ({
|
|
135
|
+
menu: contribution.menu,
|
|
136
|
+
item: { ...item, id: `tool:${item.id}` },
|
|
137
|
+
}));
|
|
138
|
+
for (const entry of added)
|
|
139
|
+
if (menuItems.some((existing) => existing.item.id === entry.item.id))
|
|
140
|
+
throw new Error(`menu item "${entry.item.id}" is already contributed.`);
|
|
141
|
+
menuItems = [...menuItems, ...added];
|
|
142
|
+
notify();
|
|
143
|
+
return () => {
|
|
144
|
+
menuItems = menuItems.filter((entry) => !added.includes(entry));
|
|
145
|
+
notify();
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A fingerprint of every contributed item's CURRENT `disabled` answer, across
|
|
151
|
+
* every menu. The point (`@volter/sdk/chrome`) promises that `disabled`
|
|
152
|
+
* is asked at render and may follow session state — which is only true if
|
|
153
|
+
* something re-renders the bar when that state moves. `ApplicationMenus`
|
|
154
|
+
* samples this on the shared availability tick while a menu is OPEN, so an
|
|
155
|
+
* item can go live or dead under the cursor and costs nothing when closed.
|
|
156
|
+
*/
|
|
157
|
+
export function contributedDisabledFingerprint(): string {
|
|
158
|
+
return menuItems.map((entry) => (entry.item.disabled?.({}) ? '1' : '0')).join('');
|
|
159
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A CHROME SLOT IS A PLACE, NOT A PANEL — the third registry in the same
|
|
3
|
+
* family as `workspace-document-restore.ts` (a kind owns its persisted state)
|
|
4
|
+
* and `document-open-registry.ts` (a kind owns how it opens). Here: the host
|
|
5
|
+
* owns WHERE something sits and how big it is; a package owns WHAT sits there.
|
|
6
|
+
*
|
|
7
|
+
* WHY IT EXISTS. The host's chrome had two places whose CONTENT was a product
|
|
8
|
+
* opinion rather than a workbench concern: the `agent` static panel
|
|
9
|
+
* (`components/workspace-static-panel-registry.tsx` imported
|
|
10
|
+
* `ConversationPanel`) and the bottom bar beside the status line
|
|
11
|
+
* (`components/EditorBottomBar.tsx` imported `HarnessConversationTray`). Both
|
|
12
|
+
* are an AGENT-HARNESS conversation surface — it talks to coding harnesses, not
|
|
13
|
+
* to a game, not to a document — so a base library for making IDEs should not
|
|
14
|
+
* carry it, and neither of the two existing seams fits: it is not a document,
|
|
15
|
+
* so it neither opens nor persists (WORK.md §The open-source launch, phase 1
|
|
16
|
+
* unit 6 half A).
|
|
17
|
+
*
|
|
18
|
+
* WHAT A SLOT ID IS. A plain string in the host's own vocabulary, spelled at
|
|
19
|
+
* the ONE host call site that renders the slot. The host declares the place in
|
|
20
|
+
* its own layout inventory (`workspace-static-panels.ts` still lists the
|
|
21
|
+
* `agent` panel's title, hotkey scope and placement, because the frame
|
|
22
|
+
* PERSISTS panel ids and the tab's own chrome is the dock's); what it no
|
|
23
|
+
* longer holds is the surface.
|
|
24
|
+
*
|
|
25
|
+
* NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
|
|
26
|
+
* filler for a slot renders nothing there — the same honest emptiness a
|
|
27
|
+
* document kind with no registered opener gives.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import type { ComponentType } from 'react';
|
|
31
|
+
|
|
32
|
+
export interface ChromeSlotFiller {
|
|
33
|
+
/** The place, in the host's vocabulary (`panel:agent`, `bottom-bar`). */
|
|
34
|
+
readonly slot: string;
|
|
35
|
+
/** Which module registered it. Re-registering the same owner+slot REPLACES,
|
|
36
|
+
* so an HMR re-evaluation leaves one filler, not two. */
|
|
37
|
+
readonly owner: string;
|
|
38
|
+
/** Ascending; ties keep registration order. */
|
|
39
|
+
readonly order?: number;
|
|
40
|
+
readonly Content: ComponentType;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const _fillers = new Map<string, ChromeSlotFiller[]>();
|
|
44
|
+
const listeners = new Set<() => void>();
|
|
45
|
+
let version = 0;
|
|
46
|
+
|
|
47
|
+
function publish(): void {
|
|
48
|
+
version++;
|
|
49
|
+
for (const listener of listeners) listener();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Install a filler. Returns the teardown. */
|
|
53
|
+
export function registerChromeSlot(filler: ChromeSlotFiller): () => void {
|
|
54
|
+
const existing = _fillers.get(filler.slot) ?? [];
|
|
55
|
+
const next = existing.filter((item) => item.owner !== filler.owner);
|
|
56
|
+
next.push(filler);
|
|
57
|
+
next.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
58
|
+
_fillers.set(filler.slot, next);
|
|
59
|
+
publish();
|
|
60
|
+
return () => {
|
|
61
|
+
const current = _fillers.get(filler.slot);
|
|
62
|
+
if (!current) return;
|
|
63
|
+
const remaining = current.filter((item) => item !== filler);
|
|
64
|
+
if (remaining.length === 0) _fillers.delete(filler.slot);
|
|
65
|
+
else _fillers.set(filler.slot, remaining);
|
|
66
|
+
publish();
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Everything registered for `slot`, in order. A stable array per version, so
|
|
71
|
+
* it is a safe `useSyncExternalStore` snapshot. */
|
|
72
|
+
export function chromeSlotFillers(slot: string): readonly ChromeSlotFiller[] {
|
|
73
|
+
return _fillers.get(slot) ?? EMPTY;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const EMPTY: readonly ChromeSlotFiller[] = [];
|
|
77
|
+
|
|
78
|
+
export function subscribeChromeSlots(listener: () => void): () => void {
|
|
79
|
+
listeners.add(listener);
|
|
80
|
+
return () => listeners.delete(listener);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function chromeSlotRegistryVersion(): number {
|
|
84
|
+
return version;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Test-only reset (mirrors the restore and open registries' own). */
|
|
88
|
+
export function __resetChromeSlotsForTest(): void {
|
|
89
|
+
_fillers.clear();
|
|
90
|
+
publish();
|
|
91
|
+
}
|