@volter/sdk 0.0.0-stage → 0.5.204

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1168 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +329 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +669 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * IS THIS REJECTION A CANCELLATION? — the one predicate, shared by the two
3
+ * page-level `unhandledrejection` listeners this editor installs
4
+ * (`editor-presence.ts`'s boot reporter and `editor-console.ts`'s
5
+ * session-lifetime capture).
6
+ *
7
+ * ## Why this is not "exempting a source"
8
+ *
9
+ * The recorded doctrine at `installEditorConsoleCapture` is that SEVERITY
10
+ * decides what reaches the ledger and never SOURCE, "because exempting a
11
+ * source would teach the gate to find less". This is not that. A cancellation
12
+ * is not a low-severity error, it is the platform's word for *an operation
13
+ * that was asked to stop and did* — the same judgement the workbench makes
14
+ * about its own (`onUnexpectedError` returns early on `isCancellationError`)
15
+ * and the same one the Fetch and Streams specs make (`AbortError`). It is
16
+ * applied identically to OUR rejections and to anyone else's: a volter fetch
17
+ * abandoned because the document moved on is exactly as much of a non-event.
18
+ *
19
+ * ## What made it necessary
20
+ *
21
+ * MEASURED 2026-09-19, the Code-OSS frame's blind walk, beat 9: a
22
+ * `--template game` scaffold reported
23
+ * `[runtime] editor app failed to start: Canceled: Canceled` while its editor
24
+ * was running fine. Under the frame the page is a WORKBENCH, and a workbench
25
+ * raises `CancellationError` (`name === 'Canceled'`) whenever a quick input is
26
+ * dismissed or a search is superseded — none of which any page-level listener
27
+ * can attribute, because a rejection carries no author. The ledger spans two
28
+ * codebases there (docs/CODE-OSS.md, "The console ledger now spans two
29
+ * codebases"), and this is the one class of line that can be ruled on without
30
+ * asking WHOSE it is.
31
+ *
32
+ * ## Its own file, deliberately
33
+ *
34
+ * `editor-presence.ts` is the pre-React bootstrap module and is
35
+ * dependency-light on purpose (its own comments say so); importing the console
36
+ * from it would pull the console's whole closure into the page's first script.
37
+ * A five-line predicate copied into both is the duplication this codebase
38
+ * treats as a defect, so it is one module with no imports of its own.
39
+ */
40
+
41
+ /**
42
+ * True when a rejection reason means "this was cancelled", by any of the three
43
+ * spellings in play on our page:
44
+ *
45
+ * - VS Code's `CancellationError`, whose constructor sets
46
+ * `name = message = 'Canceled'`;
47
+ * - the platform's `AbortError` — a `DOMException` from `AbortSignal`, and
48
+ * what `fetch` rejects with when its signal fires;
49
+ * - the older `AbortError` shape any library may throw as a plain `Error`.
50
+ *
51
+ * Deliberately NOT a message match: a message is prose and drifts, while these
52
+ * names are contract.
53
+ */
54
+ export function isCancellationReason(reason: unknown): boolean {
55
+ if (typeof reason !== 'object' || reason === null) return false;
56
+ const name = (reason as { name?: unknown }).name;
57
+ return name === 'Canceled' || name === 'CancellationError' || name === 'AbortError';
58
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * A CANVAS'S SAME-FRAME PIXELS, answered by the medium that draws into it. A
3
+ * canvas a medium renders without `preserveDrawingBuffer` photographs blank if
4
+ * it is read after its frame, so the kit's compositor asks here instead of
5
+ * reading such a canvas directly. Two doors: the canvases a live surface is
6
+ * presenting now, and the canvases a mount the kit is about to photograph
7
+ * creates (a story's own `<Application>`). With no medium registered the kit
8
+ * reads every canvas directly.
9
+ */
10
+ export type CanvasFrame = (canvas: HTMLCanvasElement) => Promise<CanvasImageSource | null>;
11
+
12
+ let sources: readonly CanvasFrame[] = [];
13
+
14
+ /** A medium's reader for the canvases its live surfaces present; it answers
15
+ * `null` for a canvas it does not own. Returns the removal. */
16
+ export function registerCanvasFrameSource(source: CanvasFrame): () => void {
17
+ sources = [...sources, source];
18
+ return () => {
19
+ sources = sources.filter((existing) => existing !== source);
20
+ };
21
+ }
22
+
23
+ /** The first registered source's pixels for `canvas`, or null when none owns it. */
24
+ export async function presentedCanvasFrame(canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> {
25
+ for (const source of sources) {
26
+ const frame = await source(canvas);
27
+ if (frame) return frame;
28
+ }
29
+ return null;
30
+ }
31
+
32
+ /** What a medium learned while a mount ran: when its surfaces have drawn their
33
+ * first frame, and how to read their canvases. */
34
+ export interface ObservedCanvasMount<T> {
35
+ readonly result: T;
36
+ settled(): Promise<void>;
37
+ readonly frame: CanvasFrame;
38
+ }
39
+
40
+ export interface CanvasMountObserver {
41
+ observe<T>(task: () => Promise<T>): Promise<ObservedCanvasMount<T>>;
42
+ }
43
+
44
+ let observer: CanvasMountObserver | null = null;
45
+
46
+ /** The one medium that observes mounts for canvases it creates. Returns the removal. */
47
+ export function registerCanvasMountObserver(next: CanvasMountObserver): () => void {
48
+ observer = next;
49
+ return () => {
50
+ if (observer === next) observer = null;
51
+ };
52
+ }
53
+
54
+ /** Run a mount under the registered observer, or plainly when none is. */
55
+ export async function observeCanvasMount<T>(task: () => Promise<T>): Promise<ObservedCanvasMount<T>> {
56
+ if (observer) return observer.observe(task);
57
+ return { result: await task(), settled: async () => {}, frame: async () => null };
58
+ }
59
+
60
+ /** A medium's re-render of a canvas it owns at a requested size, for a caller
61
+ * that photographs at its own scale (the editor chrome); `null` when the
62
+ * canvas is not its. */
63
+ export type CanvasRender = (
64
+ canvas: HTMLCanvasElement,
65
+ size: { readonly width: number; readonly height: number },
66
+ ) => Promise<CanvasImageSource | null> | null;
67
+
68
+ let renders: readonly CanvasRender[] = [];
69
+
70
+ export function registerCanvasRender(render: CanvasRender): () => void {
71
+ renders = [...renders, render];
72
+ return () => {
73
+ renders = renders.filter((existing) => existing !== render);
74
+ };
75
+ }
76
+
77
+ /** The first registered medium's rendering of `canvas` at `size`, or null. */
78
+ export async function renderedCanvasFrame(
79
+ canvas: HTMLCanvasElement,
80
+ size: { readonly width: number; readonly height: number },
81
+ ): Promise<CanvasImageSource | null> {
82
+ for (const render of renders) {
83
+ const pending = render(canvas, size);
84
+ if (pending === null) continue;
85
+ return pending;
86
+ }
87
+ return null;
88
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * THE FREE CAPTURE CAMERA AND CLIP POSE, validated at the relay boundary —
3
+ * `--azimuth/--elevation/--distance` and `--clip/--time` as they arrive on a
4
+ * capture command.
5
+ *
6
+ * Extracted from `command-listener.ts:1016,1053`, where both parsers were
7
+ * private to that module and already served TWO verbs:
8
+ * `capture-asset-preview`, which stays in that table, and
9
+ * `capture-story-variants`, which carries its own relay budget and so is a
10
+ * registered command (`stories/story-capture-command.ts`). Two callers before
11
+ * the move and two after; nothing here is new.
12
+ *
13
+ * THE VERB NAMES ITSELF. Both refusals used to spell `capture-asset-preview`
14
+ * unconditionally, so a bad `--azimuth` on the editor's `screenshot <module>.stories.tsx` command
15
+ * refused in the name of a command the caller never ran. The verb is a
16
+ * parameter now, which the extraction is what made visible.
17
+ */
18
+
19
+ /** Validate an untrusted `camera` payload: the parsed choice, `undefined` when
20
+ * absent, or the refusal message naming `verb`. */
21
+ export function parseCameraChoice(
22
+ verb: string,
23
+ value: unknown,
24
+ ): { azimuthDegrees: number; elevationDegrees: number; distance?: number } | undefined | string {
25
+ if (value === undefined) return undefined;
26
+ const record = value as {
27
+ azimuthDegrees?: unknown;
28
+ elevationDegrees?: unknown;
29
+ distance?: unknown;
30
+ } | null;
31
+ if (
32
+ record === null ||
33
+ typeof record !== 'object' ||
34
+ typeof record.azimuthDegrees !== 'number' ||
35
+ !Number.isFinite(record.azimuthDegrees) ||
36
+ typeof record.elevationDegrees !== 'number' ||
37
+ !Number.isFinite(record.elevationDegrees) ||
38
+ record.elevationDegrees < -90 ||
39
+ record.elevationDegrees > 90 ||
40
+ (record.distance !== undefined &&
41
+ (typeof record.distance !== 'number' ||
42
+ !Number.isFinite(record.distance) ||
43
+ record.distance <= 0))
44
+ ) {
45
+ return (
46
+ `${verb} camera must be {azimuthDegrees, elevationDegrees in [-90, 90], ` +
47
+ 'distance? > 0 meters}.'
48
+ );
49
+ }
50
+ return {
51
+ azimuthDegrees: record.azimuthDegrees,
52
+ elevationDegrees: record.elevationDegrees,
53
+ ...(record.distance === undefined ? {} : { distance: record.distance }),
54
+ };
55
+ }
56
+
57
+ /** Validate an untrusted `pose` payload: the parsed pose, `undefined` when
58
+ * absent, or the refusal message naming `verb`. */
59
+ export function parsePoseChoice(
60
+ verb: string,
61
+ value: unknown,
62
+ ): { clip: string; timeSeconds: number } | undefined | string {
63
+ if (value === undefined) return undefined;
64
+ const record = value as { clip?: unknown; timeSeconds?: unknown } | null;
65
+ if (
66
+ record === null ||
67
+ typeof record !== 'object' ||
68
+ typeof record.clip !== 'string' ||
69
+ record.clip.length === 0 ||
70
+ typeof record.timeSeconds !== 'number' ||
71
+ !Number.isFinite(record.timeSeconds) ||
72
+ record.timeSeconds < 0
73
+ ) {
74
+ return `${verb} pose must be {clip: non-empty string, timeSeconds >= 0}.`;
75
+ }
76
+ return { clip: record.clip, timeSeconds: record.timeSeconds };
77
+ }
@@ -0,0 +1,88 @@
1
+ import type { CaptureDimensions } from '@volter/sdk';
2
+
3
+ /**
4
+ * The dimensions a capture verb was asked for, or the refusal that names the
5
+ * value it was handed.
6
+ *
7
+ * SQUARE IS THE DEFAULT and `size` is how you ask for one. `width`+`height`
8
+ * together ask for a SHAPED frame — a video-aspect look that needs no crop
9
+ * afterwards — and are bounded per side and in TOTAL by the same relay budget
10
+ * the square ceiling comes from. Mixing the two forms is refused rather than
11
+ * silently resolved: a caller who sent both does not know which one they meant.
12
+ *
13
+ * `cmd` is WIRE INPUT — a JSON object from another process — so `cmd['size']`
14
+ * had never been anything but a cast (`as number | undefined`). A caller that
15
+ * sent a non-number got that value multiplied by 2 deep inside
16
+ * `_renderViewportImage` and `createImageData(NaN, NaN)` threw
17
+ * `TypeError: Value is not of type 'long'` from the middle of the render path;
18
+ * because the dispatcher's `.then()` had no rejection leg, the throw answered
19
+ * nobody and the caller waited out its whole budget for
20
+ * "the tab is present … and did not respond" — a message about the TAB for a
21
+ * defect in the argument. Measured on a racing-game ingest mount, 2026-08-15.
22
+ */
23
+ export function captureSizeFromCommand(
24
+ cmd: Readonly<Record<string, unknown>>,
25
+ ): { size?: CaptureDimensions } | { error: string } {
26
+ const raw = cmd['size'];
27
+ const rawWidth = cmd['width'];
28
+ const rawHeight = cmd['height'];
29
+ const shaped = rawWidth !== undefined || rawHeight !== undefined;
30
+ if (shaped) {
31
+ if (raw !== undefined && raw !== null) {
32
+ return {
33
+ error:
34
+ `${String(cmd['type'])}: pass "size" (a square) OR "width"+"height" (a shaped frame), ` +
35
+ 'never both.',
36
+ };
37
+ }
38
+ const dimension = (name: string, value: unknown): number | string => {
39
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
40
+ return (
41
+ `${String(cmd['type'])}: "${name}" must be a whole number — got ` +
42
+ `${typeof value} ${JSON.stringify(value) ?? String(value)}.`
43
+ );
44
+ }
45
+ if (value < MIN_CAPTURE_DIMENSION || value > MAX_CAPTURE_DIMENSION) {
46
+ return `${String(cmd['type'])}: "${name}" must be ${MIN_CAPTURE_DIMENSION}-${MAX_CAPTURE_DIMENSION} — ${CAPTURE_BUDGET_REASON}`;
47
+ }
48
+ return value;
49
+ };
50
+ const width = dimension('width', rawWidth);
51
+ if (typeof width === 'string') return { error: width };
52
+ const height = dimension('height', rawHeight);
53
+ if (typeof height === 'string') return { error: height };
54
+ if (width * height > MAX_CAPTURE_DIMENSION * MAX_CAPTURE_DIMENSION) {
55
+ return {
56
+ error:
57
+ `${String(cmd['type'])}: ${width}x${height} is ${width * height} pixels, past the ` +
58
+ `${MAX_CAPTURE_DIMENSION}x${MAX_CAPTURE_DIMENSION} total — ${CAPTURE_BUDGET_REASON}`,
59
+ };
60
+ }
61
+ return { size: { width, height } };
62
+ }
63
+ if (raw === undefined || raw === null) return {};
64
+ if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 1) {
65
+ return {
66
+ error:
67
+ `${String(cmd['type'])}: "size" must be a finite number >= 1 — got ` +
68
+ `${typeof raw} ${JSON.stringify(raw) ?? String(raw)}.`,
69
+ };
70
+ }
71
+ return { size: raw };
72
+ }
73
+
74
+ /**
75
+ * The editor's own capture ceiling, and WHY it is this number.
76
+ *
77
+ * 64..1024 per side is `asset-preview.ts`'s `MIN_SIZE`/`MAX_SIZE`: the pixels
78
+ * cross the editor relay as base64 JSON, and 1024 is where even incompressible
79
+ * RGBA still fits its 50 MB request limit. A shaped frame is held to the same
80
+ * BUDGET rather than a laxer one — its total may not exceed a 1024 square —
81
+ * because the budget is about bytes on the wire, not about shape.
82
+ */
83
+ const MIN_CAPTURE_DIMENSION = 64;
84
+ const MAX_CAPTURE_DIMENSION = 1024;
85
+ const CAPTURE_BUDGET_REASON =
86
+ "the editor's own ceiling: the pixels cross the relay as base64 JSON, and 1024 is where even " +
87
+ 'incompressible RGBA still fits its 50 MB request limit. For more picture, take more views, ' +
88
+ 'not bigger ones.';
@@ -0,0 +1,159 @@
1
+ /**
2
+ * CONTRIBUTED CHROME — the registry behind `@volter/sdk/chrome`: the
3
+ * palette actions, application-menu items and header items a package
4
+ * contributes.
5
+ *
6
+ * WHO READS IT, measured rather than assumed: `palette-action-publisher.tsx`
7
+ * takes {@link contributedActions} into the table the frame registers as
8
+ * `MenuId.CommandPalette` items (so ⌘⇧P lists a package's actions with its own
9
+ * labels); `components/ApplicationMenus.tsx` appends
10
+ * {@link contributedMenuItems} per menu id; `components/ProjectHeader.tsx` and
11
+ * `components/Object3DDocumentToolbar.tsx` draw {@link contributedHeaderItems}
12
+ * in the title bar and the document's own strip; `tool-loader.ts` registers
13
+ * what a package declares. Ids are namespaced `tool:` so they never collide
14
+ * with the host's.
15
+ */
16
+
17
+ import type {
18
+ ActionContribution,
19
+ ContributableMenu,
20
+ ContributedAction,
21
+ ContributedMenuItem,
22
+ DocumentHeaderItemProps,
23
+ HeaderPlacement,
24
+ MenuContribution,
25
+ } from '@volter/sdk/chrome';
26
+ import type { ComponentType } from 'react';
27
+
28
+ const CONTRIBUTABLE_MENUS: readonly ContributableMenu[] = [
29
+ 'asset',
30
+ 'view',
31
+ 'window',
32
+ 'debug',
33
+ 'tools',
34
+ 'help',
35
+ ];
36
+
37
+ export interface ContributedHeaderItem {
38
+ readonly id: string;
39
+ readonly order: number;
40
+ readonly placement: HeaderPlacement;
41
+ readonly Component: ComponentType<DocumentHeaderItemProps>;
42
+ }
43
+
44
+ let headerItems: ContributedHeaderItem[] = [];
45
+ let actionRegistrations: readonly ActionContribution[] = [];
46
+ let menuItems: Array<{ menu: ContributableMenu; item: ContributedMenuItem }> = [];
47
+ let version = 0;
48
+ const listeners = new Set<() => void>();
49
+ function notify(): void {
50
+ version++;
51
+ for (const listener of listeners) listener();
52
+ }
53
+
54
+ export function subscribeContributedChrome(listener: () => void): () => void {
55
+ listeners.add(listener);
56
+ return () => listeners.delete(listener);
57
+ }
58
+
59
+ export function contributedChromeVersion(): number {
60
+ return version;
61
+ }
62
+
63
+ /** Header items in `order`, ties by registration. */
64
+ export function contributedHeaderItems(
65
+ placement: HeaderPlacement = 'transport',
66
+ ): readonly ContributedHeaderItem[] {
67
+ return headerItems
68
+ .filter((item) => item.placement === placement)
69
+ .sort((a, b) => a.order - b.order);
70
+ }
71
+
72
+ /** Register one header item (`.header.tsx`, `tool:<id>`). Returns the unregister. */
73
+ export function registerContributedHeaderItem(item: ContributedHeaderItem): () => void {
74
+ if (headerItems.some((existing) => existing.id === item.id))
75
+ throw new Error(`header item "${item.id}" is already contributed.`);
76
+ headerItems = [...headerItems, item];
77
+ notify();
78
+ return () => {
79
+ headerItems = headerItems.filter((existing) => existing !== item);
80
+ notify();
81
+ };
82
+ }
83
+
84
+ export function contributedActions(): readonly ContributedAction[] {
85
+ const seen = new Set<string>();
86
+ const out: ContributedAction[] = [];
87
+ for (const registration of actionRegistrations) {
88
+ const list =
89
+ typeof registration.actions === 'function' ? registration.actions() : registration.actions;
90
+ for (const action of list) {
91
+ const id = `tool:${action.id}`;
92
+ // A live set may repeat a static id across its own reads; first wins.
93
+ if (seen.has(id)) continue;
94
+ seen.add(id);
95
+ out.push({ ...action, id });
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+
101
+ export function contributedMenuItems(menu: ContributableMenu): readonly ContributedMenuItem[] {
102
+ return menuItems.filter((entry) => entry.menu === menu).map((entry) => entry.item);
103
+ }
104
+
105
+ export function isContributableMenu(value: unknown): value is ContributableMenu {
106
+ return typeof value === 'string' && (CONTRIBUTABLE_MENUS as readonly string[]).includes(value);
107
+ }
108
+
109
+ /**
110
+ * Register a contribution's actions, each under `tool:<id>`. A fixed list is
111
+ * checked for duplicate ids now; a live one (`actions` as a function) is read
112
+ * on every listing and re-listed whenever its `subscribe` fires. Returns the
113
+ * unregister.
114
+ */
115
+ export function registerContributedActions(contribution: ActionContribution): () => void {
116
+ if (typeof contribution.actions !== 'function') {
117
+ const listed = contributedActions();
118
+ for (const action of contribution.actions)
119
+ if (listed.some((existing) => existing.id === `tool:${action.id}`))
120
+ throw new Error(`action "tool:${action.id}" is already contributed.`);
121
+ }
122
+ actionRegistrations = [...actionRegistrations, contribution];
123
+ const stop = contribution.subscribe?.(notify);
124
+ notify();
125
+ return () => {
126
+ stop?.();
127
+ actionRegistrations = actionRegistrations.filter((existing) => existing !== contribution);
128
+ notify();
129
+ };
130
+ }
131
+
132
+ /** Register a contribution's menu items on one menu. Returns the unregister. */
133
+ export function registerContributedMenu(contribution: MenuContribution): () => void {
134
+ const added = contribution.items.map((item) => ({
135
+ menu: contribution.menu,
136
+ item: { ...item, id: `tool:${item.id}` },
137
+ }));
138
+ for (const entry of added)
139
+ if (menuItems.some((existing) => existing.item.id === entry.item.id))
140
+ throw new Error(`menu item "${entry.item.id}" is already contributed.`);
141
+ menuItems = [...menuItems, ...added];
142
+ notify();
143
+ return () => {
144
+ menuItems = menuItems.filter((entry) => !added.includes(entry));
145
+ notify();
146
+ };
147
+ }
148
+
149
+ /**
150
+ * A fingerprint of every contributed item's CURRENT `disabled` answer, across
151
+ * every menu. The point (`@volter/sdk/chrome`) promises that `disabled`
152
+ * is asked at render and may follow session state — which is only true if
153
+ * something re-renders the bar when that state moves. `ApplicationMenus`
154
+ * samples this on the shared availability tick while a menu is OPEN, so an
155
+ * item can go live or dead under the cursor and costs nothing when closed.
156
+ */
157
+ export function contributedDisabledFingerprint(): string {
158
+ return menuItems.map((entry) => (entry.item.disabled?.({}) ? '1' : '0')).join('');
159
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * A CHROME SLOT IS A PLACE, NOT A PANEL — the third registry in the same
3
+ * family as `workspace-document-restore.ts` (a kind owns its persisted state)
4
+ * and `document-open-registry.ts` (a kind owns how it opens). Here: the host
5
+ * owns WHERE something sits and how big it is; a package owns WHAT sits there.
6
+ *
7
+ * WHY IT EXISTS. The host's chrome had two places whose CONTENT was a product
8
+ * opinion rather than a workbench concern: the `agent` static panel
9
+ * (`components/workspace-static-panel-registry.tsx` imported
10
+ * `ConversationPanel`) and the bottom bar beside the status line
11
+ * (`components/EditorBottomBar.tsx` imported `HarnessConversationTray`). Both
12
+ * are an AGENT-HARNESS conversation surface — it talks to coding harnesses, not
13
+ * to a game, not to a document — so a base library for making IDEs should not
14
+ * carry it, and neither of the two existing seams fits: it is not a document,
15
+ * so it neither opens nor persists (WORK.md §The open-source launch, phase 1
16
+ * unit 6 half A).
17
+ *
18
+ * WHAT A SLOT ID IS. A plain string in the host's own vocabulary, spelled at
19
+ * the ONE host call site that renders the slot. The host declares the place in
20
+ * its own layout inventory (`workspace-static-panels.ts` still lists the
21
+ * `agent` panel's title, hotkey scope and placement, because the frame
22
+ * PERSISTS panel ids and the tab's own chrome is the dock's); what it no
23
+ * longer holds is the surface.
24
+ *
25
+ * NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
26
+ * filler for a slot renders nothing there — the same honest emptiness a
27
+ * document kind with no registered opener gives.
28
+ */
29
+
30
+ import type { ComponentType } from 'react';
31
+
32
+ export interface ChromeSlotFiller {
33
+ /** The place, in the host's vocabulary (`panel:agent`, `bottom-bar`). */
34
+ readonly slot: string;
35
+ /** Which module registered it. Re-registering the same owner+slot REPLACES,
36
+ * so an HMR re-evaluation leaves one filler, not two. */
37
+ readonly owner: string;
38
+ /** Ascending; ties keep registration order. */
39
+ readonly order?: number;
40
+ readonly Content: ComponentType;
41
+ }
42
+
43
+ const _fillers = new Map<string, ChromeSlotFiller[]>();
44
+ const listeners = new Set<() => void>();
45
+ let version = 0;
46
+
47
+ function publish(): void {
48
+ version++;
49
+ for (const listener of listeners) listener();
50
+ }
51
+
52
+ /** Install a filler. Returns the teardown. */
53
+ export function registerChromeSlot(filler: ChromeSlotFiller): () => void {
54
+ const existing = _fillers.get(filler.slot) ?? [];
55
+ const next = existing.filter((item) => item.owner !== filler.owner);
56
+ next.push(filler);
57
+ next.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
58
+ _fillers.set(filler.slot, next);
59
+ publish();
60
+ return () => {
61
+ const current = _fillers.get(filler.slot);
62
+ if (!current) return;
63
+ const remaining = current.filter((item) => item !== filler);
64
+ if (remaining.length === 0) _fillers.delete(filler.slot);
65
+ else _fillers.set(filler.slot, remaining);
66
+ publish();
67
+ };
68
+ }
69
+
70
+ /** Everything registered for `slot`, in order. A stable array per version, so
71
+ * it is a safe `useSyncExternalStore` snapshot. */
72
+ export function chromeSlotFillers(slot: string): readonly ChromeSlotFiller[] {
73
+ return _fillers.get(slot) ?? EMPTY;
74
+ }
75
+
76
+ const EMPTY: readonly ChromeSlotFiller[] = [];
77
+
78
+ export function subscribeChromeSlots(listener: () => void): () => void {
79
+ listeners.add(listener);
80
+ return () => listeners.delete(listener);
81
+ }
82
+
83
+ export function chromeSlotRegistryVersion(): number {
84
+ return version;
85
+ }
86
+
87
+ /** Test-only reset (mirrors the restore and open registries' own). */
88
+ export function __resetChromeSlotsForTest(): void {
89
+ _fillers.clear();
90
+ publish();
91
+ }