@volter/sdk 0.0.0-stage → 0.5.203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1166 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +317 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +403 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,605 @@
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
+ * (the source-authoring integration's writer, invoked by its serving plugin'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 the source-authoring integration's serving plugin 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 '@volter/sdk/kit/bytes-codec';
37
+ import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
38
+ import { setCollaborationRevision, sourceMutationAttribution } from '@volter/sdk/kit/editor-session-attribution';
39
+ import { projectFiles } from '@volter/sdk/kit/files/project-files';
40
+ import { handleProjectMutationFailure } from '@volter/sdk/kit/source-conflict';
41
+ import type {
42
+ ComponentPropSpec,
43
+ DuplicateRewrite,
44
+ OidEntry,
45
+ PreparedSourceEdit,
46
+ SourceEditRequest,
47
+ StructReparentContext,
48
+ } from '@volter/sdk/source-authoring';
49
+
50
+ export type {
51
+ PreparedSourceEdit,
52
+ SourceEditRequest,
53
+ StructReparentContext,
54
+ } from '@volter/sdk/source-authoring';
55
+
56
+ /** The source-write operations (+ the OID index read) the dev-server middleware
57
+ * already exposes. */
58
+ export interface SourceWriteBackend {
59
+ /** Stable identity for stateless backend instances sharing one source transport. */
60
+ readonly historyIdentity?: object;
61
+ /** True when every write is already committed through HistoryService. */
62
+ readonly historyManaged?: boolean;
63
+ /**
64
+ * Runs a multi-write gesture (a boxEdit drag touching width+height, …) as one
65
+ * failure-atomic history transaction. Only writes made through the scoped
66
+ * backend belong to the gesture; unrelated writes on this backend serialize
67
+ * outside it. Absent on a non-history-managed backend.
68
+ */
69
+ runGesture?<T>(
70
+ label: string,
71
+ operation: (scopedBackend: SourceWriteBackend) => Promise<T>,
72
+ ): Promise<T>;
73
+ /** Pure prepare: compute exact whole-file before/after without writing. */
74
+ prepare?(request: SourceEditRequest): Promise<PreparedSourceEdit>;
75
+ /**
76
+ * Read one scope-checked source file for capture/preflight.
77
+ *
78
+ * `bytes` is present ONLY when the file is not text — an ingested game's
79
+ * level data, say. When it is, history stores those bytes and `source` is
80
+ * merely the wire form this backend chose; when it is absent, `source` IS the
81
+ * file. History must never keep the wire form: `sha` is always the digest of
82
+ * the FILE's bytes, so a snapshot holding base64 text would declare a sha
83
+ * nothing could reproduce, and undo's "did the write land?" check would fail
84
+ * on every binary file.
85
+ */
86
+ readSource?(
87
+ file: string,
88
+ ): Promise<{ source: string; sha: string; resourcePath: string; bytes?: Uint8Array }>;
89
+ /** Guarded whole-file apply used by commit, undo, and redo. Bytes go through
90
+ * as bytes; the backend owns whatever the wire needs. */
91
+ applySource?(
92
+ file: string,
93
+ source: string | Uint8Array,
94
+ ifMatchSha: string,
95
+ ): Promise<{ applied: boolean; sha?: string; error?: string }>;
96
+ /** Surgical inline-style/className edit — the `/__ui-source/write` shape.
97
+ * `appended` (D-A1) is true only when the write took the writer's
98
+ * APPEND branch (no prior literal for this prop) — see
99
+ * `ReactRootAuthoringAdapter.writeStyle`'s append-aware undo (D-A4).
100
+ *
101
+ * `value` accepts a NUMBER, and callers with a numeric descriptor MUST pass
102
+ * one: `String(300)` here writes `width: '300'`, which React passes through
103
+ * and the CSSOM rejects — source changes, the screen does not, and the ack
104
+ * still says `persisted: true`. See `@volter/sdk/css-numeric-style`. */
105
+ writeStyle(
106
+ oid: string,
107
+ prop: string,
108
+ value: string | number,
109
+ ): Promise<{
110
+ changed: boolean;
111
+ dynamic?: boolean;
112
+ /** Present when the write was refused because the existing source value is
113
+ * a `var(--token)` reference; the string IS the reference. Distinct from
114
+ * `dynamic` because the refusal names a token, not an expression. */
115
+ tokenRef?: string;
116
+ route?: string;
117
+ error?: string;
118
+ appended?: boolean;
119
+ }>;
120
+ /**
121
+ * D-A3: surgically REMOVE an appended inline-style property — the
122
+ * correct undo for a write that took the append branch (`appended: true`).
123
+ * Posts the SAME `/__ui-source/write` endpoint `writeStyle` uses, with the
124
+ * `value: null` removal sentinel the middleware routes to `removeInlineStyle`.
125
+ */
126
+ removeStyle(
127
+ oid: string,
128
+ prop: string,
129
+ ): Promise<{ changed: boolean; route?: string; error?: string }>;
130
+ /** Surgical CSS-FILE edit (Cap 2) — the `/__ui-source/css` shape. The client resolves
131
+ * the target rule (source file + selector) from live matched-rule data and sends it;
132
+ * the server edits that file in place. `generated: true` means the selector was not
133
+ * found in source (generated CSS) — the caller re-routes to class/inline.
134
+ * Optional: only a dev-server-backed implementation serves it. */
135
+ writeCss?(
136
+ file: string,
137
+ selector: string,
138
+ prop: string,
139
+ value: string,
140
+ media?: string,
141
+ ): Promise<{ changed: boolean; generated?: boolean; error?: string }>;
142
+ /** Text-content edit (Cap 3) — the `/__ui-source/text` shape. Replaces a leaf element's
143
+ * pure-text body; `dynamic: true` means the body has an expression/children (refused).
144
+ * `prevText` is the editable text before the edit (for the undo inverse). Optional:
145
+ * only a dev-server-backed implementation serves it. */
146
+ writeText?(
147
+ oid: string,
148
+ text: string,
149
+ ): Promise<{ changed: boolean; dynamic?: boolean; prevText?: string | null; error?: string }>;
150
+ /** Component prop / attribute edit (Cap 4) — the `/__ui-source/prop` shape. `oid` is the
151
+ * CALL-SITE oid (the `<Component …>` tag). `dynamic: true` ⇒ the prop is a non-literal
152
+ * expression (refused). Optional: only a dev-server-backed implementation serves it.
153
+ * `opts.addIfMissing` (W2 — opt-in, default off) appends the prop to the opening tag
154
+ * when it is absent instead of no-op'ing (the R3F gizmo path needs this for a mesh
155
+ * whose source never authored a transform tuple yet). `opts.allowShapeUpgrade` (R2 —
156
+ * opt-in, default off) permits a number-tuple literal to replace a plain number literal
157
+ * for the same prop (the `scale={1.5}` scalar shorthand upgraded by a non-uniform gizmo
158
+ * drag). */
159
+ writeProp?(
160
+ oid: string,
161
+ prop: string,
162
+ value: string,
163
+ opts?: { addIfMissing?: boolean; allowShapeUpgrade?: boolean },
164
+ ): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
165
+ /**
166
+ * REMOVE a whole prop attribute — the inverse of `writeProp`'s `addIfMissing`
167
+ * append, and what the inspector's revert-to-default does: with no attribute,
168
+ * the value in force is the one the component's own signature declares.
169
+ * Wire shape is `/__ui-source/prop` with `value: null`, matching the
170
+ * `removeStyle` sentinel (D-A3). A source no-op when the attribute is absent,
171
+ * and refused (`dynamic: true`) when it is expression-bound.
172
+ */
173
+ removeProp?(
174
+ oid: string,
175
+ prop: string,
176
+ ): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
177
+ /** Apply a literal instance value to its component's native declaration. */
178
+ writeComponentDefault?(
179
+ definitionOid: string,
180
+ prop: string,
181
+ value: string,
182
+ ): Promise<{ changed: boolean; dynamic?: boolean; error?: string }>;
183
+ /**
184
+ * Structural source edit — the `/__ui-source/struct` shape. Ops: `delete`, `duplicate`,
185
+ * `wrap`/`unwrap`, `create`, `create-sibling`, `reorder`, `reparent` (Cap 5). Multi-oid
186
+ * ops pass the companion oid(s) + optional `wrapperTag` via `opts`.
187
+ *
188
+ * D-1 (spec27 §2): when `changed`, the server ALSO returns the whole
189
+ * touched file's `prevSource`/`newSource` (before/after this op) plus their
190
+ * `prevSha`/`newSha` (sha256, server-computed) — the checksum-guarded
191
+ * whole-file snapshot inverse `ReactRootAuthoringAdapter.structOp` needs to
192
+ * push ONE undo/redo entry per structural op (a per-OID inverse is unsound
193
+ * here: OIDs are `file:component:tag:nthOccurrence` content signatures,
194
+ * reorder/delete reassign occurrence indices, and delete has no inverse
195
+ * payload of its own). These fields are absent when `changed` is false, and
196
+ * on an implementation that predates D-1 (a bare `{changed}` mock) — either
197
+ * way the caller degrades to "not undoable" rather than crashing.
198
+ */
199
+ writeStruct(
200
+ oid: string,
201
+ op: string,
202
+ opts?: {
203
+ targetOid?: string;
204
+ parentOid?: string;
205
+ wrapperTag?: string;
206
+ snippet?: string;
207
+ ensureImport?: { name: string; module: string; kind?: 'default' | 'named' };
208
+ duplicate?: DuplicateRewrite;
209
+ } & StructReparentContext,
210
+ ): Promise<{
211
+ changed: boolean;
212
+ error?: string;
213
+ /** Applied, but with something the author should know — a `reparent` that took the
214
+ * element out of a definition rendered more than once (R3's mirrored case). */
215
+ warning?: string;
216
+ file?: string;
217
+ prevSource?: string;
218
+ newSource?: string;
219
+ prevSha?: string;
220
+ newSha?: string;
221
+ }>;
222
+ /**
223
+ * Batched structural source edit. `delete` is the delete-order-residual fix;
224
+ * `group` resolves sibling elements from the same source snapshot and wraps
225
+ * them beneath one ordinary R3F group. Both produce one history transaction.
226
+ *
227
+ * Delete details — bug-panel follow-up to
228
+ * the multi-delete corruption fix, 50f90a6d), the `/__ui-source/struct-many`
229
+ * shape. Unlike N separate
230
+ * `writeStruct(oid, 'delete')` calls, the server resolves every `oids` entry's
231
+ * offset against ONE shared file snapshot and applies them all in a single write
232
+ * — sound and CALLER-ORDER-INDEPENDENT (see `handleStructMany`'s doc comment,
233
+ * the source-authoring integration's serving plugin): the caller does not need to sort `oids` into any
234
+ * particular order, source or otherwise. Same response shape as `writeStruct`
235
+ * (one `prevSource`/`newSource`/`prevSha`/`newSha` snapshot for the whole batch
236
+ * — one undo entry, not N). Optional: only a dev-server-backed implementation
237
+ * serves it; its absence is how `ReactRootAuthoringAdapter` honestly degrades
238
+ * `structure.removeMany` to absent (the shell then falls back to
239
+ * `deleteSelection`'s per-id loop, unchanged).
240
+ */
241
+ writeStructMany?(
242
+ oids: readonly string[],
243
+ op: string,
244
+ opts?: { wrapperTag?: string },
245
+ ): Promise<{
246
+ changed: boolean;
247
+ error?: string;
248
+ file?: string;
249
+ prevSource?: string;
250
+ newSource?: string;
251
+ prevSha?: string;
252
+ newSha?: string;
253
+ }>;
254
+ /** The whole OID → source-location index — the `/__ui-source/index` shape.
255
+ * Optional: only a dev-server-backed implementation can serve it. */
256
+ index?(): Promise<Record<string, OidEntry>>;
257
+ /**
258
+ * The props a component DECLARES, read from its definition file — the door a
259
+ * drop uses before the element exists anywhere (`index()` only carries the
260
+ * specs of tags already used). `file` is project-relative; `component` names
261
+ * the declared function and how the module exports it. Empty when the
262
+ * definition cannot be read — never a guess. Optional: a backend without a
263
+ * resolver drops with no declared defaults, as before.
264
+ */
265
+ componentProps?(
266
+ file: string,
267
+ component: { name: string; exportKind: 'default' | 'named' },
268
+ ): Promise<ComponentPropSpec[]>;
269
+ /**
270
+ * H7 "Fork Component…" — the `/__ui-source/fork-component` shape.
271
+ *
272
+ * The ONLY seam on this backend that CREATES a file, which is exactly why it
273
+ * is a server capability rather than a client composition of the existing
274
+ * ones: `readSource`/`applySource` are checksum-guarded against a file that
275
+ * already exists, and nothing here can bring a new path into being.
276
+ *
277
+ * The server copies the component's module to a renamed sibling and returns
278
+ * the CALLSITE edit unwritten (`callsitePrevSource`/`callsiteNewSource`), so
279
+ * the caller can push that half through project history — the new file stays
280
+ * outside history deliberately, and an undo therefore restores the callsite
281
+ * and leaves the copy behind as an inert module nothing imports.
282
+ *
283
+ * Optional: only a dev-server-backed implementation serves it; its absence is
284
+ * how a hosted/read-only session honestly reports that forking is off.
285
+ */
286
+ forkComponent?(
287
+ oid: string,
288
+ definitionOid: string,
289
+ name?: string,
290
+ ): Promise<{
291
+ ok: boolean;
292
+ error?: string;
293
+ newName?: string;
294
+ tag?: string;
295
+ newFile?: string;
296
+ newResourcePath?: string;
297
+ importSpecifier?: string;
298
+ label?: string;
299
+ callsiteFile?: string;
300
+ callsiteResourcePath?: string;
301
+ callsitePrevSource?: string;
302
+ callsiteNewSource?: string;
303
+ callsitePrevSha?: string;
304
+ callsiteNewSha?: string;
305
+ }>;
306
+ /**
307
+ * P1 "Extract Component…" — the `/__ui-source/extract-component` shape, and
308
+ * the fork seam's sibling (the fork's doc above records why file creation is
309
+ * a server capability at all). The server writes TWO new files — the
310
+ * component module and its portable CSF story under `src/prefabs/` — and
311
+ * returns the CALLSITE edit unwritten, so the caller pushes that half
312
+ * through project history: undo restores the callsite and leaves the new
313
+ * files as an inert module + story nothing imports. Optional: only a
314
+ * dev-server-backed implementation serves it.
315
+ */
316
+ extractComponent?(
317
+ oid: string,
318
+ name?: string,
319
+ ): Promise<{
320
+ ok: boolean;
321
+ error?: string;
322
+ newName?: string;
323
+ tag?: string;
324
+ componentFile?: string;
325
+ componentResourcePath?: string;
326
+ storyFile?: string;
327
+ storyResourcePath?: string;
328
+ importSpecifier?: string;
329
+ label?: string;
330
+ callsiteFile?: string;
331
+ callsiteResourcePath?: string;
332
+ callsitePrevSource?: string;
333
+ callsiteNewSource?: string;
334
+ callsitePrevSha?: string;
335
+ callsiteNewSha?: string;
336
+ }>;
337
+ }
338
+
339
+ /**
340
+ * Adopt the revision a write just produced.
341
+ *
342
+ * The collaboration guard rejects a mutation whose `expectedRevision` is older
343
+ * than the target file's, and the SSE stream that teaches the client its
344
+ * revision lands one event loop late — so the SECOND write of a multi-write
345
+ * gesture used to be refused by its own first write (measured on a canvas
346
+ * transform drag, whose `position` channel is `x` + `y`). The server now
347
+ * reports the revision it recorded on the response this call already awaits;
348
+ * taking it here is what makes a sequential write sequence legal.
349
+ * `setCollaborationRevision` only ever moves forward, so a stale or absent
350
+ * value is harmless.
351
+ */
352
+ function adoptResponseRevision(value: unknown): void {
353
+ if (value && typeof value === 'object' && 'revision' in value) {
354
+ const revision = (value as { revision?: unknown }).revision;
355
+ if (typeof revision === 'number') setCollaborationRevision(revision);
356
+ }
357
+ }
358
+
359
+ /** The CSF story write door (`/__ui-source/csf-story`) — save an arg set as
360
+ * a new story export, rename one, delete one, through {@link postJson} so the
361
+ * collaboration envelope stays attached in one place; the planner's refusals
362
+ * arrive as `error`. */
363
+ export async function writeCsfStory(request: {
364
+ op: 'save' | 'rename' | 'delete';
365
+ file: string;
366
+ name: string;
367
+ newName?: string;
368
+ args?: Record<string, unknown>;
369
+ }): Promise<{ changed: boolean; summary?: string; error?: string }> {
370
+ return postJson('/__ui-source/csf-story', request);
371
+ }
372
+
373
+ /** The named-style write door (`/__ui-source/named-style`) — mint a CSS class
374
+ * from the element's literal inline styles (`create`, with `file` naming the
375
+ * target first-party stylesheet), or add/remove the bare class token
376
+ * (`apply`/`remove`). Collaboration envelope attached by `postJson`. */
377
+ export async function writeNamedStyle(request: {
378
+ op: 'create' | 'apply' | 'remove';
379
+ oid: string;
380
+ className: string;
381
+ file?: string;
382
+ }): Promise<{ changed: boolean; moved?: string[]; summary?: string; error?: string }> {
383
+ return postJson('/__ui-source/named-style', request);
384
+ }
385
+
386
+ async function postJson<T>(url: string, body: unknown): Promise<T> {
387
+ const attribution = sourceMutationAttribution();
388
+ const attributedBody =
389
+ body && typeof body === 'object' && !Array.isArray(body)
390
+ ? {
391
+ ...body,
392
+ ...attribution,
393
+ }
394
+ : body;
395
+ const res = await fetch(url, {
396
+ method: 'POST',
397
+ headers: { 'Content-Type': 'application/json' },
398
+ body: JSON.stringify(attributedBody),
399
+ });
400
+ if (res.ok === false && res.status === 409) {
401
+ const record =
402
+ body && typeof body === 'object' && !Array.isArray(body)
403
+ ? (body as Record<string, unknown>)
404
+ : {};
405
+ const file = typeof record['file'] === 'string' ? record['file'] : null;
406
+ const attempted =
407
+ file && typeof record['source'] === 'string' ? { [file]: record['source'] } : {};
408
+ await handleProjectMutationFailure(res, {
409
+ label: `Source mutation ${url}`,
410
+ attempted,
411
+ reapply: () => postJson(url, body).then(() => undefined),
412
+ });
413
+ }
414
+ const parsed = await readJsonResponse<T>(res, url);
415
+ adoptResponseRevision(parsed);
416
+ return parsed;
417
+ }
418
+
419
+ /**
420
+ * The ONE place every `/__ui-source/*` answer is read. That prefix is served by
421
+ * the same dev server as `/__editor/*` (the source-authoring integration's serving plugin), on the same
422
+ * origin, behind the same page fallback — so the fallback check is the same
423
+ * check, run BEFORE the parse. Without it a source write against an origin with
424
+ * no recorder died as `Unexpected token '<'` at the author's next keystroke.
425
+ * Non-OK statuses keep their own `{ error }` handling below.
426
+ */
427
+ async function readJsonResponse<T>(res: Response, url: string): Promise<T> {
428
+ assertEditorServerAnswered(res, `Source request ${url} failed`);
429
+ let payload: unknown;
430
+ try {
431
+ payload = await res.json();
432
+ } catch (error) {
433
+ if (res.ok !== false) throw error;
434
+ throw new Error(`Source request ${url} failed with HTTP ${res.status}.`, { cause: error });
435
+ }
436
+ if (res.ok === false) {
437
+ const detail =
438
+ payload && typeof payload === 'object'
439
+ ? String(
440
+ (payload as { error?: unknown; message?: unknown }).error ??
441
+ (payload as { message?: unknown }).message ??
442
+ res.statusText,
443
+ )
444
+ : res.statusText;
445
+ throw new Error(
446
+ `Source request ${url} failed with HTTP ${res.status}${detail ? `: ${detail}` : ''}.`,
447
+ );
448
+ }
449
+ return payload as T;
450
+ }
451
+
452
+ /**
453
+ * WHERE EVERY WHOLE-FILE SOURCE WRITE LANDS, and why the frame changes it.
454
+ *
455
+ * `applySource` is the write end of the entire native authoring lane: a gizmo
456
+ * drag is `prepare` → `HistoryService.transaction` → `applySource`, and its
457
+ * UNDO and REDO are the same call with the inverse snapshot
458
+ * (`history/source-history-backend.ts`). Under the Code-OSS frame that write
459
+ * must be the WORKBENCH's, not the session's — U4 measured what happens
460
+ * otherwise: `/__ui-source/apply` writes the file behind the workbench's back,
461
+ * Monaco sees an external change, reloads, `modelService.updateModel` pushes a
462
+ * fresh text element, and `pushElement` destroys the redo future. ⇧⌘Z then
463
+ * brought nothing back while a text model for that file was open.
464
+ *
465
+ * So under the frame the apply goes through `projectFiles`, which is
466
+ * `IFileService`/`ITextFileService` over the workspace folder: the open model
467
+ * is updated in place and saved, no reload fires, and the redo future
468
+ * survives. Standalone the editor's `edit` command is untouched — `frameOwned()` is false and
469
+ * every call is the same POST it always was.
470
+ *
471
+ * THE GUARD SURVIVES THE MOVE. `/__ui-source/apply`'s `ifMatchSha` is real
472
+ * conflict protection (a hand-edit since the entry was recorded), so the
473
+ * frame path re-reads the file through the same door and compares before it
474
+ * writes, and answers the same `{applied:false, sha}` shape on a mismatch.
475
+ *
476
+ * THE PROJECT-RELATIVE PATH comes from the memo below, because `applySource`
477
+ * is handed the SERVER's file identity (`prepared.file`) and the frame needs
478
+ * the path the workspace folder resolves — `resourcePath`. Every apply in
479
+ * every lane is preceded by a `prepare` or a `readSource`, and both answer
480
+ * with both spellings, so the memo is populated by the time it is read; a miss
481
+ * falls back to one `/__ui-source/read`.
482
+ */
483
+ const resourcePathByFile = new Map<string, string>();
484
+
485
+ function rememberResourcePath(
486
+ answer: { file?: string; resourcePath?: string },
487
+ file?: string,
488
+ ): void {
489
+ const key = answer.file ?? file;
490
+ if (key && answer.resourcePath) resourcePathByFile.set(key, answer.resourcePath);
491
+ }
492
+
493
+ async function frameResourcePath(file: string): Promise<string> {
494
+ const known = resourcePathByFile.get(file);
495
+ if (known) return known;
496
+ const read = await postJson<{ resourcePath: string }>('/__ui-source/read', { file });
497
+ resourcePathByFile.set(file, read.resourcePath);
498
+ return read.resourcePath;
499
+ }
500
+
501
+ async function frameApplySource(
502
+ file: string,
503
+ source: string | Uint8Array,
504
+ ifMatchSha: string,
505
+ ): Promise<{ applied: boolean; sha?: string; error?: string }> {
506
+ const path = await frameResourcePath(file);
507
+ const isText = typeof source === 'string';
508
+ let currentSha: string;
509
+ try {
510
+ currentSha = isText
511
+ ? await sha256Hex(new TextEncoder().encode(await projectFiles.read(path)))
512
+ : await sha256Hex(await projectFiles.readBytes(path));
513
+ } catch (error) {
514
+ return {
515
+ applied: false,
516
+ error: `Could not read "${path}" to guard the write: ${String(error)}`,
517
+ };
518
+ }
519
+ if (currentSha !== ifMatchSha) {
520
+ return {
521
+ applied: false,
522
+ sha: currentSha,
523
+ error: 'stale: the file changed since this undo/redo entry was recorded',
524
+ };
525
+ }
526
+ await projectFiles.write(path, source);
527
+ const sha = isText ? await sha256Hex(new TextEncoder().encode(source)) : await sha256Hex(source);
528
+ return { applied: true, sha };
529
+ }
530
+
531
+ /** Wraps the EXISTING `/__ui-source/write` + `/__ui-source/struct` dev-server
532
+ * endpoints (see the source-authoring integration's serving plugin) — the dev-server-backed tier. */
533
+ export function createHttpSourceWriteBackend(): SourceWriteBackend {
534
+ return {
535
+ historyIdentity: HTTP_SOURCE_HISTORY_IDENTITY,
536
+ prepare: async (request) => {
537
+ const prepared = await postJson<PreparedSourceEdit>('/__ui-source/prepare', request);
538
+ rememberResourcePath(prepared);
539
+ return prepared;
540
+ },
541
+ readSource: async (file) => {
542
+ const read = await postJson<{
543
+ source: string;
544
+ sha: string;
545
+ resourcePath: string;
546
+ bytes?: Uint8Array;
547
+ }>('/__ui-source/read', { file });
548
+ rememberResourcePath(read, file);
549
+ return read;
550
+ },
551
+ applySource: (file, source, ifMatchSha) =>
552
+ projectFiles.frameOwned()
553
+ ? frameApplySource(file, source, ifMatchSha)
554
+ : postJson('/__ui-source/apply', { file, source, ifMatchSha }),
555
+ writeStyle: (oid, prop, value) => postJson('/__ui-source/write', { oid, prop, value }),
556
+ // D-A3: the removal sentinel — same endpoint, `value: null`.
557
+ removeStyle: (oid, prop) => postJson('/__ui-source/write', { oid, prop, value: null }),
558
+ writeCss: (file, selector, prop, value, media) =>
559
+ postJson('/__ui-source/css', {
560
+ file,
561
+ selector,
562
+ prop,
563
+ value,
564
+ ...(media !== undefined ? { media } : {}),
565
+ }),
566
+ writeText: (oid, text) => postJson('/__ui-source/text', { oid, text }),
567
+ writeProp: (oid, prop, value, opts) =>
568
+ postJson('/__ui-source/prop', {
569
+ oid,
570
+ prop,
571
+ value,
572
+ ...(opts?.addIfMissing ? { addIfMissing: true } : {}),
573
+ ...(opts?.allowShapeUpgrade ? { allowShapeUpgrade: true } : {}),
574
+ }),
575
+ removeProp: (oid, prop) => postJson('/__ui-source/prop', { oid, prop, value: null }),
576
+ writeStruct: (oid, op, opts) => postJson('/__ui-source/struct', { oid, op, ...opts }),
577
+ writeStructMany: (oids, op, opts) =>
578
+ postJson('/__ui-source/struct-many', { oids, op, ...opts }),
579
+ forkComponent: (oid, definitionOid, name) =>
580
+ postJson('/__ui-source/fork-component', {
581
+ oid,
582
+ definitionOid,
583
+ ...(name ? { name } : {}),
584
+ }),
585
+ extractComponent: (oid, name) =>
586
+ postJson('/__ui-source/extract-component', { oid, ...(name ? { name } : {}) }),
587
+ index: async () => {
588
+ const res = await fetch('/__ui-source/index');
589
+ return readJsonResponse<Record<string, OidEntry>>(res, '/__ui-source/index');
590
+ },
591
+ componentProps: async (file, component) => {
592
+ const url =
593
+ '/__ui-source/component-props' +
594
+ `?file=${encodeURIComponent(file)}&name=${encodeURIComponent(component.name)}`;
595
+ const res = await fetch(url);
596
+ const payload = await readJsonResponse<{ props?: ComponentPropSpec[] }>(
597
+ res,
598
+ '/__ui-source/component-props',
599
+ );
600
+ return payload.props ?? [];
601
+ },
602
+ };
603
+ }
604
+
605
+ const HTTP_SOURCE_HISTORY_IDENTITY = {};