@volter/sdk 0.0.0-stage → 0.5.204
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 +1168 -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 +329 -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 +669 -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,14 @@
|
|
|
1
|
+
/** Browser fetch owns connections and has no Node header timeout. */
|
|
2
|
+
import type { Dispatcher } from 'undici';
|
|
3
|
+
|
|
4
|
+
export function createDispatcher(_timeoutMs: number): undefined {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function dispatchFetch(
|
|
9
|
+
url: string,
|
|
10
|
+
init?: RequestInit,
|
|
11
|
+
_dispatcher?: Dispatcher,
|
|
12
|
+
): Promise<Response> {
|
|
13
|
+
return fetch(url, init);
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Node session clients need explicit header deadlines for long modeling calls.
|
|
2
|
+
* Some runtimes supply an undici-compatible Agent without destroy(); callers
|
|
3
|
+
* close explicitly when that lifecycle method exists. */
|
|
4
|
+
import { Agent, fetch as nodeFetch, type Dispatcher } from 'undici';
|
|
5
|
+
|
|
6
|
+
export function createDispatcher(timeoutMs: number): Dispatcher {
|
|
7
|
+
return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function dispatchFetch(
|
|
11
|
+
url: string,
|
|
12
|
+
init?: RequestInit,
|
|
13
|
+
dispatcher?: Dispatcher,
|
|
14
|
+
): Promise<Response> {
|
|
15
|
+
if (!dispatcher) return fetch(url, init);
|
|
16
|
+
return await nodeFetch(url, {
|
|
17
|
+
...(init as object), dispatcher,
|
|
18
|
+
}) as unknown as Response;
|
|
19
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
GenerationBilling,
|
|
3
|
+
GenerationJob,
|
|
4
|
+
GenerationJobStatus,
|
|
5
|
+
GenerationJobsDocument,
|
|
6
|
+
} from '@volter/sdk/generations';
|
|
7
|
+
export type {
|
|
8
|
+
EditorEnvelopeObservation,
|
|
9
|
+
GameDebugDoor,
|
|
10
|
+
HistoryStep,
|
|
11
|
+
OpenedDocument,
|
|
12
|
+
} from './client.js';
|
|
13
|
+
export { EditorClient, EditorCommandError } from './client.js';
|
|
14
|
+
export type {
|
|
15
|
+
ToolAssetInspectorContributionMatch,
|
|
16
|
+
ToolAssetInspectorContributionProps,
|
|
17
|
+
ToolContributionAsset,
|
|
18
|
+
ToolContributionNode,
|
|
19
|
+
ToolContributionProps,
|
|
20
|
+
ToolGenerationResultContributionProps,
|
|
21
|
+
ToolInspectorContributionMatch,
|
|
22
|
+
ToolInspectorContributionProps,
|
|
23
|
+
} from './contributions.js';
|
|
24
|
+
export type {
|
|
25
|
+
DocumentClickStep,
|
|
26
|
+
DocumentKeyStep,
|
|
27
|
+
DocumentPasteStep,
|
|
28
|
+
DocumentProbeResult,
|
|
29
|
+
DocumentProbeScope,
|
|
30
|
+
DocumentProbeStep,
|
|
31
|
+
DocumentQueryStep,
|
|
32
|
+
DocumentSelectStep,
|
|
33
|
+
DocumentTypeStep,
|
|
34
|
+
ProbedElement,
|
|
35
|
+
} from './document-probe.js';
|
|
36
|
+
export { EDITOR_VIEW_DIAGNOSTICS, editorViewFromUrl, editorViewUrl } from './editor-view.js';
|
|
37
|
+
export type { ExtensionContributionState } from './extension.js';
|
|
38
|
+
export type {
|
|
39
|
+
ActiveDocumentCapture,
|
|
40
|
+
AssetCompareCapture,
|
|
41
|
+
AssetCompareOptions,
|
|
42
|
+
AssetCompareView,
|
|
43
|
+
AssetKind,
|
|
44
|
+
AssetPreviewBackground,
|
|
45
|
+
AssetPreviewCameraChoice,
|
|
46
|
+
AssetPreviewCapture,
|
|
47
|
+
AssetPreviewOptions,
|
|
48
|
+
AssetPreviewOrientation,
|
|
49
|
+
AssetPreviewPose,
|
|
50
|
+
AssetPreviewShotSetDefinition,
|
|
51
|
+
AssetPreviewShotWarning,
|
|
52
|
+
AssetPreviewSource,
|
|
53
|
+
AssetPreviewStage,
|
|
54
|
+
AssetPreviewView,
|
|
55
|
+
CaptureDimensions,
|
|
56
|
+
DocumentCameraPose,
|
|
57
|
+
DocumentLookOutcome,
|
|
58
|
+
StageFrameCostReading,
|
|
59
|
+
DocumentTableEntryProjection,
|
|
60
|
+
DocumentTableProjection,
|
|
61
|
+
EditorCameraState,
|
|
62
|
+
EditorChromeCapture,
|
|
63
|
+
EditorChromeCaptureOptions,
|
|
64
|
+
EditorEntitySummary,
|
|
65
|
+
EditorState,
|
|
66
|
+
EditorView,
|
|
67
|
+
EditorViewBuiltInUtilityId,
|
|
68
|
+
EditorViewDocument,
|
|
69
|
+
EditorViewUtility,
|
|
70
|
+
EditorWorkspaceName,
|
|
71
|
+
GameCapture,
|
|
72
|
+
GameplayRecordingCapture,
|
|
73
|
+
GameplayRecordingOptions,
|
|
74
|
+
GameplayRecordingStarted,
|
|
75
|
+
GameplayRecordingTimeline,
|
|
76
|
+
GameplayReplayCapture,
|
|
77
|
+
HelperVisibility,
|
|
78
|
+
InspectedAction,
|
|
79
|
+
InspectedField,
|
|
80
|
+
InspectedFieldWrite,
|
|
81
|
+
InspectedHierarchy,
|
|
82
|
+
InspectedHierarchyRow,
|
|
83
|
+
InspectedInspection,
|
|
84
|
+
InspectedNothing,
|
|
85
|
+
InspectedSection,
|
|
86
|
+
InspectedSectionBody,
|
|
87
|
+
InspectedSubject,
|
|
88
|
+
InspectedWriteDestination,
|
|
89
|
+
InspectionPresentationKind,
|
|
90
|
+
InspectionSurface,
|
|
91
|
+
LabeledShotSetCapture,
|
|
92
|
+
ModelPlayLogEntry,
|
|
93
|
+
ModelPlayLogReading,
|
|
94
|
+
PlayRecordingStatus,
|
|
95
|
+
PlayStarted,
|
|
96
|
+
PresentedEditorView,
|
|
97
|
+
ProjectInfo,
|
|
98
|
+
ProjectTemplate,
|
|
99
|
+
ProjectToolCatalog,
|
|
100
|
+
ProjectToolCatalogEntry,
|
|
101
|
+
ProjectToolContribution,
|
|
102
|
+
ProjectToolOutcome,
|
|
103
|
+
RecentProject,
|
|
104
|
+
ShadingMode,
|
|
105
|
+
ShotSetPoseMorph,
|
|
106
|
+
ShotSetPoseRotation,
|
|
107
|
+
ShotSetPoseStep,
|
|
108
|
+
ShotSetPoseTranslation,
|
|
109
|
+
ShotSetShot,
|
|
110
|
+
StoryCaptureOptions,
|
|
111
|
+
StoryVariantCapture,
|
|
112
|
+
StoryVariantImage,
|
|
113
|
+
StructureOp,
|
|
114
|
+
StructureOpOptions,
|
|
115
|
+
StructureOpResult,
|
|
116
|
+
TransformMode,
|
|
117
|
+
TransformSpace,
|
|
118
|
+
Vec3Value,
|
|
119
|
+
ViewPreset,
|
|
120
|
+
ViewportCapture,
|
|
121
|
+
ViewportTab,
|
|
122
|
+
} from './types.js';
|
|
123
|
+
export {
|
|
124
|
+
EDITOR_VIEW_BUILT_IN_UTILITY_IDS,
|
|
125
|
+
EDITOR_VIEW_DOCUMENT_KINDS,
|
|
126
|
+
EDITOR_VIEW_KEYS,
|
|
127
|
+
EDITOR_VIEW_TOOL_UTILITY_PREFIX,
|
|
128
|
+
EDITOR_VIEW_WORKSPACE_DOCUMENT_IDS,
|
|
129
|
+
isEditorViewDocumentKind,
|
|
130
|
+
isEditorViewUtility,
|
|
131
|
+
} from './types.js';
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The human-facing projection of the ingest coverage report.
|
|
3
|
+
*
|
|
4
|
+
* The report is derived in `coverage/capability-coverage.ts`; this component never
|
|
5
|
+
* re-measures or reinterprets a seam. It only gives the same rows already
|
|
6
|
+
* exposed by the editor's `status` command and the console an Inspector-shaped reading: the
|
|
7
|
+
* measured fact first, then the consequence and the concrete fix for gaps.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
faChartSimple,
|
|
12
|
+
faCircleCheck,
|
|
13
|
+
faCircleExclamation,
|
|
14
|
+
faCircleInfo,
|
|
15
|
+
faCircleMinus,
|
|
16
|
+
} from '@fortawesome/free-solid-svg-icons';
|
|
17
|
+
import type { LiveCoverageReport, LiveCoverageRow } from '@volter/sdk/host';
|
|
18
|
+
import { EditorIcon, SectionHeader, themeVars } from '@volter/sdk/widgets';
|
|
19
|
+
import type { ReactNode } from 'react';
|
|
20
|
+
import type { InspectionSection } from '@volter/sdk/kit/inspection-model';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Human labels for the seams whose names are not self-describing — the contract
|
|
24
|
+
* declarations an ingested game makes.
|
|
25
|
+
*
|
|
26
|
+
* The `editor.*` and `system.*` families are deliberately NOT listed: those are
|
|
27
|
+
* generated from the `AuthoringAdapter` / `SystemAdapters` contracts, and a
|
|
28
|
+
* hand-written label map over a generated family is the same defect the
|
|
29
|
+
* generator exists to remove — the map would silently miss whichever seam
|
|
30
|
+
* nobody remembered, in the one surface a human reads. They are humanized from
|
|
31
|
+
* the seam name instead, which cannot go stale.
|
|
32
|
+
*/
|
|
33
|
+
const CONTRACT_SEAM_LABEL: Partial<Record<string, string>> = {
|
|
34
|
+
loop: 'Loop control',
|
|
35
|
+
'contract.root': 'DOM root',
|
|
36
|
+
'contract.lifecycle.start': 'Cold start',
|
|
37
|
+
'contract.lifecycle.pause': 'Pause / resume',
|
|
38
|
+
persistence: 'Source persistence',
|
|
39
|
+
systems: 'Commands and state',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** `editor.assetDrop` → "Asset drop"; `system.renderDebug` → "Render debug
|
|
43
|
+
* adapter". Presentation only — the seam name itself stays the id. */
|
|
44
|
+
function seamLabel(seam: string): string {
|
|
45
|
+
const explicit = CONTRACT_SEAM_LABEL[seam];
|
|
46
|
+
if (explicit) return explicit;
|
|
47
|
+
const [family, member] = seam.split('.');
|
|
48
|
+
const words = (member ?? seam).replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
|
|
49
|
+
const sentence = words.charAt(0).toUpperCase() + words.slice(1);
|
|
50
|
+
return family === 'system' ? `${sentence} adapter` : sentence;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const STATUS_ICON = {
|
|
54
|
+
ok: faCircleCheck,
|
|
55
|
+
gap: faCircleExclamation,
|
|
56
|
+
na: faCircleMinus,
|
|
57
|
+
info: faCircleInfo,
|
|
58
|
+
} as const;
|
|
59
|
+
|
|
60
|
+
const STATUS_COLOR = {
|
|
61
|
+
ok: themeVars.semantic.success,
|
|
62
|
+
gap: themeVars.semantic.warning,
|
|
63
|
+
na: themeVars.content.dim,
|
|
64
|
+
info: themeVars.content.dim,
|
|
65
|
+
} as const;
|
|
66
|
+
|
|
67
|
+
function CoverageRow({ row }: { readonly row: LiveCoverageRow }) {
|
|
68
|
+
return (
|
|
69
|
+
<div
|
|
70
|
+
data-testid={`ingest-coverage-row-${row.seam}`}
|
|
71
|
+
data-status={row.status}
|
|
72
|
+
style={{
|
|
73
|
+
display: 'grid',
|
|
74
|
+
gridTemplateColumns: '16px minmax(0, 1fr)',
|
|
75
|
+
gap: 7,
|
|
76
|
+
padding: '8px 10px',
|
|
77
|
+
borderTop: '1px solid var(--volter-structural-divider)',
|
|
78
|
+
}}
|
|
79
|
+
>
|
|
80
|
+
<span style={{ color: STATUS_COLOR[row.status], paddingTop: 1 }}>
|
|
81
|
+
<EditorIcon icon={STATUS_ICON[row.status]} />
|
|
82
|
+
</span>
|
|
83
|
+
<div style={{ minWidth: 0 }}>
|
|
84
|
+
<div style={{ color: themeVars.content.primary, fontWeight: 600 }}>
|
|
85
|
+
{seamLabel(row.seam)}
|
|
86
|
+
</div>
|
|
87
|
+
<div
|
|
88
|
+
style={{
|
|
89
|
+
marginTop: 2,
|
|
90
|
+
color: themeVars.content.muted,
|
|
91
|
+
lineHeight: 1.4,
|
|
92
|
+
overflowWrap: 'anywhere',
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
{row.detail}
|
|
96
|
+
</div>
|
|
97
|
+
{row.missing && (
|
|
98
|
+
<div style={{ marginTop: 6, color: themeVars.content.muted, lineHeight: 1.4 }}>
|
|
99
|
+
<strong style={{ color: themeVars.semantic.warning }}>Missing:</strong> {row.missing}
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
102
|
+
{row.fix && (
|
|
103
|
+
<div style={{ marginTop: 4, color: themeVars.content.dim, lineHeight: 1.4 }}>
|
|
104
|
+
<strong>Fix:</strong> {row.fix}
|
|
105
|
+
</div>
|
|
106
|
+
)}
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function CapabilityCoverageBody({ report }: { readonly report: LiveCoverageReport }) {
|
|
113
|
+
const { summary } = report;
|
|
114
|
+
return (
|
|
115
|
+
<div data-testid="ingest-coverage-report" style={{ fontSize: 'var(--volter-font-base)' }}>
|
|
116
|
+
<div
|
|
117
|
+
style={{
|
|
118
|
+
display: 'flex',
|
|
119
|
+
flexWrap: 'wrap',
|
|
120
|
+
gap: 8,
|
|
121
|
+
padding: '7px 10px 9px',
|
|
122
|
+
color: themeVars.content.muted,
|
|
123
|
+
}}
|
|
124
|
+
>
|
|
125
|
+
<span
|
|
126
|
+
style={{
|
|
127
|
+
color: summary.gaps > 0 ? themeVars.semantic.warning : themeVars.semantic.success,
|
|
128
|
+
}}
|
|
129
|
+
>
|
|
130
|
+
{summary.gaps} {summary.gaps === 1 ? 'gap' : 'gaps'}
|
|
131
|
+
</span>
|
|
132
|
+
<span>{summary.ok} integrated</span>
|
|
133
|
+
<span>{summary.na} not applicable</span>
|
|
134
|
+
<span>{summary.info} informational</span>
|
|
135
|
+
</div>
|
|
136
|
+
{report.rows.map((row) => (
|
|
137
|
+
<CoverageRow key={row.seam} row={row} />
|
|
138
|
+
))}
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Add the report to an ordinary composed inspection subject. The stable id
|
|
144
|
+
* means the compact Inspector keeps the same tab open while measurements
|
|
145
|
+
* refresh; sorting keeps the projection content-agnostic. */
|
|
146
|
+
export function ingestCoverageSection(report: LiveCoverageReport): InspectionSection {
|
|
147
|
+
return {
|
|
148
|
+
id: 'ingest-coverage',
|
|
149
|
+
title: 'Ingest coverage',
|
|
150
|
+
icon: faChartSimple,
|
|
151
|
+
order: 9_000,
|
|
152
|
+
description: `${report.summary.gaps} gap${report.summary.gaps === 1 ? '' : 's'}`,
|
|
153
|
+
defaultOpen: true,
|
|
154
|
+
testId: 'ingest-coverage-section',
|
|
155
|
+
body: {
|
|
156
|
+
kind: 'custom',
|
|
157
|
+
render: (): ReactNode => <CapabilityCoverageBody report={report} />,
|
|
158
|
+
// `editor.inspect()` cannot render React. Publish exactly what this body
|
|
159
|
+
// displays so the agent and the human read the same report through the
|
|
160
|
+
// Inspector rather than forcing the agent back to a parallel status
|
|
161
|
+
// shape.
|
|
162
|
+
data: { summary: report.summary, rows: report.rows },
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** The nothing-to-author Inspector has no composed subject/section list, so it uses
|
|
168
|
+
* the same section as a directly headed block instead of inventing a second
|
|
169
|
+
* presentation for the report. */
|
|
170
|
+
export function CapabilityCoverageBlock({ report }: { readonly report: LiveCoverageReport }) {
|
|
171
|
+
const section = ingestCoverageSection(report);
|
|
172
|
+
return (
|
|
173
|
+
<div data-testid={section.testId}>
|
|
174
|
+
<SectionHeader
|
|
175
|
+
label={section.title}
|
|
176
|
+
icon={section.icon}
|
|
177
|
+
description={section.description}
|
|
178
|
+
collapsible
|
|
179
|
+
defaultOpen
|
|
180
|
+
>
|
|
181
|
+
<CapabilityCoverageBody report={report} />
|
|
182
|
+
</SectionHeader>
|
|
183
|
+
</div>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AccountCatalog,
|
|
3
|
+
AccountSpendPolicy,
|
|
4
|
+
AccountUsageEntry,
|
|
5
|
+
EditorAccountSnapshot,
|
|
6
|
+
GenerationAccountProjection,
|
|
7
|
+
GenerationExecutionRoute,
|
|
8
|
+
ProviderCredentialId,
|
|
9
|
+
ProviderCredentialTestResult,
|
|
10
|
+
} from '@volter/sdk/account';
|
|
11
|
+
import {
|
|
12
|
+
AccountCatalogSchema,
|
|
13
|
+
AccountUsageEntrySchema,
|
|
14
|
+
EditorAccountSnapshotSchema,
|
|
15
|
+
generationAccountProjection,
|
|
16
|
+
ProviderCredentialTestResultSchema,
|
|
17
|
+
} from '@volter/sdk/account';
|
|
18
|
+
import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
|
|
19
|
+
import { COLLABORATION_REMOTE_SHARE } from '@volter/sdk/kit/editor-session-attribution';
|
|
20
|
+
|
|
21
|
+
const EMPTY: EditorAccountSnapshot = {
|
|
22
|
+
authenticated: false,
|
|
23
|
+
backend: 'mock',
|
|
24
|
+
accountEnvironment: 'test-mock',
|
|
25
|
+
routes: { mock: true, managed: false, byok: false, byokProviders: [] },
|
|
26
|
+
preferredRoute: 'auto',
|
|
27
|
+
providerCredentials: [],
|
|
28
|
+
codingInference: { enabled: false, provider: 'openrouter', model: 'z-ai/glm-5.2' },
|
|
29
|
+
};
|
|
30
|
+
let snapshot: EditorAccountSnapshot = EMPTY;
|
|
31
|
+
let version = 0;
|
|
32
|
+
let error: string | null = null;
|
|
33
|
+
const listeners = new Set<() => void>();
|
|
34
|
+
|
|
35
|
+
function publish(next: EditorAccountSnapshot, nextError: string | null = null) {
|
|
36
|
+
// Polling identical state must not invalidate every contribution. Parsed
|
|
37
|
+
// snapshots have the schema's stable field order; errors are state too.
|
|
38
|
+
if (error === nextError && JSON.stringify(snapshot) === JSON.stringify(next)) return;
|
|
39
|
+
snapshot = next;
|
|
40
|
+
error = nextError;
|
|
41
|
+
version++;
|
|
42
|
+
for (const listener of listeners) listener();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Every route below reads the account service's OWN `{ error }` body on a
|
|
46
|
+
// non-OK status (that string is the user-facing message — "Insufficient
|
|
47
|
+
// credits", not "402"), so each one asserts only that the EDITOR SERVER
|
|
48
|
+
// answered, before parsing. See `editor-server-response.ts`.
|
|
49
|
+
async function responseSnapshot(response: Response, what: string): Promise<EditorAccountSnapshot> {
|
|
50
|
+
assertEditorServerAnswered(response, what);
|
|
51
|
+
const body = (await response.json()) as EditorAccountSnapshot | { error?: unknown };
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
typeof (body as { error?: unknown }).error === 'string'
|
|
55
|
+
? String((body as { error?: unknown }).error)
|
|
56
|
+
: `Account request failed (${response.status}).`,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return EditorAccountSnapshotSchema.parse(body);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function mutate(path: string, method: 'POST' | 'PUT' | 'DELETE', body?: unknown) {
|
|
63
|
+
const response = await fetch(path, {
|
|
64
|
+
method,
|
|
65
|
+
...(body === undefined
|
|
66
|
+
? {}
|
|
67
|
+
: { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }),
|
|
68
|
+
});
|
|
69
|
+
const next = await responseSnapshot(response, `${method} ${path} failed`);
|
|
70
|
+
publish(next);
|
|
71
|
+
return next;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function accountSnapshot(): EditorAccountSnapshot {
|
|
75
|
+
return snapshot;
|
|
76
|
+
}
|
|
77
|
+
/** The deliberately narrow, non-PII account view exposed to project code. */
|
|
78
|
+
export function contributionAccount(): GenerationAccountProjection {
|
|
79
|
+
return generationAccountProjection(snapshot);
|
|
80
|
+
}
|
|
81
|
+
export function accountVersion(): number {
|
|
82
|
+
return version;
|
|
83
|
+
}
|
|
84
|
+
export function accountError(): string | null {
|
|
85
|
+
return error;
|
|
86
|
+
}
|
|
87
|
+
export function subscribeAccount(listener: () => void): () => void {
|
|
88
|
+
listeners.add(listener);
|
|
89
|
+
return () => listeners.delete(listener);
|
|
90
|
+
}
|
|
91
|
+
export async function refreshAccount(): Promise<EditorAccountSnapshot> {
|
|
92
|
+
try {
|
|
93
|
+
const next = await responseSnapshot(await fetch('/__editor/account'), 'Account read failed');
|
|
94
|
+
publish(next);
|
|
95
|
+
return next;
|
|
96
|
+
} catch (cause) {
|
|
97
|
+
publish(snapshot, cause instanceof Error ? cause.message : String(cause));
|
|
98
|
+
throw cause;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export const signInMockAccount = (email: string) =>
|
|
102
|
+
mutate('/__editor/account/mock-session', 'POST', { email });
|
|
103
|
+
export const signInTwinAccount = (email: string) =>
|
|
104
|
+
mutate('/__editor/account/twin-session', 'POST', { email });
|
|
105
|
+
export const signOutAccount = () => mutate('/__editor/account/session', 'DELETE');
|
|
106
|
+
export const updateAccountSpendPolicy = (policy: AccountSpendPolicy) =>
|
|
107
|
+
mutate('/__editor/account/spend-policy', 'PUT', policy);
|
|
108
|
+
export const markAccountAlertsRead = () => mutate('/__editor/account/alerts/read', 'POST');
|
|
109
|
+
export const updatePreferredGenerationRoute = (route: GenerationExecutionRoute) =>
|
|
110
|
+
mutate('/__editor/account/execution-route', 'PUT', { route });
|
|
111
|
+
export const updateCodingInference = (input: EditorAccountSnapshot['codingInference']) =>
|
|
112
|
+
mutate('/__editor/account/coding-inference', 'PUT', input);
|
|
113
|
+
export async function quoteCodingInference(input: {
|
|
114
|
+
model: string;
|
|
115
|
+
promptTokens: number;
|
|
116
|
+
outputTokens: number;
|
|
117
|
+
}): Promise<{
|
|
118
|
+
model: string;
|
|
119
|
+
promptTokens: number;
|
|
120
|
+
outputTokens: number;
|
|
121
|
+
providerAmountUsd: number;
|
|
122
|
+
estimatedCredits: number;
|
|
123
|
+
}> {
|
|
124
|
+
const response = await fetch('/__editor/account/coding-inference/quote', {
|
|
125
|
+
method: 'POST',
|
|
126
|
+
headers: { 'Content-Type': 'application/json' },
|
|
127
|
+
body: JSON.stringify(input),
|
|
128
|
+
});
|
|
129
|
+
assertEditorServerAnswered(response, 'Coding quote failed');
|
|
130
|
+
const body = (await response.json()) as {
|
|
131
|
+
model?: unknown;
|
|
132
|
+
promptTokens?: unknown;
|
|
133
|
+
outputTokens?: unknown;
|
|
134
|
+
providerAmountUsd?: unknown;
|
|
135
|
+
estimatedCredits?: unknown;
|
|
136
|
+
error?: unknown;
|
|
137
|
+
};
|
|
138
|
+
if (
|
|
139
|
+
!response.ok ||
|
|
140
|
+
typeof body.model !== 'string' ||
|
|
141
|
+
typeof body.promptTokens !== 'number' ||
|
|
142
|
+
typeof body.outputTokens !== 'number' ||
|
|
143
|
+
typeof body.providerAmountUsd !== 'number' ||
|
|
144
|
+
typeof body.estimatedCredits !== 'number'
|
|
145
|
+
) {
|
|
146
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Coding quote failed.');
|
|
147
|
+
}
|
|
148
|
+
return body as {
|
|
149
|
+
model: string;
|
|
150
|
+
promptTokens: number;
|
|
151
|
+
outputTokens: number;
|
|
152
|
+
providerAmountUsd: number;
|
|
153
|
+
estimatedCredits: number;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export const saveProviderCredential = (provider: ProviderCredentialId, key: string) =>
|
|
157
|
+
mutate(`/__editor/account/provider-credentials/${encodeURIComponent(provider)}`, 'PUT', { key });
|
|
158
|
+
export const removeProviderCredential = (provider: ProviderCredentialId) =>
|
|
159
|
+
mutate(`/__editor/account/provider-credentials/${encodeURIComponent(provider)}`, 'DELETE');
|
|
160
|
+
export async function testProviderCredential(
|
|
161
|
+
provider: ProviderCredentialId,
|
|
162
|
+
): Promise<ProviderCredentialTestResult> {
|
|
163
|
+
const response = await fetch(
|
|
164
|
+
`/__editor/account/provider-credentials/${encodeURIComponent(provider)}/test`,
|
|
165
|
+
{ method: 'POST' },
|
|
166
|
+
);
|
|
167
|
+
assertEditorServerAnswered(response, 'Credential test failed');
|
|
168
|
+
const body = (await response.json()) as ProviderCredentialTestResult & { error?: unknown };
|
|
169
|
+
if (!response.ok) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
typeof body.error === 'string' ? body.error : `Credential test failed (${response.status}).`,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
return ProviderCredentialTestResultSchema.parse(body);
|
|
175
|
+
}
|
|
176
|
+
export const updateAccountPlan = (action: 'cancel' | 'resume') =>
|
|
177
|
+
mutate('/__editor/account/plan', 'PUT', { action });
|
|
178
|
+
async function checkoutAction(
|
|
179
|
+
path: string,
|
|
180
|
+
body: unknown,
|
|
181
|
+
): Promise<{ checkoutUrl?: string; mock: boolean }> {
|
|
182
|
+
const response = await fetch(path, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers: {
|
|
185
|
+
'Content-Type': 'application/json',
|
|
186
|
+
'Idempotency-Key': crypto.randomUUID(),
|
|
187
|
+
},
|
|
188
|
+
body: JSON.stringify(body),
|
|
189
|
+
});
|
|
190
|
+
assertEditorServerAnswered(response, 'Checkout failed');
|
|
191
|
+
const result = (await response.json()) as {
|
|
192
|
+
account?: unknown;
|
|
193
|
+
checkoutUrl?: unknown;
|
|
194
|
+
mock?: unknown;
|
|
195
|
+
error?: unknown;
|
|
196
|
+
};
|
|
197
|
+
if (!response.ok || !result.account) {
|
|
198
|
+
throw new Error(typeof result.error === 'string' ? result.error : 'Checkout failed.');
|
|
199
|
+
}
|
|
200
|
+
publish(EditorAccountSnapshotSchema.parse(result.account));
|
|
201
|
+
return {
|
|
202
|
+
...(typeof result.checkoutUrl === 'string' ? { checkoutUrl: result.checkoutUrl } : {}),
|
|
203
|
+
mock: result.mock === true,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
export const checkoutAccountPlan = (plan: string) =>
|
|
207
|
+
checkoutAction('/__editor/account/checkout', { plan });
|
|
208
|
+
export const purchaseAccountCredits = (packId: string) =>
|
|
209
|
+
checkoutAction('/__editor/account/credits', { packId });
|
|
210
|
+
export async function fetchAccountUsage(): Promise<AccountUsageEntry[]> {
|
|
211
|
+
const response = await fetch('/__editor/account/usage');
|
|
212
|
+
assertEditorServerAnswered(response, 'Usage failed');
|
|
213
|
+
const body = (await response.json()) as { entries?: AccountUsageEntry[]; error?: unknown };
|
|
214
|
+
if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : 'Usage failed.');
|
|
215
|
+
return AccountUsageEntrySchema.array().parse(body.entries ?? []);
|
|
216
|
+
}
|
|
217
|
+
export async function fetchAccountCatalog(): Promise<AccountCatalog> {
|
|
218
|
+
const response = await fetch('/__editor/account/catalog');
|
|
219
|
+
assertEditorServerAnswered(response, 'Catalog failed');
|
|
220
|
+
const body = (await response.json()) as AccountCatalog & { error?: unknown };
|
|
221
|
+
if (!response.ok)
|
|
222
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Catalog failed.');
|
|
223
|
+
return AccountCatalogSchema.parse(body);
|
|
224
|
+
}
|
|
225
|
+
export async function openAccountBillingPortal(): Promise<{ url: string; mock: boolean }> {
|
|
226
|
+
const response = await fetch('/__editor/account/billing-portal', { method: 'POST' });
|
|
227
|
+
assertEditorServerAnswered(response, 'Billing portal failed');
|
|
228
|
+
const body = (await response.json()) as { url?: unknown; mock?: unknown; error?: unknown };
|
|
229
|
+
if (!response.ok || typeof body.url !== 'string') {
|
|
230
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Billing portal failed.');
|
|
231
|
+
}
|
|
232
|
+
return { url: body.url, mock: body.mock === true };
|
|
233
|
+
}
|
|
234
|
+
export interface DeviceAuthorization {
|
|
235
|
+
deviceCode: string;
|
|
236
|
+
userCode: string;
|
|
237
|
+
verificationUri: string;
|
|
238
|
+
expiresAt: string;
|
|
239
|
+
intervalSeconds: number;
|
|
240
|
+
}
|
|
241
|
+
export interface BrowserAuthorization {
|
|
242
|
+
authorizationId: string;
|
|
243
|
+
authorizationUrl: string;
|
|
244
|
+
expiresAt: string;
|
|
245
|
+
}
|
|
246
|
+
export async function fetchAccountAuthorizationMethods(): Promise<{
|
|
247
|
+
browser: true;
|
|
248
|
+
device: boolean;
|
|
249
|
+
}> {
|
|
250
|
+
const response = await fetch('/__editor/account/authorization-methods');
|
|
251
|
+
assertEditorServerAnswered(response, 'Sign-in methods are unavailable');
|
|
252
|
+
const body = (await response.json()) as {
|
|
253
|
+
browser?: unknown;
|
|
254
|
+
device?: unknown;
|
|
255
|
+
error?: unknown;
|
|
256
|
+
};
|
|
257
|
+
if (!response.ok || body.browser !== true || typeof body.device !== 'boolean') {
|
|
258
|
+
throw new Error(
|
|
259
|
+
typeof body.error === 'string' ? body.error : 'Sign-in methods are unavailable.',
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
return { browser: true, device: body.device };
|
|
263
|
+
}
|
|
264
|
+
export async function beginAccountBrowserAuthorization(): Promise<BrowserAuthorization> {
|
|
265
|
+
const response = await fetch('/__editor/account/browser-authorization', { method: 'POST' });
|
|
266
|
+
assertEditorServerAnswered(response, 'Sign-in failed');
|
|
267
|
+
const body = (await response.json()) as BrowserAuthorization & { error?: unknown };
|
|
268
|
+
if (!response.ok) {
|
|
269
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
|
|
270
|
+
}
|
|
271
|
+
return body;
|
|
272
|
+
}
|
|
273
|
+
export async function pollAccountBrowserAuthorization(authorizationId: string): Promise<boolean> {
|
|
274
|
+
const response = await fetch(
|
|
275
|
+
`/__editor/account/browser-authorization/${encodeURIComponent(authorizationId)}`,
|
|
276
|
+
);
|
|
277
|
+
assertEditorServerAnswered(response, 'Sign-in failed');
|
|
278
|
+
const body = (await response.json()) as
|
|
279
|
+
| { pending: true; error?: unknown }
|
|
280
|
+
| { pending: false; account: EditorAccountSnapshot; error?: unknown };
|
|
281
|
+
if (response.status === 202) return false;
|
|
282
|
+
if (!response.ok || body.pending !== false) {
|
|
283
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
|
|
284
|
+
}
|
|
285
|
+
publish(EditorAccountSnapshotSchema.parse(body.account));
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
export async function beginAccountDeviceAuthorization(): Promise<DeviceAuthorization> {
|
|
289
|
+
const response = await fetch('/__editor/account/device-authorization', { method: 'POST' });
|
|
290
|
+
assertEditorServerAnswered(response, 'Sign-in failed');
|
|
291
|
+
const body = (await response.json()) as DeviceAuthorization & { error?: unknown };
|
|
292
|
+
if (!response.ok)
|
|
293
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
|
|
294
|
+
return body;
|
|
295
|
+
}
|
|
296
|
+
export async function pollAccountDeviceAuthorization(deviceCode: string): Promise<boolean> {
|
|
297
|
+
const response = await fetch(
|
|
298
|
+
`/__editor/account/device-authorization/${encodeURIComponent(deviceCode)}`,
|
|
299
|
+
);
|
|
300
|
+
assertEditorServerAnswered(response, 'Sign-in failed');
|
|
301
|
+
const body = (await response.json()) as
|
|
302
|
+
| { pending: true; error?: unknown }
|
|
303
|
+
| { pending: false; account: EditorAccountSnapshot; error?: unknown };
|
|
304
|
+
if (response.status === 202) return false;
|
|
305
|
+
if (!response.ok || body.pending !== false) {
|
|
306
|
+
throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
|
|
307
|
+
}
|
|
308
|
+
publish(EditorAccountSnapshotSchema.parse(body.account));
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
export function startAccountActivity(): () => void {
|
|
312
|
+
if (COLLABORATION_REMOTE_SHARE) return () => {};
|
|
313
|
+
const checkoutId = new URLSearchParams(window.location.search).get('checkout_id');
|
|
314
|
+
if (checkoutId) {
|
|
315
|
+
void mutate('/__editor/account/checkout/confirm', 'POST', { checkoutId })
|
|
316
|
+
.then(() => {
|
|
317
|
+
const url = new URL(window.location.href);
|
|
318
|
+
url.searchParams.delete('checkout');
|
|
319
|
+
url.searchParams.delete('checkout_id');
|
|
320
|
+
window.history.replaceState(null, '', `${url.pathname}${url.search}${url.hash}`);
|
|
321
|
+
})
|
|
322
|
+
// Into the module's own error channel (`accountError()`, rendered by the
|
|
323
|
+
// account UI) rather than a bare swallow: a confirm that reached nothing
|
|
324
|
+
// used to clear the URL params and look done.
|
|
325
|
+
.catch((cause: unknown) =>
|
|
326
|
+
publish(snapshot, cause instanceof Error ? cause.message : String(cause)),
|
|
327
|
+
);
|
|
328
|
+
} else {
|
|
329
|
+
void refreshAccount().catch(() => undefined);
|
|
330
|
+
}
|
|
331
|
+
const timer = window.setInterval(() => void refreshAccount().catch(() => undefined), 30_000);
|
|
332
|
+
return () => window.clearInterval(timer);
|
|
333
|
+
}
|