@volter/sdk 0.0.0-stage → 0.5.203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1166 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +317 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +403 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * `/__editor/compatibility` — WHICH Node process is serving this editor, and
3
+ * whether its source is still the source it started with.
4
+ *
5
+ * Every other call in `api/` assumes the answer is stable for the page's
6
+ * lifetime; `requireEditorCompatibility` is what turns "the server moved
7
+ * underneath us" into a loud error instead of a confusing one later.
8
+ */
9
+
10
+ import {
11
+ assertEditorCompatibility,
12
+ type EditorServerCompatibility,
13
+ editorServerUnavailableError,
14
+ missingCompatibilityError,
15
+ } from '@volter/sdk/session/editor-compatibility';
16
+ import { assertEditorServerResponse } from '@volter/sdk/kit/editor-server-response';
17
+ import { BASE } from '@volter/sdk/kit/api-base';
18
+
19
+ function parseEditorCompatibility(value: unknown): EditorServerCompatibility | null {
20
+ if (!value || typeof value !== 'object') return null;
21
+ const candidate = value as Partial<EditorServerCompatibility>;
22
+ if (
23
+ candidate.apiVersion !== 1 ||
24
+ (typeof candidate.engineVersion !== 'string' && candidate.engineVersion !== null) ||
25
+ typeof candidate.manifestVersion !== 'number' ||
26
+ typeof candidate.startedAt !== 'string' ||
27
+ !candidate.source ||
28
+ (candidate.source.state !== 'current' && candidate.source.state !== 'restart-required')
29
+ ) {
30
+ return null;
31
+ }
32
+ if (
33
+ candidate.source.state === 'restart-required' &&
34
+ (typeof candidate.source.changedPath !== 'string' ||
35
+ typeof candidate.source.changedAt !== 'string')
36
+ ) {
37
+ return null;
38
+ }
39
+ return candidate as EditorServerCompatibility;
40
+ }
41
+
42
+ /** Read the immutable identity of the local Node process serving this editor. */
43
+ export async function getEditorCompatibility(): Promise<EditorServerCompatibility | null> {
44
+ let res: Response;
45
+ try {
46
+ res = await fetch(`${BASE}/compatibility`, { cache: 'no-store' });
47
+ } catch (error) {
48
+ throw editorServerUnavailableError(error instanceof Error ? error.message : String(error));
49
+ }
50
+ if (res.status >= 500) throw editorServerUnavailableError(`HTTP ${res.status}`);
51
+ try {
52
+ // This route's own copy of the page-fallback discrimination predates
53
+ // `editor-server-response.ts`; the reader now owns it. `null` (not a throw)
54
+ // stays the answer for "no editor server here" — that is the whole question
55
+ // this probe exists to ask, and `requireEditorCompatibility` turns it into
56
+ // the named `missingCompatibilityError()`.
57
+ assertEditorServerResponse(res, `GET ${BASE}/compatibility`);
58
+ } catch {
59
+ return null;
60
+ }
61
+ try {
62
+ return parseEditorCompatibility(await res.json());
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+
68
+ /** Require a current handshake before any operation that activates a project. */
69
+ export async function requireEditorCompatibility(): Promise<EditorServerCompatibility> {
70
+ const identity = await getEditorCompatibility();
71
+ if (!identity) throw missingCompatibilityError();
72
+ assertEditorCompatibility(identity);
73
+ return identity;
74
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The two shared settings layers over the wire (`server/routes/settings.ts`):
3
+ * `~/.volter/settings.json` (user) and `<project>/.volter/settings.json`
4
+ * (project), both files the editor server owns.
5
+ */
6
+ import type { EditorSettings } from '@volter/project/settings/schema';
7
+ import { assertEditorServerResponse, editorServerJson } from '@volter/sdk/kit/editor-server-response';
8
+ import { BASE } from '@volter/sdk/kit/api-base';
9
+
10
+ export type SettingsLayer = 'user' | 'project';
11
+
12
+ export interface SettingsLayerRead {
13
+ readonly settings: EditorSettings;
14
+ /** Problems with the stored document, spelled for the person who owns it. */
15
+ readonly issues: readonly string[];
16
+ /** Where the layer lives, for the issue report. */
17
+ readonly path: string | null;
18
+ }
19
+
20
+ export async function loadSettingsLayer(layer: SettingsLayer): Promise<SettingsLayerRead> {
21
+ const res = await fetch(`${BASE}/settings/${layer}`);
22
+ return editorServerJson<SettingsLayerRead>(res, `Could not read ${layer} settings`);
23
+ }
24
+
25
+ export async function saveSettingsLayer(
26
+ layer: SettingsLayer,
27
+ settings: EditorSettings,
28
+ ): Promise<void> {
29
+ const body = JSON.stringify(settings, null, 2);
30
+ const res = await fetch(`${BASE}/settings/${layer}`, {
31
+ method: 'POST',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body,
34
+ });
35
+ assertEditorServerResponse(res, `Could not save ${layer} settings`);
36
+ }
@@ -0,0 +1,205 @@
1
+ /**
2
+ * The worktree board: which checkouts this repository has, which of them an
3
+ * editor is serving, and the create / open / delegate / archive / stop verbs.
4
+ */
5
+
6
+ import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
7
+ import { BASE } from '@volter/sdk/kit/api-base';
8
+ export interface EditorRepositoryParticipant {
9
+ participantId: string;
10
+ displayName: string;
11
+ kind: 'human' | 'agent';
12
+ color: string;
13
+ status: 'active' | 'idle' | 'needs-input' | 'done';
14
+ lastSeenAt: string;
15
+ agent: { harness: string; conversationId: string } | null;
16
+ changeCount: number;
17
+ }
18
+
19
+ export interface EditorRepositoryPresenceSession {
20
+ sessionId: string;
21
+ worktreeId: string;
22
+ branch: string | null;
23
+ updatedAt: string;
24
+ participants: Array<
25
+ Omit<EditorRepositoryParticipant, 'agent'> & { agent: { harness: string } | null }
26
+ >;
27
+ }
28
+
29
+ export interface EditorRepositoryPresence {
30
+ currentWorktreeId: string | null;
31
+ sessions: EditorRepositoryPresenceSession[];
32
+ }
33
+
34
+ /** Browser-safe repository directory. Unlike worktree management, this is
35
+ * available through a shared session and contains no host filesystem data. */
36
+ export async function getEditorRepositoryPresence(): Promise<EditorRepositoryPresence> {
37
+ const response = await fetch(`${BASE}/repository-presence`, { cache: 'no-store' });
38
+ // An empty presence is a MEASUREMENT ("nobody else is here"), so it may only
39
+ // be returned when the editor server said so — never when a page fallback did.
40
+ assertEditorServerAnswered(response, 'Could not read repository presence');
41
+ if (!response.ok) return { currentWorktreeId: null, sessions: [] };
42
+ const payload = (await response
43
+ .json()
44
+ .catch(() => null)) as Partial<EditorRepositoryPresence> | null;
45
+ return {
46
+ currentWorktreeId:
47
+ typeof payload?.currentWorktreeId === 'string' ? payload.currentWorktreeId : null,
48
+ sessions: Array.isArray(payload?.sessions) ? payload.sessions : [],
49
+ };
50
+ }
51
+
52
+ export interface EditorWorktreeSession {
53
+ sessionId: string | null;
54
+ port: number;
55
+ pid: number | null;
56
+ presence?: {
57
+ updatedAt: string;
58
+ participants: EditorRepositoryParticipant[];
59
+ };
60
+ }
61
+
62
+ export interface EditorWorktree {
63
+ root: string;
64
+ branch: string | null;
65
+ headCommit: string | null;
66
+ worktreeId: string;
67
+ current: boolean;
68
+ project: string | null;
69
+ dirty: boolean;
70
+ ahead: number | null;
71
+ behind: number | null;
72
+ locked: string | null;
73
+ prunable: string | null;
74
+ sessions: EditorWorktreeSession[];
75
+ }
76
+
77
+ export interface EditorBranch {
78
+ name: string;
79
+ headCommit: string;
80
+ updatedAt: number;
81
+ worktreeId: string | null;
82
+ current: boolean;
83
+ }
84
+
85
+ export interface EditorWorktreeState {
86
+ worktrees: EditorWorktree[];
87
+ branches: EditorBranch[];
88
+ }
89
+
90
+ export interface EditorSessionWorktreeIdentity {
91
+ branch: string | null;
92
+ worktreeId: string | null;
93
+ }
94
+
95
+ /** The cheap, already-owned session identity used by persistent header chrome.
96
+ * Repository-wide worktree inspection is intentionally a separate, on-demand
97
+ * operation: asking Git for every checkout's status can take seconds in a
98
+ * repository with many agent worktrees and must never sit on viewport boot. */
99
+ export async function getEditorSessionWorktreeIdentity(): Promise<EditorSessionWorktreeIdentity> {
100
+ const response = await fetch(`${BASE}/project`, { cache: 'no-store' });
101
+ assertEditorServerAnswered(response, 'Could not read this session’s worktree identity');
102
+ if (!response.ok) return { branch: null, worktreeId: null };
103
+ const payload = (await response.json().catch(() => null)) as {
104
+ session?: { branch?: unknown; worktreeId?: unknown };
105
+ } | null;
106
+ return {
107
+ branch: typeof payload?.session?.branch === 'string' ? payload.session.branch : null,
108
+ worktreeId:
109
+ typeof payload?.session?.worktreeId === 'string' ? payload.session.worktreeId : null,
110
+ };
111
+ }
112
+
113
+ async function worktreeRequest(path: string, init?: RequestInit): Promise<Record<string, unknown>> {
114
+ const response = await fetch(`${BASE}/worktrees${path}`, init);
115
+ // Every verb below reports by returning, and `.json().catch(() => null)`
116
+ // turned a page fallback into `{}` — an archive/stop/delegate that touched
117
+ // nothing, answered with an empty worktree board.
118
+ assertEditorServerAnswered(response, `Worktree operation ${path || '(list)'} failed`);
119
+ const payload = (await response.json().catch(() => null)) as Record<string, unknown> | null;
120
+ if (!response.ok) {
121
+ throw new Error(
122
+ typeof payload?.['error'] === 'string'
123
+ ? payload['error']
124
+ : `Worktree operation failed (${response.status}).`,
125
+ );
126
+ }
127
+ return payload ?? {};
128
+ }
129
+
130
+ function parseEditorWorktreeState(payload: Record<string, unknown>): EditorWorktreeState {
131
+ return {
132
+ worktrees: Array.isArray(payload['worktrees'])
133
+ ? (payload['worktrees'] as EditorWorktree[])
134
+ : [],
135
+ branches: Array.isArray(payload['branches']) ? (payload['branches'] as EditorBranch[]) : [],
136
+ };
137
+ }
138
+
139
+ /** The harnesses supercode reports able to start a delegated task here. */
140
+ export async function listDelegateHarnesses(): Promise<Array<{ id: string; label: string }>> {
141
+ const payload = await worktreeRequest('/harnesses');
142
+ return Array.isArray(payload['harnesses'])
143
+ ? (payload['harnesses'] as Array<{ id: string; label: string }>)
144
+ : [];
145
+ }
146
+
147
+ export async function listEditorWorktrees(): Promise<EditorWorktreeState> {
148
+ const payload = await worktreeRequest('');
149
+ return parseEditorWorktreeState(payload);
150
+ }
151
+
152
+ export async function openEditorWorktree(
153
+ worktreeId: string,
154
+ ): Promise<{ url: string; status: string }> {
155
+ return (await worktreeRequest('/open', {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/json' },
158
+ body: JSON.stringify({ worktreeId }),
159
+ })) as { url: string; status: string };
160
+ }
161
+
162
+ export async function createEditorWorktree(
163
+ branch: string,
164
+ from = 'HEAD',
165
+ ): Promise<{ url: string; status: string }> {
166
+ return (await worktreeRequest('/create', {
167
+ method: 'POST',
168
+ headers: { 'Content-Type': 'application/json' },
169
+ body: JSON.stringify({ branch, from }),
170
+ })) as { url: string; status: string };
171
+ }
172
+
173
+ export async function delegateEditorTask(input: {
174
+ task: string;
175
+ harness: string;
176
+ isolation: 'worktree' | 'current';
177
+ branch?: string;
178
+ from?: string;
179
+ }): Promise<Record<string, unknown>> {
180
+ return worktreeRequest('/delegate', {
181
+ method: 'POST',
182
+ headers: { 'Content-Type': 'application/json' },
183
+ body: JSON.stringify(input),
184
+ });
185
+ }
186
+
187
+ export async function archiveEditorWorktree(worktreeId: string): Promise<EditorWorktree[]> {
188
+ const payload = await worktreeRequest('/archive', {
189
+ method: 'POST',
190
+ headers: { 'Content-Type': 'application/json' },
191
+ body: JSON.stringify({ worktreeId }),
192
+ });
193
+ return parseEditorWorktreeState(payload).worktrees;
194
+ }
195
+
196
+ export async function stopEditorWorktreeSession(
197
+ worktreeId: string,
198
+ sessionId: string,
199
+ ): Promise<void> {
200
+ await worktreeRequest('/stop', {
201
+ method: 'POST',
202
+ headers: { 'Content-Type': 'application/json' },
203
+ body: JSON.stringify({ worktreeId, sessionId }),
204
+ });
205
+ }
@@ -0,0 +1,344 @@
1
+ export type AssetFormat =
2
+ | 'glb'
3
+ | 'gltf'
4
+ | 'fbx'
5
+ | 'obj'
6
+ | 'dae'
7
+ | 'stl'
8
+ | 'ply'
9
+ | 'spz'
10
+ | '3ds'
11
+ | 'bvh'
12
+ | 'blend'
13
+ | 'usd'
14
+ | 'usda'
15
+ | 'usdc'
16
+ | 'png'
17
+ | 'jpg'
18
+ | 'jpeg'
19
+ | 'webp'
20
+ | 'gif'
21
+ | 'svg'
22
+ | 'hdr'
23
+ | 'exr'
24
+ | 'mp4'
25
+ | 'webm'
26
+ | 'mp3'
27
+ | 'ogg'
28
+ | 'wav'
29
+ | 'flac'
30
+ | 'cube'
31
+ | 'glsl'
32
+ | 'vert'
33
+ | 'frag'
34
+ | 'ts'
35
+ | 'tsx'
36
+ | 'js'
37
+ | 'jsx'
38
+ | 'css'
39
+ | 'html'
40
+ | 'md'
41
+ | 'txt'
42
+ | 'mtl'
43
+ | 'csv'
44
+ | 'xml'
45
+ | 'yaml'
46
+ | 'yml'
47
+ | 'inputmap.json'
48
+ | 'data.json'
49
+ | 'json'
50
+ | 'unknown';
51
+
52
+ export type AssetImportStrategy =
53
+ | 'copy-runtime'
54
+ | 'convert-model'
55
+ | 'animation-source'
56
+ | 'copy-project'
57
+ | 'unsupported';
58
+
59
+ export type AssetCapabilityKind =
60
+ | 'model'
61
+ | 'image'
62
+ | 'video'
63
+ | 'audio'
64
+ | 'json'
65
+ | 'prefab'
66
+ | 'source'
67
+ | 'unknown';
68
+
69
+ export interface AssetCapabilities {
70
+ readonly format: AssetFormat;
71
+ readonly kind: AssetCapabilityKind;
72
+ readonly previewable: boolean;
73
+ readonly importable: boolean;
74
+ readonly runtimeReady: boolean;
75
+ readonly placeable: boolean;
76
+ readonly animated: boolean;
77
+ readonly importStrategy: AssetImportStrategy;
78
+ readonly editor:
79
+ | 'model'
80
+ | 'image'
81
+ | 'environment'
82
+ | 'video'
83
+ | 'audio'
84
+ | 'data'
85
+ | 'source'
86
+ | 'none';
87
+ }
88
+
89
+ const MODEL_PREVIEW_FORMATS = ['glb', 'gltf', 'fbx', 'obj', 'dae', 'stl', 'ply', '3ds'] as const;
90
+ const SOURCE_MODEL_FORMATS = ['blend', 'usd', 'usda', 'usdc'] as const;
91
+ const IMAGE_FORMATS = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg'] as const;
92
+ const HIGH_DYNAMIC_RANGE_FORMATS = ['hdr', 'exr'] as const;
93
+ const AUDIO_FORMATS = ['mp3', 'ogg', 'wav', 'flac'] as const;
94
+ /** Clip formats a browser plays natively. Reference material (a generated
95
+ * motion study, a captured plate) is the common case, and a video is NOT a
96
+ * runtime-ready game asset: nothing in a scene places one, so `placeable`
97
+ * and `runtimeReady` stay false and the row's whole job is to be seen. */
98
+ const VIDEO_FORMATS = ['mp4', 'webm'] as const;
99
+ const COLOR_GRADE_FORMATS = ['cube'] as const;
100
+ const SHADER_SOURCE_FORMATS = ['glsl', 'vert', 'frag'] as const;
101
+ const TEXT_SOURCE_FORMATS = [
102
+ 'txt',
103
+ 'md',
104
+ 'ts',
105
+ 'tsx',
106
+ 'js',
107
+ 'jsx',
108
+ 'css',
109
+ 'html',
110
+ 'mtl',
111
+ 'csv',
112
+ 'xml',
113
+ 'yaml',
114
+ 'yml',
115
+ ] as const;
116
+
117
+ function row(
118
+ format: AssetFormat,
119
+ values: Omit<AssetCapabilities, 'format'>,
120
+ ): readonly [AssetFormat, AssetCapabilities] {
121
+ return [format, { format, ...values }];
122
+ }
123
+
124
+ const MODEL_SOURCE_BASE = {
125
+ kind: 'source',
126
+ previewable: true,
127
+ importable: true,
128
+ runtimeReady: false,
129
+ placeable: false,
130
+ animated: false,
131
+ importStrategy: 'convert-model',
132
+ editor: 'model',
133
+ } as const;
134
+
135
+ export const ASSET_CAPABILITY_REGISTRY: ReadonlyMap<AssetFormat, AssetCapabilities> = new Map([
136
+ ...MODEL_PREVIEW_FORMATS.map((format) =>
137
+ row(format, {
138
+ ...MODEL_SOURCE_BASE,
139
+ kind: format === 'glb' || format === 'gltf' ? 'model' : 'source',
140
+ runtimeReady: format === 'glb' || format === 'gltf',
141
+ placeable: format === 'glb' || format === 'gltf',
142
+ importStrategy: format === 'glb' || format === 'gltf' ? 'copy-runtime' : 'convert-model',
143
+ }),
144
+ ),
145
+ row('spz', {
146
+ kind: 'model',
147
+ previewable: true,
148
+ importable: true,
149
+ runtimeReady: true,
150
+ placeable: true,
151
+ animated: false,
152
+ importStrategy: 'copy-runtime',
153
+ editor: 'model',
154
+ }),
155
+ row('bvh', {
156
+ kind: 'source',
157
+ previewable: true,
158
+ importable: true,
159
+ runtimeReady: false,
160
+ placeable: false,
161
+ animated: true,
162
+ importStrategy: 'animation-source',
163
+ editor: 'model',
164
+ }),
165
+ ...SOURCE_MODEL_FORMATS.map((format) =>
166
+ row(format, { ...MODEL_SOURCE_BASE, previewable: false, editor: 'source' }),
167
+ ),
168
+ ...IMAGE_FORMATS.map((format) =>
169
+ row(format, {
170
+ kind: 'image',
171
+ previewable: true,
172
+ importable: true,
173
+ runtimeReady: true,
174
+ placeable: false,
175
+ animated: format === 'gif',
176
+ importStrategy: 'copy-project',
177
+ editor: 'image',
178
+ }),
179
+ ),
180
+ ...HIGH_DYNAMIC_RANGE_FORMATS.map((format) =>
181
+ row(format, {
182
+ kind: 'image',
183
+ previewable: true,
184
+ importable: true,
185
+ runtimeReady: true,
186
+ placeable: false,
187
+ animated: false,
188
+ importStrategy: 'copy-project',
189
+ editor: 'environment',
190
+ }),
191
+ ),
192
+ ...AUDIO_FORMATS.map((format) =>
193
+ row(format, {
194
+ kind: 'audio',
195
+ previewable: true,
196
+ importable: true,
197
+ runtimeReady: true,
198
+ placeable: false,
199
+ animated: false,
200
+ importStrategy: 'copy-project',
201
+ editor: 'audio',
202
+ }),
203
+ ),
204
+ ...VIDEO_FORMATS.map((format) =>
205
+ row(format, {
206
+ kind: 'video',
207
+ previewable: true,
208
+ importable: true,
209
+ runtimeReady: false,
210
+ placeable: false,
211
+ animated: true,
212
+ importStrategy: 'copy-project',
213
+ editor: 'video',
214
+ }),
215
+ ),
216
+ ...COLOR_GRADE_FORMATS.map((format) =>
217
+ row(format, {
218
+ kind: 'source',
219
+ previewable: true,
220
+ importable: true,
221
+ runtimeReady: true,
222
+ placeable: false,
223
+ animated: false,
224
+ importStrategy: 'copy-project',
225
+ editor: 'source',
226
+ }),
227
+ ),
228
+ ...SHADER_SOURCE_FORMATS.map((format) =>
229
+ row(format, {
230
+ kind: 'source',
231
+ previewable: true,
232
+ importable: true,
233
+ runtimeReady: true,
234
+ placeable: false,
235
+ animated: false,
236
+ importStrategy: 'copy-project',
237
+ editor: 'source',
238
+ }),
239
+ ),
240
+ ...TEXT_SOURCE_FORMATS.map((format) =>
241
+ row(format, {
242
+ kind: 'source',
243
+ previewable: true,
244
+ importable: true,
245
+ runtimeReady: false,
246
+ placeable: false,
247
+ animated: false,
248
+ importStrategy: 'copy-project',
249
+ editor: 'source',
250
+ }),
251
+ ),
252
+ row('inputmap.json', {
253
+ kind: 'json',
254
+ previewable: true,
255
+ importable: true,
256
+ runtimeReady: true,
257
+ placeable: false,
258
+ animated: false,
259
+ importStrategy: 'copy-project',
260
+ editor: 'data',
261
+ }),
262
+ row('data.json', {
263
+ kind: 'json',
264
+ previewable: true,
265
+ importable: true,
266
+ runtimeReady: true,
267
+ placeable: false,
268
+ animated: false,
269
+ importStrategy: 'copy-project',
270
+ editor: 'data',
271
+ }),
272
+ row('json', {
273
+ kind: 'json',
274
+ previewable: true,
275
+ importable: true,
276
+ runtimeReady: false,
277
+ placeable: false,
278
+ animated: false,
279
+ importStrategy: 'copy-project',
280
+ editor: 'data',
281
+ }),
282
+ ]);
283
+
284
+ const UNKNOWN_CAPABILITIES: AssetCapabilities = {
285
+ format: 'unknown',
286
+ kind: 'unknown',
287
+ previewable: false,
288
+ importable: false,
289
+ runtimeReady: false,
290
+ placeable: false,
291
+ animated: false,
292
+ importStrategy: 'unsupported',
293
+ editor: 'none',
294
+ };
295
+
296
+ export function assetFormatFromPath(path: string): AssetFormat {
297
+ const clean = path.split(/[?#]/, 1)[0]!.toLowerCase();
298
+ for (const compound of ['inputmap.json', 'data.json'] as const) {
299
+ if (clean.endsWith(`.${compound}`)) return compound;
300
+ }
301
+ const dot = clean.lastIndexOf('.');
302
+ const extension = dot >= 0 ? clean.slice(dot + 1) : '';
303
+ return ASSET_CAPABILITY_REGISTRY.has(extension as AssetFormat)
304
+ ? (extension as AssetFormat)
305
+ : extension === 'json'
306
+ ? 'json'
307
+ : 'unknown';
308
+ }
309
+
310
+ export function assetCapabilities(pathOrFormat: string): AssetCapabilities {
311
+ const direct = ASSET_CAPABILITY_REGISTRY.get(pathOrFormat.toLowerCase() as AssetFormat);
312
+ if (direct) return direct;
313
+ return ASSET_CAPABILITY_REGISTRY.get(assetFormatFromPath(pathOrFormat)) ?? UNKNOWN_CAPABILITIES;
314
+ }
315
+
316
+ export function supportedAssetFormats(): readonly AssetFormat[] {
317
+ return [...ASSET_CAPABILITY_REGISTRY.keys()];
318
+ }
319
+
320
+ /** Editor document kind for a capability row; null means no honest editor exists. */
321
+ export function assetDocumentKind(
322
+ capability: AssetCapabilities,
323
+ ): 'model' | 'image' | 'video' | 'audio' | 'json' | 'source' | null {
324
+ switch (capability.editor) {
325
+ case 'model':
326
+ return 'model';
327
+ case 'image':
328
+ return 'image';
329
+ case 'environment':
330
+ // Workspace persistence needs only the broad asset kind. The path and
331
+ // capability registry recover the native HDR/EXR viewer on restore.
332
+ return 'image';
333
+ case 'video':
334
+ return 'video';
335
+ case 'audio':
336
+ return 'audio';
337
+ case 'data':
338
+ return 'json';
339
+ case 'source':
340
+ return 'source';
341
+ default:
342
+ return null;
343
+ }
344
+ }