@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,135 @@
1
+ /**
2
+ * H3 wiring — the instance row's two source actions, registered through the
3
+ * hierarchy contribution seam.
4
+ *
5
+ * This is the "adapter-module registration" half of the split
6
+ * `hierarchy-menu-registry.ts` describes: `GameHierarchy` stays contract-only
7
+ * and never learns that an R3F world has a callsite; THIS module is the one
8
+ * allowed to resolve the owning child adapter and probe it for source
9
+ * accessors. The sentences and the applicability rule are pure and live in
10
+ * `../instance-source-actions.ts`.
11
+ *
12
+ * ISOLATE IS DELIBERATELY ABSENT — see {@link enterInstanceRow}. The design
13
+ * record's "double-click = Isolate, reusing the catalog nodes' existing Isolate
14
+ * mount" is not reachable from a scene instance row, and faking it was
15
+ * explicitly out of scope.
16
+ */
17
+
18
+ import type { AuthoringAdapter } from '@volter/project/adapter';
19
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
20
+ import { registerHierarchyMenuItems } from '@volter/sdk/kit/hierarchy-menu-registry';
21
+ import {
22
+ INSTANCE_SOURCE_LABELS,
23
+ type InstanceSourceLocator,
24
+ type InstanceSourceTarget,
25
+ instanceSourceTargets,
26
+ runInstanceSourceAction,
27
+ } from '@volter/sdk/kit/instance-source-actions';
28
+ import { showTransientHint } from '@volter/sdk/kit/transient-hint';
29
+ import { getActiveAuthoring } from '@volter/sdk/kit/authoring/active-adapter';
30
+ import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
31
+ import { enterSelectionScope } from '@volter/sdk/kit/authoring/selection-scope';
32
+
33
+ /**
34
+ * The adapter whose source accessors answer for `nodeId`. Ownership is asked
35
+ * of the composite (`ownerOf`/`childAdapters`, the same public T0 query
36
+ * `GameHierarchy`'s own gates use) rather than decoded from the id — a
37
+ * composite's routers would otherwise answer for a row their owning child
38
+ * knows nothing about.
39
+ */
40
+ export function instanceSourceLocatorFor(
41
+ adapter: AuthoringAdapter,
42
+ nodeId: string,
43
+ ): InstanceSourceLocator | null {
44
+ const owner =
45
+ adapter instanceof CompositeAuthoringAdapter
46
+ ? (adapter.childAdapters().find((c) => c.worldId === adapter.ownerOf(nodeId))?.adapter ??
47
+ adapter)
48
+ : adapter;
49
+ const locator = owner as unknown as InstanceSourceLocator;
50
+ return typeof locator.sourceLocation === 'function' ||
51
+ typeof locator.definitionLocation === 'function'
52
+ ? locator
53
+ : null;
54
+ }
55
+
56
+ /** Run one target and SAY what happened — every path returns a sentence
57
+ * (copied / not in the index / clipboard refused), so no click is silent. */
58
+ function runAndReport(
59
+ locator: InstanceSourceLocator | null,
60
+ nodeId: string,
61
+ target: InstanceSourceTarget,
62
+ ): void {
63
+ void runInstanceSourceAction(locator, nodeId, target).then(showTransientHint);
64
+ }
65
+
66
+ /**
67
+ * Double-click on an instance row.
68
+ *
69
+ * An instance row is already the native authoring subject; portable CSF
70
+ * selects complete design-time states and does not provide a second subtree
71
+ * isolation protocol. Double-click therefore ENTERS the instance's scope and
72
+ * falls back to its callsite when the row cannot be entered.
73
+ *
74
+ * That fallback is the COMMON case, not the corner one: `projectedChildren`
75
+ * collapses everything an instance rendered itself (same `authoringInstance`),
76
+ * so an instance row has children only when it contains a NESTED instance.
77
+ * Every other instance row is a hierarchy leaf, `enterSelectionScope` refuses
78
+ * it for having no children, and until now that double-click did nothing at
79
+ * all — the silent no-op this whole decision exists to kill.
80
+ *
81
+ * Rename is NOT in conflict: `Row`'s `onDoubleClick` already routes every
82
+ * `component`/`instance`/`boundary` row here BEFORE its rename branch, so an
83
+ * instance row has never started a rename on double-click; rename stays
84
+ * reachable on the context menu, where it is always offered for a non-group row.
85
+ */
86
+ export function enterInstanceRow(adapter: AuthoringAdapter, nodeId: string): void {
87
+ if (enterSelectionScope(adapter, nodeId)) return;
88
+ runCallsite(adapter, nodeId);
89
+ }
90
+
91
+ function runCallsite(adapter: AuthoringAdapter, nodeId: string): void {
92
+ const node = adapter.hierarchy.node(nodeId);
93
+ const locator = instanceSourceLocatorFor(adapter, nodeId);
94
+ // Only a row that ADVERTISES a callsite falls through to the source action —
95
+ // a boundary/placeholder row with nothing to open keeps double-clicking to
96
+ // nothing, exactly as before, rather than raising a hint the user did not ask
97
+ // for by picking a source verb.
98
+ if (!instanceSourceTargets(node, locator, nodeId).includes('callsite')) return;
99
+ runAndReport(locator, nodeId, 'callsite');
100
+ }
101
+
102
+ let unregister: (() => void) | null = null;
103
+
104
+ /** Idempotent install of the two H3 items (see the register module). */
105
+ export function ensureInstanceSourceMenuRegistered(): void {
106
+ if (unregister) return;
107
+ unregister = registerHierarchyMenuItems(
108
+ ({ nodeId, store }) => targetsFor(store, nodeId).length > 0,
109
+ ({ nodeId, store }) => {
110
+ const adapter = getActiveAuthoring(store);
111
+ const locator = instanceSourceLocatorFor(adapter, nodeId);
112
+ return targetsFor(store, nodeId).map((target) => ({
113
+ label: INSTANCE_SOURCE_LABELS[target],
114
+ action: () => {
115
+ runAndReport(locator, nodeId, target);
116
+ },
117
+ }));
118
+ },
119
+ );
120
+ }
121
+
122
+ function targetsFor(store: ShellStore, nodeId: string): InstanceSourceTarget[] {
123
+ const adapter = getActiveAuthoring(store);
124
+ return instanceSourceTargets(
125
+ adapter.hierarchy.node(nodeId),
126
+ instanceSourceLocatorFor(adapter, nodeId),
127
+ nodeId,
128
+ );
129
+ }
130
+
131
+ /** Test-only: drop the registration so a suite can reset the shared registry. */
132
+ export function __unregisterInstanceSourceMenuForTest(): void {
133
+ unregister?.();
134
+ unregister = null;
135
+ }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Layered viewport picking (B4, D12) — "click anything you can see; topmost
3
+ * visible layer wins." Shell POLICY over the composite's public seams, kept a
4
+ * separate module (rather than living inline in `editor-viewport.ts`) so it
5
+ * stays lean AND unit-testable with plain fake adapters — no real DOM/canvas
6
+ * needed.
7
+ *
8
+ * This module speaks ONLY the public contract: `CompositeAuthoringAdapter
9
+ * .childAdapters()` (T0), the `AuthoringAdapter.pickable` provider (D12,
10
+ * `@volter/project/adapter`), and `world-session-state.ts`'s session toggles. It never
11
+ * reaches into any one child adapter's own private, format-specific model (no
12
+ * concrete-world-shape vocabulary of any kind here) — `instanceof
13
+ * CompositeAuthoringAdapter` is the ONE sanctioned type check (that class's
14
+ * own doc comment blesses exactly this use, mirroring
15
+ * `authoring/first-party-inspector/is-first-party-selection.ts`'s identical
16
+ * precedent).
17
+ *
18
+ * Walk order: the composite's NON-threejs children (react/pixi design-time
19
+ * layers), topmost-first by (install-time) manifest zOrder — `stackOrder`
20
+ * sorts bottom-to-top, so `.reverse()` gives topmost-first while preserving
21
+ * its own tie-break rule. The Three world is appended LAST
22
+ * (canvas-bottom) regardless of its manifest zOrder — it always renders
23
+ * beneath every positioned design-time layer (`design-time-layers.ts`'s own
24
+ * doc comment: "the three canvas keeps its existing slot"), so it is
25
+ * correct for it to lose every pick to a layer that also claims the point.
26
+ *
27
+ * A layer that is eye-hidden or pick-locked (`world-session-state.ts`, B1) is
28
+ * skipped ENTIRELY — its `pickable.pick` is never even called. This is a
29
+ * SEPARATE mechanism from a layer's `interactive` toggle: an interactive
30
+ * layer's DOM has `pointer-events: auto`, so a real pointer event lands on the
31
+ * layer's own element and this walk (triggered only by the CANVAS's own
32
+ * `pointerup` listener) never runs at all for that event — mutually exclusive
33
+ * by construction, no code needed here for it.
34
+ *
35
+ * When the active adapter is NOT a composite (single-world project, or a
36
+ * non-composite override), this degrades to that one adapter's own
37
+ * `pickable.pick` (or `null` if it doesn't have one) — today's single-world
38
+ * behavior, unchanged.
39
+ */
40
+
41
+ import type { AuthoringAdapter } from '@volter/project/adapter';
42
+ import { stackOrder } from '@volter/project/adapter/root-stacking';
43
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
44
+ import { SCENE_DOCUMENT_ID } from '@volter/sdk/kit/workspace-document-ids';
45
+ import { activeWorkspaceDocumentId } from '@volter/sdk/kit/workspace-document-registry';
46
+ import { getActiveAuthoring } from './active-adapter';
47
+ import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
48
+ import { currentSelectionScopeId } from '@volter/sdk/kit/authoring/selection-scope';
49
+ import { isRootHidden, isRootPickLocked } from '@volter/sdk/kit/authoring/world-session-state';
50
+
51
+ export function resolveAdapterPick(
52
+ adapter: AuthoringAdapter,
53
+ clientX: number,
54
+ clientY: number,
55
+ intent: 'normal' | 'deep',
56
+ ): string | null {
57
+ const raw = adapter.pickable?.pick(clientX, clientY) ?? null;
58
+ if (!raw) return null;
59
+ return (
60
+ adapter.selection?.resolve?.(raw, {
61
+ intent,
62
+ scopeId: currentSelectionScopeId(),
63
+ })?.id ?? raw
64
+ );
65
+ }
66
+
67
+ function resolveAdapterCandidates(
68
+ adapter: AuthoringAdapter,
69
+ clientX: number,
70
+ clientY: number,
71
+ intent: 'normal' | 'deep',
72
+ includeLocked = false,
73
+ ): string[] {
74
+ const raw = adapter.pickable?.candidates?.(clientX, clientY, includeLocked ? { includeLocked } : undefined) ?? [];
75
+ const resolved: string[] = [];
76
+ const seen = new Set<string>();
77
+ for (const id of raw) {
78
+ const candidate =
79
+ adapter.selection?.resolve?.(id, {
80
+ intent,
81
+ scopeId: currentSelectionScopeId(),
82
+ })?.id ?? id;
83
+ if (!seen.has(candidate)) {
84
+ seen.add(candidate);
85
+ resolved.push(candidate);
86
+ }
87
+ }
88
+ return resolved;
89
+ }
90
+
91
+ /** Topmost-first pick across every visible, pick-unlocked layer of the active
92
+ * (possibly composite) authoring adapter. Returns the winning node id, or
93
+ * `null` when nothing under `(clientX, clientY)` claims the point. */
94
+ export function pickTopmost(
95
+ store: ShellStore,
96
+ clientX: number,
97
+ clientY: number,
98
+ options: { intent?: 'normal' | 'deep' } = {},
99
+ ): string | null {
100
+ const intent = options.intent ?? 'normal';
101
+ const active = getActiveAuthoring(store);
102
+ if (!(active instanceof CompositeAuthoringAdapter)) {
103
+ return resolveAdapterPick(active, clientX, clientY, intent);
104
+ }
105
+
106
+ const children = active.childAdapters();
107
+ // The Game document stays mounted warm while Scene is active. Its DOM rects
108
+ // therefore still exist even though it is not painted. Document ownership,
109
+ // not mount lifetime, decides which layers may claim the pointer.
110
+ const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
111
+ const layered = sceneDocumentActive ? [] : children.filter((c) => c.kind !== 'three');
112
+ const three = children.filter((c) => c.kind === 'three');
113
+
114
+ // `stackOrder` wants `{id, zOrder}` (`ClaimEntry`) — reuse `worldId` as its
115
+ // `id` (this walk has no separate id vocabulary of its own).
116
+ const layeredClaims = layered.map((c) => ({
117
+ id: c.worldId,
118
+ zOrder: c.zOrder,
119
+ worldId: c.worldId,
120
+ adapter: c.adapter,
121
+ }));
122
+
123
+ // Topmost-first: `stackOrder` is bottom-to-top (ascending zOrder, ties by
124
+ // original array order) — `.reverse()` flips it without disturbing its own
125
+ // tie-break rule (a later-declared same-zOrder layer still wins the tie,
126
+ // now by being checked FIRST instead of sorting last).
127
+ const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
128
+ ...stackOrder(layeredClaims).reverse(),
129
+ // The Three world paints/picks LAST — canvas-bottom, regardless
130
+ // of its own manifest zOrder (see module doc comment).
131
+ ...three,
132
+ ];
133
+
134
+ for (const { worldId, adapter } of order) {
135
+ if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
136
+ const hit = resolveAdapterPick(adapter, clientX, clientY, intent);
137
+ if (hit) return hit;
138
+ }
139
+ return null;
140
+ }
141
+
142
+ /** Ordered overlap stack across the same visible layers as {@link pickTopmost}. */
143
+ export function pickCandidates(
144
+ store: ShellStore,
145
+ clientX: number,
146
+ clientY: number,
147
+ options: { intent?: 'normal' | 'deep'; adapter?: AuthoringAdapter; includeLocked?: boolean } = {},
148
+ ): string[] {
149
+ const intent = options.intent ?? 'normal';
150
+ const includeLocked = options.includeLocked === true;
151
+ const active = options.adapter ?? getActiveAuthoring(store);
152
+ if (!(active instanceof CompositeAuthoringAdapter)) {
153
+ const candidates = resolveAdapterCandidates(active, clientX, clientY, intent, includeLocked);
154
+ const fallback = resolveAdapterPick(active, clientX, clientY, intent);
155
+ return candidates.length > 0 ? candidates : fallback ? [fallback] : [];
156
+ }
157
+
158
+ const children = active.childAdapters();
159
+ const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
160
+ const layered = sceneDocumentActive ? [] : children.filter((child) => child.kind !== 'three');
161
+ const three = children.filter((child) => child.kind === 'three');
162
+ const layeredClaims = layered.map((child) => ({
163
+ id: child.worldId,
164
+ zOrder: child.zOrder,
165
+ worldId: child.worldId,
166
+ adapter: child.adapter,
167
+ }));
168
+ const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
169
+ ...stackOrder(layeredClaims).reverse(),
170
+ ...three,
171
+ ];
172
+ const result: string[] = [];
173
+ const seen = new Set<string>();
174
+ for (const { worldId, adapter } of order) {
175
+ if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
176
+ const candidates = resolveAdapterCandidates(adapter, clientX, clientY, intent, includeLocked);
177
+ const fallback = resolveAdapterPick(adapter, clientX, clientY, intent);
178
+ for (const id of candidates.length > 0 ? candidates : fallback ? [fallback] : []) {
179
+ if (seen.has(id)) continue;
180
+ seen.add(id);
181
+ result.push(id);
182
+ }
183
+ }
184
+ return result;
185
+ }
@@ -0,0 +1,146 @@
1
+ /**
2
+ * WHICH ROOTS THE ACTIVE AUTHORING SURFACE PRESENTS LIVE — the host's own
3
+ * answer to "what is mounted, and through which adapter".
4
+ *
5
+ * It lived in `coverage/root-coverage.ts` because the per-root coverage report
6
+ * was its first reader, and it stayed there long after a second one appeared.
7
+ * It is not a grade: the vitals' `presented three roots` invariant ("a scene
8
+ * has one root", `coverage/ontology-invariants.ts`) asks it, the Hierarchy and
9
+ * the gizmo work over exactly these subjects, and a host with no game skew
10
+ * loaded still has every one of them. So it is the authoring seam's, beside
11
+ * `active-adapter.ts` whose override it reads — and the coverage report that
12
+ * grades these subjects can leave the host without taking the question with
13
+ * it.
14
+ */
15
+
16
+ import type { AuthoringAdapter } from '@volter/project/adapter';
17
+ import type { AdapterSurface } from '@volter/project/adapter/adapter-surface';
18
+ import { liveSurface } from '@volter/sdk/kit/live-session-registry';
19
+ import { projectAdapterFacet } from '../project-adapter';
20
+ import {
21
+ activeWorkspaceDocument,
22
+ activeWorkspaceDocumentSelection,
23
+ } from '@volter/sdk/kit/workspace-document-registry';
24
+ import { getAuthoringOverride } from '@volter/sdk/kit/authoring/active-adapter';
25
+ import { CompositeAuthoringAdapter } from '@volter/sdk/kit/authoring/composite-authoring-adapter';
26
+ import { emptyProjectAuthoring } from '@volter/sdk/kit/authoring/empty-project-authoring';
27
+
28
+ /** One mounted root, as this module needs to see it. Structural on purpose: the
29
+ * composite hands these over, and a test can build one by hand. */
30
+ export interface MountedRootSubject {
31
+ readonly worldId: string;
32
+ readonly surface: AdapterSurface | null;
33
+ readonly adapter: AuthoringAdapter;
34
+ }
35
+
36
+ const SURFACE_KINDS: readonly string[] = ['three', 'canvas', 'dom'];
37
+
38
+ /**
39
+ * A root that DECLARES it has no live editing surface here — the disclosure
40
+ * adapter (`AuthoringProvenance.source === 'boundary'`) a manifest-declared
41
+ * world wears while its real mount is still assembling, or after that mount was
42
+ * suspended or failed.
43
+ *
44
+ * It is NOT a coverage subject. Grading a disclosure against the provider
45
+ * contract prints "this root exposes no <provider> provider" fourteen times
46
+ * about a surface that does not exist yet — a snapshot that is false the moment
47
+ * it is taken and, because the console sync forwards warnings to the server's
48
+ * unresolved ledger, then stands there forever beside the real post-mount
49
+ * report.
50
+ *
51
+ * MEASURED on a canvas ingest: opening the project installs the edit-mode
52
+ * composite with a Boundary child for the ingest root
53
+ * (`authoring/edit-mode-authoring.ts`), and the mount then spends SECONDS
54
+ * awaiting the Game document, the capture window — a budget of VISIBLE time,
55
+ * 8s by default, which PARKS while the tab is hidden
56
+ * (`ingest/capture-wait-report.ts`) — and the stage settle, before
57
+ * `setActiveAuthoring` swaps the live adapter in
58
+ * (`ingest/mount-canvas-ingest-root.ts`). The vitals sampler runs every 5s
59
+ * (`coverage/session-vitals.ts`), so an ordinary reload lands inside that
60
+ * window and files "16 of 30 seams are MISSING" against a session that reports
61
+ * zero editor gaps seconds later.
62
+ *
63
+ * The stand-down is principled rather than timed: no debounce, no delay, no
64
+ * game id. Provenance is the adapter's OWN statement of what its rows project
65
+ * (rule zero — the shell reads the field, it never infers truth from adapter
66
+ * identity), and "declared world with no live editing surface here" is the
67
+ * adapter saying the mount has not attached. Coverage over an unattached mount
68
+ * is not a measurement.
69
+ *
70
+ * A root that mounted and honestly publishes nothing is the OPPOSITE case and
71
+ * stays a subject: `authoring/no-authoring-adapter.ts` declares no provenance
72
+ * at all, because "this root has no authoring surface" is a real, standing
73
+ * capability gap that the report exists to keep loud.
74
+ */
75
+ function isBoundaryDisclosure(adapter: AuthoringAdapter): boolean {
76
+ return adapter.provenance?.source === 'boundary';
77
+ }
78
+
79
+ /** The composite's `kind` string as a surface, or `null` when it is not one of
80
+ * the three the host hands out — in which case NOTHING is excused (see
81
+ * `CapabilityCoverageFacts.surface`). */
82
+ function asSurface(kind: string): AdapterSurface | null {
83
+ return SURFACE_KINDS.includes(kind) ? (kind as AdapterSurface) : null;
84
+ }
85
+
86
+ /**
87
+ * Every root the active authoring surface presents LIVE, or `[]` when nothing is
88
+ * mounted.
89
+ *
90
+ * A composite lists its children; a bare adapter IS the one root. `role:
91
+ * 'surface'` children are skipped: they are adapter-owned content INSIDE a
92
+ * root (a nested board, a scene-UI seam), not roots the manifest declared, and
93
+ * grading them against the full contract would invent gaps for things that were
94
+ * never meant to be roots. {@link isBoundaryDisclosure} children are skipped for
95
+ * the sibling reason: they are worlds the editor has DISCLOSED, not mounted.
96
+ */
97
+ export function mountedRootSubjects(): readonly MountedRootSubject[] {
98
+ // An isolation document is a real Edit mount owned by one declared region,
99
+ // even though it deliberately does not replace the composition-wide active
100
+ // adapter. Its workspace binding is the same adapter Hierarchy, Inspector,
101
+ // and writes use; its descriptor carries the owning root. Measure that pair
102
+ // first so coverage describes the surface the author is actually editing.
103
+ const documentSelection = activeWorkspaceDocumentSelection();
104
+ const documentRootId = activeWorkspaceDocument()?.descriptor.provenance?.rootId;
105
+ const documentRegion = documentRootId
106
+ ? projectAdapterFacet()?.regions.find((region) => region.id === documentRootId)
107
+ : undefined;
108
+ const documentSubject =
109
+ documentSelection?.adapter && documentRootId && documentRegion
110
+ ? {
111
+ worldId: documentRootId,
112
+ surface: documentRegion.surface,
113
+ adapter: documentSelection.adapter,
114
+ }
115
+ : null;
116
+ const active = getAuthoringOverride();
117
+ if (!active) return documentSubject ? [documentSubject] : [];
118
+ if (active instanceof CompositeAuthoringAdapter) {
119
+ const subjects = active
120
+ .childAdapters()
121
+ .filter((child) => child.role === 'world' && !isBoundaryDisclosure(child.adapter))
122
+ .map((child) => ({
123
+ worldId: child.worldId,
124
+ surface: asSurface(child.kind),
125
+ adapter: child.adapter,
126
+ }));
127
+ if (!documentSubject) return subjects;
128
+ return [documentSubject, ...subjects.filter((subject) => subject.worldId !== documentRootId)];
129
+ }
130
+ // A project that declares no roots wears a placeholder that says so; nothing is mounted.
131
+ if (isBoundaryDisclosure(active) || active === emptyProjectAuthoring()) return documentSubject ? [documentSubject] : [];
132
+ // A bare (non-composite) active adapter still HAS a surface — a live ingest
133
+ // session states its render substrate outright, and `IngestKind` and
134
+ // `AdapterSurface` are the same three words by construction. Leaving this
135
+ // `null` reported the canvas N-A trio (assetSubject/text/colorSample) as
136
+ // gaps on every bare canvas mount, while the surface-aware ingest door
137
+ // called the same three rows `na` — two doors disagreeing about one mount.
138
+ // No live ingest ⇒ `null` stays, and nothing is excused (the deliberate
139
+ // cheap-direction-to-be-wrong).
140
+ const activeSubject = {
141
+ worldId: 'root',
142
+ surface: liveSurface(),
143
+ adapter: active,
144
+ };
145
+ return documentSubject ? [documentSubject, activeSubject] : [activeSubject];
146
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * NoAuthoringAdapter — what the editor can honestly offer over a mounted root
3
+ * that exposes no authoring surface at all.
4
+ *
5
+ * A `{ module }` adapter is free to publish nothing authorable: it mounts, it
6
+ * draws, and the host has no tree to bind the hierarchy/inspector/gizmo to.
7
+ * Rather than hide that root, or fabricate a surface for it, this adapter
8
+ * advertises exactly what is true — one informational hierarchy node and all
9
+ * `capabilities` false — so the editor's generic panels render an honest
10
+ * nothing-to-author state instead of pretending to edit.
11
+ */
12
+
13
+ import type {
14
+ AuthoringAdapter,
15
+ AuthoringCapabilities,
16
+ EditorNode,
17
+ HierarchyProvider,
18
+ } from '@volter/project/adapter';
19
+ import type { ShellDocumentState } from '@volter/sdk/kit/shell-document-state';
20
+
21
+ /** The one hierarchy row this adapter publishes. Exported because it is a
22
+ * MESSAGE, not an entity: a surface that lists entities (the command palette)
23
+ * has to be able to tell it apart from a thing a person can select. */
24
+ export const NO_AUTHORING_ID = 'no-authoring:root';
25
+
26
+ export function makeNoAuthoringAdapter(
27
+ store: ShellDocumentState,
28
+ label: string,
29
+ secondaryLabel = 'No authoring surface',
30
+ ): AuthoringAdapter {
31
+ const node: EditorNode = {
32
+ id: NO_AUTHORING_ID,
33
+ label,
34
+ secondaryLabel,
35
+ role: 'boundary',
36
+ kind: 'object',
37
+ parentId: null,
38
+ childIds: [],
39
+ };
40
+ const hierarchy: HierarchyProvider = {
41
+ roots: () => [node],
42
+ node: (id) => (id === NO_AUTHORING_ID ? node : null),
43
+ // No `object3D`/`idForObject3D`: there is no reachable Object3D to offer.
44
+ };
45
+ const capabilities: AuthoringCapabilities = {
46
+ transform: false,
47
+ inspectorFields: false,
48
+ persist: false,
49
+ };
50
+ return {
51
+ capabilities,
52
+ hierarchy,
53
+ selection: {
54
+ get: () => [...store.selectedEntityIds],
55
+ set: (ids) => store.selectMultiple(ids),
56
+ },
57
+ subscribe: (listener) => store.subscribe(listener),
58
+ };
59
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Generic Asset Lab persistence. Project code serializes its own native
3
+ * document into ordinary files; this host-side bridge owns transaction
4
+ * ordering, checksum preflight, compensation, and canonical undo/redo.
5
+ */
6
+
7
+ import type { HistoryService } from '@volter/sdk/kit/history/history-service';
8
+ import {
9
+ getProjectFileHistory,
10
+ type HistoryFileBackend,
11
+ type ProjectFileMutation,
12
+ type ProjectFileMutationSession,
13
+ } from '../history/project-file-history';
14
+ import { getProjectResourceHistoryBackend } from '../history/project-root-history-backends';
15
+ import { runWritePipe, type WriteAck, type WriteResolution } from '@volter/sdk/kit/write-pipe';
16
+
17
+ /** One project-owned artifact participating in an Asset Lab commit. The document is whatever the
18
+ * medium hands its serializers (Three's is `ToolObject3DDocumentState`). */
19
+ export interface DocumentPersistenceResource<TDocument> {
20
+ /** Project-root-relative destination. */
21
+ readonly path: string;
22
+ /** MIME type recorded in canonical history. */
23
+ readonly contentType?: string;
24
+ /** `null` removes the file in the same atomic transaction. */
25
+ readonly serialize: (
26
+ document: TDocument,
27
+ ) => string | Uint8Array | null | Promise<string | Uint8Array | null>;
28
+ }
29
+
30
+ export interface DocumentPersistenceBinding<TDocument> {
31
+ /** Default undo/redo label. A completed gesture may supply a narrower one. */
32
+ readonly label?: string;
33
+ /** Non-empty, path-unique set of files owned by this document. */
34
+ readonly resources: readonly DocumentPersistenceResource<TDocument>[];
35
+ }
36
+
37
+ export interface OpenObject3DDocumentPersistenceOptions<TDocument = unknown> {
38
+ readonly binding: DocumentPersistenceBinding<TDocument>;
39
+ readonly document: TDocument;
40
+ readonly history: HistoryService;
41
+ readonly backend?: HistoryFileBackend;
42
+ }
43
+
44
+ async function serializeObject3DDocument<TDocument>(
45
+ binding: DocumentPersistenceBinding<TDocument>,
46
+ document: TDocument,
47
+ ): Promise<ProjectFileMutation[]> {
48
+ if (binding.resources.length === 0) {
49
+ throw new Error('An Object3D document persistence binding must own at least one resource.');
50
+ }
51
+ const changes: ProjectFileMutation[] = [];
52
+ for (const resource of binding.resources) {
53
+ changes.push({
54
+ path: resource.path,
55
+ data: await resource.serialize(document),
56
+ contentType: resource.contentType ?? 'application/octet-stream',
57
+ });
58
+ }
59
+ return changes;
60
+ }
61
+
62
+ export interface Object3DDocumentPersistenceSession<TDocument = unknown> {
63
+ /** Commit through the one persistence pipe, and answer for THIS commit.
64
+ * `persisted: false` means the serializers produced the bytes already on
65
+ * disk and nothing moved — a real outcome, not a failure (a failure throws). */
66
+ commit(document: TDocument, label?: string): Promise<WriteAck>;
67
+ }
68
+
69
+ /** Where an Asset Lab document's bytes go — the binding's own resource paths,
70
+ * which is the finest-grained honest answer this lane has. */
71
+ function destinationOf<TDocument>(binding: DocumentPersistenceBinding<TDocument>): string {
72
+ return binding.resources.map((resource) => resource.path).join(' + ');
73
+ }
74
+
75
+ /**
76
+ * Establish the exact serialized bytes represented by a newly mounted native
77
+ * document. Every later commit is checked against that mount-time baseline,
78
+ * so a stale HMR module can never overwrite a newer sidecar on disk.
79
+ */
80
+ export async function openObject3DDocumentPersistence<TDocument>(
81
+ options: OpenObject3DDocumentPersistenceOptions<TDocument>,
82
+ ): Promise<Object3DDocumentPersistenceSession<TDocument>> {
83
+ const { binding, document, history } = options;
84
+ const files = getProjectFileHistory(
85
+ history,
86
+ options.backend ?? getProjectResourceHistoryBackend(),
87
+ 'asset-lab-document',
88
+ );
89
+ const session: ProjectFileMutationSession = await files.openMutationSession(
90
+ await serializeObject3DDocument(binding, document),
91
+ );
92
+ return {
93
+ // THE ONE PIPE, this lane's plug: resolve (a binding with resources is a
94
+ // real destination) → write (serialize + the file-mutation transaction) →
95
+ // record (that transaction IS the history entry, so nothing more).
96
+ commit: (nextDocument, requestedLabel) =>
97
+ runWritePipe({
98
+ resolve: (): WriteResolution => ({
99
+ reaches: 'writer',
100
+ // The document's own file is the anchor: no source literal addresses
101
+ // it, and project code serializes the record the editor edited.
102
+ anchorKind: 'data-record',
103
+ destination: destinationOf(binding),
104
+ write: async () => {
105
+ // Check the mount-time bytes BEFORE entering project code. HMR can
106
+ // invalidate a serializer's module-local state; a newer file must
107
+ // still receive the canonical content-conflict refusal, never that
108
+ // incidental serializer error and never an overwrite.
109
+ await session.assertUnchanged();
110
+ // Serialize before entering history: a failing project serializer
111
+ // writes nothing and cannot advance the open-document checksum
112
+ // baseline.
113
+ const changes = await serializeObject3DDocument(binding, nextDocument);
114
+ const label =
115
+ requestedLabel?.trim() || binding.label?.trim() || 'Edit Asset Lab Document';
116
+ return session.mutate(changes, { label });
117
+ },
118
+ }),
119
+ record: () => undefined,
120
+ }),
121
+ };
122
+ }