@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,276 @@
1
+ import {
2
+ adapterEditorConfiguration,
3
+ subscribeAdapterEditorConfiguration,
4
+ } from '@volter/sdk/kit/adapter-editor-config';
5
+ import { effectiveSettings, subscribeSettings } from '@volter/sdk/kit/settings-store';
6
+ /**
7
+ * WHICH CHROME REGIONS ARE SHOWN right now — the one store the two document
8
+ * regions (`DocumentHeaderStrip`, `DocumentShelfRail`), the title bar's own
9
+ * strips and the inspector's presentation resolver read.
10
+ *
11
+ * WHAT IS NOT A KEY HERE: how the workbench names an open document. Editor
12
+ * tabs, their strip and its presentation are the frame's, and a workspace that
13
+ * declared them would be declaring something it cannot draw.
14
+ *
15
+ * Workspace and user style choices, with project adapter defaults:
16
+ * resolved[key] = workspace.regions[key] ?? adapter default ?? preset.regions[key] ?? default
17
+ * - the WORKSPACE layer is what the active workspace declares
18
+ * (`workspace-presets.ts`, `EditorWorkspaceRegions`) — Look hides every
19
+ * region and stays minimal under any preset;
20
+ * - the PRESET layer is what a style bundle asked for (`workspace-style.ts`,
21
+ * the fourth axis beside palette, material and composition), persisted
22
+ * like the other three so the bundle survives a reload.
23
+ * A host with no workspaces and no bundles (a bounded host) never
24
+ * writes either, so every region stays shown and the page pays for this
25
+ * file alone. Same shape as every module-scope store here: value + version
26
+ * + subscribe.
27
+ */
28
+ export interface ChromeRegions {
29
+ /** The workspace tab strip in the top bar (`ProjectHeader`); absent = hidden. */
30
+ readonly workspaceTabs?: 'shown' | 'hidden';
31
+ readonly header?: 'shown' | 'hidden';
32
+ readonly shelf?: 'shown' | 'hidden';
33
+ /** How the docked inspector lays its sections out — stacked (`column`) or
34
+ * tabbed behind a vertical rail (`properties`). Read by the presentation
35
+ * resolver (`inspector-presentation.ts`) beneath the user's own override. */
36
+ readonly inspector?: 'column' | 'properties' | 'card';
37
+ /** The bottom utility DRAWER (analytics, console, history…). Hidden means
38
+ * a workspace never shows it — not on a switch, not when play settles;
39
+ * Blender's modeling workspace has no timeline strip. */
40
+ readonly drawer?: 'shown' | 'hidden';
41
+ /** The top bar's runtime TELEMETRY cluster (`HeaderTelemetry`: the frame
42
+ * readout, its sparkline, the audio meter). A LOOK knob, not a product
43
+ * one — Invite and Account stay whatever this says, being identity rather
44
+ * than appearance, and the Profiler utility remains the door to the same
45
+ * numbers (the readout's own tooltip says so). Absent means shown, so
46
+ * every skin that predates this key is pixel-identical. */
47
+ readonly telemetry?: 'shown' | 'hidden';
48
+ /** The `·TypeName` a component-instance row prints after its name
49
+ * (`GameHierarchy.tsx`'s `hierarchy-instance-type`). A LOOK knob: measured
50
+ * on `outliner.png`, every Blender row carries its NAME ALONE — the type is
51
+ * the glyph, which is the whole reason the glyph is coloured by category.
52
+ *
53
+ * Hiding it costs one VISIBLE fact, and only on rows where the name and the
54
+ * type differ (`EnemyBravo ·Enemy`). Where they agree it costs nothing, and
55
+ * that is every row of the starter template — the label IS the instance's
56
+ * `name` prop, which authors write as the component's own name (`Hero Box
57
+ * ·HeroBox`, `Ground ·Ground`). The row keeps the fact reachable when
58
+ * hidden: the label's own `title` carries the sentence, the inspector shows
59
+ * the component's sections, and the override `*` moves onto the NAME rather
60
+ * than leaving with the suffix it used to ride. Absent means shown, so
61
+ * every skin that predates this key is pixel-identical. */
62
+ readonly hierarchyTypeSuffix?: 'shown' | 'hidden';
63
+ /** The dotted RULE a component-instance row draws under its name
64
+ * (`semantic.instance`; the owner's 2026-07-31 ruling that instance identity
65
+ * is carried by a rule rather than by recolored text). A LOOK knob, the same
66
+ * kind as {@link ChromeRegions.hierarchyTypeSuffix} and measured the same
67
+ * way: `modeling-object-none.png` and `modeling-object-selected.png` carry
68
+ * NO rule, dotted or solid, under any Outliner name in any selection state —
69
+ * Blender marks an instance nowhere in that panel.
70
+ *
71
+ * Hiding it costs the row's instance HINT, not the fact: the label's own
72
+ * `title`, the row's Go to Callsite / Open Component Source actions and the
73
+ * inspector's component sections all still say it. Absent means shown, so
74
+ * every skin that predates this key is pixel-identical.
75
+ *
76
+ * Note the SEPARATE, older mechanism it sits above:
77
+ * `--volter-tree-active-name-underline` (`theme.ts`) drops the rule on the
78
+ * SELECTED row alone, and only for a palette that declares an active ink,
79
+ * so two marks never argue on one row. That one is the palette's; this one
80
+ * is the look's, and where a look hides the rule outright the palette rule
81
+ * never gets a say. */
82
+ readonly hierarchyInstanceRule?: 'shown' | 'hidden';
83
+ /**
84
+ * WHICH RESTRICTION COLUMNS an Outliner row carries at its right edge —
85
+ * Blender's own filter, whose default decides the same thing there.
86
+ *
87
+ * - `select+viewport` — this editor's own pair: a selection LOCK and the
88
+ * eye, packed against the row's right margin.
89
+ * - `viewport+render` — Blender's default filter. Measured on
90
+ * `outliner.png`: every object row carries exactly two marks, an eye at
91
+ * x 515-541 device (CSS ink 257.5-270.5, 32 px in from the area's own
92
+ * right edge) and a render camera at 555-581 (277.5-290.5, 12 px in);
93
+ * a 20 px column pitch, and NO lock glyph anywhere in the frame,
94
+ * Blender's Disable Selection column being off by default.
95
+ *
96
+ * The RENDER column is declared and left BLANK, deliberately. three.js has
97
+ * one `Object3D.visible` governing viewport and render alike, so a second
98
+ * toggle would write nothing and fail "a control is accepted through its own
99
+ * click" — but Blender's columns are positions, and drawing our one eye in
100
+ * the outer slot would put it in the render column and align it with
101
+ * neither. Reserving the slot puts the eye exactly where Blender's eye is.
102
+ * A skew whose adapter really does separate the two fills the column in;
103
+ * nothing else changes.
104
+ *
105
+ * Absent means `select+viewport`, so every skin that predates this key is
106
+ * pixel-identical.
107
+ */
108
+ readonly hierarchyRestrictions?: 'select+viewport' | 'viewport+render';
109
+ }
110
+
111
+ /**
112
+ * EVERY REGION AND ITS DEFAULT, stated once.
113
+ *
114
+ * Three things read this — the merge, the snapshot key, and the absolute write
115
+ * a bundle makes — and before 2026-09-18 each spelled the key list and its
116
+ * default out by hand, so a seventh region meant editing the same table three
117
+ * times and the merge tripped the complexity lint on the way.
118
+ *
119
+ * A NEW REGION IS FIVE EDITS, not the one this comment used to claim, and the
120
+ * last two are the ones that bite: this table, its member on {@link
121
+ * ChromeRegions}, the same member on `@volter/sdk`'s
122
+ * `WorkspaceArrangement['regions']` (which a contributed bundle is typed
123
+ * against), `@volter/project`'s `ChromeRegionsSettingsSchema`, which is
124
+ * `.strict()`, and the FRAME's own configuration contribution
125
+ * (`node scripts/workbench/generate-settings.mjs --write`, which rewrites
126
+ * `packages/editor-core/workbench/src/volterGeneratedSettings.ts` from the JSON
127
+ * Schema).
128
+ *
129
+ * Miss the fourth and NOTHING fails to compile: a region value the person sets is
130
+ * written into `~/.volter/settings.json`, the server rejects the unknown key with a 400, and the only report is a `[settings] Could not save
131
+ * user settings` line in the editor console — every appearance preference
132
+ * silently stops persisting. Measured 2026-09-18, found by the editor's `console` command
133
+ * after nine failed writes.
134
+ *
135
+ * Miss the FIFTH and the frame drops the key on the way through instead: the
136
+ * workbench's configuration service knows only the generated list, so
137
+ * `volterSettings.ts` reports "…is not a volter setting, so it was not applied" and
138
+ * the region reverts to its default on the next read of persisted settings.
139
+ * Measured 2026-09-21 by the editor's `console` command on the first boot after a new key
140
+ * landed, which is the reason this list says five now.
141
+ *
142
+ * AND THE FIFTH HAS A RELEASE IN IT, which is the part that decides where a
143
+ * look's value belongs. The generated artifact is built INTO a Code-OSS
144
+ * release, so a running release cut before the key reports it and ignores it
145
+ * until the next cut — a region is not a value a look can add and use in the
146
+ * same session. A look value that the STAGE reads (the transform gizmo's
147
+ * screen size, which tool its shelf opens on) therefore rides the THEME
148
+ * instead, as the material's `stage` emitted onto the theme root by the page
149
+ * itself: it crosses nothing (`@volter/sdk/looks`'
150
+ * `StageContribution`, `native-selection-style.ts`'s readers).
151
+ * A region stays a region — what CHROME is shown is genuinely a persisted
152
+ * preference a person can also set.
153
+ *
154
+ * Run `npm run generate-schema` with the schema edit, then the settings
155
+ * generator.
156
+ */
157
+ const REGION_DEFAULTS = {
158
+ workspaceTabs: 'hidden',
159
+ header: 'shown',
160
+ shelf: 'shown',
161
+ inspector: 'column',
162
+ drawer: 'shown',
163
+ telemetry: 'shown',
164
+ hierarchyTypeSuffix: 'shown',
165
+ hierarchyInstanceRule: 'shown',
166
+ hierarchyRestrictions: 'select+viewport',
167
+ } as const satisfies Required<ChromeRegions>;
168
+
169
+ const REGION_KEYS = Object.keys(REGION_DEFAULTS) as ReadonlyArray<keyof ChromeRegions>;
170
+
171
+ /** The regions whose values are not the `shown`/`hidden` pair, for
172
+ * {@link isRegions}. A key absent here takes that pair. */
173
+ const REGION_VALUES: Partial<Record<keyof ChromeRegions, readonly string[]>> = {
174
+ inspector: ['column', 'properties', 'card'],
175
+ hierarchyRestrictions: ['select+viewport', 'viewport+render'],
176
+ };
177
+
178
+ function isRegions(value: unknown): value is ChromeRegions {
179
+ if (!value || typeof value !== 'object') return false;
180
+ const record = value as Record<string, unknown>;
181
+ for (const key of Object.keys(record)) {
182
+ if (!(REGION_KEYS as readonly string[]).includes(key)) return false;
183
+ const allowed = REGION_VALUES[key as keyof ChromeRegions] ?? ['shown', 'hidden'];
184
+ if (!allowed.includes(record[key] as string)) return false;
185
+ }
186
+ return true;
187
+ }
188
+
189
+ /** The person's own region choices, in the settings layers as `appearance.regions`
190
+ * (`settings-store.ts`). A style never writes them: which regions exist is function, a
191
+ * workspace's and the person's (ARCHITECTURE.md rule 7). */
192
+ function readPersistedPreset(): ChromeRegions {
193
+ const stored: unknown = effectiveSettings().appearance?.regions;
194
+ return isRegions(stored) ? stored : {};
195
+ }
196
+
197
+ let _workspace: ChromeRegions = {};
198
+ let _preset: ChromeRegions = readPersistedPreset();
199
+ let _version = 0;
200
+ const _listeners = new Set<() => void>();
201
+
202
+ function resolved(key: keyof ChromeRegions): string | undefined {
203
+ // `inspector` alone has a THIRD layer between the workspace and the preset:
204
+ // the project adapter's own declaration (`adapter-editor-config.ts`).
205
+ if (key === 'inspector')
206
+ return _workspace.inspector ?? adapterEditorConfiguration().inspector ?? _preset.inspector;
207
+ return _workspace[key] ?? _preset[key];
208
+ }
209
+
210
+ function merged(): ChromeRegions {
211
+ const next: Record<string, string> = {};
212
+ for (const key of REGION_KEYS) {
213
+ const value = resolved(key);
214
+ if (value) next[key] = value;
215
+ }
216
+ return next as ChromeRegions;
217
+ }
218
+
219
+ let _merged: ChromeRegions = merged();
220
+
221
+ export function activeChromeRegions(): ChromeRegions {
222
+ return _merged;
223
+ }
224
+
225
+ /** A stable string, because `useSyncExternalStore` compares snapshots by
226
+ * identity and a fresh object would loop. */
227
+ export function chromeRegionsKey(): string {
228
+ return regionsKey(_merged);
229
+ }
230
+
231
+ export function regionsKey(regions: ChromeRegions): string {
232
+ return REGION_KEYS.map((key) => `${key}:${regions[key] ?? REGION_DEFAULTS[key]}`).join(' ');
233
+ }
234
+
235
+ function publish(): void {
236
+ const before = chromeRegionsKey();
237
+ _merged = merged();
238
+ if (chromeRegionsKey() === before) return;
239
+ _version += 1;
240
+ for (const listener of _listeners) listener();
241
+ }
242
+
243
+ /** The active workspace's declaration (`workspace-presets.ts`). */
244
+ export function setWorkspaceRegions(regions: ChromeRegions): void {
245
+ _workspace = regions;
246
+ publish();
247
+ }
248
+
249
+
250
+ // A settings load or a project's own override changes the preset underneath.
251
+ function syncPreset(): void {
252
+ const next = readPersistedPreset();
253
+ if (regionsKey(next) === regionsKey(_preset)) return;
254
+ _preset = next;
255
+ publish();
256
+ }
257
+
258
+ subscribeSettings(syncPreset);
259
+
260
+ subscribeAdapterEditorConfiguration(publish);
261
+
262
+ export function subscribeChromeRegions(listener: () => void): () => void {
263
+ _listeners.add(listener);
264
+ return () => _listeners.delete(listener);
265
+ }
266
+
267
+ export function chromeRegionsVersion(): number {
268
+ return _version;
269
+ }
270
+
271
+ export function __resetChromeRegionsForTest(): void {
272
+ _workspace = {};
273
+ _preset = {};
274
+ _merged = {};
275
+ _version = 0;
276
+ }
@@ -0,0 +1,73 @@
1
+ import type { EditorRegionName, WorkspacePanelGlyphName } from '@volter/sdk/widgets';
2
+
3
+ /** Stable, geometry-free inventory of the editor's built-in persistent panels.
4
+ *
5
+ * `region` is a panel's claim on an EDITOR-AREA fill (`EditorTheme.color.region`
6
+ * carries the measurement): the dock paints the group showing this panel with
7
+ * that region's colour instead of the one fill every group shares. A panel
8
+ * that claims none is painted exactly as before the claim existed, which is
9
+ * every panel no reference frame shows painted differently.
10
+ *
11
+ * `icon` is the panel's own glyph, drawn in Blender's EDITOR-TYPE WELL — the
12
+ * 32x20 box every area begins with under `groupTabs: 'well'`
13
+ * (`workspace-regions.ts`). The NAME is declared here and the drawing lives
14
+ * in the editor's icon registry (`components/primitives/editor-icons.ts`), which also records which two of these are
15
+ * Blender's own measured marks and which five are ours because no reference
16
+ * frame photographs that editor. The field is optional so a host may add a
17
+ * panel without one; every panel below declares one, so the well's
18
+ * glyph-less branch does not fire in this editor. */
19
+ export const WORKSPACE_STATIC_PANELS = [
20
+ {
21
+ kind: 'agent',
22
+ title: 'Conversations',
23
+ hotkeyScope: 'workspace',
24
+ selectableText: true,
25
+ icon: 'users',
26
+ },
27
+ {
28
+ kind: 'project-work',
29
+ title: 'Project work',
30
+ hotkeyScope: 'workspace',
31
+ selectableText: true,
32
+ icon: 'list',
33
+ },
34
+ {
35
+ kind: 'hierarchy',
36
+ title: 'Hierarchy',
37
+ hotkeyScope: 'hierarchy',
38
+ selectableText: false,
39
+ region: 'outliner',
40
+ icon: 'outliner',
41
+ },
42
+ {
43
+ kind: 'assets',
44
+ title: 'Content',
45
+ hotkeyScope: 'asset-browser',
46
+ selectableText: false,
47
+ icon: 'folder-open',
48
+ },
49
+ {
50
+ kind: 'asset-library',
51
+ title: 'Asset Library',
52
+ hotkeyScope: 'asset-browser',
53
+ selectableText: false,
54
+ icon: 'cubes-stacked',
55
+ },
56
+ {
57
+ kind: 'inspector',
58
+ title: 'Inspector',
59
+ hotkeyScope: 'inspector',
60
+ selectableText: false,
61
+ region: 'properties',
62
+ icon: 'properties',
63
+ },
64
+ ] as const satisfies ReadonlyArray<{
65
+ readonly kind: string;
66
+ readonly title: string;
67
+ readonly hotkeyScope: string;
68
+ readonly selectableText: boolean;
69
+ readonly region?: EditorRegionName;
70
+ readonly icon?: WorkspacePanelGlyphName;
71
+ }>;
72
+
73
+ export type WorkspaceStaticPanelKind = (typeof WORKSPACE_STATIC_PANELS)[number]['kind'];
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Workspace STATUS-CONTRIBUTION registry (W0 — the shell-contract slice of
3
+ * §9 W0). "Status is status, not a command" (§1.5): save/dirty/failure
4
+ * state, problem counts, connection/play state, build progress, and concise
5
+ * selection information belong in a narrow status bar — not mixed into the
6
+ * global command header and not spread across viewport overlays.
7
+ *
8
+ * Consumed since W4 by `components/StatusBar.tsx` (rendered under the
9
+ * bottom dock/drawer strip); the core contributions live in
10
+ * `components/status-contributions.tsx` (+ `build-documents.tsx`'s
11
+ * `build-progress`). Migration map.
12
+ *
13
+ * Idioms mirror `inspector-section-registry.ts`: module-scope state,
14
+ * `useSyncExternalStore`-shaped subscribe + monotonic version,
15
+ * `__resetForTest`, pure-logic headless tests (`Content` is never rendered
16
+ * here). Ids key persisted/status-bar slots, so duplicates throw (same rule
17
+ * as `workspace-utility-registry.ts`).
18
+ */
19
+
20
+ import type { ComponentType } from 'react';
21
+
22
+ /** The §7 status contribution contract: one compact status-bar item. */
23
+ export interface WorkspaceStatusContribution {
24
+ /** Stable id — keys the status-bar slot (`data-testid`). */
25
+ readonly id: string;
26
+ /**
27
+ * WHAT A PERSON CALLS IT. Required, because the status bar this draws into
28
+ * is the workbench's and `IStatusbarEntry.name` is required there: it is the
29
+ * label in the bar's own right-click menu (`Hide <item>`) and the entry's
30
+ * aria label. Before it existed every contribution passed its raw id, so the
31
+ * menu read `tool:blender.status`, `console-counts`, `play-state` beside VS
32
+ * Code's own `Remote Host` and `Problems` (walk 4, 2026-09-20).
33
+ *
34
+ * Title Case, and a NOUN — it names the thing, not what it is doing right
35
+ * now: the CONTENT changes, this does not.
36
+ */
37
+ readonly name: string;
38
+ /** Which end of the bar (§4.1: session state left, selection info right).
39
+ * Default `'left'`. */
40
+ readonly align?: 'left' | 'right';
41
+ /** Slot order within its side (ascending; ties keep registration order).
42
+ * Default `0`. */
43
+ readonly order?: number;
44
+ /** React content host — compact, passive, non-command (§1.5). Never
45
+ * rendered by the registry itself. */
46
+ readonly Content: ComponentType;
47
+ }
48
+
49
+ // --- Module-scope state (mirrors inspector-section-registry.ts) -----------
50
+
51
+ interface StoredContribution {
52
+ readonly contribution: WorkspaceStatusContribution;
53
+ readonly seq: number;
54
+ }
55
+
56
+ let _contributions: StoredContribution[] = [];
57
+ let _seq = 0;
58
+ let _version = 0;
59
+ const _listeners = new Set<() => void>();
60
+
61
+ function notifyChanged(): void {
62
+ _version++;
63
+ for (const fn of _listeners) fn();
64
+ }
65
+
66
+ /** Subscribe to (un)registrations. Returns an unsubscribe function. */
67
+ export function subscribeWorkspaceStatus(fn: () => void): () => void {
68
+ _listeners.add(fn);
69
+ return () => {
70
+ _listeners.delete(fn);
71
+ };
72
+ }
73
+
74
+ /** Monotonic change counter — the `getSnapshot` for `useSyncExternalStore`. */
75
+ export function workspaceStatusRegistryVersion(): number {
76
+ return _version;
77
+ }
78
+
79
+ /**
80
+ * Register a status contribution. Returns an unregister function.
81
+ * Throws on a duplicate id (ids key status-bar slots — same uniqueness rule
82
+ * as `registerWorkspaceUtility`).
83
+ */
84
+ export function registerWorkspaceStatus(contribution: WorkspaceStatusContribution): () => void {
85
+ if (_contributions.some((c) => c.contribution.id === contribution.id)) {
86
+ throw new Error(
87
+ `registerWorkspaceStatus: id "${contribution.id}" is already registered — ` +
88
+ 'status ids key status-bar slots, so they must be unique; unregister the ' +
89
+ 'previous contribution first.',
90
+ );
91
+ }
92
+ const stored: StoredContribution = { contribution, seq: _seq++ };
93
+ _contributions = [..._contributions, stored];
94
+ notifyChanged();
95
+ return () => {
96
+ if (!_contributions.includes(stored)) return;
97
+ _contributions = _contributions.filter((c) => c !== stored);
98
+ notifyChanged();
99
+ };
100
+ }
101
+
102
+ /** Registered contributions for one side of the bar, in (order,
103
+ * registration-sequence) order; with no argument, both sides (left first). */
104
+ export function workspaceStatusContributions(
105
+ align?: 'left' | 'right',
106
+ ): WorkspaceStatusContribution[] {
107
+ const side = (want: 'left' | 'right') =>
108
+ [..._contributions]
109
+ .filter((c) => (c.contribution.align ?? 'left') === want)
110
+ .sort((a, b) => (a.contribution.order ?? 0) - (b.contribution.order ?? 0) || a.seq - b.seq)
111
+ .map((c) => c.contribution);
112
+ if (align) return side(align);
113
+ return [...side('left'), ...side('right')];
114
+ }
115
+
116
+ /** Test-only reset (mirrors `__resetInspectorSectionRegistryForTest`). */
117
+ export function __resetWorkspaceStatusRegistryForTest(): void {
118
+ _contributions = [];
119
+ _seq = 0;
120
+ notifyChanged();
121
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * THE WORKBENCH'S WORKSPACE STORAGE, as the frame hands it over at mount: Code-OSS's own
3
+ * `IStorageService` at `StorageScope.WORKSPACE`, which the web workbench keeps in the project's
4
+ * folder (`.volter/workbench-storage.json`, the fork's `workspaceStorageUrl`). A host without the
5
+ * frame installs none, and the project-local layer keeps its own file.
6
+ */
7
+ export interface WorkspaceStorageProvider {
8
+ get(key: string): string | undefined;
9
+ /** `undefined` removes the key. */
10
+ store(key: string, value: string | undefined): void;
11
+ /** Resolves once every change the workbench holds (its own layout included) has reached the
12
+ * project's folder. The session's end waits on it: the server stops listening moments after
13
+ * the page acknowledges, so a write left for the page's unload never lands. */
14
+ flush(): Promise<void>;
15
+ }
16
+
17
+ let provider: WorkspaceStorageProvider | null = null;
18
+ const listeners = new Set<() => void>();
19
+
20
+ export function setWorkspaceStorageProvider(next: WorkspaceStorageProvider | null): void {
21
+ provider = next;
22
+ for (const listener of listeners) listener();
23
+ }
24
+
25
+ export function workspaceStorageProvider(): WorkspaceStorageProvider | null {
26
+ return provider;
27
+ }
28
+
29
+ /** Fires when the provider is installed or removed. */
30
+ export function onWorkspaceStorageProvider(listener: () => void): () => void {
31
+ listeners.add(listener);
32
+ return () => {
33
+ listeners.delete(listener);
34
+ };
35
+ }