@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,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared plumbing for B2's `project.*` operations.
|
|
3
|
+
*
|
|
4
|
+
* Every `project.*` op is file-native (host: 'node', requires: { project: true })
|
|
5
|
+
* and runs with NO editor process — it resolves `ctx.projectRoot`, reads/writes
|
|
6
|
+
* plain files on disk, and reuses the engine's existing Zod schemas.
|
|
7
|
+
*
|
|
8
|
+
* Two cross-cutting decisions live here so every
|
|
9
|
+
* operation module applies them identically:
|
|
10
|
+
*
|
|
11
|
+
* - DRY-RUN: every mutation's input carries an optional `dryRun` field
|
|
12
|
+
* (`DryRunInputShape`). When true, the impl computes the same
|
|
13
|
+
* before/after/filesChanged summary as a real write but returns before
|
|
14
|
+
* ever calling `writeFileAtomic` — `MutationEnvelope.written` is `false`
|
|
15
|
+
* and the file(s) on disk are provably unchanged (round-tripped by tests).
|
|
16
|
+
* - EXTERNAL-CHANGE DETECTION: every mutation's input carries an optional
|
|
17
|
+
* `baseHash` field (`BaseHashInputShape`) — the `contentHash` a prior
|
|
18
|
+
* `read`-shaped op returned. `checkNotStale` compares it against the hash
|
|
19
|
+
* of the file's CURRENT on-disk content (read fresh, inside the mutating
|
|
20
|
+
* op, right before the write decision) and throws the declared `CONFLICT`
|
|
21
|
+
* error on mismatch — the file changed between the caller's read and this
|
|
22
|
+
* write. Omitting `baseHash` skips the check (an agent that never read the
|
|
23
|
+
* file first has nothing to compare against; this mirrors optimistic-
|
|
24
|
+
* concurrency/ETag conventions, not a hidden requirement).
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { createHash } from 'node:crypto';
|
|
28
|
+
import {
|
|
29
|
+
existsSync,
|
|
30
|
+
lstatSync,
|
|
31
|
+
mkdirSync,
|
|
32
|
+
readdirSync,
|
|
33
|
+
readFileSync,
|
|
34
|
+
realpathSync,
|
|
35
|
+
renameSync,
|
|
36
|
+
writeFileSync,
|
|
37
|
+
} from 'node:fs';
|
|
38
|
+
import { dirname, isAbsolute, join, relative, resolve, win32 } from 'node:path';
|
|
39
|
+
import { z } from 'zod';
|
|
40
|
+
import { ToolError } from '@volter/editor-sdk/tools/errors';
|
|
41
|
+
import type { ToolErrorDefinition } from '@volter/editor-sdk/tools/registry';
|
|
42
|
+
import type { ToolContext } from '@volter/editor-sdk/tools/types';
|
|
43
|
+
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Project-root resolution
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
export const NO_PROJECT_ROOT_ERROR: ToolErrorDefinition = {
|
|
49
|
+
code: 'NO_PROJECT_ROOT',
|
|
50
|
+
summary: 'dispatch() was called without ctx.projectRoot.',
|
|
51
|
+
data: z.object({}).describe('No additional data.'),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Every `project.*` op needs `ctx.projectRoot` — this is the one place that enforces it. */
|
|
55
|
+
export function requireProjectRoot(ctx: ToolContext): string {
|
|
56
|
+
if (!ctx.projectRoot) {
|
|
57
|
+
throw new ToolError('NO_PROJECT_ROOT', 'dispatch() was called without ctx.projectRoot.', {});
|
|
58
|
+
}
|
|
59
|
+
return ctx.projectRoot;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const PATH_OUTSIDE_PROJECT_ERROR: ToolErrorDefinition = {
|
|
63
|
+
code: 'PATH_OUTSIDE_PROJECT',
|
|
64
|
+
summary: 'A given relative path escapes ctx.projectRoot lexically or through a symbolic link.',
|
|
65
|
+
data: z.object({ projectRoot: z.string(), path: z.string() }),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Resolve a project-relative path against `projectRoot`, rejecting absolute
|
|
70
|
+
* paths and any `..` escape — every `project.*` op that takes a path input
|
|
71
|
+
* (scene/manifest/input-map/asset) goes through this so an op can never be
|
|
72
|
+
* pointed outside the project directory.
|
|
73
|
+
*/
|
|
74
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: lexical and physical path confinement must be one atomic decision.
|
|
75
|
+
export function resolveProjectPath(projectRoot: string, relativePath: string): string {
|
|
76
|
+
// Inputs are protocol data and may have been produced on a different OS.
|
|
77
|
+
// Treat both separator styles as path separators and reject Windows drive /
|
|
78
|
+
// UNC absolutes even when the SDK process itself is running on POSIX.
|
|
79
|
+
const portablePath = relativePath.replace(/\\/g, '/');
|
|
80
|
+
if (isAbsolute(portablePath) || win32.isAbsolute(relativePath)) {
|
|
81
|
+
throw new ToolError(
|
|
82
|
+
'PATH_OUTSIDE_PROJECT',
|
|
83
|
+
`"${relativePath}" must be project-relative, not absolute.`,
|
|
84
|
+
{
|
|
85
|
+
projectRoot,
|
|
86
|
+
path: relativePath,
|
|
87
|
+
},
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
const root = resolve(projectRoot);
|
|
91
|
+
const resolved = resolve(root, portablePath);
|
|
92
|
+
const rel = relative(root, resolved);
|
|
93
|
+
if (
|
|
94
|
+
rel === '..' ||
|
|
95
|
+
rel.startsWith(`..${'/'}`) ||
|
|
96
|
+
rel.startsWith(`..${'\\'}`) ||
|
|
97
|
+
isAbsolute(rel)
|
|
98
|
+
) {
|
|
99
|
+
throw new ToolError('PATH_OUTSIDE_PROJECT', `"${relativePath}" escapes the project root.`, {
|
|
100
|
+
projectRoot,
|
|
101
|
+
path: relativePath,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// A lexical containment check is not sufficient: `public/escape/file`
|
|
106
|
+
// can still leave the project when `escape` is a symlink. Resolve every
|
|
107
|
+
// existing prefix (including a dangling final symlink) and require its
|
|
108
|
+
// physical target to remain under the physical project root. Nonexistent
|
|
109
|
+
// suffixes are safe to create only after their nearest existing ancestor
|
|
110
|
+
// has passed this check.
|
|
111
|
+
let physicalRoot: string;
|
|
112
|
+
try {
|
|
113
|
+
physicalRoot = realpathSync(root);
|
|
114
|
+
} catch {
|
|
115
|
+
// A confinement root such as `<project>/public` may not exist yet for an
|
|
116
|
+
// import. Canonicalize its nearest existing ancestor, then retain the
|
|
117
|
+
// nonexistent suffix as the physical boundary that may be created.
|
|
118
|
+
let ancestor = dirname(root);
|
|
119
|
+
while (!existsSync(ancestor)) {
|
|
120
|
+
const parent = dirname(ancestor);
|
|
121
|
+
if (parent === ancestor) throw new Error(`No existing ancestor for ${root}`);
|
|
122
|
+
ancestor = parent;
|
|
123
|
+
}
|
|
124
|
+
physicalRoot = resolve(realpathSync(ancestor), relative(ancestor, root));
|
|
125
|
+
}
|
|
126
|
+
let current = root;
|
|
127
|
+
const segments = rel === '' ? [] : rel.split(/[\\/]+/);
|
|
128
|
+
for (const segment of segments) {
|
|
129
|
+
current = join(current, segment);
|
|
130
|
+
try {
|
|
131
|
+
lstatSync(current);
|
|
132
|
+
} catch {
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
let physicalCurrent: string;
|
|
136
|
+
try {
|
|
137
|
+
physicalCurrent = realpathSync(current);
|
|
138
|
+
} catch {
|
|
139
|
+
// `lstatSync` succeeded but `realpathSync` failed: the path is most
|
|
140
|
+
// commonly a dangling symlink. It must not become a write-through
|
|
141
|
+
// escape when its target later appears.
|
|
142
|
+
throw new ToolError(
|
|
143
|
+
'PATH_OUTSIDE_PROJECT',
|
|
144
|
+
`"${relativePath}" contains an unresolved symbolic link.`,
|
|
145
|
+
{ projectRoot, path: relativePath },
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
const physicalRel = relative(physicalRoot, physicalCurrent);
|
|
149
|
+
if (
|
|
150
|
+
physicalRel === '..' ||
|
|
151
|
+
physicalRel.startsWith(`..${'/'}`) ||
|
|
152
|
+
physicalRel.startsWith(`..${'\\'}`) ||
|
|
153
|
+
isAbsolute(physicalRel)
|
|
154
|
+
) {
|
|
155
|
+
throw new ToolError(
|
|
156
|
+
'PATH_OUTSIDE_PROJECT',
|
|
157
|
+
`"${relativePath}" escapes the project root through a symbolic link.`,
|
|
158
|
+
{ projectRoot, path: relativePath },
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return resolved;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Content hashing / atomic write / conflict detection
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
export function sha256Hex(content: string): string {
|
|
170
|
+
return createHash('sha256').update(content, 'utf-8').digest('hex');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface FileRead {
|
|
174
|
+
raw: string;
|
|
175
|
+
hash: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export const FILE_NOT_FOUND_ERROR: ToolErrorDefinition = {
|
|
179
|
+
code: 'FILE_NOT_FOUND',
|
|
180
|
+
summary: 'The referenced project file does not exist on disk.',
|
|
181
|
+
data: z.object({ path: z.string() }),
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
/** Read a file's raw text + its content hash. Throws the declared `FILE_NOT_FOUND` shape when absent. */
|
|
185
|
+
export function readFileWithHash(absPath: string): FileRead {
|
|
186
|
+
if (!existsSync(absPath)) {
|
|
187
|
+
throw new ToolError('FILE_NOT_FOUND', `File not found: ${absPath}`, { path: absPath });
|
|
188
|
+
}
|
|
189
|
+
const raw = readFileSync(absPath, 'utf-8');
|
|
190
|
+
return { raw, hash: sha256Hex(raw) };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** Write `content` to `absPath`, creating parent directories, via a temp-file + rename so a reader never observes a partial write. */
|
|
194
|
+
export function writeFileAtomic(absPath: string, content: string): void {
|
|
195
|
+
const dir = dirname(absPath);
|
|
196
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
197
|
+
const tmp = join(dir, `.${Date.now()}-${process.pid}-${Math.random().toString(36).slice(2)}.tmp`);
|
|
198
|
+
writeFileSync(tmp, content, 'utf-8');
|
|
199
|
+
renameSync(tmp, absPath);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export const CONFLICT_ERROR: ToolErrorDefinition = {
|
|
203
|
+
code: 'CONFLICT',
|
|
204
|
+
summary:
|
|
205
|
+
'The target file changed on disk since it was last read (baseHash mismatch) — the write ' +
|
|
206
|
+
'was refused rather than silently clobbering the external change.',
|
|
207
|
+
data: z.object({ path: z.string(), expectedHash: z.string(), actualHash: z.string() }),
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* External-change detection (see module jsdoc). `actualHash` is the hash of
|
|
212
|
+
* what THIS op just read from disk; `baseHash` is the caller-supplied hash
|
|
213
|
+
* from a prior read. A mismatch means something wrote to the file in
|
|
214
|
+
* between — refuse rather than clobber.
|
|
215
|
+
*/
|
|
216
|
+
export function checkNotStale(
|
|
217
|
+
path: string,
|
|
218
|
+
actualHash: string,
|
|
219
|
+
baseHash: string | undefined,
|
|
220
|
+
): void {
|
|
221
|
+
if (baseHash !== undefined && actualHash !== baseHash) {
|
|
222
|
+
throw new ToolError(
|
|
223
|
+
'CONFLICT',
|
|
224
|
+
`"${path}" changed on disk since it was last read (baseHash mismatch) — refusing to overwrite an external change.`,
|
|
225
|
+
{ path, expectedHash: baseHash, actualHash },
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Shared Zod input fragments
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
|
|
234
|
+
export const DryRunField = z
|
|
235
|
+
.boolean()
|
|
236
|
+
.optional()
|
|
237
|
+
.describe(
|
|
238
|
+
'When true, compute the before/after summary and the files that WOULD change, but write ' +
|
|
239
|
+
'nothing to disk. Defaults to false (a real write).',
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
export const BaseHashField = z
|
|
243
|
+
.string()
|
|
244
|
+
.optional()
|
|
245
|
+
.describe(
|
|
246
|
+
'The `contentHash` a prior read-shaped op returned for this file. When given, the write is ' +
|
|
247
|
+
"refused with a CONFLICT error if the file's current on-disk content hash no longer " +
|
|
248
|
+
'matches (external-change detection). Omit to skip the check.',
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
/** The envelope every mutation op's result carries, parameterized by the op's own `after` shape. */
|
|
252
|
+
export function mutationResultSchema<T extends z.ZodType>(afterSchema: T) {
|
|
253
|
+
return z.object({
|
|
254
|
+
dryRun: z.boolean().describe('True when this call computed the change without writing it.'),
|
|
255
|
+
written: z.boolean().describe('True iff bytes were actually written to disk this call.'),
|
|
256
|
+
filesChanged: z
|
|
257
|
+
.array(z.string())
|
|
258
|
+
.describe('Absolute path(s) written (dryRun:false) or that WOULD be written (dryRun:true).'),
|
|
259
|
+
before: z.unknown().describe('Summary of the relevant state before this change.'),
|
|
260
|
+
after: afterSchema.describe(
|
|
261
|
+
'Summary of the relevant state after this change (or that WOULD result).',
|
|
262
|
+
),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Project-wide file discovery (shared by project.discover / story /
|
|
268
|
+
// xstate discovery ops — all "find files matching X under the project" ops).
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
|
|
271
|
+
/** Directories never worth descending into for project-content discovery. */
|
|
272
|
+
const SKIP_DIR_NAMES = new Set([
|
|
273
|
+
'node_modules',
|
|
274
|
+
'.git',
|
|
275
|
+
'dist',
|
|
276
|
+
'dist-server',
|
|
277
|
+
'.vgai',
|
|
278
|
+
'.ci-scaffold',
|
|
279
|
+
]);
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Recursively list every file under `projectRoot` for which `matches(relPath)`
|
|
283
|
+
* is true, returning POSIX-style project-relative paths, sorted. Used for
|
|
284
|
+
* best-effort discovery ops (stories/XState machines) —
|
|
285
|
+
* a plain filename-pattern walk, not a build-tool glob dependency.
|
|
286
|
+
*/
|
|
287
|
+
/** `readdirSync`, swallowing a race/permission error into `[]` (a directory that vanished mid-walk is not this function's problem). */
|
|
288
|
+
function safeReaddir(dir: string): string[] {
|
|
289
|
+
try {
|
|
290
|
+
return readdirSync(dir);
|
|
291
|
+
} catch {
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Classify without following symlinks; discovery must never walk out of the project. */
|
|
297
|
+
function safeEntryKind(abs: string): 'directory' | 'file' | 'skip' {
|
|
298
|
+
try {
|
|
299
|
+
const stat = lstatSync(abs);
|
|
300
|
+
if (stat.isSymbolicLink()) return 'skip';
|
|
301
|
+
return stat.isDirectory() ? 'directory' : 'file';
|
|
302
|
+
} catch {
|
|
303
|
+
return 'skip';
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function listProjectFiles(
|
|
308
|
+
projectRoot: string,
|
|
309
|
+
matches: (relPath: string) => boolean,
|
|
310
|
+
): string[] {
|
|
311
|
+
const out: string[] = [];
|
|
312
|
+
function walk(dir: string): void {
|
|
313
|
+
for (const name of safeReaddir(dir)) {
|
|
314
|
+
const abs = join(dir, name);
|
|
315
|
+
const kind = safeEntryKind(abs);
|
|
316
|
+
if (kind === 'skip') continue;
|
|
317
|
+
if (kind === 'directory') {
|
|
318
|
+
if (!SKIP_DIR_NAMES.has(name)) walk(abs);
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const rel = relative(projectRoot, abs).split('\\').join('/');
|
|
322
|
+
if (matches(rel)) out.push(rel);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
walk(projectRoot);
|
|
326
|
+
return out.sort();
|
|
327
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TAB BOOTSTRAP, served to the page that runs the editor.
|
|
3
|
+
*
|
|
4
|
+
* The page is the Code-OSS workbench's — VS Code authored its HTML — so the
|
|
5
|
+
* bootstrap that makes it one of this session's TABS cannot be inline in it
|
|
6
|
+
* and cannot be a module of the editor's graph. It is a classic script the
|
|
7
|
+
* fork's contribution loads from this origin, before the React Refresh
|
|
8
|
+
* preamble and before the editor itself; the script takes its base from its
|
|
9
|
+
* own `src`, so every url it builds points at this session rather than at the
|
|
10
|
+
* page.
|
|
11
|
+
*
|
|
12
|
+
* WHAT IT IS FOR: without it a window runs the editor, answers commands and
|
|
13
|
+
* NEVER BEATS — `vgai status` says "TAB PRESENCE — SOMETHING IS OFF", and it
|
|
14
|
+
* is right (docs/CODE-OSS.md §The frame's page is a TAB; WORK.md U11).
|
|
15
|
+
*
|
|
16
|
+
* ONE AUTHOR, and it is `packages/editor/src/tab-bootstrap.js`. This route
|
|
17
|
+
* serves that file's bytes; there is no second copy and nothing to keep in
|
|
18
|
+
* step.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
24
|
+
|
|
25
|
+
/** Where the bootstrap is served from. */
|
|
26
|
+
export const TAB_BOOTSTRAP_PATH = '/__editor/tab-bootstrap.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The bootstrap's own file, resolved from THIS module rather than from an
|
|
30
|
+
* engine root: the two hosts disagree about what that root is (the dev host's
|
|
31
|
+
* is the checkout, the packaged host's is the installed `@vgai/editor`), while
|
|
32
|
+
* `server/` and `dist-server/` are both direct children of the package — so
|
|
33
|
+
* `../src/tab-bootstrap.js` is the same file under either.
|
|
34
|
+
*/
|
|
35
|
+
const BOOTSTRAP_SOURCE = path.resolve(
|
|
36
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
37
|
+
'../src/tab-bootstrap.js',
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
let cached: { mtimeMs: number; source: string } | null = null;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The bootstrap's source. Re-read when the file changes, so an edit is live in
|
|
44
|
+
* the next page without restarting the session; a missing file throws naming
|
|
45
|
+
* the path, because a silent empty answer here is a frame that never beats.
|
|
46
|
+
*/
|
|
47
|
+
export function readTabBootstrapSource(): string {
|
|
48
|
+
const file = BOOTSTRAP_SOURCE;
|
|
49
|
+
let mtimeMs: number;
|
|
50
|
+
try {
|
|
51
|
+
mtimeMs = statSync(file).mtimeMs;
|
|
52
|
+
} catch (error) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`${file} is missing, so this session can serve no tab bootstrap and any page it hosts will ` +
|
|
55
|
+
`never beat (${error instanceof Error ? error.message : String(error)}).`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (cached !== null && cached.mtimeMs === mtimeMs) return cached.source;
|
|
59
|
+
const source = readFileSync(file, 'utf8');
|
|
60
|
+
cached = { mtimeMs, source };
|
|
61
|
+
return source;
|
|
62
|
+
}
|