@volter/sdk 0.0.0-stage → 0.5.203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1166 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +317 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +403 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,385 @@
1
+ /**
2
+ * THE STAGE TRANSPORT — one position on a stage's facts, and the one holder
3
+ * of the content-time door (WORK.md §The stage transport and the animation
4
+ * door; owner ruling 2026-09-20).
5
+ *
6
+ * OWNERSHIP, STATED ONCE. The OWNER is the stage: `StageHost` constructs one
7
+ * transport beside the stage store it already owns, registers it under the
8
+ * document id, and disposes it when that document unmounts. The SHARERS are
9
+ * subjects (a world attaches what it can show at a time) and looks (the
10
+ * transport strip, Blender's Timeline) — both hold a handle and neither may
11
+ * end it. The ONE TEARDOWN PATH is the owning document's unmount; a subject
12
+ * detaching or a look unmounting never disposes the transport, because a
13
+ * stage outlives every look drawn over it. This is the rule the game-scoped
14
+ * clock destroyed by per-root teardown was missing.
15
+ *
16
+ * THE CONTENT-TIME POLICY IT INHERITS, quoted from `StageHost.tsx` where it
17
+ * was already written: on every stage PRESENTATION time (orbit, dressing,
18
+ * helpers) always advances, and CONTENT time advances ONLY through the one
19
+ * `advanceContent` door, and only while a human holds an explicit transport.
20
+ * This class IS that human's hand: `tick` returns the seconds it advanced and
21
+ * the host passes exactly that to `advanceContent`, so a stage with no
22
+ * transport demand still publishes a content clock that stood still
23
+ * (`coverage/design-time-surfaces.ts`).
24
+ *
25
+ * IT IS NOT THE SIM CLOCK. `core/sim-clock.ts` is the game's own time and
26
+ * this transport is INERT whenever it runs — `driver` reads the stage store's
27
+ * `playState`, and every write verb refuses by name while a world is driving.
28
+ *
29
+ * NO SECOND CLOCK, AND NO PRIVATE ONE. The time arithmetic is the engine's
30
+ * `AnimationClock` (ranges, loop laps, exact frame seeking); this class adds
31
+ * the subject registry, the driver gate and the settle debounce, and nothing
32
+ * else. `scripts/validate-import-bans.mjs`'s `private-clocks` row is the
33
+ * tripwire against a `requestAnimationFrame`/`performance.now` growing back
34
+ * in here or in a look.
35
+ */
36
+
37
+ import type {
38
+ StageTransportSnapshot,
39
+ TransportPlaybackState,
40
+ TransportSubject,
41
+ } from '@volter/sdk/host';
42
+ import { AnimationClock } from './animation-clock';
43
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
44
+
45
+ /** The range a transport reports with nothing attached — a real, inert
46
+ * domain, so a look never has to special-case `null` arithmetic. */
47
+ const EMPTY_RANGE = { start: 0, end: 0, fps: 30, loop: false } as const;
48
+
49
+ /** Scrub-end: the first quiet interval after a `seek` while not playing.
50
+ * Long enough that a slider drag's frames coalesce into ONE settle, short
51
+ * enough that releasing the mouse writes the bookmark without a visible wait. */
52
+ const SETTLE_QUIET_MS = 150;
53
+
54
+ export class StageTransport {
55
+ private readonly clock = new AnimationClock();
56
+ private readonly subjects: TransportSubject[] = [];
57
+ private activeId: string | null = null;
58
+ private readonly listeners = new Set<() => void>();
59
+ private readonly settleListeners = new Set<(seconds: number) => void>();
60
+ private settleTimer: ReturnType<typeof setTimeout> | null = null;
61
+ private disposed = false;
62
+ /**
63
+ * The last snapshot handed out, held until something changes.
64
+ * `useSyncExternalStore` compares snapshots by IDENTITY and re-renders
65
+ * forever if `getSnapshot` mints a fresh object each call, so the cache is
66
+ * not an optimization — it is what makes this class usable from React at
67
+ * all. `notify()` is the one invalidator, which is also the one place a
68
+ * change is announced, so the two cannot drift apart.
69
+ */
70
+ private cachedSnapshot: StageTransportSnapshot | null = null;
71
+
72
+ private readonly stopStoreWatch: () => void;
73
+
74
+ constructor(private readonly store: ShellStore) {
75
+ // `driver` reads the store, and the store changes WITHOUT any call on this
76
+ // class (entering Play is a store event). A snapshot cached across that
77
+ // would report `driver: 'editor'` while the world is already driving, so
78
+ // the strip would draw live controls over a running game. Invalidate here.
79
+ this.stopStoreWatch = store.subscribe(() => this.notify());
80
+ }
81
+
82
+ // ---------------------------------------------------------------- subjects
83
+
84
+ /**
85
+ * Attach a subject. The FIRST attach becomes active — a stage that just
86
+ * mounted one thing is immediately scrubbable with no further call. Returns
87
+ * the detach; detaching the active subject promotes whatever remains.
88
+ */
89
+ attach(subject: TransportSubject): () => void {
90
+ this.subjects.push(subject);
91
+ if (this.activeId === null) this.setActiveSubject(subject.id);
92
+ else {
93
+ // A later subject shows the transport's time from its first frame too;
94
+ // unsampled, a skinned character stands in its bind pose until the
95
+ // playhead next moves.
96
+ subject.seek(this.clock.time);
97
+ this.notify();
98
+ }
99
+ return () => {
100
+ const at = this.subjects.indexOf(subject);
101
+ if (at < 0) return;
102
+ this.subjects.splice(at, 1);
103
+ if (this.activeId !== subject.id) {
104
+ this.notify();
105
+ return;
106
+ }
107
+ this.activeId = null;
108
+ const next = this.subjects[0];
109
+ if (next) this.setActiveSubject(next.id);
110
+ else {
111
+ this.clock.setRange({ start: EMPTY_RANGE.start, end: EMPTY_RANGE.end, loop: false });
112
+ this.notify();
113
+ }
114
+ };
115
+ }
116
+
117
+ /** Make `id` active: take ITS range, and clamp the current time into it —
118
+ * switching subjects moves the playhead as little as the new domain allows. */
119
+ setActiveSubject(id: string): void {
120
+ const subject = this.subjects.find((s) => s.id === id);
121
+ if (!subject) return;
122
+ this.activeId = id;
123
+ const range = subject.range();
124
+ this.clock.setRange({ start: range.start, end: range.end });
125
+ // `setRange` only emits when it had to clamp, so re-assert the position
126
+ // unconditionally: every subject must be showing the transport's time,
127
+ // including the one that just became active inside an unchanged range.
128
+ this.applyTime(this.clock.time);
129
+ this.notify();
130
+ }
131
+
132
+ private get active(): TransportSubject | null {
133
+ return this.subjects.find((s) => s.id === this.activeId) ?? null;
134
+ }
135
+
136
+ private fps(): number {
137
+ return this.active?.range().fps ?? EMPTY_RANGE.fps;
138
+ }
139
+
140
+ // ------------------------------------------------------------------ driver
141
+
142
+ /**
143
+ * Who is advancing time. Reads the stage store this transport was built
144
+ * with and nothing else: for a Model document that store is always
145
+ * `'stopped'`, and for the Scene/Game document Play sets it.
146
+ */
147
+ private get driver(): 'editor' | 'world' {
148
+ return this.store.playState === 'stopped' ? 'editor' : 'world';
149
+ }
150
+
151
+ /** Refuse BY NAME, so a caller reads what to do rather than that it failed. */
152
+ private assertEditorDrives(): void {
153
+ if (this.driver === 'world') {
154
+ throw new Error('transport: the world is driving time (Play); pause the game to scrub');
155
+ }
156
+ }
157
+
158
+ // --------------------------------------------------------------- transport
159
+
160
+ play(direction: 'forward' | 'reverse' = 'forward'): void {
161
+ this.assertEditorDrives();
162
+ if (!this.active) return;
163
+ this.cancelSettle();
164
+ this.clock.play(direction);
165
+ this.notify();
166
+ }
167
+
168
+ pause(): void {
169
+ this.assertEditorDrives();
170
+ this.clock.pause();
171
+ this.cancelSettle();
172
+ this.settle();
173
+ this.notify();
174
+ }
175
+
176
+ /** `stop()` = `pause()` then home to the range's start. */
177
+ stop(): void {
178
+ this.assertEditorDrives();
179
+ this.clock.pause();
180
+ this.cancelSettle();
181
+ this.applyTime(this.clock.seek(this.clock.range.start).currentTime);
182
+ this.clock.stop();
183
+ this.settle();
184
+ this.notify();
185
+ }
186
+
187
+ seek(seconds: number): void {
188
+ this.assertEditorDrives();
189
+ this.applyTime(this.clock.seek(seconds).currentTime);
190
+ // A seek WHILE PLAYING never settles — only a scrub does, and a scrub is
191
+ // by definition not playback.
192
+ if (this.clock.playbackState !== 'playing') this.scheduleSettle();
193
+ this.notify();
194
+ }
195
+
196
+ /** Frames are the LOOK's unit, never the seam's: one conversion, here. */
197
+ seekFrame(frame: number): void {
198
+ this.seek(frame / this.fps());
199
+ }
200
+
201
+ setLoop(loop: boolean): void {
202
+ this.clock.setRange({ loop });
203
+ this.notify();
204
+ }
205
+
206
+ setTimeScale(scale: number): void {
207
+ this.clock.timeScale = scale;
208
+ this.notify();
209
+ }
210
+
211
+ /**
212
+ * Called by the stage host's frame callback with that frame's dt. Inert
213
+ * unless PLAYING and the editor drives. Returns the seconds advanced — the
214
+ * host adds exactly this to `host.contentSeconds` through `advanceContent`,
215
+ * which is what keeps the Edit-static vitals row honest.
216
+ */
217
+ tick(dt: number): number {
218
+ if (this.disposed || this.driver === 'world') return 0;
219
+ if (this.clock.playbackState !== 'playing') return 0;
220
+ const before = this.clock.time;
221
+ const crossing = this.clock.advance(dt);
222
+ if (!crossing) return 0;
223
+ this.applyTime(crossing.currentTime);
224
+ this.notify();
225
+ // Across a loop wrap `currentTime - before` is negative (and meaningless
226
+ // as an elapsed duration), so report the magnitude the clock was asked
227
+ // to move: that is what actually elapsed on this stage's content clock.
228
+ return crossing.looped ? Math.abs(dt) * this.clock.timeScale : crossing.currentTime - before;
229
+ }
230
+
231
+ /**
232
+ * Hand the crossing's time to EVERY attached subject, the active one first.
233
+ * Every subject, not just the active one: a stage showing two things at one
234
+ * position must not leave the inactive one frozen at whenever it was last
235
+ * looked at. The active one leads so the thing a person is watching is the
236
+ * first to update within a frame.
237
+ */
238
+ private applyTime(seconds: number): void {
239
+ const active = this.active;
240
+ if (active) active.seek(seconds);
241
+ for (const subject of this.subjects) {
242
+ if (subject !== active) subject.seek(seconds);
243
+ }
244
+ }
245
+
246
+ // ----------------------------------------------------------------- settled
247
+
248
+ onSettled(listener: (seconds: number) => void): () => void {
249
+ this.settleListeners.add(listener);
250
+ return () => {
251
+ this.settleListeners.delete(listener);
252
+ };
253
+ }
254
+
255
+ private scheduleSettle(): void {
256
+ this.cancelSettle();
257
+ this.settleTimer = setTimeout(() => {
258
+ this.settleTimer = null;
259
+ this.settle();
260
+ }, SETTLE_QUIET_MS);
261
+ }
262
+
263
+ private cancelSettle(): void {
264
+ if (this.settleTimer === null) return;
265
+ clearTimeout(this.settleTimer);
266
+ this.settleTimer = null;
267
+ }
268
+
269
+ private settle(): void {
270
+ if (this.disposed) return;
271
+ const at = this.clock.time;
272
+ for (const listener of [...this.settleListeners]) listener(at);
273
+ }
274
+
275
+ // ---------------------------------------------------------------- readback
276
+
277
+ snapshot(): StageTransportSnapshot {
278
+ const cached = this.cachedSnapshot;
279
+ if (cached) return cached;
280
+ const range = this.active?.range() ?? EMPTY_RANGE;
281
+ const next: StageTransportSnapshot = {
282
+ time: this.clock.time,
283
+ range: {
284
+ start: this.clock.range.start,
285
+ end: this.clock.range.end,
286
+ fps: range.fps,
287
+ loop: this.clock.range.loop,
288
+ },
289
+ playbackState: this.clock.playbackState as TransportPlaybackState,
290
+ timeScale: this.clock.timeScale,
291
+ activeSubject: this.activeId,
292
+ subjects: this.subjects.map((s) => ({ id: s.id, label: s.label })),
293
+ driver: this.driver,
294
+ };
295
+ this.cachedSnapshot = next;
296
+ return next;
297
+ }
298
+
299
+ /**
300
+ * The ACTIVE subject's clips, or `null` when it has none.
301
+ *
302
+ * Deliberately not on the snapshot: `StageTransportSnapshot` is the shape a
303
+ * CONTRIBUTION sees through the SDK, and a clip list is a three-world
304
+ * detail (Blender omits `clips` entirely — an action IS the subject there).
305
+ * The editor's own strip reaches it through the class it already imports.
306
+ */
307
+ activeClips(): readonly { id: string; label: string }[] | null {
308
+ const active = this.active;
309
+ const clips = active?.clips?.();
310
+ return clips && clips.length > 1 ? clips : null;
311
+ }
312
+
313
+ setActiveClip(id: string): void {
314
+ this.assertEditorDrives();
315
+ this.active?.setClip?.(id);
316
+ // The new clip's duration is a new range, and the playhead clamps into it.
317
+ const range = this.active?.range();
318
+ if (range) this.clock.setRange({ start: range.start, end: range.end });
319
+ this.applyTime(this.clock.time);
320
+ this.notify();
321
+ }
322
+
323
+ subscribe(listener: () => void): () => void {
324
+ this.listeners.add(listener);
325
+ return () => {
326
+ this.listeners.delete(listener);
327
+ };
328
+ }
329
+
330
+ private notify(): void {
331
+ this.cachedSnapshot = null;
332
+ for (const listener of [...this.listeners]) listener();
333
+ }
334
+
335
+ dispose(): void {
336
+ this.disposed = true;
337
+ this.stopStoreWatch();
338
+ this.cancelSettle();
339
+ this.clock.stop();
340
+ this.subjects.length = 0;
341
+ this.activeId = null;
342
+ this.listeners.clear();
343
+ this.settleListeners.clear();
344
+ }
345
+ }
346
+
347
+ /**
348
+ * WHICH TRANSPORT A STAGE RUNS ON — deliberately the same shape as
349
+ * `stage-store-registry.ts`, for the same objects and the same reason: a
350
+ * panel or contribution holding only a document id must be able to reach the
351
+ * stage's transport without the stage handing it down through props.
352
+ */
353
+ const transports = new Map<string, StageTransport>();
354
+ const registryListeners = new Set<() => void>();
355
+
356
+ function notifyRegistry(): void {
357
+ for (const listener of [...registryListeners]) listener();
358
+ }
359
+
360
+ /** A mounted stage declares its transport. Re-registering the same document
361
+ * replaces it; the returned unregister drops it. */
362
+ export function registerStageTransport(documentId: string, transport: StageTransport): () => void {
363
+ transports.set(documentId, transport);
364
+ notifyRegistry();
365
+ return () => {
366
+ if (transports.get(documentId) !== transport) return;
367
+ transports.delete(documentId);
368
+ notifyRegistry();
369
+ };
370
+ }
371
+
372
+ /** That document's transport, or `null` for a document with no stage of its
373
+ * own (a tool tab, a text document). */
374
+ export function stageTransport(documentId: string | null): StageTransport | null {
375
+ return documentId === null ? null : (transports.get(documentId) ?? null);
376
+ }
377
+
378
+ /** `useSyncExternalStore` shape — a stage mounting or unmounting changes what
379
+ * `stageTransport()` answers. */
380
+ export function subscribeStageTransports(listener: () => void): () => void {
381
+ registryListeners.add(listener);
382
+ return () => {
383
+ registryListeners.delete(listener);
384
+ };
385
+ }