@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,586 @@
1
+ import {
2
+ registerAvailableWorkspaceDocument,
3
+ unregisterAvailableWorkspaceDocument,
4
+ } from '../workspace-available-documents';
5
+ /**
6
+ * Edit-time center documents for a project, beside the native Three.js scene
7
+ * document. Runtime composition belongs to the Game document (which exists
8
+ * only while a runtime does); authoring pins the project-level component
9
+ * boards — one per registered medium, each installed and closed here on its
10
+ * own package's verdict (`component-board-registry.ts`). This module names no
11
+ * board and no medium.
12
+ *
13
+ * THE SCENE VIEWPORT IS FOR THE SCENE (owner, 2026-08-10). Every edit-time
14
+ * subject presents through a document of its own; nothing composites over the
15
+ * viewport while editing.
16
+ */
17
+
18
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
19
+ import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
20
+ import { getActiveAuthoring } from '../authoring/active-adapter';
21
+ import { authoringAdapterKey } from '../authoring/adapter-key';
22
+ import type { CompositeAuthoringAdapter } from '../authoring/composite-authoring-adapter';
23
+ import {
24
+ type DesignTimeRootDescriptor,
25
+ designTimeRootDescriptors,
26
+ mountDesignTimeLayers,
27
+ } from '../authoring/design-time-layers';
28
+ import { INVALID_MANIFEST_SURFACE } from '../authoring/edit-mode-authoring';
29
+ import {
30
+ getMountFailureReports,
31
+ subscribeToMountFailures,
32
+ } from '../authoring/mount-failure-report';
33
+ import {
34
+ installCanvasSceneNavigation,
35
+ installReactCanvasNavigation,
36
+ } from '../authoring/react-canvas-navigation';
37
+ import {
38
+ REACT_DESIGN_CANVAS_COLOR,
39
+ REACT_DESIGN_CANVAS_DOT,
40
+ } from '../authoring/react-design-canvas-style';
41
+ import { resolveViewportToolContext } from '../authoring/viewport-tool-context';
42
+ import {
43
+ createRootViewController,
44
+ getRootPan,
45
+ sharedRootViewController,
46
+ subscribeRootPan,
47
+ } from '../authoring/world-pan-state';
48
+ import {
49
+ type ComponentBoard,
50
+ componentBoardForDocument,
51
+ componentBoardForMedium,
52
+ componentBoards,
53
+ subscribeComponentBoards,
54
+ } from '../component-board-registry';
55
+ import type { EditorShellStore } from '../editor-shell-store';
56
+ import { setActiveScope } from '../hotkeys';
57
+ import { readinessFacet, subscribeRootReadiness } from '../readiness';
58
+ import { explainSurface } from '../surface-state';
59
+ import { recordViewportFirstFrame } from '../viewport-activation-timings';
60
+ import {
61
+ CANVAS_SCENE_DOCUMENT_ID,
62
+ GAME_DOCUMENT_ID,
63
+ SCENE_DOCUMENT_ID,
64
+ } from '../workspace-document-ids';
65
+ import {
66
+ activateWorkspaceDocument,
67
+ activeWorkspaceDocumentId,
68
+ closeWorkspaceDocument,
69
+ openWorkspaceDocuments,
70
+ registerWorkspaceDocumentSelection,
71
+ type WorkspaceDocumentContentProps,
72
+ } from '../workspace-document-registry';
73
+ import {
74
+ registerRootDocumentGap,
75
+ registerRootDocumentRoute,
76
+ registerWorkspaceDocumentGap,
77
+ } from '../world-document-routing';
78
+ import { BoardRulers } from './BoardRulers';
79
+ import {
80
+ CANVAS_SCENE_BACKGROUND,
81
+ CanvasSceneBackdrop,
82
+ CanvasSceneControls,
83
+ } from './CanvasSceneViewport';
84
+ import { ReactCanvasControls } from './ReactCanvasControls';
85
+ import { RootSelectionOverlay } from './RootSelectionOverlay';
86
+ import { SurfaceStateOverlay } from './SurfaceStateOverlay';
87
+
88
+ /** The canvas root's world document reads `Scene`, exactly like a three
89
+ * project's — THE SCENE VIEWPORT IS FOR THE SCENE, and a 2D world is a scene
90
+ * (owner, 2026-08-15: "why don't we have a 'scene'? it's a 2d scene of
91
+ * course"). A project has one medium's scene or the other, never both. */
92
+ const CANVAS_SCENE_TITLE = 'Scene';
93
+
94
+ export function RootDocumentContent({
95
+ active,
96
+ composite,
97
+ descriptor,
98
+ documentId,
99
+ store,
100
+ }: WorkspaceDocumentContentProps & {
101
+ composite: CompositeAuthoringAdapter;
102
+ descriptor: DesignTimeRootDescriptor;
103
+ store: EditorShellStore;
104
+ }) {
105
+ const containerRef = useRef<HTMLDivElement>(null);
106
+ const disposeMountRef = useRef<(() => void) | null>(null);
107
+ const [canvasSceneView] = useState(createRootViewController);
108
+ const isCanvasScene = descriptor.kind === 'canvas';
109
+ const documentView = isCanvasScene ? canvasSceneView : sharedRootViewController;
110
+ useSyncExternalStore(store.subscribe, store.getSnapshot);
111
+ const rootReadiness = useSyncExternalStore(subscribeRootReadiness, readinessFacet);
112
+ const mountFailures = useSyncExternalStore(subscribeToMountFailures, getMountFailureReports);
113
+ // The layer's own adapter, for a board that has no composite child to carry
114
+ // it — either a rootless board, or Dev (whose runtime root is deliberately
115
+ // not an authoring child). A board's presence is its package's verdict, not
116
+ // a fact about roots. The composite child stays the authority whenever
117
+ // there IS one.
118
+ const [mountedAdapter, setMountedAdapter] = useState<AuthoringAdapter | null>(null);
119
+ const documentAdapter =
120
+ composite.childAdapters().find((child) => child.worldId === descriptor.worldId)?.adapter ??
121
+ mountedAdapter ??
122
+ undefined;
123
+ const isBabylonScene = isCanvasScene && documentAdapter?.provenance?.label === 'babylon';
124
+ const nativeRoots = documentAdapter?.hierarchy.roots() ?? [];
125
+ const emptyRootIds = new Set(
126
+ documentAdapter?.rects?.emptyContainers?.().map((entry) => entry.id) ?? [],
127
+ );
128
+ const hasRenderableContent = nativeRoots.some((root) => !emptyRootIds.has(root.id));
129
+ const rootExplanation = explainSurface({
130
+ surface: isCanvasScene ? 'Scene' : descriptor.kind === 'dom' ? 'UI' : 'World',
131
+ rootIds: [descriptor.worldId],
132
+ // While the game PLAYS, this document's design mount is deliberately
133
+ // suspended — the wait is not progress and says so (surface-state.ts).
134
+ playSuspended:
135
+ store.playState !== 'stopped' &&
136
+ (!documentAdapter || documentAdapter.provenance?.source === 'boundary'),
137
+ phase:
138
+ !documentAdapter || documentAdapter.provenance?.source === 'boundary' ? 'loading' : 'ready',
139
+ content:
140
+ !documentAdapter || documentAdapter.provenance?.source === 'boundary'
141
+ ? 'unknown'
142
+ : hasRenderableContent
143
+ ? 'present'
144
+ : 'empty',
145
+ readiness: rootReadiness,
146
+ failures: mountFailures,
147
+ });
148
+
149
+ // A world document owns the shared Hierarchy/Inspector context while it is
150
+ // the visible center subject. Publish only this document's child: the Game
151
+ // document is the composition-wide surface, while an authored root document
152
+ // must not leak sibling roots into its panels. The node id is read live from
153
+ // the same selection provider the canvas updates.
154
+ useEffect(() => {
155
+ if (!documentAdapter) return;
156
+ return registerWorkspaceDocumentSelection(documentId, () => ({
157
+ adapter: documentAdapter,
158
+ nodeId: [...store.selectedEntityIds].find((id) => documentAdapter.hierarchy.node(id)) ?? null,
159
+ }));
160
+ }, [composite, documentAdapter, documentId, store]);
161
+
162
+ useEffect(() => {
163
+ const container = containerRef.current;
164
+ if (!container) return;
165
+ if (isBabylonScene) return;
166
+ return isCanvasScene
167
+ ? installCanvasSceneNavigation(container, documentView)
168
+ : installReactCanvasNavigation(container, documentView);
169
+ }, [documentView, isBabylonScene, isCanvasScene]);
170
+
171
+ // An open document stays mounted. Defer the relatively expensive Pixi/React
172
+ // mount until the world is first visited, then retain it across tab changes
173
+ // so hierarchy identity, story selection, and source editing remain stable.
174
+ useEffect(() => {
175
+ if (!active) return;
176
+ const alreadyMounted = Boolean(disposeMountRef.current);
177
+ if (!alreadyMounted && containerRef.current) {
178
+ disposeMountRef.current = mountDesignTimeLayers(
179
+ containerRef.current,
180
+ composite,
181
+ store,
182
+ [descriptor],
183
+ (_worldId, adapter) => setMountedAdapter(adapter),
184
+ isCanvasScene ? { canvasSceneView } : undefined,
185
+ documentId,
186
+ );
187
+ return;
188
+ }
189
+ // Switch-back of a retained board: the next two frames are the first
190
+ // painted frames after the tab is in front. No remount, no WebGL.
191
+ let frames = 0;
192
+ let raf = 0;
193
+ const paint = (): void => {
194
+ frames += 1;
195
+ if (frames < 2) {
196
+ raf = requestAnimationFrame(paint);
197
+ return;
198
+ }
199
+ recordViewportFirstFrame(documentId);
200
+ };
201
+ raf = requestAnimationFrame(paint);
202
+ return () => cancelAnimationFrame(raf);
203
+ }, [active, canvasSceneView, composite, descriptor, documentId, isCanvasScene, store]);
204
+
205
+ // A MOUNTED LAYER'S STALENESS IS ITS MEDIUM'S STATEMENT, NOT THIS
206
+ // COMPONENT'S. This effect used to remount the whole stack whenever the
207
+ // project's story MEMBERSHIP changed (a story saved from the editor's own
208
+ // header, a hand-edited `.stories.tsx`), so a new frame appeared without an
209
+ // F5 — blind-walk beat 9. It was a rule about one medium spelled in a
210
+ // component that mounts two: a canvas world's `<Application>` was torn down
211
+ // and rebuilt every time an unrelated dom story was saved. It lives with
212
+ // the dom mount now, as `DesignTimeMount.reprojectWhen`
213
+ // (`@vgai/dom`'s `reprojectWhenStoriesRepublish`), which the stack binds per
214
+ // medium and applies only to that medium's candidates
215
+ // (`design-time-layers.ts:717-742`) — and which re-projects rather than
216
+ // remounting, so the board no longer blinks through empty on the way.
217
+
218
+ useEffect(
219
+ () => () => {
220
+ disposeMountRef.current?.();
221
+ disposeMountRef.current = null;
222
+ },
223
+ [],
224
+ );
225
+
226
+ const selectedContext = resolveViewportToolContext(
227
+ getActiveAuthoring(store),
228
+ store.selectedEntityIds,
229
+ );
230
+ const context =
231
+ selectedContext?.worldId === descriptor.worldId
232
+ ? selectedContext
233
+ : documentAdapter?.rects
234
+ ? { worldId: descriptor.worldId, kind: 'dom' as const, adapter: documentAdapter }
235
+ : null;
236
+ return (
237
+ <div
238
+ ref={containerRef}
239
+ data-testid={`world-document:${descriptor.worldId}`}
240
+ data-vgai-backdrop-color={
241
+ active
242
+ ? isBabylonScene
243
+ ? '#111827'
244
+ : isCanvasScene
245
+ ? CANVAS_SCENE_BACKGROUND
246
+ : REACT_DESIGN_CANVAS_COLOR
247
+ : undefined
248
+ }
249
+ data-vgai-backdrop-policy={active ? 'dark-frost' : undefined}
250
+ onPointerDown={() => setActiveScope('viewport')}
251
+ style={{
252
+ // DOM component documents are Storybook/Figma-style boards. A Canvas
253
+ // root is instead a native 2D Scene with its own editor camera; both
254
+ // remain independent center documents rather than runtime layers.
255
+ position: 'absolute',
256
+ inset: 0,
257
+ overflow: 'hidden',
258
+ pointerEvents: 'auto',
259
+ backgroundColor: isBabylonScene
260
+ ? '#111827'
261
+ : isCanvasScene
262
+ ? CANVAS_SCENE_BACKGROUND
263
+ : REACT_DESIGN_CANVAS_COLOR,
264
+ touchAction: 'none',
265
+ }}
266
+ >
267
+ {isBabylonScene ? null : isCanvasScene ? (
268
+ <CanvasSceneBackdrop view={canvasSceneView} />
269
+ ) : (
270
+ <ReactDesignCanvasBackdrop />
271
+ )}
272
+ <RootSelectionOverlay
273
+ key={`selection:${authoringAdapterKey(documentAdapter)}`}
274
+ {...(documentAdapter ? { adapter: documentAdapter } : {})}
275
+ {...(isCanvasScene && !isBabylonScene
276
+ ? { view: canvasSceneView, transformModeAware: true }
277
+ : {})}
278
+ />
279
+ <SurfaceStateOverlay
280
+ explanation={rootExplanation}
281
+ testId={`world-surface-status:${descriptor.worldId}`}
282
+ style={{ zIndex: 20 }}
283
+ />
284
+ {isBabylonScene ? null : isCanvasScene ? (
285
+ <CanvasSceneControls
286
+ key={`controls:${authoringAdapterKey(documentAdapter)}`}
287
+ active={active}
288
+ {...(documentAdapter ? { adapter: documentAdapter } : {})}
289
+ containerRef={containerRef}
290
+ view={canvasSceneView}
291
+ />
292
+ ) : (
293
+ <>
294
+ <BoardRulers docId={descriptor.worldId} containerRef={containerRef} />
295
+ <ReactCanvasControls containerRef={containerRef} context={context} />
296
+ </>
297
+ )}
298
+ </div>
299
+ );
300
+ }
301
+
302
+ /** Infinite editor canvas behind React story frames. The dot origin follows
303
+ * the same world transform, making pan/zoom legible without implying that the
304
+ * runtime React layer owns any background at all. */
305
+ function ReactDesignCanvasBackdrop() {
306
+ const view = useSyncExternalStore(subscribeRootPan, getRootPan);
307
+ const spacing = Math.max(8, 24 * view.zoom);
308
+ const dotRadius = Math.max(0.7, Math.min(1.4, view.zoom));
309
+ return (
310
+ <div
311
+ data-testid="react-design-canvas-backdrop"
312
+ aria-hidden="true"
313
+ style={{
314
+ position: 'absolute',
315
+ inset: 0,
316
+ pointerEvents: 'none',
317
+ backgroundColor: REACT_DESIGN_CANVAS_COLOR,
318
+ backgroundImage: `radial-gradient(circle, ${REACT_DESIGN_CANVAS_DOT} ${dotRadius}px, transparent ${dotRadius}px)`,
319
+ backgroundPosition: `${view.x}px ${view.y}px`,
320
+ backgroundSize: `${spacing}px ${spacing}px`,
321
+ }}
322
+ />
323
+ );
324
+ }
325
+
326
+ /** Install the project's pinned center documents and map the three root to the
327
+ * native scene document. Returns the project/rebuild disposer; it closes only
328
+ * the documents installed by this call.
329
+ *
330
+ * ## A BOARD'S EXISTENCE IS ITS OWN PACKAGE'S VERDICT
331
+ *
332
+ * No board is decided here. A package registers one
333
+ * (`component-board-registry.ts`) and answers `presence()` for it; this
334
+ * installs and closes the registered set as those verdicts move, and asks the
335
+ * board itself why it is absent. Three statements used to be made here that
336
+ * are not the host's to make — that a project's boards are `dom`/`three`/
337
+ * `canvas`, that a board exists because the project has stories of that
338
+ * medium, and that "no board yet" is told from "no board ever" by a story
339
+ * DISCOVERY flag. The first is the registered set; the second is
340
+ * `presence()`; the third is `presence()` returning `null`.
341
+ *
342
+ * Everything else here is still root-derived where it is genuinely about a
343
+ * root: the `Scene` document and the document routes. A root whose own
344
+ * design surface IS a board — no separate document of its own — is routed at
345
+ * that board by matching the root descriptor's `kind` against the registered
346
+ * `medium`; the host compares two values it was handed and spells neither. */
347
+ /**
348
+ * The live session's composite + store, published while root documents are
349
+ * installed — how a document hosted OUTSIDE this module's own closures (the
350
+ * pasteboard asset document, which any `.tsx` in the project can turn out to
351
+ * be) reaches the same {@link RootDocumentContent} machinery the boards use.
352
+ * Null between sessions; a host that finds it null says so instead of
353
+ * mounting nothing.
354
+ */
355
+ let rootDocumentHost: {
356
+ readonly store: EditorShellStore;
357
+ readonly composite: CompositeAuthoringAdapter;
358
+ } | null = null;
359
+
360
+ export function activeRootDocumentHost(): {
361
+ readonly store: EditorShellStore;
362
+ readonly composite: CompositeAuthoringAdapter;
363
+ } | null {
364
+ return rootDocumentHost;
365
+ }
366
+
367
+ export function installRootDocuments(
368
+ store: EditorShellStore,
369
+ composite: CompositeAuthoringAdapter,
370
+ ): () => void {
371
+ rootDocumentHost = { store, composite };
372
+ const previouslyActive = activeWorkspaceDocumentId();
373
+ const hasThreeRoot = composite
374
+ .childAdapters()
375
+ .some((child) => child.role === 'world' && child.kind === 'three');
376
+ // An UNPARSEABLE manifest installs one placeholder root and no three world.
377
+ // Closing the Scene document on it unmounted `the world root's stage` — the edit-mode
378
+ // rebuild OWNER — so the editor sat gutted ("No authoring adapter", no
379
+ // tabs, no canvas) and the manifest becoming valid again could remount
380
+ // nothing: measured 60 s after the fix, still gutted, only a second Play or
381
+ // a reload recovered (Opus verification, 2026-09-01). The project still
382
+ // declares a three root; its scene document stays, and the rebuild the
383
+ // recovery queues has an owner to drain into.
384
+ const manifestInvalid = composite
385
+ .childAdapters()
386
+ .some((child) => child.kind === INVALID_MANIFEST_SURFACE);
387
+ if (!hasThreeRoot && !manifestInvalid) {
388
+ closeWorkspaceDocument(SCENE_DOCUMENT_ID, { discardDirty: true });
389
+ }
390
+ const installedIds = new Set<string>();
391
+ const unregisterRoutes: Array<() => void> = [];
392
+ let disposed = false;
393
+
394
+ for (const child of composite.childAdapters()) {
395
+ if (child.role === 'world' && child.kind === 'three') {
396
+ unregisterRoutes.push(registerRootDocumentRoute(child.worldId, SCENE_DOCUMENT_ID));
397
+ }
398
+ }
399
+
400
+ const designTimeRoots = designTimeRootDescriptors(composite);
401
+
402
+ // THE CANVAS ROOT'S SCENE. A three project's scene is `the world root's stage`
403
+ // (`SCENE_DOCUMENT_ID`, owned by `syncCenterDocuments`); a canvas project's
404
+ // scene is this document, and a project has one or the other. Unlike the
405
+ // boards, it is ROOT-derived and not story-derived: it is a document OF that
406
+ // root's world, not a gallery of components.
407
+ const canvasRoot = designTimeRoots.find((root) => root.kind === 'canvas');
408
+ if (canvasRoot) {
409
+ unregisterRoutes.push(registerRootDocumentRoute(canvasRoot.worldId, CANVAS_SCENE_DOCUMENT_ID));
410
+ }
411
+
412
+ // A ROOT WHOSE DESIGN SURFACE IS A BOARD. A dom root has no document of its
413
+ // own: its surface is the project's UI board, so `activateRootDocument(id)`
414
+ // must reach that board and say why when it cannot. The pairing is the
415
+ // descriptor's `kind` against a registered `medium` — the host matches two
416
+ // values it was handed and names neither — and a root already routed at a
417
+ // Scene above keeps that route, because a world root's own document always
418
+ // wins over a gallery of its components.
419
+ //
420
+ // It is reconciled rather than registered once, for the reason every one of
421
+ // these registries has: the contribution pass that loads the packages is
422
+ // deferred behind the first viewport frame, so at project open NOTHING is
423
+ // registered yet.
424
+ const routedRoots = new Set(
425
+ [
426
+ ...composite
427
+ .childAdapters()
428
+ .filter((child) => child.role === 'world' && child.kind === 'three'),
429
+ ...(canvasRoot ? [canvasRoot] : []),
430
+ ].map((root) => root.worldId),
431
+ );
432
+ const boardRoutes = new Map<string, () => void>();
433
+ function reconcileBoardRoutes(): void {
434
+ for (const root of designTimeRoots) {
435
+ if (routedRoots.has(root.worldId) || boardRoutes.has(root.worldId)) continue;
436
+ const board = componentBoardForMedium(root.kind);
437
+ if (!board) continue;
438
+ const stopRoute = registerRootDocumentRoute(root.worldId, board.documentId);
439
+ // ...and the honest answer for the case that route CANNOT reach. A board
440
+ // exists only on its own package's verdict, so a root can route at a
441
+ // document that will never open in THIS project. Without this the ask
442
+ // waits out the whole registration window and then reports the generic
443
+ // "world document is not registered", which reads as a missing ROOT —
444
+ // the root is right there in the manifest, and the thing that is missing
445
+ // is its board. Live thunk, and `presence() === null` is what keeps it
446
+ // silent during boot: no verdict is never a No.
447
+ const stopGap = registerRootDocumentGap(root.worldId, () =>
448
+ board.presence() === 'absent'
449
+ ? `Root "${root.worldId}" has no document of its own: its design surface is the ` +
450
+ `project's ${board.title} board (${board.documentId}). ${board.absentReason()}`
451
+ : null,
452
+ );
453
+ boardRoutes.set(root.worldId, () => {
454
+ stopGap();
455
+ stopRoute();
456
+ });
457
+ }
458
+ }
459
+
460
+ // THE SAME GAP, asked the other way. `openWorkspaceView` names a DOCUMENT
461
+ // rather than a root, and `activateWorkspaceDocument`'s `false` carries the
462
+ // identical ambiguity plus one a root cannot have: the id may name nothing at
463
+ // all. Both were paid for with the full 10 s registration window and then a
464
+ // generic "not available" — long after the asking side gave up (MEASURED on
465
+ // this project: a bogus id timed out the relay at 5.6 s and left a
466
+ // `play-stall` error behind). This owner installs the project's workspace
467
+ // documents, so it is the one that can say why a document is absent — and
468
+ // for a BOARD it asks the board, which is the only party that knows.
469
+ unregisterRoutes.push(
470
+ registerWorkspaceDocumentGap((documentId) => {
471
+ const open = openWorkspaceDocuments();
472
+ if (open.some((document) => document.descriptor.id === documentId)) return null;
473
+ const board = componentBoardForDocument(documentId);
474
+ if (board) return board.presence() === 'absent' ? board.absentReason() : null;
475
+ return (
476
+ `No workspace document is named "${documentId}". Open in this session: ` +
477
+ `${open.map((document) => document.descriptor.id).join(', ') || '(none)'}. A component ` +
478
+ 'board is present only when the package that owns its medium says this project has one, ' +
479
+ 'so a board id can be absent for this project and present for another.'
480
+ );
481
+ }),
482
+ );
483
+
484
+ function openCanvasScene(descriptor: DesignTimeRootDescriptor): void {
485
+ const Content = (props: WorkspaceDocumentContentProps) => (
486
+ <RootDocumentContent {...props} composite={composite} descriptor={descriptor} store={store} />
487
+ );
488
+ registerAvailableWorkspaceDocument(
489
+ {
490
+ id: CANVAS_SCENE_DOCUMENT_ID,
491
+ title: CANVAS_SCENE_TITLE,
492
+ kind: 'world',
493
+ workspaceRole: 'authored-subject',
494
+ provenance: {
495
+ rootId: descriptor.worldId,
496
+ ...(descriptor.path ? { sourcePath: descriptor.path } : {}),
497
+ },
498
+ Content,
499
+ presentation: () => ({ kind: 'world', id: descriptor.worldId }),
500
+ onActivate: () => store.setActiveViewportTab('edit'),
501
+ },
502
+ { category: 'scene', default: !hasThreeRoot, rootId: descriptor.worldId },
503
+ );
504
+ }
505
+
506
+ /** Reserve the id BEFORE installing, so a second reconcile arriving while an
507
+ * asynchronous install is in flight does not start a second one; un-reserve
508
+ * if it fails, so the next verdict retries. Saying WHAT failed is the
509
+ * board's own job — only it knows what it was loading. */
510
+ function installBoard(board: ComponentBoard): void {
511
+ installedIds.add(board.documentId);
512
+ const unreserve = (): void => {
513
+ installedIds.delete(board.documentId);
514
+ };
515
+ try {
516
+ void Promise.resolve(board.install({ store, composite })).catch(unreserve);
517
+ } catch {
518
+ unreserve();
519
+ }
520
+ }
521
+
522
+ /** Bring the registered component boards in line with their own verdicts.
523
+ * Idempotent: `openWorkspaceDocument` is a no-op for a document already
524
+ * open, and `closeWorkspaceDocument` for one that is not.
525
+ *
526
+ * A board NEVER steals focus, which is why `install` is documented to open
527
+ * without activating: presence is answered ASYNCHRONOUSLY, so a board that
528
+ * arrives late would otherwise yank the author off whatever they were
529
+ * looking at (measured: the canvas root's `Scene` opened, then a board
530
+ * landed a second later and took the tab). The tail of this function still
531
+ * chooses the opening document. */
532
+ function reconcileBoards(): void {
533
+ if (disposed) return;
534
+ reconcileBoardRoutes();
535
+ for (const board of componentBoards()) {
536
+ const wanted = board.presence();
537
+ // `null` is "no verdict yet": neither install nor close. A census that
538
+ // has not run must not take a board away, and a board that has never
539
+ // been installed must not be conjured by silence.
540
+ if (wanted === null) continue;
541
+ const installed = installedIds.has(board.documentId);
542
+ if ((wanted === 'present') === installed) continue;
543
+ if (wanted === 'present') installBoard(board);
544
+ else {
545
+ unregisterAvailableWorkspaceDocument(board.documentId);
546
+ installedIds.delete(board.documentId);
547
+ }
548
+ }
549
+ }
550
+
551
+ // The canvas Scene is installed once, from the manifest — it does not
552
+ // participate in `reconcileBoards`' verdicts, because a world root's
553
+ // existence is not a question a board's package answers.
554
+ if (canvasRoot) {
555
+ openCanvasScene(canvasRoot);
556
+ installedIds.add(CANVAS_SCENE_DOCUMENT_ID);
557
+ }
558
+
559
+ reconcileBoards();
560
+ const unsubscribePresence = subscribeComponentBoards(reconcileBoards);
561
+
562
+ const firstInstalled = canvasRoot ? CANVAS_SCENE_DOCUMENT_ID : [...installedIds][0];
563
+ if (
564
+ !hasThreeRoot &&
565
+ firstInstalled !== undefined &&
566
+ (previouslyActive === null ||
567
+ previouslyActive === SCENE_DOCUMENT_ID ||
568
+ previouslyActive === GAME_DOCUMENT_ID)
569
+ ) {
570
+ activateWorkspaceDocument(firstInstalled);
571
+ } else if (previouslyActive) {
572
+ activateWorkspaceDocument(previouslyActive);
573
+ } else if (hasThreeRoot) {
574
+ activateWorkspaceDocument(SCENE_DOCUMENT_ID);
575
+ }
576
+
577
+ return () => {
578
+ disposed = true;
579
+ if (rootDocumentHost?.store === store) rootDocumentHost = null;
580
+ unsubscribePresence();
581
+ for (const unregister of unregisterRoutes) unregister();
582
+ for (const unregister of boardRoutes.values()) unregister();
583
+ boardRoutes.clear();
584
+ for (const id of installedIds) unregisterAvailableWorkspaceDocument(id);
585
+ };
586
+ }