@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,91 @@
1
+ import type { z } from 'zod';
2
+
3
+ /**
4
+ * Core, registry-level error codes — always available regardless of which
5
+ * operation was dispatched. Operation-specific codes are declared per
6
+ * operation on `ToolDefinition.errors` (see `registry.ts`).
7
+ */
8
+ export const CORE_ERROR_CODES = {
9
+ /** `dispatch()` was called with a name no operation is registered under. */
10
+ OPERATION_NOT_FOUND: 'OPERATION_NOT_FOUND',
11
+ /** Input failed the operation's Zod input schema. */
12
+ INVALID_INPUT: 'INVALID_INPUT',
13
+ /** The impl's return value failed the operation's Zod result schema, or a
14
+ * thrown ToolError's `data` failed its declared error-code schema —
15
+ * either way, an implementation bug, not a caller bug. */
16
+ INVALID_OUTPUT: 'INVALID_OUTPUT',
17
+ /** The impl threw something that isn't a declared, structured error. */
18
+ INTERNAL_ERROR: 'INTERNAL_ERROR',
19
+ } as const;
20
+
21
+ export type CoreErrorCode = (typeof CORE_ERROR_CODES)[keyof typeof CORE_ERROR_CODES];
22
+
23
+ /** A single Zod validation failure, reduced to a machine-readable shape. */
24
+ export interface StructuredIssue {
25
+ path: (string | number | symbol)[];
26
+ message: string;
27
+ code: string;
28
+ }
29
+
30
+ /**
31
+ * The one error shape every `dispatch()` failure normalizes into. `code` is
32
+ * always machine-readable and always present — nothing in this codebase may
33
+ * identify an operation failure by parsing `message` prose (§8 B1 AC).
34
+ */
35
+ export interface StructuredOperationError {
36
+ code: string;
37
+ message: string;
38
+ /** Present for INVALID_INPUT / INVALID_OUTPUT — the exact failing path(s). */
39
+ issues?: StructuredIssue[];
40
+ /** Present when the failing code declares a data schema (or the impl attached data). */
41
+ data?: unknown;
42
+ }
43
+
44
+ /**
45
+ * A global brand keeps expected errors recognizable across separately loaded
46
+ * copies of @volter/sdk (for example, an editor host dispatching a standalone
47
+ * project's tool). `instanceof` alone cannot cross that package boundary.
48
+ */
49
+ export const OPERATION_ERROR_BRAND = Symbol.for('@volter/sdk.ToolError');
50
+
51
+ /**
52
+ * The only way an operation `impl` should signal an EXPECTED, contractual
53
+ * failure (as opposed to an unexpected bug/exception). `code` must be one
54
+ * the operation's `ToolDefinition.errors` declares — `dispatch()`
55
+ * cross-checks it and validates `data` against that code's schema, so an
56
+ * undeclared code or mismatched data is itself normalized into a structured
57
+ * error rather than silently forwarded (see `registry.ts`'s
58
+ * `normalizeThrown`).
59
+ */
60
+ export class ToolError extends Error {
61
+ readonly [OPERATION_ERROR_BRAND] = true;
62
+ readonly code: string;
63
+ readonly data: unknown;
64
+
65
+ constructor(code: string, message: string, data?: unknown) {
66
+ super(message);
67
+ this.name = 'ToolError';
68
+ this.code = code;
69
+ this.data = data;
70
+ }
71
+ }
72
+
73
+ export function isOperationError(value: unknown): value is ToolError {
74
+ if (value instanceof ToolError) return true;
75
+ if (value === null || typeof value !== 'object') return false;
76
+ const candidate = value as Record<PropertyKey, unknown>;
77
+ return (
78
+ candidate[OPERATION_ERROR_BRAND] === true &&
79
+ typeof candidate['code'] === 'string' &&
80
+ typeof candidate['message'] === 'string'
81
+ );
82
+ }
83
+
84
+ /** Reduce a `ZodError`'s issues to the structured, serializable shape above. */
85
+ export function toStructuredIssues(issues: readonly z.ZodIssue[]): StructuredIssue[] {
86
+ return issues.map((issue) => ({
87
+ path: [...issue.path],
88
+ message: issue.message,
89
+ code: issue.code,
90
+ }));
91
+ }
@@ -0,0 +1,70 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import type { GenerationJobDraft } from '../generations.js';
3
+
4
+ export type ProviderExecutionMode = 'direct' | 'managed' | 'mock';
5
+ export type ProviderModeResolver = (
6
+ provider: string,
7
+ requestId?: string,
8
+ ) => Promise<ProviderExecutionMode>;
9
+
10
+ const credentialNames: Record<string, string> = {
11
+ fal: 'FAL_KEY',
12
+ tripo: 'TRIPO_API_KEY',
13
+ worldlabs: 'WORLDLABS_API_KEY',
14
+ openrouter: 'OPENROUTER_API_KEY',
15
+ };
16
+
17
+ // Project SSR and installed packages can load separate module instances.
18
+ // The host's async context must still be shared, without sharing requests.
19
+ const key = Symbol.for('volter.provider-execution-context');
20
+ const globals = globalThis as typeof globalThis & {
21
+ [key]?: AsyncLocalStorage<{
22
+ resolve: ProviderModeResolver;
23
+ record?: ((job: GenerationJobDraft) => Promise<void>) | undefined;
24
+ }>;
25
+ };
26
+ const context = globals[key] ?? new AsyncLocalStorage();
27
+ globals[key] = context;
28
+
29
+ /** Trusted host configuration. Provider choice and billing never enter tool input. */
30
+ export function withProviderExecution<T>(
31
+ resolve: ProviderModeResolver,
32
+ work: () => Promise<T>,
33
+ record?: (job: GenerationJobDraft) => Promise<void>,
34
+ ) {
35
+ const pending = new Map<string, Promise<ProviderExecutionMode>>();
36
+ return context.run(
37
+ {
38
+ record,
39
+ resolve: (provider, requestId) => {
40
+ const key = JSON.stringify([provider, requestId]);
41
+ let result = pending.get(key);
42
+ if (!result) {
43
+ result = resolve(provider, requestId);
44
+ pending.set(key, result);
45
+ }
46
+ return result;
47
+ },
48
+ },
49
+ work,
50
+ );
51
+ }
52
+
53
+ /** Native provider clients use the same project ledger as registered tools. */
54
+ export async function recordProviderGeneration(job: GenerationJobDraft): Promise<void> {
55
+ await context.getStore()?.record?.(job);
56
+ }
57
+
58
+ /** Library-side connection resolution; callers supply only native provider input. */
59
+ export async function resolveProviderMode(
60
+ provider: string,
61
+ requestId?: string,
62
+ ): Promise<ProviderExecutionMode> {
63
+ const resolve = context.getStore()?.resolve;
64
+ if (resolve) return resolve(provider, requestId);
65
+ const name = credentialNames[provider];
66
+ if (!name) throw new Error(`Unknown generation provider ${JSON.stringify(provider)}.`);
67
+ if (process.env[name]?.trim()) return 'direct';
68
+ if (process.env['VOLTER_GENERATION_GATEWAY'] && process.env['VOLTER_ACCESS_TOKEN']) return 'managed';
69
+ throw new Error(`Connect ${provider} or sign in to Volter Editor in Account before generating.`);
70
+ }
@@ -0,0 +1,341 @@
1
+ import type { z } from 'zod';
2
+ import {
3
+ CORE_ERROR_CODES,
4
+ isOperationError,
5
+ type StructuredOperationError,
6
+ toStructuredIssues,
7
+ } from './errors.js';
8
+ import {
9
+ type ExecutionHost,
10
+ type ExecutionRequirements,
11
+ type PermissionMetadata,
12
+ TOOL_NAMESPACES,
13
+ type ToolContext,
14
+ type ToolNamespace,
15
+ } from './types.js';
16
+
17
+ /** One declared, machine-readable failure mode of an operation (§8 B1: "structured error codes and data schemas"). */
18
+ export interface ToolErrorDefinition<TCode extends string = string> {
19
+ code: TCode;
20
+ /** One-line human summary of when this code fires — for docs/help text, never parsed by callers. */
21
+ summary: string;
22
+ /** Optional schema for this code's `data` payload. When present, `dispatch()` validates a thrown ToolError's data against it. */
23
+ data?: z.ZodType;
24
+ }
25
+
26
+ /**
27
+ * One operation, fully self-describing: identity, both schemas, every
28
+ * declared failure mode, where/how it runs, and its own implementation.
29
+ * Built via `defineTool` (below), which validates the name shape and
30
+ * error-code uniqueness at definition time.
31
+ */
32
+ export interface ToolDefinition<
33
+ TInput extends z.ZodType = z.ZodType,
34
+ TResult extends z.ZodType = z.ZodType,
35
+ TErrorCode extends string = string,
36
+ > {
37
+ /** Fully qualified dotted name, e.g. "project.scene.read" (§5.7 namespaces). */
38
+ name: string;
39
+ /** Short, one-line summary (for CLI help / listOperations tables). */
40
+ summary: string;
41
+ /** Longer prose description of behavior, side effects, and caveats. */
42
+ description: string;
43
+ /** Zod schema every `dispatch()` input is validated against before `impl` runs. */
44
+ input: TInput;
45
+ /** Zod schema every `impl` return value is validated against before `dispatch()` succeeds. */
46
+ result: TResult;
47
+ /** Every structured failure mode this operation may raise via `ToolError`. */
48
+ errors: ReadonlyArray<ToolErrorDefinition<TErrorCode>>;
49
+ /** Which live contexts this operation needs (project/editor/play/render). */
50
+ requires: ExecutionRequirements;
51
+ /** Which of the three hosts this operation executes on (node / editor-browser / runtime-page). */
52
+ host: ExecutionHost;
53
+ /** True if this operation writes/changes state (files, editor, runtime). */
54
+ mutates: boolean;
55
+ /** True if this operation supports a dry-run mode (mutations only, meaningful subset). */
56
+ supportsDryRun: boolean;
57
+ /** True for jobs that must not ride a short request/response timeout (e.g. `cinematic.render` on the editor relay). */
58
+ longRunning?: boolean;
59
+ /** Coarse permission/risk metadata for gated callers (agents, HTTP/MCP auth). */
60
+ permission: PermissionMetadata;
61
+ /** The actual implementation. Receives already-schema-validated input. */
62
+ impl: (input: z.infer<TInput>, ctx: ToolContext) => Promise<z.infer<TResult>>;
63
+ }
64
+
65
+ /** `listOperations()`'s element shape — every field of `ToolDefinition` except `impl`, so enumerating never risks invoking anything. */
66
+ export type ToolSummary<
67
+ TInput extends z.ZodType = z.ZodType,
68
+ TResult extends z.ZodType = z.ZodType,
69
+ TErrorCode extends string = string,
70
+ > = Omit<ToolDefinition<TInput, TResult, TErrorCode>, 'impl'>;
71
+
72
+ const NAME_PATTERN = /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$/;
73
+
74
+ function namespaceOf(name: string): string {
75
+ const dot = name.indexOf('.');
76
+ return dot === -1 ? name : name.slice(0, dot);
77
+ }
78
+
79
+ /**
80
+ * Typed helper that builds an `ToolDefinition`. Pure and synchronous —
81
+ * it does not touch a registry (so it can never itself throw "duplicate
82
+ * name"; that check happens at `ToolRegistry.register`, which has the
83
+ * cross-operation state to detect it) — but it DOES validate the two things
84
+ * that are decidable from the definition alone: the name is a valid dotted
85
+ * `namespace.rest` string under one of the four operation namespaces
86
+ * (§5.7), and no two declared error codes on the same operation collide.
87
+ *
88
+ * Exists mainly for type inference: it pins `impl`'s parameter/return types
89
+ * to `z.infer<TInput>` / `z.infer<TResult>` so a mismatched implementation
90
+ * fails to compile rather than failing at runtime.
91
+ */
92
+ export function defineTool<
93
+ TInput extends z.ZodType,
94
+ TResult extends z.ZodType,
95
+ TErrorCode extends string = string,
96
+ >(def: ToolDefinition<TInput, TResult, TErrorCode>): ToolDefinition<TInput, TResult, TErrorCode> {
97
+ if (!NAME_PATTERN.test(def.name)) {
98
+ throw new Error(
99
+ `defineTool: "${def.name}" is not a valid dotted operation name ` +
100
+ '(expected e.g. "project.scene.read" — lowercase-leading segments joined by dots).',
101
+ );
102
+ }
103
+ const ns = namespaceOf(def.name);
104
+ if (!(TOOL_NAMESPACES as readonly string[]).includes(ns)) {
105
+ throw new Error(
106
+ `defineTool: "${def.name}" has unknown namespace "${ns}" — expected one of ` +
107
+ `${TOOL_NAMESPACES.join(', ')} (§5.7).`,
108
+ );
109
+ }
110
+ const seen = new Set<string>();
111
+ for (const err of def.errors) {
112
+ if (seen.has(err.code)) {
113
+ throw new Error(`defineTool: "${def.name}" declares duplicate error code "${err.code}".`);
114
+ }
115
+ seen.add(err.code);
116
+ }
117
+ return def;
118
+ }
119
+
120
+ /** `dispatch()`'s result — a discriminated union, never a thrown exception, so every projection (CLI/HTTP/MCP) gets one uniform JSON-able shape for both success and failure. */
121
+ export type ToolOutcome<TResult = unknown> =
122
+ | { ok: true; data: TResult }
123
+ | { ok: false; error: StructuredOperationError };
124
+
125
+ /**
126
+ * Normalize whatever an `impl` threw into a `StructuredOperationError`.
127
+ * Three cases:
128
+ * 1. A declared `ToolError` whose code IS in `def.errors` and whose
129
+ * `data` (if the code declares a schema) validates — forwarded as-is,
130
+ * `data` replaced by its *parsed* form.
131
+ * 2. A declared code whose `data` fails its own schema — that is itself an
132
+ * implementation bug, surfaced as INVALID_OUTPUT (never silently
133
+ * forwarding unvalidated data).
134
+ * 3. Anything else — an `ToolError` with an undeclared code, a plain
135
+ * `Error`, or a non-Error throw — normalized into INTERNAL_ERROR. The
136
+ * raw exception/message is never used as the identifying `code`, but it
137
+ * IS carried in `message` as well as `data.message`: every projection
138
+ * (the CLI's `volter tool`, the oclif commands, the editor's `screenshot` command's module
139
+ * lane) shows `error.message` and only some of them dump `data`, so a
140
+ * `message` that said nothing but "threw an unstructured exception"
141
+ * hid the one sentence the caller needed ("No editor connected — open
142
+ * the editor in a browser tab, then retry.") behind whichever surface
143
+ * happened to print the whole outcome.
144
+ */
145
+ function normalizeThrown(def: ToolDefinition, err: unknown): StructuredOperationError {
146
+ if (isOperationError(err)) {
147
+ const declared = def.errors.find((e) => e.code === err.code);
148
+ if (!declared) {
149
+ return {
150
+ code: CORE_ERROR_CODES.INTERNAL_ERROR,
151
+ message: `"${def.name}" threw undeclared error code "${err.code}".`,
152
+ data: { undeclaredCode: err.code, message: err.message },
153
+ };
154
+ }
155
+ if (declared.data) {
156
+ const parsed = declared.data.safeParse(err.data);
157
+ if (!parsed.success) {
158
+ return {
159
+ code: CORE_ERROR_CODES.INVALID_OUTPUT,
160
+ message:
161
+ `"${def.name}" threw declared code "${err.code}" but its data failed that ` +
162
+ "code's own schema.",
163
+ issues: toStructuredIssues(parsed.error.issues),
164
+ };
165
+ }
166
+ return { code: err.code, message: err.message, data: parsed.data };
167
+ }
168
+ return {
169
+ code: err.code,
170
+ message: err.message,
171
+ ...(err.data !== undefined ? { data: err.data } : {}),
172
+ };
173
+ }
174
+
175
+ const message = err instanceof Error ? err.message : String(err);
176
+ return {
177
+ code: CORE_ERROR_CODES.INTERNAL_ERROR,
178
+ message: `"${def.name}" failed: ${message}`,
179
+ data: { message },
180
+ };
181
+ }
182
+
183
+ function toSummary(def: ToolDefinition): ToolSummary {
184
+ const { impl: _impl, ...summary } = def;
185
+ return summary;
186
+ }
187
+
188
+ /**
189
+ * Zod object schemas strip unknown keys by default. That is unsafe at an
190
+ * operation boundary: a misspelled `dryRun` could disappear and let the
191
+ * operation use its write-default. Detect anything parsing removed, at any
192
+ * nested object level, and reject it before the implementation can run.
193
+ */
194
+ function firstStrippedInputPath(
195
+ raw: unknown,
196
+ parsed: unknown,
197
+ path: Array<string | number> = [],
198
+ ): Array<string | number> | null {
199
+ if (Array.isArray(raw) && Array.isArray(parsed)) {
200
+ for (let index = 0; index < raw.length; index++) {
201
+ const stripped = firstStrippedInputPath(raw[index], parsed[index], [...path, index]);
202
+ if (stripped) return stripped;
203
+ }
204
+ return null;
205
+ }
206
+ if (
207
+ raw === null ||
208
+ parsed === null ||
209
+ typeof raw !== 'object' ||
210
+ typeof parsed !== 'object' ||
211
+ Array.isArray(raw) ||
212
+ Array.isArray(parsed)
213
+ ) {
214
+ return null;
215
+ }
216
+ const parsedRecord = parsed as Record<string, unknown>;
217
+ for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {
218
+ if (!Object.hasOwn(parsedRecord, key)) return [...path, key];
219
+ const stripped = firstStrippedInputPath(value, parsedRecord[key], [...path, key]);
220
+ if (stripped) return stripped;
221
+ }
222
+ return null;
223
+ }
224
+
225
+ /**
226
+ * The one registry of operation definitions (§8 B1). Holds definitions
227
+ * keyed by their fully-qualified name; `register` rejects a duplicate name
228
+ * outright (names are unique and stable per the AC), `listOperations`
229
+ * enumerates metadata without ever touching `impl`, and `dispatch` is the
230
+ * single validated call path: input schema -> impl -> result schema, with
231
+ * every failure normalized into `StructuredOperationError`.
232
+ */
233
+ export class ToolRegistry {
234
+ private readonly definitions = new Map<string, ToolDefinition>();
235
+
236
+ /** Register a definition. Throws synchronously on a duplicate name — names are unique and stable by construction, not by convention. */
237
+ register<TInput extends z.ZodType, TResult extends z.ZodType, TErrorCode extends string>(
238
+ def: ToolDefinition<TInput, TResult, TErrorCode>,
239
+ ): void {
240
+ if (this.definitions.has(def.name)) {
241
+ throw new Error(
242
+ `ToolRegistry.register: "${def.name}" is already registered — operation names ` +
243
+ 'must be unique and stable.',
244
+ );
245
+ }
246
+ this.definitions.set(def.name, def as unknown as ToolDefinition);
247
+ }
248
+
249
+ /** Enumerate every registered operation's metadata. Never invokes `impl`. */
250
+ listOperations(): ToolSummary[] {
251
+ return [...this.definitions.values()].map(toSummary);
252
+ }
253
+
254
+ /** Look up one operation's full definition (including `impl`) by name, or `undefined`. */
255
+ getOperation(name: string): ToolDefinition | undefined {
256
+ return this.definitions.get(name);
257
+ }
258
+
259
+ has(name: string): boolean {
260
+ return this.definitions.has(name);
261
+ }
262
+
263
+ /**
264
+ * Validate `input` against the named operation's input schema, run its
265
+ * `impl`, validate the return value against its result schema, and return
266
+ * a uniform `ToolOutcome` — success or a `StructuredOperationError`.
267
+ * Never throws for an expected failure (unknown name, bad input, impl
268
+ * throw, bad output); those are exactly what this method exists to turn
269
+ * into a machine-readable result instead of an exception a caller has to
270
+ * parse prose out of.
271
+ */
272
+ async dispatch<TResult = unknown>(
273
+ name: string,
274
+ input: unknown,
275
+ ctx: ToolContext = {},
276
+ ): Promise<ToolOutcome<TResult>> {
277
+ const def = this.definitions.get(name);
278
+ if (!def) {
279
+ return {
280
+ ok: false,
281
+ error: {
282
+ code: CORE_ERROR_CODES.OPERATION_NOT_FOUND,
283
+ message: `No operation is registered as "${name}".`,
284
+ data: { name },
285
+ },
286
+ };
287
+ }
288
+
289
+ const parsedInput = def.input.safeParse(input);
290
+ if (!parsedInput.success) {
291
+ return {
292
+ ok: false,
293
+ error: {
294
+ code: CORE_ERROR_CODES.INVALID_INPUT,
295
+ message: `Input for "${name}" failed schema validation.`,
296
+ issues: toStructuredIssues(parsedInput.error.issues),
297
+ },
298
+ };
299
+ }
300
+ const strippedPath = firstStrippedInputPath(input, parsedInput.data);
301
+ if (strippedPath) {
302
+ return {
303
+ ok: false,
304
+ error: {
305
+ code: CORE_ERROR_CODES.INVALID_INPUT,
306
+ message: `Input for "${name}" contains an unknown field.`,
307
+ issues: [
308
+ {
309
+ path: strippedPath,
310
+ message: 'Unknown input field. Check spelling; unknown fields are never ignored.',
311
+ code: 'unrecognized_key',
312
+ },
313
+ ],
314
+ },
315
+ };
316
+ }
317
+
318
+ let rawResult: unknown;
319
+ try {
320
+ rawResult = await def.impl(parsedInput.data, ctx);
321
+ } catch (err) {
322
+ return { ok: false, error: normalizeThrown(def, err) };
323
+ }
324
+
325
+ const parsedResult = def.result.safeParse(rawResult);
326
+ if (!parsedResult.success) {
327
+ return {
328
+ ok: false,
329
+ error: {
330
+ code: CORE_ERROR_CODES.INVALID_OUTPUT,
331
+ message: `Result of "${name}" failed schema validation (implementation bug).`,
332
+ issues: toStructuredIssues(parsedResult.error.issues),
333
+ },
334
+ };
335
+ }
336
+
337
+ return { ok: true, data: parsedResult.data as TResult };
338
+ }
339
+ }
340
+
341
+ export type { ExecutionHost, ExecutionRequirements, ToolContext, ToolNamespace };
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Shared vocabulary for the operation registry (B1).
3
+ */
4
+
5
+ /** The four namespaces every operation name must live under (§5.7). */
6
+ export const TOOL_NAMESPACES = ['project', 'editor', 'play', 'cinematic'] as const;
7
+ export type ToolNamespace = (typeof TOOL_NAMESPACES)[number];
8
+
9
+ /**
10
+ * Which of the three hosts an operation executes on (§8 B1, the
11
+ * review-hardened addition):
12
+ * - `node` — runs in the SDK's own Node process against files (or, for
13
+ * long-running jobs like `cinematic.render`, launches its own browser).
14
+ * - `editor-browser` — invoked through the existing
15
+ * `POST /__editor/command` SSE relay in
16
+ * `packages/editor-core/server/editor-server.ts`, which broadcasts to the
17
+ * connected browser editor and awaits its callback under a short timeout
18
+ * (~5s; 120s for `play`). The projection generates the relay stub.
19
+ * - `runtime-page` — invoked through the play/render harness in a launched
20
+ * runtime page.
21
+ *
22
+ * `cinematic.render` is pinned `node` and MUST NOT ride the editor relay's
23
+ * short timeout — it is a long-running job (see `longRunning` on
24
+ * `ToolDefinition`).
25
+ */
26
+ export type ExecutionHost = 'node' | 'editor-browser' | 'runtime-page';
27
+
28
+ /** Which live contexts an operation needs before it can run. */
29
+ export interface ExecutionRequirements {
30
+ /** Needs a project directory on disk (no editor process required). */
31
+ project?: boolean;
32
+ /** Needs an existing, connected editor session. */
33
+ editor?: boolean;
34
+ /** Needs a playable runtime (starts or targets one). */
35
+ play?: boolean;
36
+ /** Needs a controlled render runtime. */
37
+ render?: boolean;
38
+ }
39
+
40
+ /** Coarse risk classification surfaced to permission-gated callers (agents, HTTP/MCP auth). */
41
+ export type PermissionRisk = 'read' | 'write' | 'destructive';
42
+
43
+ export interface PermissionMetadata {
44
+ risk: PermissionRisk;
45
+ /** Human summary of what this operation is permitted to touch or do. */
46
+ summary: string;
47
+ }
48
+
49
+ /** One completed file handed to the host-managed generated-output boundary. */
50
+ export interface ProjectOutputFile {
51
+ /** Project-relative destination. Slice 1 deliberately permits only public/**. */
52
+ path: string;
53
+ content: string | Uint8Array;
54
+ mediaType?: string;
55
+ role?: 'asset' | 'provenance' | 'other';
56
+ }
57
+
58
+ /** JSON-safe summary returned after an atomic generated-output transaction. */
59
+ export interface ProjectGeneratedOutputFile {
60
+ path: string;
61
+ bytes: number;
62
+ mediaType?: string;
63
+ role?: ProjectOutputFile['role'];
64
+ }
65
+
66
+ export interface ProjectGeneratedOutput {
67
+ files: ProjectGeneratedOutputFile[];
68
+ totalBytes: number;
69
+ dryRun: boolean;
70
+ /** Host-created logical record in .volter/provenance.json; absent for dry runs. */
71
+ provenanceOperationId?: string;
72
+ }
73
+
74
+ export interface ProjectProviderExecution {
75
+ mode: 'mock' | 'direct' | 'managed';
76
+ provider: string;
77
+ operation?: string;
78
+ model?: string;
79
+ requestId?: string;
80
+ taskId?: string;
81
+ managedJobId?: string;
82
+ /** Route-aware charge snapshot when this execution produced accepted output. */
83
+ billing?: import('../generations.js').GenerationBilling;
84
+ }
85
+
86
+ /** Facts the operation host already owns and stamps onto every committed batch. */
87
+ export interface ProjectOutputProvenanceContext {
88
+ operationName: string;
89
+ operationSource?: string;
90
+ /** Sanitized facts for a single provider execution. */
91
+ execution?: ProjectProviderExecution;
92
+ /** Ordered facts for a native multi-task pipeline that produced one output batch. */
93
+ executions?: readonly ProjectProviderExecution[];
94
+ /** WHICH editor session produced the bytes, for a `project.session.write`
95
+ * batch — the kind whose producer is a script an agent ran inside a live
96
+ * session rather than an operation that ran here. Shape and meaning:
97
+ * `project/provenance.ts`'s `ProjectProvenanceSessionSchema`, which is the
98
+ * validated form; this mirror exists because `types.ts` carries no zod. */
99
+ session?: {
100
+ id: string;
101
+ port: number;
102
+ revision: number;
103
+ callId?: string;
104
+ };
105
+ /** Schema-validated, JSON-safe operation input. */
106
+ input?: unknown;
107
+ /** Project-relative paths of the project FILES these bytes were produced
108
+ * from — a session-written GLB names the `src/models/<name>.blend` it was
109
+ * exported from. Shape and meaning: `project/provenance.ts`'s `inputs`,
110
+ * which is the validated form; this mirror exists because `types.ts`
111
+ * carries no zod. It is what lets a reader drill DOWN by kind from a
112
+ * prefab's glTF to the model it came from. */
113
+ inputs?: readonly string[];
114
+ }
115
+
116
+ /**
117
+ * Host capability supplied only to Node-hosted project operations. Generator
118
+ * implementations may stay ordinary native JS; their thin operation wrapper
119
+ * calls this once it has a complete batch ready to commit.
120
+ */
121
+ export interface ProjectOutputWriter {
122
+ write(
123
+ files: readonly ProjectOutputFile[],
124
+ options?: { dryRun?: boolean },
125
+ ): Promise<ProjectGeneratedOutput>;
126
+ }
127
+
128
+ /**
129
+ * Runtime context passed to every operation's `impl`. Intentionally an open
130
+ * record (`[key: string]: unknown`) — later units (B2-B8) will grow this with
131
+ * concrete fields (editor session ids, play session handles, render job
132
+ * state); B1 only needs the two seams its sample operations touch.
133
+ */
134
+ export interface ToolContext {
135
+ /** Absolute path to the target project's root, for `project`-context ops. */
136
+ projectRoot?: string;
137
+ /** Base URL of a connected editor session, for `editor`-context ops. */
138
+ editorUrl?: string;
139
+ /** Cooperative cancellation for long-running (`node`, `longRunning`) ops. */
140
+ signal?: AbortSignal;
141
+ /** Atomic writer for generated project assets (Node project operations). */
142
+ projectOutputs?: ProjectOutputWriter;
143
+ /** WHICH mounted instance a game-driving tool should address, when the
144
+ * editor has several live (multiplayer authoring). A tool that drives the
145
+ * game binds `game.instance(ctx.instance)` from it; omitted means the sole
146
+ * live instance. */
147
+ instance?: string;
148
+ /** The HOST's project-module loader (the editor server's Vite SSR loader,
149
+ * wrapped with dependency-change invalidation). A tool that imports the
150
+ * project's own source at run time — `project.bake.preview` importing
151
+ * `src/models/barrel.ts` — MUST load through this rather than a raw
152
+ * `import()`: Node's ESM cache never invalidates, so a raw import returned
153
+ * the FIRST version of a model for the life of the server and every later
154
+ * edit re-rendered byte-identical until the editor's `restart` command (measured on the
155
+ * blind modeling bench, 2026-09-05: three restarts in one barrel). Absent
156
+ * only when the tool runs outside an editor server. */
157
+ loadProjectModule?: (absolutePath: string) => Promise<unknown>;
158
+ [key: string]: unknown;
159
+ }