@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,225 @@
1
+ /** An opt-in attachment to one hosted editor. Only the existing editor HTTP
2
+ * routes cross this channel; it is neither a DOM inspector nor a shell. */
3
+ export const HOSTED_ATTACHMENT_PATH = '/__editor-hosted';
4
+ export const HOSTED_ATTACHMENT_FRAGMENT = 'volter-editor-attach';
5
+ export const HOSTED_MESSAGE_BYTES = 32 * 1024 * 1024;
6
+ export const HOSTED_REQUEST_BYTES = 1024 * 1024;
7
+
8
+ export interface HostedAttachment {
9
+ id: string;
10
+ token: string;
11
+ endpoint: string;
12
+ page: string;
13
+ expiresAt: number;
14
+ }
15
+ export interface HostedRequest {
16
+ type: 'request';
17
+ id: string;
18
+ path: string;
19
+ method: string;
20
+ body?: string;
21
+ }
22
+ export function isHostedRequest(value: unknown): value is HostedRequest {
23
+ if (!value || typeof value !== 'object') return false;
24
+ const v = value as Record<string, unknown>;
25
+ return v['type'] === 'request' && typeof v['id'] === 'string' && /^[a-zA-Z0-9-]{1,80}$/.test(v['id']) &&
26
+ typeof v['path'] === 'string' && /^\/__editor\/[a-zA-Z0-9_/?=&%.-]+$/.test(v['path']) &&
27
+ !v['path'].includes('..') && (v['method'] === 'GET' || v['method'] === 'POST') &&
28
+ (v['body'] === undefined || (typeof v['body'] === 'string' && new TextEncoder().encode(v['body']).length <= HOSTED_REQUEST_BYTES));
29
+ }
30
+
31
+ export function hostedSocketUrl(endpoint: string): string {
32
+ const url = new URL(endpoint);
33
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)))
34
+ throw new Error('Hosted attachments require HTTPS (or local loopback HTTP).');
35
+ url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
36
+ return url.href;
37
+ }
38
+
39
+ /** Client side: the SDK still issues its normal HTTP requests. Socket loss
40
+ * fails outstanding calls; a mutation is never replayed after reconnect. */
41
+ export async function connectHostedAttachment(attachment: HostedAttachment): Promise<{
42
+ fetch: typeof fetch;
43
+ state: Record<string, unknown>;
44
+ close(): void;
45
+ }> {
46
+ const socket = new WebSocket(hostedSocketUrl(attachment.endpoint));
47
+ const pending = new Map<string, { resolve(value: Response): void; reject(error: Error): void; cleanup(): void }>();
48
+ let state: Record<string, unknown> = {};
49
+ const ready = new Promise<void>((resolve, reject) => {
50
+ const timer = setTimeout(() => { reject(new Error('Hosted attachment did not answer.')); socket.close(); }, 15_000);
51
+ socket.addEventListener('open', () => socket.send(JSON.stringify({ type: 'auth', role: 'client', token: attachment.token })));
52
+ socket.addEventListener('message', event => {
53
+ try {
54
+ const value = JSON.parse(String(event.data));
55
+ if (value.type === 'ready') { state = value.state ?? {}; clearTimeout(timer); resolve(); }
56
+ else if (value.type === 'state') state = value.state ?? {};
57
+ else if (value.type === 'response') {
58
+ const call = pending.get(value.id);
59
+ if (!call) return;
60
+ pending.delete(value.id); call.cleanup();
61
+ if (value.error) call.reject(new Error(value.error));
62
+ else call.resolve(new Response([204, 205, 304].includes(value.status) ? null : value.body, {
63
+ status: value.status, headers: { 'content-type': 'application/json' },
64
+ }));
65
+ } else if (value.type === 'error') { clearTimeout(timer); reject(new Error(value.error)); socket.close(); }
66
+ } catch (error) { clearTimeout(timer); reject(error); socket.close(); }
67
+ });
68
+ socket.addEventListener('close', () => {
69
+ clearTimeout(timer); reject(new Error('Hosted attachment disconnected.'));
70
+ for (const call of pending.values()) { call.cleanup(); call.reject(new Error('Hosted attachment disconnected; the request was not replayed.')); }
71
+ pending.clear();
72
+ });
73
+ socket.addEventListener('error', () => { clearTimeout(timer); reject(new Error('Hosted attachment connection failed.')); });
74
+ });
75
+ await ready;
76
+ const remoteFetch: typeof fetch = async (input, init) => {
77
+ const request = new Request(input, init);
78
+ const url = new URL(request.url);
79
+ const message: HostedRequest = { type: 'request', id: crypto.randomUUID(), path: url.pathname + url.search, method: request.method };
80
+ if (request.body) message.body = await request.text();
81
+ if (!isHostedRequest(message)) throw new Error('Hosted attachment only carries bounded editor HTTP requests.');
82
+ request.signal.throwIfAborted();
83
+ return await new Promise<Response>((resolve, reject) => {
84
+ const abort = (): void => {
85
+ pending.delete(message.id);
86
+ if (socket.readyState === WebSocket.OPEN) socket.send(JSON.stringify({ type: 'cancel', id: message.id }));
87
+ reject(new Error('Hosted request cancelled; any completed mutation is not undone.'));
88
+ };
89
+ if (socket.readyState !== WebSocket.OPEN) { reject(new Error('Hosted attachment is disconnected.')); return; }
90
+ pending.set(message.id, { resolve, reject, cleanup: () => request.signal.removeEventListener('abort', abort) });
91
+ request.signal.addEventListener('abort', abort, { once: true });
92
+ socket.send(JSON.stringify(message));
93
+ });
94
+ };
95
+ return { fetch: remoteFetch, get state() { return state; }, close: () => socket.close() };
96
+ }
97
+
98
+ /** Hosted shell integration. The worker credential comes only from an explicit
99
+ * product attach action's URL fragment, never from a query, cookie or owner token. */
100
+ export function attachHostedEditorPage(options: {
101
+ location: Pick<Location, 'href'>;
102
+ replaceUrl(url: string): void;
103
+ }): { setState(state: Record<string, unknown>): void; serve(fetchEditor: typeof fetch): void; close(): void } | undefined {
104
+ const page = new URL(options.location.href);
105
+ const fragment = new URLSearchParams(page.hash.slice(1));
106
+ const encoded = fragment.get(HOSTED_ATTACHMENT_FRAGMENT);
107
+ if (!encoded) return undefined;
108
+ const attachment = JSON.parse(encoded) as HostedAttachment;
109
+ if (new URL(attachment.endpoint).origin !== page.origin || attachment.page !== page.origin + page.pathname + page.search)
110
+ throw new Error('Hosted attachment does not name this exact page.');
111
+ fragment.delete(HOSTED_ATTACHMENT_FRAGMENT);
112
+ page.hash = fragment.toString(); options.replaceUrl(page.href);
113
+ const socket = new WebSocket(hostedSocketUrl(attachment.endpoint));
114
+ let handler: typeof fetch | undefined;
115
+ let state: Record<string, unknown> = { phase: 'booting', page: attachment.page };
116
+ const active = new Map<string, AbortController>();
117
+ const send = (value: unknown): void => { if (socket.readyState === WebSocket.OPEN) socket.send(JSON.stringify(value)); };
118
+ socket.addEventListener('open', () => send({ type: 'auth', role: 'worker', token: attachment.token, page: attachment.page }));
119
+ socket.addEventListener('message', async event => {
120
+ try {
121
+ const message = JSON.parse(String(event.data));
122
+ if (message.type === 'ready') { send({ type: 'state', state }); return; }
123
+ if (message.type === 'cancel') { active.get(message.id)?.abort(); return; }
124
+ if (!isHostedRequest(message)) return;
125
+ if (!handler) { send({ type: 'response', id: message.id, error: 'Hosted editor is still starting.' }); return; }
126
+ const controller = new AbortController(); active.set(message.id, controller);
127
+ try {
128
+ const response = await handler(new URL(message.path, 'http://127.0.0.1'), {
129
+ method: message.method, ...(message.body === undefined ? {} : { body: message.body }),
130
+ headers: { 'content-type': 'application/json' }, signal: controller.signal,
131
+ });
132
+ const body = await response.text();
133
+ if (new TextEncoder().encode(body).length > HOSTED_MESSAGE_BYTES - 4096) throw new Error('Hosted response exceeds attachment limit.');
134
+ send({ type: 'response', id: message.id, status: response.status, body });
135
+ } catch (error) { send({ type: 'response', id: message.id, error: error instanceof Error ? error.message : String(error) }); }
136
+ finally { active.delete(message.id); }
137
+ } catch { socket.close(); }
138
+ });
139
+ const stop = (): void => { for (const controller of active.values()) controller.abort(); active.clear(); };
140
+ socket.addEventListener('close', stop);
141
+ return {
142
+ setState(value) { state = { ...value, page: attachment.page }; send({ type: 'state', state }); },
143
+ serve(fetchEditor) { handler = fetchEditor; state = { phase: 'ready', page: attachment.page }; send({ type: 'state', state }); },
144
+ close() { stop(); socket.close(); },
145
+ };
146
+ }
147
+
148
+ /** Own the exact hosted page before booting its project. Later attachment tabs
149
+ * hand their fresh worker capability to this owner, then remain idle. Detaching
150
+ * a relay does not release page ownership or unload the document. */
151
+ export async function prepareHostedEditorPage(options: {
152
+ location: Pick<Location, 'href'>;
153
+ replaceUrl(url: string): void;
154
+ }): Promise<NonNullable<ReturnType<typeof attachHostedEditorPage>> | null> {
155
+ const url = new URL(options.location.href);
156
+ const fragment = new URLSearchParams(url.hash.slice(1));
157
+ const encoded = fragment.get(HOSTED_ATTACHMENT_FRAGMENT);
158
+ const page = url.origin + url.pathname + url.search;
159
+ if (encoded) {
160
+ const capability = JSON.parse(encoded) as HostedAttachment;
161
+ if (new URL(capability.endpoint).origin !== url.origin || capability.page !== page)
162
+ throw new Error('Hosted attachment does not name this exact page.');
163
+ hostedSocketUrl(capability.endpoint);
164
+ fragment.delete(HOSTED_ATTACHMENT_FRAGMENT);
165
+ url.hash = fragment.toString(); options.replaceUrl(url.href);
166
+ }
167
+ if (!navigator.locks) throw new Error('Hosted attachment requires browser Web Locks to reuse the project tab safely.');
168
+ const channel = new BroadcastChannel(`volter-editor-hosted:${page}`);
169
+ let release!: () => void;
170
+ const lifetime = new Promise<void>(resolve => { release = resolve; });
171
+ let resolveOwner!: (owner: boolean) => void;
172
+ let rejectOwner!: (error: unknown) => void;
173
+ const acquired = new Promise<boolean>((resolve, reject) => { resolveOwner = resolve; rejectOwner = reject; });
174
+ let worker: ReturnType<typeof attachHostedEditorPage>;
175
+ let state: Record<string, unknown> = { phase: 'booting' };
176
+ let handler: typeof fetch | undefined;
177
+ let owner = false;
178
+ const connect = (credential: string): void => {
179
+ const workerUrl = new URL(page);
180
+ workerUrl.hash = new URLSearchParams({ [HOSTED_ATTACHMENT_FRAGMENT]: credential }).toString();
181
+ // Validate before replacing any existing connection. A new explicit attach
182
+ // replaces control, never the document or an in-flight mutation by replay.
183
+ const next = attachHostedEditorPage({ location: { href: workerUrl.href }, replaceUrl() {} });
184
+ worker?.close(); worker = next;
185
+ worker?.setState(state);
186
+ if (handler) worker?.serve(handler);
187
+ };
188
+ channel.onmessage = event => {
189
+ const message = event.data;
190
+ if (!owner || message?.type !== 'attach' || typeof message.id !== 'string') return;
191
+ try {
192
+ if (typeof message.credential === 'string') connect(message.credential);
193
+ channel.postMessage({ type: 'attached', id: message.id });
194
+ } catch (error) {
195
+ channel.postMessage({ type: 'refused', id: message.id, error: error instanceof Error ? error.message : String(error) });
196
+ }
197
+ };
198
+ void navigator.locks.request(`volter-editor-hosted:${page}`, { ifAvailable: true }, async lock => {
199
+ owner = Boolean(lock); resolveOwner(owner);
200
+ if (lock) await lifetime;
201
+ }).catch(rejectOwner);
202
+ try {
203
+ if (await acquired) {
204
+ if (encoded) connect(encoded);
205
+ return {
206
+ setState(value) { state = value; worker?.setState(value); },
207
+ serve(fetchEditor) { handler = fetchEditor; worker?.serve(fetchEditor); },
208
+ close() { owner = false; worker?.close(); channel.close(); release(); },
209
+ };
210
+ }
211
+ // The lock, not a timed absence of a reply, decides whether a new project
212
+ // may boot. An unresponsive owner is a refusal, never a duplicate boot.
213
+ const id = crypto.randomUUID();
214
+ await new Promise<void>((resolve, reject) => {
215
+ const timer = setTimeout(() => reject(new Error('The existing hosted editor tab did not answer. Return to that tab before attaching again.')), 5000);
216
+ channel.onmessage = event => {
217
+ if (event.data?.id !== id) return;
218
+ if (event.data.type === 'attached') { clearTimeout(timer); resolve(); }
219
+ if (event.data.type === 'refused') { clearTimeout(timer); reject(new Error(event.data.error)); }
220
+ };
221
+ channel.postMessage({ type: 'attach', id, ...(encoded ? { credential: encoded } : {}) });
222
+ });
223
+ channel.close(); return null;
224
+ } catch (error) { owner = false; worker?.close(); channel.close(); release(); throw error; }
225
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * THE LIMITED VIEW'S DOORS — what an integration declares so a project it serves can also be
3
+ * compiled into a static page (`<product> view build`, docs/LIMITED-VIEW.md).
4
+ *
5
+ * A limited view is a separate product surface, the roadmap's static authoring peer: the same
6
+ * workbench, the same product bundle and the same project modules, compiled once and served by
7
+ * any static host. Nothing in the editor asks which surface it runs in. What differs is the
8
+ * transport behind `/__editor/*`: in a session the session answers, in a limited view a service
9
+ * worker hands each request to the page, whose router answers it against the project's files in
10
+ * memory. An integration whose browser half calls routes of its own server half therefore
11
+ * declares two things:
12
+ *
13
+ * - `ProjectServingModule.viewSnapshotRoutes` (its `volter.serving` module): the GET routes
14
+ * whose answers are fixed for a build — an engine's WebAssembly, a status document. The view
15
+ * build asks a headless session for exactly these and ships the bytes it answered with.
16
+ * - `package.json#volter.viewServing`: a BROWSER module exporting `viewRoutes(services)`, the
17
+ * routes that read or write the project (`services.files`), answered in the page.
18
+ *
19
+ * Anything a limited view does not answer reads as {@link limitedViewUnavailable}: a 503 whose
20
+ * body names the feature, says it needs the person's own machine, and quotes the product's
21
+ * install command.
22
+ */
23
+
24
+ import type { StorageBackend } from '@volter/sdk/kit/storage-types';
25
+
26
+ /** The manifest key naming an integration's browser-side limited-view routes. */
27
+ export const VIEW_SERVING_DECLARATION_KEY = 'volter.viewServing';
28
+
29
+ /** The response header every limited-view refusal carries, so a reader can tell it from a
30
+ * failing route without parsing a sentence. */
31
+ export const LIMITED_VIEW_HEADER = 'x-volter-limited-view';
32
+
33
+ /** The body of a refusal: the editor's usual `{ error }`, plus what the view knows. */
34
+ export interface LimitedViewUnavailableBody {
35
+ readonly error: string;
36
+ readonly limitedView: {
37
+ /** The feature that needs the local editor, in a person's words. */
38
+ readonly unavailable: string;
39
+ /** The command that installs the local editor, from the product's declaration. */
40
+ readonly installCommand: string;
41
+ };
42
+ }
43
+
44
+ export function limitedViewUnavailableBody(
45
+ feature: string,
46
+ installCommand: string,
47
+ reason = 'it needs the editor running on your own machine',
48
+ ): LimitedViewUnavailableBody {
49
+ return {
50
+ error:
51
+ `${feature} is not available in the limited view: ${reason}. ` +
52
+ `Install the editor to use it: ${installCommand}`,
53
+ limitedView: { unavailable: feature, installCommand },
54
+ };
55
+ }
56
+
57
+ /** What the page hands an integration's view routes. */
58
+ export interface ViewServingServices {
59
+ /** The project root the editor was told it opened (`/__editor/project`'s `project.path`). */
60
+ readonly projectRoot: string;
61
+ /** The project's files, project-root relative, in memory: seeded from the view, written by
62
+ * every edit, gone on reload. */
63
+ readonly files: StorageBackend;
64
+ /** A JSON response with the headers a limited view adds to everything it answers. */
65
+ json(body: unknown, status?: number): Response;
66
+ /** The refusal for a feature this view cannot carry. */
67
+ unavailable(feature: string, reason?: string): Response;
68
+ }
69
+
70
+ export type ViewRouteMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
71
+
72
+ /** One route answered in the page. `match` is tested against the URL's pathname. */
73
+ export interface ViewRoute {
74
+ readonly method: ViewRouteMethod;
75
+ readonly match: RegExp;
76
+ handle(request: Request, url: URL): Promise<Response> | Response;
77
+ }
78
+
79
+ /** What a `volter.viewServing` module exports. */
80
+ export interface ViewServingModule {
81
+ viewRoutes(services: ViewServingServices): readonly ViewRoute[];
82
+ }
@@ -0,0 +1,24 @@
1
+ /** Project creation is executable product code, shared by its CLI and the host. */
2
+ export interface ProductCreateRequest {
3
+ name: string;
4
+ targetDir: string;
5
+ template?: string;
6
+ }
7
+ export interface ProductCreateResult {
8
+ targetDir: string;
9
+ manifest: unknown;
10
+ }
11
+ export interface ProductCreateDeclaration {
12
+ readonly product: string;
13
+ readonly templates: readonly { readonly id: string; readonly name: string; readonly description?: string }[];
14
+ create(request: ProductCreateRequest): Promise<ProductCreateResult>;
15
+ }
16
+ export function assertProductCreateDeclaration(value: unknown, source: string): ProductCreateDeclaration {
17
+ const declaration = value as Partial<ProductCreateDeclaration> | null;
18
+ if (!declaration || typeof declaration.product !== 'string' ||
19
+ typeof declaration.create !== 'function' || !Array.isArray(declaration.templates) ||
20
+ declaration.templates.some(t => typeof t?.id !== 'string' || typeof t?.name !== 'string')) {
21
+ throw new Error(`${source}: expected a product, templates and create(request) function`);
22
+ }
23
+ return declaration as ProductCreateDeclaration;
24
+ }