@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,106 @@
1
+ import { lazy, Suspense, use, useEffect, useSyncExternalStore } from 'react';
2
+ import { connectAssetEvents } from '../asset-events';
3
+ import { installAssetSelectionAutoClear } from '../asset-selection';
4
+ import { registerEditorShellHotkeys } from '../editor-hotkeys';
5
+ import {
6
+ useEditorInit,
7
+ useEditorStore,
8
+ useHistoryCommands,
9
+ useHistoryService,
10
+ } from '../editor-runtime';
11
+ import { installAuxiliaryEvents } from '../workspace-aux-commands';
12
+ import { installUtilityAutoOpen } from '../workspace-utility-commands';
13
+ import { AgentPresentationNotice } from './AgentPresentationNotice';
14
+ import { useCenterDocuments } from './CenterDocuments';
15
+ import { ensureCoreUtilitiesRegistered } from './core-utilities';
16
+ import { installKindDocumentRefresh } from './kind-documents';
17
+ import { ProjectLayout } from './ProjectLayout';
18
+ import { PaletteActionPublisher } from './palette-action-publisher';
19
+ import { ensureCoreStatusContributionsRegistered } from './status-contributions';
20
+ import { installStandingToolDocuments } from './tool-documents';
21
+ import { setWorkspaceHistoryService } from './workspace-history';
22
+
23
+ // Session discovery remains alive even when every document tab is closed.
24
+ const ProjectAuthoringBootstrap = lazy(async () => {
25
+ const module = await import('./NonThreeAuthoringBootstrap');
26
+ return { default: module.ProjectAuthoringBootstrap };
27
+ });
28
+
29
+ export function DefaultEditorLayout() {
30
+ const store = useEditorStore();
31
+ const history = useHistoryService();
32
+ const historyCommands = useHistoryCommands();
33
+ use(useEditorInit()); // suspends until project is detected
34
+
35
+ // Subscribe to store changes: the reads below are what need it; the version
36
+ // itself is not read.
37
+ useSyncExternalStore(store.subscribe, store.getShellSnapshot ?? store.getSnapshot);
38
+ // W1 — install the authored document plus the warm runtime host (whose Game
39
+ // tab is rail-visible only while active) and keep registry activation synced
40
+ // with the store's activeViewportTab (T6.3 gate).
41
+ useCenterDocuments(store);
42
+ // W3 (workspace-shell §9/W3) — the shell contributions the new center
43
+ // documents ride on:
44
+ // - the STANDING tool documents (`installStandingToolDocuments`): every
45
+ // discovered document contribution the project declares `standing` opens
46
+ // as a pinned board beside `3D`/`UI`/`Dev` and stays in step with
47
+ // discovery, so a capability added mid-session brings its tab with it and
48
+ // a deleted one takes its tab away. The editor owns no per-asset
49
+ // documents of its own — a capability's own tool is what puts a board
50
+ // here (the `data-tables` Data tab is the worked case);
51
+ // - the Build Output utility + build-progress status contribution
52
+ // (server mode only — builds spawn npm scripts server-side).
53
+ // W4 (workspace-shell §9/W4) — status-bar contributions register BEFORE the
54
+ // build ensure below so the order-0 items sequence save-status first; the
55
+ // utility auto-open watcher (save/build failure → the right utility) is
56
+ // per-store. Core utilities register before the host reconciles.
57
+ useEffect(() => ensureCoreStatusContributionsRegistered(), []);
58
+ useEffect(() => ensureCoreUtilitiesRegistered(), []);
59
+ useEffect(() => installUtilityAutoOpen(history), [history]);
60
+ useEffect(() => installAuxiliaryEvents(), []);
61
+ useEffect(() => installStandingToolDocuments(store), [store]);
62
+ useEffect(() => installKindDocumentRefresh(store), [store]);
63
+ useEffect(() => setWorkspaceHistoryService(history), [history]);
64
+ // Undo/redo/save/delete live here, not on the world root's stage: a canvas-only
65
+ // project never mounts that panel, and Ctrl+Z was a silent no-op there.
66
+ useEffect(() => registerEditorShellHotkeys(store, historyCommands), [store, historyCommands]);
67
+ // W2 (§5.1) — an ENTITY selection change drops the asset selection, so the
68
+ // Inspector goes back to being purely entity-contextual (asset-selection.ts).
69
+ useEffect(() => installAssetSelectionAutoClear(store), [store]);
70
+
71
+ // Subscribe to server-sent asset move events (file watcher)
72
+ useEffect(() => {
73
+ // Purely a REFRESH signal. Documents that carry asset refs are rewritten
74
+ // by `project-asset-operations.ts` as part of the move itself, so nothing
75
+ // here rewrites anything in memory.
76
+ return connectAssetEvents(
77
+ () => window.dispatchEvent(new CustomEvent('editor:assets-changed')),
78
+ (detail) => window.dispatchEvent(new CustomEvent('editor:assets-changed', { detail })),
79
+ );
80
+ }, []);
81
+
82
+ // There is deliberately NO shell-level document reload watcher here: each
83
+ // adapter owns its own external-change contract
84
+ // (`PersistenceProvider.applyExternal`), because only the adapter knows how
85
+ // to read its own truth back.
86
+
87
+ return (
88
+ <>
89
+ {/* Edit-time audio is `@vgai/game`'s `edit-mode-audio.service.ts`: the
90
+ graph it installs is the engine's audio RUNTIME, and the shell used to
91
+ import it for every project including one that plays nothing. */}
92
+ {/* Edit-time networking config (declared server + authored identity) for a
93
+ multiplayer project, with no game running. No-op for single-player. */}
94
+ <Suspense fallback={null}>
95
+ <ProjectAuthoringBootstrap store={store} />
96
+ </Suspense>
97
+ <ProjectLayout />
98
+ <AgentPresentationNotice />
99
+ {/* THE PALETTE IS THE WORKBENCH'S (⌘⇧P). This publishes the editor's live
100
+ action table to the bridge, which registers one
101
+ `MenuId.CommandPalette` item per entry with our own label — so the
102
+ workbench's palette lists OUR actions, and there is no second one. */}
103
+ <PaletteActionPublisher />
104
+ </>
105
+ );
106
+ }
@@ -0,0 +1,96 @@
1
+ import { type ReactNode, useSyncExternalStore } from 'react';
2
+ import {
3
+ object3DDocumentSession,
4
+ object3DDocumentSessionsVersion,
5
+ subscribeObject3DDocumentSessions,
6
+ } from '../authoring/object3d-document-session-registry';
7
+ import { chromeRegionsKey, subscribeChromeRegions } from '../workspace-regions';
8
+ import { Object3DDocumentToolbar } from './Object3DDocumentToolbar';
9
+
10
+ /**
11
+ * THE DOCUMENT HEADER STRIP — the one region every document's header lives
12
+ * in, drawn by the host. Three kinds of content share the row:
13
+ *
14
+ * - the document's OWN header (`children`: the descriptor's `Toolbar`, or a
15
+ * contribution's `export const Toolbar` mounted through `ToolHost`), which
16
+ * keeps the leading, full-width part of the row;
17
+ * - the host's TRANSFORM controls (`transformControls`: orientation, pivot,
18
+ * snap, transform options), for a document whose stage takes them — they
19
+ * are HEADER controls in Blender's 3D viewport, not tool-shelf ones, and
20
+ * the shelf holds tools only;
21
+ * - the host's 3D controls (`Object3DDocumentToolbar`: frame, camera,
22
+ * shading, environment, preview capture) for ANY document that has
23
+ * mounted an Object3D session — asset models, scene isolation, three
24
+ * stories, the 3D board, a project's mesh document — found through the
25
+ * session registry, so no descriptor has to declare them. A chromeless
26
+ * mount (an inspector preview) registers no session and gets no strip.
27
+ *
28
+ * The strip renders when either kind has something to show. Exported so the
29
+ * bounded host, which mounts a document without the dock, draws the
30
+ * SAME strip instead of a copy.
31
+ */
32
+ export function DocumentHeaderStrip({
33
+ documentId,
34
+ runtime = false,
35
+ island = false,
36
+ assetPath,
37
+ transformControls,
38
+ children,
39
+ }: {
40
+ readonly documentId: string;
41
+ /** Runtime controls belong to the live view, independent of authoring chrome. */
42
+ readonly runtime?: boolean;
43
+ /** The floating-composition island treatment for a world document. */
44
+ readonly island?: boolean;
45
+ /** The asset this document opened, when it is an asset document — the
46
+ * caller that knows (the dock, through `assetDocumentSpec`) passes it, so
47
+ * this module never imports the asset-document machinery and a host
48
+ * without it (a bounded host) pays only for the toolbar. */
49
+ readonly assetPath?: string | undefined;
50
+ /** The host's TRANSFORM controls (`TransformHeaderControls`), passed by the
51
+ * caller that knows whether this document's stage takes them — the GIZMO
52
+ * arm of the same `stageTransformDriver` answer that gates the shelf's tool
53
+ * strip, because every one of these four wells configures the editor
54
+ * viewport's gizmo and a stage with none has nothing for them to set. They
55
+ * render at the trailing edge beside the 3D controls, which is where
56
+ * Blender's viewport header carries them. */
57
+ readonly transformControls?: ReactNode;
58
+ readonly children?: ReactNode;
59
+ }) {
60
+ useSyncExternalStore(
61
+ subscribeObject3DDocumentSessions,
62
+ object3DDocumentSessionsVersion,
63
+ object3DDocumentSessionsVersion,
64
+ );
65
+ const regionsVersion = useSyncExternalStore(
66
+ subscribeChromeRegions,
67
+ chromeRegionsKey,
68
+ chromeRegionsKey,
69
+ );
70
+ const session = object3DDocumentSession(documentId);
71
+ if (!children && !session && !transformControls) return null;
72
+ // The workspace's knob, not the document's: a skin that hides headers hides
73
+ // them for every document in that workspace (`EditorWorkspaceRegions`).
74
+ if (!runtime && regionsVersion.includes('header:hidden')) return null;
75
+ return (
76
+ <div
77
+ className={
78
+ island
79
+ ? 'vgai-dock-document-toolbar vgai-chrome-island vgai-glass-island'
80
+ : 'vgai-dock-document-toolbar'
81
+ }
82
+ data-runtime-toolbar={runtime || undefined}
83
+ data-island-scale="compact"
84
+ data-testid={`document-header:${documentId}`}
85
+ >
86
+ {children ? <div className="vgai-dock-document-toolbar-own">{children}</div> : null}
87
+ {transformControls}
88
+ {session ? (
89
+ <Object3DDocumentToolbar
90
+ documentId={documentId}
91
+ {...(assetPath && !assetPath.startsWith('online:') ? { assetPath } : {})}
92
+ />
93
+ ) : null}
94
+ </div>
95
+ );
96
+ }
@@ -0,0 +1,45 @@
1
+ import { type ReactNode, useSyncExternalStore } from 'react';
2
+ import { chromeRegionsKey, subscribeChromeRegions } from '../workspace-regions';
3
+
4
+ /**
5
+ * THE DOCUMENT SHELF — Blender's tool shelf (T), the host's second region
6
+ * after the header strip (`DocumentHeaderStrip`): a vertical rail at the
7
+ * leading edge of a document's content box, drawn by the host, contents
8
+ * contributed: the host's transform tools on top for every three stage
9
+ * (`WorkspaceDocumentSurface`, selection or not — Blender's rail is
10
+ * persistent), then the document's own — the mesh document its operators, a
11
+ * project's own document whatever it exports as `Shelf`. The rail sits INSIDE the content box (absolute, over the stage —
12
+ * the position `.vgai-dock-document-content` now provides), so the header
13
+ * strip above it is never covered and the stage keeps its full size.
14
+ *
15
+ * Nothing renders when there is nothing to show; a document without a shelf
16
+ * has no rail, not an empty one.
17
+ */
18
+ export function DocumentShelfRail({
19
+ documentId,
20
+ children,
21
+ }: {
22
+ readonly documentId: string;
23
+ readonly children?: ReactNode;
24
+ }) {
25
+ const regionsVersion = useSyncExternalStore(
26
+ subscribeChromeRegions,
27
+ chromeRegionsKey,
28
+ chromeRegionsKey,
29
+ );
30
+ if (!children) return null;
31
+ // The workspace's knob (`EditorWorkspaceRegions.shelf`), the same way the
32
+ // header strip reads its own.
33
+ if (regionsVersion.includes('shelf:hidden')) return null;
34
+ return (
35
+ <div
36
+ className="vgai-dock-document-shelf"
37
+ data-testid={`document-shelf:${documentId}`}
38
+ role="toolbar"
39
+ aria-orientation="vertical"
40
+ aria-label="Document tools"
41
+ >
42
+ {children}
43
+ </div>
44
+ );
45
+ }
@@ -0,0 +1,345 @@
1
+ import { fontSizeVar, text } from '@volter/editor-sdk/widgets';
2
+ import { MANIFEST_FILENAME } from '@volter/editor-project/manifest/filename';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { listProjectSourceFiles, readProjectTextFile } from '../api/project-source';
5
+ import {
6
+ loadProjectThumbnailManifest,
7
+ resetProjectThumbnailManifestCache,
8
+ THUMBNAIL_MANIFEST_PATH,
9
+ ThumbnailJobQueue,
10
+ } from '../asset-workflow/thumbnail-system';
11
+ import {
12
+ DOCUMENT_PREVIEW_HEIGHT,
13
+ DOCUMENT_PREVIEW_RECIPE,
14
+ DOCUMENT_PREVIEW_WIDTH,
15
+ type DocumentPreviewSource,
16
+ } from '../document-preview-source';
17
+ import { projectFiles } from '../files/project-files';
18
+ import { getCurrentProject } from '../project-manager';
19
+ import { getStorageBackend } from '../storage';
20
+
21
+ interface CaptureJob {
22
+ readonly run: () => Promise<string>;
23
+ readonly consumers: Set<AbortSignal>;
24
+ }
25
+ const captureJobs = new Map<string, CaptureJob>();
26
+ const captureQueue = new ThumbnailJobQueue<string>(async (key) => {
27
+ const job = captureJobs.get(key)!;
28
+ await new Promise<void>((resume) => {
29
+ if (typeof requestIdleCallback === 'function')
30
+ requestIdleCallback(() => resume(), { timeout: 1000 });
31
+ else setTimeout(resume, 0);
32
+ });
33
+ if ([...job.consumers].every((consumer) => consumer.aborted)) {
34
+ throw new DOMException('Preview demand was cancelled.', 'AbortError');
35
+ }
36
+ return job.run();
37
+ }, 1);
38
+ let dependencyFingerprint: Promise<string> | null = null;
39
+ let dependencyProject: string | undefined;
40
+ let dependencyWatchDispose: (() => void) | null = null;
41
+ const dependencyListeners = new Set<() => void>();
42
+
43
+ async function listPublicDependencyFacts(path: string): Promise<string[]> {
44
+ const backend = getStorageBackend();
45
+ let entries: Awaited<ReturnType<typeof backend.list>>;
46
+ try {
47
+ entries = await backend.list(path);
48
+ } catch {
49
+ return [];
50
+ }
51
+ const facts: string[] = [];
52
+ for (const entry of entries) {
53
+ if (entry.type === 'dir') facts.push(...(await listPublicDependencyFacts(entry.path)));
54
+ else facts.push(`${entry.path}:${entry.size ?? 0}:${entry.mtime ?? 0}`);
55
+ }
56
+ return facts;
57
+ }
58
+
59
+ async function projectDependencyFingerprint(): Promise<string> {
60
+ const project = getCurrentProject()?.rootPath;
61
+ if (dependencyProject !== project) {
62
+ dependencyProject = project;
63
+ dependencyFingerprint = null;
64
+ }
65
+ dependencyFingerprint ??= Promise.all([
66
+ listProjectSourceFiles([
67
+ MANIFEST_FILENAME,
68
+ 'vgai.adapter.ts',
69
+ '.storybook/**/*',
70
+ 'src/**/*.ts',
71
+ 'src/**/*.tsx',
72
+ 'src/**/*.js',
73
+ 'src/**/*.jsx',
74
+ 'src/**/*.mjs',
75
+ 'src/**/*.cjs',
76
+ 'src/**/*.json',
77
+ 'src/**/*.css',
78
+ ]).then(async (paths) =>
79
+ Promise.all(paths.map(async (path) => `${path}:${(await readProjectTextFile(path)) ?? ''}`)),
80
+ ),
81
+ listPublicDependencyFacts(''),
82
+ ]).then(([source, assets]) => digest([...source, ...assets].sort().join('\n')));
83
+ return dependencyFingerprint;
84
+ }
85
+
86
+ function subscribeProjectDependencies(listener: () => void): () => void {
87
+ dependencyListeners.add(listener);
88
+ dependencyWatchDispose ??= projectFiles.watch((event) => {
89
+ if (event.path === THUMBNAIL_MANIFEST_PATH) {
90
+ resetProjectThumbnailManifestCache();
91
+ for (const current of dependencyListeners) current();
92
+ return;
93
+ }
94
+ if (
95
+ !/^(src|public|\.storybook)\//.test(event.path) &&
96
+ event.path !== MANIFEST_FILENAME &&
97
+ event.path !== 'vgai.adapter.ts'
98
+ )
99
+ return;
100
+ dependencyFingerprint = null;
101
+ for (const current of dependencyListeners) current();
102
+ });
103
+ return () => {
104
+ dependencyListeners.delete(listener);
105
+ if (dependencyListeners.size === 0) {
106
+ dependencyWatchDispose?.();
107
+ dependencyWatchDispose = null;
108
+ dependencyFingerprint = null;
109
+ }
110
+ };
111
+ }
112
+
113
+ async function serializedCapture(
114
+ key: string,
115
+ signal: AbortSignal,
116
+ run: () => Promise<string>,
117
+ ): Promise<string> {
118
+ signal.throwIfAborted();
119
+ let job = captureJobs.get(key);
120
+ if (!job) {
121
+ job = { run, consumers: new Set() };
122
+ captureJobs.set(key, job);
123
+ }
124
+ job.consumers.add(signal);
125
+ const request = captureQueue.request(key, 1);
126
+ signal.addEventListener('abort', request.cancel, { once: true });
127
+ try {
128
+ return await request.promise;
129
+ } finally {
130
+ signal.removeEventListener('abort', request.cancel);
131
+ job.consumers.delete(signal);
132
+ if (job.consumers.size === 0 && captureJobs.get(key) === job) captureJobs.delete(key);
133
+ }
134
+ }
135
+
136
+ async function digest(value: string): Promise<string> {
137
+ const bytes = new TextEncoder().encode(value);
138
+ const hash = await crypto.subtle.digest('SHA-256', bytes);
139
+ return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
140
+ }
141
+
142
+ function decodeDataUrl(value: string): { mime: string; bytes: Uint8Array } {
143
+ const match = /^data:([^;,]+);base64,(.*)$/s.exec(value);
144
+ if (!match) throw new Error('Document preview owner returned an invalid image data URL.');
145
+ const binary = atob(match[2]!);
146
+ const bytes = new Uint8Array(binary.length);
147
+ for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);
148
+ return { mime: match[1]!, bytes };
149
+ }
150
+
151
+ function blobUrl(bytes: Uint8Array, mime = 'image/png'): string {
152
+ const copy = new Uint8Array(bytes.byteLength);
153
+ copy.set(bytes);
154
+ return URL.createObjectURL(new Blob([copy.buffer], { type: mime }));
155
+ }
156
+
157
+ async function previewCamera(documentId: string) {
158
+ const read = await loadProjectThumbnailManifest();
159
+ if (read.status !== 'ok') return undefined;
160
+ const framing = read.manifest.entries[`document:${documentId}`]?.framing;
161
+ return framing
162
+ ? {
163
+ position: { x: framing.position[0], y: framing.position[1], z: framing.position[2] },
164
+ target: { x: framing.target[0], y: framing.target[1], z: framing.target[2] },
165
+ ...(framing.fov === undefined ? {} : { fov: framing.fov }),
166
+ }
167
+ : undefined;
168
+ }
169
+
170
+ async function resolvePreview(
171
+ documentId: string,
172
+ source: DocumentPreviewSource,
173
+ force: number,
174
+ signal: AbortSignal,
175
+ ): Promise<string> {
176
+ const projectId = getCurrentProject()?.rootPath ?? 'no-project';
177
+ const camera = await previewCamera(documentId);
178
+ const identity = JSON.stringify({
179
+ projectId,
180
+ documentId,
181
+ recipe: DOCUMENT_PREVIEW_RECIPE,
182
+ revision: source.revision(),
183
+ dependencies: await projectDependencyFingerprint(),
184
+ camera,
185
+ });
186
+ signal.throwIfAborted();
187
+ const key = await digest(identity);
188
+ const path = `.vgai/cache/document-previews/${key}.png`;
189
+ if (force === 0 && (await projectFiles.exists(path))) {
190
+ return blobUrl(await projectFiles.readBytes(path));
191
+ }
192
+ const dataUrl = await serializedCapture(key, signal, () =>
193
+ source.capture({
194
+ width: DOCUMENT_PREVIEW_WIDTH,
195
+ height: DOCUMENT_PREVIEW_HEIGHT,
196
+ ...(camera ? { camera } : {}),
197
+ }),
198
+ );
199
+ signal.throwIfAborted();
200
+ const image = decodeDataUrl(dataUrl);
201
+ await projectFiles.write(path, image.bytes);
202
+ return blobUrl(image.bytes, image.mime);
203
+ }
204
+
205
+ export function DocumentThumbnail({
206
+ documentId,
207
+ source,
208
+ previewRevision,
209
+ }: {
210
+ readonly documentId: string;
211
+ readonly source: DocumentPreviewSource;
212
+ readonly previewRevision: number;
213
+ }) {
214
+ const [url, setUrl] = useState<string | null>(null);
215
+ const [error, setError] = useState<string | null>(null);
216
+ const [sourceRevision, setSourceRevision] = useState(0);
217
+ const [retry, setRetry] = useState(0);
218
+ const [refreshing, setRefreshing] = useState(true);
219
+ const [visible, setVisible] = useState(false);
220
+ const host = useRef<HTMLDivElement>(null);
221
+ const demand = useRef<AbortController | null>(null);
222
+ const liveUrl = useRef<string | null>(null);
223
+ const lastRefresh = useRef({ previewRevision, retry });
224
+
225
+ useEffect(() => {
226
+ let timer: ReturnType<typeof setTimeout> | null = null;
227
+ const invalidate = () => {
228
+ demand.current?.abort();
229
+ setRefreshing(true);
230
+ if (timer) clearTimeout(timer);
231
+ timer = setTimeout(() => setSourceRevision((value) => value + 1), 750);
232
+ };
233
+ const unsubscribeSource = source.subscribe(invalidate);
234
+ // Imported modules are part of the rendered document even when the entry
235
+ // registry itself does not republish. The project watcher is the broad,
236
+ // truthful invalidation signal for that dependency graph.
237
+ const unsubscribeFiles = subscribeProjectDependencies(invalidate);
238
+ return () => {
239
+ if (timer) clearTimeout(timer);
240
+ unsubscribeSource();
241
+ unsubscribeFiles();
242
+ };
243
+ }, [source]);
244
+
245
+ useEffect(
246
+ () => () => {
247
+ if (liveUrl.current?.startsWith('blob:')) URL.revokeObjectURL(liveUrl.current);
248
+ },
249
+ [],
250
+ );
251
+
252
+ useEffect(() => {
253
+ const element = host.current;
254
+ if (!element) return;
255
+ const observer = new IntersectionObserver(([entry]) =>
256
+ setVisible(entry?.isIntersecting ?? false),
257
+ );
258
+ observer.observe(element);
259
+ return () => observer.disconnect();
260
+ }, []);
261
+
262
+ useEffect(() => {
263
+ if (!visible) return;
264
+ const controller = new AbortController();
265
+ demand.current = controller;
266
+ const force =
267
+ lastRefresh.current.previewRevision !== previewRevision || lastRefresh.current.retry !== retry
268
+ ? 1
269
+ : 0;
270
+ setError(null);
271
+ setRefreshing(true);
272
+ void resolvePreview(documentId, source, force, controller.signal)
273
+ .then((resolved) => {
274
+ if (controller.signal.aborted) {
275
+ URL.revokeObjectURL(resolved);
276
+ return;
277
+ }
278
+ if (liveUrl.current) URL.revokeObjectURL(liveUrl.current);
279
+ lastRefresh.current = { previewRevision, retry };
280
+ liveUrl.current = resolved;
281
+ setUrl(resolved);
282
+ setRefreshing(false);
283
+ })
284
+ .catch((reason: unknown) => {
285
+ if (controller.signal.aborted) return;
286
+ setError(reason instanceof Error ? reason.message : String(reason));
287
+ setRefreshing(false);
288
+ });
289
+ return () => controller.abort();
290
+ }, [documentId, previewRevision, retry, source, sourceRevision, visible]);
291
+
292
+ return (
293
+ <div
294
+ ref={host}
295
+ style={{
296
+ width: '100%',
297
+ height: '100%',
298
+ position: 'relative',
299
+ display: 'grid',
300
+ placeItems: 'center',
301
+ }}
302
+ >
303
+ {url && (
304
+ <img
305
+ src={url}
306
+ alt={`${documentId} preview`}
307
+ style={{ width: '100%', height: '100%', objectFit: 'contain' }}
308
+ />
309
+ )}
310
+ {error ? (
311
+ <button
312
+ type="button"
313
+ title={error}
314
+ onClick={(event) => {
315
+ event.stopPropagation();
316
+ setRetry((value) => value + 1);
317
+ }}
318
+ style={{
319
+ position: 'absolute',
320
+ bottom: 0,
321
+ border: 0,
322
+ background: 'var(--vscode-editor-background)',
323
+ color: text[3],
324
+ pointerEvents: 'auto',
325
+ }}
326
+ >
327
+ Preview unavailable · Retry
328
+ </button>
329
+ ) : refreshing ? (
330
+ <span
331
+ role="status"
332
+ style={{
333
+ position: 'absolute',
334
+ bottom: 0,
335
+ background: 'var(--vscode-editor-background)',
336
+ color: text[3],
337
+ fontSize: fontSizeVar.xs,
338
+ }}
339
+ >
340
+ {url ? 'Refreshing preview…' : 'Loading preview…'}
341
+ </span>
342
+ ) : null}
343
+ </div>
344
+ );
345
+ }