@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,119 @@
|
|
|
1
|
+
/** Node filesystem binding for the shared, read-only project inspector. */
|
|
2
|
+
|
|
3
|
+
import { readdir, readFile, stat, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { basename, resolve } from 'node:path';
|
|
5
|
+
import { resolveManifestPath } from '@volter/editor-project/manifest/locate';
|
|
6
|
+
import {
|
|
7
|
+
createIngestManifest,
|
|
8
|
+
inspectProject,
|
|
9
|
+
type ProjectInspection,
|
|
10
|
+
type ProjectInspectionReader,
|
|
11
|
+
type SuggestedAdapterSurface,
|
|
12
|
+
} from '@volter/editor-project/inspection';
|
|
13
|
+
import { resolveProjectPath } from './shared.js';
|
|
14
|
+
|
|
15
|
+
export type { SuggestedAdapterSurface } from '@volter/editor-project/inspection';
|
|
16
|
+
|
|
17
|
+
export function nodeProjectInspectionReader(root: string): ProjectInspectionReader {
|
|
18
|
+
return {
|
|
19
|
+
async exists(path) {
|
|
20
|
+
try {
|
|
21
|
+
await stat(resolveProjectPath(root, path));
|
|
22
|
+
return true;
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
read(path) {
|
|
28
|
+
return readFile(resolveProjectPath(root, path), 'utf-8');
|
|
29
|
+
},
|
|
30
|
+
async list(path) {
|
|
31
|
+
const entries = await readdir(resolveProjectPath(root, path), { withFileTypes: true });
|
|
32
|
+
return entries
|
|
33
|
+
.filter((entry) => !entry.isSymbolicLink())
|
|
34
|
+
.map((entry) => ({
|
|
35
|
+
name: entry.name,
|
|
36
|
+
path: path ? `${path.replace(/\\/g, '/')}/${entry.name}` : entry.name,
|
|
37
|
+
type: entry.isDirectory() ? ('dir' as const) : ('file' as const),
|
|
38
|
+
}));
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function inspectProjectFolderPath(path: string): Promise<{
|
|
44
|
+
path: string;
|
|
45
|
+
report: ProjectInspection;
|
|
46
|
+
}> {
|
|
47
|
+
const root = resolve(path);
|
|
48
|
+
const rootStat = await stat(root);
|
|
49
|
+
if (!rootStat.isDirectory()) throw new Error(`Project path is not a directory: ${root}`);
|
|
50
|
+
return { path: root, report: await inspectProject(nodeProjectInspectionReader(root)) };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function adaptProjectFolderPath(
|
|
54
|
+
path: string,
|
|
55
|
+
options: {
|
|
56
|
+
engineVersion: string;
|
|
57
|
+
surface?: SuggestedAdapterSurface | undefined;
|
|
58
|
+
entry?: string | undefined;
|
|
59
|
+
},
|
|
60
|
+
): Promise<{ path: string; writes: ['vgai.project.json']; manifest: Record<string, unknown> }> {
|
|
61
|
+
const preview = await previewAdaptProjectFolderPath(path, options);
|
|
62
|
+
await writeFile(
|
|
63
|
+
resolveManifestPath(preview.path),
|
|
64
|
+
`${JSON.stringify(preview.manifest, null, 2)}\n`,
|
|
65
|
+
{
|
|
66
|
+
encoding: 'utf-8',
|
|
67
|
+
flag: 'wx',
|
|
68
|
+
},
|
|
69
|
+
);
|
|
70
|
+
return { path: preview.path, writes: ['vgai.project.json'], manifest: preview.manifest };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Build the exact proposed sidecar without writing it. */
|
|
74
|
+
export async function previewAdaptProjectFolderPath(
|
|
75
|
+
path: string,
|
|
76
|
+
options: {
|
|
77
|
+
engineVersion: string;
|
|
78
|
+
surface?: SuggestedAdapterSurface | undefined;
|
|
79
|
+
entry?: string | undefined;
|
|
80
|
+
},
|
|
81
|
+
): Promise<{
|
|
82
|
+
path: string;
|
|
83
|
+
report: ProjectInspection;
|
|
84
|
+
writes: [];
|
|
85
|
+
manifest: Record<string, unknown>;
|
|
86
|
+
}> {
|
|
87
|
+
const root = resolve(path);
|
|
88
|
+
const rootStat = await stat(root);
|
|
89
|
+
if (!rootStat.isDirectory()) throw new Error(`Project path is not a directory: ${root}`);
|
|
90
|
+
const report = await inspectProject(nodeProjectInspectionReader(root));
|
|
91
|
+
if (report.hasManifest) throw new Error('This folder already has a vgai.project.json manifest.');
|
|
92
|
+
let name = basename(root);
|
|
93
|
+
try {
|
|
94
|
+
const packageJson = JSON.parse(
|
|
95
|
+
await readFile(resolveProjectPath(root, 'package.json'), 'utf-8'),
|
|
96
|
+
) as {
|
|
97
|
+
name?: unknown;
|
|
98
|
+
};
|
|
99
|
+
if (typeof packageJson.name === 'string' && packageJson.name.length > 0)
|
|
100
|
+
name = packageJson.name;
|
|
101
|
+
} catch {}
|
|
102
|
+
const selectedEntry = options.entry ?? report.entryCandidates[0];
|
|
103
|
+
if (selectedEntry !== undefined) {
|
|
104
|
+
const entryPath = resolveProjectPath(root, selectedEntry);
|
|
105
|
+
let entryStat: Awaited<ReturnType<typeof stat>>;
|
|
106
|
+
try {
|
|
107
|
+
entryStat = await stat(entryPath);
|
|
108
|
+
} catch {
|
|
109
|
+
throw new Error(`Adapter entry does not exist: ${selectedEntry}`);
|
|
110
|
+
}
|
|
111
|
+
if (!entryStat.isFile()) throw new Error(`Adapter entry is not a file: ${selectedEntry}`);
|
|
112
|
+
}
|
|
113
|
+
const manifest = createIngestManifest(report, {
|
|
114
|
+
name,
|
|
115
|
+
...options,
|
|
116
|
+
...(selectedEntry !== undefined ? { entry: selectedEntry } : {}),
|
|
117
|
+
});
|
|
118
|
+
return { path: root, report, writes: [], manifest };
|
|
119
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The play log's NAMING scheme, defined once. The dev server mints the files
|
|
3
|
+
* in `routes/logs.ts`, and every downstream reader (`vgai status`'s
|
|
4
|
+
* play-error banner, `@vgai/sdk/build-discipline`'s evidence walk, the
|
|
5
|
+
* pruner, the session catalog) sorts them lexicographically and expects
|
|
6
|
+
* chronological order. Moved here from `server/recent-projects-store.ts`
|
|
7
|
+
* (which re-exports for its existing importers) so the browser build can
|
|
8
|
+
* import the functions without that module's `node:os` scope.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { MAX_RUN_NAME } from './run-name';
|
|
12
|
+
|
|
13
|
+
export function slugify(name: string): string {
|
|
14
|
+
return name
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
17
|
+
.replace(/^-|-$/g, '');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** `slugify` under a length bound, or `null` when nothing survives (blank
|
|
21
|
+
* name, punctuation only) — an unnamed run and an unnameable one are the
|
|
22
|
+
* same case, and both must fall back to the unnamed filename exactly.
|
|
23
|
+
*
|
|
24
|
+
* The bound comes from `@vgai/sdk`'s run-name module rather than a literal
|
|
25
|
+
* here: a playtest run derives its own name against the same ceiling, and two
|
|
26
|
+
* copies of "40" is how the derived name and the filename it lands in start
|
|
27
|
+
* disagreeing. */
|
|
28
|
+
export function playRunSlug(name: string | null | undefined): string | null {
|
|
29
|
+
if (typeof name !== 'string') return null;
|
|
30
|
+
const slug = slugify(name).slice(0, MAX_RUN_NAME).replace(/-$/, '');
|
|
31
|
+
return slug === '' ? null : slug;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A play session's JSONL filename.
|
|
36
|
+
*
|
|
37
|
+
* `play-<stamp>-<sequence>.jsonl` unchanged when the run is unnamed — that
|
|
38
|
+
* shape is depended on by the newest-log readers (`vgai status`'s play-error
|
|
39
|
+
* banner, `@vgai/sdk/build-discipline`'s evidence walk) and by the pruner, all
|
|
40
|
+
* of which sort lexicographically and expect chronological order.
|
|
41
|
+
*
|
|
42
|
+
* An OPTIONAL name is appended AFTER the sequence for exactly that reason: the
|
|
43
|
+
* ordering prefix is untouched, so naming a run changes only what a human
|
|
44
|
+
* greps for. There is deliberately no registry and no uniqueness check —
|
|
45
|
+
* two runs with the same name are two files with different stamps, and the
|
|
46
|
+
* filesystem is the query engine.
|
|
47
|
+
*/
|
|
48
|
+
export function playLogFilename(startedAt: Date, sequence: number, name?: string | null): string {
|
|
49
|
+
// Milliseconds plus a process-local sequence make restart artifacts
|
|
50
|
+
// distinct even when two sessions begin inside the same millisecond.
|
|
51
|
+
const ts = startedAt.toISOString().replace(/[:.]/g, '-');
|
|
52
|
+
const slug = playRunSlug(name);
|
|
53
|
+
return `play-${ts}-${String(sequence).padStart(4, '0')}${slug ? `-${slug}` : ''}.jsonl`;
|
|
54
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { GenerationBillingSchema } from '@volter/editor-sdk/generations';
|
|
3
|
+
|
|
4
|
+
export const PROJECT_PROVENANCE_PATH = '.vgai/provenance.json';
|
|
5
|
+
|
|
6
|
+
export const ProjectProvenanceOutputSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
path: z.string(),
|
|
9
|
+
bytes: z.number().int().nonnegative(),
|
|
10
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
11
|
+
mediaType: z.string().optional(),
|
|
12
|
+
role: z.enum(['asset', 'prefab', 'provenance', 'other']).optional(),
|
|
13
|
+
})
|
|
14
|
+
.strict();
|
|
15
|
+
|
|
16
|
+
export const ProjectProvenanceExecutionSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
mode: z.enum(['mock', 'direct', 'managed']),
|
|
19
|
+
provider: z.string(),
|
|
20
|
+
operation: z.string().optional(),
|
|
21
|
+
model: z.string().optional(),
|
|
22
|
+
requestId: z.string().optional(),
|
|
23
|
+
taskId: z.string().optional(),
|
|
24
|
+
managedJobId: z.string().optional(),
|
|
25
|
+
billing: GenerationBillingSchema.optional(),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* THE KIND FOR A FILE AN EDITOR SESSION WROTE INTO THE PROJECT.
|
|
31
|
+
*
|
|
32
|
+
* A generated binary under `public/` normally arrives from an operation that
|
|
33
|
+
* ran here: a bake, a provider acceptance, a library acquisition. A file a
|
|
34
|
+
* SESSION produced has no such operation — the bytes were made by a script an
|
|
35
|
+
* agent ran inside the tab (`export_scene.gltf` in the Blender session's own
|
|
36
|
+
* worker filesystem) and reached disk through the write-back door that mirrors
|
|
37
|
+
* the session's files out. Measured 2026-09-18: those landed with no record at
|
|
38
|
+
* all, which is the one state `scripts/validate-project-provenance.mjs` calls
|
|
39
|
+
* fatal.
|
|
40
|
+
*
|
|
41
|
+
* The producing PROGRAM is the session, so what the record can honestly name is
|
|
42
|
+
* the session — see {@link ProjectProvenanceSessionSchema}. That block is
|
|
43
|
+
* REQUIRED on a record of this kind, and the validator enforces it, for the
|
|
44
|
+
* same reason `project.provenance.unknown` must carry a written reason: a kind
|
|
45
|
+
* that can be claimed without evidence becomes the cheapest way past the gate.
|
|
46
|
+
*
|
|
47
|
+
* `scripts/validate-project-provenance.mjs` spells this literal itself (it is a
|
|
48
|
+
* plain `.mjs` gate and imports no TypeScript); changing it here means changing
|
|
49
|
+
* it there.
|
|
50
|
+
*/
|
|
51
|
+
export const PROJECT_SESSION_WRITE_OPERATION = 'project.session.write';
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* WHICH SESSION wrote the bytes, and what it had modelled at the time.
|
|
55
|
+
*
|
|
56
|
+
* Not a provider execution: no vendor ran, nothing was billed, and there is no
|
|
57
|
+
* request to re-issue. What re-derives the file is the session's own state, so
|
|
58
|
+
* the identity (which session, reached on which port) and the `revision` that
|
|
59
|
+
* state was at are the facts worth keeping.
|
|
60
|
+
*/
|
|
61
|
+
export const ProjectProvenanceSessionSchema = z
|
|
62
|
+
.object({
|
|
63
|
+
id: z
|
|
64
|
+
.string()
|
|
65
|
+
.min(1)
|
|
66
|
+
.describe(
|
|
67
|
+
"The session's own id, as the session names itself to the tab in every " +
|
|
68
|
+
'frame it presents. Distinguishes two sessions of the same project, ' +
|
|
69
|
+
'including one restarted between two writes to the same path.',
|
|
70
|
+
),
|
|
71
|
+
port: z
|
|
72
|
+
.number()
|
|
73
|
+
.int()
|
|
74
|
+
.positive()
|
|
75
|
+
.describe(
|
|
76
|
+
'The machine-local editor port the writer reached that session on — the ' +
|
|
77
|
+
"project's own reserved port, which is how a person or an agent gets " +
|
|
78
|
+
'back to the tab this file came out of.',
|
|
79
|
+
),
|
|
80
|
+
revision: z
|
|
81
|
+
.number()
|
|
82
|
+
.int()
|
|
83
|
+
.nonnegative()
|
|
84
|
+
.describe(
|
|
85
|
+
"The session's frame revision at the moment the file was listed for " +
|
|
86
|
+
'write-back: the model state that produced these bytes. It advances ' +
|
|
87
|
+
'once per present, and a script presents when it finishes, so this is ' +
|
|
88
|
+
'the revision the writing script left behind.',
|
|
89
|
+
),
|
|
90
|
+
callId: z
|
|
91
|
+
.string()
|
|
92
|
+
.min(1)
|
|
93
|
+
.optional()
|
|
94
|
+
.describe(
|
|
95
|
+
"The transport's own id for the call that ran the script, when the " +
|
|
96
|
+
'transport has one (the MCP request id). Absent when the write did not ' +
|
|
97
|
+
'arrive through a call the transport numbered.',
|
|
98
|
+
),
|
|
99
|
+
})
|
|
100
|
+
.strict();
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* THE KIND FOR BYTES ALREADY ON DISK, RE-RECORDED AGAINST A LIVE DOOR.
|
|
104
|
+
*
|
|
105
|
+
* The ledger is an append-only log of operations that really happened, so a
|
|
106
|
+
* record whose `operation.source` names a tool that has since been deleted or
|
|
107
|
+
* renamed cannot be rewritten — it is what happened. What it can no longer do
|
|
108
|
+
* is tell a reader which door rebuilds the file. An ATTEST record is the
|
|
109
|
+
* append that answers that: nothing ran, nothing was re-baked, the bytes were
|
|
110
|
+
* hashed where they lie, and `input.attests` names the operation that would
|
|
111
|
+
* produce them today.
|
|
112
|
+
*
|
|
113
|
+
* It is the weakest claim in the vocabulary, so it pays the same price as
|
|
114
|
+
* `project.provenance.unknown`: `input.reason` is REQUIRED and
|
|
115
|
+
* `scripts/validate-project-provenance.mjs` enforces it, because a kind that
|
|
116
|
+
* can be claimed with no evidence is the cheapest way past a gate. An attest
|
|
117
|
+
* is never a substitute for running the door when the door CAN be run — it
|
|
118
|
+
* exists for the case where re-running would change the bytes a project
|
|
119
|
+
* already ships.
|
|
120
|
+
*
|
|
121
|
+
* Written by `attestExistingProjectOutputs`
|
|
122
|
+
* (`packages/editor/server/project-output-writer.ts`), driven by
|
|
123
|
+
* `scripts/attest-project-output.ts`. The validator spells this literal
|
|
124
|
+
* itself (it is a plain `.mjs` gate and imports no TypeScript); changing it
|
|
125
|
+
* here means changing it there.
|
|
126
|
+
*/
|
|
127
|
+
export const PROJECT_ATTEST_OPERATION = 'project.provenance.attest';
|
|
128
|
+
|
|
129
|
+
export const ProjectProvenanceOperationSchema = z
|
|
130
|
+
.object({
|
|
131
|
+
createdAt: z.string().datetime(),
|
|
132
|
+
operation: z
|
|
133
|
+
.object({
|
|
134
|
+
name: z.string(),
|
|
135
|
+
source: z.string().optional(),
|
|
136
|
+
})
|
|
137
|
+
.strict(),
|
|
138
|
+
execution: ProjectProvenanceExecutionSchema.optional(),
|
|
139
|
+
executions: z.array(ProjectProvenanceExecutionSchema).min(2).optional(),
|
|
140
|
+
session: ProjectProvenanceSessionSchema.optional().describe(
|
|
141
|
+
'The editor session that wrote these bytes. Required on a ' +
|
|
142
|
+
'`project.session.write` record, and meaningless on any other kind.',
|
|
143
|
+
),
|
|
144
|
+
input: z.json().optional(),
|
|
145
|
+
inputs: z
|
|
146
|
+
.array(z.string().min(1))
|
|
147
|
+
.min(1)
|
|
148
|
+
.optional()
|
|
149
|
+
.describe(
|
|
150
|
+
'Project-relative paths of the project FILES these bytes were produced ' +
|
|
151
|
+
'from — a session-written GLB names the `src/models/<name>.blend` it ' +
|
|
152
|
+
'was exported from. This is what lets a reader go DOWN by kind: a ' +
|
|
153
|
+
'prefab uses a glTF, and opening that glTF\'s model needs the export ' +
|
|
154
|
+
'to name its input (ARCHITECTURE-CORE §Roots, "Drilling goes DOWN by ' +
|
|
155
|
+
'kind"). Distinct from `input`, which is the operation\'s ARGUMENTS; ' +
|
|
156
|
+
'these are files on disk, and `scripts/validate-project-provenance.mjs` ' +
|
|
157
|
+
'reports one that no longer exists as DANGLING rather than fatal — a ' +
|
|
158
|
+
'renamed source is history, not a broken ledger.',
|
|
159
|
+
),
|
|
160
|
+
outputs: z.array(ProjectProvenanceOutputSchema).min(1),
|
|
161
|
+
})
|
|
162
|
+
.strict();
|
|
163
|
+
|
|
164
|
+
export const ProjectProvenanceDocumentSchema = z
|
|
165
|
+
.object({
|
|
166
|
+
version: z.literal(1),
|
|
167
|
+
operations: z.record(z.string(), ProjectProvenanceOperationSchema),
|
|
168
|
+
})
|
|
169
|
+
.strict();
|
|
170
|
+
|
|
171
|
+
export type ProjectProvenanceDocument = z.infer<typeof ProjectProvenanceDocumentSchema>;
|
|
172
|
+
export type ProjectProvenanceOperation = z.infer<typeof ProjectProvenanceOperationSchema>;
|
|
173
|
+
export type ProjectProvenanceExecution = z.infer<typeof ProjectProvenanceExecutionSchema>;
|
|
174
|
+
export type ProjectProvenanceSession = z.infer<typeof ProjectProvenanceSessionSchema>;
|
|
175
|
+
|
|
176
|
+
export const ProjectAttributionEntrySchema = z
|
|
177
|
+
.object({
|
|
178
|
+
key: z.string(),
|
|
179
|
+
name: z.string().optional(),
|
|
180
|
+
source: z.string().optional(),
|
|
181
|
+
sourceUrl: z.string().url().optional(),
|
|
182
|
+
author: z.string(),
|
|
183
|
+
license: z.string(),
|
|
184
|
+
text: z.string(),
|
|
185
|
+
operationIds: z.array(z.string()),
|
|
186
|
+
outputPaths: z.array(z.string()),
|
|
187
|
+
})
|
|
188
|
+
.strict();
|
|
189
|
+
|
|
190
|
+
export const ProjectAttributionReportSchema = z
|
|
191
|
+
.object({
|
|
192
|
+
version: z.literal(1),
|
|
193
|
+
entries: z.array(ProjectAttributionEntrySchema),
|
|
194
|
+
})
|
|
195
|
+
.strict();
|
|
196
|
+
|
|
197
|
+
export type ProjectAttributionEntry = z.infer<typeof ProjectAttributionEntrySchema>;
|
|
198
|
+
export type ProjectAttributionReport = z.infer<typeof ProjectAttributionReportSchema>;
|
|
199
|
+
|
|
200
|
+
export function emptyProjectProvenanceDocument(): ProjectProvenanceDocument {
|
|
201
|
+
return { version: 1, operations: {} };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function objectRecord(value: unknown): Record<string, unknown> | null {
|
|
205
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
206
|
+
? (value as Record<string, unknown>)
|
|
207
|
+
: null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function stringField(record: Record<string, unknown>, key: string): string | undefined {
|
|
211
|
+
const value = record[key];
|
|
212
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function attributionEntry(
|
|
216
|
+
operationId: string,
|
|
217
|
+
operation: ProjectProvenanceOperation,
|
|
218
|
+
): ProjectAttributionEntry | null {
|
|
219
|
+
const input = objectRecord(operation.input);
|
|
220
|
+
if (!input) return null;
|
|
221
|
+
const nested = objectRecord(input['attribution']) ?? {};
|
|
222
|
+
const author = stringField(nested, 'author') ?? stringField(input, 'author');
|
|
223
|
+
const license = stringField(nested, 'license') ?? stringField(input, 'license');
|
|
224
|
+
if (!author || !license) return null;
|
|
225
|
+
const name = stringField(nested, 'name') ?? stringField(input, 'name');
|
|
226
|
+
const source = stringField(nested, 'source') ?? stringField(input, 'source');
|
|
227
|
+
const sourceUrl = stringField(nested, 'sourceUrl') ?? stringField(input, 'sourceUrl');
|
|
228
|
+
const text = stringField(nested, 'text') ?? `${name ? `${name} by ` : ''}${author} (${license})`;
|
|
229
|
+
const key = JSON.stringify([sourceUrl ?? '', author, license, text]);
|
|
230
|
+
return ProjectAttributionEntrySchema.parse({
|
|
231
|
+
key,
|
|
232
|
+
...(name ? { name } : {}),
|
|
233
|
+
...(source ? { source } : {}),
|
|
234
|
+
...(sourceUrl ? { sourceUrl } : {}),
|
|
235
|
+
author,
|
|
236
|
+
license,
|
|
237
|
+
text,
|
|
238
|
+
operationIds: [operationId],
|
|
239
|
+
outputPaths: operation.outputs
|
|
240
|
+
.filter((output) => output.role !== 'provenance')
|
|
241
|
+
.map((output) => output.path),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Project credits are a projection of central provenance, never another
|
|
247
|
+
* persisted ledger or a set of per-asset files.
|
|
248
|
+
*/
|
|
249
|
+
export function deriveProjectAttributionReport(
|
|
250
|
+
document: ProjectProvenanceDocument,
|
|
251
|
+
): ProjectAttributionReport {
|
|
252
|
+
const grouped = new Map<string, ProjectAttributionEntry>();
|
|
253
|
+
for (const [operationId, operation] of Object.entries(document.operations)) {
|
|
254
|
+
const entry = attributionEntry(operationId, operation);
|
|
255
|
+
if (!entry) continue;
|
|
256
|
+
const prior = grouped.get(entry.key);
|
|
257
|
+
if (!prior) {
|
|
258
|
+
grouped.set(entry.key, entry);
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
prior.operationIds.push(...entry.operationIds);
|
|
262
|
+
prior.outputPaths.push(...entry.outputPaths);
|
|
263
|
+
}
|
|
264
|
+
const entries = [...grouped.values()]
|
|
265
|
+
.map((entry) => ({
|
|
266
|
+
...entry,
|
|
267
|
+
operationIds: [...new Set(entry.operationIds)].sort(),
|
|
268
|
+
outputPaths: [...new Set(entry.outputPaths)].sort(),
|
|
269
|
+
}))
|
|
270
|
+
.sort(
|
|
271
|
+
(left, right) => left.text.localeCompare(right.text) || left.key.localeCompare(right.key),
|
|
272
|
+
);
|
|
273
|
+
return ProjectAttributionReportSchema.parse({ version: 1, entries });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Deterministic human-readable projection of the machine report. */
|
|
277
|
+
export function formatProjectAttributionMarkdown(report: ProjectAttributionReport): string {
|
|
278
|
+
const sections = report.entries.map((entry) => {
|
|
279
|
+
const heading = entry.name ?? entry.text;
|
|
280
|
+
return [
|
|
281
|
+
`## ${heading}`,
|
|
282
|
+
'',
|
|
283
|
+
entry.text,
|
|
284
|
+
'',
|
|
285
|
+
`Author: ${entry.author} `,
|
|
286
|
+
`License: ${entry.license}${entry.sourceUrl ? ` \nSource: ${entry.sourceUrl}` : ''}`,
|
|
287
|
+
].join('\n');
|
|
288
|
+
});
|
|
289
|
+
return `# Asset attribution\n${sections.length > 0 ? `\n${sections.join('\n\n')}` : '\nNo attributed project assets are currently present.'}\n`;
|
|
290
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a run is CALLED — one owner of the bound.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. `vgai play --name <text>` exists so a run is findable by
|
|
5
|
+
* what it was testing.
|
|
6
|
+
*
|
|
7
|
+
* WHAT STAYS UNNAMED, deliberately: interactive `vgai play` with no `--name`.
|
|
8
|
+
* A person pressing play is not testing a named thing, and inventing a label
|
|
9
|
+
* for it would put noise in exactly the directory this makes greppable.
|
|
10
|
+
*
|
|
11
|
+
* Pure — no filesystem, no clock. `editor-server.ts`'s `playRunSlug` is the
|
|
12
|
+
* OTHER half (slugging a name into a filename segment) and reads the bound
|
|
13
|
+
* from here, so the two can never disagree about how long a run name may be.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** Bound on a run's name — long enough to stay recognisable in a directory
|
|
17
|
+
* listing, short enough that the timestamp beside it is still readable. */
|
|
18
|
+
export const MAX_RUN_NAME = 40;
|