@volter/editor-core 0.5.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SourceWriteBackend — the pending-write flush contract for JSX source edits (T3.2
|
|
3
|
+
* slice 3, design).
|
|
4
|
+
*
|
|
5
|
+
* `UIAuthoringAdapter.persistence.save()` is the de-stub target for this seam. What
|
|
6
|
+
* we found investigating the CURRENT write lifecycle (see `source-edit-panel.tsx`):
|
|
7
|
+
* there is NO pending-write queue — every source edit (a style tweak, a struct op)
|
|
8
|
+
* writes to disk IMMEDIATELY via a raw `fetch` call the instant the user commits it
|
|
9
|
+
* (Enter / blur), server-side through the SAME surgical writer used in unit tests
|
|
10
|
+
* (`ui-source/writer.ts`, invoked by `vite-plugin-ui-oid.ts`'s dev-server
|
|
11
|
+
* middleware). So `save()` has nothing to flush; it is an honest no-op REGARDLESS of
|
|
12
|
+
* whether a backend is wired (see `ui-authoring-adapter.ts`). This seam exists so:
|
|
13
|
+
* - the HTTP wire shape is reachable/testable through an injectable interface
|
|
14
|
+
* instead of a bare `fetch` scattered in the adapter, and
|
|
15
|
+
* - a future batching/offline queue (if one is ever built) has somewhere honest
|
|
16
|
+
* to route writes — this file does NOT invent that queue.
|
|
17
|
+
*
|
|
18
|
+
* A host with no `/__ui-source/*` route has NO implementation here, and that
|
|
19
|
+
* absence is surfaced through
|
|
20
|
+
* `persistence.destination`, NOT by flipping `capabilities.persist` to false —
|
|
21
|
+
* see `ui-authoring-adapter.ts`'s doc comment for why that flag deliberately
|
|
22
|
+
* stays `true`. We do NOT fake a save.
|
|
23
|
+
*
|
|
24
|
+
* Explicit non-goal (design §6): the vite plugin's raw `node:fs` writes are
|
|
25
|
+
* server-side and stay exactly as they are — this seam is the CLIENT-facing
|
|
26
|
+
* contract in front of them, not a reroute of their internals through
|
|
27
|
+
* `StorageBackend`.
|
|
28
|
+
*
|
|
29
|
+
* `index()` (T6.2 slice 2) is the read-side sibling added for
|
|
30
|
+
* `ReactRootAuthoringAdapter`'s node labeling (`component:tag`): it exposes the SAME
|
|
31
|
+
* `/__ui-source/index` GET endpoint `vite-plugin-ui-oid.ts` already serves
|
|
32
|
+
* (previously only fetched ad hoc by `source-edit-panel.tsx`) through this one
|
|
33
|
+
* backend seam, rather than a second bespoke fetch call.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { sha256Hex } from '../bytes-codec';
|
|
37
|
+
import { assertEditorServerAnswered } from '../editor-server-response';
|
|
38
|
+
import { setCollaborationRevision, sourceMutationAttribution } from '../editor-session-attribution';
|
|
39
|
+
import { projectFiles } from '../files/project-files';
|
|
40
|
+
import { handleProjectMutationFailure } from '../source-conflict';
|
|
41
|
+
import type { ComponentPropSpec, OidEntry } from './oid-transform';
|
|
42
|
+
import type {
|
|
43
|
+
PreparedSourceEdit,
|
|
44
|
+
SourceEditRequest,
|
|
45
|
+
StructReparentContext,
|
|
46
|
+
} from './source-edit-request';
|
|
47
|
+
import type { DuplicateRewrite } from './writer';
|
|
48
|
+
|
|
49
|
+
export type {
|
|
50
|
+
PreparedSourceEdit,
|
|
51
|
+
SourceEditRequest,
|
|
52
|
+
StructReparentContext,
|
|
53
|
+
} from './source-edit-request';
|
|
54
|
+
|
|
55
|
+
/** The source-write operations (+ the OID index read) the dev-server middleware
|
|
56
|
+
* already exposes. */
|
|
57
|
+
export interface SourceWriteBackend {
|
|
58
|
+
/** Stable identity for stateless backend instances sharing one source transport. */
|
|
59
|
+
readonly historyIdentity?: object;
|
|
60
|
+
/** True when every write is already committed through HistoryService. */
|
|
61
|
+
readonly historyManaged?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Runs a multi-write gesture (a boxEdit drag touching width+height, …) as one
|
|
64
|
+
* failure-atomic history transaction. Only writes made through the scoped
|
|
65
|
+
* backend belong to the gesture; unrelated writes on this backend serialize
|
|
66
|
+
* outside it. Absent on a non-history-managed backend.
|
|
67
|
+
*/
|
|
68
|
+
runGesture?<T>(
|
|
69
|
+
label: string,
|
|
70
|
+
operation: (scopedBackend: SourceWriteBackend) => Promise<T>,
|
|
71
|
+
): Promise<T>;
|
|
72
|
+
/** Pure prepare: compute exact whole-file before/after without writing. */
|
|
73
|
+
prepare?(request: SourceEditRequest): Promise<PreparedSourceEdit>;
|
|
74
|
+
/**
|
|
75
|
+
* Read one scope-checked source file for capture/preflight.
|
|
76
|
+
*
|
|
77
|
+
* `bytes` is present ONLY when the file is not text — an ingested game's
|
|
78
|
+
* level data, say. When it is, history stores those bytes and `source` is
|
|
79
|
+
* merely the wire form this backend chose; when it is absent, `source` IS the
|
|
80
|
+
* file. History must never keep the wire form: `sha` is always the digest of
|
|
81
|
+
* the FILE's bytes, so a snapshot holding base64 text would declare a sha
|
|
82
|
+
* nothing could reproduce, and undo's "did the write land?" check would fail
|
|
83
|
+
* on every binary file.
|
|
84
|
+
*/
|
|
85
|
+
readSource?(
|
|
86
|
+
file: string,
|
|
87
|
+
): Promise<{ source: string; sha: string; resourcePath: string; bytes?: Uint8Array }>;
|
|
88
|
+
/** Guarded whole-file apply used by commit, undo, and redo. Bytes go through
|
|
89
|
+
* as bytes; the backend owns whatever the wire needs. */
|
|
90
|
+
applySource?(
|
|
91
|
+
file: string,
|
|
92
|
+
source: string | Uint8Array,
|
|
93
|
+
ifMatchSha: string,
|
|
94
|
+
): Promise<{ applied: boolean; sha?: string; error?: string }>;
|
|
95
|
+
/** Surgical inline-style/className edit — the `/__ui-source/write` shape.
|
|
96
|
+
* `appended` (D-A1) is true only when the write took the writer's
|
|
97
|
+
* APPEND branch (no prior literal for this prop) — see
|
|
98
|
+
* `ReactRootAuthoringAdapter.writeStyle`'s append-aware undo (D-A4).
|
|
99
|
+
*
|
|
100
|
+
* `value` accepts a NUMBER, and callers with a numeric descriptor MUST pass
|
|
101
|
+
* one: `String(300)` here writes `width: '300'`, which React passes through
|
|
102
|
+
* and the CSSOM rejects — source changes, the screen does not, and the ack
|
|
103
|
+
* still says `persisted: true`. See `authoring/css-numeric-style.ts`. */
|
|
104
|
+
writeStyle(
|
|
105
|
+
oid: string,
|
|
106
|
+
prop: string,
|
|
107
|
+
value: string | number,
|
|
108
|
+
): Promise<{
|
|
109
|
+
changed: boolean;
|
|
110
|
+
dynamic?: boolean;
|
|
111
|
+
/** Present when the write was refused because the existing source value is
|
|
112
|
+
* a `var(--token)` reference; the string IS the reference. Distinct from
|
|
113
|
+
* `dynamic` because the refusal names a token, not an expression. */
|
|
114
|
+
tokenRef?: string;
|
|
115
|
+
route?: string;
|
|
116
|
+
error?: string;
|
|
117
|
+
appended?: boolean;
|
|
118
|
+
}>;
|
|
119
|
+
/**
|
|
120
|
+
* D-A3: surgically REMOVE an appended inline-style property — the
|
|
121
|
+
* correct undo for a write that took the append branch (`appended: true`).
|
|
122
|
+
* Posts the SAME `/__ui-source/write` endpoint `writeStyle` uses, with the
|
|
123
|
+
* `value: null` removal sentinel the middleware routes to `removeInlineStyle`.
|
|
124
|
+
*/
|
|
125
|
+
removeStyle(
|
|
126
|
+
oid: string,
|
|
127
|
+
prop: string,
|
|
128
|
+
): Promise<{ changed: boolean; route?: string; error?: string }>;
|
|
129
|
+
/** Surgical CSS-FILE edit (Cap 2) — the `/__ui-source/css` shape. The client resolves
|
|
130
|
+
* the target rule (source file + selector) from live matched-rule data and sends it;
|
|
131
|
+
* the server edits that file in place. `generated: true` means the selector was not
|
|
132
|
+
* found in source (generated CSS) — the caller re-routes to class/inline.
|
|
133
|
+
* Optional: only a dev-server-backed implementation serves it. */
|
|
134
|
+
writeCss?(
|
|
135
|
+
file: string,
|
|
136
|
+
selector: string,
|
|
137
|
+
prop: string,
|
|
138
|
+
value: string,
|
|
139
|
+
media?: string,
|
|
140
|
+
): Promise<{ changed: boolean; generated?: boolean; error?: string }>;
|
|
141
|
+
/** Text-content edit (Cap 3) — the `/__ui-source/text` shape. Replaces a leaf element's
|
|
142
|
+
* pure-text body; `dynamic: true` means the body has an expression/children (refused).
|
|
143
|
+
* `prevText` is the editable text before the edit (for the undo inverse). Optional:
|
|
144
|
+
* only a dev-server-backed implementation serves it. */
|
|
145
|
+
writeText?(
|
|
146
|
+
oid: string,
|
|
147
|
+
text: string,
|
|
148
|
+
): Promise<{ changed: boolean; dynamic?: boolean; prevText?: string | null; error?: string }>;
|
|
149
|
+
/** Component prop / attribute edit (Cap 4) — the `/__ui-source/prop` shape. `oid` is the
|
|
150
|
+
* CALL-SITE oid (the `<Component …>` tag). `dynamic: true` ⇒ the prop is a non-literal
|
|
151
|
+
* expression (refused). Optional: only a dev-server-backed implementation serves it.
|
|
152
|
+
* `opts.addIfMissing` (W2 — opt-in, default off) appends the prop to the opening tag
|
|
153
|
+
* when it is absent instead of no-op'ing (the R3F gizmo path needs this for a mesh
|
|
154
|
+
* whose source never authored a transform tuple yet). `opts.allowShapeUpgrade` (R2 —
|
|
155
|
+
* opt-in, default off) permits a number-tuple literal to replace a plain number literal
|
|
156
|
+
* for the same prop (the `scale={1.5}` scalar shorthand upgraded by a non-uniform gizmo
|
|
157
|
+
* drag). */
|
|
158
|
+
writeProp?(
|
|
159
|
+
oid: string,
|
|
160
|
+
prop: string,
|
|
161
|
+
value: string,
|
|
162
|
+
opts?: { addIfMissing?: boolean; allowShapeUpgrade?: boolean },
|
|
163
|
+
): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
|
|
164
|
+
/**
|
|
165
|
+
* REMOVE a whole prop attribute — the inverse of `writeProp`'s `addIfMissing`
|
|
166
|
+
* append, and what the inspector's revert-to-default does: with no attribute,
|
|
167
|
+
* the value in force is the one the component's own signature declares.
|
|
168
|
+
* Wire shape is `/__ui-source/prop` with `value: null`, matching the
|
|
169
|
+
* `removeStyle` sentinel (D-A3). A source no-op when the attribute is absent,
|
|
170
|
+
* and refused (`dynamic: true`) when it is expression-bound.
|
|
171
|
+
*/
|
|
172
|
+
removeProp?(
|
|
173
|
+
oid: string,
|
|
174
|
+
prop: string,
|
|
175
|
+
): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
|
|
176
|
+
/** Apply a literal instance value to its component's native declaration. */
|
|
177
|
+
writeComponentDefault?(
|
|
178
|
+
definitionOid: string,
|
|
179
|
+
prop: string,
|
|
180
|
+
value: string,
|
|
181
|
+
): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
|
|
182
|
+
/**
|
|
183
|
+
* Structural source edit — the `/__ui-source/struct` shape. Ops: `delete`, `duplicate`,
|
|
184
|
+
* `wrap`/`unwrap`, `create`, `create-sibling`, `reorder`, `reparent` (Cap 5). Multi-oid
|
|
185
|
+
* ops pass the companion oid(s) + optional `wrapperTag` via `opts`.
|
|
186
|
+
*
|
|
187
|
+
* D-1 (spec27 §2): when `changed`, the server ALSO returns the whole
|
|
188
|
+
* touched file's `prevSource`/`newSource` (before/after this op) plus their
|
|
189
|
+
* `prevSha`/`newSha` (sha256, server-computed) — the checksum-guarded
|
|
190
|
+
* whole-file snapshot inverse `ReactRootAuthoringAdapter.structOp` needs to
|
|
191
|
+
* push ONE undo/redo entry per structural op (a per-OID inverse is unsound
|
|
192
|
+
* here: OIDs are `file:component:tag:nthOccurrence` content signatures,
|
|
193
|
+
* reorder/delete reassign occurrence indices, and delete has no inverse
|
|
194
|
+
* payload of its own). These fields are absent when `changed` is false, and
|
|
195
|
+
* on an implementation that predates D-1 (a bare `{changed}` mock) — either
|
|
196
|
+
* way the caller degrades to "not undoable" rather than crashing.
|
|
197
|
+
*/
|
|
198
|
+
writeStruct(
|
|
199
|
+
oid: string,
|
|
200
|
+
op: string,
|
|
201
|
+
opts?: {
|
|
202
|
+
targetOid?: string;
|
|
203
|
+
parentOid?: string;
|
|
204
|
+
wrapperTag?: string;
|
|
205
|
+
snippet?: string;
|
|
206
|
+
ensureImport?: { name: string; module: string; kind?: 'default' | 'named' };
|
|
207
|
+
duplicate?: DuplicateRewrite;
|
|
208
|
+
} & StructReparentContext,
|
|
209
|
+
): Promise<{
|
|
210
|
+
changed: boolean;
|
|
211
|
+
error?: string;
|
|
212
|
+
/** Applied, but with something the author should know — a `reparent` that took the
|
|
213
|
+
* element out of a definition rendered more than once (R3's mirrored case). */
|
|
214
|
+
warning?: string;
|
|
215
|
+
file?: string;
|
|
216
|
+
prevSource?: string;
|
|
217
|
+
newSource?: string;
|
|
218
|
+
prevSha?: string;
|
|
219
|
+
newSha?: string;
|
|
220
|
+
}>;
|
|
221
|
+
/**
|
|
222
|
+
* Batched structural source edit. `delete` is the delete-order-residual fix;
|
|
223
|
+
* `group` resolves sibling elements from the same source snapshot and wraps
|
|
224
|
+
* them beneath one ordinary R3F group. Both produce one history transaction.
|
|
225
|
+
*
|
|
226
|
+
* Delete details — bug-panel follow-up to
|
|
227
|
+
* the multi-delete corruption fix, 50f90a6d), the `/__ui-source/struct-many`
|
|
228
|
+
* shape. Unlike N separate
|
|
229
|
+
* `writeStruct(oid, 'delete')` calls, the server resolves every `oids` entry's
|
|
230
|
+
* offset against ONE shared file snapshot and applies them all in a single write
|
|
231
|
+
* — sound and CALLER-ORDER-INDEPENDENT (see `handleStructMany`'s doc comment,
|
|
232
|
+
* `vite-plugin-ui-oid.ts`): the caller does not need to sort `oids` into any
|
|
233
|
+
* particular order, source or otherwise. Same response shape as `writeStruct`
|
|
234
|
+
* (one `prevSource`/`newSource`/`prevSha`/`newSha` snapshot for the whole batch
|
|
235
|
+
* — one undo entry, not N). Optional: only a dev-server-backed implementation
|
|
236
|
+
* serves it; its absence is how `ReactRootAuthoringAdapter` honestly degrades
|
|
237
|
+
* `structure.removeMany` to absent (the shell then falls back to
|
|
238
|
+
* `deleteSelection`'s per-id loop, unchanged).
|
|
239
|
+
*/
|
|
240
|
+
writeStructMany?(
|
|
241
|
+
oids: readonly string[],
|
|
242
|
+
op: string,
|
|
243
|
+
opts?: { wrapperTag?: string },
|
|
244
|
+
): Promise<{
|
|
245
|
+
changed: boolean;
|
|
246
|
+
error?: string;
|
|
247
|
+
file?: string;
|
|
248
|
+
prevSource?: string;
|
|
249
|
+
newSource?: string;
|
|
250
|
+
prevSha?: string;
|
|
251
|
+
newSha?: string;
|
|
252
|
+
}>;
|
|
253
|
+
/** The whole OID → source-location index — the `/__ui-source/index` shape.
|
|
254
|
+
* Optional: only a dev-server-backed implementation can serve it. */
|
|
255
|
+
index?(): Promise<Record<string, OidEntry>>;
|
|
256
|
+
/**
|
|
257
|
+
* The props a component DECLARES, read from its definition file — the door a
|
|
258
|
+
* drop uses before the element exists anywhere (`index()` only carries the
|
|
259
|
+
* specs of tags already used). `file` is project-relative; `component` names
|
|
260
|
+
* the declared function and how the module exports it. Empty when the
|
|
261
|
+
* definition cannot be read — never a guess. Optional: a backend without a
|
|
262
|
+
* resolver drops with no declared defaults, as before.
|
|
263
|
+
*/
|
|
264
|
+
componentProps?(
|
|
265
|
+
file: string,
|
|
266
|
+
component: { name: string; exportKind: 'default' | 'named' },
|
|
267
|
+
): Promise<ComponentPropSpec[]>;
|
|
268
|
+
/**
|
|
269
|
+
* H7 "Fork Component…" — the `/__ui-source/fork-component` shape.
|
|
270
|
+
*
|
|
271
|
+
* The ONLY seam on this backend that CREATES a file, which is exactly why it
|
|
272
|
+
* is a server capability rather than a client composition of the existing
|
|
273
|
+
* ones: `readSource`/`applySource` are checksum-guarded against a file that
|
|
274
|
+
* already exists, and nothing here can bring a new path into being.
|
|
275
|
+
*
|
|
276
|
+
* The server copies the component's module to a renamed sibling and returns
|
|
277
|
+
* the CALLSITE edit unwritten (`callsitePrevSource`/`callsiteNewSource`), so
|
|
278
|
+
* the caller can push that half through project history — the new file stays
|
|
279
|
+
* outside history deliberately, and an undo therefore restores the callsite
|
|
280
|
+
* and leaves the copy behind as an inert module nothing imports.
|
|
281
|
+
*
|
|
282
|
+
* Optional: only a dev-server-backed implementation serves it; its absence is
|
|
283
|
+
* how a hosted/read-only session honestly reports that forking is off.
|
|
284
|
+
*/
|
|
285
|
+
forkComponent?(
|
|
286
|
+
oid: string,
|
|
287
|
+
definitionOid: string,
|
|
288
|
+
name?: string,
|
|
289
|
+
): Promise<{
|
|
290
|
+
ok: boolean;
|
|
291
|
+
error?: string;
|
|
292
|
+
newName?: string;
|
|
293
|
+
tag?: string;
|
|
294
|
+
newFile?: string;
|
|
295
|
+
newResourcePath?: string;
|
|
296
|
+
importSpecifier?: string;
|
|
297
|
+
label?: string;
|
|
298
|
+
callsiteFile?: string;
|
|
299
|
+
callsiteResourcePath?: string;
|
|
300
|
+
callsitePrevSource?: string;
|
|
301
|
+
callsiteNewSource?: string;
|
|
302
|
+
callsitePrevSha?: string;
|
|
303
|
+
callsiteNewSha?: string;
|
|
304
|
+
}>;
|
|
305
|
+
/**
|
|
306
|
+
* P1 "Extract Component…" — the `/__ui-source/extract-component` shape, and
|
|
307
|
+
* the fork seam's sibling (the fork's doc above records why file creation is
|
|
308
|
+
* a server capability at all). The server writes TWO new files — the
|
|
309
|
+
* component module and its portable CSF story under `src/prefabs/` — and
|
|
310
|
+
* returns the CALLSITE edit unwritten, so the caller pushes that half
|
|
311
|
+
* through project history: undo restores the callsite and leaves the new
|
|
312
|
+
* files as an inert module + story nothing imports. Optional: only a
|
|
313
|
+
* dev-server-backed implementation serves it.
|
|
314
|
+
*/
|
|
315
|
+
extractComponent?(
|
|
316
|
+
oid: string,
|
|
317
|
+
name?: string,
|
|
318
|
+
): Promise<{
|
|
319
|
+
ok: boolean;
|
|
320
|
+
error?: string;
|
|
321
|
+
newName?: string;
|
|
322
|
+
tag?: string;
|
|
323
|
+
componentFile?: string;
|
|
324
|
+
componentResourcePath?: string;
|
|
325
|
+
storyFile?: string;
|
|
326
|
+
storyResourcePath?: string;
|
|
327
|
+
importSpecifier?: string;
|
|
328
|
+
label?: string;
|
|
329
|
+
callsiteFile?: string;
|
|
330
|
+
callsiteResourcePath?: string;
|
|
331
|
+
callsitePrevSource?: string;
|
|
332
|
+
callsiteNewSource?: string;
|
|
333
|
+
callsitePrevSha?: string;
|
|
334
|
+
callsiteNewSha?: string;
|
|
335
|
+
}>;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Adopt the revision a write just produced.
|
|
340
|
+
*
|
|
341
|
+
* The collaboration guard rejects a mutation whose `expectedRevision` is older
|
|
342
|
+
* than the target file's, and the SSE stream that teaches the client its
|
|
343
|
+
* revision lands one event loop late — so the SECOND write of a multi-write
|
|
344
|
+
* gesture used to be refused by its own first write (measured on a canvas
|
|
345
|
+
* transform drag, whose `position` channel is `x` + `y`). The server now
|
|
346
|
+
* reports the revision it recorded on the response this call already awaits;
|
|
347
|
+
* taking it here is what makes a sequential write sequence legal.
|
|
348
|
+
* `setCollaborationRevision` only ever moves forward, so a stale or absent
|
|
349
|
+
* value is harmless.
|
|
350
|
+
*/
|
|
351
|
+
function adoptResponseRevision(value: unknown): void {
|
|
352
|
+
if (value && typeof value === 'object' && 'revision' in value) {
|
|
353
|
+
const revision = (value as { revision?: unknown }).revision;
|
|
354
|
+
if (typeof revision === 'number') setCollaborationRevision(revision);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Create a NEW project source file through the dev server's
|
|
360
|
+
* `/__ui-source/create-file` route (the pasteboard materialize action's
|
|
361
|
+
* door). Kept here so the collaboration attribution/revision envelope every
|
|
362
|
+
* source mutation carries is attached in exactly one place ({@link postJson}).
|
|
363
|
+
* The server refuses an existing file — creation never overwrites.
|
|
364
|
+
*/
|
|
365
|
+
export async function createProjectSourceFile(
|
|
366
|
+
file: string,
|
|
367
|
+
source: string,
|
|
368
|
+
): Promise<{ created: boolean; error?: string }> {
|
|
369
|
+
return postJson('/__ui-source/create-file', { file, source });
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/** The CSF story write door (`/__ui-source/csf-story`) — save an arg set as
|
|
373
|
+
* a new story export, rename one, delete one. Kept beside
|
|
374
|
+
* {@link createProjectSourceFile} so the collaboration envelope stays
|
|
375
|
+
* attached in one place; the planner's refusals arrive as `error`. */
|
|
376
|
+
export async function writeCsfStory(request: {
|
|
377
|
+
op: 'save' | 'rename' | 'delete';
|
|
378
|
+
file: string;
|
|
379
|
+
name: string;
|
|
380
|
+
newName?: string;
|
|
381
|
+
args?: Record<string, unknown>;
|
|
382
|
+
}): Promise<{ changed: boolean; summary?: string; error?: string }> {
|
|
383
|
+
return postJson('/__ui-source/csf-story', request);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/** The named-style write door (`/__ui-source/named-style`) — mint a CSS class
|
|
387
|
+
* from the element's literal inline styles (`create`, with `file` naming the
|
|
388
|
+
* target first-party stylesheet), or add/remove the bare class token
|
|
389
|
+
* (`apply`/`remove`). Collaboration envelope attached by `postJson`. */
|
|
390
|
+
export async function writeNamedStyle(request: {
|
|
391
|
+
op: 'create' | 'apply' | 'remove';
|
|
392
|
+
oid: string;
|
|
393
|
+
className: string;
|
|
394
|
+
file?: string;
|
|
395
|
+
}): Promise<{ changed: boolean; moved?: string[]; summary?: string; error?: string }> {
|
|
396
|
+
return postJson('/__ui-source/named-style', request);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
async function postJson<T>(url: string, body: unknown): Promise<T> {
|
|
400
|
+
const attribution = sourceMutationAttribution();
|
|
401
|
+
const attributedBody =
|
|
402
|
+
body && typeof body === 'object' && !Array.isArray(body)
|
|
403
|
+
? {
|
|
404
|
+
...body,
|
|
405
|
+
...attribution,
|
|
406
|
+
}
|
|
407
|
+
: body;
|
|
408
|
+
const res = await fetch(url, {
|
|
409
|
+
method: 'POST',
|
|
410
|
+
headers: { 'Content-Type': 'application/json' },
|
|
411
|
+
body: JSON.stringify(attributedBody),
|
|
412
|
+
});
|
|
413
|
+
if (res.ok === false && res.status === 409) {
|
|
414
|
+
const record =
|
|
415
|
+
body && typeof body === 'object' && !Array.isArray(body)
|
|
416
|
+
? (body as Record<string, unknown>)
|
|
417
|
+
: {};
|
|
418
|
+
const file = typeof record['file'] === 'string' ? record['file'] : null;
|
|
419
|
+
const attempted =
|
|
420
|
+
file && typeof record['source'] === 'string' ? { [file]: record['source'] } : {};
|
|
421
|
+
await handleProjectMutationFailure(res, {
|
|
422
|
+
label: `Source mutation ${url}`,
|
|
423
|
+
attempted,
|
|
424
|
+
reapply: () => postJson(url, body).then(() => undefined),
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
const parsed = await readJsonResponse<T>(res, url);
|
|
428
|
+
adoptResponseRevision(parsed);
|
|
429
|
+
return parsed;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* The ONE place every `/__ui-source/*` answer is read. That prefix is served by
|
|
434
|
+
* the same dev server as `/__editor/*` (`vite-plugin-ui-oid.ts`), on the same
|
|
435
|
+
* origin, behind the same page fallback — so the fallback check is the same
|
|
436
|
+
* check, run BEFORE the parse. Without it a source write against an origin with
|
|
437
|
+
* no recorder died as `Unexpected token '<'` at the author's next keystroke.
|
|
438
|
+
* Non-OK statuses keep their own `{ error }` handling below.
|
|
439
|
+
*/
|
|
440
|
+
async function readJsonResponse<T>(res: Response, url: string): Promise<T> {
|
|
441
|
+
assertEditorServerAnswered(res, `Source request ${url} failed`);
|
|
442
|
+
let payload: unknown;
|
|
443
|
+
try {
|
|
444
|
+
payload = await res.json();
|
|
445
|
+
} catch (error) {
|
|
446
|
+
if (res.ok !== false) throw error;
|
|
447
|
+
throw new Error(`Source request ${url} failed with HTTP ${res.status}.`, { cause: error });
|
|
448
|
+
}
|
|
449
|
+
if (res.ok === false) {
|
|
450
|
+
const detail =
|
|
451
|
+
payload && typeof payload === 'object'
|
|
452
|
+
? String(
|
|
453
|
+
(payload as { error?: unknown; message?: unknown }).error ??
|
|
454
|
+
(payload as { message?: unknown }).message ??
|
|
455
|
+
res.statusText,
|
|
456
|
+
)
|
|
457
|
+
: res.statusText;
|
|
458
|
+
throw new Error(
|
|
459
|
+
`Source request ${url} failed with HTTP ${res.status}${detail ? `: ${detail}` : ''}.`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
return payload as T;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* WHERE EVERY WHOLE-FILE SOURCE WRITE LANDS, and why the frame changes it.
|
|
467
|
+
*
|
|
468
|
+
* `applySource` is the write end of the entire native authoring lane: a gizmo
|
|
469
|
+
* drag is `prepare` → `HistoryService.transaction` → `applySource`, and its
|
|
470
|
+
* UNDO and REDO are the same call with the inverse snapshot
|
|
471
|
+
* (`history/source-history-backend.ts`). Under the Code-OSS frame that write
|
|
472
|
+
* must be the WORKBENCH's, not the session's — U4 measured what happens
|
|
473
|
+
* otherwise: `/__ui-source/apply` writes the file behind the workbench's back,
|
|
474
|
+
* Monaco sees an external change, reloads, `modelService.updateModel` pushes a
|
|
475
|
+
* fresh text element, and `pushElement` destroys the redo future. ⇧⌘Z then
|
|
476
|
+
* brought nothing back while a text model for that file was open.
|
|
477
|
+
*
|
|
478
|
+
* So under the frame the apply goes through `projectFiles`, which is
|
|
479
|
+
* `IFileService`/`ITextFileService` over the workspace folder: the open model
|
|
480
|
+
* is updated in place and saved, no reload fires, and the redo future
|
|
481
|
+
* survives. Standalone `vgai edit` is untouched — `frameOwned()` is false and
|
|
482
|
+
* every call is the same POST it always was.
|
|
483
|
+
*
|
|
484
|
+
* THE GUARD SURVIVES THE MOVE. `/__ui-source/apply`'s `ifMatchSha` is real
|
|
485
|
+
* conflict protection (a hand-edit since the entry was recorded), so the
|
|
486
|
+
* frame path re-reads the file through the same door and compares before it
|
|
487
|
+
* writes, and answers the same `{applied:false, sha}` shape on a mismatch.
|
|
488
|
+
*
|
|
489
|
+
* THE PROJECT-RELATIVE PATH comes from the memo below, because `applySource`
|
|
490
|
+
* is handed the SERVER's file identity (`prepared.file`) and the frame needs
|
|
491
|
+
* the path the workspace folder resolves — `resourcePath`. Every apply in
|
|
492
|
+
* every lane is preceded by a `prepare` or a `readSource`, and both answer
|
|
493
|
+
* with both spellings, so the memo is populated by the time it is read; a miss
|
|
494
|
+
* falls back to one `/__ui-source/read`.
|
|
495
|
+
*/
|
|
496
|
+
const resourcePathByFile = new Map<string, string>();
|
|
497
|
+
|
|
498
|
+
function rememberResourcePath(
|
|
499
|
+
answer: { file?: string; resourcePath?: string },
|
|
500
|
+
file?: string,
|
|
501
|
+
): void {
|
|
502
|
+
const key = answer.file ?? file;
|
|
503
|
+
if (key && answer.resourcePath) resourcePathByFile.set(key, answer.resourcePath);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
async function frameResourcePath(file: string): Promise<string> {
|
|
507
|
+
const known = resourcePathByFile.get(file);
|
|
508
|
+
if (known) return known;
|
|
509
|
+
const read = await postJson<{ resourcePath: string }>('/__ui-source/read', { file });
|
|
510
|
+
resourcePathByFile.set(file, read.resourcePath);
|
|
511
|
+
return read.resourcePath;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async function frameApplySource(
|
|
515
|
+
file: string,
|
|
516
|
+
source: string | Uint8Array,
|
|
517
|
+
ifMatchSha: string,
|
|
518
|
+
): Promise<{ applied: boolean; sha?: string; error?: string }> {
|
|
519
|
+
const path = await frameResourcePath(file);
|
|
520
|
+
const isText = typeof source === 'string';
|
|
521
|
+
let currentSha: string;
|
|
522
|
+
try {
|
|
523
|
+
currentSha = isText
|
|
524
|
+
? await sha256Hex(new TextEncoder().encode(await projectFiles.read(path)))
|
|
525
|
+
: await sha256Hex(await projectFiles.readBytes(path));
|
|
526
|
+
} catch (error) {
|
|
527
|
+
return {
|
|
528
|
+
applied: false,
|
|
529
|
+
error: `Could not read "${path}" to guard the write: ${String(error)}`,
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
if (currentSha !== ifMatchSha) {
|
|
533
|
+
return {
|
|
534
|
+
applied: false,
|
|
535
|
+
sha: currentSha,
|
|
536
|
+
error: 'stale: the file changed since this undo/redo entry was recorded',
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
await projectFiles.write(path, source);
|
|
540
|
+
const sha = isText ? await sha256Hex(new TextEncoder().encode(source)) : await sha256Hex(source);
|
|
541
|
+
return { applied: true, sha };
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/** Wraps the EXISTING `/__ui-source/write` + `/__ui-source/struct` dev-server
|
|
545
|
+
* endpoints (see `vite-plugin-ui-oid.ts`) — the dev-server-backed tier. */
|
|
546
|
+
export function createHttpSourceWriteBackend(): SourceWriteBackend {
|
|
547
|
+
return {
|
|
548
|
+
historyIdentity: HTTP_SOURCE_HISTORY_IDENTITY,
|
|
549
|
+
prepare: async (request) => {
|
|
550
|
+
const prepared = await postJson<PreparedSourceEdit>('/__ui-source/prepare', request);
|
|
551
|
+
rememberResourcePath(prepared);
|
|
552
|
+
return prepared;
|
|
553
|
+
},
|
|
554
|
+
readSource: async (file) => {
|
|
555
|
+
const read = await postJson<{
|
|
556
|
+
source: string;
|
|
557
|
+
sha: string;
|
|
558
|
+
resourcePath: string;
|
|
559
|
+
bytes?: Uint8Array;
|
|
560
|
+
}>('/__ui-source/read', { file });
|
|
561
|
+
rememberResourcePath(read, file);
|
|
562
|
+
return read;
|
|
563
|
+
},
|
|
564
|
+
applySource: (file, source, ifMatchSha) =>
|
|
565
|
+
projectFiles.frameOwned()
|
|
566
|
+
? frameApplySource(file, source, ifMatchSha)
|
|
567
|
+
: postJson('/__ui-source/apply', { file, source, ifMatchSha }),
|
|
568
|
+
writeStyle: (oid, prop, value) => postJson('/__ui-source/write', { oid, prop, value }),
|
|
569
|
+
// D-A3: the removal sentinel — same endpoint, `value: null`.
|
|
570
|
+
removeStyle: (oid, prop) => postJson('/__ui-source/write', { oid, prop, value: null }),
|
|
571
|
+
writeCss: (file, selector, prop, value, media) =>
|
|
572
|
+
postJson('/__ui-source/css', {
|
|
573
|
+
file,
|
|
574
|
+
selector,
|
|
575
|
+
prop,
|
|
576
|
+
value,
|
|
577
|
+
...(media !== undefined ? { media } : {}),
|
|
578
|
+
}),
|
|
579
|
+
writeText: (oid, text) => postJson('/__ui-source/text', { oid, text }),
|
|
580
|
+
writeProp: (oid, prop, value, opts) =>
|
|
581
|
+
postJson('/__ui-source/prop', {
|
|
582
|
+
oid,
|
|
583
|
+
prop,
|
|
584
|
+
value,
|
|
585
|
+
...(opts?.addIfMissing ? { addIfMissing: true } : {}),
|
|
586
|
+
...(opts?.allowShapeUpgrade ? { allowShapeUpgrade: true } : {}),
|
|
587
|
+
}),
|
|
588
|
+
removeProp: (oid, prop) => postJson('/__ui-source/prop', { oid, prop, value: null }),
|
|
589
|
+
writeStruct: (oid, op, opts) => postJson('/__ui-source/struct', { oid, op, ...opts }),
|
|
590
|
+
writeStructMany: (oids, op, opts) =>
|
|
591
|
+
postJson('/__ui-source/struct-many', { oids, op, ...opts }),
|
|
592
|
+
forkComponent: (oid, definitionOid, name) =>
|
|
593
|
+
postJson('/__ui-source/fork-component', {
|
|
594
|
+
oid,
|
|
595
|
+
definitionOid,
|
|
596
|
+
...(name ? { name } : {}),
|
|
597
|
+
}),
|
|
598
|
+
extractComponent: (oid, name) =>
|
|
599
|
+
postJson('/__ui-source/extract-component', { oid, ...(name ? { name } : {}) }),
|
|
600
|
+
index: async () => {
|
|
601
|
+
const res = await fetch('/__ui-source/index');
|
|
602
|
+
return readJsonResponse<Record<string, OidEntry>>(res, '/__ui-source/index');
|
|
603
|
+
},
|
|
604
|
+
componentProps: async (file, component) => {
|
|
605
|
+
const url =
|
|
606
|
+
'/__ui-source/component-props' +
|
|
607
|
+
`?file=${encodeURIComponent(file)}&name=${encodeURIComponent(component.name)}`;
|
|
608
|
+
const res = await fetch(url);
|
|
609
|
+
const payload = await readJsonResponse<{ props?: ComponentPropSpec[] }>(
|
|
610
|
+
res,
|
|
611
|
+
'/__ui-source/component-props',
|
|
612
|
+
);
|
|
613
|
+
return payload.props ?? [];
|
|
614
|
+
},
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const HTTP_SOURCE_HISTORY_IDENTITY = {};
|