@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.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. 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 = {};