@volter/editor-core 0.5.57

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 (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * CONTRIBUTED COMMANDS — the registry behind `@volter/editor-sdk/commands`.
3
+ * `command-listener.ts` asks here before its own table, so a package's verb
4
+ * is answered by the package's handler with the host's relay, ack and
5
+ * status-derivation machinery unchanged around it. The rows are also what the
6
+ * loader reports to the server (`/__editor/contributed-commands`), which
7
+ * sizes its wait per verb from them.
8
+ */
9
+ import type {
10
+ CommandContribution,
11
+ CommandDerivedRefresh,
12
+ CommandSpec,
13
+ ContributedCommandRow,
14
+ } from '@volter/editor-sdk/commands';
15
+ import {
16
+ DEFAULT_RELAY_COMMAND_TIMEOUT_MS,
17
+ isRelayCommandType,
18
+ } from '@volter/editor-sdk/session/command-table';
19
+
20
+ interface Registered {
21
+ readonly entryPath: string;
22
+ readonly spec: CommandSpec;
23
+ }
24
+ const registered = new Map<string, Registered>();
25
+
26
+ /**
27
+ * Register a contribution's commands. Every type is checked before any is
28
+ * claimed, so a module with one bad row registers nothing. Returns the
29
+ * unregister.
30
+ */
31
+ export function registerContributedCommands(
32
+ entryPath: string,
33
+ commands: CommandContribution['commands'],
34
+ ): () => void {
35
+ const types = Object.keys(commands);
36
+ for (const type of types) {
37
+ if (isRelayCommandType(type))
38
+ throw new Error(`command "${type}" is the editor's own; a contribution cannot redefine it.`);
39
+ const other = registered.get(type);
40
+ if (other) throw new Error(`command "${type}" is already contributed by ${other.entryPath}.`);
41
+ const spec = commands[type];
42
+ if (typeof spec?.handle !== 'function')
43
+ throw new Error(`command "${type}" must carry a \`handle\` function.`);
44
+ if (spec.timeoutMs !== undefined && !(Number.isFinite(spec.timeoutMs) && spec.timeoutMs > 0))
45
+ throw new Error(`command "${type}" has a timeoutMs that is not a positive number.`);
46
+ }
47
+ for (const type of types) registered.set(type, { entryPath, spec: commands[type]! });
48
+ return () => {
49
+ for (const type of types)
50
+ if (registered.get(type)?.entryPath === entryPath) registered.delete(type);
51
+ };
52
+ }
53
+
54
+ export function contributedCommand(type: unknown): CommandSpec | null {
55
+ return typeof type === 'string' ? (registered.get(type)?.spec ?? null) : null;
56
+ }
57
+
58
+ export function contributedCommandDerivedRefresh(type: unknown): CommandDerivedRefresh | null {
59
+ const spec = contributedCommand(type);
60
+ return spec ? (spec.derivedRefresh ?? 'always') : null;
61
+ }
62
+
63
+ /** Every registered row, as reported to the server. */
64
+ export function contributedCommandRows(): ContributedCommandRow[] {
65
+ return [...registered.entries()].map(([type, { spec }]) => ({
66
+ type,
67
+ timeoutMs: spec.timeoutMs ?? DEFAULT_RELAY_COMMAND_TIMEOUT_MS,
68
+ derivedRefresh: spec.derivedRefresh ?? 'always',
69
+ }));
70
+ }
@@ -0,0 +1,205 @@
1
+ /**
2
+ * A COMPONENT BOARD IS REGISTERED — the sixth registry in the family of
3
+ * `workspace-document-restore.ts` (a kind owns its persisted state),
4
+ * `document-open-registry.ts` (a kind owns how it opens),
5
+ * `chrome-slot-registry.ts` (the host owns the place, a package owns what sits
6
+ * there), `content-entry-source-registry.ts` (the host owns the Content scope,
7
+ * a package owns why a component is content) and
8
+ * `authoring/design-time-mount-registry.ts` (the host owns the layer stack, a
9
+ * package owns how a medium mounts). Here: the host owns WHERE a project's
10
+ * component boards sit in the workspace — installing one, closing one,
11
+ * answering why one is absent — and a package owns WHICH medium it is a board
12
+ * of, whether this project has one, and what goes in it.
13
+ *
14
+ * WHY IT EXISTS. `components/world-documents.tsx` held a literal table of
15
+ * three media with an installer each (`COMPONENT_BOARDS`), reconciled against
16
+ * `getStoryMediaPresence()`, plus two absence thunks gated on
17
+ * `projectStoriesReady()`. Three statements about CSF, made in the host: that
18
+ * a project's boards are `dom`/`three`/`canvas`; that a board exists because
19
+ * the project has stories of that medium; and that "no board yet" and "no
20
+ * board ever" are told apart by a story-DISCOVERY flag. The host does not
21
+ * author portable CSF and must not know any of it (WORK.md §The open-source
22
+ * launch item 18a).
23
+ *
24
+ * THE SHAPE is transcribed from `content-entry-source-registry.ts:80-149`:
25
+ * register / list / subscribe with the owner-replaces-owner rule, and the
26
+ * registry RE-FANS each board's own `subscribe` into one signal, because the
27
+ * host's single reconciler must re-read when any board's verdict moves and
28
+ * which board moved is never its question (`:89-91`, `:122`). Three
29
+ * deliberate differences from `design-time-mount-registry.ts`, the sibling
30
+ * this door most resembles, each with its reason:
31
+ *
32
+ * - NO VERSION COUNTER, for that registry's reason: the only reader is
33
+ * `installRootDocuments`, which subscribes and re-reads. A counter with no
34
+ * caller is a name that got built because it was named.
35
+ * - PRESENCE IS RE-FANNED, where a design-time mount's staleness deliberately
36
+ * is not. The distinction is the one that registry's own note draws: a
37
+ * staleness signal must reach the ONE stack that mounted that medium
38
+ * carrying which action to take, while board presence is a registration-wide
39
+ * fact the single reconciler acts on uniformly.
40
+ * - NO `remountWhen`, AND THAT IS A MEASUREMENT. The membership rule this door
41
+ * was specified to absorb (a story added or deleted while a board is
42
+ * mounted must put the new frame on screen without F5) is a statement about
43
+ * a MEDIUM's mounted layers, which is exactly `DesignTimeMount.remountWhen`
44
+ * / `reprojectWhen` — already bound per medium by `mountDesignTimeLayers`
45
+ * (`design-time-layers.ts:717-742`) and already carrying this lane's two
46
+ * other staleness rules. A second hook here would fire on a board whose
47
+ * layers are not stories at all: the rule lived in `RootDocumentContent`,
48
+ * which mounts the dom board AND the canvas Scene, so a canvas world was
49
+ * being torn down and rebuilt every time an unrelated dom story was saved.
50
+ * It travels with the dom mount instead.
51
+ *
52
+ * PRESENCE IS TRI-STATE, and the third state is the whole point. `null` means
53
+ * "cannot answer yet" — a board whose census has not run. The host used to
54
+ * spell that condition itself as `projectStoriesReady()`, so it knew that a
55
+ * board waits on story discovery; now it knows only that a registration may
56
+ * not have a verdict, which is the same thing a document opener's `ready` and
57
+ * a design-time mount's late registration already say. An absence is spoken
58
+ * only when the owner has a verdict.
59
+ *
60
+ * NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
61
+ * board installs none and says so through the generic "no workspace document
62
+ * is named …" — the same honest emptiness a document kind with no registered
63
+ * opener gives.
64
+ */
65
+
66
+ import type { CompositeAuthoringAdapter } from './authoring/composite-authoring-adapter';
67
+ import type { EditorShellStore } from './editor-shell-store';
68
+
69
+ /** Everything a board reads from the HOST at install, and deliberately
70
+ * nothing more — measured against the three installers as they stood:
71
+ * `installThreeBoardDocument` and `installCanvasBoardDocument` read the shell
72
+ * store alone; the UI board additionally reads the session's composite,
73
+ * because it is a document OF a root and carries that root's provenance. */
74
+ export interface ComponentBoardContext {
75
+ /** The ONE format-neutral shell store the session's documents are opened
76
+ * against. */
77
+ readonly store: EditorShellStore;
78
+ /** The live session's composite authoring adapter — the roots this project
79
+ * actually mounted, for a board that is also a root's document. */
80
+ readonly composite: CompositeAuthoringAdapter;
81
+ }
82
+
83
+ export interface ComponentBoard {
84
+ /**
85
+ * The medium this is the board of, in the registering package's own
86
+ * vocabulary. The host never spells one: it compares this against a
87
+ * design-time root descriptor's `kind` to decide whether that root's
88
+ * document IS this board, and otherwise only passes it back.
89
+ */
90
+ readonly medium: string;
91
+ /** Which module registered it. Re-registering the same owner+medium
92
+ * REPLACES, so an HMR re-evaluation leaves one board, not two. */
93
+ readonly owner: string;
94
+ /** The workspace document id this board installs under. The host closes by
95
+ * it and answers "why is this id absent" from it. */
96
+ readonly documentId: string;
97
+ /** How the board is named to a human, for the host's own absence prose
98
+ * ("this project has no <title> board"). */
99
+ readonly title: string;
100
+ /**
101
+ * Does this project have this board? `'present'` installs it, `'absent'`
102
+ * closes it, and `null` is "no verdict yet" — the host neither installs nor
103
+ * speaks an absence, because a census that has not run is not a No.
104
+ */
105
+ readonly presence: () => 'present' | 'absent' | null;
106
+ /** The board's OWN change signal — its census settling, its discovery pass
107
+ * finishing. The host re-reconciles on it without knowing what moved. */
108
+ readonly subscribe: (listener: () => void) => () => void;
109
+ /**
110
+ * Open this board's workspace document. Called once per transition into
111
+ * `'present'`; the host closes it by {@link documentId}, exactly as it did
112
+ * when the table was a literal. Never activates: a board arrives
113
+ * asynchronously and must not yank the author off what they were looking at.
114
+ *
115
+ * MAY BE ASYNCHRONOUS — a board whose renderer costs a whole substrate
116
+ * (the 2D board initializes Pixi) loads its implementation only for a
117
+ * project that has one. A rejected promise or a throw un-reserves the id
118
+ * here, so the next verdict retries; saying WHAT failed is the board's own
119
+ * job, because only it knows what it was loading.
120
+ */
121
+ readonly install: (context: ComponentBoardContext) => void | Promise<void>;
122
+ /**
123
+ * Why THIS project has no board of this medium, and what would make one
124
+ * appear — the fix text, in the lane's own vocabulary. Read only while
125
+ * {@link presence} says `'absent'`.
126
+ */
127
+ readonly absentReason: () => string;
128
+ }
129
+
130
+ const _boards: ComponentBoard[] = [];
131
+ const listeners = new Set<() => void>();
132
+ /** Live teardowns for the per-board presence subscriptions the registry
133
+ * re-fans (`content-entry-source-registry.ts:102`). */
134
+ const boardSubscriptions = new Map<ComponentBoard, () => void>();
135
+
136
+ function publish(): void {
137
+ for (const listener of listeners) listener();
138
+ }
139
+
140
+ /** Install a board. Returns the teardown. */
141
+ export function registerComponentBoard(board: ComponentBoard): () => void {
142
+ const stale = _boards.findIndex(
143
+ (item) => item.owner === board.owner && item.medium === board.medium,
144
+ );
145
+ if (stale >= 0) {
146
+ const [removed] = _boards.splice(stale, 1);
147
+ if (removed) {
148
+ boardSubscriptions.get(removed)?.();
149
+ boardSubscriptions.delete(removed);
150
+ }
151
+ }
152
+ _boards.push(board);
153
+ boardSubscriptions.set(board, board.subscribe(publish));
154
+ publish();
155
+ return () => {
156
+ const at = _boards.indexOf(board);
157
+ if (at < 0) return;
158
+ _boards.splice(at, 1);
159
+ boardSubscriptions.get(board)?.();
160
+ boardSubscriptions.delete(board);
161
+ publish();
162
+ };
163
+ }
164
+
165
+ const EMPTY: readonly ComponentBoard[] = [];
166
+
167
+ /** Everything registered, in registration order. A stable array while nothing
168
+ * changes, so a reader can compare identities across a notification. */
169
+ export function componentBoards(): readonly ComponentBoard[] {
170
+ return _boards.length === 0 ? EMPTY : _boards;
171
+ }
172
+
173
+ /** The board of one medium, or `null` — "no package registered one", which is
174
+ * a real answer and never an error. The LAST registration wins, the same way
175
+ * a later design-time mount of the same kind does. */
176
+ export function componentBoardForMedium(medium: string): ComponentBoard | null {
177
+ for (let i = _boards.length - 1; i >= 0; i--) {
178
+ const board = _boards[i];
179
+ if (board && board.medium === medium) return board;
180
+ }
181
+ return null;
182
+ }
183
+
184
+ /** The board installed under a workspace document id, or `null`. */
185
+ export function componentBoardForDocument(documentId: string): ComponentBoard | null {
186
+ return _boards.find((board) => board.documentId === documentId) ?? null;
187
+ }
188
+
189
+ /** ONE subscription for the reconciler: the registry's own changes AND every
190
+ * registered board's presence signal. What changed is never its question. */
191
+ export function subscribeComponentBoards(listener: () => void): () => void {
192
+ listeners.add(listener);
193
+ return () => {
194
+ listeners.delete(listener);
195
+ };
196
+ }
197
+
198
+ /** Test-only reset (mirrors the restore, open, chrome-slot, content-source and
199
+ * design-time-mount registries'). */
200
+ export function __resetComponentBoardsForTest(): void {
201
+ for (const stop of boardSubscriptions.values()) stop();
202
+ boardSubscriptions.clear();
203
+ _boards.length = 0;
204
+ publish();
205
+ }
@@ -0,0 +1,200 @@
1
+ /**
2
+ * A COMPONENT'S NAMED STATES ARE SOURCED, NOT CONSTRUCTED — the seventh
3
+ * registry in the family, and the direct sibling of the member unit 11 minted
4
+ * next door: `content-entry-source-registry.ts:166-176`'s
5
+ * `contentEntryForComponent(ref)` answers "what does this component LOOK
6
+ * like?" by registration; this answers "what named STATES does it have, and
7
+ * what does applying one do?".
8
+ *
9
+ * WHY IT EXISTS. `StoriesProvider` (`@volter/editor-project/adapter` authoring.ts:706) is the
10
+ * ENGINE's contract and does not change — an adapter says which named states a
11
+ * node has, in its own vocabulary. What changed is who FILLS it. Three
12
+ * keep-bucket host adapters CONSTRUCTED the CSF implementation inside their own
13
+ * constructors:
14
+ *
15
+ * authoring/r3f-source-authoring-adapter.ts:637 unconditional
16
+ * authoring/three-authoring-adapter.ts:506 gated on `sourceDeclaresStories`
17
+ * authoring/pixi-authoring-adapter.ts:773 gated on the target's identity
18
+ *
19
+ * and no registry reaches into a constructor, so no existing point carried it
20
+ * — which is why `authoring/project-three-stories.ts` (and through it
21
+ * `stories/story-registry.ts`, and through THAT `storybook/internal/preview-api`)
22
+ * could not leave the host however many boards moved (WORK.md §The open-source
23
+ * launch item 18b).
24
+ *
25
+ * WHAT THE MEASUREMENT SAID THE THREE CONSTRUCTIONS DIFFER BY, and therefore
26
+ * what a source must be handed rather than hold:
27
+ *
28
+ * - THE COMPONENT-IDENTITY CLOSURE. All three produce the same SHAPE
29
+ * ({@link ComponentStatesRef}) by three different routes: the R3F source
30
+ * adapter resolves a definition/callsite and can name the defining FILE;
31
+ * the three adapter reads its hierarchy node's `typeLabel` and has no file;
32
+ * the pixi adapter delegates to its write target's `componentIdentity`.
33
+ * That closure stays with the adapter — it is the adapter's own semantic
34
+ * knowledge of what a node IS — and travels per call.
35
+ * - THE SURFACE. The three-flavoured construction applied a state by opening
36
+ * the Object3D turntable; the canvas one opened the ordinary isolated story
37
+ * document. That was the ONLY difference between the two factory functions.
38
+ * A source is handed the asking adapter's surface and dispatches on it, the
39
+ * way the story opener's own readiness does.
40
+ *
41
+ * WHAT THE HOST KEEPS, and why it is not a leak: the per-node ACTIVE map and
42
+ * the change notification — identical in all three constructions, about the
43
+ * editor session rather than about states — and the refusal when an `apply`
44
+ * names a state that does not belong to the node. {@link componentStatesProvider}
45
+ * is that bookkeeping and nothing else.
46
+ *
47
+ * NOTHING REGISTERED IS A REAL ANSWER, and here it is a SPOKEN one: the
48
+ * provider's `unavailable()` says that no package registered a source, which
49
+ * is precisely the distinction that member exists to draw ("an empty
50
+ * `storiesFor` and an UNREAD one look identical from the section that draws
51
+ * them, and only the provider knows which").
52
+ *
53
+ * DELIBERATELY ABSENT: `isolate` and `title`. `StoriesProvider` publishes
54
+ * both, no CSF construction ever supplied either (`resolveComposeStoriesInput`
55
+ * passes `isolation: null` unconditionally), and a member on a registry gets
56
+ * built whether or not anything wants it. They belong here the day a source
57
+ * has one.
58
+ */
59
+
60
+ import type { AdapterSurface, StoriesProvider, StoryRef } from '@volter/editor-project/adapter';
61
+ import { editorConsole } from './editor-console';
62
+ import type { EditorShellStore } from './editor-shell-store';
63
+
64
+ /**
65
+ * A component as a STATES source sees it — the exact shape all three adapter
66
+ * closures already produced. `sourcePath` is absent for an adapter that knows
67
+ * the component's NAME but not the module it is defined in.
68
+ */
69
+ export interface ComponentStatesRef {
70
+ readonly name: string;
71
+ readonly sourcePath?: string;
72
+ }
73
+
74
+ /** What a source is asked the question IN. */
75
+ export interface ComponentStatesContext {
76
+ /** The authoring surface the asking adapter mounts on. A source that means
77
+ * different things on different surfaces (opening a state in the Object3D
78
+ * turntable versus the isolated story document) dispatches on it; the host
79
+ * never reads it. */
80
+ readonly surface: AdapterSurface;
81
+ /** The ONE format-neutral shell store, for a state whose application opens a
82
+ * document or moves the session. */
83
+ readonly store: EditorShellStore;
84
+ }
85
+
86
+ export interface ComponentStatesSource {
87
+ /** The source's id, in its own vocabulary. */
88
+ readonly id: string;
89
+ /** Which module registered it. Re-registering the same owner+id REPLACES,
90
+ * so an HMR re-evaluation leaves one source, not two. */
91
+ readonly owner: string;
92
+ /** Ascending; ties keep registration order. */
93
+ readonly order?: number;
94
+ /** This component's named states, or `[]` — "none of mine", which lets the
95
+ * next source answer. */
96
+ readonly statesFor: (
97
+ component: ComponentStatesRef,
98
+ context: ComponentStatesContext,
99
+ ) => readonly StoryRef[];
100
+ /** Apply one of the states this source just named. Whether that opens a
101
+ * document, swaps a world or writes source is the source's business. */
102
+ readonly apply: (
103
+ component: ComponentStatesRef,
104
+ stateId: string,
105
+ context: ComponentStatesContext,
106
+ ) => void;
107
+ }
108
+
109
+ const _sources: ComponentStatesSource[] = [];
110
+
111
+ /** Install a source. Returns the teardown. */
112
+ export function registerComponentStatesSource(source: ComponentStatesSource): () => void {
113
+ const stale = _sources.findIndex((item) => item.owner === source.owner && item.id === source.id);
114
+ if (stale >= 0) _sources.splice(stale, 1);
115
+ _sources.push(source);
116
+ _sources.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
117
+ return () => {
118
+ const at = _sources.indexOf(source);
119
+ if (at >= 0) _sources.splice(at, 1);
120
+ };
121
+ }
122
+
123
+ const EMPTY: readonly ComponentStatesSource[] = [];
124
+
125
+ /** Everything registered, in order. */
126
+ export function componentStatesSources(): readonly ComponentStatesSource[] {
127
+ return _sources.length === 0 ? EMPTY : _sources;
128
+ }
129
+
130
+ /**
131
+ * THE ADAPTER'S `stories` MEMBER, bound over the registry — a thin binding an
132
+ * adapter constructs instead of constructing an implementation.
133
+ *
134
+ * `componentForNode` is the adapter's own semantic knowledge of what a node
135
+ * IS; everything past it is a registered source's. The FIRST source that names
136
+ * a state for a component owns that component, the way
137
+ * `contentEntryForComponent` takes the first source that admits one.
138
+ */
139
+ export function componentStatesProvider(
140
+ surface: AdapterSurface,
141
+ store: EditorShellStore,
142
+ componentForNode: (nodeId: string) => ComponentStatesRef | null,
143
+ ): StoriesProvider {
144
+ const activeByNode = new Map<string, string>();
145
+ const context: ComponentStatesContext = { surface, store };
146
+
147
+ /** The source that answers for this node, and what it answered. */
148
+ const resolve = (
149
+ nodeId: string,
150
+ ): { source: ComponentStatesSource; states: readonly StoryRef[] } | null => {
151
+ const component = componentForNode(nodeId);
152
+ if (!component) return null;
153
+ for (const source of _sources) {
154
+ const states = source.statesFor(component, context);
155
+ if (states.length > 0) return { source, states };
156
+ }
157
+ return null;
158
+ };
159
+
160
+ return {
161
+ storiesFor: (nodeId) => [...(resolve(nodeId)?.states ?? [])],
162
+ active: (nodeId) => activeByNode.get(nodeId) ?? null,
163
+ apply: (nodeId, stateId) => {
164
+ if (stateId === null) {
165
+ activeByNode.delete(nodeId);
166
+ store.notifyIngestEdit();
167
+ return;
168
+ }
169
+ const answer = resolve(nodeId);
170
+ if (!answer?.states.some((state) => state.id === stateId)) {
171
+ editorConsole.warn(
172
+ `[component-states] stories.apply: state "${stateId}" does not belong to node ` +
173
+ `"${nodeId}" on the ${surface} surface — ignoring.`,
174
+ 'authoring',
175
+ );
176
+ return;
177
+ }
178
+ const component = componentForNode(nodeId);
179
+ if (!component) return;
180
+ activeByNode.set(nodeId, stateId);
181
+ answer.source.apply(component, stateId, context);
182
+ store.notifyIngestEdit();
183
+ },
184
+ // The distinction this member exists to draw: an empty list because this
185
+ // component has no states, and an empty list because nothing in this
186
+ // editor can read them, are different answers.
187
+ unavailable: () =>
188
+ _sources.length > 0
189
+ ? null
190
+ : 'No package in this editor registered a source of component states, so this ' +
191
+ "component's named states could not be read. A build ships the packages its own " +
192
+ 'entry in `builds/` lists.',
193
+ };
194
+ }
195
+
196
+ /** Test-only reset (mirrors the restore, open, chrome-slot, content-source,
197
+ * design-time-mount and component-board registries'). */
198
+ export function __resetComponentStatesSourcesForTest(): void {
199
+ _sources.length = 0;
200
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * "Agent presented this view" — published as a NOTIFICATION
3
+ * (`editor-notifications.ts`), with Copy Link and Return inline. It used to be
4
+ * a banner floated over the document's top centre, across the tab row; the
5
+ * owner named that shape as wrong (2026-09-04) and the notification stack is
6
+ * where an event like this goes. This component keeps no DOM: it watches the
7
+ * presentation-notice store and mirrors it into a card.
8
+ */
9
+
10
+ import { useEffect, useSyncExternalStore } from 'react';
11
+ import { editorConsole } from '../editor-console';
12
+ import { dismissNotification, notify } from '../editor-notifications';
13
+ import {
14
+ clearEditorPresentationNotice,
15
+ editorPresentationNotice,
16
+ editorPresentationNoticeVersion,
17
+ subscribeEditorPresentationNotice,
18
+ } from '../editor-presentation-notice';
19
+ import { useEditorStore } from '../editor-runtime';
20
+ import { presentEditorView } from '../editor-view-presentation';
21
+
22
+ const NOTIFICATION_ID = 'agent-presented-view';
23
+
24
+ export function AgentPresentationNotice() {
25
+ const store = useEditorStore();
26
+ useSyncExternalStore(
27
+ subscribeEditorPresentationNotice,
28
+ editorPresentationNoticeVersion,
29
+ editorPresentationNoticeVersion,
30
+ );
31
+ const notice = editorPresentationNotice();
32
+ useEffect(() => {
33
+ if (!notice) {
34
+ dismissNotification(NOTIFICATION_ID);
35
+ return;
36
+ }
37
+ notify({
38
+ id: NOTIFICATION_ID,
39
+ tone: 'info',
40
+ title: 'Agent presented this view.',
41
+ ...(notice.presented.warnings.length > 0
42
+ ? { detail: notice.presented.warnings.join(' ') }
43
+ : {}),
44
+ onDismiss: clearEditorPresentationNotice,
45
+ actions: [
46
+ {
47
+ label: 'Copy Link',
48
+ keeps: true,
49
+ run: () => {
50
+ void Promise.resolve()
51
+ .then(() => navigator.clipboard.writeText(notice.presented.url))
52
+ .catch(() => {
53
+ editorConsole.warn('Could not copy the view link to the clipboard.', 'editor');
54
+ });
55
+ },
56
+ },
57
+ {
58
+ label: 'Return',
59
+ primary: true,
60
+ run: () => {
61
+ void presentEditorView(store, notice.previousView, { origin: 'return' }).catch(
62
+ (error) => {
63
+ editorConsole.error(
64
+ `Could not return to the previous editor view: ${error instanceof Error ? error.message : String(error)}`,
65
+ 'editor',
66
+ );
67
+ },
68
+ );
69
+ },
70
+ },
71
+ ],
72
+ });
73
+ }, [notice, store]);
74
+ return null;
75
+ }