@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,160 @@
1
+ /**
2
+ * The creation-site registry — the host-side half of the index whose
3
+ * source half is `server/creation-site-transform.ts`.
4
+ *
5
+ * ANTI-SHIM: the record NEVER touches the object. A `WeakMap` keyed by the
6
+ * constructed object is the whole storage, so an ingested game cannot see that
7
+ * it is being indexed — no new property, no symbol, no `userData` key, nothing
8
+ * enumerable, nothing a `for…in`/`Object.keys`/JSON round-trip can pick up.
9
+ * (This is the same rule the ingest adapter follows for its structural ids'
10
+ * sole exception, `userData.entityId`, which is a deliberate, documented
11
+ * identity tag; a provenance record has no such justification.)
12
+ *
13
+ * RESOURCE OWNERSHIP (brief-rule 4).
14
+ * - THE MAP is owned by this module and scoped to the editor page's realm.
15
+ * Every same-realm mount in the page shares it, which is correct: the
16
+ * stamped modules are ordinary modules in that one realm and their `new`
17
+ * expressions have exactly one place to report to.
18
+ * - IT IS NEVER CLEARED, deliberately. A `WeakMap` holds no strong reference,
19
+ * so a record dies with the object it describes — a game teardown that
20
+ * dropped its scene has already emptied the registry of everything that
21
+ * mattered. An explicit `clear()` on teardown would be a no-op dressed as
22
+ * cleanup, and it would be WRONG for the upgrade path, where a late-captured
23
+ * mount reuses objects constructed before the capture.
24
+ * - THE INSTALLED GLOBAL is the ownable resource, and it has one owner:
25
+ * `installGatedGameGlobals` (`gated-globals.ts`) installs it alongside the
26
+ * other `__volter*` game-realm globals, once, at the same point in the
27
+ * lifecycle. {@link installCreationSiteRecorder} returns an uninstall for
28
+ * tests, which is the only caller that needs to take it back down.
29
+ */
30
+
31
+ /** A source location a stamped `new` expression reported. */
32
+ export interface CreationSite {
33
+ /** Project-root-RELATIVE path, POSIX separators (e.g. `src/scripts/sim/city.js`). */
34
+ file: string;
35
+ /** 1-based. */
36
+ line: number;
37
+ /** 0-based character offset. */
38
+ col: number;
39
+ }
40
+
41
+ /**
42
+ * What the read surfaces show for one object: either the anchor, or a NAMED
43
+ * reason there is none. There is no third, blank state — an unanchored object
44
+ * says why (the honest-floor rule).
45
+ */
46
+ export type CreationSiteAnchor =
47
+ | ({ anchored: true; kind: 'source'; display: string } & CreationSite)
48
+ | { anchored: false; reason: string };
49
+
50
+ /** The reason for an object that exists but was not constructed by a `new`
51
+ * expression in a served project module — a three.js internal, a GLTF
52
+ * loader's mesh, anything from a bundled dependency. The anchoring does not
53
+ * reach these, so this is what the surfaces say, verbatim. */
54
+ export const UNANCHORED_REASON =
55
+ 'constructed outside project source (library internals or loader output)';
56
+
57
+ /** The reason for a selection with no live object behind it at all. */
58
+ export const NO_OBJECT_REASON = 'no live object for this selection';
59
+
60
+ const sites = new WeakMap<object, CreationSite>();
61
+
62
+ /**
63
+ * How many objects each anchor has constructed — the MULTIPLICITY signal.
64
+ *
65
+ * SimCity builds all 256 tiles from one line (`const tile = new Tile(x, y)`,
66
+ * `src/scripts/sim/city.js:59`), so "can this edit be written at its creation
67
+ * site?" has a second answer beyond "is there a literal there": writing that
68
+ * line would move every tile, and writing it for one tile is a lie about what
69
+ * the source says. Nothing else in the system knows the count — the WeakMap
70
+ * above is deliberately un-enumerable — so it is counted here, at the one place
71
+ * every construction reports to.
72
+ *
73
+ * A PLAIN `Map`, not a WeakMap, and never decremented: the count is over
74
+ * CONSTRUCTIONS, not live objects. That is the conservative direction — a site
75
+ * that built and dropped a hundred objects still refuses, which costs a refusal
76
+ * the user can read, where a count that forgot its history would eventually let
77
+ * a shared site be written as if it were unique. It is keyed by the site string,
78
+ * so it holds no reference to anything the game owns and cannot leak an object.
79
+ */
80
+ const instances = new Map<string, number>();
81
+
82
+ function siteKey(site: CreationSite): string {
83
+ return `${site.file}:${site.line}:${site.col}`;
84
+ }
85
+
86
+ /** The global name the served prelude calls through (must match
87
+ * `CREATION_SITE_GLOBAL` in `server/creation-site-transform.ts`; the pairing is
88
+ * asserted by `creation-site-registry.test.ts`). */
89
+ export const CREATION_SITE_GLOBAL = '__volterRecordCreationSite';
90
+
91
+ type Recorder = (o: unknown, file: string, line: number, col: number) => void;
92
+
93
+ /**
94
+ * Record one construction. FIRST WRITE WINS: a constructor that returns an
95
+ * already-registered object (a cache, a singleton, an interned value) must not
96
+ * have its true creation site overwritten by the call site that merely asked
97
+ * for it again.
98
+ */
99
+ export function recordCreationSite(o: unknown, file: string, line: number, col: number): void {
100
+ if (o === null || (typeof o !== 'object' && typeof o !== 'function')) return;
101
+ if (sites.has(o as object)) return;
102
+ const site: CreationSite = { file, line, col };
103
+ sites.set(o as object, site);
104
+ const key = siteKey(site);
105
+ instances.set(key, (instances.get(key) ?? 0) + 1);
106
+ }
107
+
108
+ /**
109
+ * How many objects this anchor has constructed. `0` for a site nothing was ever
110
+ * recorded at. Only `1` may be written by a single-object edit; a deliberate
111
+ * creation-site-default edit may address the full count after naming it — see
112
+ * `creation-site-edit.ts`'s `CreationSiteWriteScope`.
113
+ */
114
+ export function instancesAtSite(site: CreationSite): number {
115
+ return instances.get(siteKey(site)) ?? 0;
116
+ }
117
+
118
+ /** Test-only: forget every recorded construction count. The WeakMap needs no
119
+ * equivalent (it is collected with its keys) and deliberately has none. */
120
+ export function resetCreationSiteCountsForTest(): void {
121
+ instances.clear();
122
+ }
123
+
124
+ /** The raw record for an object, or `null`. */
125
+ export function creationSiteOf(o: unknown): CreationSite | null {
126
+ if (o === null || (typeof o !== 'object' && typeof o !== 'function')) return null;
127
+ return sites.get(o as object) ?? null;
128
+ }
129
+
130
+ /** `src/scripts/sim/city.js:59` — the text the inspector shows and the editor's `eval` command reads. */
131
+ export function formatCreationSite(site: CreationSite): string {
132
+ return `${site.file}:${site.line}`;
133
+ }
134
+
135
+ /**
136
+ * The read-surface answer for one object: the anchor, or the named reason there
137
+ * isn't one. `null`/a non-object means the caller had no live object to ask
138
+ * about, which is a DIFFERENT honest answer from "the library built it".
139
+ */
140
+ export function creationSiteAnchor(o: unknown): CreationSiteAnchor {
141
+ if (o === null || o === undefined) return { anchored: false, reason: NO_OBJECT_REASON };
142
+ const site = creationSiteOf(o);
143
+ if (!site) return { anchored: false, reason: UNANCHORED_REASON };
144
+ return { anchored: true, kind: 'source', ...site, display: formatCreationSite(site) };
145
+ }
146
+
147
+ /**
148
+ * Publish {@link recordCreationSite} on `globalThis` for the served prelude.
149
+ * Idempotent. Returns an uninstall — see the module header for who owns this.
150
+ */
151
+ export function installCreationSiteRecorder(): () => void {
152
+ const g = globalThis as unknown as Record<string, unknown>;
153
+ const existing = g[CREATION_SITE_GLOBAL];
154
+ if (typeof existing === 'function') return () => {};
155
+ const recorder: Recorder = recordCreationSite;
156
+ g[CREATION_SITE_GLOBAL] = recorder;
157
+ return () => {
158
+ if (g[CREATION_SITE_GLOBAL] === recorder) delete g[CREATION_SITE_GLOBAL];
159
+ };
160
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * WHICH CODING HARNESSES CAN BE DELEGATED TO — the eleventh registry in the
3
+ * family of `workspace-document-restore.ts` (a kind owns its persisted state),
4
+ * `document-open-registry.ts` (a kind owns how it opens), `chrome-slot-registry
5
+ * .ts` (the host owns the place, a package owns what sits there),
6
+ * `content-entry-source-registry.ts` (the host owns the Content scope, a
7
+ * package owns why a component is content) and the seven since. Here: the host
8
+ * owns the DELEGATE FORM — the task text, the isolation choice, the branch
9
+ * name, the button, the notice line and `delegateEditorTask` itself — and a
10
+ * package owns WHICH AGENTS EXIST.
11
+ *
12
+ * WHY IT EXISTS. `components/WorktreeSwitcher.tsx`'s Delegate form was the
13
+ * single edge holding `api/agents.ts` and its three wire modules in the
14
+ * editor's eager import closure (WORK.md §The open-source launch, the four
15
+ * that remained of the harness bucket): it called `getHarnessChatSnapshot()`
16
+ * to list which harnesses are installed, and it named two of them by hand
17
+ * (`claude`, `codex`). A base library for making IDEs should not know the
18
+ * name of a coding agent.
19
+ *
20
+ * THE DOOR THE RECORD NAMED WAS A BIGGER ONE, AND THE CODE DID NOT WANT IT.
21
+ * Unit 21 specified "a chrome slot that can hand its filler a dismiss/refresh
22
+ * callback", i.e. the whole form becoming `@volter/agents`' surface. Measured
23
+ * against the form: of its ~120 lines, everything but the harness `<Select>`
24
+ * is the worktree board's own vocabulary — the branch slug, the two
25
+ * isolations, the copy about sibling checkouts, and
26
+ * `delegateEditorTask` (`api/worktrees.ts`, a `keep`-bucket module whose wire
27
+ * already takes a `harness` string). Moving it would have put the board's
28
+ * delegation UI inside the agents package AND changed `ChromeSlotFiller` —
29
+ * whose whole claim is that a slot is a PLACE, rendered `<filler.Content />`
30
+ * with no props — for every existing filler. What the host actually cannot
31
+ * answer is one question, so one question is what it asks.
32
+ *
33
+ * ASKED PER ISOLATION, so a source whose answer depends on where the task runs
34
+ * can say so; the host passes the isolation and reads a list.
35
+ *
36
+ * THE KIT ANSWERS FIRST. `WorktreeSwitcher.tsx` registers the harnesses supercode
37
+ * reports able to start (`/__editor/worktrees/harnesses`); a package may add more.
38
+ */
39
+
40
+ /** How a delegated task is isolated from the caller's checkout — the board's
41
+ * own vocabulary, passed to a source as the question's context. */
42
+ export type DelegateIsolation = 'worktree' | 'current';
43
+
44
+ export interface DelegateHarness {
45
+ /** The value `delegateEditorTask({ harness })` takes. */
46
+ readonly id: string;
47
+ /** What the picker shows. */
48
+ readonly label: string;
49
+ }
50
+
51
+ export interface DelegateHarnessSource {
52
+ /** Which module registered it. Re-registering the same owner REPLACES, so
53
+ * an HMR re-evaluation leaves one source, not two. */
54
+ readonly owner: string;
55
+ /** Ascending; ties keep registration order. */
56
+ readonly order?: number;
57
+ /** Asking is a fetch, so this is async; the form re-asks whenever the
58
+ * isolation or the registry version changes. */
59
+ readonly harnesses: (isolation: DelegateIsolation) => Promise<readonly DelegateHarness[]>;
60
+ }
61
+
62
+ const _sources: DelegateHarnessSource[] = [];
63
+ const listeners = new Set<() => void>();
64
+ let version = 0;
65
+
66
+ function publish(): void {
67
+ version++;
68
+ for (const listener of listeners) listener();
69
+ }
70
+
71
+ /** Install a source. Returns the teardown. */
72
+ export function registerDelegateHarnessSource(source: DelegateHarnessSource): () => void {
73
+ const stale = _sources.findIndex((item) => item.owner === source.owner);
74
+ if (stale >= 0) _sources.splice(stale, 1);
75
+ _sources.push(source);
76
+ _sources.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
77
+ publish();
78
+ return () => {
79
+ const at = _sources.indexOf(source);
80
+ if (at < 0) return;
81
+ _sources.splice(at, 1);
82
+ publish();
83
+ };
84
+ }
85
+
86
+ /**
87
+ * THE HOST'S ONE QUESTION. Every source's answer, in registration order, with
88
+ * the first claim on an id winning — two packages offering the same harness is
89
+ * one harness, and the one that registered earlier named it.
90
+ *
91
+ * A source that throws is skipped rather than taking the form down with it:
92
+ * the picker degrades to the harnesses that did answer, which is the same
93
+ * shape as no source at all.
94
+ */
95
+ export async function delegateHarnesses(
96
+ isolation: DelegateIsolation,
97
+ ): Promise<readonly DelegateHarness[]> {
98
+ const seen = new Set<string>();
99
+ const out: DelegateHarness[] = [];
100
+ for (const source of _sources) {
101
+ let answered: readonly DelegateHarness[];
102
+ try {
103
+ answered = await source.harnesses(isolation);
104
+ } catch {
105
+ continue;
106
+ }
107
+ for (const harness of answered) {
108
+ if (seen.has(harness.id)) continue;
109
+ seen.add(harness.id);
110
+ out.push(harness);
111
+ }
112
+ }
113
+ return out;
114
+ }
115
+
116
+ /** The form's `useSyncExternalStore` subscription: a source arriving with a
117
+ * contribution pass re-asks the question. */
118
+ export function subscribeDelegateHarnessSources(listener: () => void): () => void {
119
+ listeners.add(listener);
120
+ return () => {
121
+ listeners.delete(listener);
122
+ };
123
+ }
124
+
125
+ export function delegateHarnessRegistryVersion(): number {
126
+ return version;
127
+ }
128
+
129
+ /** Test-only reset (mirrors the restore, open, chrome-slot and content-entry
130
+ * registries'). */
131
+ export function __resetDelegateHarnessSourcesForTest(): void {
132
+ _sources.length = 0;
133
+ publish();
134
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * A DOCUMENT'S SECOND AREA, and the host chrome it borrows.
3
+ *
4
+ * The host draws one header strip over a document (the document's own header, then the stage's
5
+ * controls) and one tool shelf at its leading edge. A document that divides its body into two
6
+ * AREAS side by side (Blender's split 3D viewport) needs that chrome divided the same way,
7
+ * because each of Blender's areas carries its own header over itself and its own tool shelf. So
8
+ * the document declares its second area ({@link setDocumentSecondArea}):
9
+ *
10
+ * - `headerWidth`: the host reserves that width at the strip's trailing edge, after its own
11
+ * controls, which then end where the first area ends, and hands the region's element back
12
+ * ({@link documentSecondAreaHeader}) for the document to draw the second area's header in;
13
+ * - `shelf`: an element inside the second area, which the host fills with the same tool strip
14
+ * its own shelf carries (the tools are the workspace's, not an area's).
15
+ *
16
+ * With no second area declared, the host draws its chrome as it always does.
17
+ */
18
+ export interface DocumentSecondArea {
19
+ readonly headerWidth: number;
20
+ readonly shelf: HTMLElement | null;
21
+ }
22
+
23
+ const areas = new Map<string, DocumentSecondArea>();
24
+ const headers = new Map<string, HTMLElement>();
25
+ const listeners = new Set<() => void>();
26
+ let version = 0;
27
+
28
+ function changed(): void {
29
+ version++;
30
+ for (const listener of [...listeners]) listener();
31
+ }
32
+
33
+ /** Declare `documentId`'s second area, or remove it with null. */
34
+ export function setDocumentSecondArea(documentId: string, area: DocumentSecondArea | null): void {
35
+ const current = areas.get(documentId);
36
+ const width = area === null ? null : Math.max(0, Math.round(area.headerWidth));
37
+ if (area === null ? current === undefined : current?.headerWidth === width && current.shelf === area.shelf) return;
38
+ if (area === null || width === null) areas.delete(documentId);
39
+ else areas.set(documentId, { headerWidth: width, shelf: area.shelf });
40
+ changed();
41
+ }
42
+
43
+ /** `documentId`'s second area, or null. */
44
+ export function documentSecondArea(documentId: string): DocumentSecondArea | null {
45
+ return areas.get(documentId) ?? null;
46
+ }
47
+
48
+ /** The host's header region for the second area, once drawn; null before and after. */
49
+ export function documentSecondAreaHeader(documentId: string): HTMLElement | null {
50
+ return headers.get(documentId) ?? null;
51
+ }
52
+
53
+ /** Called by the host as it draws and removes the second area's header region. */
54
+ export function bindDocumentSecondAreaHeader(documentId: string, element: HTMLElement | null): void {
55
+ if ((headers.get(documentId) ?? null) === element) return;
56
+ if (element === null) headers.delete(documentId);
57
+ else headers.set(documentId, element);
58
+ changed();
59
+ }
60
+
61
+ export function subscribeDocumentAreas(listener: () => void): () => void {
62
+ listeners.add(listener);
63
+ return () => {
64
+ listeners.delete(listener);
65
+ };
66
+ }
67
+
68
+ export function documentAreasVersion(): number {
69
+ return version;
70
+ }
@@ -0,0 +1,193 @@
1
+ import { documentStageAnnounced, documentViewport } from '@volter/sdk/kit/document-viewports';
2
+ import { DOCUMENT_REGISTRATION_TIMEOUT_MS, waitUntil } from './wait-until';
3
+
4
+ /**
5
+ * THE OPEN DOCUMENT'S OWN CONTEXT, published for the REPL door.
6
+ *
7
+ * A tool document (`workspace.document`) may hand the host ONE object — the
8
+ * live session it edits through — and `editor.document.run(ctx => …)`
9
+ * (the editor's `eval` command) runs a wire-carried step against it, in Edit mode, without
10
+ * play. This is the "explore in the REPL, commit as source" half of the
11
+ * parity program's one spine (docs/BLENDER-PARITY.md §Execution model): the
12
+ * mesh document publishes its `MeshEditSession`, whose `ctx` is the
13
+ * bpy-shaped edit context, so an agent phrases a modeling step the way the
14
+ * corpus does — context + selection + op — and reads the result back.
15
+ *
16
+ * Keyed by workspace document id; the door resolves the ACTIVE document and
17
+ * refuses by name when it published nothing (a data sheet, a story). A
18
+ * document re-publishes whenever its session object changes (a reload swaps
19
+ * it); publishing returns the unpublish.
20
+ *
21
+ * ITS SIBLING FACT, and the reason they share a module: whether a contributed
22
+ * document has MOUNTED AT ALL. Both are things a contribution's own React root
23
+ * tells the host about itself, and both exist because `ToolHost.tsx` renders
24
+ * that contribution into a SEPARATE root (`createEditorRoot(...).render(...)`),
25
+ * which React schedules — so nothing in the host's own commit can say whether
26
+ * the contribution has rendered yet. Every door that must not read a document
27
+ * "before it decided what it is" waits on one of these two.
28
+ */
29
+
30
+ const _contexts = new Map<string, unknown>();
31
+ const _contextOwners = new Map<string, symbol>();
32
+ const _listeners = new Set<() => void>();
33
+ const _mounted = new Set<string>();
34
+ const _mountListeners = new Set<() => void>();
35
+
36
+ let _version = 0;
37
+ let _notificationPending = false;
38
+
39
+ function _notifyContexts(): void {
40
+ // Contributions publish from their own React roots' effects. A host store
41
+ // update here can synchronously re-enter a pending host commit when React
42
+ // flushes passive effects. Publish the React snapshot after that stack has
43
+ // unwound; direct context readers still see the new handle immediately.
44
+ if (_notificationPending) return;
45
+ _notificationPending = true;
46
+ queueMicrotask(() => {
47
+ _notificationPending = false;
48
+ _version += 1;
49
+ for (const listener of [..._listeners]) listener();
50
+ });
51
+ }
52
+
53
+ export function publishDocumentContext(documentId: string, context: unknown): () => void {
54
+ // Remounted panes can publish the same long-lived view object. Cleanup
55
+ // belongs to this registration, not to the identity of that shared view.
56
+ const owner = Symbol(documentId);
57
+ _contextOwners.set(documentId, owner);
58
+ _contexts.set(documentId, context);
59
+ _notifyContexts();
60
+ return () => {
61
+ if (_contextOwners.get(documentId) !== owner) return;
62
+ _contextOwners.delete(documentId);
63
+ _contexts.delete(documentId);
64
+ _notifyContexts();
65
+ };
66
+ }
67
+
68
+ /**
69
+ * THE PUBLISHED CONTEXT HAS MOVED — said by the package that DRIVES the
70
+ * document, not by the one that published it.
71
+ *
72
+ * The context object is a live handle, so a package can change what it answers
73
+ * without ever republishing: `@volter/editor-blender` reads the engine through its RNA
74
+ * door and the answer decides which Properties TABS exist for the selected
75
+ * datablock (an armature has a Bone tab, a cube does not). Nothing in the
76
+ * host's own stores moves when that answer arrives, so before this existed the
77
+ * inspector had no reason to re-compose and the rail stayed at whatever the
78
+ * first render could see.
79
+ *
80
+ * `use-active-inspection.ts` subscribes to {@link documentContextVersion}, so
81
+ * this makes the whole inspection re-derive — matches included.
82
+ */
83
+ export function notifyDocumentContextChanged(documentId: string): void {
84
+ if (!_contexts.has(documentId)) return;
85
+ _notifyContexts();
86
+ }
87
+
88
+ export function subscribeDocumentContexts(listener: () => void): () => void {
89
+ _listeners.add(listener);
90
+ return () => {
91
+ _listeners.delete(listener);
92
+ };
93
+ }
94
+
95
+ export function documentContextVersion(): number {
96
+ return _version;
97
+ }
98
+
99
+ export function documentContextFor(documentId: string): unknown {
100
+ return _contexts.get(documentId);
101
+ }
102
+
103
+ /** Opening a document activates its tab before an async model import can
104
+ * publish its context. The REPL waits for that publication; it never executes
105
+ * against a placeholder or mistakes a loading document for an unsupported one. */
106
+ export function waitForDocumentContext(documentId: string, timeoutMs = 10_000): Promise<unknown> {
107
+ const current = documentContextFor(documentId);
108
+ if (current !== undefined) return Promise.resolve(current);
109
+ return new Promise((resolve) => {
110
+ const onPublish = () => {
111
+ const context = documentContextFor(documentId);
112
+ if (context === undefined) return;
113
+ clearTimeout(timeout);
114
+ _listeners.delete(onPublish);
115
+ resolve(context);
116
+ };
117
+ const timeout = setTimeout(() => {
118
+ _listeners.delete(onPublish);
119
+ resolve(undefined);
120
+ }, timeoutMs);
121
+ _listeners.add(onPublish);
122
+ });
123
+ }
124
+
125
+ export function __resetDocumentContextsForTest(): void {
126
+ _contexts.clear();
127
+ _contextOwners.clear();
128
+ _mounted.clear();
129
+ }
130
+
131
+ /**
132
+ * A CONTRIBUTED DOCUMENT'S REACT ROOT HAS COMMITTED — published by the host's
133
+ * own wrapper INSIDE that root (`ToolHost.tsx`), so every child effect has run
134
+ * by the time it fires. That ordering is the whole point: it is what lets an
135
+ * opener's `ready` read an absent stage announcement as "this document has no
136
+ * stage" rather than "the stage has not rendered yet"
137
+ * (`authoring/object3d-document-session-registry.ts`).
138
+ */
139
+ export function markContributedDocumentMounted(documentId: string): () => void {
140
+ _mounted.add(documentId);
141
+ for (const listener of [..._mountListeners]) listener();
142
+ return () => {
143
+ _mounted.delete(documentId);
144
+ };
145
+ }
146
+
147
+ /** Resolves once this document's contribution has committed, `false` if the
148
+ * bounded window elapses first — the same shape and reason as
149
+ * {@link waitForDocumentContext} above. */
150
+ export function waitForContributedDocumentMount(
151
+ documentId: string,
152
+ timeoutMs = 10_000,
153
+ ): Promise<boolean> {
154
+ if (_mounted.has(documentId)) return Promise.resolve(true);
155
+ return new Promise((resolve) => {
156
+ const onMount = () => {
157
+ if (!_mounted.has(documentId)) return;
158
+ clearTimeout(timeout);
159
+ _mountListeners.delete(onMount);
160
+ resolve(true);
161
+ };
162
+ const timeout = setTimeout(() => {
163
+ _mountListeners.delete(onMount);
164
+ resolve(false);
165
+ }, timeoutMs);
166
+ _mountListeners.add(onMount);
167
+ });
168
+ }
169
+
170
+ /**
171
+ * THE SHARED HALF OF EVERY OPENER'S `ready` (`document-open-registry.ts`): a
172
+ * document whose stage announced itself
173
+ * (`authoring/object3d-document-session-registry.ts`) is not ready to be
174
+ * driven until that stage has registered its session, and one that announced
175
+ * nothing is ready already. Each caller has already waited for its own MOUNT
176
+ * to settle — the asset family for its Inspector, a contributed document for
177
+ * the React root above — which is what makes an absent announcement mean
178
+ * "this document has no stage" rather than "the stage has not rendered yet".
179
+ *
180
+ * The refusal sentence is the one `editor-view-presentation.ts` used to throw,
181
+ * moved to the kinds' own side unchanged.
182
+ */
183
+ export async function awaitAnnouncedObject3DDocumentSession(documentId: string): Promise<void> {
184
+ if (!documentStageAnnounced(documentId)) return;
185
+ if (
186
+ await waitUntil(
187
+ () => documentViewport(documentId) !== null,
188
+ DOCUMENT_REGISTRATION_TIMEOUT_MS,
189
+ )
190
+ )
191
+ return;
192
+ throw new Error(`The requested Object3D view did not mount for document: ${documentId}`);
193
+ }