@volter/sdk 0.0.0-stage → 0.5.204

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1168 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +329 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +669 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,14 @@
1
+ /** Browser fetch owns connections and has no Node header timeout. */
2
+ import type { Dispatcher } from 'undici';
3
+
4
+ export function createDispatcher(_timeoutMs: number): undefined {
5
+ return undefined;
6
+ }
7
+
8
+ export function dispatchFetch(
9
+ url: string,
10
+ init?: RequestInit,
11
+ _dispatcher?: Dispatcher,
12
+ ): Promise<Response> {
13
+ return fetch(url, init);
14
+ }
@@ -0,0 +1,19 @@
1
+ /** Node session clients need explicit header deadlines for long modeling calls.
2
+ * Some runtimes supply an undici-compatible Agent without destroy(); callers
3
+ * close explicitly when that lifecycle method exists. */
4
+ import { Agent, fetch as nodeFetch, type Dispatcher } from 'undici';
5
+
6
+ export function createDispatcher(timeoutMs: number): Dispatcher {
7
+ return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
8
+ }
9
+
10
+ export async function dispatchFetch(
11
+ url: string,
12
+ init?: RequestInit,
13
+ dispatcher?: Dispatcher,
14
+ ): Promise<Response> {
15
+ if (!dispatcher) return fetch(url, init);
16
+ return await nodeFetch(url, {
17
+ ...(init as object), dispatcher,
18
+ }) as unknown as Response;
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1,131 @@
1
+ export type {
2
+ GenerationBilling,
3
+ GenerationJob,
4
+ GenerationJobStatus,
5
+ GenerationJobsDocument,
6
+ } from '@volter/sdk/generations';
7
+ export type {
8
+ EditorEnvelopeObservation,
9
+ GameDebugDoor,
10
+ HistoryStep,
11
+ OpenedDocument,
12
+ } from './client.js';
13
+ export { EditorClient, EditorCommandError } from './client.js';
14
+ export type {
15
+ ToolAssetInspectorContributionMatch,
16
+ ToolAssetInspectorContributionProps,
17
+ ToolContributionAsset,
18
+ ToolContributionNode,
19
+ ToolContributionProps,
20
+ ToolGenerationResultContributionProps,
21
+ ToolInspectorContributionMatch,
22
+ ToolInspectorContributionProps,
23
+ } from './contributions.js';
24
+ export type {
25
+ DocumentClickStep,
26
+ DocumentKeyStep,
27
+ DocumentPasteStep,
28
+ DocumentProbeResult,
29
+ DocumentProbeScope,
30
+ DocumentProbeStep,
31
+ DocumentQueryStep,
32
+ DocumentSelectStep,
33
+ DocumentTypeStep,
34
+ ProbedElement,
35
+ } from './document-probe.js';
36
+ export { EDITOR_VIEW_DIAGNOSTICS, editorViewFromUrl, editorViewUrl } from './editor-view.js';
37
+ export type { ExtensionContributionState } from './extension.js';
38
+ export type {
39
+ ActiveDocumentCapture,
40
+ AssetCompareCapture,
41
+ AssetCompareOptions,
42
+ AssetCompareView,
43
+ AssetKind,
44
+ AssetPreviewBackground,
45
+ AssetPreviewCameraChoice,
46
+ AssetPreviewCapture,
47
+ AssetPreviewOptions,
48
+ AssetPreviewOrientation,
49
+ AssetPreviewPose,
50
+ AssetPreviewShotSetDefinition,
51
+ AssetPreviewShotWarning,
52
+ AssetPreviewSource,
53
+ AssetPreviewStage,
54
+ AssetPreviewView,
55
+ CaptureDimensions,
56
+ DocumentCameraPose,
57
+ DocumentLookOutcome,
58
+ StageFrameCostReading,
59
+ DocumentTableEntryProjection,
60
+ DocumentTableProjection,
61
+ EditorCameraState,
62
+ EditorChromeCapture,
63
+ EditorChromeCaptureOptions,
64
+ EditorEntitySummary,
65
+ EditorState,
66
+ EditorView,
67
+ EditorViewBuiltInUtilityId,
68
+ EditorViewDocument,
69
+ EditorViewUtility,
70
+ EditorWorkspaceName,
71
+ GameCapture,
72
+ GameplayRecordingCapture,
73
+ GameplayRecordingOptions,
74
+ GameplayRecordingStarted,
75
+ GameplayRecordingTimeline,
76
+ GameplayReplayCapture,
77
+ HelperVisibility,
78
+ InspectedAction,
79
+ InspectedField,
80
+ InspectedFieldWrite,
81
+ InspectedHierarchy,
82
+ InspectedHierarchyRow,
83
+ InspectedInspection,
84
+ InspectedNothing,
85
+ InspectedSection,
86
+ InspectedSectionBody,
87
+ InspectedSubject,
88
+ InspectedWriteDestination,
89
+ InspectionPresentationKind,
90
+ InspectionSurface,
91
+ LabeledShotSetCapture,
92
+ ModelPlayLogEntry,
93
+ ModelPlayLogReading,
94
+ PlayRecordingStatus,
95
+ PlayStarted,
96
+ PresentedEditorView,
97
+ ProjectInfo,
98
+ ProjectTemplate,
99
+ ProjectToolCatalog,
100
+ ProjectToolCatalogEntry,
101
+ ProjectToolContribution,
102
+ ProjectToolOutcome,
103
+ RecentProject,
104
+ ShadingMode,
105
+ ShotSetPoseMorph,
106
+ ShotSetPoseRotation,
107
+ ShotSetPoseStep,
108
+ ShotSetPoseTranslation,
109
+ ShotSetShot,
110
+ StoryCaptureOptions,
111
+ StoryVariantCapture,
112
+ StoryVariantImage,
113
+ StructureOp,
114
+ StructureOpOptions,
115
+ StructureOpResult,
116
+ TransformMode,
117
+ TransformSpace,
118
+ Vec3Value,
119
+ ViewPreset,
120
+ ViewportCapture,
121
+ ViewportTab,
122
+ } from './types.js';
123
+ export {
124
+ EDITOR_VIEW_BUILT_IN_UTILITY_IDS,
125
+ EDITOR_VIEW_DOCUMENT_KINDS,
126
+ EDITOR_VIEW_KEYS,
127
+ EDITOR_VIEW_TOOL_UTILITY_PREFIX,
128
+ EDITOR_VIEW_WORKSPACE_DOCUMENT_IDS,
129
+ isEditorViewDocumentKind,
130
+ isEditorViewUtility,
131
+ } from './types.js';
@@ -0,0 +1,185 @@
1
+ /**
2
+ * The human-facing projection of the ingest coverage report.
3
+ *
4
+ * The report is derived in `coverage/capability-coverage.ts`; this component never
5
+ * re-measures or reinterprets a seam. It only gives the same rows already
6
+ * exposed by the editor's `status` command and the console an Inspector-shaped reading: the
7
+ * measured fact first, then the consequence and the concrete fix for gaps.
8
+ */
9
+
10
+ import {
11
+ faChartSimple,
12
+ faCircleCheck,
13
+ faCircleExclamation,
14
+ faCircleInfo,
15
+ faCircleMinus,
16
+ } from '@fortawesome/free-solid-svg-icons';
17
+ import type { LiveCoverageReport, LiveCoverageRow } from '@volter/sdk/host';
18
+ import { EditorIcon, SectionHeader, themeVars } from '@volter/sdk/widgets';
19
+ import type { ReactNode } from 'react';
20
+ import type { InspectionSection } from '@volter/sdk/kit/inspection-model';
21
+
22
+ /**
23
+ * Human labels for the seams whose names are not self-describing — the contract
24
+ * declarations an ingested game makes.
25
+ *
26
+ * The `editor.*` and `system.*` families are deliberately NOT listed: those are
27
+ * generated from the `AuthoringAdapter` / `SystemAdapters` contracts, and a
28
+ * hand-written label map over a generated family is the same defect the
29
+ * generator exists to remove — the map would silently miss whichever seam
30
+ * nobody remembered, in the one surface a human reads. They are humanized from
31
+ * the seam name instead, which cannot go stale.
32
+ */
33
+ const CONTRACT_SEAM_LABEL: Partial<Record<string, string>> = {
34
+ loop: 'Loop control',
35
+ 'contract.root': 'DOM root',
36
+ 'contract.lifecycle.start': 'Cold start',
37
+ 'contract.lifecycle.pause': 'Pause / resume',
38
+ persistence: 'Source persistence',
39
+ systems: 'Commands and state',
40
+ };
41
+
42
+ /** `editor.assetDrop` → "Asset drop"; `system.renderDebug` → "Render debug
43
+ * adapter". Presentation only — the seam name itself stays the id. */
44
+ function seamLabel(seam: string): string {
45
+ const explicit = CONTRACT_SEAM_LABEL[seam];
46
+ if (explicit) return explicit;
47
+ const [family, member] = seam.split('.');
48
+ const words = (member ?? seam).replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
49
+ const sentence = words.charAt(0).toUpperCase() + words.slice(1);
50
+ return family === 'system' ? `${sentence} adapter` : sentence;
51
+ }
52
+
53
+ const STATUS_ICON = {
54
+ ok: faCircleCheck,
55
+ gap: faCircleExclamation,
56
+ na: faCircleMinus,
57
+ info: faCircleInfo,
58
+ } as const;
59
+
60
+ const STATUS_COLOR = {
61
+ ok: themeVars.semantic.success,
62
+ gap: themeVars.semantic.warning,
63
+ na: themeVars.content.dim,
64
+ info: themeVars.content.dim,
65
+ } as const;
66
+
67
+ function CoverageRow({ row }: { readonly row: LiveCoverageRow }) {
68
+ return (
69
+ <div
70
+ data-testid={`ingest-coverage-row-${row.seam}`}
71
+ data-status={row.status}
72
+ style={{
73
+ display: 'grid',
74
+ gridTemplateColumns: '16px minmax(0, 1fr)',
75
+ gap: 7,
76
+ padding: '8px 10px',
77
+ borderTop: '1px solid var(--volter-structural-divider)',
78
+ }}
79
+ >
80
+ <span style={{ color: STATUS_COLOR[row.status], paddingTop: 1 }}>
81
+ <EditorIcon icon={STATUS_ICON[row.status]} />
82
+ </span>
83
+ <div style={{ minWidth: 0 }}>
84
+ <div style={{ color: themeVars.content.primary, fontWeight: 600 }}>
85
+ {seamLabel(row.seam)}
86
+ </div>
87
+ <div
88
+ style={{
89
+ marginTop: 2,
90
+ color: themeVars.content.muted,
91
+ lineHeight: 1.4,
92
+ overflowWrap: 'anywhere',
93
+ }}
94
+ >
95
+ {row.detail}
96
+ </div>
97
+ {row.missing && (
98
+ <div style={{ marginTop: 6, color: themeVars.content.muted, lineHeight: 1.4 }}>
99
+ <strong style={{ color: themeVars.semantic.warning }}>Missing:</strong> {row.missing}
100
+ </div>
101
+ )}
102
+ {row.fix && (
103
+ <div style={{ marginTop: 4, color: themeVars.content.dim, lineHeight: 1.4 }}>
104
+ <strong>Fix:</strong> {row.fix}
105
+ </div>
106
+ )}
107
+ </div>
108
+ </div>
109
+ );
110
+ }
111
+
112
+ export function CapabilityCoverageBody({ report }: { readonly report: LiveCoverageReport }) {
113
+ const { summary } = report;
114
+ return (
115
+ <div data-testid="ingest-coverage-report" style={{ fontSize: 'var(--volter-font-base)' }}>
116
+ <div
117
+ style={{
118
+ display: 'flex',
119
+ flexWrap: 'wrap',
120
+ gap: 8,
121
+ padding: '7px 10px 9px',
122
+ color: themeVars.content.muted,
123
+ }}
124
+ >
125
+ <span
126
+ style={{
127
+ color: summary.gaps > 0 ? themeVars.semantic.warning : themeVars.semantic.success,
128
+ }}
129
+ >
130
+ {summary.gaps} {summary.gaps === 1 ? 'gap' : 'gaps'}
131
+ </span>
132
+ <span>{summary.ok} integrated</span>
133
+ <span>{summary.na} not applicable</span>
134
+ <span>{summary.info} informational</span>
135
+ </div>
136
+ {report.rows.map((row) => (
137
+ <CoverageRow key={row.seam} row={row} />
138
+ ))}
139
+ </div>
140
+ );
141
+ }
142
+
143
+ /** Add the report to an ordinary composed inspection subject. The stable id
144
+ * means the compact Inspector keeps the same tab open while measurements
145
+ * refresh; sorting keeps the projection content-agnostic. */
146
+ export function ingestCoverageSection(report: LiveCoverageReport): InspectionSection {
147
+ return {
148
+ id: 'ingest-coverage',
149
+ title: 'Ingest coverage',
150
+ icon: faChartSimple,
151
+ order: 9_000,
152
+ description: `${report.summary.gaps} gap${report.summary.gaps === 1 ? '' : 's'}`,
153
+ defaultOpen: true,
154
+ testId: 'ingest-coverage-section',
155
+ body: {
156
+ kind: 'custom',
157
+ render: (): ReactNode => <CapabilityCoverageBody report={report} />,
158
+ // `editor.inspect()` cannot render React. Publish exactly what this body
159
+ // displays so the agent and the human read the same report through the
160
+ // Inspector rather than forcing the agent back to a parallel status
161
+ // shape.
162
+ data: { summary: report.summary, rows: report.rows },
163
+ },
164
+ };
165
+ }
166
+
167
+ /** The nothing-to-author Inspector has no composed subject/section list, so it uses
168
+ * the same section as a directly headed block instead of inventing a second
169
+ * presentation for the report. */
170
+ export function CapabilityCoverageBlock({ report }: { readonly report: LiveCoverageReport }) {
171
+ const section = ingestCoverageSection(report);
172
+ return (
173
+ <div data-testid={section.testId}>
174
+ <SectionHeader
175
+ label={section.title}
176
+ icon={section.icon}
177
+ description={section.description}
178
+ collapsible
179
+ defaultOpen
180
+ >
181
+ <CapabilityCoverageBody report={report} />
182
+ </SectionHeader>
183
+ </div>
184
+ );
185
+ }
@@ -0,0 +1,333 @@
1
+ import type {
2
+ AccountCatalog,
3
+ AccountSpendPolicy,
4
+ AccountUsageEntry,
5
+ EditorAccountSnapshot,
6
+ GenerationAccountProjection,
7
+ GenerationExecutionRoute,
8
+ ProviderCredentialId,
9
+ ProviderCredentialTestResult,
10
+ } from '@volter/sdk/account';
11
+ import {
12
+ AccountCatalogSchema,
13
+ AccountUsageEntrySchema,
14
+ EditorAccountSnapshotSchema,
15
+ generationAccountProjection,
16
+ ProviderCredentialTestResultSchema,
17
+ } from '@volter/sdk/account';
18
+ import { assertEditorServerAnswered } from '@volter/sdk/kit/editor-server-response';
19
+ import { COLLABORATION_REMOTE_SHARE } from '@volter/sdk/kit/editor-session-attribution';
20
+
21
+ const EMPTY: EditorAccountSnapshot = {
22
+ authenticated: false,
23
+ backend: 'mock',
24
+ accountEnvironment: 'test-mock',
25
+ routes: { mock: true, managed: false, byok: false, byokProviders: [] },
26
+ preferredRoute: 'auto',
27
+ providerCredentials: [],
28
+ codingInference: { enabled: false, provider: 'openrouter', model: 'z-ai/glm-5.2' },
29
+ };
30
+ let snapshot: EditorAccountSnapshot = EMPTY;
31
+ let version = 0;
32
+ let error: string | null = null;
33
+ const listeners = new Set<() => void>();
34
+
35
+ function publish(next: EditorAccountSnapshot, nextError: string | null = null) {
36
+ // Polling identical state must not invalidate every contribution. Parsed
37
+ // snapshots have the schema's stable field order; errors are state too.
38
+ if (error === nextError && JSON.stringify(snapshot) === JSON.stringify(next)) return;
39
+ snapshot = next;
40
+ error = nextError;
41
+ version++;
42
+ for (const listener of listeners) listener();
43
+ }
44
+
45
+ // Every route below reads the account service's OWN `{ error }` body on a
46
+ // non-OK status (that string is the user-facing message — "Insufficient
47
+ // credits", not "402"), so each one asserts only that the EDITOR SERVER
48
+ // answered, before parsing. See `editor-server-response.ts`.
49
+ async function responseSnapshot(response: Response, what: string): Promise<EditorAccountSnapshot> {
50
+ assertEditorServerAnswered(response, what);
51
+ const body = (await response.json()) as EditorAccountSnapshot | { error?: unknown };
52
+ if (!response.ok) {
53
+ throw new Error(
54
+ typeof (body as { error?: unknown }).error === 'string'
55
+ ? String((body as { error?: unknown }).error)
56
+ : `Account request failed (${response.status}).`,
57
+ );
58
+ }
59
+ return EditorAccountSnapshotSchema.parse(body);
60
+ }
61
+
62
+ async function mutate(path: string, method: 'POST' | 'PUT' | 'DELETE', body?: unknown) {
63
+ const response = await fetch(path, {
64
+ method,
65
+ ...(body === undefined
66
+ ? {}
67
+ : { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }),
68
+ });
69
+ const next = await responseSnapshot(response, `${method} ${path} failed`);
70
+ publish(next);
71
+ return next;
72
+ }
73
+
74
+ export function accountSnapshot(): EditorAccountSnapshot {
75
+ return snapshot;
76
+ }
77
+ /** The deliberately narrow, non-PII account view exposed to project code. */
78
+ export function contributionAccount(): GenerationAccountProjection {
79
+ return generationAccountProjection(snapshot);
80
+ }
81
+ export function accountVersion(): number {
82
+ return version;
83
+ }
84
+ export function accountError(): string | null {
85
+ return error;
86
+ }
87
+ export function subscribeAccount(listener: () => void): () => void {
88
+ listeners.add(listener);
89
+ return () => listeners.delete(listener);
90
+ }
91
+ export async function refreshAccount(): Promise<EditorAccountSnapshot> {
92
+ try {
93
+ const next = await responseSnapshot(await fetch('/__editor/account'), 'Account read failed');
94
+ publish(next);
95
+ return next;
96
+ } catch (cause) {
97
+ publish(snapshot, cause instanceof Error ? cause.message : String(cause));
98
+ throw cause;
99
+ }
100
+ }
101
+ export const signInMockAccount = (email: string) =>
102
+ mutate('/__editor/account/mock-session', 'POST', { email });
103
+ export const signInTwinAccount = (email: string) =>
104
+ mutate('/__editor/account/twin-session', 'POST', { email });
105
+ export const signOutAccount = () => mutate('/__editor/account/session', 'DELETE');
106
+ export const updateAccountSpendPolicy = (policy: AccountSpendPolicy) =>
107
+ mutate('/__editor/account/spend-policy', 'PUT', policy);
108
+ export const markAccountAlertsRead = () => mutate('/__editor/account/alerts/read', 'POST');
109
+ export const updatePreferredGenerationRoute = (route: GenerationExecutionRoute) =>
110
+ mutate('/__editor/account/execution-route', 'PUT', { route });
111
+ export const updateCodingInference = (input: EditorAccountSnapshot['codingInference']) =>
112
+ mutate('/__editor/account/coding-inference', 'PUT', input);
113
+ export async function quoteCodingInference(input: {
114
+ model: string;
115
+ promptTokens: number;
116
+ outputTokens: number;
117
+ }): Promise<{
118
+ model: string;
119
+ promptTokens: number;
120
+ outputTokens: number;
121
+ providerAmountUsd: number;
122
+ estimatedCredits: number;
123
+ }> {
124
+ const response = await fetch('/__editor/account/coding-inference/quote', {
125
+ method: 'POST',
126
+ headers: { 'Content-Type': 'application/json' },
127
+ body: JSON.stringify(input),
128
+ });
129
+ assertEditorServerAnswered(response, 'Coding quote failed');
130
+ const body = (await response.json()) as {
131
+ model?: unknown;
132
+ promptTokens?: unknown;
133
+ outputTokens?: unknown;
134
+ providerAmountUsd?: unknown;
135
+ estimatedCredits?: unknown;
136
+ error?: unknown;
137
+ };
138
+ if (
139
+ !response.ok ||
140
+ typeof body.model !== 'string' ||
141
+ typeof body.promptTokens !== 'number' ||
142
+ typeof body.outputTokens !== 'number' ||
143
+ typeof body.providerAmountUsd !== 'number' ||
144
+ typeof body.estimatedCredits !== 'number'
145
+ ) {
146
+ throw new Error(typeof body.error === 'string' ? body.error : 'Coding quote failed.');
147
+ }
148
+ return body as {
149
+ model: string;
150
+ promptTokens: number;
151
+ outputTokens: number;
152
+ providerAmountUsd: number;
153
+ estimatedCredits: number;
154
+ };
155
+ }
156
+ export const saveProviderCredential = (provider: ProviderCredentialId, key: string) =>
157
+ mutate(`/__editor/account/provider-credentials/${encodeURIComponent(provider)}`, 'PUT', { key });
158
+ export const removeProviderCredential = (provider: ProviderCredentialId) =>
159
+ mutate(`/__editor/account/provider-credentials/${encodeURIComponent(provider)}`, 'DELETE');
160
+ export async function testProviderCredential(
161
+ provider: ProviderCredentialId,
162
+ ): Promise<ProviderCredentialTestResult> {
163
+ const response = await fetch(
164
+ `/__editor/account/provider-credentials/${encodeURIComponent(provider)}/test`,
165
+ { method: 'POST' },
166
+ );
167
+ assertEditorServerAnswered(response, 'Credential test failed');
168
+ const body = (await response.json()) as ProviderCredentialTestResult & { error?: unknown };
169
+ if (!response.ok) {
170
+ throw new Error(
171
+ typeof body.error === 'string' ? body.error : `Credential test failed (${response.status}).`,
172
+ );
173
+ }
174
+ return ProviderCredentialTestResultSchema.parse(body);
175
+ }
176
+ export const updateAccountPlan = (action: 'cancel' | 'resume') =>
177
+ mutate('/__editor/account/plan', 'PUT', { action });
178
+ async function checkoutAction(
179
+ path: string,
180
+ body: unknown,
181
+ ): Promise<{ checkoutUrl?: string; mock: boolean }> {
182
+ const response = await fetch(path, {
183
+ method: 'POST',
184
+ headers: {
185
+ 'Content-Type': 'application/json',
186
+ 'Idempotency-Key': crypto.randomUUID(),
187
+ },
188
+ body: JSON.stringify(body),
189
+ });
190
+ assertEditorServerAnswered(response, 'Checkout failed');
191
+ const result = (await response.json()) as {
192
+ account?: unknown;
193
+ checkoutUrl?: unknown;
194
+ mock?: unknown;
195
+ error?: unknown;
196
+ };
197
+ if (!response.ok || !result.account) {
198
+ throw new Error(typeof result.error === 'string' ? result.error : 'Checkout failed.');
199
+ }
200
+ publish(EditorAccountSnapshotSchema.parse(result.account));
201
+ return {
202
+ ...(typeof result.checkoutUrl === 'string' ? { checkoutUrl: result.checkoutUrl } : {}),
203
+ mock: result.mock === true,
204
+ };
205
+ }
206
+ export const checkoutAccountPlan = (plan: string) =>
207
+ checkoutAction('/__editor/account/checkout', { plan });
208
+ export const purchaseAccountCredits = (packId: string) =>
209
+ checkoutAction('/__editor/account/credits', { packId });
210
+ export async function fetchAccountUsage(): Promise<AccountUsageEntry[]> {
211
+ const response = await fetch('/__editor/account/usage');
212
+ assertEditorServerAnswered(response, 'Usage failed');
213
+ const body = (await response.json()) as { entries?: AccountUsageEntry[]; error?: unknown };
214
+ if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : 'Usage failed.');
215
+ return AccountUsageEntrySchema.array().parse(body.entries ?? []);
216
+ }
217
+ export async function fetchAccountCatalog(): Promise<AccountCatalog> {
218
+ const response = await fetch('/__editor/account/catalog');
219
+ assertEditorServerAnswered(response, 'Catalog failed');
220
+ const body = (await response.json()) as AccountCatalog & { error?: unknown };
221
+ if (!response.ok)
222
+ throw new Error(typeof body.error === 'string' ? body.error : 'Catalog failed.');
223
+ return AccountCatalogSchema.parse(body);
224
+ }
225
+ export async function openAccountBillingPortal(): Promise<{ url: string; mock: boolean }> {
226
+ const response = await fetch('/__editor/account/billing-portal', { method: 'POST' });
227
+ assertEditorServerAnswered(response, 'Billing portal failed');
228
+ const body = (await response.json()) as { url?: unknown; mock?: unknown; error?: unknown };
229
+ if (!response.ok || typeof body.url !== 'string') {
230
+ throw new Error(typeof body.error === 'string' ? body.error : 'Billing portal failed.');
231
+ }
232
+ return { url: body.url, mock: body.mock === true };
233
+ }
234
+ export interface DeviceAuthorization {
235
+ deviceCode: string;
236
+ userCode: string;
237
+ verificationUri: string;
238
+ expiresAt: string;
239
+ intervalSeconds: number;
240
+ }
241
+ export interface BrowserAuthorization {
242
+ authorizationId: string;
243
+ authorizationUrl: string;
244
+ expiresAt: string;
245
+ }
246
+ export async function fetchAccountAuthorizationMethods(): Promise<{
247
+ browser: true;
248
+ device: boolean;
249
+ }> {
250
+ const response = await fetch('/__editor/account/authorization-methods');
251
+ assertEditorServerAnswered(response, 'Sign-in methods are unavailable');
252
+ const body = (await response.json()) as {
253
+ browser?: unknown;
254
+ device?: unknown;
255
+ error?: unknown;
256
+ };
257
+ if (!response.ok || body.browser !== true || typeof body.device !== 'boolean') {
258
+ throw new Error(
259
+ typeof body.error === 'string' ? body.error : 'Sign-in methods are unavailable.',
260
+ );
261
+ }
262
+ return { browser: true, device: body.device };
263
+ }
264
+ export async function beginAccountBrowserAuthorization(): Promise<BrowserAuthorization> {
265
+ const response = await fetch('/__editor/account/browser-authorization', { method: 'POST' });
266
+ assertEditorServerAnswered(response, 'Sign-in failed');
267
+ const body = (await response.json()) as BrowserAuthorization & { error?: unknown };
268
+ if (!response.ok) {
269
+ throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
270
+ }
271
+ return body;
272
+ }
273
+ export async function pollAccountBrowserAuthorization(authorizationId: string): Promise<boolean> {
274
+ const response = await fetch(
275
+ `/__editor/account/browser-authorization/${encodeURIComponent(authorizationId)}`,
276
+ );
277
+ assertEditorServerAnswered(response, 'Sign-in failed');
278
+ const body = (await response.json()) as
279
+ | { pending: true; error?: unknown }
280
+ | { pending: false; account: EditorAccountSnapshot; error?: unknown };
281
+ if (response.status === 202) return false;
282
+ if (!response.ok || body.pending !== false) {
283
+ throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
284
+ }
285
+ publish(EditorAccountSnapshotSchema.parse(body.account));
286
+ return true;
287
+ }
288
+ export async function beginAccountDeviceAuthorization(): Promise<DeviceAuthorization> {
289
+ const response = await fetch('/__editor/account/device-authorization', { method: 'POST' });
290
+ assertEditorServerAnswered(response, 'Sign-in failed');
291
+ const body = (await response.json()) as DeviceAuthorization & { error?: unknown };
292
+ if (!response.ok)
293
+ throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
294
+ return body;
295
+ }
296
+ export async function pollAccountDeviceAuthorization(deviceCode: string): Promise<boolean> {
297
+ const response = await fetch(
298
+ `/__editor/account/device-authorization/${encodeURIComponent(deviceCode)}`,
299
+ );
300
+ assertEditorServerAnswered(response, 'Sign-in failed');
301
+ const body = (await response.json()) as
302
+ | { pending: true; error?: unknown }
303
+ | { pending: false; account: EditorAccountSnapshot; error?: unknown };
304
+ if (response.status === 202) return false;
305
+ if (!response.ok || body.pending !== false) {
306
+ throw new Error(typeof body.error === 'string' ? body.error : 'Sign-in failed.');
307
+ }
308
+ publish(EditorAccountSnapshotSchema.parse(body.account));
309
+ return true;
310
+ }
311
+ export function startAccountActivity(): () => void {
312
+ if (COLLABORATION_REMOTE_SHARE) return () => {};
313
+ const checkoutId = new URLSearchParams(window.location.search).get('checkout_id');
314
+ if (checkoutId) {
315
+ void mutate('/__editor/account/checkout/confirm', 'POST', { checkoutId })
316
+ .then(() => {
317
+ const url = new URL(window.location.href);
318
+ url.searchParams.delete('checkout');
319
+ url.searchParams.delete('checkout_id');
320
+ window.history.replaceState(null, '', `${url.pathname}${url.search}${url.hash}`);
321
+ })
322
+ // Into the module's own error channel (`accountError()`, rendered by the
323
+ // account UI) rather than a bare swallow: a confirm that reached nothing
324
+ // used to clear the URL params and look done.
325
+ .catch((cause: unknown) =>
326
+ publish(snapshot, cause instanceof Error ? cause.message : String(cause)),
327
+ );
328
+ } else {
329
+ void refreshAccount().catch(() => undefined);
330
+ }
331
+ const timer = window.setInterval(() => void refreshAccount().catch(() => undefined), 30_000);
332
+ return () => window.clearInterval(timer);
333
+ }