@volter/sdk 0.0.0-stage → 0.5.203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1166 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +317 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +403 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * The panel's half of the hierarchy-presentation convention
3
+ * (`@volter/editor-threejs/adapter/hierarchy-marks`): a game classifies its
4
+ * component-instance roots and its implementation subtrees on the LIVE nodes,
5
+ * and this turns that classification into rows.
6
+ *
7
+ * CLASSIFICATION ONLY — NEVER FABRICATED STRUCTURE. Nothing here invents a
8
+ * parent. Where a node belongs is the TREE's answer, and a world whose tree
9
+ * disagrees with its own ownership is fixed in the world (three's
10
+ * `matrixWorldAutoUpdate = false` keeps a transform-independent object parented
11
+ * where it belongs), not papered over here. What this module decides is
12
+ * narrower and entirely presentational: which rows are the game and which are
13
+ * the implementation underneath it, and — since an implementation node may sit
14
+ * BETWEEN two things that are the game — where a row's nearest visible ancestor
15
+ * is. See {@link componentMarkView} point 5, promotion.
16
+ *
17
+ * WHY THIS IS A DECORATOR AND NOT A SECOND ROW PIPELINE. Exactly the reason
18
+ * `hierarchy-internals.ts` gives for reveal: the panel's cap, collapse, search,
19
+ * selection-reveal and virtualization all layer on ONE flatten of ONE
20
+ * `HierarchyProvider`. A marked tree composes by handing that flattener a
21
+ * richer provider — never by forking the walk. And it composes with reveal
22
+ * specifically by producing an {@link InternalsSource}: built-internals become
23
+ * internals of exactly the kind "Reveal Internals" already shows, so the
24
+ * read-only rule, the search exclusion and the drag refusal that already govern
25
+ * a revealed row govern these with no second policy.
26
+ *
27
+ * THE NO-MARKS FALLBACK IS IDENTITY, BY CONSTRUCTION. Every projection below
28
+ * short-circuits when a node carries no mark and no child carries one, and
29
+ * {@link componentMarkView} returns the source's own `hierarchy` object when the
30
+ * tree cannot carry marks at all (an adapter with no `Object3D` seam — React,
31
+ * Pixi, DOM). A world that adopts nothing renders exactly as it did.
32
+ *
33
+ * PURE ON PURPOSE: the marks arrive through the injected {@link NodeMarkReader},
34
+ * never by importing three or touching `userData` here, so the whole row
35
+ * decision is unit-testable with plain objects.
36
+ */
37
+
38
+ import type { EditorNode, HierarchyProvider } from '@volter/project/adapter';
39
+ import type { InternalsSource } from '@volter/sdk/kit/hierarchy-internals';
40
+ import type { HierarchyNodeRow } from './hierarchy-node-rows';
41
+
42
+ /** What the marks say about ONE node. Both absent is the ordinary node. */
43
+ export interface NodeMarks {
44
+ /** `volterComponentRoot` — the component name this node is one instance of. */
45
+ readonly componentRoot?: string | undefined;
46
+ /** A native authoring entity constructor. It stays an ordinary entity row, but like a
47
+ * component root it is authored content even when a host implementation node wraps it. */
48
+ readonly authoredEntity?: boolean | undefined;
49
+ /** `volterBuiltInternal` — this node is the root of an implementation subtree. */
50
+ readonly builtInternal?: boolean | undefined;
51
+ }
52
+
53
+ /** Reads the marks off one node id. `undefined` for an id the source has no
54
+ * live object for — indistinguishable from an unmarked node, deliberately. */
55
+ export type NodeMarkReader = (id: string) => NodeMarks | undefined;
56
+
57
+ /** The hierarchy half of an adapter, plus whatever internals capability it
58
+ * already had. Structurally satisfied by `AuthoringAdapter` /
59
+ * `CompositeAuthoringAdapter` without importing either — the same contract-only
60
+ * probe shape `hierarchy-internals.ts` and `hierarchy-row-model.ts` use. */
61
+ export interface MarkedTreeSource {
62
+ readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
63
+ readonly hasInternals?: ((id: string) => boolean) | undefined;
64
+ readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
65
+ }
66
+
67
+ export interface MarkedTreeView extends InternalsSource {
68
+ /** True for a node whose live object carries `volterComponentRoot`. */
69
+ isComponentRoot(id: string): boolean;
70
+ /** True for a node that is, or descends from, a `volterBuiltInternal` root.
71
+ * Exposed for tests and for {@link componentMarkView}'s own reuse; the panel
72
+ * reads internal-ness off the reveal projection, which is the union of these
73
+ * and the adapter's own hidden children. */
74
+ isBuiltInternal(id: string): boolean;
75
+ }
76
+
77
+ /** Depth backstop for a pathological live tree — the same belt-and-braces
78
+ * constant `hierarchy-internals.ts`/`hierarchy-node-rows.ts` keep. */
79
+ const MAX_DEPTH = 500;
80
+
81
+ /** The reader for a surface that has no node to read marks off. Identity-checked
82
+ * by {@link componentMarkView}, which is why it is a shared constant rather
83
+ * than a fresh closure per call. */
84
+ export const NO_MARKS: NodeMarkReader = () => undefined;
85
+
86
+ /**
87
+ * Decorate `source` so the marks become rows.
88
+ *
89
+ * Five things change, and nothing else:
90
+ *
91
+ * 1. A marked component root reports `role: 'component'` and
92
+ * `typeLabel: <mark name>`. That is all the panel needs — `rowIdentity`
93
+ * already prints `Coin1 ·Coin` for exactly this pair, and `ROLE_ICON`
94
+ * already has the component glyph. NO new presentation vocabulary: a second
95
+ * way to render "this is an instance" is how two of them drift.
96
+ * The mark REPLACES any `typeLabel` the adapter had, because a three
97
+ * projection reports the native class there (`Object3D`), and
98
+ * `Coin1 ·Object3D` is worse than no suffix at all.
99
+ * 2. Built-internal children disappear from every `childIds`, so what a
100
+ * collapsed tree shows is the game and not its implementation.
101
+ * 3. A built-internal ROOT disappears from `roots()` for the same reason, but
102
+ * meaningful content beneath it is promoted to roots in place. A root has
103
+ * no parent row to reveal it under, so the implementation wrapper itself
104
+ * stays unreachable while spawned content remains visible.
105
+ * 4. Both come back through `internalChildren`/`hasInternals` — unioned with
106
+ * whatever the adapter already hid — so "Reveal Internals" shows them,
107
+ * read-only, under their real parent, in the true chain.
108
+ * 5. PROMOTION. A component instance does not lose its row because
109
+ * implementation nodes sit between it and its owner. A weapon prefab
110
+ * attached to a hand bone, a nameplate on a head bone: content the author
111
+ * placed, inside a subtree a rig builder marked. `volterComponentRoot` beats
112
+ * `volterBuiltInternal` (see `isBuiltInternal`'s climb), and this lists such a
113
+ * row under its nearest VISIBLE ancestor — so a prefab reads as the parent
114
+ * of everything meaningful beneath it, however many bones the rig hangs in
115
+ * between. A subtree with no instance inside it still folds away whole,
116
+ * because there is nothing in it to promote. This is the elision half of the
117
+ * same classification: (2) removes an implementation row, (5) keeps what was
118
+ * under it from going with it.
119
+ *
120
+ * Built-internal is SUBTREE-scoped (see the engine module's header): a node
121
+ * whose ANCESTOR is marked is internal too, which is what lets a rig cost one
122
+ * mark. {@link MarkedTreeView.isBuiltInternal} memoizes that climb, so a
123
+ * repeated walk over the same tree pays once per node.
124
+ */
125
+ export function componentMarkView(
126
+ source: MarkedTreeSource,
127
+ marksOf: NodeMarkReader,
128
+ ): MarkedTreeView {
129
+ if (marksOf === NO_MARKS) {
130
+ // A surface with no `Object3D` seam (React, Pixi, DOM) cannot carry these
131
+ // marks at all. Hand back the source itself so the panel's provider is
132
+ // IDENTICAL, not merely equivalent.
133
+ return {
134
+ hierarchy: source.hierarchy,
135
+ isComponentRoot: () => false,
136
+ isBuiltInternal: () => false,
137
+ ...(source.hasInternals ? { hasInternals: (id: string) => source.hasInternals!(id) } : {}),
138
+ ...(source.internalChildren
139
+ ? { internalChildren: (id: string) => source.internalChildren!(id) }
140
+ : {}),
141
+ };
142
+ }
143
+
144
+ /** id -> "this node is inside a built subtree", memoized across the walk. */
145
+ const internalCache = new Map<string, boolean>();
146
+
147
+ const isBuiltInternal = (id: string): boolean => {
148
+ const cached = internalCache.get(id);
149
+ if (cached !== undefined) return cached;
150
+ // Climb to the first answer we already have (or to a root), then fill the
151
+ // whole chain in one pass — an ancestor walk per node would be O(depth²).
152
+ const chain: string[] = [];
153
+ let cursor: string | null = id;
154
+ let inherited = false;
155
+ let guard = 0;
156
+ while (cursor !== null && guard++ < MAX_DEPTH) {
157
+ const known = internalCache.get(cursor);
158
+ if (known !== undefined) {
159
+ inherited = known;
160
+ break;
161
+ }
162
+ chain.push(cursor);
163
+ // PRECEDENCE: an explicit component root is content even inside an
164
+ // implementation subtree. Otherwise an explicit implementation mark on
165
+ // THIS node wins over the automatic authored-entity stamp: generated
166
+ // native machinery is still source-addressable JSX, but its attach seam
167
+ // knows that it is implementation. An authored entity with no such mark
168
+ // remains content inside an implementation ancestor — a weapon attached
169
+ // to a rig bone, for example — which is what makes promotion (see
170
+ // `visibleChildIds`) reachable at all.
171
+ const marks = marksOf(cursor);
172
+ if (marks?.componentRoot !== undefined) break;
173
+ if (marks?.builtInternal === true) {
174
+ inherited = true;
175
+ break;
176
+ }
177
+ if (marks?.authoredEntity === true) break;
178
+ cursor = source.hierarchy.node(cursor)?.parentId ?? null;
179
+ }
180
+ // `chain` is innermost-first and every entry shares the verdict of the node
181
+ // that stopped the climb — either an already-known ancestor, or the marked
182
+ // node itself (which is the last entry pushed).
183
+ for (const entry of chain) internalCache.set(entry, inherited);
184
+ return inherited;
185
+ };
186
+
187
+ const isComponentRoot = (id: string): boolean => marksOf(id)?.componentRoot !== undefined;
188
+
189
+ /**
190
+ * The rows that belong directly under `node` — its own visible children,
191
+ * plus (point 5) the visible descendants that implementation children stand
192
+ * between. Recursive: an implementation node contributes ITS promoted rows in
193
+ * its own place, so a two-deep chain of them elides just as one does, and a
194
+ * subtree with nothing visible in it contributes nothing at all.
195
+ */
196
+ const visibleChildIds = (node: EditorNode, depth = 0): string[] => {
197
+ if (depth > MAX_DEPTH) return [];
198
+ const out: string[] = [];
199
+ for (const childId of node.childIds) {
200
+ if (!isBuiltInternal(childId)) {
201
+ out.push(childId);
202
+ continue;
203
+ }
204
+ const child = source.hierarchy.node(childId);
205
+ if (child) out.push(...visibleChildIds(child, depth + 1));
206
+ }
207
+ return out;
208
+ };
209
+
210
+ /** The children of `id` this view hides — its DIRECT implementation children,
211
+ * which is what "Reveal Internals" puts back and where the true chain lives. */
212
+ const hiddenChildIds = (node: EditorNode): string[] =>
213
+ node.childIds.filter((childId) => isBuiltInternal(childId));
214
+
215
+ const project = (node: EditorNode | null): EditorNode | null => {
216
+ if (!node) return null;
217
+ const componentRoot = marksOf(node.id)?.componentRoot;
218
+ const childIds = visibleChildIds(node);
219
+ const sameChildren =
220
+ childIds.length === node.childIds.length &&
221
+ childIds.every((childId, index) => childId === node.childIds[index]);
222
+ if (componentRoot === undefined && sameChildren) return node;
223
+ return {
224
+ ...node,
225
+ ...(componentRoot === undefined
226
+ ? {}
227
+ : { role: 'component' as const, typeLabel: componentRoot }),
228
+ ...(sameChildren ? {} : { childIds }),
229
+ };
230
+ };
231
+
232
+ const hierarchy: Pick<HierarchyProvider, 'roots' | 'node'> = {
233
+ roots: () =>
234
+ source.hierarchy.roots().flatMap((root) => {
235
+ if (!isBuiltInternal(root.id)) return [project(root)!];
236
+ return visibleChildIds(root).flatMap((childId) => {
237
+ const child = project(source.hierarchy.node(childId));
238
+ return child ? [{ ...child, parentId: root.parentId }] : [];
239
+ });
240
+ }),
241
+ node: (id) => project(source.hierarchy.node(id)),
242
+ };
243
+
244
+ return {
245
+ hierarchy,
246
+ isComponentRoot,
247
+ isBuiltInternal,
248
+ hasInternals: (id) => {
249
+ if (source.hasInternals?.(id) === true) return true;
250
+ const node = source.hierarchy.node(id);
251
+ return node ? hiddenChildIds(node).length > 0 : false;
252
+ },
253
+ internalChildren: (id) => {
254
+ const own = source.internalChildren?.(id);
255
+ const node = source.hierarchy.node(id);
256
+ const hidden = node
257
+ ? hiddenChildIds(node).flatMap((childId) => {
258
+ // PROJECTED, not raw: this node's own implementation children are
259
+ // hidden from its `childIds` here too, and the reveal walk appends
260
+ // them back itself. Handing back the raw node would list every
261
+ // sub-bone twice. Reveal therefore shows the TRUE chain of
262
+ // implementation nodes — each under its real parent, one level per
263
+ // walk step — which is what the action is for.
264
+ const child = project(source.hierarchy.node(childId));
265
+ // Re-parented to `id` — a revealed subtree is displayed as the tree
266
+ // it literally is, the same rule `internalChildren` states on the
267
+ // source adapter.
268
+ return child ? [{ ...child, parentId: id }] : [];
269
+ })
270
+ : [];
271
+ if (own === undefined) return hidden.length > 0 ? hidden : undefined;
272
+ return [...own, ...hidden];
273
+ },
274
+ };
275
+ }
276
+
277
+ /**
278
+ * A marked component instance opens CLOSED. This is a default, applied on top
279
+ * of `defaultExpansionByNode`'s shape rule and under the author's own session /
280
+ * persisted preference — so "expandable on demand" is the panel's existing
281
+ * expansion state doing its existing job, and an instance the author opened
282
+ * stays open across renders.
283
+ *
284
+ * Takes the already-flattened structural rows rather than walking the tree
285
+ * again: the panel has them, and a second walk over a live graph is the cost
286
+ * this whole cycle exists to remove.
287
+ */
288
+ export function applyComponentRootExpansionDefaults(
289
+ defaults: Map<string, boolean>,
290
+ rows: readonly HierarchyNodeRow[],
291
+ isComponentRoot: (id: string) => boolean,
292
+ ): Map<string, boolean> {
293
+ for (const row of rows) {
294
+ if (row.more) continue;
295
+ if (isComponentRoot(row.node.id)) defaults.set(row.node.id, false);
296
+ }
297
+ return defaults;
298
+ }
@@ -0,0 +1,197 @@
1
+ /**
2
+ * "reveal internals, read-only". Godot's Editable Children, minus the editing.
3
+ *
4
+ * WHAT THIS IS. `R3fSourceAuthoringAdapter.projectedChildren` surfaces only
5
+ * CROSS-BOUNDARY children: an instance's own host nodes and its unstamped model
6
+ * internals (bones, GLTF meshes) are "traversed but not surfaced", so an
7
+ * `<Enemy>` reads as a leaf even though it rendered a 60-bone rig. Everything
8
+ * needed to show that rig already exists — `indexGraph` mints a path-keyed id
9
+ * for every non-helper object and `hierarchy.node(id)` describes it — so this
10
+ * module adds no identity machinery. It adds a VIEW: a decorator over the
11
+ * adapter's `HierarchyProvider` that appends the hidden children of the ids the
12
+ * author revealed, and answers which ids it minted rows for.
13
+ *
14
+ * WHY A DECORATOR AND NOT A NEW FLATTENER. `flattenHierarchyRows` walks
15
+ * `roots()`/`node(id).childIds`; virtualization, the child cap, collapse,
16
+ * selection-reveal and the search filter are all layered on TOP of that one
17
+ * walk. Injecting internals INTO the provider means every one of those keeps
18
+ * working untouched — a revealed skeleton is windowed, capped and collapsed by
19
+ * the same code as everything else, and no second row pipeline exists to drift.
20
+ *
21
+ * WHY THE STATE IS SESSION-ONLY. Reveal is deliberately NOT written to
22
+ * `hierarchy-expansion-state.ts` (which persists per project in localStorage):
23
+ * a skeleton that reappears on every project open is noise in the panel the
24
+ * author needs most, and unlike a normal fold it is not a statement about the
25
+ * authored tree at all — it is a temporary "let me look inside this". It lives
26
+ * in a module-level Set for the life of the tab, cleared on project switch by
27
+ * nothing at all, because ids are project-scoped (`r3f:<worldId>:<oid>`) and a
28
+ * stale id simply never matches.
29
+ *
30
+ * READ-ONLY IS ENFORCED ELSEWHERE, ON PURPOSE: this module only says WHICH rows
31
+ * are internal; `hierarchy-row-model.ts`'s `rowAffordances` is the single
32
+ * predicate that turns that into "no drag, no rename, no write, no search".
33
+ */
34
+
35
+ import type { EditorNode, HierarchyProvider } from '@volter/project/adapter';
36
+
37
+ /** The (optional, structural) adapter capability H6 needs — the same
38
+ * contract-free probe shape H3's `InstanceSourceLocator` and H5's
39
+ * `RowDiagnosticsSource` use, so no adapter is forced to implement it and no
40
+ * editor module imports an R3F type to read it. */
41
+ export interface InternalsSource {
42
+ readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
43
+ /** Cheap "would revealing this row show anything?" — used to decide whether
44
+ * the menu item appears at all. */
45
+ readonly hasInternals?: ((id: string) => boolean) | undefined;
46
+ /** The RAW live children of `id` that the adapter's own projection hides,
47
+ * each described exactly as `hierarchy.node` would describe it, but
48
+ * re-parented to its RAW parent so a revealed subtree reads as the tree it
49
+ * actually is. `undefined` for an id the adapter does not own. */
50
+ readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
51
+ }
52
+
53
+ export interface InternalsProjection {
54
+ /** The provider to flatten. Identity-equal to the source's own when nothing
55
+ * is revealed, so the common case costs nothing. */
56
+ readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
57
+ /** True for a row that exists ONLY because of a reveal. */
58
+ isInternal(id: string): boolean;
59
+ /** The revealed ids that actually produced rows (a revealed id whose object
60
+ * is gone after an HMR remount is silently inert, not an error). */
61
+ readonly revealRootIds: ReadonlySet<string>;
62
+ /** Every id this projection minted a row for, transitively. */
63
+ readonly internalIds: ReadonlySet<string>;
64
+ }
65
+
66
+ /** Depth backstop for a pathological live tree — the same belt-and-braces
67
+ * constant `hierarchy-node-rows.ts` keeps for the same reason. */
68
+ const MAX_DEPTH = 500;
69
+
70
+ const EMPTY: ReadonlySet<string> = new Set();
71
+
72
+ // ------------------------------------------------------------ session state
73
+
74
+ /**
75
+ * Ids whose internals are currently revealed. Module-level and NOT persisted —
76
+ * see this file's header for why a revealed skeleton must not survive a reload.
77
+ */
78
+ const revealed = new Set<string>();
79
+
80
+ export function isInternalsRevealed(id: string): boolean {
81
+ return revealed.has(id);
82
+ }
83
+
84
+ /** Returns the new state, so a caller can report what it did. */
85
+ export function toggleInternalsRevealed(id: string): boolean {
86
+ if (revealed.delete(id)) return false;
87
+ revealed.add(id);
88
+ return true;
89
+ }
90
+
91
+ export function revealedInternalsIds(): ReadonlySet<string> {
92
+ return revealed;
93
+ }
94
+
95
+ /** Test-only reset for the module-level session set. */
96
+ export function __resetRevealedInternalsForTest(): void {
97
+ revealed.clear();
98
+ }
99
+
100
+ // -------------------------------------------------------------- projection
101
+
102
+ /**
103
+ * Build the revealing view of `source.hierarchy`.
104
+ *
105
+ * The walk is EAGER (every revealed subtree is expanded to its leaves up
106
+ * front) rather than lazy inside `node()`, because "is this row internal?" must
107
+ * be answerable in any order — the panel asks it while rendering a row, long
108
+ * after the flatten that produced it, and a lazily-populated set would make the
109
+ * answer depend on call order. It costs one `internalChildren` call per
110
+ * revealed node, which the R3F adapter answers in O(children × depth) with no
111
+ * subtree walk.
112
+ *
113
+ * A revealed node's internals are appended AFTER its projected children, which
114
+ * is what keeps a nested instance's row in its authored place: the flattener
115
+ * dedupes by id on first occurrence, so the instance is emitted as the real
116
+ * child it is, and the internal path that also reaches it is skipped.
117
+ */
118
+ export function internalsProjection(
119
+ source: InternalsSource,
120
+ revealedIds: ReadonlySet<string> = revealed,
121
+ ): InternalsProjection {
122
+ // Called THROUGH `source` below, never as a detached reference: every real
123
+ // implementer is a class method that needs its own `this`.
124
+ if (typeof source.internalChildren !== 'function' || revealedIds.size === 0) {
125
+ return {
126
+ hierarchy: source.hierarchy,
127
+ isInternal: () => false,
128
+ revealRootIds: EMPTY,
129
+ internalIds: EMPTY,
130
+ };
131
+ }
132
+
133
+ /** id -> the internal child ids appended to it. */
134
+ const appended = new Map<string, string[]>();
135
+ /** id -> the node an internal row renders (never re-asked of the adapter,
136
+ * whose own `node()` would answer with the PROJECTED parent). */
137
+ const internalNodes = new Map<string, EditorNode>();
138
+ const revealRootIds = new Set<string>();
139
+
140
+ const walk = (id: string, depth: number): void => {
141
+ if (depth > MAX_DEPTH || appended.has(id)) return;
142
+ const children = source.internalChildren!(id) ?? [];
143
+ if (children.length === 0) return;
144
+ appended.set(
145
+ id,
146
+ children.map((child) => child.id),
147
+ );
148
+ for (const child of children) {
149
+ if (internalNodes.has(child.id)) continue;
150
+ internalNodes.set(child.id, child);
151
+ walk(child.id, depth + 1);
152
+ }
153
+ };
154
+
155
+ for (const id of revealedIds) {
156
+ walk(id, 0);
157
+ if (appended.has(id)) revealRootIds.add(id);
158
+ }
159
+
160
+ const decorate = (node: EditorNode | null): EditorNode | null => {
161
+ if (!node) return null;
162
+ const extra = appended.get(node.id);
163
+ return extra ? { ...node, childIds: [...node.childIds, ...extra] } : node;
164
+ };
165
+
166
+ return {
167
+ hierarchy: {
168
+ roots: () => source.hierarchy.roots().map((root) => decorate(root)!),
169
+ node: (id) => decorate(internalNodes.get(id) ?? source.hierarchy.node(id)),
170
+ },
171
+ isInternal: (id) => internalNodes.has(id),
172
+ revealRootIds,
173
+ internalIds: new Set(internalNodes.keys()),
174
+ };
175
+ }
176
+
177
+ /**
178
+ * H6's first-open policy, applied ON TOP of the panel's own
179
+ * `defaultExpansionByNode` result: **the reveal root's direct children are
180
+ * visible, everything deeper starts folded.**
181
+ *
182
+ * Two overrides express exactly that. The revealed row itself opens (otherwise
183
+ * "Reveal Internals" would appear to do nothing on an instance that happened to
184
+ * be folded), and every internal row starts closed — a rig is 60 rows deep and
185
+ * dumping all of it into the panel is the opposite of the "look inside this one
186
+ * thing" the action is for. Both are DEFAULTS: an explicit fold the author
187
+ * performs afterwards still wins, because the panel consults session and
188
+ * persisted preferences before this map.
189
+ */
190
+ export function applyRevealExpansionDefaults(
191
+ defaults: Map<string, boolean>,
192
+ projection: Pick<InternalsProjection, 'revealRootIds' | 'internalIds'>,
193
+ ): Map<string, boolean> {
194
+ for (const id of projection.internalIds) defaults.set(id, false);
195
+ for (const id of projection.revealRootIds) defaults.set(id, true);
196
+ return defaults;
197
+ }