@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,612 @@
1
+ /**
2
+ * Workspace DOCUMENT registry (W0 — the shell-contract slice of §9 W0). The
3
+ * missing central-document concept: every authored subject (Three scene, Game
4
+ * preview, React story, asset preview, data asset, Build Profiles — the real
5
+ * first-party implementers §7.1 names) becomes an OPEN DOCUMENT here, and the
6
+ * center workspace (W1) renders the open set as tabs. Live-observation
7
+ * instruments such as Profiler and Network stay in the Debugger; XState is a
8
+ * truthful inspect-only Behavior document because its actor/statechart is the
9
+ * subject being inspected.
10
+ *
11
+ * `frame/bridge.tsx` consumes this registry and maps open subjects
12
+ * to editor panes with always-mounted content.
13
+ * `components/CenterDocuments.tsx` opens the first two document implementers
14
+ * (active Three scene, Game preview) and bridges open/activate to the store's
15
+ * `activeViewportTab` (the T6.3 input-gate predicate). W2/W3 migrate the
16
+ * remaining surfaces.
17
+ *
18
+ * Idioms mirror `inspector-section-registry.ts` one-for-one: module-scope
19
+ * state, `useSyncExternalStore`-shaped subscribe + monotonic version,
20
+ * `__resetForTest`, pure-logic headless tests (no jsdom — `Content` /
21
+ * `Toolbar` are never rendered by the registry itself). The shell must not
22
+ * switch on implementation technology for placement (§7.3 / CLAUDE.md):
23
+ * `kind` here is SEMANTIC metadata (what the document is to the author, per
24
+ * §8's naming rules), never a technology dispatch key — kind-specific
25
+ * behavior lives inside each descriptor's own `Content`/`Toolbar`.
26
+ */
27
+
28
+ import type { EditorViewDocument } from '@volter/editor-sdk';
29
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
30
+ import type { ComponentType } from 'react';
31
+ import type { DocumentPreviewSource } from './document-preview-source';
32
+ import { noteViewportActivationGesture } from './viewport-activation-timings';
33
+
34
+ /**
35
+ * Semantic document kinds — §7.1 "title, semantic kind, and optional
36
+ * source/provenance metadata". One entry per real first-party implementer
37
+ * §7.1 enumerates, plus distinct generic project-tool runners and optional
38
+ * project-authored tool surfaces. Extend the union when a new document kind genuinely ships;
39
+ * the registry itself never branches on it.
40
+ */
41
+ export const WORKSPACE_DOCUMENT_KINDS = [
42
+ 'scene', // the standing Edit workspace document; produced by CenterDocuments
43
+ 'game', // the live player-facing Game preview (§8)
44
+ 'world', // one manifest root's isolated edit-time authoring surface
45
+ 'story', // React CSF story document (§4.2)
46
+ 'asset', // model/image/audio/input-map/data-file viewer or editor (§5.1)
47
+ 'behavior', // live inspect-only behavior/statechart document
48
+ 'generation', // one durable external-generation job and its native result
49
+ 'content-browser', // optional thumbnail-heavy browser (§5)
50
+ 'project-tool', // registered callable using the generic runner
51
+ 'tool-contribution', // optional React presentation for a registered project tool
52
+ 'document', // an adapter-table document (a model, a page) in the editor registered for its kind
53
+ ] as const;
54
+
55
+ export type WorkspaceDocumentKind = (typeof WORKSPACE_DOCUMENT_KINDS)[number];
56
+
57
+ /** Where a document came from — §7.1 "optional source/provenance metadata".
58
+ * All fields optional: a Game preview has none; a source-backed document has a `sourcePath`;
59
+ * a live XState graph may have only an `origin`. */
60
+ export interface WorkspaceDocumentProvenance {
61
+ /** Project-relative source file (e.g. `src/scenes/MainScene.tsx`). */
62
+ readonly sourcePath?: string;
63
+ /** Owning adapter root id (D20). */
64
+ readonly rootId?: string;
65
+ /** Free-form origin for non-file documents (e.g. a live machine id). */
66
+ readonly origin?: string;
67
+ }
68
+
69
+ /** Props the W1 host will pass to a document's `Content`/`Toolbar`. */
70
+ export interface WorkspaceDocumentContentProps {
71
+ /** Native editor occurrence, independent of document and group identity. */
72
+ readonly viewId?: string;
73
+ /** The open document's stable id (== its descriptor's `id`). */
74
+ readonly documentId: string;
75
+ /** Whether this document is the active center tab. Hosts keep inactive
76
+ * documents MOUNTED where lifecycle requires it (W1 proof bar) — content
77
+ * uses this to gate work, not to exist. */
78
+ readonly active: boolean;
79
+ }
80
+
81
+ /** §7.1 "optional selection/Inspector context": what the Inspector should
82
+ * treat as selected while this document is active. Shape matches
83
+ * `inspector-section-registry.ts`'s `InspectorSectionProps` inputs. */
84
+ export interface WorkspaceDocumentSelection {
85
+ /** The adapter the picked node belongs to. `null` when the document has no
86
+ * authoring of its own — an image, an audio file, a JSON blob. Such a
87
+ * document still registers a context, because registering one is how it
88
+ * states that IT is the subject: without it the Inspector falls back to
89
+ * whatever was selected in the scene before the document was opened, which
90
+ * is not what the human is looking at. */
91
+ readonly adapter: AuthoringAdapter | null;
92
+ /** Selected node id; `null` for the document/environment state. */
93
+ readonly nodeId: string | null;
94
+ }
95
+
96
+ /**
97
+ * Semantic workspace role, deliberately independent from rendering technology.
98
+ * Every descriptor must choose one so a new page cannot silently inherit the
99
+ * placement of an authored asset.
100
+ */
101
+ export type WorkspaceDocumentRole = 'authored-subject' | 'workspace-reference' | 'workspace-task';
102
+
103
+ /** What {@link WorkspaceDocumentDescriptor.persist} is handed: the
104
+ * registry-owned RUNTIME facts a descriptor's own closure cannot see,
105
+ * because they can change while the document is open. */
106
+ export interface WorkspaceDocumentPersistContext {
107
+ readonly id: string;
108
+ /** The LIVE tab text (see {@link OpenWorkspaceDocument.title}), which a
109
+ * document whose opener names it by a rule it cannot re-derive must write
110
+ * down to restore the same tab. */
111
+ readonly title: string;
112
+ }
113
+
114
+ /**
115
+ * The §7.1 document contract. Descriptors are definitions (immutable by
116
+ * convention); per-open-document RUNTIME state (dirty) lives on
117
+ * {@link OpenWorkspaceDocument} and is mutated through the registry.
118
+ */
119
+ export interface WorkspaceDocumentDescriptor {
120
+ /** Stable identity scoped to project/session (§7.1) — dedupe key: opening
121
+ * an id that is already open activates the existing document. */
122
+ readonly id: string;
123
+ /** Source-owned display title (§8 — `MainScene`, `Playing`, never a
124
+ * technology bucket like `Viewport`). */
125
+ readonly title: string;
126
+ readonly kind: WorkspaceDocumentKind;
127
+ /**
128
+ * Authored subjects and workspace references remain center documents in
129
+ * every style. Workspace tasks become centered overlays in Glass + Floating
130
+ * while retaining ordinary center tabs in Classic/Docked. Placement is a
131
+ * host policy; descriptors state semantics, never inspect appearance stores.
132
+ */
133
+ readonly workspaceRole: WorkspaceDocumentRole;
134
+ /**
135
+ * THE WORKSPACE AREA this document fills instead of the centre tab strip —
136
+ * a Blender editor AREA, which is an editor GROUP (orchestrator ruling
137
+ * 2026-09-19, WORK.md I5; `WorkspaceAreaContribution`).
138
+ *
139
+ * Set only by the workspace that opens the document, from its own `areas`
140
+ * list; a document opened by the session, a finder or the user never has
141
+ * one and stays a centre tab. The dock reads it in
142
+ * `workspaceDocumentPlacement` and puts the panel in `vgai:area:<id>`
143
+ * rather than `vgai:center`.
144
+ */
145
+ readonly area?: string;
146
+ readonly provenance?: WorkspaceDocumentProvenance;
147
+ /** React content host (§7.1). Never rendered by the registry itself. */
148
+ readonly Content: ComponentType<WorkspaceDocumentContentProps>;
149
+ /** Optional document-local toolbar contribution (§7.1; §4.1 "Document tabs
150
+ * and their local toolbar occupy only the center workspace"). */
151
+ readonly Toolbar?: ComponentType<WorkspaceDocumentContentProps>;
152
+ /** The document's SHELF — the host's vertical tool rail over the content
153
+ * box's leading edge (`DocumentShelfRail`). Same contract as `Toolbar`. */
154
+ readonly Shelf?: ComponentType<WorkspaceDocumentContentProps>;
155
+ /** Chrome-free preview supplied by the document's rendering owner. */
156
+ readonly preview?: DocumentPreviewSource;
157
+ /** `false` pins the document (Scene/Game in W1). Default `true`. */
158
+ readonly closeable?: boolean;
159
+ /** Optional read-only state (§7.1). */
160
+ readonly readOnly?: boolean;
161
+ /** Optional inspect-only state (§7.1) for read-only authored resources. */
162
+ readonly inspectOnly?: boolean;
163
+ /** Optional selection/Inspector context while this document is active. */
164
+ readonly selection?: () => WorkspaceDocumentSelection | null;
165
+ /** Durable identity used by Copy View Link and agent presentation. The
166
+ * document owns this mapping because its rendering technology is not a
167
+ * semantic route. */
168
+ readonly presentation?: () => EditorViewDocument | null;
169
+ /**
170
+ * SERIALIZE THIS DOCUMENT'S OWN RESTORABLE STATE. A contributed document
171
+ * kind owns its persisted state: the workspace stores whatever this
172
+ * returns as an OPAQUE blob under the document's {@link kind} and
173
+ * {@link id}, never reading inside it, and hands it straight back to the
174
+ * kind's registered restorer (`workspace-document-restore.ts`) on the next
175
+ * boot. Return `undefined`/`null` for a document that cannot truthfully
176
+ * reopen from a cold start (a live entity, an unresolved remote view, a
177
+ * document something else re-derives at boot) — that is the whole opt-out,
178
+ * and the host has no list of exceptions to consult.
179
+ */
180
+ readonly persist?: (context: WorkspaceDocumentPersistContext) => unknown;
181
+ /** Called when this document becomes the active document. */
182
+ readonly onActivate?: (documentId: string) => void;
183
+ /** Called when this document stops being the active document. */
184
+ readonly onDeactivate?: (documentId: string) => void;
185
+ /** Called when this document is removed from the workspace (close /
186
+ * close-all) — release adapters, mounts, subscriptions here. */
187
+ readonly onDispose?: (documentId: string) => void;
188
+ }
189
+
190
+ /** One open document: its immutable descriptor + registry-owned state. */
191
+ export interface OpenWorkspaceDocument {
192
+ readonly descriptor: WorkspaceDocumentDescriptor;
193
+ /** §7.1 optional dirty state — set via {@link setWorkspaceDocumentDirty}. */
194
+ readonly dirty: boolean;
195
+ /** Live display title — initialized from `descriptor.title`, updated via
196
+ * {@link setWorkspaceDocumentTitle}. Registry-owned RUNTIME state (like
197
+ * `dirty`), because a document's source-owned name can change while it is
198
+ * open. */
199
+ readonly title: string;
200
+ }
201
+
202
+ /** A mounted document editor's live save callback. `true` means the write
203
+ * completed; `false` means validation/persistence rejected it and the caller
204
+ * must keep the document open. */
205
+ export type WorkspaceDocumentSaveHandler = () => boolean | Promise<boolean>;
206
+
207
+ // --- Module-scope state (mirrors inspector-section-registry.ts) -----------
208
+
209
+ let _open: OpenWorkspaceDocument[] = [];
210
+ // At most one automatically followed document. Explicit opening or editing
211
+ // keeps it; discovery may replace only the untouched automatic preview.
212
+ let _previewId: string | null = null;
213
+ let _activeId: string | null = null;
214
+ let _activeViewId: string | null = null;
215
+ // A pinned document can be restored before its async project authoring pass
216
+ // has registered the descriptor. Keep that semantic activation request until
217
+ // the matching stable document opens; ordinary unknown ids still reject.
218
+ let _pendingRestoredActiveId: string | null = null;
219
+
220
+ function settlePendingRestoredActivation(id: string): void {
221
+ queueMicrotask(() => {
222
+ if (_pendingRestoredActiveId !== id) return;
223
+ if (!_open.some((document) => document.descriptor.id === id)) return;
224
+ _pendingRestoredActiveId = null;
225
+ // A project document installer may synchronously restore its own prior
226
+ // fallback after opening the requested board. The persisted request wins
227
+ // once that registration batch has returned.
228
+ activateWorkspaceDocument(id);
229
+ });
230
+ }
231
+ let _version = 0;
232
+ const _listeners = new Set<() => void>();
233
+ /** Ids currently mid-close (between the neighbor `setActive` and the
234
+ * filter+`onDispose` below) — see {@link closeWorkspaceDocument}'s
235
+ * re-entrancy guard. */
236
+ const _closingIds = new Set<string>();
237
+ const _saveHandlers = new Map<string, WorkspaceDocumentSaveHandler>();
238
+ const _selectionProviders = new Map<string, () => WorkspaceDocumentSelection | null>();
239
+
240
+ function notifyChanged(): void {
241
+ _version++;
242
+ for (const fn of _listeners) fn();
243
+ }
244
+
245
+ /** Subscribe to any open/activate/close/dirty change. Returns unsubscribe. */
246
+ export function subscribeWorkspaceDocuments(fn: () => void): () => void {
247
+ _listeners.add(fn);
248
+ return () => {
249
+ _listeners.delete(fn);
250
+ };
251
+ }
252
+
253
+ /** Monotonic change counter — the `getSnapshot` for `useSyncExternalStore`. */
254
+ export function workspaceDocumentRegistryVersion(): number {
255
+ return _version;
256
+ }
257
+
258
+ /** The open documents, in open order (stable reference between changes). */
259
+ export function openWorkspaceDocuments(): readonly OpenWorkspaceDocument[] {
260
+ return _open;
261
+ }
262
+
263
+ /** The active document's id, or `null` when no document is open. */
264
+ export function activeWorkspaceDocumentId(): string | null {
265
+ return _activeId;
266
+ }
267
+
268
+ /** Native occurrence selected by the workbench, never a document/group alias. */
269
+ export function activeWorkspaceDocumentViewId(): string | null {
270
+ return _activeViewId;
271
+ }
272
+
273
+ export function setActiveWorkspaceDocumentView(id: string, viewId: string): void {
274
+ if (!activateWorkspaceDocument(id)) return;
275
+ if (_activeViewId === viewId) return;
276
+ _activeViewId = viewId;
277
+ notifyChanged();
278
+ }
279
+
280
+ /** The active open document, or `null`. */
281
+ export function activeWorkspaceDocument(): OpenWorkspaceDocument | null {
282
+ return _open.find((d) => d.descriptor.id === _activeId) ?? null;
283
+ }
284
+
285
+ function setActive(nextId: string | null): void {
286
+ if (nextId === _activeId) return;
287
+ if (nextId) noteViewportActivationGesture(nextId);
288
+ const prev = _open.find((d) => d.descriptor.id === _activeId);
289
+ _activeId = nextId;
290
+ _activeViewId = null;
291
+ prev?.descriptor.onDeactivate?.(prev.descriptor.id);
292
+ const next = _open.find((d) => d.descriptor.id === nextId);
293
+ next?.descriptor.onActivate?.(next.descriptor.id);
294
+ }
295
+
296
+ /** Options for {@link openWorkspaceDocument}. */
297
+ export interface OpenWorkspaceDocumentOptions {
298
+ /** Replace the previous clean automatic preview instead of accumulating tabs.
299
+ * Explicit opens and dirty documents are retained. */
300
+ readonly preview?: boolean;
301
+ /**
302
+ * `false` opens the document WITHOUT making it active — the tab appears,
303
+ * the user's current document keeps focus. This is what an automatically
304
+ * present standing tab needs: it is offered, never imposed. It cannot leave
305
+ * the workspace with no active document, so it still activates when nothing
306
+ * else is active (the "there is always an active center document"
307
+ * invariant `syncCenterDocuments` also asserts). Default `true`.
308
+ */
309
+ readonly activate?: boolean;
310
+ }
311
+
312
+ function updateAutomaticPreview(
313
+ id: string,
314
+ existing: boolean,
315
+ preview: boolean,
316
+ activate: boolean,
317
+ ): void {
318
+ if (existing) {
319
+ if (!preview && activate && _previewId === id) _previewId = null;
320
+ return;
321
+ }
322
+ if (!preview) return;
323
+ if (_previewId) closeWorkspaceDocument(_previewId);
324
+ _previewId = id;
325
+ }
326
+
327
+ /**
328
+ * Open a document (§7.1 open semantics): appends it to the open set and
329
+ * makes it active. If `descriptor.id` is ALREADY open, the existing document
330
+ * is activated and its original descriptor kept (stable identity — a
331
+ * re-open never silently swaps content). Returns the id.
332
+ */
333
+ export function openWorkspaceDocument(
334
+ descriptor: WorkspaceDocumentDescriptor,
335
+ options: OpenWorkspaceDocumentOptions = {},
336
+ ): string {
337
+ const restoresPendingActivation = _pendingRestoredActiveId === descriptor.id;
338
+ const activate = restoresPendingActivation || options.activate !== false;
339
+ const existing = _open.find((d) => d.descriptor.id === descriptor.id);
340
+ updateAutomaticPreview(descriptor.id, !!existing, options.preview === true, activate);
341
+ if (!existing) {
342
+ _open = [..._open, { descriptor, dirty: false, title: descriptor.title }];
343
+ // AN AREA DOCUMENT IS NEVER THE ACTIVE ONE. It is not a tab in the centre
344
+ // strip at all — it is the workspace's second editor group — so the
345
+ // "there is always an active center document" fallback must not reach for
346
+ // it: activating it would point the inspector, the hotkey scope and the
347
+ // header strip at the UV editor while the model is the subject on screen.
348
+ // The workspace opens it with `activate: false`; this is the fallback's
349
+ // half of the same statement.
350
+ if (!descriptor.area && (activate || _activeId === null)) setActive(descriptor.id);
351
+ if (restoresPendingActivation) settlePendingRestoredActivation(descriptor.id);
352
+ notifyChanged();
353
+ return descriptor.id;
354
+ }
355
+ // Already open: activate (or no-op if already active) — same guard as
356
+ // `activateWorkspaceDocument` — AND take the descriptor's SLOTS afresh. A
357
+ // tool document's module is re-evaluated on every save (`tool-loader.ts`),
358
+ // so a `Toolbar` the module gained after the document first opened arrived
359
+ // on a descriptor this registry then threw away: measured 2026-09-03, the
360
+ // mesh document's header export was served and never rendered until the
361
+ // tab was reloaded. Content and Toolbar are the two mount slots; the rest
362
+ // of the descriptor (id, title, provenance, presentation) is identity and
363
+ // stays with the open entry.
364
+ let changed = false;
365
+ if (
366
+ existing.descriptor.Toolbar !== descriptor.Toolbar ||
367
+ existing.descriptor.Shelf !== descriptor.Shelf ||
368
+ existing.descriptor.Content !== descriptor.Content
369
+ ) {
370
+ _open = _open.map((d) => {
371
+ if (d !== existing) return d;
372
+ const { Toolbar: _toolbar, Shelf: _shelf, ...rest } = d.descriptor;
373
+ return {
374
+ ...d,
375
+ descriptor: {
376
+ ...rest,
377
+ Content: descriptor.Content,
378
+ ...(descriptor.Toolbar ? { Toolbar: descriptor.Toolbar } : {}),
379
+ ...(descriptor.Shelf ? { Shelf: descriptor.Shelf } : {}),
380
+ },
381
+ };
382
+ });
383
+ changed = true;
384
+ }
385
+ if (activate && _activeId !== descriptor.id) {
386
+ setActive(descriptor.id);
387
+ changed = true;
388
+ }
389
+ if (changed) notifyChanged();
390
+ if (restoresPendingActivation) settlePendingRestoredActivation(descriptor.id);
391
+ return descriptor.id;
392
+ }
393
+
394
+ /** Activate an open document. Returns `false` (no-op) for unknown ids. */
395
+ export function activateWorkspaceDocument(id: string): boolean {
396
+ if (!_open.some((d) => d.descriptor.id === id)) return false;
397
+ if (_activeId !== id) {
398
+ setActive(id);
399
+ notifyChanged();
400
+ }
401
+ return true;
402
+ }
403
+
404
+ /**
405
+ * Restore activation for a stable pinned document that project discovery may
406
+ * register later. Unlike {@link activateWorkspaceDocument}, this intentionally
407
+ * remembers an unknown id; callers must restrict it to identities the editor
408
+ * itself owns, never arbitrary persisted tool/asset ids.
409
+ */
410
+ export function restorePinnedWorkspaceDocumentActivation(id: string): void {
411
+ if (activateWorkspaceDocument(id)) {
412
+ _pendingRestoredActiveId = null;
413
+ return;
414
+ }
415
+ _pendingRestoredActiveId = id;
416
+ }
417
+
418
+ /**
419
+ * Close an open document: removes it (calling `onDeactivate` if it was
420
+ * active, then `onDispose`) and, when it was active, activates its left
421
+ * neighbor (else the right one, else none) — the standard tabbed-editor
422
+ * fallback. Returns `false` (no-op) for unknown ids. `closeable: false` is
423
+ * a HOST affordance rule (no × on the tab), not a registry invariant —
424
+ * programmatic close (project switch, W1 host teardown) must always work.
425
+ *
426
+ * Re-entrancy guard: the neighbor's `onActivate` (fired inside `setActive`
427
+ * below, while `closing` is still in `_open`) can synchronously bounce back
428
+ * into a close of the SAME id it is still closing — e.g. a store-notify
429
+ * subscriber re-derives its open set from `_open`, sees `closing` still
430
+ * present (the filter hasn't run yet), and calls `closeWorkspaceDocument`
431
+ * again for it. Without a guard that inner call would run the full close
432
+ * body a second time and fire `onDispose` twice for one close. `_closingIds`
433
+ * marks `id` in-flight for the duration of this call so the re-entrant call
434
+ * is a no-op (returns `false` immediately) — the outer call is the only one
435
+ * that ever filters `_open` / fires `onDispose`, and the pinned lifecycle
436
+ * order (onDeactivate → neighbor onActivate → onDispose) is unchanged.
437
+ */
438
+ export function closeWorkspaceDocument(
439
+ id: string,
440
+ options: { discardDirty?: boolean } = {},
441
+ ): boolean {
442
+ if (_closingIds.has(id)) return false;
443
+ const idx = _open.findIndex((d) => d.descriptor.id === id);
444
+ if (idx < 0) return false;
445
+ const closing = _open[idx] as OpenWorkspaceDocument;
446
+ // A close gesture is not authorization to destroy an authored draft. The
447
+ // The tab presents Save / Discard / Cancel and calls back with the
448
+ // explicit discard flag only after the user chooses it. Project teardown
449
+ // uses closeAllWorkspaceDocuments(), whose lifecycle semantics are separate.
450
+ if (closing.dirty && !options.discardDirty) return false;
451
+ _closingIds.add(id);
452
+ try {
453
+ const wasActive = _activeId === id;
454
+ if (wasActive) {
455
+ // Left neighbor, else right, else none — computed on the PRE-removal
456
+ // array so the indices are the real tab neighbors.
457
+ const neighbor = idx > 0 ? _open[idx - 1] : (_open[idx + 1] ?? null);
458
+ // `closing` must still be in `_open` here: `setActive`'s `prev` lookup
459
+ // finds it by `_activeId` and fires its `onDeactivate` before the
460
+ // neighbor's `onActivate` — firing this AFTER filtering `_open` (the
461
+ // former bug) made the lookup miss and silently skip onDeactivate.
462
+ setActive(neighbor ? neighbor.descriptor.id : null);
463
+ }
464
+ _open = _open.filter((d) => d.descriptor.id !== id);
465
+ if (_previewId === id) _previewId = null;
466
+ _saveHandlers.delete(id);
467
+ _selectionProviders.delete(id);
468
+ closing.descriptor.onDispose?.(id);
469
+ notifyChanged();
470
+ return true;
471
+ } finally {
472
+ _closingIds.delete(id);
473
+ }
474
+ }
475
+
476
+ /** Close every open document (project switch / host teardown): each gets its
477
+ * `onDeactivate` (active one only) + `onDispose`, in open order. */
478
+ export function closeAllWorkspaceDocuments(): void {
479
+ if (_open.length === 0 && _activeId === null) return;
480
+ const closing = _open;
481
+ // Fire onDeactivate for the active document WHILE it is still in `_open`
482
+ // (setActive's `prev` lookup needs to find it) — clearing `_open` first
483
+ // (the former bug) made the lookup miss and silently skip onDeactivate.
484
+ setActive(null);
485
+ _open = [];
486
+ _activeViewId = null;
487
+ _previewId = null;
488
+ _saveHandlers.clear();
489
+ _selectionProviders.clear();
490
+ _pendingRestoredActiveId = null;
491
+ for (const doc of closing) doc.descriptor.onDispose?.(doc.descriptor.id);
492
+ notifyChanged();
493
+ }
494
+
495
+ /** Install the save capability supplied by a mounted document editor. The
496
+ * returned cleanup cannot remove a newer handler installed for the same id. */
497
+ export function registerWorkspaceDocumentSaveHandler(
498
+ id: string,
499
+ handler: WorkspaceDocumentSaveHandler,
500
+ ): () => void {
501
+ if (!_open.some((document) => document.descriptor.id === id)) return () => {};
502
+ _saveHandlers.set(id, handler);
503
+ return () => {
504
+ if (_saveHandlers.get(id) === handler) _saveHandlers.delete(id);
505
+ };
506
+ }
507
+
508
+ /**
509
+ * Install the live authoring context supplied by a mounted document surface.
510
+ *
511
+ * Descriptors describe a document before its React content mounts. Native
512
+ * source documents, however, only obtain their live adapter after project
513
+ * code has instantiated its graph. This runtime registration completes the
514
+ * existing descriptor-level `selection` hook without introducing a parallel
515
+ * hierarchy/Inspector context. The returned cleanup cannot remove a newer
516
+ * provider installed for the same document (HMR/StrictMode safe).
517
+ */
518
+ export function registerWorkspaceDocumentSelection(
519
+ id: string,
520
+ provider: () => WorkspaceDocumentSelection | null,
521
+ ): () => void {
522
+ if (!_open.some((document) => document.descriptor.id === id)) return () => {};
523
+ _selectionProviders.set(id, provider);
524
+ notifyChanged();
525
+ return () => {
526
+ if (_selectionProviders.get(id) !== provider) return;
527
+ _selectionProviders.delete(id);
528
+ notifyChanged();
529
+ };
530
+ }
531
+
532
+ /**
533
+ * Report that an already-registered document selection provider now resolves
534
+ * to a different live subject. Providers are deliberately stable closures so
535
+ * a document can finish constructing its adapter after the shell mounts; the
536
+ * shared Hierarchy and Inspector still need one explicit invalidation when
537
+ * that late-bound value changes.
538
+ */
539
+ export function notifyWorkspaceDocumentSelectionChanged(id: string): void {
540
+ if (!_selectionProviders.has(id)) return;
541
+ notifyChanged();
542
+ }
543
+
544
+ /** Save one open document. `null` means that document has no document-local
545
+ * save capability, so callers may preserve a legacy/fallback save path. */
546
+ export async function saveWorkspaceDocument(id: string): Promise<boolean | null> {
547
+ if (!_open.some((document) => document.descriptor.id === id)) return null;
548
+ const handler = _saveHandlers.get(id);
549
+ if (!handler) return null;
550
+ try {
551
+ return await handler();
552
+ } catch {
553
+ return false;
554
+ }
555
+ }
556
+
557
+ /** Save the active authored subject, or `null` when it has no local saver. */
558
+ export function saveActiveWorkspaceDocument(): Promise<boolean | null> {
559
+ return _activeId ? saveWorkspaceDocument(_activeId) : Promise.resolve(null);
560
+ }
561
+
562
+ /** Set a document's dirty flag (§7.1 optional dirty state). Unknown ids and
563
+ * no-op transitions are ignored without notification. */
564
+ export function setWorkspaceDocumentDirty(id: string, dirty: boolean): void {
565
+ if (dirty && _previewId === id) _previewId = null;
566
+ const idx = _open.findIndex((d) => d.descriptor.id === id);
567
+ if (idx < 0) return;
568
+ const doc = _open[idx] as OpenWorkspaceDocument;
569
+ if (doc.dirty === dirty) return;
570
+ _open = _open.map((d) => (d.descriptor.id === id ? { ...d, dirty } : d));
571
+ notifyChanged();
572
+ }
573
+
574
+ /** Set a document's live display title (see {@link OpenWorkspaceDocument}).
575
+ * Unknown ids and no-op transitions are ignored without notification. */
576
+ export function setWorkspaceDocumentTitle(id: string, title: string): void {
577
+ const doc = _open.find((d) => d.descriptor.id === id);
578
+ if (!doc || doc.title === title) return;
579
+ _open = _open.map((d) => (d.descriptor.id === id ? { ...d, title } : d));
580
+ notifyChanged();
581
+ }
582
+
583
+ /** A document's selection/Inspector context (guarded: a throwing `selection`
584
+ * is treated as "no context" — same failure physics as tool-loader's match
585
+ * guard; the shell must never crash on a contribution). */
586
+ export function workspaceDocumentSelection(id: string): WorkspaceDocumentSelection | null {
587
+ const doc = _open.find((d) => d.descriptor.id === id);
588
+ const selection = _selectionProviders.get(id) ?? doc?.descriptor.selection;
589
+ if (!selection) return null;
590
+ try {
591
+ return selection();
592
+ } catch {
593
+ return null;
594
+ }
595
+ }
596
+
597
+ /** The active center document's live authoring context, when it owns one. */
598
+ export function activeWorkspaceDocumentSelection(): WorkspaceDocumentSelection | null {
599
+ return _activeId ? workspaceDocumentSelection(_activeId) : null;
600
+ }
601
+
602
+ /** Test-only reset (mirrors `__resetInspectorSectionRegistryForTest`) —
603
+ * drops all state WITHOUT firing lifecycle hooks. */
604
+ export function __resetWorkspaceDocumentRegistryForTest(): void {
605
+ _open = [];
606
+ _activeViewId = null;
607
+ _previewId = null;
608
+ _activeId = null;
609
+ _saveHandlers.clear();
610
+ _selectionProviders.clear();
611
+ notifyChanged();
612
+ }