@volter/sdk 0.0.0-stage → 0.5.204

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +1168 -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 +329 -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 +669 -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,279 @@
1
+ /**
2
+ * WHERE A DESIGN-TIME SOURCE EDIT GOES, decided by what THIS SESSION'S HOST
3
+ * actually serves — the one home for a choice that used to be written out
4
+ * byte-for-byte in `r3f-design-session.ts` and `canvas-design-mount.ts`.
5
+ *
6
+ * ## The bug the duplication carried, twice
7
+ *
8
+ * Both copies read `import.meta.env.DEV ? createHttpSourceWriteBackend() :
9
+ * undefined`, with a comment claiming "a production build has no
10
+ * `/__ui-source/*` middleware". That is FALSE of the packaged editor a registry
11
+ * install runs (`server/packaged.ts`), which
12
+ * registers `uiOidPlugin()` and genuinely serves `/__ui-source/*` — while the
13
+ * editor shell it serves is a PRODUCTION build, so `import.meta.env.DEV` is
14
+ * `false` there. Net effect on every `npm i @volter/editor-core` install: gizmo and
15
+ * inspector edits mounted, applied to the running object, and were silently
16
+ * discarded, because the recorder was reachable and nobody asked it.
17
+ *
18
+ * `import.meta.env.DEV` is a fact about how the SHELL BUNDLE was built. Whether
19
+ * source writes are recorded is a fact about the HOST SERVING IT. They are not
20
+ * the same axis, and the doctrine is explicit that a standing build flag may
21
+ * never be what decides whether writes happen — only the recorder's actual
22
+ * existence may.
23
+ *
24
+ * ## What decides it now
25
+ *
26
+ * The server states it: `/__editor/project` carries a top-level `sourceWrite`
27
+ * boolean, which the host derives from its OWN Vite plugin list (whether
28
+ * `uiOidPlugin()` — the plugin that serves the `/__ui-source/*` read/write
29
+ * endpoints — is registered), never from a hand-maintained second declaration.
30
+ * So dev and packaged each answer with what they really carry, and a
31
+ * future host cannot forget to.
32
+ *
33
+ * Reading a server-stated flag rather than probing the route directly is the
34
+ * shape `packaged-runtime.ts` already established for the sibling question
35
+ * ("is this the packaged runtime?"), for the reason recorded there: a probe
36
+ * that only resolves on some hosts logs an unsuppressible browser console error
37
+ * on the others. It is memoized per page load for the same reason — the runtime
38
+ * a server process is running under cannot change without a restart.
39
+ *
40
+ * ## The honest floor
41
+ *
42
+ * "No recorder" is decided PER LANE and per tier, never per build. On the
43
+ * hosted (browser) tier the native/OID lane HAS one — the storage-backed
44
+ * recorder — while the ingest lane genuinely does not, because
45
+ * `IngestSourcePersistence` speaks `/__ingest-source/*` HTTP and has no
46
+ * storage-backed equivalent. Both answers are stated by asking what this
47
+ * session actually carries; neither is inferred from the other.
48
+ *
49
+ * When no recorder exists, this returns `undefined` and NOTHING fabricates a
50
+ * write path. The adapter then exposes no `persistence` provider, which is what
51
+ * makes the standing capability report say so in the product's own words
52
+ * (`adapter-reach.ts`, `PROVIDER_GAP.persistence`: "edits to this world are
53
+ * live-only — the mount carries no write-back route to the game's own source").
54
+ * That is a warning that keeps firing, not a grade.
55
+ */
56
+
57
+ import { editorServerJson } from '@volter/sdk/kit/editor-server-response';
58
+ import { createHttpSourceWriteBackend, type SourceWriteBackend } from './source-write-backend';
59
+
60
+ /**
61
+ * The two write routes a host may serve, as it states them.
62
+ *
63
+ * Two booleans rather than one because they are two PLUGINS — `uiOidPlugin`
64
+ * serves `/__ui-source/*` (the native + OID lanes' recorder) and
65
+ * `creationSiteWritePlugin` serves `/__ingest-source/*` (the ingest lane's), and
66
+ * a host can register either without the other. They arrive in ONE probe
67
+ * because they are two fields of one response, not two questions.
68
+ */
69
+ interface SourceWriteRoutes {
70
+ readonly ui: boolean;
71
+ readonly ingest: boolean;
72
+ }
73
+
74
+ let cachedSourceWriteRoutes: Promise<SourceWriteRoutes> | null = null;
75
+ /** The ANSWER, once a probe has actually produced one — what the synchronous
76
+ * readers below serve. `null` means "not asked yet, or asked and not
77
+ * answered"; it is never set from a failed probe, for the reason the memo's
78
+ * own doc comment records. */
79
+ let settledSourceWriteRoutes: SourceWriteRoutes | null = null;
80
+
81
+ /**
82
+ * What this origin's host says it serves — the one probe both flags read.
83
+ *
84
+ * A plain inline `fetch()` rather than `editor-api.ts`'s project reader, for
85
+ * the reason `packaged-runtime.ts` records: this module is reachable from
86
+ * design-mount code that headless Node/vitest suites import, and
87
+ * `editor-api.ts`'s module top level pulls in `./storage`.
88
+ *
89
+ * An ANSWER is memoized for the page; a probe that never got one is not. The
90
+ * memo exists because the runtime a server process runs under cannot change
91
+ * without a restart — but a probe that failed to reach the server learned
92
+ * nothing about that runtime, and latching its fallback would turn one
93
+ * unlucky fetch (a design mount landing in the window while the editor's `edit` command
94
+ * restarts its dev server — a routine event, it restarts on any server-file
95
+ * change) into a page whose authoring is live-only until someone reloads.
96
+ * `packaged-runtime.ts` drops a failed probe for the same reason — its own
97
+ * latch was measured doing the same damage on the graph-identity axis — and
98
+ * the two differ only in what the failed probe's OWN caller gets: that one
99
+ * rejects (a mount on a guessed module graph is not a degraded mount, it is
100
+ * the wrong one), while this flag answers `false` for that caller, because
101
+ * live-only-for-one-mount is a real, sayable degrade and this module says it
102
+ * out loud in {@link primedRoutes}.
103
+ *
104
+ * THE BROWSER TIER IS ANSWERED HERE, not at each call site. There is no
105
+ * `/__editor/project` on that origin, and a fetch that 404s logs an
106
+ * unsuppressible console error on a page whose answer is already known. The
107
+ * guard lived on `primeSourceWriteRuntime` alone, which left
108
+ * `ingest-root-adapter.ts`'s `readServedOidIndex` — the one caller that
109
+ * reaches this once per ingest mount — firing exactly the fetch this rule
110
+ * exists to prevent, and re-firing it on every mount because a failed probe
111
+ * deliberately does not latch.
112
+ */
113
+ function serverSourceWriteRoutes(): Promise<SourceWriteRoutes> {
114
+ if (!cachedSourceWriteRoutes) {
115
+ // The call is INSIDE the chain, so a `fetch` that throws SYNCHRONOUSLY is a
116
+ // rejected probe like any other rather than an exception thrown at whoever
117
+ // asked. That matters now that `primedRoutes` kicks this from a synchronous
118
+ // mount path: a throw there would take the whole mount down over a question
119
+ // whose honest answer is "no recorder".
120
+ const probe: Promise<SourceWriteRoutes> = Promise.resolve()
121
+ .then(() => fetch('/__editor/project'))
122
+ .then((res) =>
123
+ editorServerJson<{ sourceWrite?: boolean; ingestSourceWrite?: boolean }>(
124
+ res,
125
+ '`/__editor/project` did not answer the source-write probe',
126
+ ),
127
+ )
128
+ .then((data) => {
129
+ const answer: SourceWriteRoutes = {
130
+ ui: Boolean(data.sourceWrite),
131
+ ingest: Boolean(data.ingestSourceWrite),
132
+ };
133
+ settledSourceWriteRoutes = answer;
134
+ return answer;
135
+ })
136
+ .catch(() => {
137
+ if (cachedSourceWriteRoutes === probe) cachedSourceWriteRoutes = null;
138
+ return { ui: false, ingest: false };
139
+ });
140
+ cachedSourceWriteRoutes = probe;
141
+ }
142
+ return cachedSourceWriteRoutes;
143
+ }
144
+
145
+ /** Does the server on this origin serve the `/__ui-source/*` recorder? See
146
+ * {@link serverSourceWriteRoutes} for the memo's rules. */
147
+ export function serverRecordsSourceWrites(): Promise<boolean> {
148
+ return serverSourceWriteRoutes().then((routes) => routes.ui);
149
+ }
150
+
151
+ /**
152
+ * Ask the question ONCE, at editor boot, so the synchronous reader below has a
153
+ * real answer by the time any surface mounts. Called from the frame bridge
154
+ * beside the other install-time wiring; every other caller still asks through
155
+ * the two functions above and gets this same memo.
156
+ */
157
+ export function primeSourceWriteRuntime(): void {
158
+ void serverSourceWriteRoutes();
159
+ }
160
+
161
+ /**
162
+ * The settled routes, or `null` with the warning already said — the shared body
163
+ * of the two synchronous readers below, so the three-case contract documented on
164
+ * {@link sourceWriteBackendIfPrimed} is written once.
165
+ */
166
+ /**
167
+ * Say a not-yet-primed mount out loud. Shared by both tiers because it is the
168
+ * same degrade on each — this mount's edits are live-only, and a remount is a
169
+ * real remedy because the caller kicked the prime on the way out.
170
+ *
171
+ * The console IS the loud leg: capture feeds editorConsole and console-sync
172
+ * forwards it to the editor's `console` command, without this module importing the editor-api
173
+ * graph a headless design mount must not pull in.
174
+ */
175
+ function warnUnprimed(surface: string): void {
176
+ // biome-ignore lint/suspicious/noConsole: see this function's doc comment
177
+ console.warn(
178
+ `[volter-editor] ${surface} mounted before this session's source-write route was ` +
179
+ 'confirmed, so its edits are live-only. Remount the surface (reopen the project) ' +
180
+ 'to author against the game’s own source.',
181
+ );
182
+ }
183
+
184
+ function primedRoutes(surface: string): SourceWriteRoutes | null {
185
+ // The BROWSER tier never reaches here for the `ui` question — that is
186
+ // answered by `sourceWriteBackendIfPrimed`'s own storage-backed path. The
187
+ // ingest question now has a storage answer too: `IngestSourcePersistence`
188
+ // runs against `authoring/browser-ingest-source.ts`'s route emulation for a
189
+ // storage-backed project (a staged example/ingest keeps the honest "no").
190
+ if (settledSourceWriteRoutes === null) {
191
+ // ASK AGAIN, so the remedy this warning names is a real one. The boot prime
192
+ // is ONE probe, and a probe that never reached the server (a mount landing
193
+ // while the editor's `edit` command restarts its dev server) settles nothing — after which
194
+ // only `ingest-root-adapter.ts`'s `readServedOidIndex` re-asks, and it is on
195
+ // the three lane alone. Without this kick the canvas-ingest and ingest-DOM
196
+ // surfaces warn for the LIFE OF THE PAGE and "remount the surface" changes
197
+ // nothing, which is the silent live-only session this whole seam exists to
198
+ // end. Fire-and-forget: this caller is synchronous and honestly live-only
199
+ // either way; the kick is what makes the NEXT mount recorded. A probe
200
+ // already in flight is the memo, so this cannot stack.
201
+ void serverSourceWriteRoutes();
202
+ warnUnprimed(surface);
203
+ return null;
204
+ }
205
+ return settledSourceWriteRoutes;
206
+ }
207
+
208
+ /**
209
+ * The source-write backend for a mount whose call site is SYNCHRONOUS, or
210
+ * `undefined` when there is honestly no recorder for it.
211
+ *
212
+ * Same axis as {@link tierSourceWriteBackend} — what the HOST serves, never how
213
+ * the shell was built — read from the memo above instead of awaited. The three
214
+ * answers, stated because a sync reader of an async fact has to state them:
215
+ *
216
+ * 1. **Primed** (the ordinary case): `primeSourceWriteRuntime()` runs at boot,
217
+ * before a project is open and therefore before anything here can mount, so
218
+ * by the time an ingest sibling, an ingest DOM surface or a Play→source
219
+ * committer is constructed the route fact is in hand and this returns the
220
+ * real recorder on any host that serves `/__ui-source/*`.
221
+ * 2. **Answered `false`**: no recorder, `undefined`, and nothing is fabricated
222
+ * — the honest floor described in this module's header.
223
+ * 3. **Not yet answered**: `undefined` AND A WARNING, never a silent
224
+ * `undefined`. This can only happen when a surface mounts inside the boot
225
+ * probe's own round trip (or while a restarting dev server is unreachable),
226
+ * and the cost is one mount's edits being live-only, so it is said out loud
227
+ * on the channel `console-sync.ts` forwards to the editor's `console` command — the same
228
+ * place every other unresolved editor condition lands — naming the surface
229
+ * and the remedy. It also RE-ASKS on the way out, which is what makes that
230
+ * remedy true rather than advice: a boot probe that never reached the server
231
+ * leaves nothing to settle, and these surfaces have no async door of their
232
+ * own to re-open it with. Deliberately NOT an assert: none of these call
233
+ * sites is reachable only after a design mount (an ingest root mounts with
234
+ * no design session at all), so "this cannot happen" would be a claim, not
235
+ * a fact.
236
+ *
237
+ * The BROWSER tier answers with its storage-backed recorder, primed at boot by
238
+ * {@link primeSourceWriteRuntime}. It used to answer `undefined` here on the
239
+ * grounds that a dynamic import is unreachable from a synchronous call site —
240
+ * true of the import, but the conclusion drawn from it was false: that tier has
241
+ * a real, working recorder ({@link tierSourceWriteBackend} builds and uses it),
242
+ * so `undefined` made four surfaces report "cannot write project source" on a
243
+ * tier that can. Priming moved the import off the call site instead of asking a
244
+ * sync function to await. If the prime has not landed yet, the same case-3
245
+ * warning below applies, and it re-kicks the build for the same reason.
246
+ */
247
+ export function sourceWriteBackendIfPrimed(surface: string): SourceWriteBackend | undefined {
248
+ return primedRoutes(surface)?.ui ? createHttpSourceWriteBackend() : undefined;
249
+ }
250
+
251
+ /**
252
+ * The ingest lane's half: may this session write an ingest edit into the game's
253
+ * own source through `/__ingest-source/*`?
254
+ *
255
+ * Same three cases, same reasons, same channel as
256
+ * {@link sourceWriteBackendIfPrimed} — a different route because it is a
257
+ * different plugin. `false` is the honest floor and the caller builds no writer,
258
+ * so the ingest adapter reports live-only in the product's own words rather than
259
+ * failing at the first apply.
260
+ */
261
+ export function ingestSourceWritesRecordedIfPrimed(surface: string): boolean {
262
+ return primedRoutes(surface)?.ingest === true;
263
+ }
264
+
265
+ /** Test-only: reset the memoized result (mirrors
266
+ * `resetPackagedRuntimeCacheForTest`'s seam shape). */
267
+ export function resetSourceWriteRuntimeCacheForTest(): void {
268
+ cachedSourceWriteRoutes = null;
269
+ settledSourceWriteRoutes = null;
270
+ }
271
+
272
+ /**
273
+ * The source-write backend this session can honestly use, or `undefined` when
274
+ * there is no recorder to write through — the session's own `/__ui-source/*`
275
+ * route, confirmed once by {@link serverRecordsSourceWrites}.
276
+ */
277
+ export async function tierSourceWriteBackend(): Promise<SourceWriteBackend | undefined> {
278
+ return (await serverRecordsSourceWrites()) ? createHttpSourceWriteBackend() : undefined;
279
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * THE PERSON'S OWN UI STATE — one in-memory document mirroring `~/.volter/editor-state.json`
3
+ * (`GET/POST /__editor/user-state`), the per-user sibling of a project's
4
+ * `.volter/editor-state.json` (`@volter/editor-core` `project-local-state.ts`): what this
5
+ * person's editor remembers in every project, as named sections, loaded once at boot.
6
+ *
7
+ * Browser storage cannot hold it. Every project and worktree is served on its own port
8
+ * (`@volter/editor-core` `server/launcher/project-editor-port.ts`), so on its own origin, and a
9
+ * preference kept in `localStorage` starts over in each; the project-local layer left browser
10
+ * storage for the same kind of loss. Reads are synchronous: the boot awaits
11
+ * {@link preloadUserLocalState} before the editor mounts, and a section read before then is
12
+ * `undefined`.
13
+ *
14
+ * WRITES SEND ONLY THE SECTIONS THEY CHANGED, and the server merges them into the file.
15
+ * Every open project runs its own editor session over this one file: a session that wrote its
16
+ * whole document would erase what another session saved since it loaded.
17
+ *
18
+ * A guest in someone else's shared session keeps none: the host's file is the host's
19
+ * (`/__editor/user-state` is never shared), so a guest's page neither reads nor writes it.
20
+ */
21
+ import { BASE } from './api-base';
22
+ import { COLLABORATION_REMOTE_SHARE } from './editor-session-attribution';
23
+ import { assertEditorServerResponse, editorServerJson } from './editor-server-response';
24
+
25
+ const WRITE_DEBOUNCE_MS = 400;
26
+ const ROUTE = `${BASE}/user-state`;
27
+
28
+ let doc: Record<string, unknown> = {};
29
+ let loaded = false;
30
+ let loading: Promise<void> | null = null;
31
+ const changed = new Set<string>();
32
+ let timer: ReturnType<typeof setTimeout> | null = null;
33
+ let reportedWriteFailure = false;
34
+
35
+ /** Load the person's document once; later callers join the first load. */
36
+ export function preloadUserLocalState(): Promise<void> {
37
+ if (loaded || COLLABORATION_REMOTE_SHARE) return Promise.resolve();
38
+ loading ??= fetch(ROUTE)
39
+ .then((response) => editorServerJson<Record<string, unknown>>(response, 'Could not read user state'))
40
+ .then((state) => {
41
+ // A write made before the load settled is kept on top of what loaded.
42
+ doc = { ...(state && typeof state === 'object' ? state : {}), ...doc };
43
+ })
44
+ .catch(() => {})
45
+ .finally(() => {
46
+ loaded = true;
47
+ loading = null;
48
+ });
49
+ return loading;
50
+ }
51
+
52
+ /** Whether the person's document has loaded (or there is none to load, for a guest). */
53
+ export function userLocalStateLoaded(): boolean {
54
+ return loaded || COLLABORATION_REMOTE_SHARE;
55
+ }
56
+
57
+ /** One section, or `undefined` before the load or when never written. */
58
+ export function userLocalSection<T>(name: string): T | undefined {
59
+ return doc[name] as T | undefined;
60
+ }
61
+
62
+ /**
63
+ * POST a JSON body, kept alive past the page when the page is `leaving`. The browser keeps alive
64
+ * only 64 KiB of request bodies at once, in bytes, shared by every such request the page has in
65
+ * flight (the project's state and this one leave together): each takes at most a 32 KiB share,
66
+ * and a send the browser refuses to keep alive is sent again as an ordinary request.
67
+ */
68
+ export function postJson(url: string, body: string, leaving: boolean): Promise<Response> {
69
+ const send = (keepalive: boolean) =>
70
+ fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body, keepalive });
71
+ const keepalive = leaving && new TextEncoder().encode(body).length <= 32 * 1024;
72
+ return keepalive ? send(true).catch(() => send(false)) : send(false);
73
+ }
74
+
75
+ /** Send the changed sections. `leaving`: the page is going away, so the request must outlive it. */
76
+ function flush(leaving = false): void {
77
+ if (timer !== null) {
78
+ clearTimeout(timer);
79
+ timer = null;
80
+ }
81
+ if (changed.size === 0) return;
82
+ const patch = Object.fromEntries([...changed].map((name) => [name, doc[name]]));
83
+ changed.clear();
84
+ void postJson(ROUTE, JSON.stringify(patch), leaving)
85
+ .then((response) => assertEditorServerResponse(response, 'Could not save user state'))
86
+ .catch((cause: unknown) => {
87
+ if (reportedWriteFailure) return;
88
+ reportedWriteFailure = true;
89
+ // biome-ignore lint/suspicious/noConsole: the editor console captures console.error session-wide; this is the report channel.
90
+ console.error(cause instanceof Error ? cause.message : String(cause));
91
+ });
92
+ }
93
+
94
+ /** Replace one section and schedule its write. */
95
+ export function writeUserLocalSection(name: string, value: unknown): void {
96
+ doc = { ...doc, [name]: value };
97
+ if (COLLABORATION_REMOTE_SHARE) return;
98
+ changed.add(name);
99
+ if (timer !== null) clearTimeout(timer);
100
+ timer = setTimeout(flush, WRITE_DEBOUNCE_MS);
101
+ }
102
+
103
+ if (typeof window !== 'undefined') {
104
+ window.addEventListener('pagehide', () => flush(true));
105
+ }