@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,270 @@
1
+ /**
2
+ * What a TAB reports upstream: its state snapshot, that it picked a command
3
+ * up, that a command finished, which play-boot phase it is in — plus the
4
+ * gameplay recording sink.
5
+ *
6
+ * The editor-state reporter serializes and coalesces on purpose. One user
7
+ * action can change several things at once (a Play click changes both play
8
+ * state and the active viewport), so only the newest waiting snapshot is kept
9
+ * and sends are serialized — an older, slower report can never land after a
10
+ * newer one and roll `/__editor/state` back.
11
+ */
12
+
13
+ import {
14
+ EDITOR_CLIENT_ID,
15
+ reportTabPhase,
16
+ sendCommandResultControl,
17
+ sendControl,
18
+ } from '../editor-presence';
19
+ import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
20
+ import { BASE } from '@volter/sdk/kit/api-base';
21
+
22
+ // State reports can be triggered by several browser-owned transitions at once
23
+ // (a Play click changes both play state and the active viewport, for example).
24
+ // Keep only the newest waiting snapshot and serialize sends so an older,
25
+ // slower report can never land after a newer one and roll `/__editor/state`
26
+ // back.
27
+ let pendingEditorState: Record<string, unknown> | null = null;
28
+ let editorStateReportDrain: Promise<void> | null = null;
29
+
30
+ async function drainEditorStateReports(): Promise<void> {
31
+ while (pendingEditorState) {
32
+ const state = pendingEditorState;
33
+ pendingEditorState = null;
34
+ await sendControl('state', { ...state, _clientId: EDITOR_CLIENT_ID });
35
+ }
36
+ editorStateReportDrain = null;
37
+ // A caller cannot interleave with the synchronous block above, but keep
38
+ // this defensive restart so future refactors cannot strand a late report.
39
+ if (pendingEditorState) editorStateReportDrain = drainEditorStateReports();
40
+ }
41
+
42
+ /** Report the current editor state to the server (called by command-listener). */
43
+ export function reportEditorState(state: Record<string, unknown>): Promise<void> {
44
+ pendingEditorState = state;
45
+ editorStateReportDrain ??= drainEditorStateReports();
46
+ return editorStateReportDrain;
47
+ }
48
+
49
+ /**
50
+ * Tell the server this tab PICKED UP a relayed command — sent before the work
51
+ * starts, so it says "my command listener is running", nothing about the
52
+ * outcome.
53
+ *
54
+ * Long-budget commands (`play` waits out a whole async `setup()`) used to give
55
+ * a tab that had stopped answering the control channel the same silence as a tab
56
+ * that was merely busy, and the caller waited the entire budget for a result
57
+ * that was never coming. This receipt is what separates the two — see
58
+ * `server/server-utils.ts`'s `RELAY_DELIVERY_ACK_MS`. Best-effort and
59
+ * deliberately not awaited by the caller: a lost receipt costs a fast, named
60
+ * refusal, never a wrong result.
61
+ */
62
+ export async function reportCommandReceived(requestId: string): Promise<void> {
63
+ await sendControl('command-received', { _requestId: requestId, _clientId: EDITOR_CLIENT_ID });
64
+ }
65
+
66
+ /**
67
+ * Tell the server whether this page is RUNNING a command listener at all.
68
+ *
69
+ * The receipt above answers that question one command at a time, and only
70
+ * after somebody sends a command. This answers it standing, at the two moments
71
+ * that change the answer — `connectCommandListener` attaching, and its
72
+ * teardown running — so the editor's `status` command can name a dead page on the FIRST read
73
+ * instead of it being inferable only from a command that hangs.
74
+ *
75
+ * It is worth its own message because presence cannot carry it: the control
76
+ * channel is opened by the tiny pre-React entry
77
+ * (`early-editor-presence.ts`), long before the React graph that owns the
78
+ * listener finishes loading — so a page that dies in between connects,
79
+ * beats, and executes nothing.
80
+ */
81
+ export async function reportCommandListener(attached: boolean): Promise<void> {
82
+ await sendControl('command-listener', { _clientId: EDITOR_CLIENT_ID, attached });
83
+ }
84
+
85
+ /**
86
+ * Tell the server which play-boot step this page is ENTERING.
87
+ *
88
+ * Sent before the step's work, never after it, so a step that never returns is
89
+ * still named — see `play-boot-phase.ts` for the 199.5-second block that made
90
+ * three consecutive commands time out against a session every reader called
91
+ * healthy. Not awaited by the caller: the phase is diagnostics, and diagnostics
92
+ * that can delay a boot are worse than none.
93
+ */
94
+ let phaseSequence = 0;
95
+ export function reportPlayBootPhase(state: {
96
+ phase: string | null;
97
+ at: number;
98
+ run: number;
99
+ }): void {
100
+ // Two roads, because the control socket is the PAGE's: a phase announced
101
+ // right before a synchronous block sat in the page's send queue until the
102
+ // block ended (measured 2026-09-06: a 45 s build's phase arrived after the
103
+ // build). The heartbeat worker's socket keeps beating through the block,
104
+ // so the phase rides the next beat too; whichever lands first wins.
105
+ const sequence = ++phaseSequence;
106
+ reportTabPhase(state.phase, EDITOR_CLIENT_ID, sequence);
107
+ void sendControl('play-phase', { _clientId: EDITOR_CLIENT_ID, ...state, source: EDITOR_CLIENT_ID, sequence });
108
+ }
109
+
110
+ /** Report a command result back to the server so the SDK/CLI gets the response.
111
+ * `data` carries an optional payload for commands that answer with data
112
+ * (e.g. `capture-viewport`'s base64 PNG, the debug-seam reads)
113
+ * forwarded verbatim through `/__editor/command-result` →
114
+ * `commandResponseFor` → the SDK transports, on the failure path too (where
115
+ * it carries structured `{ code: ... }` markers). */
116
+ export async function reportCommandResult(
117
+ requestId: string,
118
+ ok: boolean,
119
+ error?: string,
120
+ data?: Record<string, unknown>,
121
+ waitForCaller = false,
122
+ ): Promise<void> {
123
+ const payload = {
124
+ _requestId: requestId,
125
+ _clientId: EDITOR_CLIENT_ID,
126
+ ok,
127
+ error,
128
+ data,
129
+ };
130
+ if (waitForCaller) await sendCommandResultControl(requestId, payload);
131
+ else await sendControl('command-result', payload);
132
+ }
133
+
134
+ export interface GameplayRecordingSink {
135
+ id: string;
136
+ path: string;
137
+ format: 'composite-webm' | 'canvas-dom';
138
+ /** Directory containing `manifest.json`, `events.json`, and interned assets
139
+ * for a canvas + DOM recording. Absent for a composite WebM. */
140
+ replayPath: string | null;
141
+ /** True when this sink is the ROTATING unnamed file — the next recording
142
+ * overwrites it. False for a caller-named keepsake. */
143
+ rotates: boolean;
144
+ /** The `logs/play-*.jsonl` this project's live play run is writing, or
145
+ * `null` when nothing is logging. Its event timestamps are what map an
146
+ * event to an offset in the clip, so it travels WITH the clip's identity
147
+ * rather than being looked up separately later. */
148
+ logFile: string | null;
149
+ }
150
+
151
+ async function recordingResponse<T>(response: Response, action: string): Promise<T> {
152
+ // `.json().catch(() => ({}))` under a page fallback produced an OK-looking
153
+ // empty sink: `start` handed back a sink with no id, and every chunk after it
154
+ // posted into nothing while the recorder showed a recording in progress.
155
+ assertEditorServerAnswered(response, `gameplay recording ${action} failed`);
156
+ const body = (await response.json().catch(() => ({}))) as { error?: unknown } & T;
157
+ if (!response.ok) {
158
+ throw new Error(
159
+ `gameplay recording ${action} failed: ${typeof body.error === 'string' ? body.error : `HTTP ${response.status}`}`,
160
+ );
161
+ }
162
+ return body;
163
+ }
164
+
165
+ /** Open the server-owned, project-scoped WebM sink. Video bytes never ride the
166
+ * JSON command relay: a long QA playthrough must not hit its 50 MiB ceiling. */
167
+ export async function beginGameplayRecordingSink(
168
+ input: {
169
+ startedAt: string;
170
+ mimeType: string;
171
+ format?: 'composite-webm' | 'canvas-dom';
172
+ /** Fixed-step exports do not use the session's wall-clock playback timeline. */
173
+ purpose?: 'export';
174
+ /** During Play, `null` names the clip after the Gameplay Session; outside
175
+ * one it falls back to `play-latest.webm`. A name takes a keepsake path. */
176
+ name?: string | null;
177
+ },
178
+ signal?: AbortSignal,
179
+ ): Promise<GameplayRecordingSink> {
180
+ const response = await fetch(`${BASE}/recording/start`, {
181
+ ...(signal ? { signal } : {}),
182
+ method: 'POST',
183
+ headers: { 'content-type': 'application/json' },
184
+ body: JSON.stringify(input),
185
+ });
186
+ return recordingResponse<GameplayRecordingSink>(response, 'start');
187
+ }
188
+
189
+ /** Append an ordered batch of standard rrweb events. */
190
+ export async function appendGameplayRecordingDomEvents(
191
+ sink: GameplayRecordingSink,
192
+ sequence: number,
193
+ eventsJson: Blob,
194
+ signal?: AbortSignal,
195
+ ): Promise<void> {
196
+ const query = new URLSearchParams({ id: sink.id, sequence: String(sequence) });
197
+ const response = await fetch(`${BASE}/recording/dom?${query}`, {
198
+ ...(signal ? { signal } : {}),
199
+ method: 'POST',
200
+ // This is a streamed file body. Labeling it application/json lets the
201
+ // server's ordinary JSON middleware consume it before the route can apply
202
+ // its own byte bound, ordering, and append semantics.
203
+ headers: { 'content-type': 'application/octet-stream' },
204
+ body: eventsJson,
205
+ });
206
+ await recordingResponse<Record<string, never>>(response, 'DOM event upload');
207
+ }
208
+
209
+ /** Store one image interned out of the rrweb event stream. */
210
+ export async function appendGameplayRecordingAsset(
211
+ sink: GameplayRecordingSink,
212
+ name: string,
213
+ asset: Blob,
214
+ signal?: AbortSignal,
215
+ ): Promise<void> {
216
+ const query = new URLSearchParams({ id: sink.id, name });
217
+ const response = await fetch(`${BASE}/recording/asset?${query}`, {
218
+ ...(signal ? { signal } : {}),
219
+ method: 'POST',
220
+ headers: { 'content-type': asset.type || 'application/octet-stream' },
221
+ body: asset,
222
+ });
223
+ await recordingResponse<Record<string, never>>(response, 'replay asset upload');
224
+ }
225
+
226
+ /** Append one ordered MediaRecorder chunk to the open WebM. */
227
+ export async function appendGameplayRecordingChunk(
228
+ sink: GameplayRecordingSink,
229
+ sequence: number,
230
+ chunk: Blob,
231
+ signal?: AbortSignal,
232
+ ): Promise<void> {
233
+ const query = new URLSearchParams({ id: sink.id, sequence: String(sequence) });
234
+ const response = await fetch(`${BASE}/recording/chunk?${query}`, {
235
+ ...(signal ? { signal } : {}),
236
+ method: 'POST',
237
+ headers: { 'content-type': 'application/octet-stream' },
238
+ body: chunk,
239
+ });
240
+ await recordingResponse<Record<string, never>>(response, 'chunk upload');
241
+ }
242
+
243
+ export async function finishGameplayRecordingSink(
244
+ sink: GameplayRecordingSink,
245
+ /** What ended it — journalled verbatim beside the file it produced. */
246
+ reason?: string | null,
247
+ signal?: AbortSignal,
248
+ replay?: Record<string, unknown> | null,
249
+ ): Promise<void> {
250
+ const response = await fetch(`${BASE}/recording/finish`, {
251
+ ...(signal ? { signal } : {}),
252
+ method: 'POST',
253
+ headers: { 'content-type': 'application/json' },
254
+ body: JSON.stringify({ id: sink.id, reason: reason ?? null, replay: replay ?? null }),
255
+ });
256
+ await recordingResponse<Record<string, never>>(response, 'finish');
257
+ }
258
+
259
+ /** Deliberately NOT read through `editor-server-response.ts`: this is the
260
+ * teardown leg, called only when a recording is already being abandoned, and
261
+ * its `.catch(() => undefined)` is the contract — there is no caller left to
262
+ * report to, so asserting could only turn a silent no-op into a swallowed
263
+ * throw. */
264
+ export async function abortGameplayRecordingSink(sink: GameplayRecordingSink): Promise<void> {
265
+ await fetch(`${BASE}/recording/abort`, {
266
+ method: 'POST',
267
+ headers: { 'content-type': 'application/json' },
268
+ body: JSON.stringify({ id: sink.id }),
269
+ }).catch(() => undefined);
270
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Custom palette documents over the wire (`server/routes/themes.ts`): one
3
+ * JSON file per theme under `~/.volter/themes/` (user) and
4
+ * `<project>/.volter/themes/` (project) — both files the editor server owns.
5
+ */
6
+ import { assertEditorServerResponse, editorServerJson } from '@volter/sdk/kit/editor-server-response';
7
+ import { BASE } from '@volter/sdk/kit/api-base';
8
+ import type { SettingsLayer } from '@volter/sdk/kit/api-settings';
9
+
10
+ export interface ThemeDocumentRead {
11
+ readonly id: string;
12
+ readonly path: string;
13
+ readonly document: unknown;
14
+ }
15
+
16
+ export interface ThemeLayerRead {
17
+ readonly documents: readonly ThemeDocumentRead[];
18
+ /** Files that could not be read as JSON, spelled by path. */
19
+ readonly issues: readonly string[];
20
+ }
21
+
22
+ export async function listThemeDocuments(layer: SettingsLayer): Promise<ThemeLayerRead> {
23
+ const res = await fetch(`${BASE}/themes/${layer}`);
24
+ return editorServerJson<ThemeLayerRead>(res, `Could not list ${layer} themes`);
25
+ }
26
+
27
+ export async function saveThemeDocument(
28
+ layer: SettingsLayer,
29
+ id: string,
30
+ document: unknown,
31
+ ): Promise<void> {
32
+ const res = await fetch(`${BASE}/themes/${layer}`, {
33
+ method: 'POST',
34
+ headers: { 'Content-Type': 'application/json' },
35
+ body: JSON.stringify({ id, document }),
36
+ });
37
+ assertEditorServerResponse(res, `Could not save the ${layer} theme ${id}`);
38
+ }
39
+
40
+ export async function deleteThemeDocument(layer: SettingsLayer, id: string): Promise<void> {
41
+ const res = await fetch(`${BASE}/themes/${layer}?id=${encodeURIComponent(id)}`, {
42
+ method: 'DELETE',
43
+ });
44
+ assertEditorServerResponse(res, `Could not delete the ${layer} theme ${id}`);
45
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The asset-library wire — the shapes `/__editor/assets/*` answers with,
3
+ * declared ONCE in a leaf module both sides import (the browser client in
4
+ * `./assets.ts`, the producing routes in `../../server/asset-library-routes.ts`).
5
+ * Deliberately import-free so the server's tsconfig can reach it without
6
+ * dragging the client's whole module graph along.
7
+ */
8
+
9
+ export interface OnlineAsset {
10
+ id: string;
11
+ source: 'polyhaven' | 'ambientcg' | 'local';
12
+ name: string;
13
+ type: 'model' | 'animation' | 'source' | 'hdri' | 'texture' | 'material';
14
+ thumbnailUrl: string;
15
+ categories: string[];
16
+ tags: string[];
17
+ downloadCount?: number;
18
+ license?: string;
19
+ author?: string;
20
+ sourceUrl?: string;
21
+ cloudHosted?: boolean;
22
+ variantId?: string;
23
+ variantCount?: number;
24
+ sizeBytes?: number;
25
+ animationCount?: number;
26
+ deliveryKinds?: ('local-ssd' | 'cloud' | 'remote')[];
27
+ addedAt?: string;
28
+ capabilities?: {
29
+ previewable: boolean;
30
+ importable: boolean;
31
+ runtimeReady: boolean;
32
+ animated: boolean;
33
+ deliveryAvailable: boolean;
34
+ health: 'healthy' | 'source-only' | 'unsupported';
35
+ };
36
+ }
37
+
38
+ export interface AssetFileOption {
39
+ label: string;
40
+ format: string;
41
+ url: string;
42
+ sizeBytes?: number;
43
+ /** Additional files that must be downloaded alongside the main URL (GLTF includes). */
44
+ includes?: { relativePath: string; url: string; size: number }[];
45
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * What every `api/<family>.ts` module shares: the route prefix every
3
+ * `/__editor/*` op is written against.
4
+ *
5
+ * The session serves the editor and answers these routes (ARCHITECTURE-CORE
6
+ * §The target shape rule 5), so a family module asks no question before
7
+ * touching the network.
8
+ */
9
+
10
+ export const BASE = '/__editor';
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Producing a build, and the two catalogues the New Project screen starts one
3
+ * from: `/__editor/export`, `/__editor/examples`, `/__editor/templates`.
4
+ */
5
+
6
+ import { editorServerJson } from '@volter/sdk/kit/editor-server-response';
7
+ import { BASE } from '@volter/sdk/kit/api-base';
8
+ /** Start a build/export. Returns the raw Response for SSE streaming.
9
+ *
10
+ * Deliberately NOT read through `editor-server-response.ts`: that reader's
11
+ * rule is "the editor server answers JSON", and a successful export answers
12
+ * `text/event-stream`, which it would reject. The stream's own consumer owns
13
+ * the question here. */
14
+
15
+ /** FT-5 learner-facing metadata — mirrors the manifest's `learn` block
16
+ * (`LearnMetadataSchema`, @volter/project/manifest/schema); served merged into `GET
17
+ * /__editor/examples`. */
18
+ export interface ExampleLearnInfo {
19
+ kind: 'starter' | 'feature' | 'sample-game' | 'lesson-companion';
20
+ title: string;
21
+ summary: string;
22
+ difficulty: 'beginner' | 'intermediate' | 'advanced';
23
+ features: string[];
24
+ thumbnail?: string;
25
+ preview?: string;
26
+ lesson?: string;
27
+ }
28
+
29
+ export interface ExampleInfo {
30
+ id: string;
31
+ name: string;
32
+ /** The example's FT-5 `learn` block. REQUIRED: every shipped example
33
+ * carries one and the server omits any example that doesn't (editor and
34
+ * server ship from one repo, so there is no older server to be compatible
35
+ * with). */
36
+ learn: ExampleLearnInfo;
37
+ }
38
+
39
+ /** List `examples/<id>/` projects (Track E3, §1.F). Server mode reads the
40
+ * scaffold registry. Browser mode derives the list from what THIS build
41
+ * actually stages: the runtime bundle's per-root dispatch keys name every
42
+ * bundled example, and each one's manifest (with its FT-5 `learn` block) is
43
+ * served at `/examples/<id>/volter.project.json` — so the gallery lists
44
+ * exactly the projects `?project=<id>` can open, never a curated id that
45
+ * drifted from the build (the dead `editor-tutorial` link, measured on
46
+ * production 2026-08-27, was exactly that drift). */
47
+ export async function listExamples(): Promise<ExampleInfo[]> {
48
+ try {
49
+ const res = await fetch(`${BASE}/examples`);
50
+ const data = await editorServerJson<{ examples: ExampleInfo[] }>(
51
+ res,
52
+ `GET ${BASE}/examples failed`,
53
+ );
54
+ return data.examples;
55
+ } catch {
56
+ return [];
57
+ }
58
+ }
59
+
60
+ /** One template-registry entry (G1, FT-3): mirrors `TemplateRegistryEntry` in
61
+ * create-volter-project/templates, served by `GET /__editor/templates` from the
62
+ * same `templates.json` the CLI reads. */
63
+ export interface TemplateInfo {
64
+ id: string;
65
+ title: string;
66
+ description: string;
67
+ /** `template:<compositionId>` or `example:<exampleId>`. */
68
+ source: string;
69
+ thumbnail?: string;
70
+ /** Curated preview bullets for composition templates. Promoted examples
71
+ * derive their facts from the owning example's learn metadata. */
72
+ whatsInside?: string[];
73
+ /** A post-copy PRESENTATION of `source`'s tree. The gallery's
74
+ * "Blank" card carries `'blank'` beside the SAME `template:default` source
75
+ * the starter card uses — two cards, one template. */
76
+ presentation?: string;
77
+ }
78
+
79
+ /** Map an engine-repo-relative registry/learn thumbnail path to its server
80
+ * route without baking template or example directories into the client. */
81
+ export function learnThumbnailUrl(repoRelativePath: string): string {
82
+ // Browser-mode example thumbnails are already staged ABSOLUTE paths
83
+ // (`/examples/<id>/learn/…`) — there is no server route to proxy them.
84
+ if (repoRelativePath.startsWith('/')) return repoRelativePath;
85
+ return `${BASE}/learn-thumbnail?file=${encodeURIComponent(repoRelativePath)}`;
86
+ }
87
+
88
+ /** List the template registry. */
89
+ export async function listTemplates(): Promise<TemplateInfo[]> {
90
+ // No silent empty-list fallback and no hardcoded fallback entry in the
91
+ // wizard: editor and server ship from ONE repo, so an unreachable or
92
+ // failing `/templates` is a real defect, not version skew. Surface it.
93
+ const res = await fetch(`${BASE}/templates`);
94
+ const data = await editorServerJson<{ templates: TemplateInfo[] }>(
95
+ res,
96
+ `GET ${BASE}/templates failed`,
97
+ );
98
+ return data.templates;
99
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The git-workflow wire — the status shape `/__editor/git/*` answers with,
3
+ * declared ONCE in a leaf module both sides import (the browser client in
4
+ * `../share-control-client.ts`, the producing `../../server/git-workflow.ts`).
5
+ * Import-free so the server's tsconfig can reach it without the client's
6
+ * module graph. The share wire next door (`@volter/sdk/share`) had this
7
+ * fix applied first; the git wire in the same panel had been re-spelled
8
+ * inline, twenty lines below the header describing that fix.
9
+ */
10
+
11
+ export interface GitChangedPath {
12
+ path: string;
13
+ index: string;
14
+ worktree: string;
15
+ }
16
+
17
+ export interface GitDiffHunk {
18
+ id: string;
19
+ path: string;
20
+ staged: boolean;
21
+ header: string;
22
+ additions: number;
23
+ deletions: number;
24
+ }
25
+
26
+ export interface GitHistoryCommit {
27
+ sha: string;
28
+ shortSha: string;
29
+ author: string;
30
+ authoredAt: string;
31
+ subject: string;
32
+ }
33
+
34
+ export interface GitWorkflowStatus {
35
+ available: boolean;
36
+ repositoryId: string;
37
+ worktreeId: string;
38
+ worktreeRoot: string;
39
+ projectRelativePath: string;
40
+ branch: string | null;
41
+ headCommit: string | null;
42
+ baseRef: string | null;
43
+ upstream: string | null;
44
+ remoteUrl: string | null;
45
+ dirty: boolean;
46
+ ahead: number | null;
47
+ behind: number | null;
48
+ baseAhead: number | null;
49
+ baseBehind: number | null;
50
+ changed: GitChangedPath[];
51
+ hunks: GitDiffHunk[];
52
+ history: GitHistoryCommit[];
53
+ conflicts: string[];
54
+ rebaseInProgress: boolean;
55
+ github: boolean;
56
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Play-mode console log persistence — agent/CLI-tooling introspection, so it
3
+ * is bucketed with the CLI control channel.
4
+ */
5
+
6
+ import { assertEditorServerResponse, editorServerJson } from '@volter/sdk/kit/editor-server-response';
7
+ import { BASE } from '@volter/sdk/kit/api-base';
8
+ // ---------------------------------------------------------------------------
9
+ // Play-mode console log persistence
10
+ // ---------------------------------------------------------------------------
11
+
12
+ export interface LogEntry {
13
+ t: number;
14
+ level: string;
15
+ source?: string;
16
+ sub?: string;
17
+ msg: string;
18
+ meta?: Record<string, unknown>;
19
+ /** Engine fixed-step counter at write time —
20
+ * present only while a live play session's debug seam can be read, so
21
+ * entries correlate frame-exactly with `ctx.debug.emit` events. */
22
+ tick?: number;
23
+ /** Accumulated sim-seconds at write time — same source as `tick`. */
24
+ simT?: number;
25
+ /** The world this run was presenting when the entry was written. Present
26
+ * only once the run's roots have mounted and a world is unambiguous (see
27
+ * `play-mode.ts`'s `playLogRunStamp`) — entries written during boot, and
28
+ * runs that present no world at all, honestly carry none. */
29
+ world?: string;
30
+ /** The loop's live time scale at write time (`game.loop.timeScale`) — 1 is
31
+ * real time, 0 is paused, and an instrument can change it mid-run, which is
32
+ * exactly why it is per-entry and not in the file's identity header. */
33
+ simSpeed?: number;
34
+ }
35
+
36
+ /** Start a new log session. Returns the filename, or null on failure.
37
+ * Browser mode writes the SAME `logs/play-*.jsonl` record through the
38
+ * StorageBackend (`play-log/browser-play-log.ts`) — the Analytics utility's
39
+ * Gameplay Sessions read it, and a downloaded project carries its history —
40
+ * while a staged example/ingest stays a no-op (no storage home). */
41
+ export async function startLogSession(name?: string | null): Promise<string | null> {
42
+ try {
43
+ const res = await fetch(`${BASE}/log-session`, {
44
+ method: 'POST',
45
+ headers: { 'Content-Type': 'application/json' },
46
+ // `name` (optional — the editor's `play --name <text>` command) is passed through RAW;
47
+ // the server owns the slugifier, so there is exactly one definition of
48
+ // what the run is called on disk and in the journal.
49
+ body: JSON.stringify({ action: 'start', ...(name ? { name } : {}) }),
50
+ });
51
+ const data = await editorServerJson<{ ok: boolean; file: string }>(
52
+ res,
53
+ 'Could not start a play log session',
54
+ );
55
+ return data.file;
56
+ } catch {
57
+ return null;
58
+ }
59
+ }
60
+
61
+ /** End the current log session. Browser mode closes the storage-backed log. */
62
+ export async function endLogSession(): Promise<void> {
63
+ try {
64
+ const res = await fetch(`${BASE}/log-session`, {
65
+ method: 'POST',
66
+ headers: { 'Content-Type': 'application/json' },
67
+ body: JSON.stringify({ action: 'end' }),
68
+ });
69
+ assertEditorServerResponse(res, 'Could not end the play log session');
70
+ } catch {
71
+ /* best-effort */
72
+ }
73
+ }
74
+
75
+ /** Flush a batch of log entries. Browser mode appends to the storage-backed
76
+ * log (never a network call — this runs on a `setInterval` while Play is
77
+ * running, and a dead endpoint here is the retry-loop anti-pattern A2's SSE
78
+ * guards exist to avoid). */
79
+ export async function flushLogEntries(entries: LogEntry[]): Promise<boolean> {
80
+ if (entries.length === 0) return true;
81
+ try {
82
+ const res = await fetch(`${BASE}/log-entries`, {
83
+ method: 'POST',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify({ entries }),
86
+ });
87
+ assertEditorServerResponse(res, 'Could not flush play log entries');
88
+ return true;
89
+ } catch {
90
+ return false;
91
+ }
92
+ }