@volter/sdk 0.0.0-stage → 0.5.204
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1168 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +329 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +669 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a TAB reports upstream: its state snapshot, that it picked a command
|
|
3
|
+
* up, that a command finished, which play-boot phase it is in — plus the
|
|
4
|
+
* gameplay recording sink.
|
|
5
|
+
*
|
|
6
|
+
* The editor-state reporter serializes and coalesces on purpose. One user
|
|
7
|
+
* action can change several things at once (a Play click changes both play
|
|
8
|
+
* state and the active viewport), so only the newest waiting snapshot is kept
|
|
9
|
+
* and sends are serialized — an older, slower report can never land after a
|
|
10
|
+
* newer one and roll `/__editor/state` back.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
EDITOR_CLIENT_ID,
|
|
15
|
+
reportTabPhase,
|
|
16
|
+
sendCommandResultControl,
|
|
17
|
+
sendControl,
|
|
18
|
+
} from '../editor-presence';
|
|
19
|
+
import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
|
|
20
|
+
import { BASE } from '@volter/sdk/kit/api-base';
|
|
21
|
+
|
|
22
|
+
// State reports can be triggered by several browser-owned transitions at once
|
|
23
|
+
// (a Play click changes both play state and the active viewport, for example).
|
|
24
|
+
// Keep only the newest waiting snapshot and serialize sends so an older,
|
|
25
|
+
// slower report can never land after a newer one and roll `/__editor/state`
|
|
26
|
+
// back.
|
|
27
|
+
let pendingEditorState: Record<string, unknown> | null = null;
|
|
28
|
+
let editorStateReportDrain: Promise<void> | null = null;
|
|
29
|
+
|
|
30
|
+
async function drainEditorStateReports(): Promise<void> {
|
|
31
|
+
while (pendingEditorState) {
|
|
32
|
+
const state = pendingEditorState;
|
|
33
|
+
pendingEditorState = null;
|
|
34
|
+
await sendControl('state', { ...state, _clientId: EDITOR_CLIENT_ID });
|
|
35
|
+
}
|
|
36
|
+
editorStateReportDrain = null;
|
|
37
|
+
// A caller cannot interleave with the synchronous block above, but keep
|
|
38
|
+
// this defensive restart so future refactors cannot strand a late report.
|
|
39
|
+
if (pendingEditorState) editorStateReportDrain = drainEditorStateReports();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Report the current editor state to the server (called by command-listener). */
|
|
43
|
+
export function reportEditorState(state: Record<string, unknown>): Promise<void> {
|
|
44
|
+
pendingEditorState = state;
|
|
45
|
+
editorStateReportDrain ??= drainEditorStateReports();
|
|
46
|
+
return editorStateReportDrain;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Tell the server this tab PICKED UP a relayed command — sent before the work
|
|
51
|
+
* starts, so it says "my command listener is running", nothing about the
|
|
52
|
+
* outcome.
|
|
53
|
+
*
|
|
54
|
+
* Long-budget commands (`play` waits out a whole async `setup()`) used to give
|
|
55
|
+
* a tab that had stopped answering the control channel the same silence as a tab
|
|
56
|
+
* that was merely busy, and the caller waited the entire budget for a result
|
|
57
|
+
* that was never coming. This receipt is what separates the two — see
|
|
58
|
+
* `server/server-utils.ts`'s `RELAY_DELIVERY_ACK_MS`. Best-effort and
|
|
59
|
+
* deliberately not awaited by the caller: a lost receipt costs a fast, named
|
|
60
|
+
* refusal, never a wrong result.
|
|
61
|
+
*/
|
|
62
|
+
export async function reportCommandReceived(requestId: string): Promise<void> {
|
|
63
|
+
await sendControl('command-received', { _requestId: requestId, _clientId: EDITOR_CLIENT_ID });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Tell the server whether this page is RUNNING a command listener at all.
|
|
68
|
+
*
|
|
69
|
+
* The receipt above answers that question one command at a time, and only
|
|
70
|
+
* after somebody sends a command. This answers it standing, at the two moments
|
|
71
|
+
* that change the answer — `connectCommandListener` attaching, and its
|
|
72
|
+
* teardown running — so the editor's `status` command can name a dead page on the FIRST read
|
|
73
|
+
* instead of it being inferable only from a command that hangs.
|
|
74
|
+
*
|
|
75
|
+
* It is worth its own message because presence cannot carry it: the control
|
|
76
|
+
* channel is opened by the tiny pre-React entry
|
|
77
|
+
* (`early-editor-presence.ts`), long before the React graph that owns the
|
|
78
|
+
* listener finishes loading — so a page that dies in between connects,
|
|
79
|
+
* beats, and executes nothing.
|
|
80
|
+
*/
|
|
81
|
+
export async function reportCommandListener(attached: boolean): Promise<void> {
|
|
82
|
+
await sendControl('command-listener', { _clientId: EDITOR_CLIENT_ID, attached });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Tell the server which play-boot step this page is ENTERING.
|
|
87
|
+
*
|
|
88
|
+
* Sent before the step's work, never after it, so a step that never returns is
|
|
89
|
+
* still named — see `play-boot-phase.ts` for the 199.5-second block that made
|
|
90
|
+
* three consecutive commands time out against a session every reader called
|
|
91
|
+
* healthy. Not awaited by the caller: the phase is diagnostics, and diagnostics
|
|
92
|
+
* that can delay a boot are worse than none.
|
|
93
|
+
*/
|
|
94
|
+
let phaseSequence = 0;
|
|
95
|
+
export function reportPlayBootPhase(state: {
|
|
96
|
+
phase: string | null;
|
|
97
|
+
at: number;
|
|
98
|
+
run: number;
|
|
99
|
+
}): void {
|
|
100
|
+
// Two roads, because the control socket is the PAGE's: a phase announced
|
|
101
|
+
// right before a synchronous block sat in the page's send queue until the
|
|
102
|
+
// block ended (measured 2026-09-06: a 45 s build's phase arrived after the
|
|
103
|
+
// build). The heartbeat worker's socket keeps beating through the block,
|
|
104
|
+
// so the phase rides the next beat too; whichever lands first wins.
|
|
105
|
+
const sequence = ++phaseSequence;
|
|
106
|
+
reportTabPhase(state.phase, EDITOR_CLIENT_ID, sequence);
|
|
107
|
+
void sendControl('play-phase', { _clientId: EDITOR_CLIENT_ID, ...state, source: EDITOR_CLIENT_ID, sequence });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Report a command result back to the server so the SDK/CLI gets the response.
|
|
111
|
+
* `data` carries an optional payload for commands that answer with data
|
|
112
|
+
* (e.g. `capture-viewport`'s base64 PNG, the debug-seam reads)
|
|
113
|
+
* forwarded verbatim through `/__editor/command-result` →
|
|
114
|
+
* `commandResponseFor` → the SDK transports, on the failure path too (where
|
|
115
|
+
* it carries structured `{ code: ... }` markers). */
|
|
116
|
+
export async function reportCommandResult(
|
|
117
|
+
requestId: string,
|
|
118
|
+
ok: boolean,
|
|
119
|
+
error?: string,
|
|
120
|
+
data?: Record<string, unknown>,
|
|
121
|
+
waitForCaller = false,
|
|
122
|
+
): Promise<void> {
|
|
123
|
+
const payload = {
|
|
124
|
+
_requestId: requestId,
|
|
125
|
+
_clientId: EDITOR_CLIENT_ID,
|
|
126
|
+
ok,
|
|
127
|
+
error,
|
|
128
|
+
data,
|
|
129
|
+
};
|
|
130
|
+
if (waitForCaller) await sendCommandResultControl(requestId, payload);
|
|
131
|
+
else await sendControl('command-result', payload);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface GameplayRecordingSink {
|
|
135
|
+
id: string;
|
|
136
|
+
path: string;
|
|
137
|
+
format: 'composite-webm' | 'canvas-dom';
|
|
138
|
+
/** Directory containing `manifest.json`, `events.json`, and interned assets
|
|
139
|
+
* for a canvas + DOM recording. Absent for a composite WebM. */
|
|
140
|
+
replayPath: string | null;
|
|
141
|
+
/** True when this sink is the ROTATING unnamed file — the next recording
|
|
142
|
+
* overwrites it. False for a caller-named keepsake. */
|
|
143
|
+
rotates: boolean;
|
|
144
|
+
/** The `logs/play-*.jsonl` this project's live play run is writing, or
|
|
145
|
+
* `null` when nothing is logging. Its event timestamps are what map an
|
|
146
|
+
* event to an offset in the clip, so it travels WITH the clip's identity
|
|
147
|
+
* rather than being looked up separately later. */
|
|
148
|
+
logFile: string | null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function recordingResponse<T>(response: Response, action: string): Promise<T> {
|
|
152
|
+
// `.json().catch(() => ({}))` under a page fallback produced an OK-looking
|
|
153
|
+
// empty sink: `start` handed back a sink with no id, and every chunk after it
|
|
154
|
+
// posted into nothing while the recorder showed a recording in progress.
|
|
155
|
+
assertEditorServerAnswered(response, `gameplay recording ${action} failed`);
|
|
156
|
+
const body = (await response.json().catch(() => ({}))) as { error?: unknown } & T;
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
throw new Error(
|
|
159
|
+
`gameplay recording ${action} failed: ${typeof body.error === 'string' ? body.error : `HTTP ${response.status}`}`,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
return body;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Open the server-owned, project-scoped WebM sink. Video bytes never ride the
|
|
166
|
+
* JSON command relay: a long QA playthrough must not hit its 50 MiB ceiling. */
|
|
167
|
+
export async function beginGameplayRecordingSink(
|
|
168
|
+
input: {
|
|
169
|
+
startedAt: string;
|
|
170
|
+
mimeType: string;
|
|
171
|
+
format?: 'composite-webm' | 'canvas-dom';
|
|
172
|
+
/** Fixed-step exports do not use the session's wall-clock playback timeline. */
|
|
173
|
+
purpose?: 'export';
|
|
174
|
+
/** During Play, `null` names the clip after the Gameplay Session; outside
|
|
175
|
+
* one it falls back to `play-latest.webm`. A name takes a keepsake path. */
|
|
176
|
+
name?: string | null;
|
|
177
|
+
},
|
|
178
|
+
signal?: AbortSignal,
|
|
179
|
+
): Promise<GameplayRecordingSink> {
|
|
180
|
+
const response = await fetch(`${BASE}/recording/start`, {
|
|
181
|
+
...(signal ? { signal } : {}),
|
|
182
|
+
method: 'POST',
|
|
183
|
+
headers: { 'content-type': 'application/json' },
|
|
184
|
+
body: JSON.stringify(input),
|
|
185
|
+
});
|
|
186
|
+
return recordingResponse<GameplayRecordingSink>(response, 'start');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Append an ordered batch of standard rrweb events. */
|
|
190
|
+
export async function appendGameplayRecordingDomEvents(
|
|
191
|
+
sink: GameplayRecordingSink,
|
|
192
|
+
sequence: number,
|
|
193
|
+
eventsJson: Blob,
|
|
194
|
+
signal?: AbortSignal,
|
|
195
|
+
): Promise<void> {
|
|
196
|
+
const query = new URLSearchParams({ id: sink.id, sequence: String(sequence) });
|
|
197
|
+
const response = await fetch(`${BASE}/recording/dom?${query}`, {
|
|
198
|
+
...(signal ? { signal } : {}),
|
|
199
|
+
method: 'POST',
|
|
200
|
+
// This is a streamed file body. Labeling it application/json lets the
|
|
201
|
+
// server's ordinary JSON middleware consume it before the route can apply
|
|
202
|
+
// its own byte bound, ordering, and append semantics.
|
|
203
|
+
headers: { 'content-type': 'application/octet-stream' },
|
|
204
|
+
body: eventsJson,
|
|
205
|
+
});
|
|
206
|
+
await recordingResponse<Record<string, never>>(response, 'DOM event upload');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Store one image interned out of the rrweb event stream. */
|
|
210
|
+
export async function appendGameplayRecordingAsset(
|
|
211
|
+
sink: GameplayRecordingSink,
|
|
212
|
+
name: string,
|
|
213
|
+
asset: Blob,
|
|
214
|
+
signal?: AbortSignal,
|
|
215
|
+
): Promise<void> {
|
|
216
|
+
const query = new URLSearchParams({ id: sink.id, name });
|
|
217
|
+
const response = await fetch(`${BASE}/recording/asset?${query}`, {
|
|
218
|
+
...(signal ? { signal } : {}),
|
|
219
|
+
method: 'POST',
|
|
220
|
+
headers: { 'content-type': asset.type || 'application/octet-stream' },
|
|
221
|
+
body: asset,
|
|
222
|
+
});
|
|
223
|
+
await recordingResponse<Record<string, never>>(response, 'replay asset upload');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Append one ordered MediaRecorder chunk to the open WebM. */
|
|
227
|
+
export async function appendGameplayRecordingChunk(
|
|
228
|
+
sink: GameplayRecordingSink,
|
|
229
|
+
sequence: number,
|
|
230
|
+
chunk: Blob,
|
|
231
|
+
signal?: AbortSignal,
|
|
232
|
+
): Promise<void> {
|
|
233
|
+
const query = new URLSearchParams({ id: sink.id, sequence: String(sequence) });
|
|
234
|
+
const response = await fetch(`${BASE}/recording/chunk?${query}`, {
|
|
235
|
+
...(signal ? { signal } : {}),
|
|
236
|
+
method: 'POST',
|
|
237
|
+
headers: { 'content-type': 'application/octet-stream' },
|
|
238
|
+
body: chunk,
|
|
239
|
+
});
|
|
240
|
+
await recordingResponse<Record<string, never>>(response, 'chunk upload');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export async function finishGameplayRecordingSink(
|
|
244
|
+
sink: GameplayRecordingSink,
|
|
245
|
+
/** What ended it — journalled verbatim beside the file it produced. */
|
|
246
|
+
reason?: string | null,
|
|
247
|
+
signal?: AbortSignal,
|
|
248
|
+
replay?: Record<string, unknown> | null,
|
|
249
|
+
): Promise<void> {
|
|
250
|
+
const response = await fetch(`${BASE}/recording/finish`, {
|
|
251
|
+
...(signal ? { signal } : {}),
|
|
252
|
+
method: 'POST',
|
|
253
|
+
headers: { 'content-type': 'application/json' },
|
|
254
|
+
body: JSON.stringify({ id: sink.id, reason: reason ?? null, replay: replay ?? null }),
|
|
255
|
+
});
|
|
256
|
+
await recordingResponse<Record<string, never>>(response, 'finish');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Deliberately NOT read through `editor-server-response.ts`: this is the
|
|
260
|
+
* teardown leg, called only when a recording is already being abandoned, and
|
|
261
|
+
* its `.catch(() => undefined)` is the contract — there is no caller left to
|
|
262
|
+
* report to, so asserting could only turn a silent no-op into a swallowed
|
|
263
|
+
* throw. */
|
|
264
|
+
export async function abortGameplayRecordingSink(sink: GameplayRecordingSink): Promise<void> {
|
|
265
|
+
await fetch(`${BASE}/recording/abort`, {
|
|
266
|
+
method: 'POST',
|
|
267
|
+
headers: { 'content-type': 'application/json' },
|
|
268
|
+
body: JSON.stringify({ id: sink.id }),
|
|
269
|
+
}).catch(() => undefined);
|
|
270
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom palette documents over the wire (`server/routes/themes.ts`): one
|
|
3
|
+
* JSON file per theme under `~/.volter/themes/` (user) and
|
|
4
|
+
* `<project>/.volter/themes/` (project) — both files the editor server owns.
|
|
5
|
+
*/
|
|
6
|
+
import { assertEditorServerResponse, editorServerJson } from '@volter/sdk/kit/editor-server-response';
|
|
7
|
+
import { BASE } from '@volter/sdk/kit/api-base';
|
|
8
|
+
import type { SettingsLayer } from '@volter/sdk/kit/api-settings';
|
|
9
|
+
|
|
10
|
+
export interface ThemeDocumentRead {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly document: unknown;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ThemeLayerRead {
|
|
17
|
+
readonly documents: readonly ThemeDocumentRead[];
|
|
18
|
+
/** Files that could not be read as JSON, spelled by path. */
|
|
19
|
+
readonly issues: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function listThemeDocuments(layer: SettingsLayer): Promise<ThemeLayerRead> {
|
|
23
|
+
const res = await fetch(`${BASE}/themes/${layer}`);
|
|
24
|
+
return editorServerJson<ThemeLayerRead>(res, `Could not list ${layer} themes`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function saveThemeDocument(
|
|
28
|
+
layer: SettingsLayer,
|
|
29
|
+
id: string,
|
|
30
|
+
document: unknown,
|
|
31
|
+
): Promise<void> {
|
|
32
|
+
const res = await fetch(`${BASE}/themes/${layer}`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'Content-Type': 'application/json' },
|
|
35
|
+
body: JSON.stringify({ id, document }),
|
|
36
|
+
});
|
|
37
|
+
assertEditorServerResponse(res, `Could not save the ${layer} theme ${id}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function deleteThemeDocument(layer: SettingsLayer, id: string): Promise<void> {
|
|
41
|
+
const res = await fetch(`${BASE}/themes/${layer}?id=${encodeURIComponent(id)}`, {
|
|
42
|
+
method: 'DELETE',
|
|
43
|
+
});
|
|
44
|
+
assertEditorServerResponse(res, `Could not delete the ${layer} theme ${id}`);
|
|
45
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The asset-library wire — the shapes `/__editor/assets/*` answers with,
|
|
3
|
+
* declared ONCE in a leaf module both sides import (the browser client in
|
|
4
|
+
* `./assets.ts`, the producing routes in `../../server/asset-library-routes.ts`).
|
|
5
|
+
* Deliberately import-free so the server's tsconfig can reach it without
|
|
6
|
+
* dragging the client's whole module graph along.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface OnlineAsset {
|
|
10
|
+
id: string;
|
|
11
|
+
source: 'polyhaven' | 'ambientcg' | 'local';
|
|
12
|
+
name: string;
|
|
13
|
+
type: 'model' | 'animation' | 'source' | 'hdri' | 'texture' | 'material';
|
|
14
|
+
thumbnailUrl: string;
|
|
15
|
+
categories: string[];
|
|
16
|
+
tags: string[];
|
|
17
|
+
downloadCount?: number;
|
|
18
|
+
license?: string;
|
|
19
|
+
author?: string;
|
|
20
|
+
sourceUrl?: string;
|
|
21
|
+
cloudHosted?: boolean;
|
|
22
|
+
variantId?: string;
|
|
23
|
+
variantCount?: number;
|
|
24
|
+
sizeBytes?: number;
|
|
25
|
+
animationCount?: number;
|
|
26
|
+
deliveryKinds?: ('local-ssd' | 'cloud' | 'remote')[];
|
|
27
|
+
addedAt?: string;
|
|
28
|
+
capabilities?: {
|
|
29
|
+
previewable: boolean;
|
|
30
|
+
importable: boolean;
|
|
31
|
+
runtimeReady: boolean;
|
|
32
|
+
animated: boolean;
|
|
33
|
+
deliveryAvailable: boolean;
|
|
34
|
+
health: 'healthy' | 'source-only' | 'unsupported';
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface AssetFileOption {
|
|
39
|
+
label: string;
|
|
40
|
+
format: string;
|
|
41
|
+
url: string;
|
|
42
|
+
sizeBytes?: number;
|
|
43
|
+
/** Additional files that must be downloaded alongside the main URL (GLTF includes). */
|
|
44
|
+
includes?: { relativePath: string; url: string; size: number }[];
|
|
45
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every `api/<family>.ts` module shares: the route prefix every
|
|
3
|
+
* `/__editor/*` op is written against.
|
|
4
|
+
*
|
|
5
|
+
* The session serves the editor and answers these routes (ARCHITECTURE-CORE
|
|
6
|
+
* §The target shape rule 5), so a family module asks no question before
|
|
7
|
+
* touching the network.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const BASE = '/__editor';
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Producing a build, and the two catalogues the New Project screen starts one
|
|
3
|
+
* from: `/__editor/export`, `/__editor/examples`, `/__editor/templates`.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { editorServerJson } from '@volter/sdk/kit/editor-server-response';
|
|
7
|
+
import { BASE } from '@volter/sdk/kit/api-base';
|
|
8
|
+
/** Start a build/export. Returns the raw Response for SSE streaming.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately NOT read through `editor-server-response.ts`: that reader's
|
|
11
|
+
* rule is "the editor server answers JSON", and a successful export answers
|
|
12
|
+
* `text/event-stream`, which it would reject. The stream's own consumer owns
|
|
13
|
+
* the question here. */
|
|
14
|
+
|
|
15
|
+
/** FT-5 learner-facing metadata — mirrors the manifest's `learn` block
|
|
16
|
+
* (`LearnMetadataSchema`, @volter/project/manifest/schema); served merged into `GET
|
|
17
|
+
* /__editor/examples`. */
|
|
18
|
+
export interface ExampleLearnInfo {
|
|
19
|
+
kind: 'starter' | 'feature' | 'sample-game' | 'lesson-companion';
|
|
20
|
+
title: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
difficulty: 'beginner' | 'intermediate' | 'advanced';
|
|
23
|
+
features: string[];
|
|
24
|
+
thumbnail?: string;
|
|
25
|
+
preview?: string;
|
|
26
|
+
lesson?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ExampleInfo {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
/** The example's FT-5 `learn` block. REQUIRED: every shipped example
|
|
33
|
+
* carries one and the server omits any example that doesn't (editor and
|
|
34
|
+
* server ship from one repo, so there is no older server to be compatible
|
|
35
|
+
* with). */
|
|
36
|
+
learn: ExampleLearnInfo;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** List `examples/<id>/` projects (Track E3, §1.F). Server mode reads the
|
|
40
|
+
* scaffold registry. Browser mode derives the list from what THIS build
|
|
41
|
+
* actually stages: the runtime bundle's per-root dispatch keys name every
|
|
42
|
+
* bundled example, and each one's manifest (with its FT-5 `learn` block) is
|
|
43
|
+
* served at `/examples/<id>/volter.project.json` — so the gallery lists
|
|
44
|
+
* exactly the projects `?project=<id>` can open, never a curated id that
|
|
45
|
+
* drifted from the build (the dead `editor-tutorial` link, measured on
|
|
46
|
+
* production 2026-08-27, was exactly that drift). */
|
|
47
|
+
export async function listExamples(): Promise<ExampleInfo[]> {
|
|
48
|
+
try {
|
|
49
|
+
const res = await fetch(`${BASE}/examples`);
|
|
50
|
+
const data = await editorServerJson<{ examples: ExampleInfo[] }>(
|
|
51
|
+
res,
|
|
52
|
+
`GET ${BASE}/examples failed`,
|
|
53
|
+
);
|
|
54
|
+
return data.examples;
|
|
55
|
+
} catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** One template-registry entry (G1, FT-3): mirrors `TemplateRegistryEntry` in
|
|
61
|
+
* create-volter-project/templates, served by `GET /__editor/templates` from the
|
|
62
|
+
* same `templates.json` the CLI reads. */
|
|
63
|
+
export interface TemplateInfo {
|
|
64
|
+
id: string;
|
|
65
|
+
title: string;
|
|
66
|
+
description: string;
|
|
67
|
+
/** `template:<compositionId>` or `example:<exampleId>`. */
|
|
68
|
+
source: string;
|
|
69
|
+
thumbnail?: string;
|
|
70
|
+
/** Curated preview bullets for composition templates. Promoted examples
|
|
71
|
+
* derive their facts from the owning example's learn metadata. */
|
|
72
|
+
whatsInside?: string[];
|
|
73
|
+
/** A post-copy PRESENTATION of `source`'s tree. The gallery's
|
|
74
|
+
* "Blank" card carries `'blank'` beside the SAME `template:default` source
|
|
75
|
+
* the starter card uses — two cards, one template. */
|
|
76
|
+
presentation?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Map an engine-repo-relative registry/learn thumbnail path to its server
|
|
80
|
+
* route without baking template or example directories into the client. */
|
|
81
|
+
export function learnThumbnailUrl(repoRelativePath: string): string {
|
|
82
|
+
// Browser-mode example thumbnails are already staged ABSOLUTE paths
|
|
83
|
+
// (`/examples/<id>/learn/…`) — there is no server route to proxy them.
|
|
84
|
+
if (repoRelativePath.startsWith('/')) return repoRelativePath;
|
|
85
|
+
return `${BASE}/learn-thumbnail?file=${encodeURIComponent(repoRelativePath)}`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** List the template registry. */
|
|
89
|
+
export async function listTemplates(): Promise<TemplateInfo[]> {
|
|
90
|
+
// No silent empty-list fallback and no hardcoded fallback entry in the
|
|
91
|
+
// wizard: editor and server ship from ONE repo, so an unreachable or
|
|
92
|
+
// failing `/templates` is a real defect, not version skew. Surface it.
|
|
93
|
+
const res = await fetch(`${BASE}/templates`);
|
|
94
|
+
const data = await editorServerJson<{ templates: TemplateInfo[] }>(
|
|
95
|
+
res,
|
|
96
|
+
`GET ${BASE}/templates failed`,
|
|
97
|
+
);
|
|
98
|
+
return data.templates;
|
|
99
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The git-workflow wire — the status shape `/__editor/git/*` answers with,
|
|
3
|
+
* declared ONCE in a leaf module both sides import (the browser client in
|
|
4
|
+
* `../share-control-client.ts`, the producing `../../server/git-workflow.ts`).
|
|
5
|
+
* Import-free so the server's tsconfig can reach it without the client's
|
|
6
|
+
* module graph. The share wire next door (`@volter/sdk/share`) had this
|
|
7
|
+
* fix applied first; the git wire in the same panel had been re-spelled
|
|
8
|
+
* inline, twenty lines below the header describing that fix.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface GitChangedPath {
|
|
12
|
+
path: string;
|
|
13
|
+
index: string;
|
|
14
|
+
worktree: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface GitDiffHunk {
|
|
18
|
+
id: string;
|
|
19
|
+
path: string;
|
|
20
|
+
staged: boolean;
|
|
21
|
+
header: string;
|
|
22
|
+
additions: number;
|
|
23
|
+
deletions: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface GitHistoryCommit {
|
|
27
|
+
sha: string;
|
|
28
|
+
shortSha: string;
|
|
29
|
+
author: string;
|
|
30
|
+
authoredAt: string;
|
|
31
|
+
subject: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface GitWorkflowStatus {
|
|
35
|
+
available: boolean;
|
|
36
|
+
repositoryId: string;
|
|
37
|
+
worktreeId: string;
|
|
38
|
+
worktreeRoot: string;
|
|
39
|
+
projectRelativePath: string;
|
|
40
|
+
branch: string | null;
|
|
41
|
+
headCommit: string | null;
|
|
42
|
+
baseRef: string | null;
|
|
43
|
+
upstream: string | null;
|
|
44
|
+
remoteUrl: string | null;
|
|
45
|
+
dirty: boolean;
|
|
46
|
+
ahead: number | null;
|
|
47
|
+
behind: number | null;
|
|
48
|
+
baseAhead: number | null;
|
|
49
|
+
baseBehind: number | null;
|
|
50
|
+
changed: GitChangedPath[];
|
|
51
|
+
hunks: GitDiffHunk[];
|
|
52
|
+
history: GitHistoryCommit[];
|
|
53
|
+
conflicts: string[];
|
|
54
|
+
rebaseInProgress: boolean;
|
|
55
|
+
github: boolean;
|
|
56
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Play-mode console log persistence — agent/CLI-tooling introspection, so it
|
|
3
|
+
* is bucketed with the CLI control channel.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { assertEditorServerResponse, editorServerJson } from '@volter/sdk/kit/editor-server-response';
|
|
7
|
+
import { BASE } from '@volter/sdk/kit/api-base';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Play-mode console log persistence
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
export interface LogEntry {
|
|
13
|
+
t: number;
|
|
14
|
+
level: string;
|
|
15
|
+
source?: string;
|
|
16
|
+
sub?: string;
|
|
17
|
+
msg: string;
|
|
18
|
+
meta?: Record<string, unknown>;
|
|
19
|
+
/** Engine fixed-step counter at write time —
|
|
20
|
+
* present only while a live play session's debug seam can be read, so
|
|
21
|
+
* entries correlate frame-exactly with `ctx.debug.emit` events. */
|
|
22
|
+
tick?: number;
|
|
23
|
+
/** Accumulated sim-seconds at write time — same source as `tick`. */
|
|
24
|
+
simT?: number;
|
|
25
|
+
/** The world this run was presenting when the entry was written. Present
|
|
26
|
+
* only once the run's roots have mounted and a world is unambiguous (see
|
|
27
|
+
* `play-mode.ts`'s `playLogRunStamp`) — entries written during boot, and
|
|
28
|
+
* runs that present no world at all, honestly carry none. */
|
|
29
|
+
world?: string;
|
|
30
|
+
/** The loop's live time scale at write time (`game.loop.timeScale`) — 1 is
|
|
31
|
+
* real time, 0 is paused, and an instrument can change it mid-run, which is
|
|
32
|
+
* exactly why it is per-entry and not in the file's identity header. */
|
|
33
|
+
simSpeed?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Start a new log session. Returns the filename, or null on failure.
|
|
37
|
+
* Browser mode writes the SAME `logs/play-*.jsonl` record through the
|
|
38
|
+
* StorageBackend (`play-log/browser-play-log.ts`) — the Analytics utility's
|
|
39
|
+
* Gameplay Sessions read it, and a downloaded project carries its history —
|
|
40
|
+
* while a staged example/ingest stays a no-op (no storage home). */
|
|
41
|
+
export async function startLogSession(name?: string | null): Promise<string | null> {
|
|
42
|
+
try {
|
|
43
|
+
const res = await fetch(`${BASE}/log-session`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/json' },
|
|
46
|
+
// `name` (optional — the editor's `play --name <text>` command) is passed through RAW;
|
|
47
|
+
// the server owns the slugifier, so there is exactly one definition of
|
|
48
|
+
// what the run is called on disk and in the journal.
|
|
49
|
+
body: JSON.stringify({ action: 'start', ...(name ? { name } : {}) }),
|
|
50
|
+
});
|
|
51
|
+
const data = await editorServerJson<{ ok: boolean; file: string }>(
|
|
52
|
+
res,
|
|
53
|
+
'Could not start a play log session',
|
|
54
|
+
);
|
|
55
|
+
return data.file;
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** End the current log session. Browser mode closes the storage-backed log. */
|
|
62
|
+
export async function endLogSession(): Promise<void> {
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetch(`${BASE}/log-session`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'Content-Type': 'application/json' },
|
|
67
|
+
body: JSON.stringify({ action: 'end' }),
|
|
68
|
+
});
|
|
69
|
+
assertEditorServerResponse(res, 'Could not end the play log session');
|
|
70
|
+
} catch {
|
|
71
|
+
/* best-effort */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Flush a batch of log entries. Browser mode appends to the storage-backed
|
|
76
|
+
* log (never a network call — this runs on a `setInterval` while Play is
|
|
77
|
+
* running, and a dead endpoint here is the retry-loop anti-pattern A2's SSE
|
|
78
|
+
* guards exist to avoid). */
|
|
79
|
+
export async function flushLogEntries(entries: LogEntry[]): Promise<boolean> {
|
|
80
|
+
if (entries.length === 0) return true;
|
|
81
|
+
try {
|
|
82
|
+
const res = await fetch(`${BASE}/log-entries`, {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: { 'Content-Type': 'application/json' },
|
|
85
|
+
body: JSON.stringify({ entries }),
|
|
86
|
+
});
|
|
87
|
+
assertEditorServerResponse(res, 'Could not flush play log entries');
|
|
88
|
+
return true;
|
|
89
|
+
} catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|