@volter/sdk 0.0.0-stage → 0.5.203
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1166 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +317 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +403 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core, registry-level error codes — always available regardless of which
|
|
5
|
+
* operation was dispatched. Operation-specific codes are declared per
|
|
6
|
+
* operation on `ToolDefinition.errors` (see `registry.ts`).
|
|
7
|
+
*/
|
|
8
|
+
export const CORE_ERROR_CODES = {
|
|
9
|
+
/** `dispatch()` was called with a name no operation is registered under. */
|
|
10
|
+
OPERATION_NOT_FOUND: 'OPERATION_NOT_FOUND',
|
|
11
|
+
/** Input failed the operation's Zod input schema. */
|
|
12
|
+
INVALID_INPUT: 'INVALID_INPUT',
|
|
13
|
+
/** The impl's return value failed the operation's Zod result schema, or a
|
|
14
|
+
* thrown ToolError's `data` failed its declared error-code schema —
|
|
15
|
+
* either way, an implementation bug, not a caller bug. */
|
|
16
|
+
INVALID_OUTPUT: 'INVALID_OUTPUT',
|
|
17
|
+
/** The impl threw something that isn't a declared, structured error. */
|
|
18
|
+
INTERNAL_ERROR: 'INTERNAL_ERROR',
|
|
19
|
+
} as const;
|
|
20
|
+
|
|
21
|
+
export type CoreErrorCode = (typeof CORE_ERROR_CODES)[keyof typeof CORE_ERROR_CODES];
|
|
22
|
+
|
|
23
|
+
/** A single Zod validation failure, reduced to a machine-readable shape. */
|
|
24
|
+
export interface StructuredIssue {
|
|
25
|
+
path: (string | number | symbol)[];
|
|
26
|
+
message: string;
|
|
27
|
+
code: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The one error shape every `dispatch()` failure normalizes into. `code` is
|
|
32
|
+
* always machine-readable and always present — nothing in this codebase may
|
|
33
|
+
* identify an operation failure by parsing `message` prose (§8 B1 AC).
|
|
34
|
+
*/
|
|
35
|
+
export interface StructuredOperationError {
|
|
36
|
+
code: string;
|
|
37
|
+
message: string;
|
|
38
|
+
/** Present for INVALID_INPUT / INVALID_OUTPUT — the exact failing path(s). */
|
|
39
|
+
issues?: StructuredIssue[];
|
|
40
|
+
/** Present when the failing code declares a data schema (or the impl attached data). */
|
|
41
|
+
data?: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A global brand keeps expected errors recognizable across separately loaded
|
|
46
|
+
* copies of @volter/sdk (for example, an editor host dispatching a standalone
|
|
47
|
+
* project's tool). `instanceof` alone cannot cross that package boundary.
|
|
48
|
+
*/
|
|
49
|
+
export const OPERATION_ERROR_BRAND = Symbol.for('@volter/sdk.ToolError');
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The only way an operation `impl` should signal an EXPECTED, contractual
|
|
53
|
+
* failure (as opposed to an unexpected bug/exception). `code` must be one
|
|
54
|
+
* the operation's `ToolDefinition.errors` declares — `dispatch()`
|
|
55
|
+
* cross-checks it and validates `data` against that code's schema, so an
|
|
56
|
+
* undeclared code or mismatched data is itself normalized into a structured
|
|
57
|
+
* error rather than silently forwarded (see `registry.ts`'s
|
|
58
|
+
* `normalizeThrown`).
|
|
59
|
+
*/
|
|
60
|
+
export class ToolError extends Error {
|
|
61
|
+
readonly [OPERATION_ERROR_BRAND] = true;
|
|
62
|
+
readonly code: string;
|
|
63
|
+
readonly data: unknown;
|
|
64
|
+
|
|
65
|
+
constructor(code: string, message: string, data?: unknown) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.name = 'ToolError';
|
|
68
|
+
this.code = code;
|
|
69
|
+
this.data = data;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function isOperationError(value: unknown): value is ToolError {
|
|
74
|
+
if (value instanceof ToolError) return true;
|
|
75
|
+
if (value === null || typeof value !== 'object') return false;
|
|
76
|
+
const candidate = value as Record<PropertyKey, unknown>;
|
|
77
|
+
return (
|
|
78
|
+
candidate[OPERATION_ERROR_BRAND] === true &&
|
|
79
|
+
typeof candidate['code'] === 'string' &&
|
|
80
|
+
typeof candidate['message'] === 'string'
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Reduce a `ZodError`'s issues to the structured, serializable shape above. */
|
|
85
|
+
export function toStructuredIssues(issues: readonly z.ZodIssue[]): StructuredIssue[] {
|
|
86
|
+
return issues.map((issue) => ({
|
|
87
|
+
path: [...issue.path],
|
|
88
|
+
message: issue.message,
|
|
89
|
+
code: issue.code,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import type { GenerationJobDraft } from '../generations.js';
|
|
3
|
+
|
|
4
|
+
export type ProviderExecutionMode = 'direct' | 'managed' | 'mock';
|
|
5
|
+
export type ProviderModeResolver = (
|
|
6
|
+
provider: string,
|
|
7
|
+
requestId?: string,
|
|
8
|
+
) => Promise<ProviderExecutionMode>;
|
|
9
|
+
|
|
10
|
+
const credentialNames: Record<string, string> = {
|
|
11
|
+
fal: 'FAL_KEY',
|
|
12
|
+
tripo: 'TRIPO_API_KEY',
|
|
13
|
+
worldlabs: 'WORLDLABS_API_KEY',
|
|
14
|
+
openrouter: 'OPENROUTER_API_KEY',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Project SSR and installed packages can load separate module instances.
|
|
18
|
+
// The host's async context must still be shared, without sharing requests.
|
|
19
|
+
const key = Symbol.for('volter.provider-execution-context');
|
|
20
|
+
const globals = globalThis as typeof globalThis & {
|
|
21
|
+
[key]?: AsyncLocalStorage<{
|
|
22
|
+
resolve: ProviderModeResolver;
|
|
23
|
+
record?: ((job: GenerationJobDraft) => Promise<void>) | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
const context = globals[key] ?? new AsyncLocalStorage();
|
|
27
|
+
globals[key] = context;
|
|
28
|
+
|
|
29
|
+
/** Trusted host configuration. Provider choice and billing never enter tool input. */
|
|
30
|
+
export function withProviderExecution<T>(
|
|
31
|
+
resolve: ProviderModeResolver,
|
|
32
|
+
work: () => Promise<T>,
|
|
33
|
+
record?: (job: GenerationJobDraft) => Promise<void>,
|
|
34
|
+
) {
|
|
35
|
+
const pending = new Map<string, Promise<ProviderExecutionMode>>();
|
|
36
|
+
return context.run(
|
|
37
|
+
{
|
|
38
|
+
record,
|
|
39
|
+
resolve: (provider, requestId) => {
|
|
40
|
+
const key = JSON.stringify([provider, requestId]);
|
|
41
|
+
let result = pending.get(key);
|
|
42
|
+
if (!result) {
|
|
43
|
+
result = resolve(provider, requestId);
|
|
44
|
+
pending.set(key, result);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
work,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Native provider clients use the same project ledger as registered tools. */
|
|
54
|
+
export async function recordProviderGeneration(job: GenerationJobDraft): Promise<void> {
|
|
55
|
+
await context.getStore()?.record?.(job);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Library-side connection resolution; callers supply only native provider input. */
|
|
59
|
+
export async function resolveProviderMode(
|
|
60
|
+
provider: string,
|
|
61
|
+
requestId?: string,
|
|
62
|
+
): Promise<ProviderExecutionMode> {
|
|
63
|
+
const resolve = context.getStore()?.resolve;
|
|
64
|
+
if (resolve) return resolve(provider, requestId);
|
|
65
|
+
const name = credentialNames[provider];
|
|
66
|
+
if (!name) throw new Error(`Unknown generation provider ${JSON.stringify(provider)}.`);
|
|
67
|
+
if (process.env[name]?.trim()) return 'direct';
|
|
68
|
+
if (process.env['VOLTER_GENERATION_GATEWAY'] && process.env['VOLTER_ACCESS_TOKEN']) return 'managed';
|
|
69
|
+
throw new Error(`Connect ${provider} or sign in to Volter Editor in Account before generating.`);
|
|
70
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import {
|
|
3
|
+
CORE_ERROR_CODES,
|
|
4
|
+
isOperationError,
|
|
5
|
+
type StructuredOperationError,
|
|
6
|
+
toStructuredIssues,
|
|
7
|
+
} from './errors.js';
|
|
8
|
+
import {
|
|
9
|
+
type ExecutionHost,
|
|
10
|
+
type ExecutionRequirements,
|
|
11
|
+
type PermissionMetadata,
|
|
12
|
+
TOOL_NAMESPACES,
|
|
13
|
+
type ToolContext,
|
|
14
|
+
type ToolNamespace,
|
|
15
|
+
} from './types.js';
|
|
16
|
+
|
|
17
|
+
/** One declared, machine-readable failure mode of an operation (§8 B1: "structured error codes and data schemas"). */
|
|
18
|
+
export interface ToolErrorDefinition<TCode extends string = string> {
|
|
19
|
+
code: TCode;
|
|
20
|
+
/** One-line human summary of when this code fires — for docs/help text, never parsed by callers. */
|
|
21
|
+
summary: string;
|
|
22
|
+
/** Optional schema for this code's `data` payload. When present, `dispatch()` validates a thrown ToolError's data against it. */
|
|
23
|
+
data?: z.ZodType;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* One operation, fully self-describing: identity, both schemas, every
|
|
28
|
+
* declared failure mode, where/how it runs, and its own implementation.
|
|
29
|
+
* Built via `defineTool` (below), which validates the name shape and
|
|
30
|
+
* error-code uniqueness at definition time.
|
|
31
|
+
*/
|
|
32
|
+
export interface ToolDefinition<
|
|
33
|
+
TInput extends z.ZodType = z.ZodType,
|
|
34
|
+
TResult extends z.ZodType = z.ZodType,
|
|
35
|
+
TErrorCode extends string = string,
|
|
36
|
+
> {
|
|
37
|
+
/** Fully qualified dotted name, e.g. "project.scene.read" (§5.7 namespaces). */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Short, one-line summary (for CLI help / listOperations tables). */
|
|
40
|
+
summary: string;
|
|
41
|
+
/** Longer prose description of behavior, side effects, and caveats. */
|
|
42
|
+
description: string;
|
|
43
|
+
/** Zod schema every `dispatch()` input is validated against before `impl` runs. */
|
|
44
|
+
input: TInput;
|
|
45
|
+
/** Zod schema every `impl` return value is validated against before `dispatch()` succeeds. */
|
|
46
|
+
result: TResult;
|
|
47
|
+
/** Every structured failure mode this operation may raise via `ToolError`. */
|
|
48
|
+
errors: ReadonlyArray<ToolErrorDefinition<TErrorCode>>;
|
|
49
|
+
/** Which live contexts this operation needs (project/editor/play/render). */
|
|
50
|
+
requires: ExecutionRequirements;
|
|
51
|
+
/** Which of the three hosts this operation executes on (node / editor-browser / runtime-page). */
|
|
52
|
+
host: ExecutionHost;
|
|
53
|
+
/** True if this operation writes/changes state (files, editor, runtime). */
|
|
54
|
+
mutates: boolean;
|
|
55
|
+
/** True if this operation supports a dry-run mode (mutations only, meaningful subset). */
|
|
56
|
+
supportsDryRun: boolean;
|
|
57
|
+
/** True for jobs that must not ride a short request/response timeout (e.g. `cinematic.render` on the editor relay). */
|
|
58
|
+
longRunning?: boolean;
|
|
59
|
+
/** Coarse permission/risk metadata for gated callers (agents, HTTP/MCP auth). */
|
|
60
|
+
permission: PermissionMetadata;
|
|
61
|
+
/** The actual implementation. Receives already-schema-validated input. */
|
|
62
|
+
impl: (input: z.infer<TInput>, ctx: ToolContext) => Promise<z.infer<TResult>>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** `listOperations()`'s element shape — every field of `ToolDefinition` except `impl`, so enumerating never risks invoking anything. */
|
|
66
|
+
export type ToolSummary<
|
|
67
|
+
TInput extends z.ZodType = z.ZodType,
|
|
68
|
+
TResult extends z.ZodType = z.ZodType,
|
|
69
|
+
TErrorCode extends string = string,
|
|
70
|
+
> = Omit<ToolDefinition<TInput, TResult, TErrorCode>, 'impl'>;
|
|
71
|
+
|
|
72
|
+
const NAME_PATTERN = /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$/;
|
|
73
|
+
|
|
74
|
+
function namespaceOf(name: string): string {
|
|
75
|
+
const dot = name.indexOf('.');
|
|
76
|
+
return dot === -1 ? name : name.slice(0, dot);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Typed helper that builds an `ToolDefinition`. Pure and synchronous —
|
|
81
|
+
* it does not touch a registry (so it can never itself throw "duplicate
|
|
82
|
+
* name"; that check happens at `ToolRegistry.register`, which has the
|
|
83
|
+
* cross-operation state to detect it) — but it DOES validate the two things
|
|
84
|
+
* that are decidable from the definition alone: the name is a valid dotted
|
|
85
|
+
* `namespace.rest` string under one of the four operation namespaces
|
|
86
|
+
* (§5.7), and no two declared error codes on the same operation collide.
|
|
87
|
+
*
|
|
88
|
+
* Exists mainly for type inference: it pins `impl`'s parameter/return types
|
|
89
|
+
* to `z.infer<TInput>` / `z.infer<TResult>` so a mismatched implementation
|
|
90
|
+
* fails to compile rather than failing at runtime.
|
|
91
|
+
*/
|
|
92
|
+
export function defineTool<
|
|
93
|
+
TInput extends z.ZodType,
|
|
94
|
+
TResult extends z.ZodType,
|
|
95
|
+
TErrorCode extends string = string,
|
|
96
|
+
>(def: ToolDefinition<TInput, TResult, TErrorCode>): ToolDefinition<TInput, TResult, TErrorCode> {
|
|
97
|
+
if (!NAME_PATTERN.test(def.name)) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
`defineTool: "${def.name}" is not a valid dotted operation name ` +
|
|
100
|
+
'(expected e.g. "project.scene.read" — lowercase-leading segments joined by dots).',
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const ns = namespaceOf(def.name);
|
|
104
|
+
if (!(TOOL_NAMESPACES as readonly string[]).includes(ns)) {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`defineTool: "${def.name}" has unknown namespace "${ns}" — expected one of ` +
|
|
107
|
+
`${TOOL_NAMESPACES.join(', ')} (§5.7).`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const seen = new Set<string>();
|
|
111
|
+
for (const err of def.errors) {
|
|
112
|
+
if (seen.has(err.code)) {
|
|
113
|
+
throw new Error(`defineTool: "${def.name}" declares duplicate error code "${err.code}".`);
|
|
114
|
+
}
|
|
115
|
+
seen.add(err.code);
|
|
116
|
+
}
|
|
117
|
+
return def;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** `dispatch()`'s result — a discriminated union, never a thrown exception, so every projection (CLI/HTTP/MCP) gets one uniform JSON-able shape for both success and failure. */
|
|
121
|
+
export type ToolOutcome<TResult = unknown> =
|
|
122
|
+
| { ok: true; data: TResult }
|
|
123
|
+
| { ok: false; error: StructuredOperationError };
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Normalize whatever an `impl` threw into a `StructuredOperationError`.
|
|
127
|
+
* Three cases:
|
|
128
|
+
* 1. A declared `ToolError` whose code IS in `def.errors` and whose
|
|
129
|
+
* `data` (if the code declares a schema) validates — forwarded as-is,
|
|
130
|
+
* `data` replaced by its *parsed* form.
|
|
131
|
+
* 2. A declared code whose `data` fails its own schema — that is itself an
|
|
132
|
+
* implementation bug, surfaced as INVALID_OUTPUT (never silently
|
|
133
|
+
* forwarding unvalidated data).
|
|
134
|
+
* 3. Anything else — an `ToolError` with an undeclared code, a plain
|
|
135
|
+
* `Error`, or a non-Error throw — normalized into INTERNAL_ERROR. The
|
|
136
|
+
* raw exception/message is never used as the identifying `code`, but it
|
|
137
|
+
* IS carried in `message` as well as `data.message`: every projection
|
|
138
|
+
* (the CLI's `volter tool`, the oclif commands, the editor's `screenshot` command's module
|
|
139
|
+
* lane) shows `error.message` and only some of them dump `data`, so a
|
|
140
|
+
* `message` that said nothing but "threw an unstructured exception"
|
|
141
|
+
* hid the one sentence the caller needed ("No editor connected — open
|
|
142
|
+
* the editor in a browser tab, then retry.") behind whichever surface
|
|
143
|
+
* happened to print the whole outcome.
|
|
144
|
+
*/
|
|
145
|
+
function normalizeThrown(def: ToolDefinition, err: unknown): StructuredOperationError {
|
|
146
|
+
if (isOperationError(err)) {
|
|
147
|
+
const declared = def.errors.find((e) => e.code === err.code);
|
|
148
|
+
if (!declared) {
|
|
149
|
+
return {
|
|
150
|
+
code: CORE_ERROR_CODES.INTERNAL_ERROR,
|
|
151
|
+
message: `"${def.name}" threw undeclared error code "${err.code}".`,
|
|
152
|
+
data: { undeclaredCode: err.code, message: err.message },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (declared.data) {
|
|
156
|
+
const parsed = declared.data.safeParse(err.data);
|
|
157
|
+
if (!parsed.success) {
|
|
158
|
+
return {
|
|
159
|
+
code: CORE_ERROR_CODES.INVALID_OUTPUT,
|
|
160
|
+
message:
|
|
161
|
+
`"${def.name}" threw declared code "${err.code}" but its data failed that ` +
|
|
162
|
+
"code's own schema.",
|
|
163
|
+
issues: toStructuredIssues(parsed.error.issues),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { code: err.code, message: err.message, data: parsed.data };
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
code: err.code,
|
|
170
|
+
message: err.message,
|
|
171
|
+
...(err.data !== undefined ? { data: err.data } : {}),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
176
|
+
return {
|
|
177
|
+
code: CORE_ERROR_CODES.INTERNAL_ERROR,
|
|
178
|
+
message: `"${def.name}" failed: ${message}`,
|
|
179
|
+
data: { message },
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function toSummary(def: ToolDefinition): ToolSummary {
|
|
184
|
+
const { impl: _impl, ...summary } = def;
|
|
185
|
+
return summary;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Zod object schemas strip unknown keys by default. That is unsafe at an
|
|
190
|
+
* operation boundary: a misspelled `dryRun` could disappear and let the
|
|
191
|
+
* operation use its write-default. Detect anything parsing removed, at any
|
|
192
|
+
* nested object level, and reject it before the implementation can run.
|
|
193
|
+
*/
|
|
194
|
+
function firstStrippedInputPath(
|
|
195
|
+
raw: unknown,
|
|
196
|
+
parsed: unknown,
|
|
197
|
+
path: Array<string | number> = [],
|
|
198
|
+
): Array<string | number> | null {
|
|
199
|
+
if (Array.isArray(raw) && Array.isArray(parsed)) {
|
|
200
|
+
for (let index = 0; index < raw.length; index++) {
|
|
201
|
+
const stripped = firstStrippedInputPath(raw[index], parsed[index], [...path, index]);
|
|
202
|
+
if (stripped) return stripped;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
if (
|
|
207
|
+
raw === null ||
|
|
208
|
+
parsed === null ||
|
|
209
|
+
typeof raw !== 'object' ||
|
|
210
|
+
typeof parsed !== 'object' ||
|
|
211
|
+
Array.isArray(raw) ||
|
|
212
|
+
Array.isArray(parsed)
|
|
213
|
+
) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const parsedRecord = parsed as Record<string, unknown>;
|
|
217
|
+
for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {
|
|
218
|
+
if (!Object.hasOwn(parsedRecord, key)) return [...path, key];
|
|
219
|
+
const stripped = firstStrippedInputPath(value, parsedRecord[key], [...path, key]);
|
|
220
|
+
if (stripped) return stripped;
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* The one registry of operation definitions (§8 B1). Holds definitions
|
|
227
|
+
* keyed by their fully-qualified name; `register` rejects a duplicate name
|
|
228
|
+
* outright (names are unique and stable per the AC), `listOperations`
|
|
229
|
+
* enumerates metadata without ever touching `impl`, and `dispatch` is the
|
|
230
|
+
* single validated call path: input schema -> impl -> result schema, with
|
|
231
|
+
* every failure normalized into `StructuredOperationError`.
|
|
232
|
+
*/
|
|
233
|
+
export class ToolRegistry {
|
|
234
|
+
private readonly definitions = new Map<string, ToolDefinition>();
|
|
235
|
+
|
|
236
|
+
/** Register a definition. Throws synchronously on a duplicate name — names are unique and stable by construction, not by convention. */
|
|
237
|
+
register<TInput extends z.ZodType, TResult extends z.ZodType, TErrorCode extends string>(
|
|
238
|
+
def: ToolDefinition<TInput, TResult, TErrorCode>,
|
|
239
|
+
): void {
|
|
240
|
+
if (this.definitions.has(def.name)) {
|
|
241
|
+
throw new Error(
|
|
242
|
+
`ToolRegistry.register: "${def.name}" is already registered — operation names ` +
|
|
243
|
+
'must be unique and stable.',
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
this.definitions.set(def.name, def as unknown as ToolDefinition);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Enumerate every registered operation's metadata. Never invokes `impl`. */
|
|
250
|
+
listOperations(): ToolSummary[] {
|
|
251
|
+
return [...this.definitions.values()].map(toSummary);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Look up one operation's full definition (including `impl`) by name, or `undefined`. */
|
|
255
|
+
getOperation(name: string): ToolDefinition | undefined {
|
|
256
|
+
return this.definitions.get(name);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
has(name: string): boolean {
|
|
260
|
+
return this.definitions.has(name);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Validate `input` against the named operation's input schema, run its
|
|
265
|
+
* `impl`, validate the return value against its result schema, and return
|
|
266
|
+
* a uniform `ToolOutcome` — success or a `StructuredOperationError`.
|
|
267
|
+
* Never throws for an expected failure (unknown name, bad input, impl
|
|
268
|
+
* throw, bad output); those are exactly what this method exists to turn
|
|
269
|
+
* into a machine-readable result instead of an exception a caller has to
|
|
270
|
+
* parse prose out of.
|
|
271
|
+
*/
|
|
272
|
+
async dispatch<TResult = unknown>(
|
|
273
|
+
name: string,
|
|
274
|
+
input: unknown,
|
|
275
|
+
ctx: ToolContext = {},
|
|
276
|
+
): Promise<ToolOutcome<TResult>> {
|
|
277
|
+
const def = this.definitions.get(name);
|
|
278
|
+
if (!def) {
|
|
279
|
+
return {
|
|
280
|
+
ok: false,
|
|
281
|
+
error: {
|
|
282
|
+
code: CORE_ERROR_CODES.OPERATION_NOT_FOUND,
|
|
283
|
+
message: `No operation is registered as "${name}".`,
|
|
284
|
+
data: { name },
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const parsedInput = def.input.safeParse(input);
|
|
290
|
+
if (!parsedInput.success) {
|
|
291
|
+
return {
|
|
292
|
+
ok: false,
|
|
293
|
+
error: {
|
|
294
|
+
code: CORE_ERROR_CODES.INVALID_INPUT,
|
|
295
|
+
message: `Input for "${name}" failed schema validation.`,
|
|
296
|
+
issues: toStructuredIssues(parsedInput.error.issues),
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
const strippedPath = firstStrippedInputPath(input, parsedInput.data);
|
|
301
|
+
if (strippedPath) {
|
|
302
|
+
return {
|
|
303
|
+
ok: false,
|
|
304
|
+
error: {
|
|
305
|
+
code: CORE_ERROR_CODES.INVALID_INPUT,
|
|
306
|
+
message: `Input for "${name}" contains an unknown field.`,
|
|
307
|
+
issues: [
|
|
308
|
+
{
|
|
309
|
+
path: strippedPath,
|
|
310
|
+
message: 'Unknown input field. Check spelling; unknown fields are never ignored.',
|
|
311
|
+
code: 'unrecognized_key',
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
let rawResult: unknown;
|
|
319
|
+
try {
|
|
320
|
+
rawResult = await def.impl(parsedInput.data, ctx);
|
|
321
|
+
} catch (err) {
|
|
322
|
+
return { ok: false, error: normalizeThrown(def, err) };
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const parsedResult = def.result.safeParse(rawResult);
|
|
326
|
+
if (!parsedResult.success) {
|
|
327
|
+
return {
|
|
328
|
+
ok: false,
|
|
329
|
+
error: {
|
|
330
|
+
code: CORE_ERROR_CODES.INVALID_OUTPUT,
|
|
331
|
+
message: `Result of "${name}" failed schema validation (implementation bug).`,
|
|
332
|
+
issues: toStructuredIssues(parsedResult.error.issues),
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return { ok: true, data: parsedResult.data as TResult };
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export type { ExecutionHost, ExecutionRequirements, ToolContext, ToolNamespace };
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared vocabulary for the operation registry (B1).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** The four namespaces every operation name must live under (§5.7). */
|
|
6
|
+
export const TOOL_NAMESPACES = ['project', 'editor', 'play', 'cinematic'] as const;
|
|
7
|
+
export type ToolNamespace = (typeof TOOL_NAMESPACES)[number];
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Which of the three hosts an operation executes on (§8 B1, the
|
|
11
|
+
* review-hardened addition):
|
|
12
|
+
* - `node` — runs in the SDK's own Node process against files (or, for
|
|
13
|
+
* long-running jobs like `cinematic.render`, launches its own browser).
|
|
14
|
+
* - `editor-browser` — invoked through the existing
|
|
15
|
+
* `POST /__editor/command` SSE relay in
|
|
16
|
+
* `packages/editor-core/server/editor-server.ts`, which broadcasts to the
|
|
17
|
+
* connected browser editor and awaits its callback under a short timeout
|
|
18
|
+
* (~5s; 120s for `play`). The projection generates the relay stub.
|
|
19
|
+
* - `runtime-page` — invoked through the play/render harness in a launched
|
|
20
|
+
* runtime page.
|
|
21
|
+
*
|
|
22
|
+
* `cinematic.render` is pinned `node` and MUST NOT ride the editor relay's
|
|
23
|
+
* short timeout — it is a long-running job (see `longRunning` on
|
|
24
|
+
* `ToolDefinition`).
|
|
25
|
+
*/
|
|
26
|
+
export type ExecutionHost = 'node' | 'editor-browser' | 'runtime-page';
|
|
27
|
+
|
|
28
|
+
/** Which live contexts an operation needs before it can run. */
|
|
29
|
+
export interface ExecutionRequirements {
|
|
30
|
+
/** Needs a project directory on disk (no editor process required). */
|
|
31
|
+
project?: boolean;
|
|
32
|
+
/** Needs an existing, connected editor session. */
|
|
33
|
+
editor?: boolean;
|
|
34
|
+
/** Needs a playable runtime (starts or targets one). */
|
|
35
|
+
play?: boolean;
|
|
36
|
+
/** Needs a controlled render runtime. */
|
|
37
|
+
render?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Coarse risk classification surfaced to permission-gated callers (agents, HTTP/MCP auth). */
|
|
41
|
+
export type PermissionRisk = 'read' | 'write' | 'destructive';
|
|
42
|
+
|
|
43
|
+
export interface PermissionMetadata {
|
|
44
|
+
risk: PermissionRisk;
|
|
45
|
+
/** Human summary of what this operation is permitted to touch or do. */
|
|
46
|
+
summary: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** One completed file handed to the host-managed generated-output boundary. */
|
|
50
|
+
export interface ProjectOutputFile {
|
|
51
|
+
/** Project-relative destination. Slice 1 deliberately permits only public/**. */
|
|
52
|
+
path: string;
|
|
53
|
+
content: string | Uint8Array;
|
|
54
|
+
mediaType?: string;
|
|
55
|
+
role?: 'asset' | 'provenance' | 'other';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** JSON-safe summary returned after an atomic generated-output transaction. */
|
|
59
|
+
export interface ProjectGeneratedOutputFile {
|
|
60
|
+
path: string;
|
|
61
|
+
bytes: number;
|
|
62
|
+
mediaType?: string;
|
|
63
|
+
role?: ProjectOutputFile['role'];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface ProjectGeneratedOutput {
|
|
67
|
+
files: ProjectGeneratedOutputFile[];
|
|
68
|
+
totalBytes: number;
|
|
69
|
+
dryRun: boolean;
|
|
70
|
+
/** Host-created logical record in .volter/provenance.json; absent for dry runs. */
|
|
71
|
+
provenanceOperationId?: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface ProjectProviderExecution {
|
|
75
|
+
mode: 'mock' | 'direct' | 'managed';
|
|
76
|
+
provider: string;
|
|
77
|
+
operation?: string;
|
|
78
|
+
model?: string;
|
|
79
|
+
requestId?: string;
|
|
80
|
+
taskId?: string;
|
|
81
|
+
managedJobId?: string;
|
|
82
|
+
/** Route-aware charge snapshot when this execution produced accepted output. */
|
|
83
|
+
billing?: import('../generations.js').GenerationBilling;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Facts the operation host already owns and stamps onto every committed batch. */
|
|
87
|
+
export interface ProjectOutputProvenanceContext {
|
|
88
|
+
operationName: string;
|
|
89
|
+
operationSource?: string;
|
|
90
|
+
/** Sanitized facts for a single provider execution. */
|
|
91
|
+
execution?: ProjectProviderExecution;
|
|
92
|
+
/** Ordered facts for a native multi-task pipeline that produced one output batch. */
|
|
93
|
+
executions?: readonly ProjectProviderExecution[];
|
|
94
|
+
/** WHICH editor session produced the bytes, for a `project.session.write`
|
|
95
|
+
* batch — the kind whose producer is a script an agent ran inside a live
|
|
96
|
+
* session rather than an operation that ran here. Shape and meaning:
|
|
97
|
+
* `project/provenance.ts`'s `ProjectProvenanceSessionSchema`, which is the
|
|
98
|
+
* validated form; this mirror exists because `types.ts` carries no zod. */
|
|
99
|
+
session?: {
|
|
100
|
+
id: string;
|
|
101
|
+
port: number;
|
|
102
|
+
revision: number;
|
|
103
|
+
callId?: string;
|
|
104
|
+
};
|
|
105
|
+
/** Schema-validated, JSON-safe operation input. */
|
|
106
|
+
input?: unknown;
|
|
107
|
+
/** Project-relative paths of the project FILES these bytes were produced
|
|
108
|
+
* from — a session-written GLB names the `src/models/<name>.blend` it was
|
|
109
|
+
* exported from. Shape and meaning: `project/provenance.ts`'s `inputs`,
|
|
110
|
+
* which is the validated form; this mirror exists because `types.ts`
|
|
111
|
+
* carries no zod. It is what lets a reader drill DOWN by kind from a
|
|
112
|
+
* prefab's glTF to the model it came from. */
|
|
113
|
+
inputs?: readonly string[];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Host capability supplied only to Node-hosted project operations. Generator
|
|
118
|
+
* implementations may stay ordinary native JS; their thin operation wrapper
|
|
119
|
+
* calls this once it has a complete batch ready to commit.
|
|
120
|
+
*/
|
|
121
|
+
export interface ProjectOutputWriter {
|
|
122
|
+
write(
|
|
123
|
+
files: readonly ProjectOutputFile[],
|
|
124
|
+
options?: { dryRun?: boolean },
|
|
125
|
+
): Promise<ProjectGeneratedOutput>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Runtime context passed to every operation's `impl`. Intentionally an open
|
|
130
|
+
* record (`[key: string]: unknown`) — later units (B2-B8) will grow this with
|
|
131
|
+
* concrete fields (editor session ids, play session handles, render job
|
|
132
|
+
* state); B1 only needs the two seams its sample operations touch.
|
|
133
|
+
*/
|
|
134
|
+
export interface ToolContext {
|
|
135
|
+
/** Absolute path to the target project's root, for `project`-context ops. */
|
|
136
|
+
projectRoot?: string;
|
|
137
|
+
/** Base URL of a connected editor session, for `editor`-context ops. */
|
|
138
|
+
editorUrl?: string;
|
|
139
|
+
/** Cooperative cancellation for long-running (`node`, `longRunning`) ops. */
|
|
140
|
+
signal?: AbortSignal;
|
|
141
|
+
/** Atomic writer for generated project assets (Node project operations). */
|
|
142
|
+
projectOutputs?: ProjectOutputWriter;
|
|
143
|
+
/** WHICH mounted instance a game-driving tool should address, when the
|
|
144
|
+
* editor has several live (multiplayer authoring). A tool that drives the
|
|
145
|
+
* game binds `game.instance(ctx.instance)` from it; omitted means the sole
|
|
146
|
+
* live instance. */
|
|
147
|
+
instance?: string;
|
|
148
|
+
/** The HOST's project-module loader (the editor server's Vite SSR loader,
|
|
149
|
+
* wrapped with dependency-change invalidation). A tool that imports the
|
|
150
|
+
* project's own source at run time — `project.bake.preview` importing
|
|
151
|
+
* `src/models/barrel.ts` — MUST load through this rather than a raw
|
|
152
|
+
* `import()`: Node's ESM cache never invalidates, so a raw import returned
|
|
153
|
+
* the FIRST version of a model for the life of the server and every later
|
|
154
|
+
* edit re-rendered byte-identical until the editor's `restart` command (measured on the
|
|
155
|
+
* blind modeling bench, 2026-09-05: three restarts in one barrel). Absent
|
|
156
|
+
* only when the tool runs outside an editor server. */
|
|
157
|
+
loadProjectModule?: (absolutePath: string) => Promise<unknown>;
|
|
158
|
+
[key: string]: unknown;
|
|
159
|
+
}
|