@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,120 @@
1
+ /**
2
+ * A DOCUMENT'S VIEWPORT, as the stage that shows it answers for it: the camera,
3
+ * the diagnostic view, the grid, framing, a document's own selection and a
4
+ * photograph of what it draws. The kit's view presentation and its current-view
5
+ * readout (`EditorView.viewport`) ask here for the active document, so a view
6
+ * link reaches whichever medium draws that document. A document no stage
7
+ * registered has no viewport, which is what `EditorView` then says.
8
+ */
9
+ import type { ComponentType } from 'react';
10
+ import type { CaptureDimensions, EditorView } from '../types';
11
+
12
+ export type EditorViewViewport = NonNullable<EditorView['viewport']>;
13
+
14
+ export interface DocumentViewport {
15
+ /** Camera pose, diagnostic and grid now; null while nothing is drawn yet. */
16
+ read(): Pick<EditorViewViewport, 'camera' | 'diagnostic' | 'grid'> | null;
17
+ /** False when this viewport has no such diagnostic view. */
18
+ setDiagnostic(diagnostic: NonNullable<EditorViewViewport['diagnostic']>): boolean;
19
+ /** False when this viewport has no such camera. */
20
+ setCamera(camera: NonNullable<EditorViewViewport['camera']>): boolean;
21
+ /** False when there is nothing to frame. */
22
+ frame(target: NonNullable<EditorViewViewport['frame']>): boolean;
23
+ /** A document that keeps its own selection (an Object3D document) answers
24
+ * and applies it here; one that does not uses the shell's. */
25
+ readonly selection?: {
26
+ read(): readonly string[];
27
+ apply(ids: readonly string[]): void;
28
+ };
29
+ /** The ids of the objects this stage draws under `name` (a layout selecting
30
+ * one named native object). */
31
+ idsNamed?(name: string): readonly string[];
32
+ /** Arm the stage's own transform gizmo. */
33
+ setTransformMode?(mode: 'combined' | 'translate' | 'rotate' | 'scale'): void;
34
+ /** A PNG data URL of what it draws, when it can render one on demand. */
35
+ capture?(size?: CaptureDimensions): string | null;
36
+ /** Settles before a view is applied (an asynchronously mounting document). */
37
+ prepare?(): Promise<void>;
38
+ /** The controls this stage adds to its document's header (its shading,
39
+ * helpers and capture menus). */
40
+ readonly HeaderControls?: ComponentType<{ readonly documentId: string; readonly assetPath?: string }>;
41
+ /**
42
+ * What the host's transform tools drive on this stage right now: `gizmo` (the
43
+ * stage's own transform handles, whose header wells configure them), `modal`
44
+ * (the stage transforms through a door it declared, and has no gizmo to
45
+ * configure) or `none` (nothing of this stage takes them).
46
+ */
47
+ transformTools?(): 'gizmo' | 'modal' | 'none';
48
+ /** The transform tool strip on the document's shelf. */
49
+ readonly TransformTools?: ComponentType<{ readonly documentId: string }>;
50
+ /** The gizmo's header wells (orientation, pivot, snap, options). */
51
+ readonly TransformControls?: ComponentType<{ readonly documentId: string }>;
52
+ }
53
+
54
+ const viewports = new Map<string, DocumentViewport>();
55
+ const listeners = new Set<() => void>();
56
+ let version = 0;
57
+ let notificationPending = false;
58
+
59
+ function changed(): void {
60
+ // A stage registers from a contribution root's effect. Keep the viewport
61
+ // immediately readable, but publish its React snapshot outside that commit
62
+ // so a host subscriber cannot re-enter a pending host commit through it.
63
+ if (notificationPending) return;
64
+ notificationPending = true;
65
+ queueMicrotask(() => {
66
+ notificationPending = false;
67
+ version += 1;
68
+ for (const listener of [...listeners]) listener();
69
+ });
70
+ }
71
+
72
+ /** Register the viewport of one document. Returns the removal. */
73
+ export function registerDocumentViewport(documentId: string, viewport: DocumentViewport): () => void {
74
+ viewports.set(documentId, viewport);
75
+ changed();
76
+ return () => {
77
+ if (viewports.get(documentId) !== viewport) return;
78
+ viewports.delete(documentId);
79
+ changed();
80
+ };
81
+ }
82
+
83
+ export function subscribeDocumentViewports(listener: () => void): () => void {
84
+ listeners.add(listener);
85
+ return () => listeners.delete(listener);
86
+ }
87
+
88
+ export function documentViewportsVersion(): number {
89
+ return version;
90
+ }
91
+
92
+ export function documentViewport(documentId: string | null | undefined): DocumentViewport | null {
93
+ return documentId ? (viewports.get(documentId) ?? null) : null;
94
+ }
95
+
96
+ const announced = new Map<string, number>();
97
+
98
+ /**
99
+ * A DOCUMENT'S STAGE ANNOUNCES ITSELF AS IT RENDERS, before the viewport it will
100
+ * register exists — the fact an opener's `ready` needs and cannot get from
101
+ * anywhere else: whether a document mounts a stage is a fact of its MOUNT,
102
+ * never of its address. Counted, so overlapping mounts of one document (a
103
+ * revision swap) release in any order. Returns the release.
104
+ */
105
+ export function announceDocumentStage(documentId: string): () => void {
106
+ announced.set(documentId, (announced.get(documentId) ?? 0) + 1);
107
+ let released = false;
108
+ return () => {
109
+ if (released) return;
110
+ released = true;
111
+ const open = (announced.get(documentId) ?? 0) - 1;
112
+ if (open > 0) announced.set(documentId, open);
113
+ else announced.delete(documentId);
114
+ };
115
+ }
116
+
117
+ /** Whether a stage for this document has begun mounting. */
118
+ export function documentStageAnnounced(documentId: string): boolean {
119
+ return (announced.get(documentId) ?? 0) > 0;
120
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Editor server SDK.
3
+ *
4
+ * All frontend code should use this module instead of calling fetch()/EventSource
5
+ * with raw endpoint URLs.
6
+ *
7
+ * The project's `public/` file operations (`listAssets`, `saveFile`) are routed
8
+ * through the backend-agnostic `StorageBackend` (see ./storage): `HttpStorage`
9
+ * over the same `/__editor/*` routes, wrapped by the frame's file door once
10
+ * that lands. The remaining endpoints are NOT `public/` file ops — the
11
+ * launcher's own reads, the play-log writes, the asset library, and the
12
+ * user-triggered actions (`createProject`, `browseFolder`,
13
+ * `openProjectOnServer`, `revealInFinder`, `startExport`,
14
+ * `downloadOnlineAsset`).
15
+ */
16
+
17
+ export type { EditorEventSource } from './editor-presence';
18
+ export { connectEvents, connectTabPresence, reportTabRoute } from './editor-presence';
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // The families. This path stays the ONE import site for the editor server SDK
22
+ // — every name below was exported from here before the split and still is, so
23
+ // no caller changed. What changed is that a reader looking for "how does the
24
+ // editor talk to the worktree board" now opens `api/worktrees.ts` instead of
25
+ // scrolling an 1,900-line file.
26
+ // ---------------------------------------------------------------------------
27
+
28
+ // `./api/agents` is DELIBERATELY NOT RE-EXPORTED HERE (phase 1 unit 22). It is
29
+ // the page-side client for the coding-harness routes, and `@volter/agents`'s
30
+ // modules have always imported `@editor/api/agents` directly rather than
31
+ // through this barrel — so the family's claim above ("every name was exported
32
+ // from here before the split and still is") was already not how its one
33
+ // consumer reads it. What the row bought instead was a static edge from every
34
+ // importer of this file into the agents lane's whole wire, which is what held
35
+ // four files in the editor's eager closure after the last host caller left.
36
+ // The rule is unit 13's, found on the view presenter: a door every package
37
+ // calls must not carry every lane's implementation.
38
+ export * from './api/assets';
39
+ export * from '@volter/sdk/kit/api-build';
40
+ export * from '@volter/sdk/kit/api-logs';
41
+ export * from '@volter/sdk/kit/api-project-identity';
42
+ export * from './api/project-open';
43
+ export * from './api/project-source';
44
+ export * from './api/project-state';
45
+ export * from './api/relay';
46
+ export * from '@volter/sdk/kit/api-worktrees';
@@ -0,0 +1,136 @@
1
+ /**
2
+ * THE CHROME-CAPTURE DOOR: photograph the editor PAGE — every panel, every
3
+ * tab strip, the Inspector, the viewport inside it — as the person is seeing
4
+ * it. the editor's `screenshot editor` command / `editor.captureEditorChrome()`.
5
+ *
6
+ * WHY IT EXISTS. Every other capture door photographs a SUBJECT: the running
7
+ * game, the active document, the Scene viewport, a model. None photographs
8
+ * the editor itself, so a contribution author — human or agent — could not
9
+ * run the sighted render→look→revise loop on a panel through the product, and
10
+ * every dev-surface wave so far was built blind, on DOM probes (WORK.md, "The
11
+ * chrome-capture door"). A skin, a workspace arrangement or a new region
12
+ * cannot be judged at all without this.
13
+ *
14
+ * HOW. The same compositor the active-document door uses
15
+ * (`composite-screenshot.ts`), pointed at `#editor-chrome-root` — the ONE
16
+ * theme scope (ARCHITECTURE-CORE §Editor chrome) — with `includeDocumentStyles`
17
+ * on, so the design system's stylesheet rides the clone and chrome
18
+ * photographs as it appears. Three kinds of canvas sit inside that root and
19
+ * only one of them can be read late:
20
+ *
21
+ * - a canvas a medium re-renders at a chosen size — a three.js viewport or
22
+ * Object3D document with no `preserveDrawingBuffer` — is drawn by that
23
+ * medium (`@volter/sdk/kit/canvas-frames`'s `renderedCanvasFrame`);
24
+ * - a live game or Pixi canvas goes through the one `canvasFrame` seam
25
+ * every pixel door shares (`live-canvas-frame.ts`).
26
+ *
27
+ * Visible iframes are refused: cloning a frame does not capture its browsing
28
+ * context, so an extension's working UI would otherwise look blank.
29
+ * Everything else reads directly. A canvas this module cannot recognise or
30
+ * re-render photographs as the browser hands it back — possibly black — and
31
+ * `layers.canvases` says how many were drawn, so a reader can tell a black
32
+ * panel from a missing one.
33
+ */
34
+
35
+ import type { EditorChromeCaptureOptions, EditorView } from '@volter/sdk';
36
+ import { renderedCanvasFrame } from '@volter/sdk/kit/canvas-frames';
37
+ import { type CompositeCapture, capturePlayComposite } from '@volter/sdk/kit/composite-screenshot';
38
+ import { currentEditorView } from './editor-current-view';
39
+ import type { ShellStore } from '@volter/sdk/kit/shell-store';
40
+ import { liveCanvasFrame } from '@volter/sdk/kit/live-canvas-frame';
41
+ import { activeDocumentContainer } from './editor-document-probe';
42
+ import { activeWorkspaceDocumentId } from '@volter/sdk/kit/workspace-document-registry';
43
+
44
+ export const EDITOR_CHROME_ROOT_ID = 'editor-chrome-root';
45
+
46
+ export interface EditorChromeCapture extends CompositeCapture {
47
+ /** The view the page was showing when the frame was taken. */
48
+ view: EditorView;
49
+ /** The frame's own size, in OUTPUT pixels. */
50
+ size: { width: number; height: number };
51
+ /** Output pixels per CSS pixel — what one pixel of {@link size} is. A
52
+ * reference frame captured on a 2x display is judged against `scale: 2`. */
53
+ scale: number;
54
+ }
55
+
56
+ /** The capture's options: the SDK's public type, so the client and this kit cannot drift. */
57
+ export type { EditorChromeCaptureOptions };
58
+
59
+ /** A data URL as something `drawImage` accepts. */
60
+ /**
61
+ * Same-frame pixels for every canvas the page holds — the seam described in
62
+ * the header. `null` means "read the canvas directly".
63
+ */
64
+ function chromeCanvasFrame(scale: number) {
65
+ return async (canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> => {
66
+ // A medium's re-render draws at a size WE choose, so it is asked for the
67
+ // frame's own scale — a 2x capture whose viewport had to be re-rendered gets
68
+ // a 2x render, not a 1x one stretched (`@volter/sdk/kit/canvas-frames`).
69
+ const size = {
70
+ width: Math.max(1, Math.round(canvas.clientWidth * scale)),
71
+ height: Math.max(1, Math.round(canvas.clientHeight * scale)),
72
+ };
73
+ return (await renderedCanvasFrame(canvas, size)) ?? liveCanvasFrame(canvas);
74
+ };
75
+ }
76
+
77
+ /** Photograph the editor page. Throws, by name, when the chrome root is not
78
+ * mounted — a page that is not the editor has nothing to photograph. */
79
+ export async function captureEditorChrome(
80
+ store: ShellStore,
81
+ options?: EditorChromeCaptureOptions,
82
+ ): Promise<EditorChromeCapture> {
83
+ const page = document.getElementById(EDITOR_CHROME_ROOT_ID);
84
+ if (!page) {
85
+ throw new Error(
86
+ `The editor chrome root (#${EDITOR_CHROME_ROOT_ID}) is not mounted, so there is no editor ` +
87
+ 'page to photograph.',
88
+ );
89
+ }
90
+ // THE DOCUMENT REGION: the same compositor over the active document's own box, so a stage is
91
+ // photographed with what the person sees over it (its navigation gizmo, its readouts), not
92
+ // as the document's render alone.
93
+ let root: HTMLElement = page;
94
+ if (options?.region === 'document' || options?.region === 'play') {
95
+ const documentId = activeWorkspaceDocumentId();
96
+ const box = documentId ? activeDocumentContainer(documentId) : null;
97
+ if (!box) throw new Error('No active document is showing, so there is no document region to photograph.');
98
+ root = box;
99
+ if (options.region === 'play') {
100
+ const frame = box.querySelector<HTMLElement>('[data-volter-play-frame]');
101
+ if (!frame || !frame.checkVisibility({checkVisibilityCSS: true, checkOpacity: true})) {
102
+ throw new Error('The active document has no visible live frame to photograph.');
103
+ }
104
+ root = frame;
105
+ }
106
+ }
107
+ const scale = options?.scale ?? window.devicePixelRatio ?? 1;
108
+ const rect = root.getBoundingClientRect();
109
+ // cloneNode does not copy a frame's browsing context. In particular, a
110
+ // working extension webview becomes an empty rectangle in the SVG clone.
111
+ // Refuse that misleading evidence instead of reporting a successful capture.
112
+ // The workbench also has a zero-size extension-host frame; it paints nothing.
113
+ for (const frame of root.querySelectorAll('iframe')) {
114
+ const box = frame.getBoundingClientRect();
115
+ if (
116
+ box.width <= 0 || box.height <= 0 || box.right <= rect.left ||
117
+ box.left >= rect.right || box.bottom <= rect.top || box.top >= rect.bottom ||
118
+ !frame.checkVisibility({ checkOpacity: true, checkVisibilityCSS: true })
119
+ ) continue;
120
+ throw new Error(
121
+ 'Editor chrome capture cannot include a visible iframe or extension webview. ' +
122
+ 'Its content would be missing from the image; this does not mean the live panel is blank. ' +
123
+ 'Use a browser window capture for the whole page, or region: "document" for the active document.',
124
+ );
125
+ }
126
+ const size = {
127
+ width: Math.max(1, Math.round(rect.width * scale)),
128
+ height: Math.max(1, Math.round(rect.height * scale)),
129
+ };
130
+ const composite = await capturePlayComposite(root, {
131
+ canvasFrame: chromeCanvasFrame(scale),
132
+ includeDocumentStyles: true,
133
+ size,
134
+ });
135
+ return { ...composite, view: currentEditorView(store), size, scale };
136
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * THE EDITOR'S COMMANDS: the ONE table of what its palette actions ARE, and
3
+ * the ONE door to running a command by id.
4
+ *
5
+ * 1. **The ACTION TABLE.** What the palette lists, published as DATA so the
6
+ * frame can register one VS Code command plus one
7
+ * `MenuId.CommandPalette` item per entry — which is what makes ⌘⇧P list
8
+ * OUR actions with OUR labels. `components/palette-action-publisher.tsx`
9
+ * is its one author.
10
+ *
11
+ * ## Why this is published at RUNTIME and the keymap is GENERATED
12
+ *
13
+ * The chords are a generated built-in extension because a keybinding rule
14
+ * registered after `workbench.common.main.ts` has loaded is INERT, and the
15
+ * chords are package data known at build time. Neither half holds here,
16
+ * measured 2026-09-19:
17
+ *
18
+ * - A MENU ITEM registered late is not inert. `MenuRegistry` fires
19
+ * `onDidChangeMenu` and the palette rebuilds its picks on every open
20
+ * (`commandsQuickAccess.ts`'s `getGlobalCommandPicks`), which is how
21
+ * every extension-contributed command reaches ⌘⇧P.
22
+ * - The table is not static. Its ids are a different namespace from the
23
+ * keymap's (`editor.undo` here, `edit.undo` there), several labels are
24
+ * templated per selection (`View Through <camera name>`), and the
25
+ * entity, tool-document, board-open and package-contributed (`tool:*`)
26
+ * entries do not exist until something mounts or a package loads.
27
+ *
28
+ * So the generator is left alone and the frame reads a live table instead.
29
+ *
30
+ * 2. **`editor.command(id, args)`**, the door a product surface drives a VIEW
31
+ * through. `editor.document.*` reaches only the ACTIVE CENTRE DOCUMENT by
32
+ * its own contract, so every drawer utility — Console, Profiler, Network,
33
+ * the node editor — was undrivable until this existed; a walk looking for
34
+ * one tried `editor.view`, `editor.frame` and `editor.present` in turn and
35
+ * was refused by each, because there was no door.
36
+ *
37
+ * It is the frame's `ICommandService.executeCommand`, installed by the
38
+ * contribution, so ANY workbench command id is reachable — ours and
39
+ * upstream's alike. That is the point of running inside a workbench.
40
+ * Before the executor lands, a `volter.<view>.<verb>` id still resolves off
41
+ * `@volter/sdk/views` — the same table the frame's command would have
42
+ * called — and any OTHER id is refused BY NAME, because a silent nothing
43
+ * is how an agent concludes a command "did not work".
44
+ */
45
+ /**
46
+ * How the frame opens ITS palette when one of our own actions asks for one
47
+ * (`view.commandPalette`, whose chord U6 left unbound under the frame because
48
+ * ⌘K is VS Code's chord prefix). Installed by the contribution after the
49
+ * bridge has mounted; absent, the action is refused rather than silently
50
+ * toggling a palette nobody renders.
51
+ */
52
+ let paletteOpener: (() => void) | null = null;
53
+
54
+ export function setPaletteOpener(open: (() => void) | null): void {
55
+ paletteOpener = open;
56
+ }
57
+
58
+ /** Open the command palette. `false` before the opener lands — the window
59
+ * between the bridge mounting and the contribution's `setPaletteOpener`. */
60
+ export function openCommandPalette(): boolean {
61
+ if (!paletteOpener) return false;
62
+ paletteOpener();
63
+ return true;
64
+ }
65
+
66
+ export interface PaletteActionEntry {
67
+ readonly id: string;
68
+ readonly label: string;
69
+ /** `action` | `entity` | `asset`, as `action-registry.ts` spells it. */
70
+ readonly category: string;
71
+ readonly run: () => void | Promise<void>;
72
+ /** The application menu it is an item of, and its label there. */
73
+ readonly menu?: { readonly id: string; readonly label: string };
74
+ }
75
+
76
+ let entries: readonly PaletteActionEntry[] = [];
77
+ let entriesVersion = 0;
78
+ const entryListeners = new Set<() => void>();
79
+
80
+ /**
81
+ * Publish the table the palette would list. Called from the editor's own
82
+ * tree (`components/palette-action-publisher.tsx`) so the hooks that build it
83
+ * — the shell store, the history commands, the contributed-chrome version —
84
+ * are read exactly where React reads them, rather than reached for out of
85
+ * band. The array is replaced, never merged: the builders return the whole
86
+ * live set each time.
87
+ */
88
+ export function publishPaletteActions(next: readonly PaletteActionEntry[]): void {
89
+ entries = next;
90
+ entriesVersion++;
91
+ for (const listener of entryListeners) listener();
92
+ }
93
+
94
+ /** Every palette action the editor currently offers. */
95
+ export function paletteActions(): readonly PaletteActionEntry[] {
96
+ return entries;
97
+ }
98
+
99
+ export function paletteActionsVersion(): number {
100
+ return entriesVersion;
101
+ }
102
+
103
+ export function subscribePaletteActions(listener: () => void): () => void {
104
+ entryListeners.add(listener);
105
+ return () => entryListeners.delete(listener);
106
+ }
107
+
108
+ /**
109
+ * Run one palette action by id — the door the workbench's own command calls.
110
+ * `false` means the editor no longer has that entry (a selection changed, a
111
+ * tool document closed, a package unloaded), which the caller reports by name
112
+ * rather than swallowing.
113
+ */
114
+ export function invokePaletteAction(id: string): boolean {
115
+ const entry = entries.find((candidate) => candidate.id === id);
116
+ if (!entry) return false;
117
+ void entry.run();
118
+ return true;
119
+ }
120
+
121
+ /**
122
+ * The workbench's command service, handed over by the contribution once it has
123
+ * one. Installed AFTER the bridge mounts, for the reason every other seam
124
+ * here states: a `ServicesAccessor` is valid only inside the synchronous part
125
+ * of a command's invocation.
126
+ */
127
+ let commandExecutor: ((id: string, args?: unknown) => unknown) | null = null;
128
+
129
+ export function setCommandExecutor(run: ((id: string, args?: unknown) => unknown) | null): void {
130
+ commandExecutor = run;
131
+ }
132
+
133
+ /**
134
+ * Reveal a workbench view by id (`volter.properties`, `volter.outliner`) through its `.focus`
135
+ * command, which the workbench registers for every view. Without the Code-OSS frame there is
136
+ * no workbench and the editor's own panels are in the page, so there is nothing to reveal.
137
+ */
138
+ export function revealWorkbenchView(viewId: string): void {
139
+ if (!commandExecutor) return;
140
+ void Promise.resolve(commandExecutor(`${viewId}.focus`)).catch(() => {});
141
+ }
142
+
143
+ /** The `volter.<view>.<verb>` shape the views registry keys, and the ONLY id
144
+ * shape standalone can answer. */
145
+ const VIEW_VERB_COMMAND = /^volter\.([^.]+)\.(.+)$/;
146
+
147
+ /**
148
+ * Run a command by id — `editor.command(id, args)`'s one implementation.
149
+ *
150
+ * The workbench's `ICommandService` when it has landed; before that, the
151
+ * views registry, reached through a DYNAMIC import so a module only a
152
+ * the editor's `eval` command reaches never joins the editor entry's static closure.
153
+ *
154
+ * A refusal is always BY NAME. `invokeViewVerb` names the view's whole
155
+ * vocabulary when it does not carry the verb (that refusal is the VIEW's, and
156
+ * moving it here would put it somewhere the view does not draw), and an id
157
+ * that is not a view verb at all is refused with the shape that would have
158
+ * worked.
159
+ */
160
+ export async function executeCommand(id: string, args?: unknown): Promise<unknown> {
161
+ if (commandExecutor) return await commandExecutor(id, args);
162
+ const parts = VIEW_VERB_COMMAND.exec(id);
163
+ if (!parts) {
164
+ throw new Error(
165
+ `No command "${id}". Without the Code-OSS frame there is no command service, so the ` +
166
+ "only commands this editor answers are a view's own verbs, spelled " +
167
+ 'volter.<view>.<verb> (for example volter.blender-node-view.view-all).',
168
+ );
169
+ }
170
+ const { invokeViewVerb } = await import('@volter/sdk/views');
171
+ return invokeViewVerb(
172
+ parts[1] as string,
173
+ parts[2] as string,
174
+ args as Record<string, unknown> | undefined,
175
+ );
176
+ }