@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,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `StorageBackend` side of the asset provenance ledger (D-AP3) — the
|
|
3
|
+
* browser/isomorphic sibling of `packages/editor/server/asset-ledger-store.ts`,
|
|
4
|
+
* which reads/writes `.vgai/assets.json` via `node:fs` for the local
|
|
5
|
+
* (HttpStorage-backed) Node editor. Every environment materializes through the
|
|
6
|
+
* SAME record shape (`../asset-workflow/asset-ledger.ts`'s pure schema) — only
|
|
7
|
+
* the I/O side differs, exactly like `storage/seed.ts`'s `readProjectManifest`
|
|
8
|
+
* reading `vgai.project.json` through a `StorageBackend` instead of `node:fs`.
|
|
9
|
+
*
|
|
10
|
+
* Used by `hosted-asset-materialization.ts` (D-AP4 — a project's declared
|
|
11
|
+
* packs).
|
|
12
|
+
*
|
|
13
|
+
* Concurrency: the same two-half protection the Node side takes, over this
|
|
14
|
+
* side's I/O (see `./ledger-write-lock.ts`). The in-realm chain covers one tab
|
|
15
|
+
* — several declared entries materializing in one pass, the Library panel and a
|
|
16
|
+
* reopen retry overlapping — and the `.lock` file covers the case only another
|
|
17
|
+
* realm can see: two tabs open on the same project, both retrying their
|
|
18
|
+
* declared packs. `writeIfAbsent` is honest about not being O_EXCL on
|
|
19
|
+
* handle APIs (it "serializes same-origin writers and rechecks at handle
|
|
20
|
+
* acquisition"), which is exactly the guarantee that matters here — the racing
|
|
21
|
+
* writers ARE same-origin — so it is the strongest primitive available and not
|
|
22
|
+
* a claim of more.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { withPathLock } from '../storage/path-lock';
|
|
26
|
+
import type { StorageBackend } from '../storage/types';
|
|
27
|
+
import {
|
|
28
|
+
ASSET_LEDGER_PATH,
|
|
29
|
+
type AssetLedger,
|
|
30
|
+
type AssetLedgerEntry,
|
|
31
|
+
normalizeLedgerPath,
|
|
32
|
+
parseAssetLedgerJson,
|
|
33
|
+
serializeAssetLedger,
|
|
34
|
+
sourceHashFromSha256,
|
|
35
|
+
upsertAssetLedgerEntry,
|
|
36
|
+
} from './asset-ledger';
|
|
37
|
+
import { createSerializer, withExclusiveLock } from './ledger-write-lock';
|
|
38
|
+
|
|
39
|
+
/** Read the ledger via `backend`. Absent → `{}`. Corrupt → throws (same
|
|
40
|
+
* contract as the Node `asset-ledger-store.ts` — a provenance record that
|
|
41
|
+
* silently drops entries is worse than no record). */
|
|
42
|
+
export async function readAssetLedgerFromBackend(backend: StorageBackend): Promise<AssetLedger> {
|
|
43
|
+
if (!(await backend.exists(ASSET_LEDGER_PATH))) return {};
|
|
44
|
+
return parseAssetLedgerJson(await backend.read(ASSET_LEDGER_PATH));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function writeAssetLedgerToBackend(
|
|
48
|
+
backend: StorageBackend,
|
|
49
|
+
ledger: AssetLedger,
|
|
50
|
+
): Promise<void> {
|
|
51
|
+
await backend.write(ASSET_LEDGER_PATH, serializeAssetLedger(ledger));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface BackendMaterializationRecord {
|
|
55
|
+
/** Project-relative destination, e.g. `public/asset-library/local/x/y.glb`. */
|
|
56
|
+
readonly destPath: string;
|
|
57
|
+
/** `source:id` — the library's identity for this asset. */
|
|
58
|
+
readonly key: string;
|
|
59
|
+
/** License string as the library reported it, if it reported one. */
|
|
60
|
+
readonly license?: string | undefined;
|
|
61
|
+
/** The LIBRARY's sha256 of the source bytes. Omit when the library has
|
|
62
|
+
* none — never substitute a hash of the bytes just written (anti-shim). */
|
|
63
|
+
readonly sourceSha256?: string | undefined;
|
|
64
|
+
readonly materializedAt?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const LEDGER_LOCK_PATH = `${ASSET_LEDGER_PATH}.lock`;
|
|
68
|
+
const serializeLedgerWrite = createSerializer();
|
|
69
|
+
/** Stable per-backend key for the in-realm chain (`backend.id` is shared by
|
|
70
|
+
* every instance of a backend TYPE, so it cannot key this on its own). */
|
|
71
|
+
const backendKeys = new WeakMap<StorageBackend, string>();
|
|
72
|
+
let nextBackendKey = 0;
|
|
73
|
+
|
|
74
|
+
function ledgerWriteKey(backend: StorageBackend): string {
|
|
75
|
+
const existing = backendKeys.get(backend);
|
|
76
|
+
if (existing !== undefined) return existing;
|
|
77
|
+
nextBackendKey += 1;
|
|
78
|
+
const key = `${backend.id}#${nextBackendKey}`;
|
|
79
|
+
backendKeys.set(backend, key);
|
|
80
|
+
return key;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Record one materialization in the project's ledger, via `backend`. */
|
|
84
|
+
export async function recordAssetMaterializationInBackend(
|
|
85
|
+
backend: StorageBackend,
|
|
86
|
+
record: BackendMaterializationRecord,
|
|
87
|
+
): Promise<void> {
|
|
88
|
+
const entry: AssetLedgerEntry = {
|
|
89
|
+
key: record.key,
|
|
90
|
+
...(record.license ? { license: record.license } : {}),
|
|
91
|
+
...(record.sourceSha256 ? { sourceHash: sourceHashFromSha256(record.sourceSha256) } : {}),
|
|
92
|
+
materializedAt: record.materializedAt ?? new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
await serializeLedgerWrite(ledgerWriteKey(backend), () =>
|
|
95
|
+
withExclusiveLock(
|
|
96
|
+
{
|
|
97
|
+
createIfAbsent: (content) => backend.writeIfAbsent(LEDGER_LOCK_PATH, content),
|
|
98
|
+
read: async () =>
|
|
99
|
+
(await backend.exists(LEDGER_LOCK_PATH)) ? backend.read(LEDGER_LOCK_PATH) : null,
|
|
100
|
+
// Compare-and-delete (see `./ledger-write-lock.ts`'s `ExclusiveLockIO`),
|
|
101
|
+
// and its three steps must not interleave with another realm's — so
|
|
102
|
+
// they run under the SAME path lock `HandleStorage.writeIfAbsent` takes
|
|
103
|
+
// (`../storage/path-lock.ts`). That makes this side genuinely atomic
|
|
104
|
+
// against every same-origin tab, so it needs no `rename` takeover
|
|
105
|
+
// like the `node:fs` side.
|
|
106
|
+
// NOT covered: `HttpStorage`, whose peer writer is the Node server/CLI
|
|
107
|
+
// rather than another tab — Web Locks cannot reach a separate process,
|
|
108
|
+
// and neither can anything else available in the page.
|
|
109
|
+
removeIfHeldBy: (expected) =>
|
|
110
|
+
withPathLock(backend.id, LEDGER_LOCK_PATH, async () => {
|
|
111
|
+
if (!(await backend.exists(LEDGER_LOCK_PATH))) return;
|
|
112
|
+
if ((await backend.read(LEDGER_LOCK_PATH)) !== expected) return;
|
|
113
|
+
await backend.remove(LEDGER_LOCK_PATH);
|
|
114
|
+
}),
|
|
115
|
+
},
|
|
116
|
+
async () => {
|
|
117
|
+
const ledger = await readAssetLedgerFromBackend(backend);
|
|
118
|
+
await writeAssetLedgerToBackend(
|
|
119
|
+
backend,
|
|
120
|
+
upsertAssetLedgerEntry(ledger, normalizeLedgerPath(record.destPath), entry),
|
|
121
|
+
);
|
|
122
|
+
},
|
|
123
|
+
{ owner: backend.id },
|
|
124
|
+
),
|
|
125
|
+
);
|
|
126
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project-owned asset provenance ledger — `.vgai/assets.json` (D-AP3).
|
|
3
|
+
*
|
|
4
|
+
* Assets follow the capability model: the asset library is the SOURCE, a
|
|
5
|
+
* project owns its COPIES. Every materialization — the editor's Library-panel
|
|
6
|
+
* download, the template/example `asset-packs:sync` script, the hosted seed —
|
|
7
|
+
* records the copy here, keyed by PROJECT-RELATIVE destination path.
|
|
8
|
+
*
|
|
9
|
+
* One ledger, not per-file sidecars: sidecars pollute asset directories and
|
|
10
|
+
* break tooling that globs them.
|
|
11
|
+
*
|
|
12
|
+
* The ledger is the license/attribution record and the drift input. Comparing a
|
|
13
|
+
* file's current hash to `sourceHash` distinguishes "the user edited their copy"
|
|
14
|
+
* (legitimate; git reports it) from "the library moved" (reported, never
|
|
15
|
+
* auto-applied — there is deliberately no `vgai asset update`).
|
|
16
|
+
*
|
|
17
|
+
* ANTI-SHIM: `license` and `sourceHash` are OPTIONAL and are recorded only when
|
|
18
|
+
* the library actually supplied them. We never hash the bytes we just wrote and
|
|
19
|
+
* call the result a `sourceHash` — that would make every copy look pristine
|
|
20
|
+
* forever and destroy the drift signal the field exists for. A materialization
|
|
21
|
+
* path with no library-supplied hash records the key and the timestamp and
|
|
22
|
+
* nothing else. Today that is the polyhaven/ambientcg remote proxy, whose
|
|
23
|
+
* upstream APIs publish no per-file digest; the local/cloud catalog paths
|
|
24
|
+
* (34,412 assets) carry `sha256` and populate the field.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { isContainedRelativePath } from '@volter/editor-sdk/session/relative-path-guard';
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
|
|
30
|
+
/** Project-relative location of the ledger. */
|
|
31
|
+
export const ASSET_LEDGER_PATH = '.vgai/assets.json';
|
|
32
|
+
|
|
33
|
+
/** The library's asset identity: `source:id` (see `onlineAssetKey`). */
|
|
34
|
+
export function assetKey(source: string, id: string): string {
|
|
35
|
+
return `${source}:${id}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const AssetLedgerEntrySchema = z
|
|
39
|
+
.object({
|
|
40
|
+
/** `source:id` — the library's own identity for the asset. */
|
|
41
|
+
key: z.string().min(1),
|
|
42
|
+
/** SPDX-ish license string as the library reported it, when it reported one. */
|
|
43
|
+
license: z.string().min(1).optional(),
|
|
44
|
+
/** The LIBRARY's digest of the source bytes — never a re-hash of our copy. */
|
|
45
|
+
sourceHash: z
|
|
46
|
+
.string()
|
|
47
|
+
.regex(/^sha256-[a-f0-9]{64}$/, 'sourceHash must be "sha256-<64 hex>"')
|
|
48
|
+
.optional(),
|
|
49
|
+
/** ISO-8601 instant the copy was written into this project. */
|
|
50
|
+
materializedAt: z.string().datetime(),
|
|
51
|
+
})
|
|
52
|
+
.strict();
|
|
53
|
+
|
|
54
|
+
export const AssetLedgerSchema = z.record(z.string().min(1), AssetLedgerEntrySchema);
|
|
55
|
+
|
|
56
|
+
export type AssetLedgerEntry = z.infer<typeof AssetLedgerEntrySchema>;
|
|
57
|
+
export type AssetLedger = Record<string, AssetLedgerEntry>;
|
|
58
|
+
|
|
59
|
+
/** Format a raw hex digest as the ledger's `sourceHash`. Rejects non-digests
|
|
60
|
+
* loudly rather than storing something that only looks like a hash. */
|
|
61
|
+
export function sourceHashFromSha256(sha256: string): string {
|
|
62
|
+
if (!/^[a-f0-9]{64}$/.test(sha256)) {
|
|
63
|
+
throw new Error(`Not a sha256 digest, refusing to record it as a sourceHash: ${sha256}`);
|
|
64
|
+
}
|
|
65
|
+
return `sha256-${sha256}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** The raw hex digest inside a `sha256-…` sourceHash, or null for other forms. */
|
|
69
|
+
export function sha256FromSourceHash(sourceHash: string): string | null {
|
|
70
|
+
const match = /^sha256-([a-f0-9]{64})$/.exec(sourceHash);
|
|
71
|
+
return match?.[1] ?? null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Normalize a ledger key: project-relative, forward slashes, no leading `./`. */
|
|
75
|
+
export function normalizeLedgerPath(path: string): string {
|
|
76
|
+
const normalized = path.replaceAll('\\', '/').replace(/^\.\//, '').replace(/^\/+/, '');
|
|
77
|
+
if (!normalized) throw new Error('An asset ledger path cannot be empty.');
|
|
78
|
+
if (!isContainedRelativePath(normalized)) {
|
|
79
|
+
throw new Error(`An asset ledger path cannot escape the project: ${path}`);
|
|
80
|
+
}
|
|
81
|
+
return normalized;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Parse a ledger document. Throws (loudly) on anything malformed — a
|
|
85
|
+
* provenance record that silently drops entries is worse than no record. */
|
|
86
|
+
export function parseAssetLedger(input: unknown): AssetLedger {
|
|
87
|
+
return AssetLedgerSchema.parse(input);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Parse ledger JSON text; an absent ledger is `{}`, a CORRUPT one throws. */
|
|
91
|
+
export function parseAssetLedgerJson(text: string | null | undefined): AssetLedger {
|
|
92
|
+
if (text == null || text.trim() === '') return {};
|
|
93
|
+
let parsed: unknown;
|
|
94
|
+
try {
|
|
95
|
+
parsed = JSON.parse(text);
|
|
96
|
+
} catch (cause) {
|
|
97
|
+
throw new Error(`${ASSET_LEDGER_PATH} is not valid JSON: ${String(cause)}`);
|
|
98
|
+
}
|
|
99
|
+
return parseAssetLedger(parsed);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Record one materialization. Pure: returns a new, key-sorted ledger. */
|
|
103
|
+
export function upsertAssetLedgerEntry(
|
|
104
|
+
ledger: AssetLedger,
|
|
105
|
+
destPath: string,
|
|
106
|
+
entry: AssetLedgerEntry,
|
|
107
|
+
): AssetLedger {
|
|
108
|
+
const key = normalizeLedgerPath(destPath);
|
|
109
|
+
const validated = AssetLedgerEntrySchema.parse(entry);
|
|
110
|
+
const merged: AssetLedger = { ...ledger, [key]: validated };
|
|
111
|
+
const sorted: AssetLedger = {};
|
|
112
|
+
for (const path of Object.keys(merged).sort()) sorted[path] = merged[path]!;
|
|
113
|
+
return sorted;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Serialize for disk — stable key order, trailing newline. */
|
|
117
|
+
export function serializeAssetLedger(ledger: AssetLedger): string {
|
|
118
|
+
const sorted: AssetLedger = {};
|
|
119
|
+
for (const path of Object.keys(ledger).sort()) sorted[path] = ledger[path]!;
|
|
120
|
+
return `${JSON.stringify(sorted, null, 2)}\n`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type AssetLedgerDrift =
|
|
124
|
+
| { readonly status: 'untracked' }
|
|
125
|
+
| { readonly status: 'unknown-source-hash' }
|
|
126
|
+
| { readonly status: 'pristine' }
|
|
127
|
+
| {
|
|
128
|
+
readonly status: 'edited-locally';
|
|
129
|
+
readonly sourceHash: string;
|
|
130
|
+
readonly currentHash: string;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Classify one copy against its ledger entry. `currentHash` is the sha256 of
|
|
135
|
+
* the bytes on disk RIGHT NOW.
|
|
136
|
+
*
|
|
137
|
+
* This deliberately cannot tell "user edited" from "library moved" on its own —
|
|
138
|
+
* both show as a hash difference. The ledger supplies one half (what we copied);
|
|
139
|
+
* re-reading the library supplies the other. Callers that have not consulted the
|
|
140
|
+
* library must report `edited-locally` as "differs from what was materialized",
|
|
141
|
+
* never as "the library moved".
|
|
142
|
+
*/
|
|
143
|
+
export function classifyAssetLedgerDrift(
|
|
144
|
+
ledger: AssetLedger,
|
|
145
|
+
destPath: string,
|
|
146
|
+
currentSha256: string,
|
|
147
|
+
): AssetLedgerDrift {
|
|
148
|
+
const entry = ledger[normalizeLedgerPath(destPath)];
|
|
149
|
+
if (!entry) return { status: 'untracked' };
|
|
150
|
+
if (!entry.sourceHash) return { status: 'unknown-source-hash' };
|
|
151
|
+
const expected = sha256FromSourceHash(entry.sourceHash);
|
|
152
|
+
if (expected === null) return { status: 'unknown-source-hash' };
|
|
153
|
+
return expected === currentSha256
|
|
154
|
+
? { status: 'pristine' }
|
|
155
|
+
: { status: 'edited-locally', sourceHash: expected, currentHash: currentSha256 };
|
|
156
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The FAILURE CHANNEL for declared-asset-pack materialization (D-AP4):
|
|
3
|
+
* *"Failure = loud degradation, not fabrication. ... the missing asset is
|
|
4
|
+
* reported in the editor console + status surface with a retry affordance, and
|
|
5
|
+
* dependent features degrade honestly."*
|
|
6
|
+
*
|
|
7
|
+
* `materializeDeclaredAssetPacks` already fails closed per entry — it never
|
|
8
|
+
* writes placeholder bytes and never blocks the other entries — but it only
|
|
9
|
+
* RETURNS a `failed` array, and an array with no reader is the hazard: a seed
|
|
10
|
+
* that lands without its clips would look like a working editor with a
|
|
11
|
+
* mysteriously dead animation, which is the worst possible outcome and
|
|
12
|
+
* precisely what the anti-shim rule forbids.
|
|
13
|
+
*
|
|
14
|
+
* This module is that reader, and it is deliberately TWO channels, because
|
|
15
|
+
* neither alone is enough — D-AP4's own words, *"reported in the editor
|
|
16
|
+
* console + status surface with a retry affordance"*:
|
|
17
|
+
*
|
|
18
|
+
* 1. `editorConsole.error` — one line per failed entry, subsystem `assets`,
|
|
19
|
+
* naming the library key, the destination path, the reason, and what
|
|
20
|
+
* degrades.
|
|
21
|
+
* 2. A module-level report slot the status bar's `asset-materialization`
|
|
22
|
+
* contribution reads (`../components/status-contributions.tsx`),
|
|
23
|
+
* carrying the RETRY affordance. Retry re-runs materialization against
|
|
24
|
+
* the active backend, which is safe and cheap by construction: the
|
|
25
|
+
* materializer skips every entry already in the ledger, so a retry only
|
|
26
|
+
* refetches what is still missing.
|
|
27
|
+
*
|
|
28
|
+
* That status item used to be a red banner across the top of the shell. The
|
|
29
|
+
* editor has ONE error home — console line, bottom-left status item, the
|
|
30
|
+
* Console utility behind it — and a second one only taught users two places
|
|
31
|
+
* to look, so the banner is gone.
|
|
32
|
+
*
|
|
33
|
+
* Same plain module-singleton + own-`subscribe` shape as
|
|
34
|
+
* `../authoring/mount-failure-report.ts`.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { editorConsole } from '../editor-console';
|
|
38
|
+
import type { StorageBackend } from '../storage/types';
|
|
39
|
+
import type { AssetPackMaterializationResult } from './hosted-asset-materialization';
|
|
40
|
+
|
|
41
|
+
/** One declared pack entry that did not materialize — the exact fields both
|
|
42
|
+
* channels show. Flattened out of `AssetPackMaterializationFailure` so the
|
|
43
|
+
* banner never has to know the materializer's own types. */
|
|
44
|
+
export interface AssetMaterializationFailure {
|
|
45
|
+
/** Library key, `source:id` (e.g. `local:a7c5288306d9e98cb7dbdbd2`). */
|
|
46
|
+
readonly key: string;
|
|
47
|
+
/** Project-relative destination the bytes were meant to land at. */
|
|
48
|
+
readonly dest: string;
|
|
49
|
+
/** Declaring pack name from `asset-manifest.json`. */
|
|
50
|
+
readonly pack: string;
|
|
51
|
+
/** The materializer's own reason string — never fabricated, never softened. */
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let _failures: readonly AssetMaterializationFailure[] = [];
|
|
56
|
+
const _listeners = new Set<() => void>();
|
|
57
|
+
|
|
58
|
+
/** `useSyncExternalStore`-compatible subscribe for the banner. */
|
|
59
|
+
export function subscribeToAssetMaterializationFailures(callback: () => void): () => void {
|
|
60
|
+
_listeners.add(callback);
|
|
61
|
+
return () => _listeners.delete(callback);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Every declared entry that failed to materialize, in declaration order. */
|
|
65
|
+
export function getAssetMaterializationFailures(): readonly AssetMaterializationFailure[] {
|
|
66
|
+
return _failures;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Clear the slot (the banner's dismiss). Does not retry. */
|
|
70
|
+
export function clearAssetMaterializationFailures(): void {
|
|
71
|
+
_failures = [];
|
|
72
|
+
notify();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function notify(): void {
|
|
76
|
+
for (const listener of _listeners) listener();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The message BOTH channels use, so the console line and the banner row can
|
|
81
|
+
* never drift apart. Names the key, the destination and the reason, then says
|
|
82
|
+
* what degrades — a reader who sees only this line knows what is broken and
|
|
83
|
+
* what it costs them.
|
|
84
|
+
*/
|
|
85
|
+
export function formatAssetMaterializationFailure(failure: AssetMaterializationFailure): string {
|
|
86
|
+
return (
|
|
87
|
+
`Starter asset "${failure.key}" (pack "${failure.pack}") did not materialize into ` +
|
|
88
|
+
`${failure.dest}: ${failure.reason} Nothing was written for it — features that read ` +
|
|
89
|
+
'that file degrade (a missing clips GLB leaves the character standing without ' +
|
|
90
|
+
'locomotion clips). Use Retry once the cause is fixed.'
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Report a materialization result through both channels. Called by every
|
|
96
|
+
* production materialization site (today: `../storage/seed.ts`'s
|
|
97
|
+
* `seedIfEmpty`) so no caller can forget to read `failed`.
|
|
98
|
+
*
|
|
99
|
+
* A result with no failures CLEARS the slot: that is what makes a successful
|
|
100
|
+
* retry dismiss its own banner.
|
|
101
|
+
*/
|
|
102
|
+
export function reportAssetMaterialization(result: AssetPackMaterializationResult): void {
|
|
103
|
+
const failures = result.failed.map((failure) => ({
|
|
104
|
+
key: failure.entry.key,
|
|
105
|
+
dest: failure.entry.dest,
|
|
106
|
+
pack: failure.entry.pack,
|
|
107
|
+
reason: failure.reason,
|
|
108
|
+
}));
|
|
109
|
+
for (const failure of failures) {
|
|
110
|
+
editorConsole.error(formatAssetMaterializationFailure(failure), 'assets');
|
|
111
|
+
}
|
|
112
|
+
_failures = failures;
|
|
113
|
+
notify();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Re-run materialization against `backend` and re-report. Retry-safe by
|
|
118
|
+
* construction (the materializer skips ledger-present entries), so this
|
|
119
|
+
* refetches only what is still missing.
|
|
120
|
+
*
|
|
121
|
+
* A THROW here is the manifest itself being unreadable/invalid — not a
|
|
122
|
+
* per-entry failure — so it degrades through the console too rather than
|
|
123
|
+
* becoming an unhandled rejection in a click handler.
|
|
124
|
+
*/
|
|
125
|
+
export async function retryAssetMaterialization(backend: StorageBackend): Promise<void> {
|
|
126
|
+
try {
|
|
127
|
+
// Lazy for the same reason the seed's call is: the materializer is the
|
|
128
|
+
// heaviest thing this report knows, and only the retry needs it.
|
|
129
|
+
const { materializeDeclaredAssetPacks } = await import('./hosted-asset-materialization');
|
|
130
|
+
const result = await materializeDeclaredAssetPacks(backend);
|
|
131
|
+
reportAssetMaterialization(result);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
editorConsole.error(
|
|
134
|
+
`Retrying asset materialization failed before any entry was attempted: ${
|
|
135
|
+
error instanceof Error ? error.message : String(error)
|
|
136
|
+
}`,
|
|
137
|
+
'assets',
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|