@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,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Listing project assets, and the online asset library. Both are the session's
|
|
3
|
+
* own routes: it owns the project folder, so it is the one thing that can list
|
|
4
|
+
* `public/` or write a downloaded asset into it.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ProjectComponentEntry } from '../asset-workflow/project-content';
|
|
8
|
+
|
|
9
|
+
import { assertEditorServerAnswered, editorServerJson } from '@volter/sdk/kit/editor-server-response';
|
|
10
|
+
import { getStorageBackend } from '../storage/index';
|
|
11
|
+
import { BASE } from '@volter/sdk/kit/api-base';
|
|
12
|
+
export interface AssetEntry {
|
|
13
|
+
name: string;
|
|
14
|
+
type: 'file' | 'directory';
|
|
15
|
+
/** Bytes, when the backend reports it. ABSENT means unmeasured — not zero. */
|
|
16
|
+
size?: number;
|
|
17
|
+
/** Epoch ms, when the backend reports it. ABSENT means unmeasured — not 1970. */
|
|
18
|
+
modifiedAt?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A listing that either HAPPENED or FAILED.
|
|
23
|
+
*
|
|
24
|
+
* `{ ok: true, entries: [] }` is a real measurement — the directory is empty,
|
|
25
|
+
* the project defines no components. A failure is a DIFFERENT FACT and carries
|
|
26
|
+
* its reason, because rendering "this folder is empty" over a permissions
|
|
27
|
+
* error, an offline dev server or a 500 tells the author their work is gone.
|
|
28
|
+
* Both listings used to `catch { return [] }`, so the two were the same bytes.
|
|
29
|
+
*/
|
|
30
|
+
export type Listing<T> =
|
|
31
|
+
| { readonly ok: true; readonly entries: T[] }
|
|
32
|
+
| { readonly ok: false; readonly reason: string };
|
|
33
|
+
|
|
34
|
+
function listingFailure(error: unknown): { readonly ok: false; readonly reason: string } {
|
|
35
|
+
return { ok: false, reason: error instanceof Error ? error.message : String(error) };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** One named asset root, listed by the editor server's own route. The entry
|
|
39
|
+
* shape is the route's; an ABSENT root answers the empty listing (the route's
|
|
40
|
+
* own S-8 rule), and a real failure still reports its reason. */
|
|
41
|
+
async function listAssetRootFromServer(root: string, dir: string): Promise<Listing<AssetEntry>> {
|
|
42
|
+
try {
|
|
43
|
+
const query = new URLSearchParams({ root, dir });
|
|
44
|
+
const response = await fetch(`${BASE}/assets?${query}`, { cache: 'no-store' });
|
|
45
|
+
const body = await editorServerJson<{ entries?: AssetEntry[] }>(
|
|
46
|
+
response,
|
|
47
|
+
`Could not list ${root}/${dir} from ${BASE}/assets`,
|
|
48
|
+
);
|
|
49
|
+
return { ok: true, entries: body.entries ?? [] };
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return listingFailure(error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* List files and folders in a directory under one of the project's asset roots
|
|
57
|
+
* (`public`, or `references` — see `asset-workflow/project-asset-roots.ts`).
|
|
58
|
+
* `dir` is root-relative in both tiers; only the way the root is reached
|
|
59
|
+
* differs, and that difference is the two branches below.
|
|
60
|
+
*/
|
|
61
|
+
export async function listAssets(root: string, dir: string): Promise<Listing<AssetEntry>> {
|
|
62
|
+
// The tier's backend is rooted AT `public/`, so a second root cannot be
|
|
63
|
+
// spelled through it at all — it is named to the server's own listing route
|
|
64
|
+
// instead, which resolves it from the open project.
|
|
65
|
+
if (root !== 'public') return listAssetRootFromServer(root, dir);
|
|
66
|
+
try {
|
|
67
|
+
const entries = await getStorageBackend().list(dir);
|
|
68
|
+
return {
|
|
69
|
+
ok: true,
|
|
70
|
+
entries: entries.map((e) => ({
|
|
71
|
+
name: e.name,
|
|
72
|
+
type: e.type === 'dir' ? ('directory' as const) : ('file' as const),
|
|
73
|
+
// OMITTED, never zeroed: a backend that does not report a size has not
|
|
74
|
+
// told us the file is 0 bytes, and a browser listing genuinely cannot
|
|
75
|
+
// for some handles. `0`/`0` sorted an unmeasured file to the bottom of
|
|
76
|
+
// "largest first" and to 1970 in "most recent", both as if measured.
|
|
77
|
+
...(e.size === undefined ? {} : { size: e.size }),
|
|
78
|
+
...(e.mtime === undefined ? {} : { modifiedAt: e.mtime }),
|
|
79
|
+
})),
|
|
80
|
+
};
|
|
81
|
+
} catch (error) {
|
|
82
|
+
return listingFailure(error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** List source-defined visual components for the semantic component board. */
|
|
87
|
+
export async function listProjectComponents(): Promise<Listing<ProjectComponentEntry>> {
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetch(`${BASE}/project-components`, { cache: 'no-store' });
|
|
90
|
+
const body = await editorServerJson<{ components?: ProjectComponentEntry[] }>(
|
|
91
|
+
response,
|
|
92
|
+
`Could not list project components from ${BASE}/project-components`,
|
|
93
|
+
);
|
|
94
|
+
return { ok: true, entries: body.components ?? [] };
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return listingFailure(error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Build a download URL for a build artifact. */
|
|
101
|
+
export function getDownloadUrl(file: string): string {
|
|
102
|
+
return `${BASE}/download?file=${encodeURIComponent(file)}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Asset Library (online browsing + download)
|
|
107
|
+
//
|
|
108
|
+
// The session is a Node-only proxy to Poly Haven/ambientcg (CORS +
|
|
109
|
+
// SSRF-allowlist reasons to stay server-side) plus the 34,412-asset local SSD
|
|
110
|
+
// catalog, writing into `<project>/public/asset-library/...` via raw
|
|
111
|
+
// `node:fs`. A browser cannot do either: it is refused by CORS and has no
|
|
112
|
+
// local disk to read.
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
|
|
115
|
+
import type { AssetFileOption, OnlineAsset } from '@volter/sdk/kit/api-asset-library-wire';
|
|
116
|
+
|
|
117
|
+
export type { AssetFileOption, OnlineAsset } from '@volter/sdk/kit/api-asset-library-wire';
|
|
118
|
+
|
|
119
|
+
export type AssetDeliveryIssueCode =
|
|
120
|
+
| 'offline'
|
|
121
|
+
| 'quota-limited'
|
|
122
|
+
| 'license-blocked'
|
|
123
|
+
| 'unavailable'
|
|
124
|
+
| 'provider-error';
|
|
125
|
+
|
|
126
|
+
export class AssetDeliveryError extends Error {
|
|
127
|
+
constructor(
|
|
128
|
+
readonly code: AssetDeliveryIssueCode,
|
|
129
|
+
message: string,
|
|
130
|
+
) {
|
|
131
|
+
super(message);
|
|
132
|
+
this.name = 'AssetDeliveryError';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function assetDeliveryIssueMessage(code: AssetDeliveryIssueCode): string {
|
|
137
|
+
return {
|
|
138
|
+
offline: 'Network delivery is offline. SSD assets remain available.',
|
|
139
|
+
'quota-limited': 'The remote provider quota is exhausted. Retry after the provider resets it.',
|
|
140
|
+
'license-blocked': 'This delivery is blocked because its license terms are not accepted.',
|
|
141
|
+
unavailable: 'No healthy SSD, cloud, or remote delivery is available for this variant.',
|
|
142
|
+
'provider-error': 'The remote provider could not return delivery metadata. Retry the request.',
|
|
143
|
+
}[code];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface OnlineAssetPreview {
|
|
147
|
+
path: string;
|
|
148
|
+
format: string;
|
|
149
|
+
label: string;
|
|
150
|
+
sourceAssetId: string;
|
|
151
|
+
materialPath?: string;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Downloaded-asset cache (client-side, keyed by exact provider identity)
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
/** Maps "source:asset-id" → local serving path. Display names are never identity. */
|
|
159
|
+
const downloadedAssetPaths = new Map<string, string>();
|
|
160
|
+
|
|
161
|
+
/** Listeners notified when the download cache changes. */
|
|
162
|
+
const downloadListeners = new Set<() => void>();
|
|
163
|
+
|
|
164
|
+
function assetCacheKey(source: string, assetId: string): string {
|
|
165
|
+
return `${source}:${assetId}`;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Check if an online asset has already been downloaded. Returns local path or null. */
|
|
169
|
+
export function getDownloadedAssetPath(source: string, assetId: string): string | null {
|
|
170
|
+
return downloadedAssetPaths.get(assetCacheKey(source, assetId)) ?? null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Subscribe to download cache changes. Returns unsubscribe function. */
|
|
174
|
+
export function onAssetDownloaded(cb: () => void): () => void {
|
|
175
|
+
downloadListeners.add(cb);
|
|
176
|
+
return () => downloadListeners.delete(cb);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Fetch already-downloaded assets from the server and seed the cache. */
|
|
180
|
+
export async function loadDownloadedAssets(): Promise<void> {
|
|
181
|
+
try {
|
|
182
|
+
const res = await fetch(`${BASE}/asset-library/downloaded`);
|
|
183
|
+
const data = await editorServerJson<{
|
|
184
|
+
downloaded: { source: string; id: string; path: string }[];
|
|
185
|
+
}>(res, 'Could not read the downloaded-asset list');
|
|
186
|
+
downloadedAssetPaths.clear();
|
|
187
|
+
for (const entry of data.downloaded) {
|
|
188
|
+
downloadedAssetPaths.set(assetCacheKey(entry.source, entry.id), `/${entry.path}`);
|
|
189
|
+
}
|
|
190
|
+
for (const cb of downloadListeners) cb();
|
|
191
|
+
} catch {
|
|
192
|
+
/* best-effort */
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Search for online assets via the editor server's proxy. */
|
|
197
|
+
export async function searchOnlineAssets(params: {
|
|
198
|
+
source: string;
|
|
199
|
+
type: string;
|
|
200
|
+
q?: string;
|
|
201
|
+
category?: string;
|
|
202
|
+
offset?: number;
|
|
203
|
+
limit?: number;
|
|
204
|
+
}): Promise<{ assets: OnlineAsset[]; total: number }> {
|
|
205
|
+
const qs = new URLSearchParams();
|
|
206
|
+
qs.set('source', params.source);
|
|
207
|
+
qs.set('type', params.type);
|
|
208
|
+
if (params.q) qs.set('q', params.q);
|
|
209
|
+
if (params.category) qs.set('category', params.category);
|
|
210
|
+
if (params.offset != null) qs.set('offset', String(params.offset));
|
|
211
|
+
if (params.limit != null) qs.set('limit', String(params.limit));
|
|
212
|
+
|
|
213
|
+
const res = await fetch(`${BASE}/asset-library/search?${qs}`);
|
|
214
|
+
assertEditorServerAnswered(res, 'Asset Library search failed');
|
|
215
|
+
if (!res.ok) {
|
|
216
|
+
const body = (await res.json().catch(() => null)) as { error?: string } | null;
|
|
217
|
+
throw new Error(body?.error ?? `Asset Library search failed (${res.status}).`);
|
|
218
|
+
}
|
|
219
|
+
return (await res.json()) as { assets: OnlineAsset[]; total: number };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Get available file options (resolutions/formats) for an online asset. */
|
|
223
|
+
export async function getOnlineAssetFiles(source: string, id: string): Promise<AssetFileOption[]> {
|
|
224
|
+
return fetchOnlineAssetFilesFromServer(source, id);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async function fetchOnlineAssetFilesFromServer(
|
|
228
|
+
source: string,
|
|
229
|
+
id: string,
|
|
230
|
+
): Promise<AssetFileOption[]> {
|
|
231
|
+
const qs = new URLSearchParams({ source, id });
|
|
232
|
+
let res: Response;
|
|
233
|
+
try {
|
|
234
|
+
res = await fetch(`${BASE}/asset-library/files?${qs}`);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
throw new AssetDeliveryError(
|
|
237
|
+
'offline',
|
|
238
|
+
error instanceof Error ? error.message : assetDeliveryIssueMessage('offline'),
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
// A page fallback here is not a provider problem — it is nobody serving the
|
|
242
|
+
// route — so it reports itself rather than being graded into a delivery code.
|
|
243
|
+
assertEditorServerAnswered(res, 'Asset Library file lookup failed');
|
|
244
|
+
if (!res.ok) {
|
|
245
|
+
const body = (await res.json().catch(() => null)) as { error?: string } | null;
|
|
246
|
+
const code: AssetDeliveryIssueCode =
|
|
247
|
+
res.status === 403
|
|
248
|
+
? 'license-blocked'
|
|
249
|
+
: res.status === 429
|
|
250
|
+
? 'quota-limited'
|
|
251
|
+
: res.status === 404
|
|
252
|
+
? 'unavailable'
|
|
253
|
+
: 'provider-error';
|
|
254
|
+
throw new AssetDeliveryError(code, body?.error ?? assetDeliveryIssueMessage(code));
|
|
255
|
+
}
|
|
256
|
+
const data = (await res.json()) as { files: AssetFileOption[] };
|
|
257
|
+
return data.files;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Resolve a read-only interactive model preview from the editor's catalog cache. */
|
|
261
|
+
export async function getOnlineAssetPreview(
|
|
262
|
+
source: string,
|
|
263
|
+
id: string,
|
|
264
|
+
): Promise<OnlineAssetPreview | null> {
|
|
265
|
+
const qs = new URLSearchParams({ source, id });
|
|
266
|
+
const res = await fetch(`${BASE}/asset-library/preview?${qs}`);
|
|
267
|
+
// `null` stays the answer for a route that says "no preview" (404); it is NOT
|
|
268
|
+
// the answer for an origin where the route does not exist at all.
|
|
269
|
+
assertEditorServerAnswered(res, 'Could not resolve an asset preview');
|
|
270
|
+
if (!res.ok) return null;
|
|
271
|
+
return (await res.json()) as OnlineAssetPreview;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface AppliedAssetImportHistory {
|
|
275
|
+
assetPath: string;
|
|
276
|
+
beforeToken: string;
|
|
277
|
+
afterToken: string;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export interface DownloadOnlineAssetResult {
|
|
281
|
+
ok: boolean;
|
|
282
|
+
path?: string;
|
|
283
|
+
alreadyExists?: boolean;
|
|
284
|
+
provenanceOperationId?: string;
|
|
285
|
+
history?: AppliedAssetImportHistory;
|
|
286
|
+
error?: string;
|
|
287
|
+
/** The import SUCCEEDED but `.volter/assets.json` could not be updated (D-AP3).
|
|
288
|
+
* Loud, non-fatal degradation: the bytes are in the project, the provenance
|
|
289
|
+
* record is not. */
|
|
290
|
+
ledgerError?: string;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Download an online asset into the project's public/asset-library/ folder. */
|
|
294
|
+
export async function downloadOnlineAsset(params: {
|
|
295
|
+
source: string;
|
|
296
|
+
id: string;
|
|
297
|
+
name: string;
|
|
298
|
+
url: string;
|
|
299
|
+
format: string;
|
|
300
|
+
jobId?: string;
|
|
301
|
+
includes?: { relativePath: string; url: string; size: number }[];
|
|
302
|
+
/** License as the library's own search result reported it. Recorded in the
|
|
303
|
+
* provenance ledger for sources the server cannot resolve a license for
|
|
304
|
+
* (the polyhaven/ambientcg proxy) — see D-AP3. */
|
|
305
|
+
license?: string;
|
|
306
|
+
signal?: AbortSignal;
|
|
307
|
+
}): Promise<DownloadOnlineAssetResult> {
|
|
308
|
+
const res = await fetch(`${BASE}/asset-library/download`, {
|
|
309
|
+
method: 'POST',
|
|
310
|
+
headers: { 'Content-Type': 'application/json' },
|
|
311
|
+
body: JSON.stringify({ ...params, signal: undefined }),
|
|
312
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
313
|
+
});
|
|
314
|
+
assertEditorServerAnswered(res, 'Could not download the asset');
|
|
315
|
+
const result = (await res.json()) as DownloadOnlineAssetResult;
|
|
316
|
+
// Cache the local path on success
|
|
317
|
+
if (result.ok && result.path) {
|
|
318
|
+
downloadedAssetPaths.set(assetCacheKey(params.source, params.id), `/${result.path}`);
|
|
319
|
+
for (const cb of downloadListeners) cb();
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Capture a content-addressed server snapshot for one imported asset directory. */
|
|
325
|
+
export async function captureProjectAssetHistory(assetPath: string): Promise<string> {
|
|
326
|
+
const response = await fetch(`${BASE}/asset-library/history/capture`, {
|
|
327
|
+
method: 'POST',
|
|
328
|
+
headers: { 'Content-Type': 'application/json' },
|
|
329
|
+
body: JSON.stringify({ assetPath }),
|
|
330
|
+
});
|
|
331
|
+
assertEditorServerAnswered(response, 'Asset history capture failed');
|
|
332
|
+
const result = (await response.json()) as { ok?: boolean; token?: string; error?: string };
|
|
333
|
+
if (!response.ok || !result.token) {
|
|
334
|
+
throw new Error(result.error ?? `Asset history capture failed (${response.status}).`);
|
|
335
|
+
}
|
|
336
|
+
return result.token;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** Restore an exact imported-directory + provenance snapshot during undo/redo. */
|
|
340
|
+
export async function restoreProjectAssetHistory(assetPath: string, token: string): Promise<void> {
|
|
341
|
+
const response = await fetch(`${BASE}/asset-library/history/restore`, {
|
|
342
|
+
method: 'POST',
|
|
343
|
+
headers: { 'Content-Type': 'application/json' },
|
|
344
|
+
body: JSON.stringify({ assetPath, token }),
|
|
345
|
+
});
|
|
346
|
+
// This function REPORTS BY RETURNING: a page fallback is `ok`, so an undo
|
|
347
|
+
// that restored nothing used to complete silently.
|
|
348
|
+
assertEditorServerAnswered(response, 'Asset history restore failed');
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
const result = (await response.json().catch(() => null)) as { error?: string } | null;
|
|
351
|
+
throw new Error(result?.error ?? `Asset history restore failed (${response.status}).`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/** Get categories for a given asset type (Poly Haven, or the cloud-hosted
|
|
356
|
+
* "local" catalog). */
|
|
357
|
+
export async function getAssetLibraryCategories(type: string, source?: string): Promise<string[]> {
|
|
358
|
+
const params = new URLSearchParams({ type });
|
|
359
|
+
if (source) params.set('source', source);
|
|
360
|
+
const res = await fetch(`${BASE}/asset-library/categories?${params}`);
|
|
361
|
+
assertEditorServerAnswered(res, 'Could not read Asset Library categories');
|
|
362
|
+
if (!res.ok) return [];
|
|
363
|
+
const data = (await res.json()) as { categories: string[] };
|
|
364
|
+
return data.categories;
|
|
365
|
+
}
|