@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,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SYNTACTIC declared-prop specs — the checker-free half of the declared-props
|
|
3
|
+
* story, for the tier that cannot build a `ts.Program`.
|
|
4
|
+
*
|
|
5
|
+
* The dev server resolves a component's prop surface semantically
|
|
6
|
+
* (`component-prop-types.ts`: a real `ts.LanguageService`, so
|
|
7
|
+
* `variant: EnemyVariant` becomes `'raider' | 'sharpshooter'` with no grammar
|
|
8
|
+
* here). The hosted editor has no filesystem to host a program, and until this
|
|
9
|
+
* module it shipped NO specs at all — which silently disabled everything
|
|
10
|
+
* downstream that gates on a spec: the Prefab Instance card's override
|
|
11
|
+
* detection (`isOverride` requires `spec.optional`) and Apply-to-Component
|
|
12
|
+
* (requires `spec.defaultValue`) read as "Overrides (0) — Using component
|
|
13
|
+
* defaults" while the authored divergence sat in plain sight.
|
|
14
|
+
*
|
|
15
|
+
* What syntax alone CAN answer, this answers, by the same WHICH-props rule the
|
|
16
|
+
* checker module documents: the props that belong to a component are the
|
|
17
|
+
* members the author literally wrote in its props type —
|
|
18
|
+
* `Omit<ThreeElements['mesh'], …> & { color?: string }` contributes only
|
|
19
|
+
* `{ color?: string }`; the forwarded native surface is not the author's.
|
|
20
|
+
* Destructured parameter defaults (`{ color = '#c8dce1' }`) supply
|
|
21
|
+
* `optional`/`defaultText`/`defaultValue` — exactly the fields the override
|
|
22
|
+
* and apply gates read, and `writeComponentDefault` rewrites. Types the
|
|
23
|
+
* grammar cannot prove stay `null`, the spec's documented "no honest widget"
|
|
24
|
+
* state; they are never guessed from a default's shape.
|
|
25
|
+
*
|
|
26
|
+
* A component with no authored members but WITH destructured defaults still
|
|
27
|
+
* gets specs for those defaulted names — the spec docstring's own rule
|
|
28
|
+
* ("Declared `?:`, or given a default by the component's destructuring").
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import ts from 'typescript';
|
|
32
|
+
import type { ComponentPropSpec, R3fTypeAlias } from './oid-transform';
|
|
33
|
+
|
|
34
|
+
interface AuthoredMember {
|
|
35
|
+
optional: boolean;
|
|
36
|
+
type: ComponentPropSpec['type'];
|
|
37
|
+
options?: Array<string | number>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** `'a' | 'b'` → enum options; `[number, number, number]` → vec3; keywords →
|
|
41
|
+
* their widget; everything else → `null` (no honest widget from syntax). */
|
|
42
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: one bounded type-syntax dispatcher, not application control flow.
|
|
43
|
+
function widgetTypeOf(node: ts.TypeNode | undefined): {
|
|
44
|
+
type: ComponentPropSpec['type'];
|
|
45
|
+
options?: Array<string | number>;
|
|
46
|
+
} {
|
|
47
|
+
if (!node) return { type: null };
|
|
48
|
+
switch (node.kind) {
|
|
49
|
+
case ts.SyntaxKind.StringKeyword:
|
|
50
|
+
return { type: 'string' };
|
|
51
|
+
case ts.SyntaxKind.NumberKeyword:
|
|
52
|
+
return { type: 'number' };
|
|
53
|
+
case ts.SyntaxKind.BooleanKeyword:
|
|
54
|
+
return { type: 'boolean' };
|
|
55
|
+
default:
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (ts.isUnionTypeNode(node)) {
|
|
59
|
+
const options: Array<string | number> = [];
|
|
60
|
+
for (const member of node.types) {
|
|
61
|
+
if (!ts.isLiteralTypeNode(member)) return { type: null };
|
|
62
|
+
if (ts.isStringLiteral(member.literal)) options.push(member.literal.text);
|
|
63
|
+
else if (ts.isNumericLiteral(member.literal)) options.push(Number(member.literal.text));
|
|
64
|
+
else return { type: null };
|
|
65
|
+
}
|
|
66
|
+
return options.length > 0 ? { type: 'enum', options } : { type: null };
|
|
67
|
+
}
|
|
68
|
+
if (
|
|
69
|
+
ts.isTupleTypeNode(node) &&
|
|
70
|
+
node.elements.length === 3 &&
|
|
71
|
+
node.elements.every((element) => element.kind === ts.SyntaxKind.NumberKeyword)
|
|
72
|
+
) {
|
|
73
|
+
return { type: 'vec3' };
|
|
74
|
+
}
|
|
75
|
+
return { type: null };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** A member's type through the alias it names — `kind: WeaponKind` where
|
|
79
|
+
* `WeaponKind` is `'pistol' | 'rifle' | 'grenade'` declared in this file or
|
|
80
|
+
* imported from another the resolver supplied. Without this the member read
|
|
81
|
+
* `type: null` and a required enum prop had no first option to offer a drop
|
|
82
|
+
* (`<WeaponPickup>` rendered nothing until `kind` was set — runhuman pass
|
|
83
|
+
* 123; the door built for it answered null on preview-b56). One hop, in the
|
|
84
|
+
* file the alias was written in. */
|
|
85
|
+
function memberTypeNode(
|
|
86
|
+
node: ts.TypeNode | undefined,
|
|
87
|
+
sf: ts.SourceFile,
|
|
88
|
+
importedAliases: ReadonlyMap<string, R3fTypeAlias>,
|
|
89
|
+
): ts.TypeNode | undefined {
|
|
90
|
+
if (!node || !ts.isTypeReferenceNode(node) || !ts.isIdentifier(node.typeName)) return node;
|
|
91
|
+
if (node.typeArguments && node.typeArguments.length > 0) return node;
|
|
92
|
+
const name = node.typeName.text;
|
|
93
|
+
const local = localTypeDeclaration(sf, name);
|
|
94
|
+
if (local) return ts.isTypeAliasDeclaration(local) ? local.type : node;
|
|
95
|
+
const imported = importedAliases.get(name);
|
|
96
|
+
return imported ? imported.type : node;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function collectMembers(
|
|
100
|
+
members: ts.NodeArray<ts.TypeElement>,
|
|
101
|
+
into: Map<string, AuthoredMember>,
|
|
102
|
+
sf: ts.SourceFile,
|
|
103
|
+
importedAliases: ReadonlyMap<string, R3fTypeAlias>,
|
|
104
|
+
): void {
|
|
105
|
+
for (const member of members) {
|
|
106
|
+
if (!ts.isPropertySignature(member)) continue;
|
|
107
|
+
const name =
|
|
108
|
+
ts.isIdentifier(member.name) || ts.isStringLiteral(member.name) ? member.name.text : null;
|
|
109
|
+
if (!name) continue;
|
|
110
|
+
into.set(name, {
|
|
111
|
+
optional: member.questionToken !== undefined,
|
|
112
|
+
...widgetTypeOf(memberTypeNode(member.type, sf, importedAliases)),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** A named type declared in this same source file, or null. */
|
|
118
|
+
function localTypeDeclaration(
|
|
119
|
+
sf: ts.SourceFile,
|
|
120
|
+
name: string,
|
|
121
|
+
): ts.TypeAliasDeclaration | ts.InterfaceDeclaration | null {
|
|
122
|
+
for (const statement of sf.statements) {
|
|
123
|
+
if (
|
|
124
|
+
(ts.isTypeAliasDeclaration(statement) || ts.isInterfaceDeclaration(statement)) &&
|
|
125
|
+
statement.name.text === name
|
|
126
|
+
) {
|
|
127
|
+
return statement;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The authored members of a props type node. Follows intersections, same-file
|
|
135
|
+
* aliases/interfaces, and imported aliases the resolver supplied; a reference
|
|
136
|
+
* that resolves to nothing project-authored (`Omit<…>`, `ThreeElements[…]`)
|
|
137
|
+
* contributes nothing — the checker module's WHICH-props rule.
|
|
138
|
+
*/
|
|
139
|
+
function membersOfTypeNode(
|
|
140
|
+
node: ts.TypeNode,
|
|
141
|
+
sf: ts.SourceFile,
|
|
142
|
+
importedAliases: ReadonlyMap<string, R3fTypeAlias>,
|
|
143
|
+
into: Map<string, AuthoredMember>,
|
|
144
|
+
depth: number,
|
|
145
|
+
): void {
|
|
146
|
+
if (depth > 4) return;
|
|
147
|
+
if (ts.isTypeLiteralNode(node)) {
|
|
148
|
+
collectMembers(node.members, into, sf, importedAliases);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (ts.isIntersectionTypeNode(node)) {
|
|
152
|
+
for (const part of node.types) {
|
|
153
|
+
membersOfTypeNode(part, sf, importedAliases, into, depth + 1);
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (!ts.isTypeReferenceNode(node) || !ts.isIdentifier(node.typeName)) return;
|
|
158
|
+
const name = node.typeName.text;
|
|
159
|
+
const local = localTypeDeclaration(sf, name);
|
|
160
|
+
if (local) {
|
|
161
|
+
if (ts.isTypeAliasDeclaration(local)) {
|
|
162
|
+
membersOfTypeNode(local.type, sf, importedAliases, into, depth + 1);
|
|
163
|
+
} else {
|
|
164
|
+
collectMembers(local.members, into, sf, importedAliases);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const imported = importedAliases.get(name);
|
|
169
|
+
// The alias's own references resolve in the file it was WRITTEN in — the
|
|
170
|
+
// pairing `R3fTypeAlias` exists to carry.
|
|
171
|
+
if (imported) membersOfTypeNode(imported.type, imported.sf, new Map(), into, depth + 1);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: one bounded literal-syntax dispatcher, not application control flow.
|
|
175
|
+
function defaultOf(
|
|
176
|
+
init: ts.Expression,
|
|
177
|
+
sf: ts.SourceFile,
|
|
178
|
+
): { defaultText: string; defaultValue?: string | number | boolean | number[] } {
|
|
179
|
+
const defaultText = init.getText(sf);
|
|
180
|
+
if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) {
|
|
181
|
+
return { defaultText, defaultValue: init.text };
|
|
182
|
+
}
|
|
183
|
+
if (ts.isNumericLiteral(init)) return { defaultText, defaultValue: Number(init.text) };
|
|
184
|
+
if (
|
|
185
|
+
ts.isPrefixUnaryExpression(init) &&
|
|
186
|
+
init.operator === ts.SyntaxKind.MinusToken &&
|
|
187
|
+
ts.isNumericLiteral(init.operand)
|
|
188
|
+
) {
|
|
189
|
+
return { defaultText, defaultValue: -Number(init.operand.text) };
|
|
190
|
+
}
|
|
191
|
+
if (init.kind === ts.SyntaxKind.TrueKeyword) return { defaultText, defaultValue: true };
|
|
192
|
+
if (init.kind === ts.SyntaxKind.FalseKeyword) return { defaultText, defaultValue: false };
|
|
193
|
+
if (ts.isArrayLiteralExpression(init)) {
|
|
194
|
+
const numbers: number[] = [];
|
|
195
|
+
for (const element of init.elements) {
|
|
196
|
+
if (ts.isNumericLiteral(element)) numbers.push(Number(element.text));
|
|
197
|
+
else if (
|
|
198
|
+
ts.isPrefixUnaryExpression(element) &&
|
|
199
|
+
element.operator === ts.SyntaxKind.MinusToken &&
|
|
200
|
+
ts.isNumericLiteral(element.operand)
|
|
201
|
+
) {
|
|
202
|
+
numbers.push(-Number(element.operand.text));
|
|
203
|
+
} else return { defaultText };
|
|
204
|
+
}
|
|
205
|
+
return { defaultText, defaultValue: numbers };
|
|
206
|
+
}
|
|
207
|
+
return { defaultText };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** The props parameter of a component declaration, however it is spelled. */
|
|
211
|
+
function componentParameterOf(node: ts.Node): {
|
|
212
|
+
name: string;
|
|
213
|
+
parameter: ts.ParameterDeclaration;
|
|
214
|
+
} | null {
|
|
215
|
+
if (ts.isFunctionDeclaration(node) && node.name && node.parameters[0]) {
|
|
216
|
+
return { name: node.name.text, parameter: node.parameters[0] };
|
|
217
|
+
}
|
|
218
|
+
if (
|
|
219
|
+
ts.isVariableDeclaration(node) &&
|
|
220
|
+
ts.isIdentifier(node.name) &&
|
|
221
|
+
node.initializer &&
|
|
222
|
+
(ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&
|
|
223
|
+
node.initializer.parameters[0]
|
|
224
|
+
) {
|
|
225
|
+
return { name: node.name.text, parameter: node.initializer.parameters[0] };
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Every top-level component in `sf` that declares a prop surface syntax can
|
|
232
|
+
* read, by local name. `importedAliases` is the resolver's answer for the
|
|
233
|
+
* file's `import type { X } from './shared'` bindings.
|
|
234
|
+
*/
|
|
235
|
+
export function localComponentPropSpecs(
|
|
236
|
+
sf: ts.SourceFile,
|
|
237
|
+
importedAliases: ReadonlyMap<string, R3fTypeAlias>,
|
|
238
|
+
): Map<string, ComponentPropSpec[]> {
|
|
239
|
+
const found = new Map<string, ComponentPropSpec[]>();
|
|
240
|
+
const visit = (node: ts.Node): void => {
|
|
241
|
+
const component = componentParameterOf(node);
|
|
242
|
+
if (component && /^[A-Z]/.test(component.name) && !found.has(component.name)) {
|
|
243
|
+
const specs = specsOfParameter(component.parameter, sf, importedAliases);
|
|
244
|
+
if (specs.length > 0) found.set(component.name, specs);
|
|
245
|
+
}
|
|
246
|
+
if (ts.isSourceFile(node) || ts.isVariableStatement(node) || ts.isVariableDeclarationList(node))
|
|
247
|
+
ts.forEachChild(node, visit);
|
|
248
|
+
};
|
|
249
|
+
visit(sf);
|
|
250
|
+
return found;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: one bounded pass keeps the destructure-default and type-member halves of a parameter together.
|
|
254
|
+
function specsOfParameter(
|
|
255
|
+
parameter: ts.ParameterDeclaration,
|
|
256
|
+
sf: ts.SourceFile,
|
|
257
|
+
importedAliases: ReadonlyMap<string, R3fTypeAlias>,
|
|
258
|
+
): ComponentPropSpec[] {
|
|
259
|
+
const defaults = new Map<
|
|
260
|
+
string,
|
|
261
|
+
{ defaultText: string; defaultValue?: string | number | boolean | number[] }
|
|
262
|
+
>();
|
|
263
|
+
if (ts.isObjectBindingPattern(parameter.name)) {
|
|
264
|
+
for (const element of parameter.name.elements) {
|
|
265
|
+
if (element.dotDotDotToken) continue;
|
|
266
|
+
const authored = element.propertyName ?? element.name;
|
|
267
|
+
if (!ts.isIdentifier(authored) || !element.initializer) continue;
|
|
268
|
+
defaults.set(authored.text, defaultOf(element.initializer, sf));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const members = new Map<string, AuthoredMember>();
|
|
272
|
+
if (parameter.type) membersOfTypeNode(parameter.type, sf, importedAliases, members, 0);
|
|
273
|
+
if (members.size > 0) {
|
|
274
|
+
const specs: ComponentPropSpec[] = [];
|
|
275
|
+
for (const [name, member] of members) {
|
|
276
|
+
const withDefault = defaults.get(name);
|
|
277
|
+
specs.push({
|
|
278
|
+
name,
|
|
279
|
+
type: member.type,
|
|
280
|
+
...(member.options ? { options: member.options } : {}),
|
|
281
|
+
optional: member.optional || withDefault !== undefined,
|
|
282
|
+
...(withDefault ?? {}),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return specs;
|
|
286
|
+
}
|
|
287
|
+
// No authored members syntax can see: the destructured defaults are still
|
|
288
|
+
// the author's declaration, and they carry every field the override and
|
|
289
|
+
// apply gates read.
|
|
290
|
+
return [...defaults].map(([name, withDefault]) => ({
|
|
291
|
+
name,
|
|
292
|
+
type: null,
|
|
293
|
+
optional: true,
|
|
294
|
+
...withDefault,
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE A DESIGN-TIME SOURCE EDIT GOES, decided by what THIS SESSION'S HOST
|
|
3
|
+
* actually serves — the one home for a choice that used to be written out
|
|
4
|
+
* byte-for-byte in `r3f-design-session.ts` and `canvas-design-mount.ts`.
|
|
5
|
+
*
|
|
6
|
+
* ## The bug the duplication carried, twice
|
|
7
|
+
*
|
|
8
|
+
* Both copies read `import.meta.env.DEV ? createHttpSourceWriteBackend() :
|
|
9
|
+
* undefined`, with a comment claiming "a production build has no
|
|
10
|
+
* `/__ui-source/*` middleware". That is FALSE of the packaged editor a registry
|
|
11
|
+
* install runs (`server/packaged.ts`), which
|
|
12
|
+
* registers `uiOidPlugin()` and genuinely serves `/__ui-source/*` — while the
|
|
13
|
+
* editor shell it serves is a PRODUCTION build, so `import.meta.env.DEV` is
|
|
14
|
+
* `false` there. Net effect on every `npm i @vgai/editor` install: gizmo and
|
|
15
|
+
* inspector edits mounted, applied to the running object, and were silently
|
|
16
|
+
* discarded, because the recorder was reachable and nobody asked it.
|
|
17
|
+
*
|
|
18
|
+
* `import.meta.env.DEV` is a fact about how the SHELL BUNDLE was built. Whether
|
|
19
|
+
* source writes are recorded is a fact about the HOST SERVING IT. They are not
|
|
20
|
+
* the same axis, and the doctrine is explicit that a standing build flag may
|
|
21
|
+
* never be what decides whether writes happen — only the recorder's actual
|
|
22
|
+
* existence may.
|
|
23
|
+
*
|
|
24
|
+
* ## What decides it now
|
|
25
|
+
*
|
|
26
|
+
* The server states it: `/__editor/project` carries a top-level `sourceWrite`
|
|
27
|
+
* boolean, which the host derives from its OWN Vite plugin list (whether
|
|
28
|
+
* `uiOidPlugin()` — the plugin that serves the `/__ui-source/*` read/write
|
|
29
|
+
* endpoints — is registered), never from a hand-maintained second declaration.
|
|
30
|
+
* So dev and packaged each answer with what they really carry, and a
|
|
31
|
+
* future host cannot forget to.
|
|
32
|
+
*
|
|
33
|
+
* Reading a server-stated flag rather than probing the route directly is the
|
|
34
|
+
* shape `packaged-runtime.ts` already established for the sibling question
|
|
35
|
+
* ("is this the packaged runtime?"), for the reason recorded there: a probe
|
|
36
|
+
* that only resolves on some hosts logs an unsuppressible browser console error
|
|
37
|
+
* on the others. It is memoized per page load for the same reason — the runtime
|
|
38
|
+
* a server process is running under cannot change without a restart.
|
|
39
|
+
*
|
|
40
|
+
* ## The honest floor
|
|
41
|
+
*
|
|
42
|
+
* "No recorder" is decided PER LANE and per tier, never per build. On the
|
|
43
|
+
* hosted (browser) tier the native/OID lane HAS one — the storage-backed
|
|
44
|
+
* recorder — while the ingest lane genuinely does not, because
|
|
45
|
+
* `IngestSourcePersistence` speaks `/__ingest-source/*` HTTP and has no
|
|
46
|
+
* storage-backed equivalent. Both answers are stated by asking what this
|
|
47
|
+
* session actually carries; neither is inferred from the other.
|
|
48
|
+
*
|
|
49
|
+
* When no recorder exists, this returns `undefined` and NOTHING fabricates a
|
|
50
|
+
* write path. The adapter then exposes no `persistence` provider, which is what
|
|
51
|
+
* makes the standing capability report say so in the product's own words
|
|
52
|
+
* (`adapter-reach.ts`, `PROVIDER_GAP.persistence`: "edits to this world are
|
|
53
|
+
* live-only — the mount carries no write-back route to the game's own source").
|
|
54
|
+
* That is a warning that keeps firing, not a grade.
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
import { editorServerJson } from '../editor-server-response';
|
|
58
|
+
import { createHttpSourceWriteBackend, type SourceWriteBackend } from './source-write-backend';
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The two write routes a host may serve, as it states them.
|
|
62
|
+
*
|
|
63
|
+
* Two booleans rather than one because they are two PLUGINS — `uiOidPlugin`
|
|
64
|
+
* serves `/__ui-source/*` (the native + OID lanes' recorder) and
|
|
65
|
+
* `creationSiteWritePlugin` serves `/__ingest-source/*` (the ingest lane's), and
|
|
66
|
+
* a host can register either without the other. They arrive in ONE probe
|
|
67
|
+
* because they are two fields of one response, not two questions.
|
|
68
|
+
*/
|
|
69
|
+
interface SourceWriteRoutes {
|
|
70
|
+
readonly ui: boolean;
|
|
71
|
+
readonly ingest: boolean;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let cachedSourceWriteRoutes: Promise<SourceWriteRoutes> | null = null;
|
|
75
|
+
/** The ANSWER, once a probe has actually produced one — what the synchronous
|
|
76
|
+
* readers below serve. `null` means "not asked yet, or asked and not
|
|
77
|
+
* answered"; it is never set from a failed probe, for the reason the memo's
|
|
78
|
+
* own doc comment records. */
|
|
79
|
+
let settledSourceWriteRoutes: SourceWriteRoutes | null = null;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* What this origin's host says it serves — the one probe both flags read.
|
|
83
|
+
*
|
|
84
|
+
* A plain inline `fetch()` rather than `editor-api.ts`'s project reader, for
|
|
85
|
+
* the reason `packaged-runtime.ts` records: this module is reachable from
|
|
86
|
+
* design-mount code that headless Node/vitest suites import, and
|
|
87
|
+
* `editor-api.ts`'s module top level pulls in `./storage`.
|
|
88
|
+
*
|
|
89
|
+
* An ANSWER is memoized for the page; a probe that never got one is not. The
|
|
90
|
+
* memo exists because the runtime a server process runs under cannot change
|
|
91
|
+
* without a restart — but a probe that failed to reach the server learned
|
|
92
|
+
* nothing about that runtime, and latching its fallback would turn one
|
|
93
|
+
* unlucky fetch (a design mount landing in the window while `vgai edit`
|
|
94
|
+
* restarts its dev server — a routine event, it restarts on any server-file
|
|
95
|
+
* change) into a page whose authoring is live-only until someone reloads.
|
|
96
|
+
* `packaged-runtime.ts` drops a failed probe for the same reason — its own
|
|
97
|
+
* latch was measured doing the same damage on the graph-identity axis — and
|
|
98
|
+
* the two differ only in what the failed probe's OWN caller gets: that one
|
|
99
|
+
* rejects (a mount on a guessed module graph is not a degraded mount, it is
|
|
100
|
+
* the wrong one), while this flag answers `false` for that caller, because
|
|
101
|
+
* live-only-for-one-mount is a real, sayable degrade and this module says it
|
|
102
|
+
* out loud in {@link primedRoutes}.
|
|
103
|
+
*
|
|
104
|
+
* THE BROWSER TIER IS ANSWERED HERE, not at each call site. There is no
|
|
105
|
+
* `/__editor/project` on that origin, and a fetch that 404s logs an
|
|
106
|
+
* unsuppressible console error on a page whose answer is already known. The
|
|
107
|
+
* guard lived on `primeSourceWriteRuntime` alone, which left
|
|
108
|
+
* `ingest-root-adapter.ts`'s `readServedOidIndex` — the one caller that
|
|
109
|
+
* reaches this once per ingest mount — firing exactly the fetch this rule
|
|
110
|
+
* exists to prevent, and re-firing it on every mount because a failed probe
|
|
111
|
+
* deliberately does not latch.
|
|
112
|
+
*/
|
|
113
|
+
function serverSourceWriteRoutes(): Promise<SourceWriteRoutes> {
|
|
114
|
+
if (!cachedSourceWriteRoutes) {
|
|
115
|
+
// The call is INSIDE the chain, so a `fetch` that throws SYNCHRONOUSLY is a
|
|
116
|
+
// rejected probe like any other rather than an exception thrown at whoever
|
|
117
|
+
// asked. That matters now that `primedRoutes` kicks this from a synchronous
|
|
118
|
+
// mount path: a throw there would take the whole mount down over a question
|
|
119
|
+
// whose honest answer is "no recorder".
|
|
120
|
+
const probe: Promise<SourceWriteRoutes> = Promise.resolve()
|
|
121
|
+
.then(() => fetch('/__editor/project'))
|
|
122
|
+
.then((res) =>
|
|
123
|
+
editorServerJson<{ sourceWrite?: boolean; ingestSourceWrite?: boolean }>(
|
|
124
|
+
res,
|
|
125
|
+
'`/__editor/project` did not answer the source-write probe',
|
|
126
|
+
),
|
|
127
|
+
)
|
|
128
|
+
.then((data) => {
|
|
129
|
+
const answer: SourceWriteRoutes = {
|
|
130
|
+
ui: Boolean(data.sourceWrite),
|
|
131
|
+
ingest: Boolean(data.ingestSourceWrite),
|
|
132
|
+
};
|
|
133
|
+
settledSourceWriteRoutes = answer;
|
|
134
|
+
return answer;
|
|
135
|
+
})
|
|
136
|
+
.catch(() => {
|
|
137
|
+
if (cachedSourceWriteRoutes === probe) cachedSourceWriteRoutes = null;
|
|
138
|
+
return { ui: false, ingest: false };
|
|
139
|
+
});
|
|
140
|
+
cachedSourceWriteRoutes = probe;
|
|
141
|
+
}
|
|
142
|
+
return cachedSourceWriteRoutes;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Does the server on this origin serve the `/__ui-source/*` recorder? See
|
|
146
|
+
* {@link serverSourceWriteRoutes} for the memo's rules. */
|
|
147
|
+
export function serverRecordsSourceWrites(): Promise<boolean> {
|
|
148
|
+
return serverSourceWriteRoutes().then((routes) => routes.ui);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Ask the question ONCE, at editor boot, so the synchronous reader below has a
|
|
153
|
+
* real answer by the time any surface mounts. Called from the frame bridge
|
|
154
|
+
* beside the other install-time wiring; every other caller still asks through
|
|
155
|
+
* the two functions above and gets this same memo.
|
|
156
|
+
*/
|
|
157
|
+
export function primeSourceWriteRuntime(): void {
|
|
158
|
+
void serverSourceWriteRoutes();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The settled routes, or `null` with the warning already said — the shared body
|
|
163
|
+
* of the two synchronous readers below, so the three-case contract documented on
|
|
164
|
+
* {@link sourceWriteBackendIfPrimed} is written once.
|
|
165
|
+
*/
|
|
166
|
+
/**
|
|
167
|
+
* Say a not-yet-primed mount out loud. Shared by both tiers because it is the
|
|
168
|
+
* same degrade on each — this mount's edits are live-only, and a remount is a
|
|
169
|
+
* real remedy because the caller kicked the prime on the way out.
|
|
170
|
+
*
|
|
171
|
+
* The console IS the loud leg: capture feeds editorConsole and console-sync
|
|
172
|
+
* forwards it to `vgai console`, without this module importing the editor-api
|
|
173
|
+
* graph a headless design mount must not pull in.
|
|
174
|
+
*/
|
|
175
|
+
function warnUnprimed(surface: string): void {
|
|
176
|
+
// biome-ignore lint/suspicious/noConsole: see this function's doc comment
|
|
177
|
+
console.warn(
|
|
178
|
+
`[vgai-editor] ${surface} mounted before this session's source-write route was ` +
|
|
179
|
+
'confirmed, so its edits are live-only. Remount the surface (reopen the project) ' +
|
|
180
|
+
'to author against the game’s own source.',
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function primedRoutes(surface: string): SourceWriteRoutes | null {
|
|
185
|
+
// The BROWSER tier never reaches here for the `ui` question — that is
|
|
186
|
+
// answered by `sourceWriteBackendIfPrimed`'s own storage-backed path. The
|
|
187
|
+
// ingest question now has a storage answer too: `IngestSourcePersistence`
|
|
188
|
+
// runs against `authoring/browser-ingest-source.ts`'s route emulation for a
|
|
189
|
+
// storage-backed project (a staged example/ingest keeps the honest "no").
|
|
190
|
+
if (settledSourceWriteRoutes === null) {
|
|
191
|
+
// ASK AGAIN, so the remedy this warning names is a real one. The boot prime
|
|
192
|
+
// is ONE probe, and a probe that never reached the server (a mount landing
|
|
193
|
+
// while `vgai edit` restarts its dev server) settles nothing — after which
|
|
194
|
+
// only `ingest-root-adapter.ts`'s `readServedOidIndex` re-asks, and it is on
|
|
195
|
+
// the three lane alone. Without this kick the canvas-ingest and ingest-DOM
|
|
196
|
+
// surfaces warn for the LIFE OF THE PAGE and "remount the surface" changes
|
|
197
|
+
// nothing, which is the silent live-only session this whole seam exists to
|
|
198
|
+
// end. Fire-and-forget: this caller is synchronous and honestly live-only
|
|
199
|
+
// either way; the kick is what makes the NEXT mount recorded. A probe
|
|
200
|
+
// already in flight is the memo, so this cannot stack.
|
|
201
|
+
void serverSourceWriteRoutes();
|
|
202
|
+
warnUnprimed(surface);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
return settledSourceWriteRoutes;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The source-write backend for a mount whose call site is SYNCHRONOUS, or
|
|
210
|
+
* `undefined` when there is honestly no recorder for it.
|
|
211
|
+
*
|
|
212
|
+
* Same axis as {@link tierSourceWriteBackend} — what the HOST serves, never how
|
|
213
|
+
* the shell was built — read from the memo above instead of awaited. The three
|
|
214
|
+
* answers, stated because a sync reader of an async fact has to state them:
|
|
215
|
+
*
|
|
216
|
+
* 1. **Primed** (the ordinary case): `primeSourceWriteRuntime()` runs at boot,
|
|
217
|
+
* before a project is open and therefore before anything here can mount, so
|
|
218
|
+
* by the time an ingest sibling, an ingest DOM surface or a Play→source
|
|
219
|
+
* committer is constructed the route fact is in hand and this returns the
|
|
220
|
+
* real recorder on any host that serves `/__ui-source/*`.
|
|
221
|
+
* 2. **Answered `false`**: no recorder, `undefined`, and nothing is fabricated
|
|
222
|
+
* — the honest floor described in this module's header.
|
|
223
|
+
* 3. **Not yet answered**: `undefined` AND A WARNING, never a silent
|
|
224
|
+
* `undefined`. This can only happen when a surface mounts inside the boot
|
|
225
|
+
* probe's own round trip (or while a restarting dev server is unreachable),
|
|
226
|
+
* and the cost is one mount's edits being live-only, so it is said out loud
|
|
227
|
+
* on the channel `console-sync.ts` forwards to `vgai console` — the same
|
|
228
|
+
* place every other unresolved editor condition lands — naming the surface
|
|
229
|
+
* and the remedy. It also RE-ASKS on the way out, which is what makes that
|
|
230
|
+
* remedy true rather than advice: a boot probe that never reached the server
|
|
231
|
+
* leaves nothing to settle, and these surfaces have no async door of their
|
|
232
|
+
* own to re-open it with. Deliberately NOT an assert: none of these call
|
|
233
|
+
* sites is reachable only after a design mount (an ingest root mounts with
|
|
234
|
+
* no design session at all), so "this cannot happen" would be a claim, not
|
|
235
|
+
* a fact.
|
|
236
|
+
*
|
|
237
|
+
* The BROWSER tier answers with its storage-backed recorder, primed at boot by
|
|
238
|
+
* {@link primeSourceWriteRuntime}. It used to answer `undefined` here on the
|
|
239
|
+
* grounds that a dynamic import is unreachable from a synchronous call site —
|
|
240
|
+
* true of the import, but the conclusion drawn from it was false: that tier has
|
|
241
|
+
* a real, working recorder ({@link tierSourceWriteBackend} builds and uses it),
|
|
242
|
+
* so `undefined` made four surfaces report "cannot write project source" on a
|
|
243
|
+
* tier that can. Priming moved the import off the call site instead of asking a
|
|
244
|
+
* sync function to await. If the prime has not landed yet, the same case-3
|
|
245
|
+
* warning below applies, and it re-kicks the build for the same reason.
|
|
246
|
+
*/
|
|
247
|
+
export function sourceWriteBackendIfPrimed(surface: string): SourceWriteBackend | undefined {
|
|
248
|
+
return primedRoutes(surface)?.ui ? createHttpSourceWriteBackend() : undefined;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The ingest lane's half: may this session write an ingest edit into the game's
|
|
253
|
+
* own source through `/__ingest-source/*`?
|
|
254
|
+
*
|
|
255
|
+
* Same three cases, same reasons, same channel as
|
|
256
|
+
* {@link sourceWriteBackendIfPrimed} — a different route because it is a
|
|
257
|
+
* different plugin. `false` is the honest floor and the caller builds no writer,
|
|
258
|
+
* so the ingest adapter reports live-only in the product's own words rather than
|
|
259
|
+
* failing at the first apply.
|
|
260
|
+
*/
|
|
261
|
+
export function ingestSourceWritesRecordedIfPrimed(surface: string): boolean {
|
|
262
|
+
return primedRoutes(surface)?.ingest === true;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** Test-only: reset the memoized result (mirrors
|
|
266
|
+
* `resetPackagedRuntimeCacheForTest`'s seam shape). */
|
|
267
|
+
export function resetSourceWriteRuntimeCacheForTest(): void {
|
|
268
|
+
cachedSourceWriteRoutes = null;
|
|
269
|
+
settledSourceWriteRoutes = null;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* The source-write backend this session can honestly use, or `undefined` when
|
|
274
|
+
* there is no recorder to write through — the session's own `/__ui-source/*`
|
|
275
|
+
* route, confirmed once by {@link serverRecordsSourceWrites}.
|
|
276
|
+
*/
|
|
277
|
+
export async function tierSourceWriteBackend(): Promise<SourceWriteBackend | undefined> {
|
|
278
|
+
return (await serverRecordsSourceWrites()) ? createHttpSourceWriteBackend() : undefined;
|
|
279
|
+
}
|