@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
package/src/layouts.tsx
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/** Programmable editor composition. Layouts are React components, not registry keys. */
|
|
2
|
+
import { type ComponentType, type CSSProperties, createElement, type ReactNode } from 'react';
|
|
3
|
+
import { DesignArrangement, type WorkspaceArrangement } from './layout-arrangements';
|
|
4
|
+
import type { EditorView } from './types';
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
DesignArrangement,
|
|
8
|
+
GameArrangement,
|
|
9
|
+
type WorkspaceArrangement,
|
|
10
|
+
} from './layout-arrangements';
|
|
11
|
+
|
|
12
|
+
export interface EditorLayoutProps {
|
|
13
|
+
readonly playing: boolean;
|
|
14
|
+
readonly paused: boolean;
|
|
15
|
+
}
|
|
16
|
+
export type EditorLayout = ComponentType<EditorLayoutProps>;
|
|
17
|
+
export interface LayoutFrameProps {
|
|
18
|
+
readonly children?: ReactNode;
|
|
19
|
+
readonly style?: CSSProperties;
|
|
20
|
+
/** Let the enclosing web page scroll when the pointer is over a viewport. */
|
|
21
|
+
readonly pageScroll?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface WorkspaceProps {
|
|
24
|
+
readonly arrangement?: WorkspaceArrangement;
|
|
25
|
+
readonly immersivePlay?: boolean;
|
|
26
|
+
readonly playUtilities?: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export interface DocumentHandle {
|
|
29
|
+
/** Select exactly one named native object; ambiguous/missing names refuse. */
|
|
30
|
+
select(name: string): void;
|
|
31
|
+
transform(mode: 'combined' | 'translate' | 'rotate' | 'scale'): void;
|
|
32
|
+
frame(): void;
|
|
33
|
+
}
|
|
34
|
+
export interface DocumentViewProps {
|
|
35
|
+
readonly document:
|
|
36
|
+
| Extract<NonNullable<EditorView['document']>, { kind: 'story' | 'workspace' }>
|
|
37
|
+
| {
|
|
38
|
+
readonly kind: 'asset';
|
|
39
|
+
readonly path: string;
|
|
40
|
+
readonly assetKind?: 'source' | 'model' | 'image' | 'audio' | 'json';
|
|
41
|
+
};
|
|
42
|
+
readonly chrome?: boolean;
|
|
43
|
+
readonly active?: boolean;
|
|
44
|
+
readonly onReady?: (document: DocumentHandle) => void;
|
|
45
|
+
}
|
|
46
|
+
export interface LayoutHost {
|
|
47
|
+
readonly Frame: ComponentType<LayoutFrameProps>;
|
|
48
|
+
readonly Header: ComponentType;
|
|
49
|
+
readonly Footer: ComponentType;
|
|
50
|
+
readonly Workspace: ComponentType<WorkspaceProps>;
|
|
51
|
+
readonly Document: ComponentType<DocumentViewProps>;
|
|
52
|
+
}
|
|
53
|
+
const HOST_KEY = Symbol.for('volter.editor.layout-host');
|
|
54
|
+
const hosts = globalThis as typeof globalThis & { [HOST_KEY]?: LayoutHost };
|
|
55
|
+
/** Installed once by the editor runtime; project modules share this SDK instance. */
|
|
56
|
+
export function registerLayoutHost(value: LayoutHost): void {
|
|
57
|
+
hosts[HOST_KEY] = value;
|
|
58
|
+
}
|
|
59
|
+
function currentHost(): LayoutHost {
|
|
60
|
+
const host = hosts[HOST_KEY];
|
|
61
|
+
if (!host) throw new Error('Editor layouts require an editor host.');
|
|
62
|
+
return host;
|
|
63
|
+
}
|
|
64
|
+
export function EditorFrame(props: LayoutFrameProps) {
|
|
65
|
+
return createElement(currentHost().Frame, props);
|
|
66
|
+
}
|
|
67
|
+
export function EditorHeader() {
|
|
68
|
+
return createElement(currentHost().Header);
|
|
69
|
+
}
|
|
70
|
+
export function EditorFooter() {
|
|
71
|
+
return createElement(currentHost().Footer);
|
|
72
|
+
}
|
|
73
|
+
export function Workspace(props: WorkspaceProps) {
|
|
74
|
+
return createElement(currentHost().Workspace, props);
|
|
75
|
+
}
|
|
76
|
+
export function DocumentView(props: DocumentViewProps) {
|
|
77
|
+
return createElement(currentHost().Document, props);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Full game authoring, with the running game taking over the workspace during Play. */
|
|
81
|
+
export function GameLayout() {
|
|
82
|
+
return (
|
|
83
|
+
<EditorFrame>
|
|
84
|
+
<EditorHeader />
|
|
85
|
+
<Workspace immersivePlay />
|
|
86
|
+
<EditorFooter />
|
|
87
|
+
</EditorFrame>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
/** Studio keeps its authoring panels and opens analytics while the game runs. */
|
|
91
|
+
export function StudioLayout() {
|
|
92
|
+
return (
|
|
93
|
+
<EditorFrame>
|
|
94
|
+
<EditorHeader />
|
|
95
|
+
<Workspace immersivePlay={false} playUtilities={['tool:analytics.analytics']} />
|
|
96
|
+
<EditorFooter />
|
|
97
|
+
</EditorFrame>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
export function DesignLayout() {
|
|
101
|
+
return (
|
|
102
|
+
<EditorFrame>
|
|
103
|
+
<EditorHeader />
|
|
104
|
+
<Workspace arrangement={DesignArrangement} immersivePlay={false} />
|
|
105
|
+
<EditorFooter />
|
|
106
|
+
</EditorFrame>
|
|
107
|
+
);
|
|
108
|
+
}
|
package/src/looks.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Contribution data types are owned by the project adapter contract. */
|
|
2
|
+
export type {
|
|
3
|
+
EditorKeyActionId,
|
|
4
|
+
KeyChord,
|
|
5
|
+
KeymapBindings,
|
|
6
|
+
KeymapContribution,
|
|
7
|
+
KeymapNavigation,
|
|
8
|
+
WorkspaceLayoutRegions,
|
|
9
|
+
WorkspaceLayoutContribution,
|
|
10
|
+
MaterialContribution,
|
|
11
|
+
DensityContribution,
|
|
12
|
+
StageContribution,
|
|
13
|
+
IconCategoryTone,
|
|
14
|
+
IconSetContribution,
|
|
15
|
+
StyleContribution,
|
|
16
|
+
} from '@volter/project/adapter/editor-looks';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project directories a tool may commit generated bytes into, and the one
|
|
3
|
+
* normalizer every writer validates a path with.
|
|
4
|
+
*
|
|
5
|
+
* A project has two of them, and the difference is what SHIPS:
|
|
6
|
+
*
|
|
7
|
+
* - `public/` — game assets. Exported, served at a root-relative URL,
|
|
8
|
+
* loaded by the game's own source.
|
|
9
|
+
* - `references/` — reference material: moodboards, style plates, generated
|
|
10
|
+
* stills and clips an author or an agent looks at while
|
|
11
|
+
* building. Ordinary files, indexed by the editor's Content
|
|
12
|
+
* panel like any other media, and NOT exported — the
|
|
13
|
+
* project's own build copies `publicDir` and nothing else.
|
|
14
|
+
*
|
|
15
|
+
* This lives in the SDK rather than beside one writer because the rule has more
|
|
16
|
+
* than one enforcer: the editor host's atomic project-output writer, and every
|
|
17
|
+
* registered provider boundary that takes an `outputDirectory` from a caller.
|
|
18
|
+
* Two copies of "must be under public/" is how a reference output becomes
|
|
19
|
+
* writable through one door and refused at the next.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** The writable output roots, in the order a chooser should offer them. */
|
|
23
|
+
export const PROJECT_OUTPUT_ROOTS = ['public', 'references'] as const;
|
|
24
|
+
|
|
25
|
+
export type ProjectOutputRoot = (typeof PROJECT_OUTPUT_ROOTS)[number];
|
|
26
|
+
|
|
27
|
+
/** Human-readable list for an error message: `public/` or `references/`. */
|
|
28
|
+
function rootList(): string {
|
|
29
|
+
return PROJECT_OUTPUT_ROOTS.map((root) => `${root}/`).join(' or ');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** POSIX-normalized, `./`-stripped, trailing-slash-stripped. */
|
|
33
|
+
function normalizeSlashes(path: string): string {
|
|
34
|
+
const slashed = path.replaceAll('\\', '/');
|
|
35
|
+
const segments: string[] = [];
|
|
36
|
+
for (const segment of slashed.split('/')) {
|
|
37
|
+
if (segment === '' || segment === '.') continue;
|
|
38
|
+
segments.push(segment);
|
|
39
|
+
}
|
|
40
|
+
return segments.join('/');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The root `path` sits under, or `undefined` when it sits under none. */
|
|
44
|
+
export function projectOutputRootOf(path: string): ProjectOutputRoot | undefined {
|
|
45
|
+
const normalized = normalizeSlashes(path);
|
|
46
|
+
return PROJECT_OUTPUT_ROOTS.find(
|
|
47
|
+
(root) => normalized === root || normalized.startsWith(`${root}/`),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Validate and normalize a project-relative output path.
|
|
53
|
+
*
|
|
54
|
+
* Throws — with a message naming BOTH roots, because the common mistake is
|
|
55
|
+
* knowing about one of them — for an absolute path, an escape, a bare root
|
|
56
|
+
* with no file under it, or anything outside the roots above. `subject` names
|
|
57
|
+
* what is being validated in that message (`Generated output path`, `Fal
|
|
58
|
+
* outputDirectory`, …).
|
|
59
|
+
*/
|
|
60
|
+
export function normalizeProjectOutputPath(
|
|
61
|
+
path: string,
|
|
62
|
+
subject = 'Generated output path',
|
|
63
|
+
): string {
|
|
64
|
+
const normalized = normalizeSlashes(path);
|
|
65
|
+
const escapes = normalized.split('/').includes('..');
|
|
66
|
+
const root = projectOutputRootOf(normalized);
|
|
67
|
+
if (path.startsWith('/') || escapes || root === undefined || normalized === root) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`${subject} ${JSON.stringify(path)} is invalid; it must be a project-relative path under ${rootList()}.`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return normalized;
|
|
73
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TAB RESOURCE CENSUS — one declaration of the profile a browser tab
|
|
3
|
+
* reports about itself, for every compilation unit that speaks it.
|
|
4
|
+
*
|
|
5
|
+
* WHAT IT IS. What a game tab is holding: JS heap, canvas backing stores,
|
|
6
|
+
* renderer resource counts, and how many project mount generations the
|
|
7
|
+
* document has accumulated. Sampled by the page every five seconds and carried
|
|
8
|
+
* on the heartbeat, so that a browser-level renderer death — which the presence
|
|
9
|
+
* system recovers from perfectly and would otherwise leave unexplained — has a
|
|
10
|
+
* number beside it. MEASUREMENT ONLY: nothing anywhere enforces a budget from
|
|
11
|
+
* these. The page-side sampler and its `why` are
|
|
12
|
+
* `packages/sdk/src/kit/tab-census.ts`.
|
|
13
|
+
*
|
|
14
|
+
* WHY IT LIVES HERE. This one shape crosses every compilation unit that speaks
|
|
15
|
+
* it — the page that samples it (`@volter/sdk`'s kit), the editor server
|
|
16
|
+
* that files it and the session journal that prints it (`@volter/editor-core`'s
|
|
17
|
+
* node half), and the extension surface that describes the status response
|
|
18
|
+
* (`@volter/sdk`'s types). `@volter/sdk` is the one package all of
|
|
19
|
+
* them depend on. It does not belong in `@volter/game-runtime`, whose subject is
|
|
20
|
+
* a running game, not an editor session's tabs.
|
|
21
|
+
*
|
|
22
|
+
* Deliberately import-free so a browser bundle can take it: the census's
|
|
23
|
+
* journal, `editor-core/server/support/project/session-journal.ts`, reads
|
|
24
|
+
* `node:fs`.
|
|
25
|
+
*
|
|
26
|
+
* WHAT ELSE RIDES IT. The beat is the one channel that still moves when the
|
|
27
|
+
* page's main thread or a lane's worker is blocked, so `workerCalls` — how long
|
|
28
|
+
* each lane's worker calls are taking, keyed by the lane's own name — and
|
|
29
|
+
* `stalls` — how long the main thread has been stalled — are carried here too
|
|
30
|
+
* (absent until a lane publishes a meter). Same rule as the rest of this file:
|
|
31
|
+
* measurement only, no budget anywhere.
|
|
32
|
+
*
|
|
33
|
+
* ABSENT IS NOT ZERO. `heapUsedMB`/`heapLimitMB` are null off Chromium
|
|
34
|
+
* (`performance.memory` is non-standard). The renderer counts are ABSENT rather
|
|
35
|
+
* than zero when no game has registered a render-debug adapter, and `programs`
|
|
36
|
+
* is absent until a first render: a zero would read as "no textures", which is
|
|
37
|
+
* a different claim from "nobody measured".
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* ONE LANE'S WORKER CALLS, as numbers.
|
|
42
|
+
*
|
|
43
|
+
* WHY (measured 2026-09-16): one Blender call held its worker for over 1,800s
|
|
44
|
+
* and wedged the tab, and a 0.86s-per-call scene stretched into heartbeat
|
|
45
|
+
* timeouts that read as "tab present, did not respond". The product had no
|
|
46
|
+
* number for either. Owner ruling: a tab that stops answering is the product's
|
|
47
|
+
* defect regardless of what the machine is doing, and the product has to
|
|
48
|
+
* surface it — so these ride the census to the editor's `status` command.
|
|
49
|
+
*
|
|
50
|
+
* MEASURED BY THE PAGE, because neither blocked party can report on itself: the
|
|
51
|
+
* worker's own loop is what is stuck, and a stalled main thread cannot send.
|
|
52
|
+
* The call half is the lane's meter (`host.session.reportWorkerCallMeter`), and
|
|
53
|
+
* the stall half is the host's `longtask` observer.
|
|
54
|
+
*
|
|
55
|
+
* MEASUREMENT ONLY. No threshold here cancels, kills or budgets a call.
|
|
56
|
+
*/
|
|
57
|
+
export interface WorkerCallTabMetrics {
|
|
58
|
+
/** Age of the oldest OUTSTANDING worker call, or null when the worker is idle.
|
|
59
|
+
* The only field with a number during a wedge. */
|
|
60
|
+
readonly inFlightMs: number | null;
|
|
61
|
+
/** Duration of the newest completed call; null before the first one. */
|
|
62
|
+
readonly lastCallMs: number | null;
|
|
63
|
+
/** The longest call this page has seen, counting an outstanding one. */
|
|
64
|
+
readonly maxCallMs: number | null;
|
|
65
|
+
/** Optional operation/boundary label supplied by the lane, without request payloads. */
|
|
66
|
+
readonly maxCallLabel?: string | null;
|
|
67
|
+
/** Current cooperative phase and count of settled wire requests; sampled, not pushed per unit. */
|
|
68
|
+
readonly currentPhase?: string | null;
|
|
69
|
+
readonly completedCalls?: number;
|
|
70
|
+
/** Calls past 5s, and past 30s, since this page loaded. */
|
|
71
|
+
readonly callsOver5s: number;
|
|
72
|
+
readonly callsOver30s: number;
|
|
73
|
+
/** The longest long task that overlapped the newest call's window — what the
|
|
74
|
+
* MAIN thread was doing while the worker was busy. Null when there has been
|
|
75
|
+
* no call yet, or no long task during it. */
|
|
76
|
+
readonly lastCallLongestTaskMs: number | null;
|
|
77
|
+
/**
|
|
78
|
+
* THE ENGINE'S OWN MEMORY: the lane's wasm module's linear memory in MB, read
|
|
79
|
+
* in its worker and posted after every call; null when the lane has none.
|
|
80
|
+
*
|
|
81
|
+
* It is here because no other number on this census answers the question.
|
|
82
|
+
* `heapUsedMB` is the PAGE's JS heap — a few tens of MB — while an engine's
|
|
83
|
+
* memory can be the larger half of the tab by far, and a reader looking at
|
|
84
|
+
* the heap line alone concludes the tab is cheap. wasm32 memory never
|
|
85
|
+
* shrinks, so this is simultaneously the current size and the session's
|
|
86
|
+
* high-water mark.
|
|
87
|
+
*/
|
|
88
|
+
readonly wasmMemoryMB: number | null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** THE MAIN THREAD'S STALLS since page load, from the host's `longtask`
|
|
92
|
+
* observer, which starts when the first lane publishes a meter. */
|
|
93
|
+
export interface TabStallMetrics {
|
|
94
|
+
/** Longest `longtask` entry, in ms; null off Chromium (the Long Tasks API is
|
|
95
|
+
* not implemented everywhere) — never 0, which would read as "the main
|
|
96
|
+
* thread never stalled". */
|
|
97
|
+
readonly longestTaskMs: number | null;
|
|
98
|
+
/** How many long tasks ran past 100ms. */
|
|
99
|
+
readonly tasksOver100ms: number;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A census as a CURRENT page produces it and the server files it.
|
|
104
|
+
*
|
|
105
|
+
* Every field here is guaranteed by a producer that always writes it, and
|
|
106
|
+
* `packages/editor-core/server/tab-heartbeat.ts`'s `parseCensus` is where that is
|
|
107
|
+
* checked: a beat frame missing `canvases`, `canvasMB` or `mountEpochs` is
|
|
108
|
+
* rejected outright rather than filed as a partial profile.
|
|
109
|
+
*/
|
|
110
|
+
export interface TabCensus {
|
|
111
|
+
/** `performance.memory.usedJSHeapSize` in MB; null off Chromium. */
|
|
112
|
+
readonly heapUsedMB: number | null;
|
|
113
|
+
/** `performance.memory.jsHeapSizeLimit` in MB; null off Chromium. */
|
|
114
|
+
readonly heapLimitMB: number | null;
|
|
115
|
+
/** Distinct project mount generations fetched by this document. */
|
|
116
|
+
readonly mountEpochs: number;
|
|
117
|
+
/** How many `<canvas>` elements the document holds. */
|
|
118
|
+
readonly canvases: number;
|
|
119
|
+
/** Their total pixel-buffer footprint: Σ width×height×4 bytes, in MB. */
|
|
120
|
+
readonly canvasMB: number;
|
|
121
|
+
/** `renderer.info.memory.textures` — absent with no mounted adapter. */
|
|
122
|
+
readonly textures?: number;
|
|
123
|
+
/** `renderer.info.memory.geometries` — absent with no mounted adapter. */
|
|
124
|
+
readonly geometries?: number;
|
|
125
|
+
/** Compiled programs — absent with no adapter, or before the first render. */
|
|
126
|
+
readonly programs?: number;
|
|
127
|
+
/** Each lane's {@link WorkerCallTabMetrics}, keyed by the name the lane
|
|
128
|
+
* published under — absent until a lane publishes a meter. */
|
|
129
|
+
readonly workerCalls?: Readonly<Record<string, WorkerCallTabMetrics>>;
|
|
130
|
+
/** {@link TabStallMetrics} — absent until the host is watching its stalls. */
|
|
131
|
+
readonly stalls?: TabStallMetrics;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A census read back out of a RECORD, where the writer may predate a field.
|
|
136
|
+
*
|
|
137
|
+
* Exactly one field varies, and this is the only place that is said: a session
|
|
138
|
+
* journal line written before the mount census existed has no `mountEpochs`,
|
|
139
|
+
* and neither does a status response from an older editor server. The
|
|
140
|
+
* difference is a property of the READER's input, so it is named on the
|
|
141
|
+
* reader's type rather than by softening {@link TabCensus} — which is what the
|
|
142
|
+
* four hand-copied declarations did, and how the producers' own guarantee got
|
|
143
|
+
* lost on the way to the two SDKs.
|
|
144
|
+
*
|
|
145
|
+
* There is no runtime narrowing to point at because neither reader has a parse
|
|
146
|
+
* step to put one in: the journal is `JSON.parse` per line by recorded design
|
|
147
|
+
* (`session-journal.ts`: "nothing reads a journal back through a validator"),
|
|
148
|
+
* and the CLI reads the status body as JSON. So the absence is carried in the
|
|
149
|
+
* type and handled where it is printed — `formatTabCensus` omits the words
|
|
150
|
+
* rather than printing a fabricated count. Every {@link TabCensus} is a valid
|
|
151
|
+
* value of this type; the reverse is not.
|
|
152
|
+
*/
|
|
153
|
+
export type RecordedTabCensus = Omit<TabCensus, 'mountEpochs'> & {
|
|
154
|
+
readonly mountEpochs?: number;
|
|
155
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export type ToolContributionPoint =
|
|
2
|
+
| 'workspace.document'
|
|
3
|
+
| 'selection.inspector'
|
|
4
|
+
| 'asset.inspector'
|
|
5
|
+
| 'generation.result'
|
|
6
|
+
| 'workspace.utility'
|
|
7
|
+
| 'workspace.analytics'
|
|
8
|
+
| 'workspace.status';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* One contribution module, FOUND BY SCANNING — never listed anywhere.
|
|
12
|
+
*
|
|
13
|
+
* Nothing enumerates these. `editor/tools/` in project source and `src/` in every
|
|
14
|
+
* `volter`-declaring dependency are walked for the naming convention
|
|
15
|
+
* (`*.document.tsx`, `*.inspector.tsx`, `*.asset-inspector.tsx`,
|
|
16
|
+
* `*.result.tsx`, `*.utility.tsx`, `*.analytics.tsx`), and the module itself declares everything
|
|
17
|
+
* else: `point`, `title` (or `presentations`), and the `tool` it drives, by
|
|
18
|
+
* name. Its id is derived from this path. A manifest cannot disagree with a
|
|
19
|
+
* module it does not mention.
|
|
20
|
+
*/
|
|
21
|
+
export interface ProjectToolContribution {
|
|
22
|
+
/** Project-relative or package-absolute browser module path. */
|
|
23
|
+
entryPath: string;
|
|
24
|
+
/** The dependency that declared it (`package.json#volter.contributions`),
|
|
25
|
+
* absent for the project's own `editor/contributions/` modules. */
|
|
26
|
+
package?: string;
|
|
27
|
+
/** The module's file, for a bundled package's entry (listed by specifier): what the
|
|
28
|
+
* page loads when its bundle carries no loader for it, as a checkout's bundle does
|
|
29
|
+
* not for a contribution added after it was built. */
|
|
30
|
+
filePath?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ProjectToolErrorSummary {
|
|
34
|
+
code: string;
|
|
35
|
+
summary: string;
|
|
36
|
+
dataSchema?: unknown;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ProjectToolCatalogEntry {
|
|
40
|
+
name: string;
|
|
41
|
+
summary: string;
|
|
42
|
+
description: string;
|
|
43
|
+
sourcePath: string;
|
|
44
|
+
inputSchema: unknown;
|
|
45
|
+
resultSchema: unknown;
|
|
46
|
+
errors: ProjectToolErrorSummary[];
|
|
47
|
+
requires: Record<string, boolean | undefined>;
|
|
48
|
+
host: 'node' | 'editor-browser' | 'runtime-page';
|
|
49
|
+
mutates: boolean;
|
|
50
|
+
supportsDryRun: boolean;
|
|
51
|
+
longRunning: boolean;
|
|
52
|
+
permission: { risk: 'read' | 'write' | 'destructive'; summary: string };
|
|
53
|
+
generation?: { provider: string; role: 'submit' | 'poll' | 'cancel' | 'accept' };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ProjectToolLoadError {
|
|
57
|
+
sourcePath: string;
|
|
58
|
+
message: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* What a host says when it cannot load the project's TypeScript at all.
|
|
63
|
+
*
|
|
64
|
+
* ONE owner for the sentence, because two realms reach this state through
|
|
65
|
+
* different doors and both must say the same true thing rather than fall back
|
|
66
|
+
* to a fabricated empty catalog:
|
|
67
|
+
*
|
|
68
|
+
* - the NODE side (`packages/editor/server/project-tools.ts`) when a host
|
|
69
|
+
* builds the catalog with no `loadModule`; and
|
|
70
|
+
* - the PAGE side (`packages/editor/src/project-tools.ts`), whose fetch of
|
|
71
|
+
* `/__editor/project-tools` can be answered by an SPA FALLBACK — `200` and
|
|
72
|
+
* HTML — when no editor server is in front of the origin, so an unguarded
|
|
73
|
+
* fetch that merely checks `response.ok` reads a successful page load as a
|
|
74
|
+
* successful catalog, then dies in
|
|
75
|
+
* `res.json()`. The panel's empty state ("No project tools registered")
|
|
76
|
+
* is a FACT about the project; a host that cannot ask has not learned it.
|
|
77
|
+
*/
|
|
78
|
+
export const NO_PROJECT_MODULE_HOST_MESSAGE =
|
|
79
|
+
'This editor host cannot RUN registered project tools (package.json#volter.tools): callables ' +
|
|
80
|
+
'execute on the Node side. Contribution panels still load from project source; to run the ' +
|
|
81
|
+
'tools themselves, open the project in the Vite-backed dev or packaged editor.';
|
|
82
|
+
|
|
83
|
+
/** The catalog row that states {@link NO_PROJECT_MODULE_HOST_MESSAGE}. */
|
|
84
|
+
export function noProjectModuleHostError(): ProjectToolLoadError {
|
|
85
|
+
return { sourcePath: 'package.json#volter.tools', message: NO_PROJECT_MODULE_HOST_MESSAGE };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Callables and contribution modules are SIBLINGS, not parent and child.
|
|
90
|
+
*
|
|
91
|
+
* They used to be nested — `tools[].contributions[]` — purely so the browser
|
|
92
|
+
* loader had a tool to hand the component. A document is not owned by one
|
|
93
|
+
* callable, and the nesting made project source structurally unable to present
|
|
94
|
+
* a dependency-provided tool. The module names the tool it drives instead.
|
|
95
|
+
*/
|
|
96
|
+
export interface ProjectToolCatalog {
|
|
97
|
+
tools: ProjectToolCatalogEntry[];
|
|
98
|
+
contributions: ProjectToolContribution[];
|
|
99
|
+
loadErrors: ProjectToolLoadError[];
|
|
100
|
+
/** The contribution suffixes the serving host scans for
|
|
101
|
+
* (`TOOL_CONTRIBUTION_SUFFIXES`), so a page built from another revision can
|
|
102
|
+
* say which half is stale. */
|
|
103
|
+
suffixes?: readonly string[];
|
|
104
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W3.1 — `useSelection()`, the tool-hooks contract member about the
|
|
3
|
+
* currently-selected ENTITY.
|
|
4
|
+
*
|
|
5
|
+
* Scope, v1:
|
|
6
|
+
* - INSPECTOR-placement tools only (`placement: 'inspector'`,
|
|
7
|
+
* `define-tool.ts`). `EditorSelectionProvider` is host plumbing —
|
|
8
|
+
* `InspectorToolSection` wraps every tool render in it; dock tools
|
|
9
|
+
* (`ToolHost`/`BottomPanel`) have no adapter/selection in scope and never
|
|
10
|
+
* get a provider. Calling `useSelection()` there throws a teaching error,
|
|
11
|
+
* contained by the tool's `ToolErrorBoundary` (the editor survives).
|
|
12
|
+
* - READ-only. Write through `InspectorProvider.set` (the
|
|
13
|
+
* existing path), never by mutating what this hook returns. Per-entity
|
|
14
|
+
* WRITE-from-tool is deferred with `useTunable` (§10).
|
|
15
|
+
*
|
|
16
|
+
* Liveness — two existing paths reused, no new mechanism (§4's "reuse that
|
|
17
|
+
* path" rule):
|
|
18
|
+
* 1. Selection changes: `Inspector.tsx`'s own
|
|
19
|
+
* `useSyncExternalStore(store.subscribe, store.getSnapshot)` re-renders
|
|
20
|
+
* the panel, each matched `Section` gets the new `nodeId` prop, and
|
|
21
|
+
* `InspectorToolSection` re-creates this provider's context value.
|
|
22
|
+
* 2. Edits while the SAME node stays selected: `adapter.subscribe` fires —
|
|
23
|
+
* this hook keeps a local version counter bumped per notification
|
|
24
|
+
* (exactly `game-state.tsx`'s `useRootObservation` pattern: the adapter
|
|
25
|
+
* has no snapshot/version of its own, `subscribe` is fire-only) and
|
|
26
|
+
* recomputes.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { AuthoringAdapter, EditorNode } from '@volter/project/adapter';
|
|
30
|
+
import {
|
|
31
|
+
createContext,
|
|
32
|
+
type ReactNode,
|
|
33
|
+
useContext,
|
|
34
|
+
useMemo,
|
|
35
|
+
useRef,
|
|
36
|
+
useSyncExternalStore,
|
|
37
|
+
} from 'react';
|
|
38
|
+
|
|
39
|
+
interface SelectionContextValue {
|
|
40
|
+
adapter: AuthoringAdapter;
|
|
41
|
+
nodeId: string | null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const SelectionContext = createContext<SelectionContextValue | null>(null);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* EDITOR-side host plumbing: `InspectorToolSection` wraps a tool's rendered
|
|
48
|
+
* `<Component/>` in this, passing the adapter + nodeId it already holds.
|
|
49
|
+
* Project tools never render this themselves — it exists so `useSelection()`
|
|
50
|
+
* has something to read.
|
|
51
|
+
*/
|
|
52
|
+
export function EditorSelectionProvider({
|
|
53
|
+
adapter,
|
|
54
|
+
nodeId,
|
|
55
|
+
children,
|
|
56
|
+
}: {
|
|
57
|
+
adapter: AuthoringAdapter;
|
|
58
|
+
nodeId: string | null;
|
|
59
|
+
children: ReactNode;
|
|
60
|
+
}) {
|
|
61
|
+
const value = useMemo(() => ({ adapter, nodeId }), [adapter, nodeId]);
|
|
62
|
+
return <SelectionContext.Provider value={value}>{children}</SelectionContext.Provider>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface EditorSelection {
|
|
66
|
+
nodeId: string | null;
|
|
67
|
+
node: EditorNode | null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The selected entity, live (read-only — see module doc).
|
|
72
|
+
*
|
|
73
|
+
* Throws outside an `EditorSelectionProvider` — inspector tools always render
|
|
74
|
+
* inside one; a dock tool or game-code caller does not, and the error names
|
|
75
|
+
* the fix rather than failing silently.
|
|
76
|
+
*/
|
|
77
|
+
export function useSelection(): EditorSelection {
|
|
78
|
+
const ctx = useContext(SelectionContext);
|
|
79
|
+
if (!ctx) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
'useSelection: no editor selection in context — this hook only works inside an editor-hosted ' +
|
|
82
|
+
"INSPECTOR tool (placement: 'inspector'). Dock tools and " +
|
|
83
|
+
'game code have no selection to read.',
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
const { adapter, nodeId } = ctx;
|
|
87
|
+
|
|
88
|
+
// Local version counter bumped per adapter notification — the adapter has
|
|
89
|
+
// no snapshot/version of its own, `subscribe` is fire-only (same pattern
|
|
90
|
+
// as `useRootObservation`'s `versionRef`, game-state.tsx).
|
|
91
|
+
const versionRef = useRef(0);
|
|
92
|
+
const version = useSyncExternalStore(
|
|
93
|
+
(onStoreChange) =>
|
|
94
|
+
adapter.subscribe?.(() => {
|
|
95
|
+
versionRef.current++;
|
|
96
|
+
onStoreChange();
|
|
97
|
+
}) ?? (() => {}),
|
|
98
|
+
() => versionRef.current,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return useMemo(() => {
|
|
102
|
+
const node = nodeId ? adapter.hierarchy.node(nodeId) : null;
|
|
103
|
+
return { nodeId, node };
|
|
104
|
+
// `version` has no value of its own — only its CHANGE matters, as the
|
|
105
|
+
// liveness signal described above.
|
|
106
|
+
}, [adapter, nodeId, version]);
|
|
107
|
+
}
|
package/src/services.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE SERVICE POINT (page side) — code a package RUNS for as long as its
|
|
3
|
+
* contributions are loaded (WORKBENCH.md §Contribution points, `service`):
|
|
4
|
+
* a page-wide guard, a worker, a listener. The module declares the point and
|
|
5
|
+
* exports `start`, which returns the stop; the host starts every service
|
|
6
|
+
* after a contribution pass and stops it before the next.
|
|
7
|
+
*
|
|
8
|
+
* `audio-unlock.service.ts`
|
|
9
|
+
* export const point = 'workspace.service';
|
|
10
|
+
* export function start(): () => void { … }
|
|
11
|
+
*
|
|
12
|
+
* A service that must run BEFORE a project opens does not belong here — it
|
|
13
|
+
* is the host's boot. Everything that only matters once a project's own
|
|
14
|
+
* packages are known does.
|
|
15
|
+
*/
|
|
16
|
+
export interface ServiceContribution {
|
|
17
|
+
start(): (() => void) | undefined | void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transient facts about one native project build. The report crosses the
|
|
3
|
+
* editor server's existing export SSE response; it is not persisted as a
|
|
4
|
+
* project document or sidecar. Paths are relative to the project's `dist/`.
|
|
5
|
+
*/
|
|
6
|
+
/** The web build's download name: `<project-slug>-web.zip`. */
|
|
7
|
+
export function webBuildArtifactName(projectSlug: string): string {
|
|
8
|
+
return `${projectSlug}-web.zip`;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface BuildReportFile {
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly bytes: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface BuildReport {
|
|
17
|
+
readonly artifact: string;
|
|
18
|
+
readonly artifactBytes: number;
|
|
19
|
+
readonly outputBytes: number;
|
|
20
|
+
readonly fileCount: number;
|
|
21
|
+
readonly largestFiles: readonly BuildReportFile[];
|
|
22
|
+
}
|