@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,653 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ProviderModeResolver,
|
|
3
|
+
withProviderExecution,
|
|
4
|
+
} from '@volter/editor-sdk/tools/provider-execution';
|
|
5
|
+
import type { EditorAccountService } from './account-service';
|
|
6
|
+
import { readGenerationJobs } from './generation-jobs';
|
|
7
|
+
/**
|
|
8
|
+
* Registered project-tool discovery and execution.
|
|
9
|
+
*
|
|
10
|
+
* Project modules stay ordinary TS/JS. This server-side boundary is the only
|
|
11
|
+
* loader: it reads explicit `package.json#vgai.tools` registrations, asks the
|
|
12
|
+
* owning Vite server to load each callable module in Node, validates the
|
|
13
|
+
* exported ToolDefinition, and dispatches through the existing internal SDK
|
|
14
|
+
* registry.
|
|
15
|
+
*
|
|
16
|
+
* CALLABLES are enumerated (`vgai.tools`); the project's own CONTRIBUTION
|
|
17
|
+
* MODULES are found by walking `src/contributions/` for the naming convention
|
|
18
|
+
* (`isToolContributionModule`); a DEPENDENCY's contribution modules are the
|
|
19
|
+
* ones it enumerates under its own `package.json#vgai.contributions`
|
|
20
|
+
* (`packageContributionModules`). They are still separate browser modules and
|
|
21
|
+
* are never imported here, merely listed.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { readdir, readFile, realpath, stat } from 'node:fs/promises';
|
|
25
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
26
|
+
import type { ProductIdentity } from '@volter/editor-sdk/session/product-locator';
|
|
27
|
+
import type { z } from 'zod';
|
|
28
|
+
import type { GenerationJob, GenerationToolContribution } from '@volter/editor-sdk/generations';
|
|
29
|
+
import type {
|
|
30
|
+
ProjectToolCatalog,
|
|
31
|
+
ProjectToolCatalogEntry,
|
|
32
|
+
ProjectToolContribution,
|
|
33
|
+
ProjectToolLoadError,
|
|
34
|
+
} from '@volter/editor-sdk/project-tool-catalog';
|
|
35
|
+
import { noProjectModuleHostError } from '@volter/editor-sdk/project-tool-catalog';
|
|
36
|
+
import type { ToolDefinition, ToolOutcome } from '@volter/editor-sdk/tools/registry';
|
|
37
|
+
import { ToolRegistry } from '@volter/editor-sdk/tools/registry';
|
|
38
|
+
import { applyGenerationContribution } from './generation-jobs';
|
|
39
|
+
import { runWithGenerativeExecutionCapture } from './generative-execution-context';
|
|
40
|
+
import {
|
|
41
|
+
createProjectOutputWriter,
|
|
42
|
+
reconcileAcceptedGenerationProvenance,
|
|
43
|
+
} from './project-output-writer';
|
|
44
|
+
import { isToolContributionModule } from './server-utils';
|
|
45
|
+
import { productComposedPackages, sessionProduct } from './session-product';
|
|
46
|
+
|
|
47
|
+
export type ProjectModuleLoader = (absoluteModuleId: string) => Promise<unknown>;
|
|
48
|
+
export type {
|
|
49
|
+
ProjectToolCatalog,
|
|
50
|
+
ProjectToolCatalogEntry,
|
|
51
|
+
ProjectToolContribution,
|
|
52
|
+
ToolContributionPoint,
|
|
53
|
+
} from '@volter/editor-sdk/project-tool-catalog';
|
|
54
|
+
|
|
55
|
+
interface LoadedCatalog extends ProjectToolCatalog {
|
|
56
|
+
definitions: Map<string, ToolDefinition>;
|
|
57
|
+
generationContributions: Map<string, GenerationToolContribution>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface ToolModule {
|
|
61
|
+
absolutePath: string;
|
|
62
|
+
sourcePath: string;
|
|
63
|
+
registrationError?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
type ToolRegistration = string | { entry: string };
|
|
67
|
+
|
|
68
|
+
interface PackageJsonShape {
|
|
69
|
+
name?: string;
|
|
70
|
+
dependencies?: Record<string, string>;
|
|
71
|
+
devDependencies?: Record<string, string>;
|
|
72
|
+
vgai?: { tools?: ToolRegistration[]; contributions?: unknown };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function readPackageJson(path: string): Promise<PackageJsonShape | null> {
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(await readFile(path, 'utf8')) as PackageJsonShape;
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function registrationEntry(registration: ToolRegistration): string | null {
|
|
84
|
+
return typeof registration === 'string' ? registration : registration?.entry;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function validRelativeModule(spec: unknown): spec is string {
|
|
88
|
+
return typeof spec === 'string' && spec.startsWith('./') && !spec.includes('..');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Every contribution module below one directory, by the naming convention.
|
|
93
|
+
*
|
|
94
|
+
* Nothing lists these. A manifest listing them was a fact that lived in two
|
|
95
|
+
* places — the file exists AND the file is named — and the second copy was the
|
|
96
|
+
* only one that could ever be wrong. `directory` is walked recursively so a
|
|
97
|
+
* dependency may organise its UI however it likes (`src/editor/` today).
|
|
98
|
+
*/
|
|
99
|
+
async function scanContributionModules(directory: string): Promise<string[]> {
|
|
100
|
+
let entries: import('node:fs').Dirent[];
|
|
101
|
+
try {
|
|
102
|
+
entries = (await readdir(directory, { withFileTypes: true })) as import('node:fs').Dirent[];
|
|
103
|
+
} catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const found: string[] = [];
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
109
|
+
const absolute = join(directory, entry.name);
|
|
110
|
+
if (entry.isDirectory()) {
|
|
111
|
+
found.push(...(await scanContributionModules(absolute)));
|
|
112
|
+
} else if (entry.isFile() && isToolContributionModule(entry.name)) {
|
|
113
|
+
found.push(absolute);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return found;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Project-source contributions: `src/contributions/`, project-relative paths. */
|
|
120
|
+
async function projectContributionModules(projectRoot: string): Promise<ProjectToolContribution[]> {
|
|
121
|
+
const found = await scanContributionModules(resolve(projectRoot, 'src', 'contributions'));
|
|
122
|
+
return found
|
|
123
|
+
.map((absolute) => ({ entryPath: relative(projectRoot, absolute).split(sep).join('/') }))
|
|
124
|
+
.sort((a, b) => a.entryPath.localeCompare(b.entryPath));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* A DEPENDENCY's contributions — the plug-in door of the universal editor
|
|
129
|
+
* (ARCHITECTURE-CORE §The universal editor, owner ruling 2026-09-15): a skew
|
|
130
|
+
* package (`@volter/editor-blender`, `@vgai/production`, …) enumerates its contribution
|
|
131
|
+
* modules under its own `package.json#vgai.contributions`, and the editor
|
|
132
|
+
* lists them for every dependency the OPEN PROJECT DECLARES.
|
|
133
|
+
*
|
|
134
|
+
* Declared, never scanned. There is still no walk of `node_modules`: a
|
|
135
|
+
* package that is not in the project's `dependencies`/`devDependencies`
|
|
136
|
+
* contributes nothing however it got installed, and a package that is
|
|
137
|
+
* declared contributes only what it enumerates — the same explicit
|
|
138
|
+
* registration idiom `vgai.tools` uses for callables. That is what keeps the
|
|
139
|
+
* surface visible: `package.json` names the package, the package's own
|
|
140
|
+
* `package.json` names the modules, and both are ordinary files a person
|
|
141
|
+
* reads. Entries are `./`-relative modules by the contribution naming
|
|
142
|
+
* convention; anything else is reported by name, never skipped silently.
|
|
143
|
+
*
|
|
144
|
+
* Paths are absolute (realpath, so a linked workspace package serves from
|
|
145
|
+
* its checkout) — `ProjectToolContribution.entryPath` was defined as
|
|
146
|
+
* "project-relative or package-absolute" for exactly this. A package is
|
|
147
|
+
* located by walking `node_modules` up from the project the way Node does
|
|
148
|
+
* (a workspace member's dependency is hoisted to the monorepo root), and
|
|
149
|
+
* NOT through `require.resolve`: that caches per process, and a long-lived
|
|
150
|
+
* editor server kept answering a package's OLD path after it was replaced
|
|
151
|
+
* on disk (measured 2026-09-15).
|
|
152
|
+
*/
|
|
153
|
+
async function locatePackageJson(fromDir: string, name: string): Promise<string | null> {
|
|
154
|
+
let dir = fromDir;
|
|
155
|
+
for (;;) {
|
|
156
|
+
const candidate = join(dir, 'node_modules', ...name.split('/'), 'package.json');
|
|
157
|
+
try {
|
|
158
|
+
if ((await stat(candidate)).isFile()) return await realpath(candidate);
|
|
159
|
+
} catch {
|
|
160
|
+
/* not here; try the parent */
|
|
161
|
+
}
|
|
162
|
+
const parent = dirname(dir);
|
|
163
|
+
if (parent === dir) return null;
|
|
164
|
+
dir = parent;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* PACKAGES THE EDITOR SHIPS FOR EVERY PROJECT IT OPENS, whatever the project's
|
|
170
|
+
* roots or its declared dependencies — "what is part of the editing SESSION
|
|
171
|
+
* itself", which no manifest can imply because it is not about the project at
|
|
172
|
+
* all: the agent-conversation surface is chrome over the worktree the editor is
|
|
173
|
+
* open on, the way the console and the status bar are.
|
|
174
|
+
*
|
|
175
|
+
* WHAT A PROJECT NEEDS TO RUN IS THE PROJECT'S OWN DECLARATION and nothing
|
|
176
|
+
* else. A list here used to IMPLY a lane from the manifest's roots —
|
|
177
|
+
* `@vgai/game` and `@vgai/dom` — resolved out of the EDITOR's own `node_modules` when the
|
|
178
|
+
* project declared none. It is deleted: the kit names no package (ARCHITECTURE-
|
|
179
|
+
* CORE §The target shape, rule 1), and the packages a session mounts beyond the
|
|
180
|
+
* project's own are the PRODUCT's, already in its bundle.
|
|
181
|
+
*
|
|
182
|
+
* `@vgai/asset-library` joins it on the same test and for the same reason
|
|
183
|
+
* (2026-09-18, phase 1 unit 10). The Library panel is a STOREFRONT the editor
|
|
184
|
+
* carries: it reaches our hosted catalog and it opens with a project that has
|
|
185
|
+
* no content at all, so no manifest can imply it — importing a result into the
|
|
186
|
+
* project is the last step, not the subject, exactly as the agent chat's
|
|
187
|
+
* subject is the harness and not the worktree it writes. It was a host static
|
|
188
|
+
* panel until that unit, present in every project whatever its manifest said,
|
|
189
|
+
* and this line is what keeps that true now that its surface is a package.
|
|
190
|
+
*
|
|
191
|
+
* THE PRODUCT ANSWERS SEPARATELY, and the difference is deliberate: a product
|
|
192
|
+
* bundles what its own entry composes (`packages/game-editor/src/index.ts`), so
|
|
193
|
+
* the model editor carries neither this package nor the game lane, and each
|
|
194
|
+
* panel's place renders the honest emptiness a chrome slot with no filler
|
|
195
|
+
* gives. This list is the SESSION's own answer, for chrome that is about the
|
|
196
|
+
* worktree rather than about the project.
|
|
197
|
+
*
|
|
198
|
+
* `@vgai/collaboration` joined on the same test (2026-09-19, phase 1 unit 15).
|
|
199
|
+
* Who is in a live editor SESSION is a fact about the session, not about the
|
|
200
|
+
* project: the people control and the presence publisher are wanted by a
|
|
201
|
+
* modeling-only worktree exactly as much as by a game, and no manifest could
|
|
202
|
+
* imply them.
|
|
203
|
+
*/
|
|
204
|
+
// Empty since the launch-scope sweep (2026-09-20): `@vgai/agents`,
|
|
205
|
+
// `@vgai/asset-library` and `@vgai/collaboration` are archived at
|
|
206
|
+
// `archive/launch-scope-2026-09-20`; a session package returns here with them.
|
|
207
|
+
const SESSION_PACKAGES: readonly string[] = [];
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* EVERY PACKAGE THIS SESSION MOUNTS, from the two places one can come from.
|
|
211
|
+
*
|
|
212
|
+
* 1. THE PRODUCT'S COMPOSITION. `@vgai/game-editor`'s and
|
|
213
|
+
* `@vgai/model-editor`'s entries name the packages they mount in code, and
|
|
214
|
+
* those names are the product's own dependencies (the estate gate is what
|
|
215
|
+
* keeps the manifest equal to the composition —
|
|
216
|
+
* `scripts/validate-package-estate.mjs`, `productComposedPackages`). They
|
|
217
|
+
* resolve from the PRODUCT's install, so a project declaring none of them
|
|
218
|
+
* still opens in a whole editor. This is what the manifest-implied lanes
|
|
219
|
+
* used to do badly: they guessed five packages from a project's ROOTS and
|
|
220
|
+
* resolved them out of the editor's own tree, so every project got every
|
|
221
|
+
* lane (WORK.md step 3's census, count three).
|
|
222
|
+
*
|
|
223
|
+
* A product's package is listed by its PACKAGE SPECIFIER, not by path,
|
|
224
|
+
* because those modules are already in the product's bundle — the page
|
|
225
|
+
* imports them through the loader the product registered rather than
|
|
226
|
+
* fetching a second copy through `/@fs/` (`tool-loader.ts`'s
|
|
227
|
+
* `bundledPackageLoaders`, keyed by exactly this string).
|
|
228
|
+
*
|
|
229
|
+
* 2. THE PROJECT'S OWN DECLARED DEPENDENCIES — a tool over the project's
|
|
230
|
+
* content that the project pins itself (CLAUDE.md's 2026-09-15 amendment).
|
|
231
|
+
* Those are not in any bundle, so they are listed by absolute path and
|
|
232
|
+
* served from the filesystem.
|
|
233
|
+
*
|
|
234
|
+
* A package on BOTH lists is the product's: its copy is the one already in the
|
|
235
|
+
* page, and loading the project's second copy is a duplicate registration.
|
|
236
|
+
*/
|
|
237
|
+
async function packageContributionModules(
|
|
238
|
+
projectRoot: string,
|
|
239
|
+
product: ProductIdentity | null,
|
|
240
|
+
loadErrors: ProjectToolLoadError[],
|
|
241
|
+
): Promise<ProjectToolContribution[]> {
|
|
242
|
+
const projectPackage = await readPackageJson(resolve(projectRoot, 'package.json'));
|
|
243
|
+
const declared = Object.keys({
|
|
244
|
+
...(projectPackage?.dependencies ?? {}),
|
|
245
|
+
...(projectPackage?.devDependencies ?? {}),
|
|
246
|
+
}).sort();
|
|
247
|
+
const composed = product === null ? [] : productComposedPackages(product);
|
|
248
|
+
const bundled = new Set(composed);
|
|
249
|
+
const sources: Array<{ name: string; from: string; bundled: boolean }> = [
|
|
250
|
+
...composed.map((name) => ({ name, from: (product as ProductIdentity).dir, bundled: true })),
|
|
251
|
+
...[...declared, ...SESSION_PACKAGES.filter((name) => !declared.includes(name))]
|
|
252
|
+
.filter((name) => !bundled.has(name))
|
|
253
|
+
.map((name) => ({ name, from: projectRoot, bundled: false })),
|
|
254
|
+
];
|
|
255
|
+
if (sources.length === 0) return [];
|
|
256
|
+
const found: ProjectToolContribution[] = [];
|
|
257
|
+
for (const { name, from, bundled: inBundle } of sources) {
|
|
258
|
+
const packageJsonPath = await locatePackageJson(from, name);
|
|
259
|
+
// Not installed: a package that cannot be found cannot contribute, and
|
|
260
|
+
// that is not an error — most dependencies are libraries with nothing
|
|
261
|
+
// to say here.
|
|
262
|
+
if (packageJsonPath === null) continue;
|
|
263
|
+
const manifest = await readPackageJson(packageJsonPath);
|
|
264
|
+
const registrations = manifest?.vgai?.contributions;
|
|
265
|
+
if (registrations === undefined) continue;
|
|
266
|
+
const source = `${name}/package.json#vgai.contributions`;
|
|
267
|
+
if (!Array.isArray(registrations)) {
|
|
268
|
+
loadErrors.push({ sourcePath: source, message: 'must be an array of ./-relative modules' });
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const packageDir = dirname(packageJsonPath);
|
|
272
|
+
for (const [index, entry] of registrations.entries()) {
|
|
273
|
+
const sourcePath = `${source}[${index}]`;
|
|
274
|
+
if (!validRelativeModule(entry)) {
|
|
275
|
+
loadErrors.push({
|
|
276
|
+
sourcePath,
|
|
277
|
+
message: 'must be a ./-relative contribution module without parent traversal',
|
|
278
|
+
});
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (!isToolContributionModule(entry)) {
|
|
282
|
+
loadErrors.push({
|
|
283
|
+
sourcePath,
|
|
284
|
+
message:
|
|
285
|
+
'is not a contribution module by name (*.document/.inspector/.asset-inspector/.result/.utility/.analytics/.kind/.finder .ts/.tsx)',
|
|
286
|
+
});
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
let absolutePath: string;
|
|
290
|
+
try {
|
|
291
|
+
absolutePath = await realpath(resolve(packageDir, entry));
|
|
292
|
+
} catch {
|
|
293
|
+
loadErrors.push({ sourcePath, message: `${entry} does not exist in ${name}` });
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
// The file is checked either way — a declaration naming a module that is
|
|
297
|
+
// not there is a load error, not a silent skip — but a BUNDLED package is
|
|
298
|
+
// reported by its specifier, which is the key its loader is registered
|
|
299
|
+
// under in the page.
|
|
300
|
+
found.push({
|
|
301
|
+
entryPath: inBundle ? `${name}/${entry.replace(/^\.\//, '')}` : absolutePath,
|
|
302
|
+
package: name,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return found;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function projectToolModules(projectRoot: string): Promise<ToolModule[]> {
|
|
310
|
+
const projectPackage = await readPackageJson(resolve(projectRoot, 'package.json'));
|
|
311
|
+
const registrations = projectPackage?.vgai?.tools;
|
|
312
|
+
if (!Array.isArray(registrations)) return [];
|
|
313
|
+
return registrations.map((registration, index): ToolModule => {
|
|
314
|
+
const entry = registrationEntry(registration);
|
|
315
|
+
const registrationPath = `package.json#vgai.tools[${index}]`;
|
|
316
|
+
if (!validRelativeModule(entry)) {
|
|
317
|
+
return {
|
|
318
|
+
absolutePath: resolve(projectRoot, 'package.json'),
|
|
319
|
+
sourcePath: registrationPath,
|
|
320
|
+
registrationError: 'must be a ./-relative tool module without parent traversal',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const absolutePath = resolve(projectRoot, entry);
|
|
324
|
+
if (!absolutePath.startsWith(`${projectRoot}${sep}`)) {
|
|
325
|
+
return {
|
|
326
|
+
absolutePath,
|
|
327
|
+
sourcePath: registrationPath,
|
|
328
|
+
registrationError: 'resolves outside the project',
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return { absolutePath, sourcePath: entry.slice(2) };
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function operationShape(value: unknown): value is ToolDefinition {
|
|
336
|
+
if (value === null || typeof value !== 'object') return false;
|
|
337
|
+
const candidate = value as Partial<ToolDefinition>;
|
|
338
|
+
return (
|
|
339
|
+
typeof candidate.name === 'string' &&
|
|
340
|
+
typeof candidate.summary === 'string' &&
|
|
341
|
+
typeof candidate.description === 'string' &&
|
|
342
|
+
candidate.input !== null &&
|
|
343
|
+
typeof candidate.input === 'object' &&
|
|
344
|
+
typeof candidate.input.safeParse === 'function' &&
|
|
345
|
+
candidate.result !== null &&
|
|
346
|
+
typeof candidate.result === 'object' &&
|
|
347
|
+
typeof candidate.result.safeParse === 'function' &&
|
|
348
|
+
Array.isArray(candidate.errors) &&
|
|
349
|
+
candidate.requires !== null &&
|
|
350
|
+
typeof candidate.requires === 'object' &&
|
|
351
|
+
(candidate.host === 'node' ||
|
|
352
|
+
candidate.host === 'editor-browser' ||
|
|
353
|
+
candidate.host === 'runtime-page') &&
|
|
354
|
+
typeof candidate.mutates === 'boolean' &&
|
|
355
|
+
typeof candidate.supportsDryRun === 'boolean' &&
|
|
356
|
+
candidate.permission !== null &&
|
|
357
|
+
typeof candidate.permission === 'object' &&
|
|
358
|
+
typeof candidate.impl === 'function'
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function generationContributionShape(value: unknown): value is GenerationToolContribution {
|
|
363
|
+
if (!value || typeof value !== 'object') return false;
|
|
364
|
+
const candidate = value as Partial<GenerationToolContribution>;
|
|
365
|
+
return (
|
|
366
|
+
typeof candidate.provider === 'string' &&
|
|
367
|
+
candidate.provider.length > 0 &&
|
|
368
|
+
((candidate.role === 'submit' && typeof candidate.toJob === 'function') ||
|
|
369
|
+
((candidate.role === 'poll' || candidate.role === 'cancel' || candidate.role === 'accept') &&
|
|
370
|
+
typeof candidate.toUpdate === 'function'))
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function jsonSchema(schema: z.ZodType): unknown {
|
|
375
|
+
// Project schemas may come from a different Zod version than the bundled host.
|
|
376
|
+
return schema.toJSONSchema();
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function toCatalogEntry(
|
|
380
|
+
definition: ToolDefinition,
|
|
381
|
+
sourcePath: string,
|
|
382
|
+
generation?: GenerationToolContribution,
|
|
383
|
+
): ProjectToolCatalogEntry {
|
|
384
|
+
return {
|
|
385
|
+
name: definition.name,
|
|
386
|
+
summary: definition.summary,
|
|
387
|
+
description: definition.description,
|
|
388
|
+
sourcePath,
|
|
389
|
+
inputSchema: jsonSchema(definition.input),
|
|
390
|
+
resultSchema: jsonSchema(definition.result),
|
|
391
|
+
errors: definition.errors.map((error) => ({
|
|
392
|
+
code: error.code,
|
|
393
|
+
summary: error.summary,
|
|
394
|
+
...(error.data ? { dataSchema: jsonSchema(error.data) } : {}),
|
|
395
|
+
})),
|
|
396
|
+
requires: { ...definition.requires },
|
|
397
|
+
host: definition.host,
|
|
398
|
+
mutates: definition.mutates,
|
|
399
|
+
supportsDryRun: definition.supportsDryRun,
|
|
400
|
+
longRunning: definition.longRunning === true,
|
|
401
|
+
permission: { ...definition.permission },
|
|
402
|
+
...(generation ? { generation: { provider: generation.provider, role: generation.role } } : {}),
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
async function loadCatalog(
|
|
407
|
+
projectRoot: string,
|
|
408
|
+
loadModule: ProjectModuleLoader | undefined,
|
|
409
|
+
): Promise<LoadedCatalog> {
|
|
410
|
+
// WHICH PRODUCT IS SERVING THIS PROJECT — resolved the same way the CLI
|
|
411
|
+
// resolved it, so the packages the page already has and the packages this
|
|
412
|
+
// catalog lists are the same set. `null` means no product (a session started
|
|
413
|
+
// by hand against a project that declares none); the catalog then holds only
|
|
414
|
+
// the project's own, and the frame's own door says why there is no editor.
|
|
415
|
+
const product = sessionProduct(projectRoot);
|
|
416
|
+
const definitions = new Map<string, ToolDefinition>();
|
|
417
|
+
const generationContributions = new Map<string, GenerationToolContribution>();
|
|
418
|
+
const tools: ProjectToolCatalogEntry[] = [];
|
|
419
|
+
const loadErrors: ProjectToolLoadError[] = [];
|
|
420
|
+
// Contributions are SCANNED, so they never depend on a callable loading —
|
|
421
|
+
// a project whose tool module throws still shows its documents' teaching
|
|
422
|
+
// errors rather than silently losing the whole UI half of the catalog.
|
|
423
|
+
const contributions = [
|
|
424
|
+
...(await projectContributionModules(projectRoot)),
|
|
425
|
+
...(await packageContributionModules(projectRoot, product, loadErrors)),
|
|
426
|
+
];
|
|
427
|
+
const files = (await projectToolModules(projectRoot)).sort((a, b) =>
|
|
428
|
+
a.sourcePath.localeCompare(b.sourcePath),
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
const loadableFiles = files.filter((file) => {
|
|
432
|
+
if (!file.registrationError) return true;
|
|
433
|
+
loadErrors.push({ sourcePath: file.sourcePath, message: file.registrationError });
|
|
434
|
+
return false;
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
if (loadableFiles.length > 0 && !loadModule) {
|
|
438
|
+
loadErrors.push(noProjectModuleHostError());
|
|
439
|
+
return { tools, contributions, loadErrors, definitions, generationContributions };
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const registry = new ToolRegistry();
|
|
443
|
+
for (const { absolutePath, sourcePath } of loadableFiles) {
|
|
444
|
+
try {
|
|
445
|
+
const imported = (await loadModule?.(absolutePath)) as Record<string, unknown> | undefined;
|
|
446
|
+
const definition = imported?.['tool'];
|
|
447
|
+
if (!operationShape(definition)) {
|
|
448
|
+
throw new Error(
|
|
449
|
+
'does not export a complete `tool` definition; export `tool = defineTool({...})` from @vgai/sdk/tools',
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
if (!definition.name.startsWith('project.')) {
|
|
453
|
+
throw new Error(
|
|
454
|
+
`declares ${JSON.stringify(definition.name)}; project-local tool names must start with "project."`,
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
if (definition.mutates && definition.permission.risk === 'read') {
|
|
458
|
+
throw new Error(
|
|
459
|
+
`declares mutates:true with read risk; mutating operations must declare write or destructive risk`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
const advertisedGeneration = imported?.['generation'];
|
|
463
|
+
if (
|
|
464
|
+
advertisedGeneration !== undefined &&
|
|
465
|
+
!generationContributionShape(advertisedGeneration)
|
|
466
|
+
) {
|
|
467
|
+
throw new Error(
|
|
468
|
+
'exports invalid `generation` metadata; use a provider id, submit/poll/cancel/accept role, and the matching mapper function',
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
const generation = advertisedGeneration as GenerationToolContribution | undefined;
|
|
472
|
+
registry.register(definition);
|
|
473
|
+
const entry = toCatalogEntry(definition, sourcePath, generation);
|
|
474
|
+
definitions.set(definition.name, definition);
|
|
475
|
+
if (generation) generationContributions.set(definition.name, generation);
|
|
476
|
+
tools.push(entry);
|
|
477
|
+
} catch (error) {
|
|
478
|
+
loadErrors.push({
|
|
479
|
+
sourcePath,
|
|
480
|
+
message: error instanceof Error ? error.message : String(error),
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
486
|
+
return { tools, contributions, loadErrors, definitions, generationContributions };
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export async function discoverProjectTools(
|
|
490
|
+
projectRoot: string,
|
|
491
|
+
loadModule: ProjectModuleLoader | undefined,
|
|
492
|
+
): Promise<ProjectToolCatalog> {
|
|
493
|
+
const {
|
|
494
|
+
definitions: _definitions,
|
|
495
|
+
generationContributions: _generationContributions,
|
|
496
|
+
...catalog
|
|
497
|
+
} = await loadCatalog(projectRoot, loadModule);
|
|
498
|
+
return catalog;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
export type ProjectToolExecution =
|
|
502
|
+
| {
|
|
503
|
+
status: 200;
|
|
504
|
+
body: ToolOutcome & { generation?: GenerationJob; generationWarning?: string };
|
|
505
|
+
changedProject: boolean;
|
|
506
|
+
}
|
|
507
|
+
| {
|
|
508
|
+
status: 404 | 409;
|
|
509
|
+
body: { ok: false; error: { code: string; message: string } };
|
|
510
|
+
changedProject: false;
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
export async function executeProjectTool(options: {
|
|
514
|
+
account?: EditorAccountService | undefined;
|
|
515
|
+
projectRoot: string;
|
|
516
|
+
loadModule: ProjectModuleLoader | undefined;
|
|
517
|
+
name: string;
|
|
518
|
+
input: unknown;
|
|
519
|
+
confirmed: boolean;
|
|
520
|
+
/** WHICH mounted instance a game-driving tool should address (multiplayer
|
|
521
|
+
* authoring). Reaches the tool as `ctx.instance`; omitted is the sole
|
|
522
|
+
* instance. */
|
|
523
|
+
instance?: string;
|
|
524
|
+
signal?: AbortSignal;
|
|
525
|
+
}): Promise<ProjectToolExecution> {
|
|
526
|
+
const loaded = await loadCatalog(options.projectRoot, options.loadModule);
|
|
527
|
+
const definition = loaded.definitions.get(options.name);
|
|
528
|
+
if (!definition) {
|
|
529
|
+
return {
|
|
530
|
+
status: 404,
|
|
531
|
+
changedProject: false,
|
|
532
|
+
body: {
|
|
533
|
+
ok: false,
|
|
534
|
+
error: {
|
|
535
|
+
code: 'PROJECT_TOOL_NOT_FOUND',
|
|
536
|
+
message: `No registered project tool is named ${JSON.stringify(options.name)}.`,
|
|
537
|
+
},
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
if (definition.host !== 'node') {
|
|
542
|
+
return {
|
|
543
|
+
status: 409,
|
|
544
|
+
changedProject: false,
|
|
545
|
+
body: {
|
|
546
|
+
ok: false,
|
|
547
|
+
error: {
|
|
548
|
+
code: 'PROJECT_TOOL_HOST_UNAVAILABLE',
|
|
549
|
+
message:
|
|
550
|
+
`Project tool ${JSON.stringify(options.name)} declares host ${JSON.stringify(definition.host)}. ` +
|
|
551
|
+
'This host currently executes Node-hosted project tools; call reusable browser/runtime functions directly.',
|
|
552
|
+
},
|
|
553
|
+
},
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
if ((definition.mutates || definition.permission.risk !== 'read') && !options.confirmed) {
|
|
557
|
+
return {
|
|
558
|
+
status: 409,
|
|
559
|
+
changedProject: false,
|
|
560
|
+
body: {
|
|
561
|
+
ok: false,
|
|
562
|
+
error: {
|
|
563
|
+
code: 'PROJECT_TOOL_CONFIRMATION_REQUIRED',
|
|
564
|
+
message:
|
|
565
|
+
`${definition.permission.risk} tool ${JSON.stringify(options.name)} requires explicit confirmation: ` +
|
|
566
|
+
definition.permission.summary +
|
|
567
|
+
' Set confirm: true in the invocation options after authorization.',
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
const registry = new ToolRegistry();
|
|
574
|
+
registry.register(definition);
|
|
575
|
+
const generation = loaded.generationContributions.get(options.name);
|
|
576
|
+
// THE credential read for a generation job: this tool's OWN declared
|
|
577
|
+
// provider, one credential-manager item, at the moment the job runs. A tool
|
|
578
|
+
// that declares no provider reads nothing (`provider-credentials.ts`'s
|
|
579
|
+
// header states the rule and what a boot-time sweep costs).
|
|
580
|
+
if (generation && options.account) {
|
|
581
|
+
await options.account.ensureProviderCredential(generation.provider);
|
|
582
|
+
}
|
|
583
|
+
const provenanceInput = definition.input.safeParse(options.input);
|
|
584
|
+
const operationSource = loaded.tools.find((entry) => entry.name === options.name)?.sourcePath;
|
|
585
|
+
const resolveMode: ProviderModeResolver = async (provider, requestId) => {
|
|
586
|
+
const job = requestId
|
|
587
|
+
? (await readGenerationJobs(options.projectRoot)).jobs.find(
|
|
588
|
+
(job) => job.provider === provider && job.externalId === requestId,
|
|
589
|
+
)
|
|
590
|
+
: undefined;
|
|
591
|
+
if (!options.account)
|
|
592
|
+
throw new Error('Provider execution requires the editor account service.');
|
|
593
|
+
return options.account.providerExecutionMode(provider, job?.mode);
|
|
594
|
+
};
|
|
595
|
+
const outcome = await withProviderExecution(
|
|
596
|
+
resolveMode,
|
|
597
|
+
() =>
|
|
598
|
+
runWithGenerativeExecutionCapture(() =>
|
|
599
|
+
registry.dispatch(options.name, options.input, {
|
|
600
|
+
projectRoot: options.projectRoot,
|
|
601
|
+
projectOutputs: createProjectOutputWriter(options.projectRoot, {
|
|
602
|
+
operationName: definition.name,
|
|
603
|
+
...(operationSource ? { operationSource } : {}),
|
|
604
|
+
...(provenanceInput.success ? { input: provenanceInput.data } : {}),
|
|
605
|
+
}),
|
|
606
|
+
...(options.instance !== undefined ? { instance: options.instance } : {}),
|
|
607
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
608
|
+
...(options.loadModule ? { loadProjectModule: options.loadModule } : {}),
|
|
609
|
+
}),
|
|
610
|
+
),
|
|
611
|
+
async (job) => {
|
|
612
|
+
await applyGenerationContribution(
|
|
613
|
+
options.projectRoot,
|
|
614
|
+
{
|
|
615
|
+
role: 'submit',
|
|
616
|
+
provider: job.provider,
|
|
617
|
+
toJob: () => job,
|
|
618
|
+
},
|
|
619
|
+
{},
|
|
620
|
+
{},
|
|
621
|
+
);
|
|
622
|
+
},
|
|
623
|
+
);
|
|
624
|
+
let body: ToolOutcome & { generation?: GenerationJob; generationWarning?: string } = outcome;
|
|
625
|
+
if (outcome.ok && generation && provenanceInput.success) {
|
|
626
|
+
try {
|
|
627
|
+
const generationJob = await applyGenerationContribution(
|
|
628
|
+
options.projectRoot,
|
|
629
|
+
generation,
|
|
630
|
+
provenanceInput.data,
|
|
631
|
+
outcome.data,
|
|
632
|
+
);
|
|
633
|
+
await reconcileAcceptedGenerationProvenance(options.projectRoot, generationJob);
|
|
634
|
+
body = {
|
|
635
|
+
...outcome,
|
|
636
|
+
generation: generationJob,
|
|
637
|
+
};
|
|
638
|
+
} catch (error) {
|
|
639
|
+
// Never turn successful paid provider submission into an apparent
|
|
640
|
+
// failure that tempts a retry and duplicate charge. Tracking failure is
|
|
641
|
+
// explicit alongside the successful native result.
|
|
642
|
+
body = {
|
|
643
|
+
...outcome,
|
|
644
|
+
generationWarning: error instanceof Error ? error.message : String(error),
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
return {
|
|
649
|
+
status: 200,
|
|
650
|
+
body,
|
|
651
|
+
changedProject: definition.mutates && outcome.ok,
|
|
652
|
+
};
|
|
653
|
+
}
|