@volter/editor-core 0.5.57
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/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One hover-preview voice for the asset browser. OWNER — this module.
|
|
3
|
+
* SHARERS — AudioAssetThumb / AssetBrowser cards. THE ONE TEARDOWN —
|
|
4
|
+
* {@link stopAssetAudioPreview}. A second hover replaces the first.
|
|
5
|
+
*
|
|
6
|
+
* Playback is a BufferSource on THIS context, not HTMLAudio. Hover is not a
|
|
7
|
+
* user gesture, so `audio.play()` is rejected and was swallowed. Decode
|
|
8
|
+
* already ran for the waveform; we play that buffer after resume().
|
|
9
|
+
*/
|
|
10
|
+
import { AUDIO_WAVEFORM_BARS, peaksFromSamples } from './audio-waveform';
|
|
11
|
+
|
|
12
|
+
export interface AssetAudioPreviewState {
|
|
13
|
+
readonly url: string | null;
|
|
14
|
+
readonly progress: number;
|
|
15
|
+
readonly playing: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const listeners = new Set<() => void>();
|
|
19
|
+
const bufferCache = new Map<string, Promise<AudioBuffer | null>>();
|
|
20
|
+
const peakCache = new Map<string, Promise<readonly number[]>>();
|
|
21
|
+
|
|
22
|
+
let decodeContext: AudioContext | null = null;
|
|
23
|
+
let source: AudioBufferSourceNode | null = null;
|
|
24
|
+
let startedAt = 0;
|
|
25
|
+
let duration = 0;
|
|
26
|
+
let raf = 0;
|
|
27
|
+
let generation = 0;
|
|
28
|
+
let unlockInstalled = false;
|
|
29
|
+
let state: AssetAudioPreviewState = { url: null, progress: 0, playing: false };
|
|
30
|
+
|
|
31
|
+
function emit(): void {
|
|
32
|
+
for (const listener of listeners) listener();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function setState(next: AssetAudioPreviewState): void {
|
|
36
|
+
if (
|
|
37
|
+
state.url === next.url &&
|
|
38
|
+
state.playing === next.playing &&
|
|
39
|
+
Math.abs(state.progress - next.progress) < 0.002
|
|
40
|
+
) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
state = next;
|
|
44
|
+
emit();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function audioContext(): AudioContext {
|
|
48
|
+
decodeContext ??= new AudioContext();
|
|
49
|
+
return decodeContext;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function installUnlock(): void {
|
|
53
|
+
if (unlockInstalled || typeof window === 'undefined') return;
|
|
54
|
+
unlockInstalled = true;
|
|
55
|
+
const resume = () => {
|
|
56
|
+
if (!decodeContext) return;
|
|
57
|
+
const url = state.url;
|
|
58
|
+
const token = generation;
|
|
59
|
+
void decodeContext.resume().then(() => {
|
|
60
|
+
if (url && token === generation && !source && decodeContext?.state === 'running') {
|
|
61
|
+
void playWhenReady(url, token);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
window.addEventListener('pointerdown', resume, { capture: true });
|
|
66
|
+
window.addEventListener('keydown', resume, { capture: true });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function stopSource(): void {
|
|
70
|
+
if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);
|
|
71
|
+
raf = 0;
|
|
72
|
+
if (!source) return;
|
|
73
|
+
const node = source;
|
|
74
|
+
source = null;
|
|
75
|
+
node.onended = null;
|
|
76
|
+
try {
|
|
77
|
+
node.stop();
|
|
78
|
+
} catch {
|
|
79
|
+
// already stopped
|
|
80
|
+
}
|
|
81
|
+
node.disconnect();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function tick(): void {
|
|
85
|
+
raf = 0;
|
|
86
|
+
if (!state.playing || !decodeContext || duration <= 0) return;
|
|
87
|
+
const progress = Math.min(1, (decodeContext.currentTime - startedAt) / duration);
|
|
88
|
+
setState({ url: state.url, progress, playing: progress < 1 });
|
|
89
|
+
if (progress < 1 && typeof requestAnimationFrame === 'function') {
|
|
90
|
+
raf = requestAnimationFrame(tick);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function startSource(buffer: AudioBuffer, url: string, token: number): void {
|
|
95
|
+
if (token !== generation) return;
|
|
96
|
+
stopSource();
|
|
97
|
+
const context = audioContext();
|
|
98
|
+
const node = context.createBufferSource();
|
|
99
|
+
const gain = context.createGain();
|
|
100
|
+
gain.gain.value = 1;
|
|
101
|
+
node.buffer = buffer;
|
|
102
|
+
node.connect(gain);
|
|
103
|
+
gain.connect(context.destination);
|
|
104
|
+
node.onended = () => {
|
|
105
|
+
if (token !== generation) return;
|
|
106
|
+
setState({ url, progress: 1, playing: false });
|
|
107
|
+
};
|
|
108
|
+
node.start();
|
|
109
|
+
source = node;
|
|
110
|
+
startedAt = context.currentTime;
|
|
111
|
+
duration = buffer.duration;
|
|
112
|
+
setState({ url, progress: 0, playing: true });
|
|
113
|
+
if (typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(tick);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function loadBuffer(url: string): Promise<AudioBuffer | null> {
|
|
117
|
+
const cached = bufferCache.get(url);
|
|
118
|
+
if (cached) return cached;
|
|
119
|
+
const pending = (async () => {
|
|
120
|
+
const response = await fetch(url);
|
|
121
|
+
if (!response.ok) throw new Error(`Audio preview could not read ${url}.`);
|
|
122
|
+
const bytes = await response.arrayBuffer();
|
|
123
|
+
return audioContext().decodeAudioData(bytes.slice(0));
|
|
124
|
+
})().catch(() => null);
|
|
125
|
+
bufferCache.set(url, pending);
|
|
126
|
+
return pending;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function playWhenReady(url: string, token: number): Promise<void> {
|
|
130
|
+
installUnlock();
|
|
131
|
+
const buffer = await loadBuffer(url);
|
|
132
|
+
if (token !== generation) return;
|
|
133
|
+
if (!buffer) {
|
|
134
|
+
setState({ url, progress: 0, playing: false });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const context = audioContext();
|
|
138
|
+
if (context.state === 'suspended') {
|
|
139
|
+
await context.resume();
|
|
140
|
+
if (token !== generation) return;
|
|
141
|
+
}
|
|
142
|
+
if (context.state !== 'running') return;
|
|
143
|
+
startSource(buffer, url, token);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function subscribeAssetAudioPreview(listener: () => void): () => void {
|
|
147
|
+
listeners.add(listener);
|
|
148
|
+
return () => listeners.delete(listener);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function getAssetAudioPreview(): AssetAudioPreviewState {
|
|
152
|
+
return state;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function previewAssetAudio(url: string): void {
|
|
156
|
+
const token = ++generation;
|
|
157
|
+
stopSource();
|
|
158
|
+
setState({ url, progress: 0, playing: true });
|
|
159
|
+
void playWhenReady(url, token);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function stopAssetAudioPreview(url?: string): void {
|
|
163
|
+
if (url && state.url !== url) return;
|
|
164
|
+
generation += 1;
|
|
165
|
+
stopSource();
|
|
166
|
+
setState({ url: null, progress: 0, playing: false });
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function loadAudioWaveformPeaks(
|
|
170
|
+
url: string,
|
|
171
|
+
bars: number = AUDIO_WAVEFORM_BARS,
|
|
172
|
+
): Promise<readonly number[]> {
|
|
173
|
+
const key = `${url}#${bars}`;
|
|
174
|
+
const cached = peakCache.get(key);
|
|
175
|
+
if (cached) return cached;
|
|
176
|
+
const pending = loadBuffer(url).then((buffer) =>
|
|
177
|
+
buffer
|
|
178
|
+
? peaksFromSamples(buffer.getChannelData(0), bars)
|
|
179
|
+
: Array.from({ length: bars }, () => 0),
|
|
180
|
+
);
|
|
181
|
+
peakCache.set(key, pending);
|
|
182
|
+
return pending;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export function __resetAssetAudioPreviewForTest(): void {
|
|
186
|
+
generation += 1;
|
|
187
|
+
stopSource();
|
|
188
|
+
decodeContext = null;
|
|
189
|
+
bufferCache.clear();
|
|
190
|
+
peakCache.clear();
|
|
191
|
+
unlockInstalled = false;
|
|
192
|
+
state = { url: null, progress: 0, playing: false };
|
|
193
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Downsample a channel to display bars. Peak of each window, then normalize. */
|
|
2
|
+
export function peaksFromSamples(samples: ArrayLike<number>, bars: number): number[] {
|
|
3
|
+
if (bars <= 0) return [];
|
|
4
|
+
if (samples.length === 0) return Array.from({ length: bars }, () => 0);
|
|
5
|
+
const peaks = new Array<number>(bars);
|
|
6
|
+
const block = samples.length / bars;
|
|
7
|
+
let max = 0;
|
|
8
|
+
for (let index = 0; index < bars; index++) {
|
|
9
|
+
const start = Math.floor(index * block);
|
|
10
|
+
const end = Math.max(start + 1, Math.floor((index + 1) * block));
|
|
11
|
+
let peak = 0;
|
|
12
|
+
for (let sample = start; sample < end; sample++) {
|
|
13
|
+
peak = Math.max(peak, Math.abs(samples[sample] ?? 0));
|
|
14
|
+
}
|
|
15
|
+
peaks[index] = peak;
|
|
16
|
+
max = Math.max(max, peak);
|
|
17
|
+
}
|
|
18
|
+
if (max <= 1e-8) return peaks.fill(0);
|
|
19
|
+
return peaks.map((peak) => peak / max);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const AUDIO_WAVEFORM_BARS = 32;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe client for the deployed `cloud-asset-library` Worker (D-AP4/
|
|
3
|
+
* D-AP5).
|
|
4
|
+
*
|
|
5
|
+
* GET-only, no `process.env` overrides, no admin routes, no Node imports —
|
|
6
|
+
* so a Vite browser bundle can include it directly. Node's own client
|
|
7
|
+
* (`packages/editor/server/cloud-asset-catalog.ts`) additionally proxies
|
|
8
|
+
* Poly Haven/ambientcg and reads `VGAI_CLOUD_ASSET_URL`, so the two clients'
|
|
9
|
+
* FETCHING stays separate; the two clients' idea of what the worker RETURNS
|
|
10
|
+
* does not. This module is where the worker's record shape is declared, and
|
|
11
|
+
* the Node client imports it from here.
|
|
12
|
+
*
|
|
13
|
+
* That direction is the only one available and it is the one the package
|
|
14
|
+
* already uses everywhere: `src/` is what this package's browser
|
|
15
|
+
* `tsconfig.json` includes, so a `src` module cannot reach `server/`, while
|
|
16
|
+
* `server/` reaches into `src/` in twenty-odd places today
|
|
17
|
+
* (`asset-catalog-v2.ts` -> `asset-workflow/asset-types.ts` is the nearest
|
|
18
|
+
* sibling). The mirror the Node client used to keep instead had drifted into
|
|
19
|
+
* a DIFFERENT SHAPE — see {@link CloudAssetRecord}.
|
|
20
|
+
*
|
|
21
|
+
* Two materialization sites share this client:
|
|
22
|
+
* - `hosted-asset-materialization.ts` (D-AP4 — a project's DECLARED packs,
|
|
23
|
+
* `asset-manifest.json`)
|
|
24
|
+
* - `browser-asset-library.ts` (D-AP5 — the Library panel's cloud-hosted
|
|
25
|
+
* "local" source)
|
|
26
|
+
*
|
|
27
|
+
* ANTI-SHIM: every byte this module hands back is verified by its caller
|
|
28
|
+
* against the library's own sha256 before being written anywhere — this
|
|
29
|
+
* module itself never fabricates or substitutes bytes, and a 404/network
|
|
30
|
+
* failure surfaces as `null`/a thrown `fetch` rejection, never a placeholder.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
export const DEFAULT_CLOUD_ASSET_BASE_URL = 'https://vgai-asset-library.aaron-0ed.workers.dev';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* One deliverable object. The worker's own
|
|
37
|
+
* `packages/cloud-asset-library/src/types.ts` carries a `key` here — its R2
|
|
38
|
+
* object key — which is deliberately absent from this consumer shape: no
|
|
39
|
+
* editor path reads it, and the GraphQL leg the Node client uses does not even
|
|
40
|
+
* select it (`queryCloudAssets` asks for `sha256 sizeBytes contentType
|
|
41
|
+
* relativePath`). A field with no reader is not part of a client's contract.
|
|
42
|
+
*/
|
|
43
|
+
export interface CloudAssetObject {
|
|
44
|
+
sha256: string;
|
|
45
|
+
sizeBytes: number;
|
|
46
|
+
contentType: string;
|
|
47
|
+
relativePath: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface CloudAssetFile {
|
|
51
|
+
label: string;
|
|
52
|
+
format: string;
|
|
53
|
+
main: CloudAssetObject;
|
|
54
|
+
dependencies: CloudAssetObject[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* One hosted asset variant, as the worker SERVES it.
|
|
59
|
+
*
|
|
60
|
+
* `familyId`, `label`, `categories` and `tags` are REQUIRED because the worker
|
|
61
|
+
* guarantees them on the way out: `worker.ts`'s `runtimeManifest` projects a
|
|
62
|
+
* canonical v2 snapshot through `projectCloudAssets` and an older flat v1
|
|
63
|
+
* snapshot through `projectLegacyCloudManifest`, and BOTH fill these in
|
|
64
|
+
* (`asset.familyId ?? asset.id`, `asset.label ?? files[0].label ?? name`,
|
|
65
|
+
* `?? []`) before anything leaves the worker. The optional-everything mirror
|
|
66
|
+
* the Node client used to keep was the worker's INTERNAL
|
|
67
|
+
* `LegacyCloudAssetRecord` — the pre-projection R2 shape, which no client ever
|
|
68
|
+
* receives — under this name. Downstream already relies on the guarantee:
|
|
69
|
+
* `cloudAssetSlug` does `record.familyId.slice(0, 8)`.
|
|
70
|
+
*/
|
|
71
|
+
export interface CloudAssetRecord {
|
|
72
|
+
id: string;
|
|
73
|
+
familyId: string;
|
|
74
|
+
label: string;
|
|
75
|
+
status: 'validated';
|
|
76
|
+
source: string;
|
|
77
|
+
name: string;
|
|
78
|
+
type: string;
|
|
79
|
+
license: string;
|
|
80
|
+
author: string;
|
|
81
|
+
sourceUrl: string;
|
|
82
|
+
attribution: string;
|
|
83
|
+
categories: string[];
|
|
84
|
+
tags: string[];
|
|
85
|
+
files: CloudAssetFile[];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* `GET /v1/manifest`, narrowed to the two fields both clients read. The
|
|
90
|
+
* response carries more (`familyCount`, `totalBytes`, the canonical `families`
|
|
91
|
+
* graph); a client declares what it reads.
|
|
92
|
+
*
|
|
93
|
+
* `version` stays `1 | 2` even though the current worker always projects to 2,
|
|
94
|
+
* because the version is exactly what a client checks to find out whether the
|
|
95
|
+
* DEPLOYED worker is that one — the Node client's `loadCloudAssetManifest`
|
|
96
|
+
* rejects anything else outright.
|
|
97
|
+
*/
|
|
98
|
+
export interface CloudAssetManifestResponse {
|
|
99
|
+
version: 1 | 2;
|
|
100
|
+
generatedAt: string;
|
|
101
|
+
assets: CloudAssetRecord[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface CloudAssetClientOptions {
|
|
105
|
+
/** Override the deployed worker's base URL — tests only; production callers
|
|
106
|
+
* always get {@link DEFAULT_CLOUD_ASSET_BASE_URL}. */
|
|
107
|
+
readonly baseUrl?: string;
|
|
108
|
+
readonly signal?: AbortSignal;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Match the Library panel's plural filter values ("models", "animations",
|
|
112
|
+
* "sources") against the singular type carried by cloud records. Animation
|
|
113
|
+
* tags count for the same reason they do in the SSD catalog: several source
|
|
114
|
+
* packs classify an animated model as a model while still tagging the
|
|
115
|
+
* capability honestly. */
|
|
116
|
+
export function cloudAssetMatchesType(record: CloudAssetRecord, type?: string): boolean {
|
|
117
|
+
const normalizedType = type === 'all' ? undefined : type?.replace(/s$/, '');
|
|
118
|
+
if (!normalizedType) return true;
|
|
119
|
+
if (normalizedType === 'animation') {
|
|
120
|
+
return (
|
|
121
|
+
record.type === 'animation' ||
|
|
122
|
+
record.tags.includes('animation') ||
|
|
123
|
+
record.tags.includes('animated')
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return record.type === normalizedType;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function baseUrlOf(options: CloudAssetClientOptions): string {
|
|
130
|
+
return (options.baseUrl ?? DEFAULT_CLOUD_ASSET_BASE_URL).replace(/\/+$/, '');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function fetchInit(options: CloudAssetClientOptions): RequestInit {
|
|
134
|
+
return options.signal ? { signal: options.signal } : {};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Fetch one asset's metadata (`GET /v1/assets/:id`). `null` on a 404 or a
|
|
138
|
+
* malformed response — a miss is an ordinary outcome the caller reports as
|
|
139
|
+
* "not hosted", never a crash. */
|
|
140
|
+
export async function fetchCloudAssetRecord(
|
|
141
|
+
assetId: string,
|
|
142
|
+
options: CloudAssetClientOptions = {},
|
|
143
|
+
): Promise<CloudAssetRecord | null> {
|
|
144
|
+
const baseUrl = baseUrlOf(options);
|
|
145
|
+
const response = await fetch(
|
|
146
|
+
`${baseUrl}/v1/assets/${encodeURIComponent(assetId)}`,
|
|
147
|
+
fetchInit(options),
|
|
148
|
+
);
|
|
149
|
+
if (!response.ok) return null;
|
|
150
|
+
const value = (await response.json()) as Partial<CloudAssetRecord> | null;
|
|
151
|
+
if (!value || typeof value !== 'object' || !Array.isArray(value.files)) return null;
|
|
152
|
+
return value as CloudAssetRecord;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
interface ManifestCacheEntry {
|
|
156
|
+
baseUrl: string;
|
|
157
|
+
generatedAt: string;
|
|
158
|
+
assets: CloudAssetRecord[];
|
|
159
|
+
loadedAt: number;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let cachedManifest: ManifestCacheEntry | undefined;
|
|
163
|
+
const MANIFEST_CACHE_MS = 5 * 60 * 1000;
|
|
164
|
+
|
|
165
|
+
/** Test-only: forget the in-memory manifest cache so each test starts fresh. */
|
|
166
|
+
export function resetCloudAssetManifestCache(): void {
|
|
167
|
+
cachedManifest = undefined;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Fetch the full hosted-asset manifest (`GET /v1/manifest`), cached in
|
|
171
|
+
* memory for {@link MANIFEST_CACHE_MS} — a Library-panel session searches
|
|
172
|
+
* and lists categories repeatedly, and the worker itself only refreshes its
|
|
173
|
+
* own R2 read every 60s (`packages/cloud-asset-library/src/worker.ts`), so
|
|
174
|
+
* re-fetching on every keystroke would buy nothing. `null` on a network/
|
|
175
|
+
* malformed-response failure (never a cached stale value past its TTL, and
|
|
176
|
+
* never a fabricated empty catalog reported as success). */
|
|
177
|
+
export async function fetchCloudAssetManifest(
|
|
178
|
+
options: CloudAssetClientOptions = {},
|
|
179
|
+
): Promise<{ generatedAt: string; assets: CloudAssetRecord[] } | null> {
|
|
180
|
+
const baseUrl = baseUrlOf(options);
|
|
181
|
+
if (
|
|
182
|
+
cachedManifest &&
|
|
183
|
+
cachedManifest.baseUrl === baseUrl &&
|
|
184
|
+
Date.now() - cachedManifest.loadedAt < MANIFEST_CACHE_MS
|
|
185
|
+
) {
|
|
186
|
+
return { generatedAt: cachedManifest.generatedAt, assets: cachedManifest.assets };
|
|
187
|
+
}
|
|
188
|
+
const response = await fetch(`${baseUrl}/v1/manifest`, fetchInit(options));
|
|
189
|
+
if (!response.ok) return null;
|
|
190
|
+
const value = (await response.json()) as Partial<CloudAssetManifestResponse> | null;
|
|
191
|
+
if (!value || !Array.isArray(value.assets)) return null;
|
|
192
|
+
cachedManifest = {
|
|
193
|
+
baseUrl,
|
|
194
|
+
generatedAt: value.generatedAt ?? '',
|
|
195
|
+
assets: value.assets,
|
|
196
|
+
loadedAt: Date.now(),
|
|
197
|
+
};
|
|
198
|
+
return { generatedAt: cachedManifest.generatedAt, assets: cachedManifest.assets };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** The worker's thumbnail route for one asset. Quota-free and immutably
|
|
202
|
+
* cached (`serveThumbnail`), which is why a grid may show hundreds. */
|
|
203
|
+
export function cloudAssetThumbnailUrl(baseUrl: string | undefined, assetId: string): string {
|
|
204
|
+
return `${baseUrlOf(baseUrl ? { baseUrl } : {})}/v1/assets/${encodeURIComponent(assetId)}/thumbnail`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Build the download URL for one file of a hosted asset (`main` when
|
|
208
|
+
* `dependencyIndex` is omitted, one of its dependencies otherwise) — mirrors
|
|
209
|
+
* `packages/editor/server/cloud-asset-catalog.ts`'s `cloudAssetObjectUrl`. */
|
|
210
|
+
export function cloudAssetObjectUrl(
|
|
211
|
+
baseUrl: string | undefined,
|
|
212
|
+
assetId: string,
|
|
213
|
+
fileIndex: number,
|
|
214
|
+
dependencyIndex?: number,
|
|
215
|
+
): string {
|
|
216
|
+
const base = `${baseUrlOf(baseUrl ? { baseUrl } : {})}/v1/assets/${encodeURIComponent(assetId)}/files/${fileIndex}`;
|
|
217
|
+
return dependencyIndex === undefined ? base : `${base}/dependencies/${dependencyIndex}`;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Inverse of {@link cloudAssetObjectUrl}: recover the file/dependency index
|
|
221
|
+
* from a URL already known to name `expectedAssetId`, or `null` if it does
|
|
222
|
+
* not match this worker's own URL shape. */
|
|
223
|
+
export function parseCloudAssetObjectUrl(
|
|
224
|
+
value: string,
|
|
225
|
+
expectedAssetId: string,
|
|
226
|
+
options: { baseUrl?: string } = {},
|
|
227
|
+
): { fileIndex: number; dependencyIndex?: number } | null {
|
|
228
|
+
let url: URL;
|
|
229
|
+
try {
|
|
230
|
+
url = new URL(value);
|
|
231
|
+
} catch {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
let expectedBase: URL;
|
|
235
|
+
try {
|
|
236
|
+
expectedBase = new URL(baseUrlOf(options));
|
|
237
|
+
} catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
if (url.origin !== expectedBase.origin || url.search || url.hash) return null;
|
|
241
|
+
const prefix = expectedBase.pathname.replace(/\/$/, '');
|
|
242
|
+
const relativePath = url.pathname.slice(prefix.length);
|
|
243
|
+
const match = /^\/v1\/assets\/([a-f0-9]{24})\/files\/(\d+)(?:\/dependencies\/(\d+))?$/.exec(
|
|
244
|
+
relativePath,
|
|
245
|
+
);
|
|
246
|
+
if (!match || match[1] !== expectedAssetId) return null;
|
|
247
|
+
const result: { fileIndex: number; dependencyIndex?: number } = { fileIndex: Number(match[2]) };
|
|
248
|
+
if (match[3] !== undefined) result.dependencyIndex = Number(match[3]);
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** The same slug algorithm the Node Library panel uses for the SSD/cloud
|
|
253
|
+
* catalog's on-disk destination (`localAssetSlug` in
|
|
254
|
+
* `packages/editor/server/local-asset-catalog.ts`), rebuilt from the fields
|
|
255
|
+
* the cloud worker's own record already carries (`name`/`familyId`) so the
|
|
256
|
+
* browser client needs no dependency on the 34,412-asset local catalog. */
|
|
257
|
+
export function cloudAssetSlug(record: Pick<CloudAssetRecord, 'name' | 'familyId'>): string {
|
|
258
|
+
const base = record.name
|
|
259
|
+
.toLowerCase()
|
|
260
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
261
|
+
.replace(/^-|-$/g, '');
|
|
262
|
+
return `${base || 'asset'}-${record.familyId.slice(0, 8)}`;
|
|
263
|
+
}
|