@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,280 @@
1
+ /**
2
+ * `editor.hierarchy()` — the machine door onto the hierarchy panel's ACTUAL
3
+ * rendered row tree.
4
+ *
5
+ * ## Why this publishes instead of re-deriving
6
+ *
7
+ * `inspection/active-subject.ts` answers "what is the inspector showing?" by
8
+ * calling the same composer the panel calls, with the same inputs, at the
9
+ * moment it is asked. That works because every one of the inspector's inputs is
10
+ * reachable from live state.
11
+ *
12
+ * The hierarchy panel's are not. Its final row list is a fold of the adapter's
13
+ * tree, the mark view, the internals reveal, the search term, the child cap,
14
+ * the selection scope, per-world hide flags, AND two pieces of state that live
15
+ * inside the component instance: the session expansion map (`useRef`) and the
16
+ * measured scroll window. A door that re-walked the adapter to "reconstruct"
17
+ * that list would be a SECOND row pipeline, free to disagree with the panel —
18
+ * and a door whose whole purpose is diagnosing the panel is worthless the
19
+ * moment it can disagree with it. That is not hypothetical: `editor.status()`'s
20
+ * `entities` facet (`authoring/shell-document-ops.ts`) walks the RAW adapter
21
+ * hierarchy with no marks, no internals folding and no document promotion, so
22
+ * it reports a tree the panel has never rendered — which is exactly why it
23
+ * could not surface a panel defect.
24
+ *
25
+ * So the panel PUBLISHES what it computed. The snapshot holds the panel's own
26
+ * `HierarchyNodeRow[]` and the panel's own predicates by reference — not copies, not
27
+ * re-derivations — and serialization happens only when the door is called, so a
28
+ * render that nobody reads costs one object allocation.
29
+ *
30
+ * ## What "mounted" means here
31
+ *
32
+ * The publish happens in an effect, so the snapshot describes a tree that has
33
+ * been COMMITTED to the DOM. With no panel mounted there is no snapshot and the
34
+ * door refuses by name rather than answering with an empty tree — a fabricated
35
+ * "the hierarchy is empty" is the anti-shim rule's failure on the one surface
36
+ * that exists to be believed. Because the commit is what publishes, a caller
37
+ * that MUTATES the panel (Expand/Collapse All) takes
38
+ * {@link nextHierarchyPanelSnapshot} before it acts and awaits it, so its ack
39
+ * means "the rows the next `hierarchy()` serializes are the rows this mutation
40
+ * produced" rather than "the mutation was requested".
41
+ */
42
+
43
+ import type { HierarchyNodeRow } from '@volter/sdk/kit/hierarchy-node-rows';
44
+
45
+ /**
46
+ * What the panel hands over: its final rows plus the predicates it already
47
+ * evaluated them with. Every member is the panel's own — see this module's
48
+ * header for why nothing here is recomputed.
49
+ */
50
+ export interface HierarchyPanelSnapshot {
51
+ /** The panel's final row list, in display order, AFTER search / cap /
52
+ * collapse / scope / world-hide filtering — i.e. the rows a human scrolls. */
53
+ readonly rows: readonly HierarchyNodeRow[];
54
+ /** The slice actually in the DOM right now (virtualization window). */
55
+ readonly window: { readonly start: number; readonly end: number };
56
+ /** The active search term, or `null` when browsing. */
57
+ readonly searchTerm: string | null;
58
+ /** The row the panel is scoped into (double-clicked instance), or `null`. */
59
+ readonly scopeId: string | null;
60
+ /** The panel's own expansion verdict — session state, then the persisted
61
+ * preference, then the shape/mark defaults. */
62
+ readonly isExpanded: (row: HierarchyNodeRow) => boolean;
63
+ /** True for a row that exists only because internals were revealed. */
64
+ readonly isInternal: (id: string) => boolean;
65
+ /** True for a row carrying `volterComponentRoot`. */
66
+ readonly isComponentRoot: (id: string) => boolean;
67
+ /** How many children this row's view FOLDED AWAY as implementation. */
68
+ readonly foldedInternalCount: (id: string) => number;
69
+ /** The panel's own Expand All action. Machine readers use the same mutation
70
+ * as the toolbar, then read a later committed snapshot; they never bypass
71
+ * collapse state by walking the adapter behind the panel. */
72
+ readonly expandAll: () => void;
73
+ /** The panel's own Collapse All action — the SAME toolbar button's other
74
+ * half. It exists because Expand All alone is a one-way door: once a
75
+ * machine reader expands, nothing through the product restores the tree's
76
+ * rest state (the fold is written to this project's persisted preference,
77
+ * and a chevron's own click is not drivable — `editor.document.click`
78
+ * refuses editor chrome by name). A rest state the product cannot return
79
+ * to is a rest state the product cannot certify. */
80
+ readonly collapseAll: () => void;
81
+ }
82
+
83
+ /** One serialized panel row. Nested, because the shape of the tree IS the
84
+ * thing under diagnosis. */
85
+ export interface SerializedHierarchyRow {
86
+ id: string;
87
+ label: string;
88
+ /** The dim type suffix the row prints (`Coin1 ·Coin`). */
89
+ typeLabel?: string;
90
+ role?: string;
91
+ depth: number;
92
+ /**
93
+ * Children the row's own view has — what opening the caret reveals. This is
94
+ * the PROJECTED count: implementation children folded by the mark view are
95
+ * not in it (they are in {@link internalChildCount}).
96
+ */
97
+ childCount: number;
98
+ /** Children folded away as implementation, reachable through "Reveal
99
+ * Internals". Non-zero with `childCount: 0` is a row whose whole subtree is
100
+ * machinery. */
101
+ internalChildCount: number;
102
+ /**
103
+ * Whether the panel renders a disclosure control on this row. THE
104
+ * load-bearing field: a row with children of any kind and
105
+ * `expandable: false` is a subtree the UI offers no way to reach.
106
+ */
107
+ expandable: boolean;
108
+ /** Only meaningful when {@link expandable}. */
109
+ expanded?: boolean;
110
+ /** Read-only, de-emphasized revealed-internal row. */
111
+ internal?: true;
112
+ /** Marked component-instance root. */
113
+ componentRoot?: true;
114
+ /** A synthetic "… N more" cap stub rather than a real node. */
115
+ more?: { hidden: number };
116
+ children?: readonly SerializedHierarchyRow[];
117
+ }
118
+
119
+ /** The whole panel, as data. */
120
+ export interface SerializedHierarchyPanel {
121
+ /** Total rows in the panel's list (not just the windowed slice). */
122
+ rowCount: number;
123
+ /** The slice in the DOM; `end - start < rowCount` means scrolling reveals more. */
124
+ window: { start: number; end: number };
125
+ /** Present only while a search is filtering the tree. */
126
+ search?: string;
127
+ /** Present only while the panel is scoped into a subtree. */
128
+ scopeId?: string;
129
+ /** Which surface the rows belong to — a play-mode tree and an edit-mode tree
130
+ * come from different adapters, and telling them apart is the first question
131
+ * any hierarchy diagnosis asks. */
132
+ playState: string;
133
+ activeViewportTab: string;
134
+ roots: readonly SerializedHierarchyRow[];
135
+ }
136
+
137
+ // ------------------------------------------------------------ session state
138
+
139
+ let published: HierarchyPanelSnapshot | null = null;
140
+
141
+ /** Callers parked in {@link nextHierarchyPanelSnapshot}, settled by the next
142
+ * publish (resolve) or by the panel going away (reject). */
143
+ const waiters: Array<{
144
+ readonly resolve: (snapshot: HierarchyPanelSnapshot) => void;
145
+ readonly reject: (error: Error) => void;
146
+ }> = [];
147
+
148
+ /** Called by `GameHierarchy` after every commit. */
149
+ export function publishHierarchyPanelSnapshot(snapshot: HierarchyPanelSnapshot): void {
150
+ published = snapshot;
151
+ if (waiters.length === 0) return;
152
+ for (const waiter of waiters.splice(0, waiters.length)) waiter.resolve(snapshot);
153
+ }
154
+
155
+ /**
156
+ * Resolve on the panel's NEXT published snapshot — i.e. the next React commit.
157
+ *
158
+ * A mutation through the snapshot's own actions (`expandAll`/`collapseAll`)
159
+ * only mutates a ref and schedules a re-render; the rows the door serializes
160
+ * are republished from the panel's effect. Take this promise BEFORE calling the
161
+ * action and await it after, and the mutation's ack lands on the committed
162
+ * tree. No timeout: the actions force a render unconditionally
163
+ * (`useReducer` increment — never a bail-out, even when the expansion map is
164
+ * unchanged), so a publish always follows, and a caller that would otherwise
165
+ * hang is instead rejected by {@link clearHierarchyPanelSnapshot}.
166
+ */
167
+ export function nextHierarchyPanelSnapshot(): Promise<HierarchyPanelSnapshot> {
168
+ return new Promise<HierarchyPanelSnapshot>((resolve, reject) => {
169
+ waiters.push({ resolve, reject });
170
+ });
171
+ }
172
+
173
+ /** Called on unmount. Guarded so a remount's publish is never clobbered by the
174
+ * outgoing instance's cleanup (effect cleanup runs after the next mount's
175
+ * effect in a React remount). */
176
+ export function clearHierarchyPanelSnapshot(snapshot: HierarchyPanelSnapshot): void {
177
+ if (published !== snapshot) return;
178
+ published = null;
179
+ if (waiters.length === 0) return;
180
+ // This cleanup is NOT unmount-only: the panel's publish effect depends on the
181
+ // snapshot object, which is fresh every render, so an ordinary update runs
182
+ // this clear and then the new publish back-to-back inside one commit. Only a
183
+ // real unmount leaves `published` null once that commit has drained, so the
184
+ // rejection is deferred one microtask and skipped if a publish arrived.
185
+ queueMicrotask(() => {
186
+ if (published !== null || waiters.length === 0) return;
187
+ for (const waiter of waiters.splice(0, waiters.length)) {
188
+ waiter.reject(
189
+ new Error(
190
+ 'the hierarchy panel (GameHierarchy) unmounted before it published the mutated row tree, so the mutation cannot be acknowledged against a rendered tree. Open the Hierarchy panel in the workspace dock and retry.',
191
+ ),
192
+ );
193
+ }
194
+ });
195
+ }
196
+
197
+ /** `null` when no hierarchy panel is mounted. */
198
+ export function hierarchyPanelSnapshot(): HierarchyPanelSnapshot | null {
199
+ return published;
200
+ }
201
+
202
+ /** Test-only reset for the module-level singleton. */
203
+ export function __resetHierarchyPanelSnapshotForTest(): void {
204
+ published = null;
205
+ waiters.length = 0;
206
+ }
207
+
208
+ // -------------------------------------------------------------- serialization
209
+
210
+ /**
211
+ * Turn the panel's flat, depth-tagged rows back into the nesting a reader sees.
212
+ *
213
+ * The flattener emits rows in display order with a `depth`, so a depth stack
214
+ * rebuilds the parenting exactly — including a search result set, whose depths
215
+ * jump (an ancestor may be filtered out), which the stack handles by popping to
216
+ * the nearest shallower row rather than inventing a parent.
217
+ */
218
+ export function serializeHierarchyPanel(
219
+ snapshot: HierarchyPanelSnapshot,
220
+ mode: { readonly playState: string; readonly activeViewportTab: string },
221
+ ): SerializedHierarchyPanel {
222
+ const roots: SerializedHierarchyRow[] = [];
223
+ /** The open ancestor chain: `stack[i]` is the last row emitted at depth `i`. */
224
+ const stack: SerializedHierarchyRow[] = [];
225
+
226
+ for (const row of snapshot.rows) {
227
+ const serialized = serializeRow(row, snapshot);
228
+ while (stack.length > row.depth) stack.pop();
229
+ const parent = stack.length > 0 ? stack[stack.length - 1] : undefined;
230
+ if (parent === undefined) {
231
+ roots.push(serialized);
232
+ } else {
233
+ const children = parent.children as SerializedHierarchyRow[] | undefined;
234
+ if (children === undefined) parent.children = [serialized];
235
+ else children.push(serialized);
236
+ }
237
+ stack.push(serialized);
238
+ }
239
+
240
+ return {
241
+ rowCount: snapshot.rows.length,
242
+ window: { start: snapshot.window.start, end: snapshot.window.end },
243
+ ...(snapshot.searchTerm ? { search: snapshot.searchTerm } : {}),
244
+ ...(snapshot.scopeId ? { scopeId: snapshot.scopeId } : {}),
245
+ playState: mode.playState,
246
+ activeViewportTab: mode.activeViewportTab,
247
+ roots,
248
+ };
249
+ }
250
+
251
+ function serializeRow(
252
+ row: HierarchyNodeRow,
253
+ snapshot: HierarchyPanelSnapshot,
254
+ ): SerializedHierarchyRow {
255
+ const { node } = row;
256
+ if (row.more) {
257
+ return {
258
+ id: node.id,
259
+ label: `… ${row.more.hidden} more`,
260
+ depth: row.depth,
261
+ childCount: 0,
262
+ internalChildCount: 0,
263
+ expandable: false,
264
+ more: { hidden: row.more.hidden },
265
+ };
266
+ }
267
+ return {
268
+ id: node.id,
269
+ label: node.label,
270
+ ...(node.typeLabel === undefined ? {} : { typeLabel: node.typeLabel }),
271
+ ...(node.role === undefined ? {} : { role: node.role }),
272
+ depth: row.depth,
273
+ childCount: node.childIds.length,
274
+ internalChildCount: snapshot.foldedInternalCount(node.id),
275
+ expandable: row.hasChildren,
276
+ ...(row.hasChildren ? { expanded: snapshot.isExpanded(row) } : {}),
277
+ ...(snapshot.isInternal(node.id) ? { internal: true as const } : {}),
278
+ ...(snapshot.isComponentRoot(node.id) ? { componentRoot: true as const } : {}),
279
+ };
280
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Project-authored hierarchy projection (D20).
3
+ *
4
+ * This is editor metadata, not runtime composition. `volter.project.json.roots`
5
+ * declares adapter mounts; `volter.project.json.authoring.hierarchy` only
6
+ * chooses how those roots are labelled and grouped in the authoring tree.
7
+ */
8
+
9
+ export interface HierarchyProjectionGroup {
10
+ readonly id: string;
11
+ readonly label: string;
12
+ readonly roots: readonly string[];
13
+ }
14
+
15
+ export interface HierarchyProjection {
16
+ readonly rootLabels?: Readonly<Record<string, string>>;
17
+ readonly groups?: readonly HierarchyProjectionGroup[];
18
+ }
19
+
20
+ function record(value: unknown): Record<string, unknown> | null {
21
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
22
+ ? (value as Record<string, unknown>)
23
+ : null;
24
+ }
25
+
26
+ /**
27
+ * Leniently read authoring metadata. Invalid entries are omitted so a typo in
28
+ * an optional projection can never make the game itself unopenable.
29
+ */
30
+ export function parseHierarchyProjection(value: unknown): HierarchyProjection | undefined {
31
+ const source = record(value);
32
+ if (!source) return undefined;
33
+
34
+ const labelsSource = record(source['rootLabels']);
35
+ const labelEntries = labelsSource
36
+ ? Object.entries(labelsSource).flatMap(([id, label]): Array<[string, string]> => {
37
+ const normalizedId = id.trim();
38
+ const normalizedLabel = typeof label === 'string' ? label.trim() : '';
39
+ return normalizedId && normalizedLabel ? [[normalizedId, normalizedLabel]] : [];
40
+ })
41
+ : [];
42
+ const rootLabels = labelEntries.length > 0 ? Object.fromEntries(labelEntries) : undefined;
43
+
44
+ const groupIds = new Set<string>();
45
+ const groupEntries = Array.isArray(source['groups'])
46
+ ? source['groups'].flatMap((candidate): HierarchyProjectionGroup[] => {
47
+ const group = record(candidate);
48
+ const id = typeof group?.['id'] === 'string' ? group['id'].trim() : '';
49
+ const label = typeof group?.['label'] === 'string' ? group['label'].trim() : '';
50
+ const roots = Array.isArray(group?.['roots'])
51
+ ? group['roots'].flatMap((root): string[] => {
52
+ const normalized = typeof root === 'string' ? root.trim() : '';
53
+ return normalized ? [normalized] : [];
54
+ })
55
+ : [];
56
+ if (!id || !label || roots.length === 0 || groupIds.has(id)) return [];
57
+ groupIds.add(id);
58
+ return [{ id, label, roots: [...new Set(roots)] }];
59
+ })
60
+ : [];
61
+ const groups = groupEntries.length > 0 ? groupEntries : undefined;
62
+
63
+ if (!rootLabels && !groups) return undefined;
64
+ return {
65
+ ...(rootLabels ? { rootLabels } : {}),
66
+ ...(groups ? { groups } : {}),
67
+ };
68
+ }
69
+
70
+ /** Read the projection from a raw `volter.project.json` config object. */
71
+ export function hierarchyProjectionFromProjectConfig(
72
+ config: unknown,
73
+ ): HierarchyProjection | undefined {
74
+ const authoring = record(record(config)?.['authoring']);
75
+ return parseHierarchyProjection(authoring?.['hierarchy']);
76
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * What a medium adds to the hierarchy panel's rows: a row's detail line (an instanced mesh names
3
+ * the units one object draws), the adapter's component marks, and the store's structural change
4
+ * log that lets the panel patch rows instead of rebuilding them. The Three integration registers
5
+ * its answers; with none registered a row has no detail, no marks, and the panel rebuilds.
6
+ */
7
+ import type { AuthoringAdapter, HierarchyProvider } from '@volter/project/adapter';
8
+ import type { NodeMarkReader } from './hierarchy-component-marks';
9
+ import type { ShellStore } from './shell-store';
10
+
11
+ /** Which projected parents changed after an epoch; `null` when the panel must rebuild. */
12
+ export interface HierarchyStructureLog {
13
+ epoch(): number;
14
+ parentChangesSince(epoch: number): { readonly epoch: number; readonly changedParentIds: ReadonlySet<string> } | null;
15
+ }
16
+
17
+ export interface HierarchyRowMedia {
18
+ detail(adapter: AuthoringAdapter, nodeId: string, store: ShellStore): string | null;
19
+ marks(hierarchy: Pick<HierarchyProvider, 'object3D'>): NodeMarkReader;
20
+ structureLog(store: ShellStore): HierarchyStructureLog | null;
21
+ }
22
+
23
+ let registered: HierarchyRowMedia | null = null;
24
+ const listeners = new Set<() => void>();
25
+
26
+ export function registerHierarchyRowMedia(media: HierarchyRowMedia): () => void {
27
+ registered = media;
28
+ for (const listener of listeners) listener();
29
+ return () => {
30
+ if (registered !== media) return;
31
+ registered = null;
32
+ for (const listener of listeners) listener();
33
+ };
34
+ }
35
+
36
+ export function hierarchyRowMedia(): HierarchyRowMedia | null {
37
+ return registered;
38
+ }
39
+
40
+ export function subscribeHierarchyRowMedia(listener: () => void): () => void {
41
+ listeners.add(listener);
42
+ return () => {
43
+ listeners.delete(listener);
44
+ };
45
+ }