@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,108 @@
1
+ /** Programmable editor composition. Layouts are React components, not registry keys. */
2
+ import { type ComponentType, type CSSProperties, createElement, type ReactNode } from 'react';
3
+ import { DesignArrangement, type WorkspaceArrangement } from './layout-arrangements';
4
+ import type { EditorView } from './types';
5
+
6
+ export {
7
+ DesignArrangement,
8
+ GameArrangement,
9
+ type WorkspaceArrangement,
10
+ } from './layout-arrangements';
11
+
12
+ export interface EditorLayoutProps {
13
+ readonly playing: boolean;
14
+ readonly paused: boolean;
15
+ }
16
+ export type EditorLayout = ComponentType<EditorLayoutProps>;
17
+ export interface LayoutFrameProps {
18
+ readonly children?: ReactNode;
19
+ readonly style?: CSSProperties;
20
+ /** Let the enclosing web page scroll when the pointer is over a viewport. */
21
+ readonly pageScroll?: boolean;
22
+ }
23
+ export interface WorkspaceProps {
24
+ readonly arrangement?: WorkspaceArrangement;
25
+ readonly immersivePlay?: boolean;
26
+ readonly playUtilities?: readonly string[];
27
+ }
28
+ export interface DocumentHandle {
29
+ /** Select exactly one named native object; ambiguous/missing names refuse. */
30
+ select(name: string): void;
31
+ transform(mode: 'combined' | 'translate' | 'rotate' | 'scale'): void;
32
+ frame(): void;
33
+ }
34
+ export interface DocumentViewProps {
35
+ readonly document:
36
+ | Extract<NonNullable<EditorView['document']>, { kind: 'story' | 'workspace' }>
37
+ | {
38
+ readonly kind: 'asset';
39
+ readonly path: string;
40
+ readonly assetKind?: 'source' | 'model' | 'image' | 'audio' | 'json';
41
+ };
42
+ readonly chrome?: boolean;
43
+ readonly active?: boolean;
44
+ readonly onReady?: (document: DocumentHandle) => void;
45
+ }
46
+ export interface LayoutHost {
47
+ readonly Frame: ComponentType<LayoutFrameProps>;
48
+ readonly Header: ComponentType;
49
+ readonly Footer: ComponentType;
50
+ readonly Workspace: ComponentType<WorkspaceProps>;
51
+ readonly Document: ComponentType<DocumentViewProps>;
52
+ }
53
+ const HOST_KEY = Symbol.for('volter.editor.layout-host');
54
+ const hosts = globalThis as typeof globalThis & { [HOST_KEY]?: LayoutHost };
55
+ /** Installed once by the editor runtime; project modules share this SDK instance. */
56
+ export function registerLayoutHost(value: LayoutHost): void {
57
+ hosts[HOST_KEY] = value;
58
+ }
59
+ function currentHost(): LayoutHost {
60
+ const host = hosts[HOST_KEY];
61
+ if (!host) throw new Error('Editor layouts require an editor host.');
62
+ return host;
63
+ }
64
+ export function EditorFrame(props: LayoutFrameProps) {
65
+ return createElement(currentHost().Frame, props);
66
+ }
67
+ export function EditorHeader() {
68
+ return createElement(currentHost().Header);
69
+ }
70
+ export function EditorFooter() {
71
+ return createElement(currentHost().Footer);
72
+ }
73
+ export function Workspace(props: WorkspaceProps) {
74
+ return createElement(currentHost().Workspace, props);
75
+ }
76
+ export function DocumentView(props: DocumentViewProps) {
77
+ return createElement(currentHost().Document, props);
78
+ }
79
+
80
+ /** Full game authoring, with the running game taking over the workspace during Play. */
81
+ export function GameLayout() {
82
+ return (
83
+ <EditorFrame>
84
+ <EditorHeader />
85
+ <Workspace immersivePlay />
86
+ <EditorFooter />
87
+ </EditorFrame>
88
+ );
89
+ }
90
+ /** Studio keeps its authoring panels and opens analytics while the game runs. */
91
+ export function StudioLayout() {
92
+ return (
93
+ <EditorFrame>
94
+ <EditorHeader />
95
+ <Workspace immersivePlay={false} playUtilities={['tool:analytics.analytics']} />
96
+ <EditorFooter />
97
+ </EditorFrame>
98
+ );
99
+ }
100
+ export function DesignLayout() {
101
+ return (
102
+ <EditorFrame>
103
+ <EditorHeader />
104
+ <Workspace arrangement={DesignArrangement} immersivePlay={false} />
105
+ <EditorFooter />
106
+ </EditorFrame>
107
+ );
108
+ }
package/src/looks.ts ADDED
@@ -0,0 +1,16 @@
1
+ /** Contribution data types are owned by the project adapter contract. */
2
+ export type {
3
+ EditorKeyActionId,
4
+ KeyChord,
5
+ KeymapBindings,
6
+ KeymapContribution,
7
+ KeymapNavigation,
8
+ WorkspaceLayoutRegions,
9
+ WorkspaceLayoutContribution,
10
+ MaterialContribution,
11
+ DensityContribution,
12
+ StageContribution,
13
+ IconCategoryTone,
14
+ IconSetContribution,
15
+ StyleContribution,
16
+ } from '@volter/project/adapter/editor-looks';
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The project directories a tool may commit generated bytes into, and the one
3
+ * normalizer every writer validates a path with.
4
+ *
5
+ * A project has two of them, and the difference is what SHIPS:
6
+ *
7
+ * - `public/` — game assets. Exported, served at a root-relative URL,
8
+ * loaded by the game's own source.
9
+ * - `references/` — reference material: moodboards, style plates, generated
10
+ * stills and clips an author or an agent looks at while
11
+ * building. Ordinary files, indexed by the editor's Content
12
+ * panel like any other media, and NOT exported — the
13
+ * project's own build copies `publicDir` and nothing else.
14
+ *
15
+ * This lives in the SDK rather than beside one writer because the rule has more
16
+ * than one enforcer: the editor host's atomic project-output writer, and every
17
+ * registered provider boundary that takes an `outputDirectory` from a caller.
18
+ * Two copies of "must be under public/" is how a reference output becomes
19
+ * writable through one door and refused at the next.
20
+ */
21
+
22
+ /** The writable output roots, in the order a chooser should offer them. */
23
+ export const PROJECT_OUTPUT_ROOTS = ['public', 'references'] as const;
24
+
25
+ export type ProjectOutputRoot = (typeof PROJECT_OUTPUT_ROOTS)[number];
26
+
27
+ /** Human-readable list for an error message: `public/` or `references/`. */
28
+ function rootList(): string {
29
+ return PROJECT_OUTPUT_ROOTS.map((root) => `${root}/`).join(' or ');
30
+ }
31
+
32
+ /** POSIX-normalized, `./`-stripped, trailing-slash-stripped. */
33
+ function normalizeSlashes(path: string): string {
34
+ const slashed = path.replaceAll('\\', '/');
35
+ const segments: string[] = [];
36
+ for (const segment of slashed.split('/')) {
37
+ if (segment === '' || segment === '.') continue;
38
+ segments.push(segment);
39
+ }
40
+ return segments.join('/');
41
+ }
42
+
43
+ /** The root `path` sits under, or `undefined` when it sits under none. */
44
+ export function projectOutputRootOf(path: string): ProjectOutputRoot | undefined {
45
+ const normalized = normalizeSlashes(path);
46
+ return PROJECT_OUTPUT_ROOTS.find(
47
+ (root) => normalized === root || normalized.startsWith(`${root}/`),
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Validate and normalize a project-relative output path.
53
+ *
54
+ * Throws — with a message naming BOTH roots, because the common mistake is
55
+ * knowing about one of them — for an absolute path, an escape, a bare root
56
+ * with no file under it, or anything outside the roots above. `subject` names
57
+ * what is being validated in that message (`Generated output path`, `Fal
58
+ * outputDirectory`, …).
59
+ */
60
+ export function normalizeProjectOutputPath(
61
+ path: string,
62
+ subject = 'Generated output path',
63
+ ): string {
64
+ const normalized = normalizeSlashes(path);
65
+ const escapes = normalized.split('/').includes('..');
66
+ const root = projectOutputRootOf(normalized);
67
+ if (path.startsWith('/') || escapes || root === undefined || normalized === root) {
68
+ throw new Error(
69
+ `${subject} ${JSON.stringify(path)} is invalid; it must be a project-relative path under ${rootList()}.`,
70
+ );
71
+ }
72
+ return normalized;
73
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * THE TAB RESOURCE CENSUS — one declaration of the profile a browser tab
3
+ * reports about itself, for every compilation unit that speaks it.
4
+ *
5
+ * WHAT IT IS. What a game tab is holding: JS heap, canvas backing stores,
6
+ * renderer resource counts, and how many project mount generations the
7
+ * document has accumulated. Sampled by the page every five seconds and carried
8
+ * on the heartbeat, so that a browser-level renderer death — which the presence
9
+ * system recovers from perfectly and would otherwise leave unexplained — has a
10
+ * number beside it. MEASUREMENT ONLY: nothing anywhere enforces a budget from
11
+ * these. The page-side sampler and its `why` are
12
+ * `packages/sdk/src/kit/tab-census.ts`.
13
+ *
14
+ * WHY IT LIVES HERE. This one shape crosses every compilation unit that speaks
15
+ * it — the page that samples it (`@volter/sdk`'s kit), the editor server
16
+ * that files it and the session journal that prints it (`@volter/editor-core`'s
17
+ * node half), and the extension surface that describes the status response
18
+ * (`@volter/sdk`'s types). `@volter/sdk` is the one package all of
19
+ * them depend on. It does not belong in `@volter/game-runtime`, whose subject is
20
+ * a running game, not an editor session's tabs.
21
+ *
22
+ * Deliberately import-free so a browser bundle can take it: the census's
23
+ * journal, `editor-core/server/support/project/session-journal.ts`, reads
24
+ * `node:fs`.
25
+ *
26
+ * WHAT ELSE RIDES IT. The beat is the one channel that still moves when the
27
+ * page's main thread or a lane's worker is blocked, so `workerCalls` — how long
28
+ * each lane's worker calls are taking, keyed by the lane's own name — and
29
+ * `stalls` — how long the main thread has been stalled — are carried here too
30
+ * (absent until a lane publishes a meter). Same rule as the rest of this file:
31
+ * measurement only, no budget anywhere.
32
+ *
33
+ * ABSENT IS NOT ZERO. `heapUsedMB`/`heapLimitMB` are null off Chromium
34
+ * (`performance.memory` is non-standard). The renderer counts are ABSENT rather
35
+ * than zero when no game has registered a render-debug adapter, and `programs`
36
+ * is absent until a first render: a zero would read as "no textures", which is
37
+ * a different claim from "nobody measured".
38
+ */
39
+
40
+ /**
41
+ * ONE LANE'S WORKER CALLS, as numbers.
42
+ *
43
+ * WHY (measured 2026-09-16): one Blender call held its worker for over 1,800s
44
+ * and wedged the tab, and a 0.86s-per-call scene stretched into heartbeat
45
+ * timeouts that read as "tab present, did not respond". The product had no
46
+ * number for either. Owner ruling: a tab that stops answering is the product's
47
+ * defect regardless of what the machine is doing, and the product has to
48
+ * surface it — so these ride the census to the editor's `status` command.
49
+ *
50
+ * MEASURED BY THE PAGE, because neither blocked party can report on itself: the
51
+ * worker's own loop is what is stuck, and a stalled main thread cannot send.
52
+ * The call half is the lane's meter (`host.session.reportWorkerCallMeter`), and
53
+ * the stall half is the host's `longtask` observer.
54
+ *
55
+ * MEASUREMENT ONLY. No threshold here cancels, kills or budgets a call.
56
+ */
57
+ export interface WorkerCallTabMetrics {
58
+ /** Age of the oldest OUTSTANDING worker call, or null when the worker is idle.
59
+ * The only field with a number during a wedge. */
60
+ readonly inFlightMs: number | null;
61
+ /** Duration of the newest completed call; null before the first one. */
62
+ readonly lastCallMs: number | null;
63
+ /** The longest call this page has seen, counting an outstanding one. */
64
+ readonly maxCallMs: number | null;
65
+ /** Optional operation/boundary label supplied by the lane, without request payloads. */
66
+ readonly maxCallLabel?: string | null;
67
+ /** Current cooperative phase and count of settled wire requests; sampled, not pushed per unit. */
68
+ readonly currentPhase?: string | null;
69
+ readonly completedCalls?: number;
70
+ /** Calls past 5s, and past 30s, since this page loaded. */
71
+ readonly callsOver5s: number;
72
+ readonly callsOver30s: number;
73
+ /** The longest long task that overlapped the newest call's window — what the
74
+ * MAIN thread was doing while the worker was busy. Null when there has been
75
+ * no call yet, or no long task during it. */
76
+ readonly lastCallLongestTaskMs: number | null;
77
+ /**
78
+ * THE ENGINE'S OWN MEMORY: the lane's wasm module's linear memory in MB, read
79
+ * in its worker and posted after every call; null when the lane has none.
80
+ *
81
+ * It is here because no other number on this census answers the question.
82
+ * `heapUsedMB` is the PAGE's JS heap — a few tens of MB — while an engine's
83
+ * memory can be the larger half of the tab by far, and a reader looking at
84
+ * the heap line alone concludes the tab is cheap. wasm32 memory never
85
+ * shrinks, so this is simultaneously the current size and the session's
86
+ * high-water mark.
87
+ */
88
+ readonly wasmMemoryMB: number | null;
89
+ }
90
+
91
+ /** THE MAIN THREAD'S STALLS since page load, from the host's `longtask`
92
+ * observer, which starts when the first lane publishes a meter. */
93
+ export interface TabStallMetrics {
94
+ /** Longest `longtask` entry, in ms; null off Chromium (the Long Tasks API is
95
+ * not implemented everywhere) — never 0, which would read as "the main
96
+ * thread never stalled". */
97
+ readonly longestTaskMs: number | null;
98
+ /** How many long tasks ran past 100ms. */
99
+ readonly tasksOver100ms: number;
100
+ }
101
+
102
+ /**
103
+ * A census as a CURRENT page produces it and the server files it.
104
+ *
105
+ * Every field here is guaranteed by a producer that always writes it, and
106
+ * `packages/editor-core/server/tab-heartbeat.ts`'s `parseCensus` is where that is
107
+ * checked: a beat frame missing `canvases`, `canvasMB` or `mountEpochs` is
108
+ * rejected outright rather than filed as a partial profile.
109
+ */
110
+ export interface TabCensus {
111
+ /** `performance.memory.usedJSHeapSize` in MB; null off Chromium. */
112
+ readonly heapUsedMB: number | null;
113
+ /** `performance.memory.jsHeapSizeLimit` in MB; null off Chromium. */
114
+ readonly heapLimitMB: number | null;
115
+ /** Distinct project mount generations fetched by this document. */
116
+ readonly mountEpochs: number;
117
+ /** How many `<canvas>` elements the document holds. */
118
+ readonly canvases: number;
119
+ /** Their total pixel-buffer footprint: Σ width×height×4 bytes, in MB. */
120
+ readonly canvasMB: number;
121
+ /** `renderer.info.memory.textures` — absent with no mounted adapter. */
122
+ readonly textures?: number;
123
+ /** `renderer.info.memory.geometries` — absent with no mounted adapter. */
124
+ readonly geometries?: number;
125
+ /** Compiled programs — absent with no adapter, or before the first render. */
126
+ readonly programs?: number;
127
+ /** Each lane's {@link WorkerCallTabMetrics}, keyed by the name the lane
128
+ * published under — absent until a lane publishes a meter. */
129
+ readonly workerCalls?: Readonly<Record<string, WorkerCallTabMetrics>>;
130
+ /** {@link TabStallMetrics} — absent until the host is watching its stalls. */
131
+ readonly stalls?: TabStallMetrics;
132
+ }
133
+
134
+ /**
135
+ * A census read back out of a RECORD, where the writer may predate a field.
136
+ *
137
+ * Exactly one field varies, and this is the only place that is said: a session
138
+ * journal line written before the mount census existed has no `mountEpochs`,
139
+ * and neither does a status response from an older editor server. The
140
+ * difference is a property of the READER's input, so it is named on the
141
+ * reader's type rather than by softening {@link TabCensus} — which is what the
142
+ * four hand-copied declarations did, and how the producers' own guarantee got
143
+ * lost on the way to the two SDKs.
144
+ *
145
+ * There is no runtime narrowing to point at because neither reader has a parse
146
+ * step to put one in: the journal is `JSON.parse` per line by recorded design
147
+ * (`session-journal.ts`: "nothing reads a journal back through a validator"),
148
+ * and the CLI reads the status body as JSON. So the absence is carried in the
149
+ * type and handled where it is printed — `formatTabCensus` omits the words
150
+ * rather than printing a fabricated count. Every {@link TabCensus} is a valid
151
+ * value of this type; the reverse is not.
152
+ */
153
+ export type RecordedTabCensus = Omit<TabCensus, 'mountEpochs'> & {
154
+ readonly mountEpochs?: number;
155
+ };
@@ -0,0 +1,104 @@
1
+ export type ToolContributionPoint =
2
+ | 'workspace.document'
3
+ | 'selection.inspector'
4
+ | 'asset.inspector'
5
+ | 'generation.result'
6
+ | 'workspace.utility'
7
+ | 'workspace.analytics'
8
+ | 'workspace.status';
9
+
10
+ /**
11
+ * One contribution module, FOUND BY SCANNING — never listed anywhere.
12
+ *
13
+ * Nothing enumerates these. `editor/tools/` in project source and `src/` in every
14
+ * `volter`-declaring dependency are walked for the naming convention
15
+ * (`*.document.tsx`, `*.inspector.tsx`, `*.asset-inspector.tsx`,
16
+ * `*.result.tsx`, `*.utility.tsx`, `*.analytics.tsx`), and the module itself declares everything
17
+ * else: `point`, `title` (or `presentations`), and the `tool` it drives, by
18
+ * name. Its id is derived from this path. A manifest cannot disagree with a
19
+ * module it does not mention.
20
+ */
21
+ export interface ProjectToolContribution {
22
+ /** Project-relative or package-absolute browser module path. */
23
+ entryPath: string;
24
+ /** The dependency that declared it (`package.json#volter.contributions`),
25
+ * absent for the project's own `editor/contributions/` modules. */
26
+ package?: string;
27
+ /** The module's file, for a bundled package's entry (listed by specifier): what the
28
+ * page loads when its bundle carries no loader for it, as a checkout's bundle does
29
+ * not for a contribution added after it was built. */
30
+ filePath?: string;
31
+ }
32
+
33
+ export interface ProjectToolErrorSummary {
34
+ code: string;
35
+ summary: string;
36
+ dataSchema?: unknown;
37
+ }
38
+
39
+ export interface ProjectToolCatalogEntry {
40
+ name: string;
41
+ summary: string;
42
+ description: string;
43
+ sourcePath: string;
44
+ inputSchema: unknown;
45
+ resultSchema: unknown;
46
+ errors: ProjectToolErrorSummary[];
47
+ requires: Record<string, boolean | undefined>;
48
+ host: 'node' | 'editor-browser' | 'runtime-page';
49
+ mutates: boolean;
50
+ supportsDryRun: boolean;
51
+ longRunning: boolean;
52
+ permission: { risk: 'read' | 'write' | 'destructive'; summary: string };
53
+ generation?: { provider: string; role: 'submit' | 'poll' | 'cancel' | 'accept' };
54
+ }
55
+
56
+ export interface ProjectToolLoadError {
57
+ sourcePath: string;
58
+ message: string;
59
+ }
60
+
61
+ /**
62
+ * What a host says when it cannot load the project's TypeScript at all.
63
+ *
64
+ * ONE owner for the sentence, because two realms reach this state through
65
+ * different doors and both must say the same true thing rather than fall back
66
+ * to a fabricated empty catalog:
67
+ *
68
+ * - the NODE side (`packages/editor/server/project-tools.ts`) when a host
69
+ * builds the catalog with no `loadModule`; and
70
+ * - the PAGE side (`packages/editor/src/project-tools.ts`), whose fetch of
71
+ * `/__editor/project-tools` can be answered by an SPA FALLBACK — `200` and
72
+ * HTML — when no editor server is in front of the origin, so an unguarded
73
+ * fetch that merely checks `response.ok` reads a successful page load as a
74
+ * successful catalog, then dies in
75
+ * `res.json()`. The panel's empty state ("No project tools registered")
76
+ * is a FACT about the project; a host that cannot ask has not learned it.
77
+ */
78
+ export const NO_PROJECT_MODULE_HOST_MESSAGE =
79
+ 'This editor host cannot RUN registered project tools (package.json#volter.tools): callables ' +
80
+ 'execute on the Node side. Contribution panels still load from project source; to run the ' +
81
+ 'tools themselves, open the project in the Vite-backed dev or packaged editor.';
82
+
83
+ /** The catalog row that states {@link NO_PROJECT_MODULE_HOST_MESSAGE}. */
84
+ export function noProjectModuleHostError(): ProjectToolLoadError {
85
+ return { sourcePath: 'package.json#volter.tools', message: NO_PROJECT_MODULE_HOST_MESSAGE };
86
+ }
87
+
88
+ /**
89
+ * Callables and contribution modules are SIBLINGS, not parent and child.
90
+ *
91
+ * They used to be nested — `tools[].contributions[]` — purely so the browser
92
+ * loader had a tool to hand the component. A document is not owned by one
93
+ * callable, and the nesting made project source structurally unable to present
94
+ * a dependency-provided tool. The module names the tool it drives instead.
95
+ */
96
+ export interface ProjectToolCatalog {
97
+ tools: ProjectToolCatalogEntry[];
98
+ contributions: ProjectToolContribution[];
99
+ loadErrors: ProjectToolLoadError[];
100
+ /** The contribution suffixes the serving host scans for
101
+ * (`TOOL_CONTRIBUTION_SUFFIXES`), so a page built from another revision can
102
+ * say which half is stale. */
103
+ suffixes?: readonly string[];
104
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * W3.1 — `useSelection()`, the tool-hooks contract member about the
3
+ * currently-selected ENTITY.
4
+ *
5
+ * Scope, v1:
6
+ * - INSPECTOR-placement tools only (`placement: 'inspector'`,
7
+ * `define-tool.ts`). `EditorSelectionProvider` is host plumbing —
8
+ * `InspectorToolSection` wraps every tool render in it; dock tools
9
+ * (`ToolHost`/`BottomPanel`) have no adapter/selection in scope and never
10
+ * get a provider. Calling `useSelection()` there throws a teaching error,
11
+ * contained by the tool's `ToolErrorBoundary` (the editor survives).
12
+ * - READ-only. Write through `InspectorProvider.set` (the
13
+ * existing path), never by mutating what this hook returns. Per-entity
14
+ * WRITE-from-tool is deferred with `useTunable` (§10).
15
+ *
16
+ * Liveness — two existing paths reused, no new mechanism (§4's "reuse that
17
+ * path" rule):
18
+ * 1. Selection changes: `Inspector.tsx`'s own
19
+ * `useSyncExternalStore(store.subscribe, store.getSnapshot)` re-renders
20
+ * the panel, each matched `Section` gets the new `nodeId` prop, and
21
+ * `InspectorToolSection` re-creates this provider's context value.
22
+ * 2. Edits while the SAME node stays selected: `adapter.subscribe` fires —
23
+ * this hook keeps a local version counter bumped per notification
24
+ * (exactly `game-state.tsx`'s `useRootObservation` pattern: the adapter
25
+ * has no snapshot/version of its own, `subscribe` is fire-only) and
26
+ * recomputes.
27
+ */
28
+
29
+ import type { AuthoringAdapter, EditorNode } from '@volter/project/adapter';
30
+ import {
31
+ createContext,
32
+ type ReactNode,
33
+ useContext,
34
+ useMemo,
35
+ useRef,
36
+ useSyncExternalStore,
37
+ } from 'react';
38
+
39
+ interface SelectionContextValue {
40
+ adapter: AuthoringAdapter;
41
+ nodeId: string | null;
42
+ }
43
+
44
+ const SelectionContext = createContext<SelectionContextValue | null>(null);
45
+
46
+ /**
47
+ * EDITOR-side host plumbing: `InspectorToolSection` wraps a tool's rendered
48
+ * `<Component/>` in this, passing the adapter + nodeId it already holds.
49
+ * Project tools never render this themselves — it exists so `useSelection()`
50
+ * has something to read.
51
+ */
52
+ export function EditorSelectionProvider({
53
+ adapter,
54
+ nodeId,
55
+ children,
56
+ }: {
57
+ adapter: AuthoringAdapter;
58
+ nodeId: string | null;
59
+ children: ReactNode;
60
+ }) {
61
+ const value = useMemo(() => ({ adapter, nodeId }), [adapter, nodeId]);
62
+ return <SelectionContext.Provider value={value}>{children}</SelectionContext.Provider>;
63
+ }
64
+
65
+ export interface EditorSelection {
66
+ nodeId: string | null;
67
+ node: EditorNode | null;
68
+ }
69
+
70
+ /**
71
+ * The selected entity, live (read-only — see module doc).
72
+ *
73
+ * Throws outside an `EditorSelectionProvider` — inspector tools always render
74
+ * inside one; a dock tool or game-code caller does not, and the error names
75
+ * the fix rather than failing silently.
76
+ */
77
+ export function useSelection(): EditorSelection {
78
+ const ctx = useContext(SelectionContext);
79
+ if (!ctx) {
80
+ throw new Error(
81
+ 'useSelection: no editor selection in context — this hook only works inside an editor-hosted ' +
82
+ "INSPECTOR tool (placement: 'inspector'). Dock tools and " +
83
+ 'game code have no selection to read.',
84
+ );
85
+ }
86
+ const { adapter, nodeId } = ctx;
87
+
88
+ // Local version counter bumped per adapter notification — the adapter has
89
+ // no snapshot/version of its own, `subscribe` is fire-only (same pattern
90
+ // as `useRootObservation`'s `versionRef`, game-state.tsx).
91
+ const versionRef = useRef(0);
92
+ const version = useSyncExternalStore(
93
+ (onStoreChange) =>
94
+ adapter.subscribe?.(() => {
95
+ versionRef.current++;
96
+ onStoreChange();
97
+ }) ?? (() => {}),
98
+ () => versionRef.current,
99
+ );
100
+
101
+ return useMemo(() => {
102
+ const node = nodeId ? adapter.hierarchy.node(nodeId) : null;
103
+ return { nodeId, node };
104
+ // `version` has no value of its own — only its CHANGE matters, as the
105
+ // liveness signal described above.
106
+ }, [adapter, nodeId, version]);
107
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * THE SERVICE POINT (page side) — code a package RUNS for as long as its
3
+ * contributions are loaded (WORKBENCH.md §Contribution points, `service`):
4
+ * a page-wide guard, a worker, a listener. The module declares the point and
5
+ * exports `start`, which returns the stop; the host starts every service
6
+ * after a contribution pass and stops it before the next.
7
+ *
8
+ * `audio-unlock.service.ts`
9
+ * export const point = 'workspace.service';
10
+ * export function start(): () => void { … }
11
+ *
12
+ * A service that must run BEFORE a project opens does not belong here — it
13
+ * is the host's boot. Everything that only matters once a project's own
14
+ * packages are known does.
15
+ */
16
+ export interface ServiceContribution {
17
+ start(): (() => void) | undefined | void;
18
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Transient facts about one native project build. The report crosses the
3
+ * editor server's existing export SSE response; it is not persisted as a
4
+ * project document or sidecar. Paths are relative to the project's `dist/`.
5
+ */
6
+ /** The web build's download name: `<project-slug>-web.zip`. */
7
+ export function webBuildArtifactName(projectSlug: string): string {
8
+ return `${projectSlug}-web.zip`;
9
+ }
10
+
11
+ export interface BuildReportFile {
12
+ readonly path: string;
13
+ readonly bytes: number;
14
+ }
15
+
16
+ export interface BuildReport {
17
+ readonly artifact: string;
18
+ readonly artifactBytes: number;
19
+ readonly outputBytes: number;
20
+ readonly fileCount: number;
21
+ readonly largestFiles: readonly BuildReportFile[];
22
+ }