@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
package/src/session.ts ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * THE SESSION FACE — what the session SERVER and the editor PAGE both agree on.
3
+ *
4
+ * `@volter/sdk` is the API with four faces (ARCHITECTURE-CORE §The target
5
+ * shape): protocol, host doors + layouts, widgets, session client. This is the
6
+ * protocol face's home, and it exists because of a LICENCE fact, not tidiness:
7
+ * the target shape's editor-kit row says the session server and the CLI are
8
+ * Apache "ONLY once the session imports nothing of the editor". Every module
9
+ * re-exported here used to live in `packages/editor/src/` (AGPL-3.0-only) and
10
+ * was value-imported by `packages/editor/server/**`, so the Node session's
11
+ * import graph reached AGPL application code on every boot.
12
+ *
13
+ * What qualifies for this face: a shape TWO programs must agree on, that imports
14
+ * neither React, nor the editor shell store, nor `node:` — measured, not
15
+ * asserted. All twelve below import nothing but `../share`, `@volter/project`'s
16
+ * manifest schema, and each other. A module the editor app merely happens to
17
+ * share with the server does NOT qualify; it stays where it is and shows up in
18
+ * `scripts/validate-import-bans.mjs`'s `server-imports-editor-app` ratchet with
19
+ * a reason, until someone makes it a contract or deletes it.
20
+ *
21
+ * IMPORT THE MODULE, NOT THIS BARREL, from anything the closure meter watches:
22
+ * `@volter/sdk/session/relative-path-guard`. The subpath is a wildcard
23
+ * export (`"./session/*"`), the same shape the runtime packages use, because
24
+ * `export *` here would put all twelve modules in every consumer's static
25
+ * value-import closure — measured at +4 files on the `full` build and +5 on
26
+ * `models` the one time this file was the door. This barrel is documentation
27
+ * and a convenience for callers no meter watches.
28
+ */
29
+
30
+ export * from './session/build-report';
31
+ export * from './session/collaboration-types';
32
+ export * from './session/command-table';
33
+ export * from './session/editor-brand';
34
+ export * from './session/editor-compatibility';
35
+ export * from './session/editor-control-lifecycle';
36
+ export * from './session/editor-control-protocol';
37
+ export * from './session/game-css-scope';
38
+ export * from './session/project-module-url';
39
+ export * from './session/relative-path-guard';
40
+ export * from './session/source-glob';
41
+ export * from './session/tool-contribution-convention';
package/src/share.ts ADDED
@@ -0,0 +1,160 @@
1
+ /**
2
+ * THE share-session wire — `/__editor/share-control`'s payloads, declared once.
3
+ *
4
+ * This route has three clients living in three different compilation units:
5
+ * the editor SERVER that serves it (`packages/editor/server/`), the browser
6
+ * PANEL that polls it (`packages/editor/src/`), and the `volter share` CLI
7
+ * (`packages/volter-cli/src/`). Each of them used to declare its own copy of the
8
+ * payload, and the copies had already drifted — silently, in both directions,
9
+ * because an under-declared read of a JSON superset is a type error nowhere:
10
+ *
11
+ * - the CLI's invitation had no `delivery`, so `volter share` could not report
12
+ * that the invitation email had FAILED to send — the one state the field
13
+ * exists for;
14
+ * - the CLI's audit rows typed `type` and `capability` as bare `string`,
15
+ * which accepts any spelling of an event the server never emits;
16
+ * - the browser panel's invitation had no `inviterAccountId`;
17
+ * - the browser panel had no `audit` at all, and re-declared the tunnel
18
+ * health shape inline instead of naming it.
19
+ *
20
+ * This package is the right home for all three: `@volter/editor-core` and the product CLIs
21
+ * both already depend on it, it depends on neither, and the CLI's esbuild
22
+ * bundle inlines it. (The CLI's standing "no editor-package dependency" rule is
23
+ * about `@volter/editor-core` — the server+UI package whose express/vite/chokidar
24
+ * graph the standalone bundle must not drag in. This is a types-only module.)
25
+ *
26
+ * Two things deliberately stay OFF this wire, and stay off it structurally
27
+ * rather than by memory:
28
+ *
29
+ * - the invitation TOKEN HASH, which is a local extension on the server
30
+ * (`share-host.ts`'s `StoredShareInvitation extends ShareInvitationRecord`);
31
+ * - a participant's ORGANIZATION list, which the gateway holds on its own
32
+ * `ShareAccountProjection` to resolve team invitations. {@link ShareAccount}
33
+ * is what a participant projects to, so `status()` narrows to it.
34
+ */
35
+
36
+ /**
37
+ * A share role, least authority first.
38
+ *
39
+ * `maintainer` is deliberately absent: it is local-only and has no share role,
40
+ * which is why the editor's `CollaborationRole` is this union PLUS `maintainer`
41
+ * rather than the other way around.
42
+ */
43
+ export type ShareRole = 'viewer' | 'commenter' | 'tester' | 'editor' | 'terminal';
44
+
45
+ export type ShareTunnelProvider = 'cloudflared' | 'ngrok';
46
+
47
+ export type ShareTunnelState = 'stopped' | 'starting' | 'healthy' | 'failed';
48
+
49
+ export interface ShareTunnelHealth {
50
+ checkedAt: string;
51
+ latencyMs: number;
52
+ }
53
+
54
+ /**
55
+ * The capability vocabulary a grant is checked against.
56
+ *
57
+ * Wider than the roles on purpose: `public` and `never-share` are DECLARATIONS
58
+ * a route makes about itself, and `maintain` is the local-only authority no
59
+ * share role reaches — so this union is not derivable from {@link ShareRole}.
60
+ */
61
+ export type ShareCapability =
62
+ | 'public'
63
+ | 'view'
64
+ | 'comment'
65
+ | 'test'
66
+ | 'edit'
67
+ | 'terminal'
68
+ | 'maintain'
69
+ | 'never-share';
70
+
71
+ /** A verified Volter account, as a share participant projects onto the wire. */
72
+ export interface ShareAccount {
73
+ id: string;
74
+ email: string;
75
+ name?: string;
76
+ }
77
+
78
+ /**
79
+ * How the invitation was DELIVERED, when we delivered it.
80
+ *
81
+ * Present-and-`failed` is the state this field exists for: an invitation
82
+ * created whose email never left is otherwise indistinguishable, on every
83
+ * surface, from one that arrived.
84
+ */
85
+ export interface ShareInvitationDelivery {
86
+ channel: 'clerk-email';
87
+ status: 'sent' | 'failed';
88
+ providerInvitationId?: string;
89
+ sentAt?: string;
90
+ problem?: string;
91
+ }
92
+
93
+ export interface ShareInvitationRecord {
94
+ id: string;
95
+ inviterAccountId: string;
96
+ recipientAccountId?: string;
97
+ recipientEmail?: string;
98
+ recipientOrganizationId?: string;
99
+ recipientOrganizationName?: string;
100
+ recipientOrganizationDomain?: string;
101
+ /** The highest role this invitation may ever be raised to. */
102
+ roleCeiling: ShareRole;
103
+ usePolicy: 'person' | 'team';
104
+ createdAt: string;
105
+ expiresAt: string;
106
+ revokedAt?: string;
107
+ delivery?: ShareInvitationDelivery;
108
+ }
109
+
110
+ export interface ShareParticipant {
111
+ participantId: string;
112
+ account: ShareAccount;
113
+ invitationId: string;
114
+ role: ShareRole;
115
+ roleCeiling: ShareRole;
116
+ credentials: number;
117
+ joined: boolean;
118
+ }
119
+
120
+ export type ShareAuditEventType =
121
+ | 'auth-failed'
122
+ | 'auth-started'
123
+ | 'invite-redeemed'
124
+ | 'capability-denied'
125
+ | 'role-changed'
126
+ | 'participant-kicked'
127
+ | 'invitation-revoked'
128
+ | 'terminal-invoked';
129
+
130
+ export interface ShareAuditEvent {
131
+ at: string;
132
+ type: ShareAuditEventType;
133
+ invitationId?: string;
134
+ participantId?: string;
135
+ accountId?: string;
136
+ capability?: ShareCapability;
137
+ /** The role a `role-changed` event settled on. */
138
+ role?: ShareRole;
139
+ }
140
+
141
+ /** The `/__editor/share-control/status` payload. */
142
+ export interface ShareStatus {
143
+ active: boolean;
144
+ sessionId: string;
145
+ projectRoot: string;
146
+ publicUrl?: string;
147
+ tunnelProvider?: ShareTunnelProvider;
148
+ tunnel: ShareTunnelState;
149
+ health?: ShareTunnelHealth;
150
+ invitations: readonly ShareInvitationRecord[];
151
+ participants: readonly ShareParticipant[];
152
+ audit: readonly ShareAuditEvent[];
153
+ problem?: string;
154
+ }
155
+
156
+ /** The `/__editor/share-control/invitations` reply. */
157
+ export interface CreatedShareInvitation {
158
+ invitation: ShareInvitationRecord;
159
+ url: string;
160
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * THE COMPONENT-CONTRACT ANALYZER — the one browser-side question the kit's Content index asks
3
+ * of a source-authoring integration: what authoring contract each component a module defines
4
+ * exposes (which transform props land where, which channels it binds). An integration's
5
+ * contribution registers the analyzer; the index reads it. With none registered, a module
6
+ * declares no contracts, which is the honest answer for a product with no such integration.
7
+ *
8
+ * Module state under a `Symbol.for` key, like the host door, so the registration and the read
9
+ * meet across the editor's module instances.
10
+ */
11
+
12
+ import type { R3fComponentContract } from './source-authoring';
13
+
14
+ export type ComponentContractAnalyzer = (
15
+ source: string,
16
+ path: string,
17
+ ) => ReadonlyMap<string, R3fComponentContract>;
18
+
19
+ const ANALYZER_KEY = Symbol.for('volter.editor.componentContractAnalyzer');
20
+ type AnalyzerSlot = { [ANALYZER_KEY]?: ComponentContractAnalyzer | null };
21
+
22
+ export function registerComponentContractAnalyzer(analyzer: ComponentContractAnalyzer | null): void {
23
+ (globalThis as AnalyzerSlot)[ANALYZER_KEY] = analyzer;
24
+ }
25
+
26
+ export function componentContractAnalyzer(): ComponentContractAnalyzer | null {
27
+ return (globalThis as AnalyzerSlot)[ANALYZER_KEY] ?? null;
28
+ }
@@ -0,0 +1,439 @@
1
+ /**
2
+ * THE SOURCE-AUTHORING CONTRACT — the types that cross between the kit's source-write
3
+ * client and a source-authoring integration's routes (`/__ui-source/*`): an authored
4
+ * element's identity (`OidEntry`), what its component declares (`ComponentPropSpec`,
5
+ * `R3fComponentContract` and its channel bindings), and the source-edit wire shapes.
6
+ * Types only; the integration that stamps and writes source implements them.
7
+ */
8
+
9
+ export interface OidEntry {
10
+ file: string;
11
+ line: number; // 1-based
12
+ col: number; // 0-based (matches ts char)
13
+ component: string | null;
14
+ tag: string;
15
+ /**
16
+ * R3F-only, source-proven authoring contract for a LOCAL custom component
17
+ * callsite. `undefined` means the component definition is not in this file
18
+ * (usually an import), so the editor must retain its conservative fallback.
19
+ *
20
+ * A single native root plus forwarded standard group props is ordinary R3F,
21
+ * not a volter wrapper. Recording it here lets the editor safely ADD an absent
22
+ * transform prop at the callsite: the source analyser has proven where that
23
+ * prop lands. An empty `transformProps` list is an equally useful result —
24
+ * the local component exists, but exposes no writable spatial channel.
25
+ */
26
+ r3fAuthoring?: R3fComponentContract;
27
+ /**
28
+ * The props the tag's component DECLARES — resolved server-side through the
29
+ * TypeScript type checker (`component-prop-types.ts`) and shipped here so
30
+ * the editor can inspect a node by its declared surface rather than by the
31
+ * attributes someone happened to write. Absent for a native tag, or when the
32
+ * definition could not be resolved; the editor then falls back to reading
33
+ * the authored attributes alone.
34
+ */
35
+ props?: ComponentPropSpec[];
36
+ /**
37
+ * True once the server-side declared-prop resolver has ANSWERED for this
38
+ * tag — present even when the answer was "no props". Distinguishes "the
39
+ * declaration rung has not landed yet" (the resolver's cold ts.Program
40
+ * takes seconds and enrichment is async) from "the resolver looked and
41
+ * found nothing": the inspector's no-declaration warning is honest only in
42
+ * the second state. Measured on racing-game: the doctor's sweep inspected
43
+ * before the cold program answered, the fallback warned once-per-key, and
44
+ * the session ledger held six "No declaration covers" rows for props the
45
+ * resolver demonstrably types (`allowSleep:boolean`, `broadphase:enum`, …).
46
+ */
47
+ propsResolved?: true;
48
+ /** Props physically authored on this JSX callsite. Unlike {@link props},
49
+ * which describes the component declaration, this is the byte-level answer
50
+ * needed by instance editing: an override exists only when the attribute is
51
+ * present here, and applying it to the component is safe only when its source
52
+ * value is a literal. */
53
+ authoredProps?: Array<{
54
+ name: string;
55
+ valueText: string;
56
+ literal: boolean;
57
+ }>;
58
+ /**
59
+ * The R3F authorability diagnostics that pertain to THIS element, attached
60
+ * server-side by `currentOidIndex` so they ride the exact same
61
+ * `/__ui-source/index` payload (and therefore the exact same freshness) as
62
+ * every other source-derived field on this entry. Absent when there are
63
+ * none.
64
+ *
65
+ * Two kinds land here, both selected by `fileDiagnosticJoin`:
66
+ * the diagnostic recorded AT this element (an R3F004 "has no name" on this
67
+ * very callsite), and the ones recorded against the component whose body
68
+ * lexically contains it (R3F002/R3F003/R3F005 — `component` matches). The
69
+ * second is what carries a definition-side warning out to the rows that
70
+ * INSTANTIATE that component: an instance's boundary object also carries its
71
+ * definition-root oid, so the client reads both entries. See
72
+ * `r3f-diagnostic-index.ts`.
73
+ */
74
+ diagnostics?: R3fAuthoringDiagnostic[];
75
+ /**
76
+ * The oid of the JSX element that lexically ENCLOSES this one, in the same
77
+ * file. Recorded because a wrapper tag does not always become its own node:
78
+ * `<RigidBody>` from `@react-three/rapier` never forwards the editor's stamp
79
+ * to the Object3D it renders, so it has no live object to select — yet its
80
+ * props (`type`, `gravityScale`, colliders) are exactly the configuration an
81
+ * author expects to find on the thing inside it. This chain is what lets the
82
+ * inspector attribute a collapsed wrapper's props to the node it wraps.
83
+ */
84
+ parentOid?: string;
85
+ /**
86
+ * The PHYSICS BODY that owns this element's transform, when a simulation
87
+ * binding attached one to its ref (`r3f-physics-binding.ts`).
88
+ *
89
+ * Present ⇒ this element's own `position`/`rotation`/`scale` props are dead
90
+ * on arrival: the body writes the object's matrix every frame from ITS OWN
91
+ * spawn, so a write here produces source that contradicts the running world.
92
+ * Every writer reads it as a refusal that can name the binding, and the
93
+ * component contract reads its `forwarded` channels as real forwarding —
94
+ * which is what routes the write to the callsite literal the hook reads.
95
+ */
96
+ physicsBinding?: R3fPhysicsBinding;
97
+ /** Native Rapier joint hooks that name this `<RigidBody ref={…}>` as one
98
+ * endpoint. Hook parameters remain the project's TSX source of truth. */
99
+ jointBindings?: readonly R3fJointBinding[];
100
+ /** Native three.quarks shape construction bound to this emitter primitive. */
101
+ particleBinding?: R3fParticleBinding;
102
+ /** Drei Detailed is a source projection of the native THREE.LOD it creates. */
103
+ lodBinding?: R3fLodBinding;
104
+ /** Native Fiber scene attachment (`background` or `fog`). */
105
+ environmentBinding?: R3fEnvironmentBinding;
106
+ }
107
+ /**
108
+ * One R3F authoring-convention warning.
109
+ *
110
+ * DECLARED HERE, not in its producer. `r3f-project-contracts.ts` computes
111
+ * these (and re-exports this type for its existing importers), but that module
112
+ * imports `node:fs` — while this one is deliberately dependency-free so a
113
+ * PAGE can import it. Since a diagnostic now travels ON an `OidEntry` (see its
114
+ * `diagnostics` field), the TYPE has to live on the browser-safe side of that
115
+ * line even though the ANALYSIS does not.
116
+ */
117
+ export interface R3fAuthoringDiagnostic {
118
+ code: 'R3F002' | 'R3F003' | 'R3F004' | 'R3F005';
119
+ severity: 'warning';
120
+ file: string;
121
+ /** 1-based, and computed from `node.getStart()` — the SAME position basis
122
+ * `OidEntry.line`/`col` use, which is what makes an exact positional join
123
+ * between the two sound rather than approximate. */
124
+ line: number;
125
+ col: number;
126
+ /** The component the warning is ABOUT: the definition it names (R3F002/3/5)
127
+ * or the tag at the offending callsite (R3F004). */
128
+ component: string;
129
+ message: string;
130
+ }
131
+ /**
132
+ * A prop as DECLARED by a component, independent of any callsite. Lives here
133
+ * beside `OidEntry` because it travels on it; it is PRODUCED by
134
+ * `component-prop-types.ts` (server-side, needs a `ts.Program`) and CONSUMED
135
+ * by the editor's authoring adapters.
136
+ */
137
+ export interface ComponentPropSpec {
138
+ name: string;
139
+ /** Inspector widget implied by the declared type; `null` when no widget
140
+ * honestly represents it (the consumer falls back to the attribute text). */
141
+ type: 'string' | 'number' | 'boolean' | 'enum' | 'vec3' | 'json' | null;
142
+ /** Allowed values, for a union of string literals. */
143
+ options?: Array<string | number>;
144
+ /** Declared `?:`, or given a default by the component's destructuring. */
145
+ optional: boolean;
146
+ /** The default's source text (`1.55`, `'raider'`, `defaultSpawn()`). */
147
+ defaultText?: string;
148
+ /** The default as a value, when the default is a literal. */
149
+ defaultValue?: string | number | boolean | number[];
150
+ /** The prop's jsdoc, as one line. */
151
+ doc?: string;
152
+ }
153
+ export type R3fTransformProp = 'position' | 'rotation' | 'scale';
154
+ export interface R3fComponentContract {
155
+ root: 'single' | 'multiple' | 'non-spatial' | 'unknown';
156
+ rootTag?: string;
157
+ transformProps: R3fTransformProp[];
158
+ /** The callsite's native `visible` prop is proven to reach the single
159
+ * Object3D root. Omitted is deliberately false/unknown, so an editor never
160
+ * writes a decorative prop that the component silently ignores. */
161
+ visibleProp?: true;
162
+ /**
163
+ * The component's own source says the SIMULATION owns this transform: it
164
+ * neither accepts nor spreads a transform prop, and it writes its root's
165
+ * `position`/`rotation`/`quaternion`/`scale` through a ref every frame
166
+ * inside `useFrame`.
167
+ *
168
+ * Present (and only ever `true`) when both halves hold, so a contract that
169
+ * predates the distinction compares equal to one that has no opinion.
170
+ *
171
+ * This is a DECLARATION OF NON-AUTHORABILITY, never of authorability:
172
+ * `transformProps` stays empty, so every writer path
173
+ * (`transformEditability`) still refuses the edit — with an honest reason
174
+ * instead of "does not forward position". What it buys is silence from the
175
+ * convention diagnostics whose premise it falsifies (R3F002 asks the
176
+ * component to forward an authored transform the simulation would overwrite
177
+ * on the next tick; R3F005 warns that runtime motion fights an editor
178
+ * transform that cannot exist here).
179
+ */
180
+ simulationOwnedTransform?: boolean;
181
+ /**
182
+ * The subset of {@link transformProps} this component forwards to a PHYSICS
183
+ * BODY BINDING rather than to its native root — the channels whose callsite
184
+ * literal is read by a `useBox(…)`-family hook (`r3f-physics-binding.ts`).
185
+ *
186
+ * The write is exactly as real as any other forwarded prop, which is why
187
+ * these are IN `transformProps`; what this field adds is WHY it is real, and
188
+ * that fact has a consequence no other prop has: a body re-spawns from this
189
+ * literal and then owns the node's matrix, so the authored value must survive
190
+ * the re-settle after a remount. That is the `physics-binding`
191
+ * {@link WriteAnchorKind}'s own contract, and this is the source fact the
192
+ * planner reads to classify an anchor as one.
193
+ *
194
+ * Absent (never `[]`) when nothing is forwarded to a binding, so a contract
195
+ * that predates the distinction compares equal to one that has no opinion —
196
+ * the same rule `simulationOwnedTransform` above follows, and one the
197
+ * fixed-point loop in `collectR3fComponentContracts` depends on.
198
+ */
199
+ bodyForwarded?: R3fTransformProp[];
200
+ }
201
+ /**
202
+ * Mirrors `@volter/project/adapter/adapter-surface`'s `AdapterSurface` vocabulary
203
+ * (`'three' | 'canvas' | 'dom'`) as a bare literal union rather than
204
+ * importing it: this module is deliberately dependency-free (see the module
205
+ * doc comment above `OidEntry`) so a page with no bundler alias resolution can
206
+ * import it too. Every caller
207
+ * that already carries the real `AdapterSurface` (e.g. `binding-resolver.ts`)
208
+ * may pass it here directly; the two types are structurally identical.
209
+ */
210
+ export type DeclaredRootSurface = 'three' | 'canvas' | 'dom';
211
+ /**
212
+ * What ONE file's own bytes say about which reconciler its JSX targets.
213
+ *
214
+ * DIAGNOSTIC EVIDENCE ONLY — it decides no attribute anywhere. What a file
215
+ * renders is REPORTED (`server/project-root-surface.ts`'s `OID003`/`OID004`);
216
+ * which region it belongs to is a declaration or a reach, never a property of
217
+ * its bytes.
218
+ *
219
+ * Deliberately a cheap regex scan, not an AST walk, because it runs in a
220
+ * `transform` hook on every project `.tsx`. COMMENTS are
221
+ * stripped first (see {@link stripCommentsForScan}) so prose that merely
222
+ * NAMES a tag cannot count as rendering it; a mention inside a string still
223
+ * matches, which is deliberate — import specifiers ARE strings.
224
+ */
225
+ export interface SourceDialectEvidence {
226
+ /** Imports the R3F reconciler. */
227
+ reconcilerImport: boolean;
228
+ /** Distinct R3F-only intrinsic tags this file renders. */
229
+ r3fOnlyTags: string[];
230
+ /** Distinct DOM-only intrinsic tags this file renders. */
231
+ domOnlyTags: string[];
232
+ }
233
+ export interface R3fEnvironmentNumberBinding {
234
+ readonly value: number;
235
+ readonly start: number;
236
+ readonly end: number;
237
+ }
238
+ export interface R3fEnvironmentStringBinding {
239
+ readonly value: string;
240
+ readonly start: number;
241
+ readonly end: number;
242
+ readonly quote: "'" | '"' | '`';
243
+ }
244
+ export type R3fEnvironmentBinding =
245
+ | {
246
+ readonly kind: 'background-color';
247
+ readonly color?: R3fEnvironmentStringBinding;
248
+ }
249
+ | {
250
+ readonly kind: 'fog';
251
+ readonly color?: R3fEnvironmentStringBinding;
252
+ readonly near?: R3fEnvironmentNumberBinding;
253
+ readonly far?: R3fEnvironmentNumberBinding;
254
+ }
255
+ | {
256
+ readonly kind: 'fog-exp2';
257
+ readonly color?: R3fEnvironmentStringBinding;
258
+ readonly density?: R3fEnvironmentNumberBinding;
259
+ };
260
+ export type R3fJointHook =
261
+ | 'useFixedJoint'
262
+ | 'useSphericalJoint'
263
+ | 'useRevoluteJoint'
264
+ | 'usePrismaticJoint'
265
+ | 'useRopeJoint'
266
+ | 'useSpringJoint';
267
+ export type R3fJointLiteral = number | boolean | readonly R3fJointLiteral[];
268
+ export type R3fJointLiteralRange =
269
+ | { readonly start: number; readonly end: number }
270
+ | readonly R3fJointLiteralRange[];
271
+ export interface R3fJointBinding {
272
+ readonly hook: R3fJointHook;
273
+ readonly line: number;
274
+ readonly col: number;
275
+ readonly body1Ref: string;
276
+ readonly body2Ref: string;
277
+ readonly endpoint: 0 | 1;
278
+ readonly params?: readonly R3fJointLiteral[];
279
+ /** Exact leaf token ranges, shape-identical to `params`. Writers change only
280
+ * the numeric/boolean token they own, preserving formatting and comments. */
281
+ readonly paramRanges?: readonly R3fJointLiteralRange[];
282
+ }
283
+ export interface R3fLodNumberBinding {
284
+ readonly value: number;
285
+ readonly start: number;
286
+ readonly end: number;
287
+ }
288
+ export interface R3fLodBinding {
289
+ readonly line: number;
290
+ readonly col: number;
291
+ readonly distances?: readonly R3fLodNumberBinding[];
292
+ readonly hysteresis?: R3fLodNumberBinding;
293
+ }
294
+ export type QuarksEmitterShape =
295
+ | 'point'
296
+ | 'sphere'
297
+ | 'hemisphere'
298
+ | 'cone'
299
+ | 'circle'
300
+ | 'donut'
301
+ | 'rectangle'
302
+ | 'grid';
303
+ export interface R3fParticleNumberBinding {
304
+ readonly value: number;
305
+ readonly start: number;
306
+ readonly end: number;
307
+ }
308
+ export interface R3fParticleBinding {
309
+ readonly system: string;
310
+ readonly shape: QuarksEmitterShape;
311
+ readonly constructor: string;
312
+ readonly line: number;
313
+ readonly col: number;
314
+ readonly fields: Readonly<Record<string, R3fParticleNumberBinding>>;
315
+ }
316
+ export type PhysicsChannel = 'position' | 'rotation' | 'scale';
317
+ /**
318
+ * The body binding that owns one element's transform.
319
+ *
320
+ * JSON-shaped on purpose: it rides an `OidEntry` over `/__ui-source/index` to
321
+ * the page, so it holds no `ts.Node`.
322
+ */
323
+ export interface R3fPhysicsBinding {
324
+ /** The local name of the hook that created the body (`useBox`). */
325
+ hook: string;
326
+ /** 1-based line of the hook call, in the element's own file. */
327
+ line: number;
328
+ /** Channels whose spawn the hook takes from the component's own props — the
329
+ * write belongs at this component's CALLSITE. */
330
+ forwarded: PhysicsChannel[];
331
+ /** Channels the hook spells as an inline literal in its own argument. There
332
+ * is no write anchor for those; a refusal names them. */
333
+ literal: PhysicsChannel[];
334
+ /**
335
+ * Channels the component's OWN `useFrame` drives through the hook's api
336
+ * (`api.position.set(...)`) — the spawn is not the last word for these, so
337
+ * a callsite literal cannot hold: the game re-poses the body every frame
338
+ * (measured on racing-game's `Train`, a Kinematic body driven from its
339
+ * animated group — the doctor's settle leg read the authored spawn back as
340
+ * the old pose, digit for digit). Absent (never `[]`) when nothing drives
341
+ * the api, so an older recorded binding compares equal to one with no
342
+ * opinion — same rule as `bodyForwarded`'s absence.
343
+ */
344
+ apiDriven?: PhysicsChannel[];
345
+ }
346
+ export type ReparentChannel = 'position' | 'rotation' | 'scale';
347
+ /**
348
+ * The new LOCAL transform channels that preserve the element's world transform under
349
+ * the destination parent — computed by the caller, which is the only side that knows
350
+ * the live parents (R2). Absent channels are left exactly as authored.
351
+ */
352
+ export interface ReparentRebase {
353
+ readonly position?: readonly number[] | undefined;
354
+ readonly rotation?: readonly number[] | undefined;
355
+ readonly scale?: readonly number[] | undefined;
356
+ /** Channels whose native source spelling is scalar even when the live
357
+ * decomposition is carried as a one-value tuple (Pixi rotation). */
358
+ readonly scalarChannels?: readonly ReparentChannel[] | undefined;
359
+ }
360
+ /**
361
+ * What only the LIVE scene knows about a `reparent`, carried on the request so the
362
+ * pure planner (`reparent-guard.ts`) can decide R2/R3 without a scene of its own.
363
+ *
364
+ * Every field is optional and every one of them can only make the plan MORE strict:
365
+ * the planner's source-derivable rules (scope safety, children slot, literal-vs-
366
+ * dynamic) run identically whether or not a caller supplies them, so a client that
367
+ * knows nothing still gets a sound refusal rather than a silent corruption.
368
+ */
369
+ export interface StructReparentContext {
370
+ /** The new LOCAL transform that preserves the element's world transform under the
371
+ * destination — the caller computed it from the two live parents (R2). */
372
+ rebase?: ReparentRebase;
373
+ /** Live objects the destination oid resolves to; >1 is refused with the count (R3). */
374
+ destinationInstances?: number;
375
+ /** Live objects the moved element's oid resolves to; >1 warns and is allowed (R3). */
376
+ sourceInstances?: number;
377
+ }
378
+ export type SourceEditRequest =
379
+ /** `value` is a NUMBER for a numeric CSS property, and that is load-bearing:
380
+ * the writer emits a bare `12` (which React px-ifies at render) rather than
381
+ * the quoted `'12'` the CSSOM rejects. `null` is the REMOVAL sentinel. */
382
+ | { kind: 'style'; oid: string; prop: string; value: string | number | null }
383
+ | { kind: 'css'; file: string; selector: string; prop: string; value: string; media?: string }
384
+ | { kind: 'text'; oid: string; text: string }
385
+ | {
386
+ kind: 'prop';
387
+ oid: string;
388
+ prop: string;
389
+ /** `null` is the REMOVAL sentinel — the same shape `style` uses (D-A3);
390
+ * it routes to `removePropAttribute` instead of a value write. */
391
+ value: string | null;
392
+ addIfMissing?: boolean;
393
+ allowShapeUpgrade?: boolean;
394
+ }
395
+ | {
396
+ /** Replace a literal default in the component declaration containing
397
+ * `oid`. The component name comes from the OID index, never the caller. */
398
+ kind: 'component-default';
399
+ oid: string;
400
+ prop: string;
401
+ value: string;
402
+ }
403
+ | ({
404
+ kind: 'struct';
405
+ oid: string;
406
+ op: string;
407
+ targetOid?: string;
408
+ parentOid?: string;
409
+ wrapperTag?: string;
410
+ /** Optional multi-line JSX snippet for `create`/`create-sibling` — see
411
+ * `insertChildElement` / `insertSiblingElement`. */
412
+ snippet?: string;
413
+ /** A named import the inserted `snippet` needs (its tag is a component).
414
+ * Applied to the SAME file in the same plan, so the insert and the import
415
+ * it depends on are one write and one undo entry — see `ensureNamedImport`. */
416
+ ensureImport?: { name: string; module: string; kind?: 'default' | 'named' };
417
+ /** `duplicate` only — what the copy should differ in (`writer.ts` `DuplicateRewrite`). */
418
+ duplicate?: DuplicateRewrite;
419
+ } & StructReparentContext)
420
+ | { kind: 'struct-many'; oids: readonly string[]; op: string; wrapperTag?: string };
421
+ export interface PreparedSourceEdit {
422
+ readonly changed: boolean;
423
+ readonly file?: string;
424
+ readonly resourcePath?: string;
425
+ readonly prevSource?: string;
426
+ readonly newSource?: string;
427
+ readonly prevSha?: string;
428
+ readonly newSha?: string;
429
+ readonly result: Record<string, unknown>;
430
+ }
431
+ /** What a lane may ask {@link duplicateElement} to change on the COPY — the
432
+ * three lane's "a duplicate is visibly a second thing": a fresh `name` (only
433
+ * when the original carries a literal one — never invented) and a literal
434
+ * `position` nudged by `positionOffset` (added when absent, since an absent
435
+ * position IS the origin; left alone when dynamic). */
436
+ export interface DuplicateRewrite {
437
+ name?: string;
438
+ positionOffset?: readonly [number, number, number];
439
+ }