@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,113 @@
1
+ /**
2
+ * DECLARED READINESS, per root — the facet that makes "is this game ready?" an
3
+ * answer with a stated PROVENANCE instead of a host-side guess nobody can see.
4
+ *
5
+ * ARCHITECTURE-CORE §The editor protocol, "Zero inference". The question has
6
+ * exactly three answerers, and this module is where each one's answer lands:
7
+ *
8
+ * · `host-mount` — a HOST-MOUNTED (exported-composition) root. The host runs
9
+ * the mount, so mount completion IS readiness; no game code is needed and
10
+ * the answer is `declared` for every first-party project by construction.
11
+ * · `contract-ready` — a SELF-BOOTING game that declares
12
+ * `window.volterGame.ready` (`@volter/project/adapter/ingest/game-contract`). Also
13
+ * `declared`: the game stated it.
14
+ * · `measured-wait` — a self-booting game that declares nothing. The measured
15
+ * waits remain (they are the documented fallback), and this is the whole
16
+ * point of the facet: that root reports `source: 'measured'`, so "nobody
17
+ * stated this" is a visible fact rather than silence.
18
+ *
19
+ * Published as the `readiness` facet of `/__editor/state`
20
+ * (`command-listener.ts`'s `collectState`), which is what the editor's `status` command reads.
21
+ */
22
+
23
+ import type {
24
+ MountFailureKind,
25
+ ReadinessSource,
26
+ } from '@volter/project/adapter/ingest/mount-readiness';
27
+
28
+ /** How a root's readiness is answered. See this module's header for each. */
29
+ export type ReadinessMechanism = 'host-mount' | 'contract-ready' | 'measured-wait';
30
+
31
+ export interface RootReadiness {
32
+ /** The manifest root id, as every other per-root facet names it. */
33
+ readonly rootId: string;
34
+ readonly mechanism: ReadinessMechanism;
35
+ /** `declared` for `host-mount`/`contract-ready`, `measured` otherwise — the
36
+ * one field that makes a fallback legible as a fallback. */
37
+ readonly source: ReadinessSource;
38
+ /** `waiting` is a real state, not a missing answer: a self-booting game on a
39
+ * hidden tab parks there indefinitely and nothing is wrong. */
40
+ readonly state: 'waiting' | 'ready' | 'failed';
41
+ /** Which of M29's three blockers, for a `failed` root. */
42
+ readonly failure?: MountFailureKind;
43
+ }
44
+
45
+ /**
46
+ * RESOURCE OWNERSHIP: one entry per root, written by the mount path that owns
47
+ * that root's lifecycle (`play-mode.ts` for host-mounted roots,
48
+ * `authoring/ingest-root-adapter.ts` for self-booting ones) and cleared by that
49
+ * same path's teardown. `clearRootReadiness` is per-root for the reason
50
+ * `clearMountFailureReport` is: a composite manifest mounts roots
51
+ * independently, and a blanket clear on one root's teardown would erase a
52
+ * sibling's still-true answer.
53
+ */
54
+ const _readiness = new Map<string, RootReadiness>();
55
+ let _snapshot: readonly RootReadiness[] = [];
56
+ const _listeners = new Set<() => void>();
57
+
58
+ function publish(): void {
59
+ _snapshot = [..._readiness.values()];
60
+ for (const listener of _listeners) listener();
61
+ }
62
+
63
+ /** `useSyncExternalStore`-compatible subscription for viewport explanations. */
64
+ export function subscribeRootReadiness(listener: () => void): () => void {
65
+ _listeners.add(listener);
66
+ return () => _listeners.delete(listener);
67
+ }
68
+
69
+ export function recordRootReadiness(entry: RootReadiness): void {
70
+ _readiness.set(entry.rootId, entry);
71
+ publish();
72
+ }
73
+
74
+ export function clearRootReadiness(rootId: string): void {
75
+ if (!_readiness.delete(rootId)) return;
76
+ publish();
77
+ }
78
+
79
+ /** Test seam. Every production teardown clears PER ROOT (see the ownership note
80
+ * above), so nothing but a test has the whole map's lifetime to drop. */
81
+ export function clearAllRootReadiness(): void {
82
+ if (_readiness.size === 0) return;
83
+ _readiness.clear();
84
+ publish();
85
+ }
86
+
87
+ /**
88
+ * Every root's readiness, in the order they were recorded. `[]` means nothing
89
+ * has mounted — deliberately NOT the same as "nothing is ready", which is what
90
+ * a bare boolean would have said.
91
+ */
92
+ export function readinessFacet(): readonly RootReadiness[] {
93
+ return _snapshot;
94
+ }
95
+
96
+ /**
97
+ * The one sentence a reader gets when a project's readiness is entirely
98
+ * measured — i.e. no root stated it and every answer here is a host-side wait.
99
+ * `null` when there is nothing to say (nothing mounted, or at least one root
100
+ * declared), because a warning that fires on healthy projects is a warning
101
+ * people learn to skip.
102
+ */
103
+ export function measuredReadinessWarning(): string | null {
104
+ const entries = readinessFacet();
105
+ if (entries.length === 0) return null;
106
+ const measured = entries.filter((entry) => entry.source === 'measured');
107
+ if (measured.length === 0) return null;
108
+ return (
109
+ `${measured.length} of ${entries.length} root(s) have NO readiness declaration ` +
110
+ `(${measured.map((entry) => entry.rootId).join(', ')}) — the host is measuring instead. ` +
111
+ 'A self-booting game states it with `window.volterGame.ready`.'
112
+ );
113
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Renderer resource counts a media integration reports for the session's diagnostics
3
+ * (`status.rendererResources`): the Three viewport's interactive renderers, for one. The kit
4
+ * reads what is registered and imports no renderer.
5
+ */
6
+ export interface RendererResourceCount {
7
+ readonly active: number;
8
+ readonly idle: number;
9
+ }
10
+
11
+ const providers = new Map<string, () => RendererResourceCount | number>();
12
+
13
+ /** Report counts under `key`. Returns the teardown. */
14
+ export function registerRendererResourceCounts(
15
+ key: string,
16
+ read: () => RendererResourceCount | number,
17
+ ): () => void {
18
+ providers.set(key, read);
19
+ return () => {
20
+ if (providers.get(key) === read) providers.delete(key);
21
+ };
22
+ }
23
+
24
+ /** Every registered provider's counts, read now. */
25
+ export function rendererResourceCounts(): Record<string, RendererResourceCount | number> {
26
+ return Object.fromEntries([...providers].map(([key, read]) => [key, read()]));
27
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Honest play-state reporting for the control API (the editor's `status` command) — the
3
+ * derivation half of the SimCity ledger's S-1 "false-alive ingest status".
4
+ *
5
+ * ## The defect this closes
6
+ *
7
+ * `EditorShellStore.playState` is EDITOR UI STATE. Every lane that mounts
8
+ * something writes `'playing'` into it, but only play mode's write is
9
+ * accompanied by a live `play-mode.ts` `_session`, which is the predicate the
10
+ * whole debug seam gates on (`isPlayModeActive()`, `command-listener.ts`'s
11
+ * `notPlayingResult`). `collectState` reported the store flag verbatim, so a
12
+ * mounted lane printed `playState: "playing"` while every `game.state()` /
13
+ * `game.command()` call refused with "not in play mode" — the two predicates
14
+ * disagreeing in the same breath.
15
+ *
16
+ * Worse, a lane sets `'playing'` BEFORE the mount is attempted (it is what
17
+ * swaps the viewport onto the live scene). A mount that then threw left the
18
+ * flag behind, so a DEAD game reported itself alive.
19
+ *
20
+ * ## The rule
21
+ *
22
+ * A reported play state is a claim about something that is actually running,
23
+ * so it is derived from the LIVE-SESSION REGISTRY (`live-session-registry.ts`)
24
+ * — the host's one question about what runs — never from the UI flag alone,
25
+ * and it names no lane:
26
+ *
27
+ * - nothing mounted is `stopped`, whatever the stale flag says;
28
+ * - a mount whose lane was not asked to run is `paused` — a freshly mounted,
29
+ * still-cold session is `paused`, not `playing`;
30
+ * - otherwise the store flag, which for a running lane is written in lockstep.
31
+ *
32
+ * Pure and injectable so the whole decision is unit-testable with no browser
33
+ * (`packages/editor/test/ingest-status.test.ts`).
34
+ *
35
+ * ## Why this is not folded back into the store's getter
36
+ *
37
+ * Because the two answer different questions, and the store's is the one the
38
+ * editor itself needs. `isPlayModeActive()` is `_instance.session !== null`,
39
+ * assigned only after the mount resolves — so a derived `store.playState` would
40
+ * read `'stopped'` for the whole play boot (manifest fetch, entry resolution,
41
+ * the mount itself), and the structural-edit block, the design session's
42
+ * suspend, the Play bar and the viewport-tab predicates would all act as though
43
+ * nothing were starting. The store's flag stays the editor's MODE; this stays
44
+ * the report.
45
+ */
46
+
47
+ import type { MountFailureReport } from '@volter/sdk/kit/mount-failure-report';
48
+
49
+ /** The vocabulary `EditorShellStore.playState` and the SDK's status both use. */
50
+ export type ReportedPlayState = 'stopped' | 'playing' | 'paused';
51
+
52
+ /** Everything the derivation reads. Assembled by the caller from the live
53
+ * module singletons so this module itself imports no session state. */
54
+ export interface LiveSurfaceFacts {
55
+ /** `EditorShellStore.playState` — the UI flag, used only where it is backed. */
56
+ readonly storePlayState: ReportedPlayState;
57
+ /** `live-session-registry.ts`: some lane owns a canvas right now. */
58
+ readonly liveMounted: boolean;
59
+ /** `live-session-registry.ts`: some lane was asked to RUN content. */
60
+ readonly livePlaying: boolean;
61
+ /** Recorded mount failures (`authoring/mount-failure-report.ts`). */
62
+ readonly mountFailures: readonly MountFailureReport[];
63
+ }
64
+
65
+ /**
66
+ * The reported play state — derived from what is actually running, asked of
67
+ * the live-session registry so no lane is named: a held mount (a mounted game
68
+ * whose loop is stopped) is `paused`; a running one reports the store's
69
+ * playing/paused; nothing mounted is `stopped` whatever the store says.
70
+ */
71
+ export function deriveReportedPlayState(facts: LiveSurfaceFacts): ReportedPlayState {
72
+ if (!facts.liveMounted) {
73
+ // Nothing is running. A leftover `'playing'`/`'paused'` here is exactly
74
+ // the false-alive report S-1 is about — a mount that threw after setting
75
+ // the flag.
76
+ return 'stopped';
77
+ }
78
+ if (!facts.livePlaying) return 'paused';
79
+ return facts.storePlayState === 'paused' ? 'paused' : 'playing';
80
+ }
81
+
82
+ /**
83
+ * True when the editor is reporting a world that FAILED to mount and has no
84
+ * live session to replace it. Consumers surface this as the "dead game" signal
85
+ * (the editor's `status` command's `mountFailures`, the status bar's mount-failure item)
86
+ * rather than making a reader diff two other fields to notice.
87
+ */
88
+ export function hasDeadMount(facts: LiveSurfaceFacts): boolean {
89
+ return facts.mountFailures.length > 0 && !facts.liveMounted;
90
+ }
@@ -0,0 +1,14 @@
1
+ import type { CommandSpec } from '@volter/sdk/commands';
2
+ import { isRelayCommandType } from '@volter/sdk/session/command-table';
3
+ import { contributedCommand } from '@volter/sdk/kit/command-registry';
4
+
5
+ /** A listener can attach before the presentation-deferred contribution pass.
6
+ * A requested package command needs that pass now; absence is only meaningful
7
+ * after the current project's contributions have finished installing. */
8
+ export async function resolveContributedCommand(type: unknown): Promise<CommandSpec | null> {
9
+ const found = contributedCommand(type);
10
+ if (found || typeof type !== 'string' || isRelayCommandType(type)) return found;
11
+ await (await import('@volter/sdk/kit/initial-project')).projectBootstrapSettled();
12
+ await (await import('@volter/sdk/kit/tool-loader')).refreshProjectToolContributions();
13
+ return contributedCommand(type);
14
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Resolve a RELATIVE import specifier against an index of known project
3
+ * paths — the extensionless-import answer (`./x` → `x.tsx`/`x.ts`/index
4
+ * variants) answered from a REAL index, never by guessing an extension onto
5
+ * a path. `null` when the specifier is not relative or nothing in the index
6
+ * matches. The one algorithm behind both the component index and the
7
+ * project adapter's module resolver; two copies of the candidate list is
8
+ * how play and the finders disagree about which module a specifier names.
9
+ */
10
+ export function resolveRelativeSpecifier(
11
+ specifier: string,
12
+ fromPath: string,
13
+ paths: ReadonlySet<string>,
14
+ ): string | null {
15
+ if (!specifier.startsWith('.')) return null;
16
+ const dir = fromPath.replaceAll('\\', '/').split('/').slice(0, -1);
17
+ for (const segment of specifier.split('/')) {
18
+ if (segment === '.' || segment === '') continue;
19
+ if (segment === '..') dir.pop();
20
+ else dir.push(segment);
21
+ }
22
+ const base = dir.join('/');
23
+ for (const candidate of [
24
+ base,
25
+ `${base}.tsx`,
26
+ `${base}.ts`,
27
+ `${base}/index.tsx`,
28
+ `${base}/index.ts`,
29
+ ]) {
30
+ if (paths.has(candidate)) return candidate;
31
+ }
32
+ return null;
33
+ }
@@ -0,0 +1,91 @@
1
+ interface DisposableSource {
2
+ dispose(): void;
3
+ }
4
+
5
+ export interface RetainedDocumentState {
6
+ readonly documentId: string;
7
+ inUse: boolean;
8
+ source: DisposableSource | null;
9
+ }
10
+
11
+ /** CPU state belongs to an open document, not to the lifetime of its last pane. */
12
+ export class RetainedDocumentStates<T extends RetainedDocumentState> {
13
+ private readonly states = new Map<string, T[]>();
14
+ private readonly generations = new WeakMap<T, number>();
15
+ private unsubscribe: (() => void) | null = null;
16
+
17
+ constructor(
18
+ private readonly create: (documentId: string) => T,
19
+ private readonly isOpen: (documentId: string) => boolean,
20
+ private readonly subscribe: (changed: () => void) => () => void,
21
+ ) {}
22
+
23
+ claim(documentId: string): T {
24
+ const states = this.states.get(documentId) ?? [];
25
+ let state = states.find(candidate => !candidate.inUse);
26
+ if (!state) {
27
+ state = this.create(documentId);
28
+ states.push(state);
29
+ this.states.set(documentId, states);
30
+ }
31
+ state.inUse = true;
32
+ this.generations.set(state, this.generation(state) + 1);
33
+ this.unsubscribe ??= this.subscribe(() => this.discardClosed());
34
+ return state;
35
+ }
36
+
37
+ generation(state: T): number {
38
+ return this.generations.get(state) ?? 0;
39
+ }
40
+
41
+ release(state: T, generation = this.generation(state)): void {
42
+ if (this.generation(state) !== generation) return;
43
+ state.inUse = false;
44
+ // React cleanup may precede the registry's close notification. The
45
+ // subscription also handles closing a pane that was already unmounted.
46
+ queueMicrotask(() => this.discardClosed());
47
+ }
48
+
49
+ /** A gesture may finish releasing its source after its document has closed
50
+ * or its state slot has been claimed by a replacement pane. */
51
+ retain(state: T, source: NonNullable<T['source']>, generation: number): void {
52
+ if (
53
+ !this.isOpen(state.documentId) ||
54
+ !this.states.get(state.documentId)?.includes(state) ||
55
+ this.generation(state) !== generation
56
+ ) {
57
+ source.dispose();
58
+ return;
59
+ }
60
+ const previous = state.source;
61
+ state.source = source;
62
+ if (previous !== source) previous?.dispose();
63
+ }
64
+
65
+ private discardClosed(): void {
66
+ const discarded: T[] = [];
67
+ for (const [documentId, states] of this.states) {
68
+ if (this.isOpen(documentId)) continue;
69
+ const remaining = states.filter(state => state.inUse);
70
+ discarded.push(...states.filter(state => !state.inUse));
71
+ if (remaining.length) this.states.set(documentId, remaining);
72
+ else this.states.delete(documentId);
73
+ }
74
+ if (this.states.size === 0) {
75
+ this.unsubscribe?.();
76
+ this.unsubscribe = null;
77
+ }
78
+ // Remove ownership first, even if a disposer throws or publishes a change.
79
+ const failures: unknown[] = [];
80
+ for (const state of discarded) {
81
+ const source = state.source;
82
+ state.source = null;
83
+ try {
84
+ source?.dispose();
85
+ } catch (error) {
86
+ failures.push(error);
87
+ }
88
+ }
89
+ if (failures.length) throw new AggregateError(failures, 'Retained document cleanup failed');
90
+ }
91
+ }