@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/session.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE SESSION FACE — what the session SERVER and the editor PAGE both agree on.
|
|
3
|
+
*
|
|
4
|
+
* `@volter/sdk` is the API with four faces (ARCHITECTURE-CORE §The target
|
|
5
|
+
* shape): protocol, host doors + layouts, widgets, session client. This is the
|
|
6
|
+
* protocol face's home, and it exists because of a LICENCE fact, not tidiness:
|
|
7
|
+
* the target shape's editor-kit row says the session server and the CLI are
|
|
8
|
+
* Apache "ONLY once the session imports nothing of the editor". Every module
|
|
9
|
+
* re-exported here used to live in `packages/editor/src/` (AGPL-3.0-only) and
|
|
10
|
+
* was value-imported by `packages/editor/server/**`, so the Node session's
|
|
11
|
+
* import graph reached AGPL application code on every boot.
|
|
12
|
+
*
|
|
13
|
+
* What qualifies for this face: a shape TWO programs must agree on, that imports
|
|
14
|
+
* neither React, nor the editor shell store, nor `node:` — measured, not
|
|
15
|
+
* asserted. All twelve below import nothing but `../share`, `@volter/project`'s
|
|
16
|
+
* manifest schema, and each other. A module the editor app merely happens to
|
|
17
|
+
* share with the server does NOT qualify; it stays where it is and shows up in
|
|
18
|
+
* `scripts/validate-import-bans.mjs`'s `server-imports-editor-app` ratchet with
|
|
19
|
+
* a reason, until someone makes it a contract or deletes it.
|
|
20
|
+
*
|
|
21
|
+
* IMPORT THE MODULE, NOT THIS BARREL, from anything the closure meter watches:
|
|
22
|
+
* `@volter/sdk/session/relative-path-guard`. The subpath is a wildcard
|
|
23
|
+
* export (`"./session/*"`), the same shape the runtime packages use, because
|
|
24
|
+
* `export *` here would put all twelve modules in every consumer's static
|
|
25
|
+
* value-import closure — measured at +4 files on the `full` build and +5 on
|
|
26
|
+
* `models` the one time this file was the door. This barrel is documentation
|
|
27
|
+
* and a convenience for callers no meter watches.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export * from './session/build-report';
|
|
31
|
+
export * from './session/collaboration-types';
|
|
32
|
+
export * from './session/command-table';
|
|
33
|
+
export * from './session/editor-brand';
|
|
34
|
+
export * from './session/editor-compatibility';
|
|
35
|
+
export * from './session/editor-control-lifecycle';
|
|
36
|
+
export * from './session/editor-control-protocol';
|
|
37
|
+
export * from './session/game-css-scope';
|
|
38
|
+
export * from './session/project-module-url';
|
|
39
|
+
export * from './session/relative-path-guard';
|
|
40
|
+
export * from './session/source-glob';
|
|
41
|
+
export * from './session/tool-contribution-convention';
|
package/src/share.ts
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE share-session wire — `/__editor/share-control`'s payloads, declared once.
|
|
3
|
+
*
|
|
4
|
+
* This route has three clients living in three different compilation units:
|
|
5
|
+
* the editor SERVER that serves it (`packages/editor/server/`), the browser
|
|
6
|
+
* PANEL that polls it (`packages/editor/src/`), and the `volter share` CLI
|
|
7
|
+
* (`packages/volter-cli/src/`). Each of them used to declare its own copy of the
|
|
8
|
+
* payload, and the copies had already drifted — silently, in both directions,
|
|
9
|
+
* because an under-declared read of a JSON superset is a type error nowhere:
|
|
10
|
+
*
|
|
11
|
+
* - the CLI's invitation had no `delivery`, so `volter share` could not report
|
|
12
|
+
* that the invitation email had FAILED to send — the one state the field
|
|
13
|
+
* exists for;
|
|
14
|
+
* - the CLI's audit rows typed `type` and `capability` as bare `string`,
|
|
15
|
+
* which accepts any spelling of an event the server never emits;
|
|
16
|
+
* - the browser panel's invitation had no `inviterAccountId`;
|
|
17
|
+
* - the browser panel had no `audit` at all, and re-declared the tunnel
|
|
18
|
+
* health shape inline instead of naming it.
|
|
19
|
+
*
|
|
20
|
+
* This package is the right home for all three: `@volter/editor-core` and the product CLIs
|
|
21
|
+
* both already depend on it, it depends on neither, and the CLI's esbuild
|
|
22
|
+
* bundle inlines it. (The CLI's standing "no editor-package dependency" rule is
|
|
23
|
+
* about `@volter/editor-core` — the server+UI package whose express/vite/chokidar
|
|
24
|
+
* graph the standalone bundle must not drag in. This is a types-only module.)
|
|
25
|
+
*
|
|
26
|
+
* Two things deliberately stay OFF this wire, and stay off it structurally
|
|
27
|
+
* rather than by memory:
|
|
28
|
+
*
|
|
29
|
+
* - the invitation TOKEN HASH, which is a local extension on the server
|
|
30
|
+
* (`share-host.ts`'s `StoredShareInvitation extends ShareInvitationRecord`);
|
|
31
|
+
* - a participant's ORGANIZATION list, which the gateway holds on its own
|
|
32
|
+
* `ShareAccountProjection` to resolve team invitations. {@link ShareAccount}
|
|
33
|
+
* is what a participant projects to, so `status()` narrows to it.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A share role, least authority first.
|
|
38
|
+
*
|
|
39
|
+
* `maintainer` is deliberately absent: it is local-only and has no share role,
|
|
40
|
+
* which is why the editor's `CollaborationRole` is this union PLUS `maintainer`
|
|
41
|
+
* rather than the other way around.
|
|
42
|
+
*/
|
|
43
|
+
export type ShareRole = 'viewer' | 'commenter' | 'tester' | 'editor' | 'terminal';
|
|
44
|
+
|
|
45
|
+
export type ShareTunnelProvider = 'cloudflared' | 'ngrok';
|
|
46
|
+
|
|
47
|
+
export type ShareTunnelState = 'stopped' | 'starting' | 'healthy' | 'failed';
|
|
48
|
+
|
|
49
|
+
export interface ShareTunnelHealth {
|
|
50
|
+
checkedAt: string;
|
|
51
|
+
latencyMs: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The capability vocabulary a grant is checked against.
|
|
56
|
+
*
|
|
57
|
+
* Wider than the roles on purpose: `public` and `never-share` are DECLARATIONS
|
|
58
|
+
* a route makes about itself, and `maintain` is the local-only authority no
|
|
59
|
+
* share role reaches — so this union is not derivable from {@link ShareRole}.
|
|
60
|
+
*/
|
|
61
|
+
export type ShareCapability =
|
|
62
|
+
| 'public'
|
|
63
|
+
| 'view'
|
|
64
|
+
| 'comment'
|
|
65
|
+
| 'test'
|
|
66
|
+
| 'edit'
|
|
67
|
+
| 'terminal'
|
|
68
|
+
| 'maintain'
|
|
69
|
+
| 'never-share';
|
|
70
|
+
|
|
71
|
+
/** A verified Volter account, as a share participant projects onto the wire. */
|
|
72
|
+
export interface ShareAccount {
|
|
73
|
+
id: string;
|
|
74
|
+
email: string;
|
|
75
|
+
name?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* How the invitation was DELIVERED, when we delivered it.
|
|
80
|
+
*
|
|
81
|
+
* Present-and-`failed` is the state this field exists for: an invitation
|
|
82
|
+
* created whose email never left is otherwise indistinguishable, on every
|
|
83
|
+
* surface, from one that arrived.
|
|
84
|
+
*/
|
|
85
|
+
export interface ShareInvitationDelivery {
|
|
86
|
+
channel: 'clerk-email';
|
|
87
|
+
status: 'sent' | 'failed';
|
|
88
|
+
providerInvitationId?: string;
|
|
89
|
+
sentAt?: string;
|
|
90
|
+
problem?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface ShareInvitationRecord {
|
|
94
|
+
id: string;
|
|
95
|
+
inviterAccountId: string;
|
|
96
|
+
recipientAccountId?: string;
|
|
97
|
+
recipientEmail?: string;
|
|
98
|
+
recipientOrganizationId?: string;
|
|
99
|
+
recipientOrganizationName?: string;
|
|
100
|
+
recipientOrganizationDomain?: string;
|
|
101
|
+
/** The highest role this invitation may ever be raised to. */
|
|
102
|
+
roleCeiling: ShareRole;
|
|
103
|
+
usePolicy: 'person' | 'team';
|
|
104
|
+
createdAt: string;
|
|
105
|
+
expiresAt: string;
|
|
106
|
+
revokedAt?: string;
|
|
107
|
+
delivery?: ShareInvitationDelivery;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface ShareParticipant {
|
|
111
|
+
participantId: string;
|
|
112
|
+
account: ShareAccount;
|
|
113
|
+
invitationId: string;
|
|
114
|
+
role: ShareRole;
|
|
115
|
+
roleCeiling: ShareRole;
|
|
116
|
+
credentials: number;
|
|
117
|
+
joined: boolean;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type ShareAuditEventType =
|
|
121
|
+
| 'auth-failed'
|
|
122
|
+
| 'auth-started'
|
|
123
|
+
| 'invite-redeemed'
|
|
124
|
+
| 'capability-denied'
|
|
125
|
+
| 'role-changed'
|
|
126
|
+
| 'participant-kicked'
|
|
127
|
+
| 'invitation-revoked'
|
|
128
|
+
| 'terminal-invoked';
|
|
129
|
+
|
|
130
|
+
export interface ShareAuditEvent {
|
|
131
|
+
at: string;
|
|
132
|
+
type: ShareAuditEventType;
|
|
133
|
+
invitationId?: string;
|
|
134
|
+
participantId?: string;
|
|
135
|
+
accountId?: string;
|
|
136
|
+
capability?: ShareCapability;
|
|
137
|
+
/** The role a `role-changed` event settled on. */
|
|
138
|
+
role?: ShareRole;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** The `/__editor/share-control/status` payload. */
|
|
142
|
+
export interface ShareStatus {
|
|
143
|
+
active: boolean;
|
|
144
|
+
sessionId: string;
|
|
145
|
+
projectRoot: string;
|
|
146
|
+
publicUrl?: string;
|
|
147
|
+
tunnelProvider?: ShareTunnelProvider;
|
|
148
|
+
tunnel: ShareTunnelState;
|
|
149
|
+
health?: ShareTunnelHealth;
|
|
150
|
+
invitations: readonly ShareInvitationRecord[];
|
|
151
|
+
participants: readonly ShareParticipant[];
|
|
152
|
+
audit: readonly ShareAuditEvent[];
|
|
153
|
+
problem?: string;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** The `/__editor/share-control/invitations` reply. */
|
|
157
|
+
export interface CreatedShareInvitation {
|
|
158
|
+
invitation: ShareInvitationRecord;
|
|
159
|
+
url: string;
|
|
160
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE COMPONENT-CONTRACT ANALYZER — the one browser-side question the kit's Content index asks
|
|
3
|
+
* of a source-authoring integration: what authoring contract each component a module defines
|
|
4
|
+
* exposes (which transform props land where, which channels it binds). An integration's
|
|
5
|
+
* contribution registers the analyzer; the index reads it. With none registered, a module
|
|
6
|
+
* declares no contracts, which is the honest answer for a product with no such integration.
|
|
7
|
+
*
|
|
8
|
+
* Module state under a `Symbol.for` key, like the host door, so the registration and the read
|
|
9
|
+
* meet across the editor's module instances.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { R3fComponentContract } from './source-authoring';
|
|
13
|
+
|
|
14
|
+
export type ComponentContractAnalyzer = (
|
|
15
|
+
source: string,
|
|
16
|
+
path: string,
|
|
17
|
+
) => ReadonlyMap<string, R3fComponentContract>;
|
|
18
|
+
|
|
19
|
+
const ANALYZER_KEY = Symbol.for('volter.editor.componentContractAnalyzer');
|
|
20
|
+
type AnalyzerSlot = { [ANALYZER_KEY]?: ComponentContractAnalyzer | null };
|
|
21
|
+
|
|
22
|
+
export function registerComponentContractAnalyzer(analyzer: ComponentContractAnalyzer | null): void {
|
|
23
|
+
(globalThis as AnalyzerSlot)[ANALYZER_KEY] = analyzer;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function componentContractAnalyzer(): ComponentContractAnalyzer | null {
|
|
27
|
+
return (globalThis as AnalyzerSlot)[ANALYZER_KEY] ?? null;
|
|
28
|
+
}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE SOURCE-AUTHORING CONTRACT — the types that cross between the kit's source-write
|
|
3
|
+
* client and a source-authoring integration's routes (`/__ui-source/*`): an authored
|
|
4
|
+
* element's identity (`OidEntry`), what its component declares (`ComponentPropSpec`,
|
|
5
|
+
* `R3fComponentContract` and its channel bindings), and the source-edit wire shapes.
|
|
6
|
+
* Types only; the integration that stamps and writes source implements them.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface OidEntry {
|
|
10
|
+
file: string;
|
|
11
|
+
line: number; // 1-based
|
|
12
|
+
col: number; // 0-based (matches ts char)
|
|
13
|
+
component: string | null;
|
|
14
|
+
tag: string;
|
|
15
|
+
/**
|
|
16
|
+
* R3F-only, source-proven authoring contract for a LOCAL custom component
|
|
17
|
+
* callsite. `undefined` means the component definition is not in this file
|
|
18
|
+
* (usually an import), so the editor must retain its conservative fallback.
|
|
19
|
+
*
|
|
20
|
+
* A single native root plus forwarded standard group props is ordinary R3F,
|
|
21
|
+
* not a volter wrapper. Recording it here lets the editor safely ADD an absent
|
|
22
|
+
* transform prop at the callsite: the source analyser has proven where that
|
|
23
|
+
* prop lands. An empty `transformProps` list is an equally useful result —
|
|
24
|
+
* the local component exists, but exposes no writable spatial channel.
|
|
25
|
+
*/
|
|
26
|
+
r3fAuthoring?: R3fComponentContract;
|
|
27
|
+
/**
|
|
28
|
+
* The props the tag's component DECLARES — resolved server-side through the
|
|
29
|
+
* TypeScript type checker (`component-prop-types.ts`) and shipped here so
|
|
30
|
+
* the editor can inspect a node by its declared surface rather than by the
|
|
31
|
+
* attributes someone happened to write. Absent for a native tag, or when the
|
|
32
|
+
* definition could not be resolved; the editor then falls back to reading
|
|
33
|
+
* the authored attributes alone.
|
|
34
|
+
*/
|
|
35
|
+
props?: ComponentPropSpec[];
|
|
36
|
+
/**
|
|
37
|
+
* True once the server-side declared-prop resolver has ANSWERED for this
|
|
38
|
+
* tag — present even when the answer was "no props". Distinguishes "the
|
|
39
|
+
* declaration rung has not landed yet" (the resolver's cold ts.Program
|
|
40
|
+
* takes seconds and enrichment is async) from "the resolver looked and
|
|
41
|
+
* found nothing": the inspector's no-declaration warning is honest only in
|
|
42
|
+
* the second state. Measured on racing-game: the doctor's sweep inspected
|
|
43
|
+
* before the cold program answered, the fallback warned once-per-key, and
|
|
44
|
+
* the session ledger held six "No declaration covers" rows for props the
|
|
45
|
+
* resolver demonstrably types (`allowSleep:boolean`, `broadphase:enum`, …).
|
|
46
|
+
*/
|
|
47
|
+
propsResolved?: true;
|
|
48
|
+
/** Props physically authored on this JSX callsite. Unlike {@link props},
|
|
49
|
+
* which describes the component declaration, this is the byte-level answer
|
|
50
|
+
* needed by instance editing: an override exists only when the attribute is
|
|
51
|
+
* present here, and applying it to the component is safe only when its source
|
|
52
|
+
* value is a literal. */
|
|
53
|
+
authoredProps?: Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
valueText: string;
|
|
56
|
+
literal: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* The R3F authorability diagnostics that pertain to THIS element, attached
|
|
60
|
+
* server-side by `currentOidIndex` so they ride the exact same
|
|
61
|
+
* `/__ui-source/index` payload (and therefore the exact same freshness) as
|
|
62
|
+
* every other source-derived field on this entry. Absent when there are
|
|
63
|
+
* none.
|
|
64
|
+
*
|
|
65
|
+
* Two kinds land here, both selected by `fileDiagnosticJoin`:
|
|
66
|
+
* the diagnostic recorded AT this element (an R3F004 "has no name" on this
|
|
67
|
+
* very callsite), and the ones recorded against the component whose body
|
|
68
|
+
* lexically contains it (R3F002/R3F003/R3F005 — `component` matches). The
|
|
69
|
+
* second is what carries a definition-side warning out to the rows that
|
|
70
|
+
* INSTANTIATE that component: an instance's boundary object also carries its
|
|
71
|
+
* definition-root oid, so the client reads both entries. See
|
|
72
|
+
* `r3f-diagnostic-index.ts`.
|
|
73
|
+
*/
|
|
74
|
+
diagnostics?: R3fAuthoringDiagnostic[];
|
|
75
|
+
/**
|
|
76
|
+
* The oid of the JSX element that lexically ENCLOSES this one, in the same
|
|
77
|
+
* file. Recorded because a wrapper tag does not always become its own node:
|
|
78
|
+
* `<RigidBody>` from `@react-three/rapier` never forwards the editor's stamp
|
|
79
|
+
* to the Object3D it renders, so it has no live object to select — yet its
|
|
80
|
+
* props (`type`, `gravityScale`, colliders) are exactly the configuration an
|
|
81
|
+
* author expects to find on the thing inside it. This chain is what lets the
|
|
82
|
+
* inspector attribute a collapsed wrapper's props to the node it wraps.
|
|
83
|
+
*/
|
|
84
|
+
parentOid?: string;
|
|
85
|
+
/**
|
|
86
|
+
* The PHYSICS BODY that owns this element's transform, when a simulation
|
|
87
|
+
* binding attached one to its ref (`r3f-physics-binding.ts`).
|
|
88
|
+
*
|
|
89
|
+
* Present ⇒ this element's own `position`/`rotation`/`scale` props are dead
|
|
90
|
+
* on arrival: the body writes the object's matrix every frame from ITS OWN
|
|
91
|
+
* spawn, so a write here produces source that contradicts the running world.
|
|
92
|
+
* Every writer reads it as a refusal that can name the binding, and the
|
|
93
|
+
* component contract reads its `forwarded` channels as real forwarding —
|
|
94
|
+
* which is what routes the write to the callsite literal the hook reads.
|
|
95
|
+
*/
|
|
96
|
+
physicsBinding?: R3fPhysicsBinding;
|
|
97
|
+
/** Native Rapier joint hooks that name this `<RigidBody ref={…}>` as one
|
|
98
|
+
* endpoint. Hook parameters remain the project's TSX source of truth. */
|
|
99
|
+
jointBindings?: readonly R3fJointBinding[];
|
|
100
|
+
/** Native three.quarks shape construction bound to this emitter primitive. */
|
|
101
|
+
particleBinding?: R3fParticleBinding;
|
|
102
|
+
/** Drei Detailed is a source projection of the native THREE.LOD it creates. */
|
|
103
|
+
lodBinding?: R3fLodBinding;
|
|
104
|
+
/** Native Fiber scene attachment (`background` or `fog`). */
|
|
105
|
+
environmentBinding?: R3fEnvironmentBinding;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* One R3F authoring-convention warning.
|
|
109
|
+
*
|
|
110
|
+
* DECLARED HERE, not in its producer. `r3f-project-contracts.ts` computes
|
|
111
|
+
* these (and re-exports this type for its existing importers), but that module
|
|
112
|
+
* imports `node:fs` — while this one is deliberately dependency-free so a
|
|
113
|
+
* PAGE can import it. Since a diagnostic now travels ON an `OidEntry` (see its
|
|
114
|
+
* `diagnostics` field), the TYPE has to live on the browser-safe side of that
|
|
115
|
+
* line even though the ANALYSIS does not.
|
|
116
|
+
*/
|
|
117
|
+
export interface R3fAuthoringDiagnostic {
|
|
118
|
+
code: 'R3F002' | 'R3F003' | 'R3F004' | 'R3F005';
|
|
119
|
+
severity: 'warning';
|
|
120
|
+
file: string;
|
|
121
|
+
/** 1-based, and computed from `node.getStart()` — the SAME position basis
|
|
122
|
+
* `OidEntry.line`/`col` use, which is what makes an exact positional join
|
|
123
|
+
* between the two sound rather than approximate. */
|
|
124
|
+
line: number;
|
|
125
|
+
col: number;
|
|
126
|
+
/** The component the warning is ABOUT: the definition it names (R3F002/3/5)
|
|
127
|
+
* or the tag at the offending callsite (R3F004). */
|
|
128
|
+
component: string;
|
|
129
|
+
message: string;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A prop as DECLARED by a component, independent of any callsite. Lives here
|
|
133
|
+
* beside `OidEntry` because it travels on it; it is PRODUCED by
|
|
134
|
+
* `component-prop-types.ts` (server-side, needs a `ts.Program`) and CONSUMED
|
|
135
|
+
* by the editor's authoring adapters.
|
|
136
|
+
*/
|
|
137
|
+
export interface ComponentPropSpec {
|
|
138
|
+
name: string;
|
|
139
|
+
/** Inspector widget implied by the declared type; `null` when no widget
|
|
140
|
+
* honestly represents it (the consumer falls back to the attribute text). */
|
|
141
|
+
type: 'string' | 'number' | 'boolean' | 'enum' | 'vec3' | 'json' | null;
|
|
142
|
+
/** Allowed values, for a union of string literals. */
|
|
143
|
+
options?: Array<string | number>;
|
|
144
|
+
/** Declared `?:`, or given a default by the component's destructuring. */
|
|
145
|
+
optional: boolean;
|
|
146
|
+
/** The default's source text (`1.55`, `'raider'`, `defaultSpawn()`). */
|
|
147
|
+
defaultText?: string;
|
|
148
|
+
/** The default as a value, when the default is a literal. */
|
|
149
|
+
defaultValue?: string | number | boolean | number[];
|
|
150
|
+
/** The prop's jsdoc, as one line. */
|
|
151
|
+
doc?: string;
|
|
152
|
+
}
|
|
153
|
+
export type R3fTransformProp = 'position' | 'rotation' | 'scale';
|
|
154
|
+
export interface R3fComponentContract {
|
|
155
|
+
root: 'single' | 'multiple' | 'non-spatial' | 'unknown';
|
|
156
|
+
rootTag?: string;
|
|
157
|
+
transformProps: R3fTransformProp[];
|
|
158
|
+
/** The callsite's native `visible` prop is proven to reach the single
|
|
159
|
+
* Object3D root. Omitted is deliberately false/unknown, so an editor never
|
|
160
|
+
* writes a decorative prop that the component silently ignores. */
|
|
161
|
+
visibleProp?: true;
|
|
162
|
+
/**
|
|
163
|
+
* The component's own source says the SIMULATION owns this transform: it
|
|
164
|
+
* neither accepts nor spreads a transform prop, and it writes its root's
|
|
165
|
+
* `position`/`rotation`/`quaternion`/`scale` through a ref every frame
|
|
166
|
+
* inside `useFrame`.
|
|
167
|
+
*
|
|
168
|
+
* Present (and only ever `true`) when both halves hold, so a contract that
|
|
169
|
+
* predates the distinction compares equal to one that has no opinion.
|
|
170
|
+
*
|
|
171
|
+
* This is a DECLARATION OF NON-AUTHORABILITY, never of authorability:
|
|
172
|
+
* `transformProps` stays empty, so every writer path
|
|
173
|
+
* (`transformEditability`) still refuses the edit — with an honest reason
|
|
174
|
+
* instead of "does not forward position". What it buys is silence from the
|
|
175
|
+
* convention diagnostics whose premise it falsifies (R3F002 asks the
|
|
176
|
+
* component to forward an authored transform the simulation would overwrite
|
|
177
|
+
* on the next tick; R3F005 warns that runtime motion fights an editor
|
|
178
|
+
* transform that cannot exist here).
|
|
179
|
+
*/
|
|
180
|
+
simulationOwnedTransform?: boolean;
|
|
181
|
+
/**
|
|
182
|
+
* The subset of {@link transformProps} this component forwards to a PHYSICS
|
|
183
|
+
* BODY BINDING rather than to its native root — the channels whose callsite
|
|
184
|
+
* literal is read by a `useBox(…)`-family hook (`r3f-physics-binding.ts`).
|
|
185
|
+
*
|
|
186
|
+
* The write is exactly as real as any other forwarded prop, which is why
|
|
187
|
+
* these are IN `transformProps`; what this field adds is WHY it is real, and
|
|
188
|
+
* that fact has a consequence no other prop has: a body re-spawns from this
|
|
189
|
+
* literal and then owns the node's matrix, so the authored value must survive
|
|
190
|
+
* the re-settle after a remount. That is the `physics-binding`
|
|
191
|
+
* {@link WriteAnchorKind}'s own contract, and this is the source fact the
|
|
192
|
+
* planner reads to classify an anchor as one.
|
|
193
|
+
*
|
|
194
|
+
* Absent (never `[]`) when nothing is forwarded to a binding, so a contract
|
|
195
|
+
* that predates the distinction compares equal to one that has no opinion —
|
|
196
|
+
* the same rule `simulationOwnedTransform` above follows, and one the
|
|
197
|
+
* fixed-point loop in `collectR3fComponentContracts` depends on.
|
|
198
|
+
*/
|
|
199
|
+
bodyForwarded?: R3fTransformProp[];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Mirrors `@volter/project/adapter/adapter-surface`'s `AdapterSurface` vocabulary
|
|
203
|
+
* (`'three' | 'canvas' | 'dom'`) as a bare literal union rather than
|
|
204
|
+
* importing it: this module is deliberately dependency-free (see the module
|
|
205
|
+
* doc comment above `OidEntry`) so a page with no bundler alias resolution can
|
|
206
|
+
* import it too. Every caller
|
|
207
|
+
* that already carries the real `AdapterSurface` (e.g. `binding-resolver.ts`)
|
|
208
|
+
* may pass it here directly; the two types are structurally identical.
|
|
209
|
+
*/
|
|
210
|
+
export type DeclaredRootSurface = 'three' | 'canvas' | 'dom';
|
|
211
|
+
/**
|
|
212
|
+
* What ONE file's own bytes say about which reconciler its JSX targets.
|
|
213
|
+
*
|
|
214
|
+
* DIAGNOSTIC EVIDENCE ONLY — it decides no attribute anywhere. What a file
|
|
215
|
+
* renders is REPORTED (`server/project-root-surface.ts`'s `OID003`/`OID004`);
|
|
216
|
+
* which region it belongs to is a declaration or a reach, never a property of
|
|
217
|
+
* its bytes.
|
|
218
|
+
*
|
|
219
|
+
* Deliberately a cheap regex scan, not an AST walk, because it runs in a
|
|
220
|
+
* `transform` hook on every project `.tsx`. COMMENTS are
|
|
221
|
+
* stripped first (see {@link stripCommentsForScan}) so prose that merely
|
|
222
|
+
* NAMES a tag cannot count as rendering it; a mention inside a string still
|
|
223
|
+
* matches, which is deliberate — import specifiers ARE strings.
|
|
224
|
+
*/
|
|
225
|
+
export interface SourceDialectEvidence {
|
|
226
|
+
/** Imports the R3F reconciler. */
|
|
227
|
+
reconcilerImport: boolean;
|
|
228
|
+
/** Distinct R3F-only intrinsic tags this file renders. */
|
|
229
|
+
r3fOnlyTags: string[];
|
|
230
|
+
/** Distinct DOM-only intrinsic tags this file renders. */
|
|
231
|
+
domOnlyTags: string[];
|
|
232
|
+
}
|
|
233
|
+
export interface R3fEnvironmentNumberBinding {
|
|
234
|
+
readonly value: number;
|
|
235
|
+
readonly start: number;
|
|
236
|
+
readonly end: number;
|
|
237
|
+
}
|
|
238
|
+
export interface R3fEnvironmentStringBinding {
|
|
239
|
+
readonly value: string;
|
|
240
|
+
readonly start: number;
|
|
241
|
+
readonly end: number;
|
|
242
|
+
readonly quote: "'" | '"' | '`';
|
|
243
|
+
}
|
|
244
|
+
export type R3fEnvironmentBinding =
|
|
245
|
+
| {
|
|
246
|
+
readonly kind: 'background-color';
|
|
247
|
+
readonly color?: R3fEnvironmentStringBinding;
|
|
248
|
+
}
|
|
249
|
+
| {
|
|
250
|
+
readonly kind: 'fog';
|
|
251
|
+
readonly color?: R3fEnvironmentStringBinding;
|
|
252
|
+
readonly near?: R3fEnvironmentNumberBinding;
|
|
253
|
+
readonly far?: R3fEnvironmentNumberBinding;
|
|
254
|
+
}
|
|
255
|
+
| {
|
|
256
|
+
readonly kind: 'fog-exp2';
|
|
257
|
+
readonly color?: R3fEnvironmentStringBinding;
|
|
258
|
+
readonly density?: R3fEnvironmentNumberBinding;
|
|
259
|
+
};
|
|
260
|
+
export type R3fJointHook =
|
|
261
|
+
| 'useFixedJoint'
|
|
262
|
+
| 'useSphericalJoint'
|
|
263
|
+
| 'useRevoluteJoint'
|
|
264
|
+
| 'usePrismaticJoint'
|
|
265
|
+
| 'useRopeJoint'
|
|
266
|
+
| 'useSpringJoint';
|
|
267
|
+
export type R3fJointLiteral = number | boolean | readonly R3fJointLiteral[];
|
|
268
|
+
export type R3fJointLiteralRange =
|
|
269
|
+
| { readonly start: number; readonly end: number }
|
|
270
|
+
| readonly R3fJointLiteralRange[];
|
|
271
|
+
export interface R3fJointBinding {
|
|
272
|
+
readonly hook: R3fJointHook;
|
|
273
|
+
readonly line: number;
|
|
274
|
+
readonly col: number;
|
|
275
|
+
readonly body1Ref: string;
|
|
276
|
+
readonly body2Ref: string;
|
|
277
|
+
readonly endpoint: 0 | 1;
|
|
278
|
+
readonly params?: readonly R3fJointLiteral[];
|
|
279
|
+
/** Exact leaf token ranges, shape-identical to `params`. Writers change only
|
|
280
|
+
* the numeric/boolean token they own, preserving formatting and comments. */
|
|
281
|
+
readonly paramRanges?: readonly R3fJointLiteralRange[];
|
|
282
|
+
}
|
|
283
|
+
export interface R3fLodNumberBinding {
|
|
284
|
+
readonly value: number;
|
|
285
|
+
readonly start: number;
|
|
286
|
+
readonly end: number;
|
|
287
|
+
}
|
|
288
|
+
export interface R3fLodBinding {
|
|
289
|
+
readonly line: number;
|
|
290
|
+
readonly col: number;
|
|
291
|
+
readonly distances?: readonly R3fLodNumberBinding[];
|
|
292
|
+
readonly hysteresis?: R3fLodNumberBinding;
|
|
293
|
+
}
|
|
294
|
+
export type QuarksEmitterShape =
|
|
295
|
+
| 'point'
|
|
296
|
+
| 'sphere'
|
|
297
|
+
| 'hemisphere'
|
|
298
|
+
| 'cone'
|
|
299
|
+
| 'circle'
|
|
300
|
+
| 'donut'
|
|
301
|
+
| 'rectangle'
|
|
302
|
+
| 'grid';
|
|
303
|
+
export interface R3fParticleNumberBinding {
|
|
304
|
+
readonly value: number;
|
|
305
|
+
readonly start: number;
|
|
306
|
+
readonly end: number;
|
|
307
|
+
}
|
|
308
|
+
export interface R3fParticleBinding {
|
|
309
|
+
readonly system: string;
|
|
310
|
+
readonly shape: QuarksEmitterShape;
|
|
311
|
+
readonly constructor: string;
|
|
312
|
+
readonly line: number;
|
|
313
|
+
readonly col: number;
|
|
314
|
+
readonly fields: Readonly<Record<string, R3fParticleNumberBinding>>;
|
|
315
|
+
}
|
|
316
|
+
export type PhysicsChannel = 'position' | 'rotation' | 'scale';
|
|
317
|
+
/**
|
|
318
|
+
* The body binding that owns one element's transform.
|
|
319
|
+
*
|
|
320
|
+
* JSON-shaped on purpose: it rides an `OidEntry` over `/__ui-source/index` to
|
|
321
|
+
* the page, so it holds no `ts.Node`.
|
|
322
|
+
*/
|
|
323
|
+
export interface R3fPhysicsBinding {
|
|
324
|
+
/** The local name of the hook that created the body (`useBox`). */
|
|
325
|
+
hook: string;
|
|
326
|
+
/** 1-based line of the hook call, in the element's own file. */
|
|
327
|
+
line: number;
|
|
328
|
+
/** Channels whose spawn the hook takes from the component's own props — the
|
|
329
|
+
* write belongs at this component's CALLSITE. */
|
|
330
|
+
forwarded: PhysicsChannel[];
|
|
331
|
+
/** Channels the hook spells as an inline literal in its own argument. There
|
|
332
|
+
* is no write anchor for those; a refusal names them. */
|
|
333
|
+
literal: PhysicsChannel[];
|
|
334
|
+
/**
|
|
335
|
+
* Channels the component's OWN `useFrame` drives through the hook's api
|
|
336
|
+
* (`api.position.set(...)`) — the spawn is not the last word for these, so
|
|
337
|
+
* a callsite literal cannot hold: the game re-poses the body every frame
|
|
338
|
+
* (measured on racing-game's `Train`, a Kinematic body driven from its
|
|
339
|
+
* animated group — the doctor's settle leg read the authored spawn back as
|
|
340
|
+
* the old pose, digit for digit). Absent (never `[]`) when nothing drives
|
|
341
|
+
* the api, so an older recorded binding compares equal to one with no
|
|
342
|
+
* opinion — same rule as `bodyForwarded`'s absence.
|
|
343
|
+
*/
|
|
344
|
+
apiDriven?: PhysicsChannel[];
|
|
345
|
+
}
|
|
346
|
+
export type ReparentChannel = 'position' | 'rotation' | 'scale';
|
|
347
|
+
/**
|
|
348
|
+
* The new LOCAL transform channels that preserve the element's world transform under
|
|
349
|
+
* the destination parent — computed by the caller, which is the only side that knows
|
|
350
|
+
* the live parents (R2). Absent channels are left exactly as authored.
|
|
351
|
+
*/
|
|
352
|
+
export interface ReparentRebase {
|
|
353
|
+
readonly position?: readonly number[] | undefined;
|
|
354
|
+
readonly rotation?: readonly number[] | undefined;
|
|
355
|
+
readonly scale?: readonly number[] | undefined;
|
|
356
|
+
/** Channels whose native source spelling is scalar even when the live
|
|
357
|
+
* decomposition is carried as a one-value tuple (Pixi rotation). */
|
|
358
|
+
readonly scalarChannels?: readonly ReparentChannel[] | undefined;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* What only the LIVE scene knows about a `reparent`, carried on the request so the
|
|
362
|
+
* pure planner (`reparent-guard.ts`) can decide R2/R3 without a scene of its own.
|
|
363
|
+
*
|
|
364
|
+
* Every field is optional and every one of them can only make the plan MORE strict:
|
|
365
|
+
* the planner's source-derivable rules (scope safety, children slot, literal-vs-
|
|
366
|
+
* dynamic) run identically whether or not a caller supplies them, so a client that
|
|
367
|
+
* knows nothing still gets a sound refusal rather than a silent corruption.
|
|
368
|
+
*/
|
|
369
|
+
export interface StructReparentContext {
|
|
370
|
+
/** The new LOCAL transform that preserves the element's world transform under the
|
|
371
|
+
* destination — the caller computed it from the two live parents (R2). */
|
|
372
|
+
rebase?: ReparentRebase;
|
|
373
|
+
/** Live objects the destination oid resolves to; >1 is refused with the count (R3). */
|
|
374
|
+
destinationInstances?: number;
|
|
375
|
+
/** Live objects the moved element's oid resolves to; >1 warns and is allowed (R3). */
|
|
376
|
+
sourceInstances?: number;
|
|
377
|
+
}
|
|
378
|
+
export type SourceEditRequest =
|
|
379
|
+
/** `value` is a NUMBER for a numeric CSS property, and that is load-bearing:
|
|
380
|
+
* the writer emits a bare `12` (which React px-ifies at render) rather than
|
|
381
|
+
* the quoted `'12'` the CSSOM rejects. `null` is the REMOVAL sentinel. */
|
|
382
|
+
| { kind: 'style'; oid: string; prop: string; value: string | number | null }
|
|
383
|
+
| { kind: 'css'; file: string; selector: string; prop: string; value: string; media?: string }
|
|
384
|
+
| { kind: 'text'; oid: string; text: string }
|
|
385
|
+
| {
|
|
386
|
+
kind: 'prop';
|
|
387
|
+
oid: string;
|
|
388
|
+
prop: string;
|
|
389
|
+
/** `null` is the REMOVAL sentinel — the same shape `style` uses (D-A3);
|
|
390
|
+
* it routes to `removePropAttribute` instead of a value write. */
|
|
391
|
+
value: string | null;
|
|
392
|
+
addIfMissing?: boolean;
|
|
393
|
+
allowShapeUpgrade?: boolean;
|
|
394
|
+
}
|
|
395
|
+
| {
|
|
396
|
+
/** Replace a literal default in the component declaration containing
|
|
397
|
+
* `oid`. The component name comes from the OID index, never the caller. */
|
|
398
|
+
kind: 'component-default';
|
|
399
|
+
oid: string;
|
|
400
|
+
prop: string;
|
|
401
|
+
value: string;
|
|
402
|
+
}
|
|
403
|
+
| ({
|
|
404
|
+
kind: 'struct';
|
|
405
|
+
oid: string;
|
|
406
|
+
op: string;
|
|
407
|
+
targetOid?: string;
|
|
408
|
+
parentOid?: string;
|
|
409
|
+
wrapperTag?: string;
|
|
410
|
+
/** Optional multi-line JSX snippet for `create`/`create-sibling` — see
|
|
411
|
+
* `insertChildElement` / `insertSiblingElement`. */
|
|
412
|
+
snippet?: string;
|
|
413
|
+
/** A named import the inserted `snippet` needs (its tag is a component).
|
|
414
|
+
* Applied to the SAME file in the same plan, so the insert and the import
|
|
415
|
+
* it depends on are one write and one undo entry — see `ensureNamedImport`. */
|
|
416
|
+
ensureImport?: { name: string; module: string; kind?: 'default' | 'named' };
|
|
417
|
+
/** `duplicate` only — what the copy should differ in (`writer.ts` `DuplicateRewrite`). */
|
|
418
|
+
duplicate?: DuplicateRewrite;
|
|
419
|
+
} & StructReparentContext)
|
|
420
|
+
| { kind: 'struct-many'; oids: readonly string[]; op: string; wrapperTag?: string };
|
|
421
|
+
export interface PreparedSourceEdit {
|
|
422
|
+
readonly changed: boolean;
|
|
423
|
+
readonly file?: string;
|
|
424
|
+
readonly resourcePath?: string;
|
|
425
|
+
readonly prevSource?: string;
|
|
426
|
+
readonly newSource?: string;
|
|
427
|
+
readonly prevSha?: string;
|
|
428
|
+
readonly newSha?: string;
|
|
429
|
+
readonly result: Record<string, unknown>;
|
|
430
|
+
}
|
|
431
|
+
/** What a lane may ask {@link duplicateElement} to change on the COPY — the
|
|
432
|
+
* three lane's "a duplicate is visibly a second thing": a fresh `name` (only
|
|
433
|
+
* when the original carries a literal one — never invented) and a literal
|
|
434
|
+
* `position` nudged by `positionOffset` (added when absent, since an absent
|
|
435
|
+
* position IS the origin; left alone when dynamic). */
|
|
436
|
+
export interface DuplicateRewrite {
|
|
437
|
+
name?: string;
|
|
438
|
+
positionOffset?: readonly [number, number, number];
|
|
439
|
+
}
|