@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,328 @@
1
+ import {
2
+ Divider,
3
+ EditorIcon,
4
+ editorIcons,
5
+ Inline,
6
+ Menu,
7
+ MenuItem,
8
+ MenuSeparator,
9
+ MenuTrigger,
10
+ Text,
11
+ } from '@volter/editor-sdk/widgets';
12
+ import {
13
+ type ReactNode,
14
+ useEffect,
15
+ useReducer,
16
+ useRef,
17
+ useState,
18
+ useSyncExternalStore,
19
+ } from 'react';
20
+ import { activeProduct } from '../active-product';
21
+ import { BUNDLED_EDITOR_VERSION } from '../build-identity';
22
+ import {
23
+ contributedChromeVersion,
24
+ contributedHeaderItems,
25
+ subscribeContributedChrome,
26
+ } from '../chrome-registry';
27
+ import { revealInFinder } from '../editor-api';
28
+ import { getCurrentProject, onProjectChange } from '../project-manager';
29
+ import {
30
+ activeEditorWorkspace,
31
+ editorWorkspaces,
32
+ editorWorkspacesVersion,
33
+ setEditorWorkspace,
34
+ subscribeEditorWorkspace,
35
+ subscribeEditorWorkspaces,
36
+ workspaceApplies,
37
+ } from '../workspace-presets';
38
+ import {
39
+ activeChromeRegions,
40
+ chromeRegionsVersion,
41
+ subscribeChromeRegions,
42
+ } from '../workspace-regions';
43
+ import { ApplicationMenus } from './ApplicationMenus';
44
+ import { ChromeSlot } from './ChromeSlot';
45
+ import { WorktreeSwitcher } from './WorktreeSwitcher';
46
+
47
+ export function ProjectHeader({
48
+ transport,
49
+ }: {
50
+ /** Controlled production transport for bounded hosts; the application
51
+ * defaults to the connected PlayBar. */
52
+ transport?: ReactNode | undefined;
53
+ }) {
54
+ const [, forceUpdate] = useReducer((x: number) => x + 1, 0);
55
+ useEffect(() => onProjectChange(forceUpdate), []);
56
+ const [menuOpen, setMenuOpen] = useState(false);
57
+ const menuRef = useRef<HTMLDivElement>(null);
58
+
59
+ const project = getCurrentProject();
60
+ const projectName = project?.config.name ?? 'No Project';
61
+ const projectVersion = project?.config.version ?? null;
62
+ const engineVersion = project?.config.engine.version ?? null;
63
+ const manifestVersion = project?.config.manifestVersion ?? null;
64
+ const projectPath = project?.rootPath ?? '';
65
+ // Close menu on outside click
66
+ useEffect(() => {
67
+ if (!menuOpen) return;
68
+ const handler = (e: MouseEvent) => {
69
+ if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
70
+ setMenuOpen(false);
71
+ }
72
+ };
73
+ document.addEventListener('mousedown', handler);
74
+ return () => document.removeEventListener('mousedown', handler);
75
+ }, [menuOpen]);
76
+
77
+ return (
78
+ <header className="vgai-project-header">
79
+ {/* W5 (W4-reviewer candidate — transport narrow-width overlap guard):
80
+ the header is now THREE flex columns — name (shrinkable, ellipsized)
81
+ | transport (fixed) | right spacer — replacing the W4 absolute
82
+ centering, which let the transport cluster overlap the project name
83
+ at narrow widths. Equal-flex side columns keep the transport
84
+ visually centered whenever space allows; flex items cannot overlap
85
+ when it doesn't. */}
86
+ {/* Project name — clickable dropdown trigger. The cluster wrapper is
87
+ layout-neutral under bars chrome and becomes the LEFT glass island
88
+ under islands chrome (P6-U3); the dropdown Menu stays a SIBLING of
89
+ the island so the island's backdrop-filter never captures it. */}
90
+ {activeProduct()?.nativeMenus ? (
91
+ <div className="vgai-project-header-left" />
92
+ ) : (
93
+ <div ref={menuRef} className="vgai-project-header-left">
94
+ <div className="vgai-project-header-cluster vgai-chrome-island vgai-glass-island">
95
+ {/* THE LEADING ITEM IS A BARE GLYPH, and that is transcription, not
96
+ economy. Blender opens its top bar with an app mark whose INK
97
+ starts at the band's own inset and whose click opens a MENU —
98
+ the mark IS the app menu's trigger. Measured on `topbar.png` at
99
+ native 2x: device x 12..43, i.e. CSS 6.0..21.5 — 16.0 wide, 13.0
100
+ tall — and the first menu word's ink follows at CSS 32.0. (The
101
+ whole-frame read's "32 CSS px app mark" was that 32-DEVICE-px
102
+ width read as CSS, and its "menu words start at 60" followed
103
+ from it; the frame says 16 and 32.)
104
+
105
+ Ours used to spend 67 px here on a padded pill drawing the
106
+ project NAME, which ellipsized to `prob…` at 1728 even for an
107
+ eight-character name, and the switcher beside it another 204.
108
+ The project's identity is not lost by the glyph: it is the
109
+ browser TAB's title (`AppRoot.tsx` writes `document.title` from
110
+ the project name — the tab strip IS our OS title bar, the place
111
+ Blender puts the file name), this button's tooltip and
112
+ accessible name, and the first row of the menu it opens. */}
113
+ <MenuTrigger
114
+ data-testid="project-menu-trigger"
115
+ aria-label={`${projectName} project menu`}
116
+ title={projectPath ? `${projectName} — ${projectPath}` : projectName}
117
+ onClick={() => setMenuOpen((v) => !v)}
118
+ onKeyDown={(event) => {
119
+ if (event.key !== 'ArrowDown') return;
120
+ event.preventDefault();
121
+ setMenuOpen(true);
122
+ }}
123
+ className="vgai-project-trigger"
124
+ >
125
+ <EditorIcon icon={editorIcons.content.project} />
126
+ {/* The name stays in the DOM at zero pixels: the accessible name
127
+ above is a LABEL, this is the element's CONTENT, and it is what
128
+ `data-project` has always carried for the tooling that reads
129
+ which project a session has open. */}
130
+ <Text
131
+ data-testid="project-name"
132
+ data-project={projectName}
133
+ data-project-version={projectVersion ?? undefined}
134
+ variant="label"
135
+ className="vgai-sr-only"
136
+ >
137
+ {projectName}
138
+ </Text>
139
+ </MenuTrigger>
140
+ <WorktreeSwitcher />
141
+ <Inline onPointerDown={() => setMenuOpen(false)} className="vgai-project-app-menus">
142
+ <ApplicationMenus />
143
+ </Inline>
144
+ </div>
145
+ <WorkspaceTabs />
146
+
147
+ {menuOpen && (
148
+ <Menu
149
+ autoFocusFirst
150
+ onDismiss={() => {
151
+ const trigger = menuRef.current?.querySelector<HTMLButtonElement>(
152
+ '[data-testid="project-menu-trigger"]',
153
+ );
154
+ setMenuOpen(false);
155
+ requestAnimationFrame(() => trigger?.focus());
156
+ }}
157
+ className="vgai-project-menu"
158
+ >
159
+ {/* IDENTITY'S READABLE HOME. The trigger is a glyph, so the name
160
+ is the first thing this menu says — the row Blender's OS title
161
+ bar carries and a browser window does not. */}
162
+ <Text
163
+ data-testid="project-menu-name"
164
+ title={projectName}
165
+ variant="label"
166
+ truncate
167
+ className="vgai-project-menu-name"
168
+ >
169
+ {projectName}
170
+ </Text>
171
+ {projectPath && (
172
+ <Text
173
+ data-testid="project-menu-path"
174
+ title={projectPath}
175
+ variant="caption"
176
+ tone="dim"
177
+ selectable
178
+ truncate
179
+ className="vgai-project-path"
180
+ >
181
+ {projectPath}
182
+ </Text>
183
+ )}
184
+ {projectVersion && engineVersion && manifestVersion !== null && (
185
+ <>
186
+ {projectPath && <MenuSeparator />}
187
+ <div data-testid="project-version-summary" className="vgai-project-versions">
188
+ <span>Editor</span>
189
+ <Text variant="code" tone="muted">
190
+ v{BUNDLED_EDITOR_VERSION}
191
+ </Text>
192
+ <span>Project</span>
193
+ <Text variant="code" tone="muted">
194
+ v{projectVersion}
195
+ </Text>
196
+ <span>Engine</span>
197
+ <Text variant="code" tone="muted">
198
+ v{engineVersion}
199
+ </Text>
200
+ <span>Format</span>
201
+ <Text variant="code" tone="muted">
202
+ v{manifestVersion}
203
+ </Text>
204
+ </div>
205
+ <MenuSeparator />
206
+ </>
207
+ )}
208
+ {projectPath && (
209
+ <MenuItem
210
+ onSelect={() => {
211
+ setMenuOpen(false);
212
+ revealInFinder(projectPath);
213
+ }}
214
+ >
215
+ Show in Finder
216
+ </MenuItem>
217
+ )}
218
+ <MenuItem
219
+ data-testid="project-menu-history"
220
+ onSelect={() => {
221
+ setMenuOpen(false);
222
+ window.dispatchEvent(new CustomEvent('editor:show-history-tab'));
223
+ }}
224
+ >
225
+ {/* §8 naming: `Undo History`, never plain `History` (git/version
226
+ confusion). */}
227
+ Undo History…
228
+ </MenuItem>
229
+ </Menu>
230
+ )}
231
+ </div>
232
+ )}
233
+ {/* W4 (§4.1/§9 W4, inventory row V4 + the recorded always-visible-
234
+ transport work item): the global TRANSPORT cluster lives in the
235
+ command bar — reachable regardless of which center document is
236
+ active (asset/story docs used to hide play/pause/stop entirely).
237
+ Centered in the row, matching the §4.1 mock's `> || >`. */}
238
+ <Inline
239
+ data-testid="header-transport"
240
+ className="vgai-project-transport vgai-chrome-island vgai-glass-island"
241
+ align="center"
242
+ >
243
+ {transport ?? <ProjectTransport />}
244
+ </Inline>
245
+ {/* Conversation entry moved to the global bottom shell row. Keep this
246
+ equal-width spacer so transport remains visually centered. */}
247
+ <Inline className="vgai-project-header-right" justify="end" align="center">
248
+ {/* WHO IS IN THIS SESSION. A chrome slot, not a component: the host
249
+ owns the place and a package owns what sits there
250
+ (`chrome-slot-registry.ts`). `@vgai/collaboration` fills it; a
251
+ build without that package renders nothing here, which is the
252
+ honest answer for an editor nobody else is in. */}
253
+ <ChromeSlot slot="header-trailing" />
254
+ </Inline>
255
+ {/* SaveStatus moved OUT of this command header (H3): status is status,
256
+ not a command — it renders in the W4 status bar
257
+ (`status-contributions.tsx`). */}
258
+ </header>
259
+ );
260
+ }
261
+
262
+ /**
263
+ * The WORKSPACE TAB STRIP — Blender's top bar, shown only when the active
264
+ * chrome regions say so (`workspaceTabs`, a style's or a workspace's region;
265
+ * the Blender bundle turns it on). A click is the explicit act the workspace
266
+ * ruling requires (`workspace-presets.ts`); the strip derives nothing.
267
+ */
268
+ function WorkspaceTabs() {
269
+ useSyncExternalStore(subscribeChromeRegions, chromeRegionsVersion, chromeRegionsVersion);
270
+ useSyncExternalStore(subscribeEditorWorkspaces, editorWorkspacesVersion, editorWorkspacesVersion);
271
+ const active = useSyncExternalStore(
272
+ subscribeEditorWorkspace,
273
+ activeEditorWorkspace,
274
+ activeEditorWorkspace,
275
+ );
276
+ if (activeChromeRegions().workspaceTabs !== 'shown') return null;
277
+ const workspaces = editorWorkspaces().filter((entry) => workspaceApplies(entry.id));
278
+ return (
279
+ <>
280
+ {/* Blender closes its menu words with a 1x20 rule before the workspace
281
+ tabs begin (measured `topbar.png`, halved: a #2e2e2e rule sitting 16px
282
+ past `Help`'s ink). Without it the two regions read as one
283
+ undifferentiated run of words, which is what ours did. It belongs to
284
+ the strip, so it appears and disappears with it. */}
285
+ <Divider orientation="vertical" className="vgai-project-menu-rule" />
286
+ <div
287
+ role="tablist"
288
+ aria-label="Workspaces"
289
+ data-testid="workspace-tabs"
290
+ className="vgai-workspace-tabs"
291
+ >
292
+ {workspaces.map((entry) => (
293
+ <button
294
+ key={entry.id}
295
+ type="button"
296
+ role="tab"
297
+ aria-selected={entry.id === active}
298
+ title={entry.description}
299
+ className="vgai-workspace-tab"
300
+ onClick={() => setEditorWorkspace(entry.id)}
301
+ >
302
+ {entry.title}
303
+ </button>
304
+ ))}
305
+ </div>
306
+ </>
307
+ );
308
+ }
309
+
310
+ /** The global transport cluster: whatever the project's packages contribute
311
+ * to the header (`@volter/editor-sdk/chrome`, `.header`) — the Play transport
312
+ * ships with `@vgai/game`; a folder of models contributes nothing here. */
313
+ function ProjectTransport() {
314
+ useSyncExternalStore(
315
+ subscribeContributedChrome,
316
+ contributedChromeVersion,
317
+ contributedChromeVersion,
318
+ );
319
+ const items = contributedHeaderItems();
320
+ if (items.length === 0) return null;
321
+ return (
322
+ <>
323
+ {items.map(({ id, Component }) => (
324
+ <Component key={id} documentId="" />
325
+ ))}
326
+ </>
327
+ );
328
+ }
@@ -0,0 +1,249 @@
1
+ /** Project-authored composition over the same native editor documents and services. */
2
+ import {
3
+ type DocumentViewProps,
4
+ EditorFooter,
5
+ EditorFrame,
6
+ EditorHeader,
7
+ Workspace as HostWorkspace,
8
+ } from '@volter/editor-sdk/layouts';
9
+ import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
10
+ import { activeProjectKey } from '../active-project';
11
+ import {
12
+ adapterEditorConfiguration,
13
+ subscribeAdapterEditorConfiguration,
14
+ } from '../adapter-editor-config';
15
+ import {
16
+ object3DDocumentSession,
17
+ object3DDocumentSessionsVersion,
18
+ subscribeObject3DDocumentSessions,
19
+ } from '../authoring/object3d-document-session-registry';
20
+ import { openRegisteredDocumentAsync } from '../document-open-registry';
21
+ import { useEditorStore } from '../editor-runtime';
22
+ import {
23
+ projectAdapterWaitNarration,
24
+ subscribeProjectAdapter,
25
+ waitForProjectAdapter,
26
+ } from '../project-adapter';
27
+ import {
28
+ activateWorkspaceDocument,
29
+ closeWorkspaceDocument,
30
+ openWorkspaceDocuments,
31
+ subscribeWorkspaceDocuments,
32
+ workspaceDocumentRegistryVersion,
33
+ } from '../workspace-document-registry';
34
+ import { openAssetDocument } from './asset-documents';
35
+ import { WorkspaceDocumentSurface } from './WorkspaceDocumentSurface';
36
+
37
+ const documentOwners = new Map<
38
+ string,
39
+ { project: string | null; count: number; created: boolean }
40
+ >();
41
+ function retainDocument(id: string, created: boolean): () => void {
42
+ const project = activeProjectKey();
43
+ let ownership = documentOwners.get(id);
44
+ if (!ownership || ownership.project !== project) {
45
+ ownership = { project, count: 0, created };
46
+ documentOwners.set(id, ownership);
47
+ }
48
+ ownership.count++;
49
+ const held = ownership;
50
+ return () => {
51
+ if (documentOwners.get(id) !== held || --held.count > 0) return;
52
+ documentOwners.delete(id);
53
+ if (held.created && activeProjectKey() === held.project) closeWorkspaceDocument(id);
54
+ };
55
+ }
56
+
57
+ /**
58
+ * ONE DOCUMENT, mounted with no chrome around it — the layout host's `Document`.
59
+ *
60
+ * It is exported rather than registered here: `frame/bridge.tsx` is the ONE
61
+ * layout host there is, and it names this component in its own registration.
62
+ * Before PART B this module registered a host of its own and the bridge
63
+ * registered a second one OVER it, reading only this member back out — two
64
+ * registrations for one door, where the second always won.
65
+ */
66
+ export function DocumentView({
67
+ document: address,
68
+ chrome = true,
69
+ active = true,
70
+ onReady,
71
+ }: DocumentViewProps) {
72
+ const store = useEditorStore();
73
+ const [id, setId] = useState<string | null>(null);
74
+ const [error, setError] = useState<string | null>(null);
75
+ const addressKey = JSON.stringify(address);
76
+ const onReadyRef = useRef(onReady);
77
+ onReadyRef.current = onReady;
78
+ const readySession = useRef<unknown>(null);
79
+ useSyncExternalStore(
80
+ subscribeWorkspaceDocuments,
81
+ workspaceDocumentRegistryVersion,
82
+ workspaceDocumentRegistryVersion,
83
+ );
84
+ const sessionsVersion = useSyncExternalStore(
85
+ subscribeObject3DDocumentSessions,
86
+ object3DDocumentSessionsVersion,
87
+ object3DDocumentSessionsVersion,
88
+ );
89
+ useEffect(() => {
90
+ let disposed = false;
91
+ let release: (() => void) | undefined;
92
+ const project = activeProjectKey();
93
+ const current = () => !disposed && activeProjectKey() === project;
94
+ const requested = JSON.parse(addressKey) as DocumentViewProps['document'];
95
+ setId(null);
96
+ setError(null);
97
+ void (async () => {
98
+ await waitForProjectAdapter();
99
+ if (!current()) return;
100
+ const existing = new Set(openWorkspaceDocuments().map((item) => item.descriptor.id));
101
+ // AN ADDRESS, NEVER A BRANCH. A layout names a document; what can open
102
+ // that kind is whatever registered an opener for it, and the kind's own
103
+ // `settle` is the pre-load this used to do by hand for `story`
104
+ // (`document-open-registry.ts`). The two kinds spelled out are the
105
+ // HOST's own: an asset at a path, and a workspace document that is
106
+ // either already open or is not coming.
107
+ const opened =
108
+ requested.kind === 'asset'
109
+ ? openAssetDocument(store, requested.path, requested.assetKind ?? 'source', {
110
+ activate: active,
111
+ })
112
+ : requested.kind === 'workspace'
113
+ ? existing.has(requested.id)
114
+ ? requested.id
115
+ : null
116
+ : await openRegisteredDocumentAsync(requested.kind, store, {
117
+ ...requested,
118
+ activate: active,
119
+ });
120
+ if (!current()) return;
121
+ if (!opened) throw new Error('The requested layout document is unavailable.');
122
+ release = retainDocument(opened, !existing.has(opened));
123
+ setId(opened);
124
+ })().catch((reason: unknown) => {
125
+ if (current()) setError(reason instanceof Error ? reason.message : String(reason));
126
+ });
127
+ return () => {
128
+ disposed = true;
129
+ release?.();
130
+ };
131
+ }, [store, addressKey]);
132
+ useEffect(() => {
133
+ if (!id || !active) return;
134
+ activateWorkspaceDocument(id);
135
+ }, [id, active]);
136
+ useEffect(() => {
137
+ if (!id) return;
138
+ const session = object3DDocumentSession(id);
139
+ if (!session || readySession.current === session) return;
140
+ readySession.current = session;
141
+ try {
142
+ onReadyRef.current?.({
143
+ select(name) {
144
+ const matches: string[] = [];
145
+ session.root.traverse((object) => {
146
+ if (object.name === name) {
147
+ const objectId = session.idForObject(object);
148
+ if (objectId) matches.push(objectId);
149
+ }
150
+ });
151
+ if (matches.length !== 1)
152
+ throw new Error(`Expected one object named "${name}"; found ${matches.length}.`);
153
+ session.select(matches);
154
+ },
155
+ transform(mode) {
156
+ session.viewport.setTransformMode(mode);
157
+ },
158
+ frame() {
159
+ session.frame();
160
+ },
161
+ });
162
+ } catch (reason) {
163
+ setError(reason instanceof Error ? reason.message : String(reason));
164
+ }
165
+ }, [id, sessionsVersion]);
166
+ const opened = id
167
+ ? openWorkspaceDocuments().find((item) => item.descriptor.id === id)
168
+ : undefined;
169
+ return (
170
+ <div
171
+ style={{
172
+ position: 'relative',
173
+ flex: 1,
174
+ minWidth: 0,
175
+ minHeight: 0,
176
+ height: '100%',
177
+ overflow: 'hidden',
178
+ }}
179
+ >
180
+ {error ? (
181
+ <div role="alert">{error}</div>
182
+ ) : opened ? (
183
+ <WorkspaceDocumentSurface descriptor={opened.descriptor} active={active} chrome={chrome} />
184
+ ) : (
185
+ <div role="status">Opening document…</div>
186
+ )}
187
+ </div>
188
+ );
189
+ }
190
+
191
+ /**
192
+ * THE LAYOUT A PROJECT THAT DECLARES NONE GETS — and it goes through the
193
+ * LAYOUT HOST, exactly as every declared layout does. Never through the
194
+ * components directly: the host is where the editor meets the workbench's
195
+ * parts, and a layout that renders around it puts the project header in an
196
+ * overlay root instead of the title bar and the document beside the editor
197
+ * area instead of in it (measured 2026-09-19, the frame walk's beat 19, on
198
+ * `public/ingest/three-points-waves/`).
199
+ *
200
+ * `configuration.Layout` comes from the project adapter's own `editor.Layout`,
201
+ * which only the scaffolder and the Blender template ever write, so most
202
+ * projects take this path.
203
+ *
204
+ * The body below is `GameLayout` minus `immersivePlay` (the flag is a CLAIM a
205
+ * layout makes, and a project that declared no layout has made no claim).
206
+ */
207
+ function LegacyLayout() {
208
+ return (
209
+ <EditorFrame>
210
+ <EditorHeader />
211
+ <HostWorkspace />
212
+ <EditorFooter />
213
+ </EditorFrame>
214
+ );
215
+ }
216
+ export function ProjectLayout() {
217
+ const store = useEditorStore();
218
+ useSyncExternalStore(store.subscribe, store.getShellSnapshot ?? store.getSnapshot);
219
+ const configuration = useSyncExternalStore(
220
+ subscribeAdapterEditorConfiguration,
221
+ adapterEditorConfiguration,
222
+ adapterEditorConfiguration,
223
+ );
224
+ const [ready, setReady] = useState(false);
225
+ // THE BOOT'S OWN STATUS LINE NAMES WHAT IT IS WAITING FOR. Resolving the
226
+ // adapter can take a contribution pass — a project that declares an ingest
227
+ // root has its adapter declaration in a package, and waiting for that
228
+ // package is measured in seconds (`project-adapter.ts`'s
229
+ // `waitForContributedAdapterSources`). Nine silent seconds under "Loading
230
+ // project layout…" reads as a hung editor; the loader publishes the reason
231
+ // and this line speaks it.
232
+ const waiting = useSyncExternalStore(
233
+ subscribeProjectAdapter,
234
+ projectAdapterWaitNarration,
235
+ projectAdapterWaitNarration,
236
+ );
237
+ useEffect(() => {
238
+ let disposed = false;
239
+ void waitForProjectAdapter().then(() => {
240
+ if (!disposed) setReady(true);
241
+ });
242
+ return () => {
243
+ disposed = true;
244
+ };
245
+ }, []);
246
+ if (!ready) return <div role="status">{waiting ?? 'Loading project layout…'}</div>;
247
+ const Layout = configuration.Layout ?? LegacyLayout;
248
+ return <Layout playing={store.playState !== 'stopped'} paused={store.playState === 'paused'} />;
249
+ }