@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,536 @@
1
+ import {
2
+ openAvailableWorkspaceDocument,
3
+ requestAvailableWorkspaceDocument,
4
+ } from './workspace-available-documents';
5
+ /**
6
+ * PERSISTED WORKSPACE STATE: which named workspace the project was left in,
7
+ * which documents were open, which one was in front, and each kind's own
8
+ * session cell. Restored on boot, written through (debounced) on every change.
9
+ * Manual hierarchy openness is NOT here - it persists in its own store
10
+ * (`hierarchy-expansion-state.ts`), same key discipline.
11
+ *
12
+ * NO GEOMETRY LIVES HERE, and that is the whole shape of this module. Where a
13
+ * document is DRAWN - groups, sizes, tab order, split geometry - is the
14
+ * workbench's own editor-group state, which VS Code persists itself. This
15
+ * module records the SET and nothing about its arrangement; a reload reopens
16
+ * the same documents into whatever grid the workbench restored. Geometry that
17
+ * two owners both record is geometry they can disagree about, and the
18
+ * workbench is the one that draws it.
19
+ *
20
+ * STORAGE DECISION (owner ruling, 2026-09-04 - ARCHITECTURE-CORE §Editor
21
+ * chrome, "Settings have four layers with named homes"): the `workspace`
22
+ * SECTION of the project-local document (`project-local-state.ts`), which is
23
+ * `.vgai/editor-state.json` - git-ignored by the scaffold, written by the
24
+ * editor server locally, keyed by the folder itself.
25
+ *
26
+ * DOCUMENTS: THIS MODULE NAMES NONE OF THEM. It stores, per open document, an
27
+ * OPAQUE blob under that document's KIND and ID - whatever the descriptor's
28
+ * own `persist` returns - and on the next boot hands each blob back to the
29
+ * kind's registered restorer (`workspace-document-restore.ts`). The rule
30
+ * "persist+restore only documents that can truthfully reopen - verify on
31
+ * restore, drop silently if gone" is unchanged; every kind owns its own
32
+ * answer:
33
+ *
34
+ * - a document that nothing at boot re-derives, and whose subject is a
35
+ * stable addressable state, declares `persist` and verifies itself on the
36
+ * way back (`restore` answering `false` is the whole drop mechanism);
37
+ * - a document something else reopens unconditionally, and one whose subject
38
+ * is a live session or an unresolved remote view, declares no `persist` at
39
+ * all, and simply does not come back.
40
+ *
41
+ * A kind with NO restorer registered - a module that is gone, a package this
42
+ * project no longer depends on, a record another build wrote - restores
43
+ * nothing, silently. That is the entire compatibility rule for a document's
44
+ * blob. The RECORD around it carries one number,
45
+ * {@link WORKSPACE_STATE_VERSION}, and a record written in any other shape is
46
+ * read as no record at all: no migration, no dual-read, no compat branch.
47
+ *
48
+ * CONTRIBUTIONS LOAD FIRST, AND BEFORE THE CLOCK STARTS. A restorer usually
49
+ * belongs to the module that opens the kind, and that module can be a
50
+ * package's - whose code loads on the contribution pass, which
51
+ * `project-tool-discovery.ts` defers behind the opening viewport frame. So a
52
+ * record with any open document awaits ONE contribution pass first, which is
53
+ * that module's header's sanctioned exception to its own deferral. It cannot
54
+ * deadlock: the deferral lives in the discovery LIFECYCLE, not in
55
+ * `refreshProjectToolContributions` itself. Without it the host would drop a
56
+ * package's documents on every boot and silently call it a verification
57
+ * failure. That load is NOT inside `RESTORE_TIMEOUT_MS`: it is a known startup
58
+ * cost (9s on a cold `full` scaffold, measured 2026-09-18), not the hung fetch
59
+ * the bound guards, and counting it made the bound fire on every boot.
60
+ *
61
+ * Write-through is debounced (300ms trailing) and flushed on `pagehide`, so
62
+ * an immediate reload still captures the last change. Subscriptions install
63
+ * only AFTER the async restore finishes - a half-restored open-set must
64
+ * never overwrite the stored one. That wait is BOUNDED (`RESTORE_TIMEOUT_MS`):
65
+ * a hung verification fetch (e.g. a stalled asset-existence probe) must never
66
+ * block write-through + pagehide-flush installation for the whole session -
67
+ * open-tab state is convenience state, not project truth, so availability
68
+ * beats completeness here. If the restore itself keeps running past the
69
+ * timeout, its later document-opens still land normally; only the
70
+ * subscription install is time-boxed, not the restore itself.
71
+ */
72
+
73
+ import { editorViewFromUrl } from '@volter/editor-sdk';
74
+ import { projectAdapterFacet, waitForProjectAdapter } from './project-adapter';
75
+ import {
76
+ preloadProjectLocalState,
77
+ projectLocalSection,
78
+ projectLocalStateReady,
79
+ writeProjectLocalSection,
80
+ } from './project-local-state';
81
+ import { getCurrentProject } from './project-manager';
82
+ import { refreshProjectToolContributions } from './tool-loader';
83
+ import { PINNED_ASYNC_DOCUMENT_IDS } from './workspace-document-ids';
84
+ import {
85
+ activateWorkspaceDocument,
86
+ activeWorkspaceDocumentId,
87
+ type OpenWorkspaceDocument,
88
+ openWorkspaceDocuments,
89
+ restorePinnedWorkspaceDocumentActivation,
90
+ subscribeWorkspaceDocuments,
91
+ } from './workspace-document-registry';
92
+ import {
93
+ type WorkspaceStateStore,
94
+ workspaceDocumentRestorerEntries,
95
+ workspaceDocumentRestorers,
96
+ } from './workspace-document-restore';
97
+ import { isWorkspacePersistenceSuppressed } from './workspace-persistence-gate';
98
+ import {
99
+ activeEditorWorkspace,
100
+ defaultEditorWorkspace,
101
+ type EditorWorkspaceId,
102
+ isEditorWorkspaceId,
103
+ setEditorWorkspace,
104
+ workspaceApplies,
105
+ } from './workspace-presets';
106
+
107
+ interface WorkspaceRestoreEpoch {
108
+ readonly generation: number;
109
+ readonly promise: Promise<void>;
110
+ active: boolean;
111
+ }
112
+
113
+ let workspaceRestoreGeneration = 0;
114
+ let currentWorkspaceRestore: WorkspaceRestoreEpoch | null = null;
115
+ const workspaceRestoreWaiters = new Set<(epoch: WorkspaceRestoreEpoch) => void>();
116
+
117
+ function publishWorkspaceRestore(promise: Promise<void>): WorkspaceRestoreEpoch {
118
+ const epoch: WorkspaceRestoreEpoch = {
119
+ generation: ++workspaceRestoreGeneration,
120
+ promise,
121
+ active: true,
122
+ };
123
+ currentWorkspaceRestore = epoch;
124
+ for (const resolve of workspaceRestoreWaiters) resolve(epoch);
125
+ workspaceRestoreWaiters.clear();
126
+ return epoch;
127
+ }
128
+
129
+ function nextWorkspaceRestore(): Promise<WorkspaceRestoreEpoch> {
130
+ const current = currentWorkspaceRestore;
131
+ if (current?.active) return Promise.resolve(current);
132
+ return new Promise((resolve) => workspaceRestoreWaiters.add(resolve));
133
+ }
134
+
135
+ /** URL presentation waits for local convenience state so the explicit link wins. */
136
+ export async function waitForWorkspaceStateRestore(): Promise<void> {
137
+ // The workspace installs persistence when it mounts. A generation gate,
138
+ // rather than an elapsed-time poll, makes a remount deterministic: a waiter
139
+ // that observes a disposed epoch follows the next install, and a newer epoch
140
+ // that appeared while it awaited is also joined. This is what prevents URL
141
+ // presentation from racing a stale generation on a fast reload.
142
+ for (;;) {
143
+ const epoch = await nextWorkspaceRestore();
144
+ await epoch.promise;
145
+ if (currentWorkspaceRestore === epoch && epoch.active) return;
146
+ }
147
+ }
148
+
149
+ /**
150
+ * THE SHAPE of the record this module writes, as ONE number. A record whose
151
+ * `version` is not exactly this is read as absent: the project opens on its
152
+ * default document and the next write-through replaces it. An open set is
153
+ * convenience state, so a shape change memory-holes it — no migration, no
154
+ * dual-read, no compat branch (ARCHITECTURE-CORE §Removal doctrine, §Editor
155
+ * chrome "memory-holed, never migrated").
156
+ *
157
+ * The shape this number names: `{ version, workspace?, documents?: { open:
158
+ * { kind, id, state }[], activeId, kinds? } }`. Change any
159
+ * of it — a key's name, a nesting, what a value means — and bump this in the
160
+ * same commit, because nothing else lets the reader tell a stale record from a
161
+ * current one.
162
+ */
163
+ const WORKSPACE_STATE_VERSION = 15;
164
+ const WRITE_DEBOUNCE_MS = 300;
165
+ /** Bound on the document-restore verification before write-through installs
166
+ * anyway (module header's "wait is BOUNDED" rule). */
167
+ const RESTORE_TIMEOUT_MS = 10_000;
168
+
169
+ /**
170
+ * One persisted, restorable document: the KIND that owns it, its id, and that
171
+ * kind's own opaque blob. This module never looks inside `state`.
172
+ */
173
+ export interface PersistedDocument {
174
+ readonly kind: string;
175
+ readonly id: string;
176
+ readonly state: unknown;
177
+ }
178
+
179
+ /** The section of the project-local document this module owns. */
180
+ const WORKSPACE_SECTION = 'workspace';
181
+
182
+ export interface PersistedWorkspaceState {
183
+ /** {@link WORKSPACE_STATE_VERSION} as of the write. Any other value — including
184
+ * a record written before this field existed — is read as no record at all. */
185
+ readonly version: number;
186
+ // A `chat` field lived here until phase 1 unit 21 — one optional static
187
+ // panel's collapsed/surface choice, which made this module import
188
+ // `harness-chat-layout.ts` by name to save it. A static panel's OWNER keeps
189
+ // its own state now, in its own section of the same project-local document
190
+ // (`project-local-state.ts`), and the host persists only the workspace.
191
+ /** The active NAMED WORKSPACE, restored BEFORE layout restore: it selects
192
+ * which `workspaces` entry the layout restore reads. */
193
+ readonly workspace?: EditorWorkspaceId;
194
+ readonly documents?: {
195
+ open: PersistedDocument[];
196
+ activeId: string | null;
197
+ /** Per-KIND session state (`persistKindState`) — what belongs to a kind
198
+ * rather than to one open document, such as a discovery baseline that
199
+ * must survive a full reload. One cell per kind, opaque here. */
200
+ kinds?: Record<string, unknown>;
201
+ };
202
+ }
203
+
204
+ /** This project's persisted workspace state — the `workspace` section of the
205
+ * project-local document (`project-local-state.ts`), or `null` when the
206
+ * project has never arranged anything AND when what it arranged was written in
207
+ * another shape ({@link WORKSPACE_STATE_VERSION}). Exported for tests. */
208
+ export function readPersistedWorkspaceState(): PersistedWorkspaceState | null {
209
+ const section = projectLocalSection<PersistedWorkspaceState>(WORKSPACE_SECTION);
210
+ if (!section || section.version !== WORKSPACE_STATE_VERSION) return null;
211
+ return section;
212
+ }
213
+
214
+ function writePersistedWorkspaceState(state: PersistedWorkspaceState): void {
215
+ writeProjectLocalSection(WORKSPACE_SECTION, state);
216
+ }
217
+
218
+ /**
219
+ * Serialize the restorable half of one open document through the kind's own
220
+ * `persist` door, or `null` when this document does not persist. A throwing
221
+ * contribution is treated as "does not persist" — the shell must never crash
222
+ * on one. Exported for tests.
223
+ */
224
+ export function persistableDocument(doc: OpenWorkspaceDocument): PersistedDocument | null {
225
+ const { descriptor } = doc;
226
+ if (!descriptor.persist) return null;
227
+ let state: unknown;
228
+ try {
229
+ state = descriptor.persist({ id: descriptor.id, title: doc.title });
230
+ } catch {
231
+ return null;
232
+ }
233
+ if (state === undefined || state === null) return null;
234
+ return { kind: descriptor.kind, id: descriptor.id, state };
235
+ }
236
+
237
+ /** Every registered kind's own session state, keyed by kind. Two restorers
238
+ * sharing one kind share the cell, in registration order — a kind is one
239
+ * subject, so its session state is one value. */
240
+ function persistedKindStates(): Record<string, unknown> | undefined {
241
+ const states: Record<string, unknown> = {};
242
+ let any = false;
243
+ for (const restorer of workspaceDocumentRestorerEntries()) {
244
+ if (!restorer.persistKindState) continue;
245
+ let value: unknown;
246
+ try {
247
+ value = restorer.persistKindState();
248
+ } catch {
249
+ continue;
250
+ }
251
+ if (value === undefined || value === null) continue;
252
+ states[restorer.kind] = value;
253
+ any = true;
254
+ }
255
+ return any ? states : undefined;
256
+ }
257
+
258
+ /**
259
+ * Snapshot the CURRENT session state: which named workspace is active, which
260
+ * documents are open, which one is in front, and each kind's own session cell.
261
+ *
262
+ * NO GEOMETRY. Where each document is DRAWN is the workbench's editor-group
263
+ * state, which VS Code persists itself; this module records only the SET, and
264
+ * that is what makes a reload reopen the same documents in whatever grid the
265
+ * workbench restored.
266
+ */
267
+ export function snapshotWorkspaceState(): PersistedWorkspaceState {
268
+ const open: PersistedDocument[] = [];
269
+ for (const doc of openWorkspaceDocuments()) {
270
+ const persisted = persistableDocument(doc);
271
+ if (persisted) open.push(persisted);
272
+ }
273
+ const kinds = persistedKindStates();
274
+ return {
275
+ version: WORKSPACE_STATE_VERSION,
276
+ workspace: activeEditorWorkspace(),
277
+ documents: {
278
+ open,
279
+ activeId: activeWorkspaceDocumentId(),
280
+ ...(kinds ? { kinds } : {}),
281
+ },
282
+ };
283
+ }
284
+
285
+ /**
286
+ * Reopen ONE persisted document through its kind's registered restorers, in
287
+ * registration order, until one answers that it could. Returns whether any
288
+ * CLAIMED it — a claim is not the same as being open, because a kind may
289
+ * reopen asynchronously (it activates itself in that case; see
290
+ * `WorkspaceDocumentRestoreContext.active`).
291
+ *
292
+ * An unknown kind has no restorers and is dropped silently, which is also
293
+ * what a record written before this shape existed gets.
294
+ */
295
+ async function restoreOneDocument(
296
+ store: WorkspaceStateStore,
297
+ doc: PersistedDocument,
298
+ activeId: string | null,
299
+ ): Promise<boolean> {
300
+ for (const restorer of workspaceDocumentRestorers(doc.kind)) {
301
+ try {
302
+ const claimed = await restorer.restore({
303
+ id: doc.id,
304
+ state: doc.state,
305
+ active: doc.id === activeId,
306
+ store,
307
+ });
308
+ if (claimed) return true;
309
+ } catch {
310
+ // Drop silently — a document that cannot truthfully reopen is gone.
311
+ }
312
+ }
313
+ return false;
314
+ }
315
+
316
+ /** Restore an active id now, or hand a stable async board id to the document
317
+ * registry so its later project-owned registration completes the request. */
318
+ function restoreActiveDocument(id: string | null): boolean {
319
+ if (!id) return false;
320
+ if (openAvailableWorkspaceDocument(id)) return true;
321
+ if (PINNED_ASYNC_DOCUMENT_IDS.has(id)) {
322
+ requestAvailableWorkspaceDocument(id);
323
+ restorePinnedWorkspaceDocumentActivation(id);
324
+ return true;
325
+ }
326
+ return activateWorkspaceDocument(id);
327
+ }
328
+
329
+ /** Tell every registered kind the session is beginning, with its own session
330
+ * state and whether there is any persisted document to bring back. A throwing
331
+ * contribution must never take the workspace down with it. */
332
+ function beginKindRestores(
333
+ store: WorkspaceStateStore,
334
+ docs: PersistedWorkspaceState['documents'],
335
+ ): void {
336
+ const kinds = docs?.kinds ?? {};
337
+ // NOT `docs !== undefined`. A record that lists NO open document is the same
338
+ // fact as no record at all for every kind that reads this: nothing is coming
339
+ // back, so the project's own default document is what the workspace opens on
340
+ // (see `WorkspaceDocumentKindRestoreContext.hasDocumentsToRestore`).
341
+ const hasDocumentsToRestore = (docs?.open.length ?? 0) > 0;
342
+ for (const restorer of workspaceDocumentRestorerEntries()) {
343
+ if (!restorer.beginRestore) continue;
344
+ try {
345
+ restorer.beginRestore({ state: kinds[restorer.kind], hasDocumentsToRestore, store });
346
+ } catch {
347
+ // Same failure physics as every other contribution call here.
348
+ }
349
+ }
350
+ }
351
+
352
+ /** Settle the sources every present kind verifies against, ONCE — deduped by
353
+ * function identity, so two kinds reading one registry refresh it once (a
354
+ * second concurrent refresh would abort the first). */
355
+ function settleKindSources(open: readonly PersistedDocument[]): Promise<unknown> {
356
+ const prepares = new Set<() => Promise<void>>();
357
+ for (const doc of open) {
358
+ for (const restorer of workspaceDocumentRestorers(doc.kind)) {
359
+ if (restorer.prepare) prepares.add(restorer.prepare);
360
+ }
361
+ }
362
+ return Promise.all([...prepares].map((prepare) => prepare().catch(() => {})));
363
+ }
364
+
365
+ /**
366
+ * Restore the persisted open documents + active document (exported for
367
+ * tests). Every registered kind first hears the session begin — with its own
368
+ * session state and whether this project has a record at all — then the kinds
369
+ * actually present settle their sources ONCE (`prepare`, deduped by function
370
+ * identity so two kinds reading one registry refresh it once), and finally
371
+ * each document reopens in the original tab order against a settled store.
372
+ */
373
+ export async function restoreWorkspaceDocuments(
374
+ store: WorkspaceStateStore,
375
+ persisted: PersistedWorkspaceState | null,
376
+ ): Promise<void> {
377
+ const docs = persisted?.documents;
378
+ beginKindRestores(store, docs);
379
+ if (!docs || docs.open.length === 0) {
380
+ // Project-owned pinned boards register after async authoring bootstrap.
381
+ // Preserve their requested activation until that stable descriptor opens;
382
+ // arbitrary missing ids still reject rather than becoming latent state.
383
+ restoreActiveDocument(docs?.activeId ?? null);
384
+ return;
385
+ }
386
+ await settleKindSources(docs.open);
387
+ for (const doc of docs.open) {
388
+ await restoreOneDocument(store, doc, docs.activeId);
389
+ }
390
+ // Restore the saved active tab when available. Otherwise retain the
391
+ // registry's selection from opening the surviving documents (or no active
392
+ // document when none opened). A restorer that claimed the active document
393
+ // asynchronously activates it when ready; no particular document is required.
394
+ restoreActiveDocument(docs.activeId);
395
+ }
396
+
397
+ /**
398
+ * Install workspace-state persistence for this session:
399
+ * 1. apply the named workspace the project was left in;
400
+ * 2. restore its open documents (async, verified - module header rules);
401
+ * 3. subscribe write-through (debounced 300ms, flushed on pagehide).
402
+ * Returns a teardown (unsubscribes; flushes a pending write).
403
+ */
404
+ export function installWorkspaceStatePersistence(store: WorkspaceStateStore): () => void {
405
+ // The project-local document is loaded when the project became active; on a
406
+ // boot where the workspace mounts first, the restore epoch published here
407
+ // spans the load, so `waitForWorkspaceStateRestore` still waits for what is
408
+ // actually on disk.
409
+ if (!projectLocalStateReady() || (getCurrentProject() && !projectAdapterFacet())) {
410
+ let disposed = false;
411
+ let inner: (() => void) | null = null;
412
+ let settle: () => void = () => {};
413
+ const gate = new Promise<void>((resolve) => {
414
+ settle = resolve;
415
+ });
416
+ const epoch = publishWorkspaceRestore(gate);
417
+ void Promise.all([preloadProjectLocalState(), waitForProjectAdapter()]).then(() => {
418
+ if (disposed) {
419
+ settle();
420
+ return;
421
+ }
422
+ inner = installWorkspaceStatePersistence(store);
423
+ // The inner install published its own epoch; this outer one steps
424
+ // aside and settles once that one does.
425
+ epoch.active = false;
426
+ void waitForWorkspaceStateRestore().finally(settle);
427
+ });
428
+ return () => {
429
+ disposed = true;
430
+ inner?.();
431
+ };
432
+ }
433
+ const persisted = readPersistedWorkspaceState();
434
+ // The named workspace is applied FIRST: it decides which documents the
435
+ // workspace's own areas open beside the restored set. This is one of the
436
+ // explicit acts allowed to move the workspace (module header of
437
+ // `workspace-presets.ts`) - restoring the session boundary the user left.
438
+ if (
439
+ persisted?.workspace &&
440
+ isEditorWorkspaceId(persisted.workspace) &&
441
+ workspaceApplies(persisted.workspace)
442
+ ) {
443
+ setEditorWorkspace(persisted.workspace);
444
+ } else {
445
+ // Nothing recorded for THIS checkout (or a record its shape no longer
446
+ // meets): the project's `editor.workspace` in `vgai.adapter.ts`,
447
+ // else the first workspace its shape meets.
448
+ setEditorWorkspace(defaultEditorWorkspace(), { provisional: true });
449
+ }
450
+
451
+ let disposed = false;
452
+ let timer: ReturnType<typeof setTimeout> | null = null;
453
+ const unsubscribers: Array<() => void> = [];
454
+
455
+ const flush = () => {
456
+ if (timer !== null) {
457
+ clearTimeout(timer);
458
+ timer = null;
459
+ }
460
+ // Immersive play-mode chrome hide (`live-transition.ts`) suppresses writes
461
+ // for that play session - a play-time open set is transient presentation,
462
+ // never user intent. The gate also covers the pagehide flush and the
463
+ // teardown flush below. Belt-and-suspenders: also refuse while the store
464
+ // reports play active, so a transient rebuild that desynchronizes the
465
+ // suppression flag mid-play still cannot persist it.
466
+ if (
467
+ isWorkspacePersistenceSuppressed() ||
468
+ (store.playState !== undefined && store.playState !== 'stopped')
469
+ )
470
+ return;
471
+ writePersistedWorkspaceState(snapshotWorkspaceState());
472
+ };
473
+ const schedule = () => {
474
+ if (timer !== null) clearTimeout(timer);
475
+ timer = setTimeout(flush, WRITE_DEBOUNCE_MS);
476
+ };
477
+ const onPageHide = () => flush();
478
+
479
+ // Subscriptions install only after restore settles (module header: a
480
+ // half-restored open-set must never overwrite the stored one). A teardown
481
+ // racing the restore is honored via `disposed`. Bounded by
482
+ // `RESTORE_TIMEOUT_MS`: a hung verification fetch (a stalled asset-existence
483
+ // probe, a network partition on a kind's own `prepare` refresh) must never
484
+ // leave the WHOLE session with no write-through and no pagehide flush -
485
+ // open-tab state is convenience state, availability beats completeness.
486
+ // Whichever settles first wins; if the restore is still running when the
487
+ // timeout fires, its later document-opens still land normally.
488
+ let restoreTimer: ReturnType<typeof setTimeout> | null = null;
489
+ // A share URL is explicit presentation intent: do not reopen locally
490
+ // persisted subjects that could race and overwrite it.
491
+ const hasSharedView =
492
+ typeof window !== 'undefined' && editorViewFromUrl(window.location.href) !== null;
493
+ // A checkout with no record at all still goes through the documents
494
+ // restore: that is where a never-recorded project opens on its default
495
+ // document.
496
+ // THE CONTRIBUTION PASS IS NOT PART OF THE VERIFICATION BOUND. A package
497
+ // owns its documents' restorers as well as their code, so the kinds a
498
+ // record names exist only once contributions have loaded - but that load is
499
+ // a known startup cost (measured 9s on a cold `full` scaffold), not the
500
+ // hung fetch `RESTORE_TIMEOUT_MS` guards against. Counting it against that
501
+ // bound made the bound fire on EVERY boot, which is a mis-set bound rather
502
+ // than a safety net. So: load first, then start the clock.
503
+ const contributionsLoaded =
504
+ hasSharedView || !(persisted?.documents?.open.length ?? 0)
505
+ ? Promise.resolve()
506
+ : refreshProjectToolContributions().catch(() => {});
507
+ const restoreSettled = contributionsLoaded
508
+ .then(() => (hasSharedView ? undefined : restoreWorkspaceDocuments(store, persisted)))
509
+ .catch(() => {});
510
+ const restoreTimedOut = new Promise<void>((resolve) => {
511
+ void contributionsLoaded.then(() => {
512
+ if (disposed) return;
513
+ restoreTimer = setTimeout(() => {
514
+ resolve();
515
+ }, RESTORE_TIMEOUT_MS);
516
+ });
517
+ });
518
+ const restorePromise = Promise.race([restoreSettled, restoreTimedOut]).then(() => {
519
+ if (restoreTimer !== null) clearTimeout(restoreTimer);
520
+ if (disposed) return;
521
+ unsubscribers.push(subscribeWorkspaceDocuments(schedule));
522
+ window.addEventListener('pagehide', onPageHide);
523
+ });
524
+ const restoreEpoch = publishWorkspaceRestore(restorePromise);
525
+ void restorePromise;
526
+
527
+ return () => {
528
+ disposed = true;
529
+ restoreEpoch.active = false;
530
+ if (currentWorkspaceRestore === restoreEpoch) currentWorkspaceRestore = null;
531
+ if (restoreTimer !== null) clearTimeout(restoreTimer);
532
+ for (const unsub of unsubscribers) unsub();
533
+ window.removeEventListener('pagehide', onPageHide);
534
+ if (timer !== null) flush();
535
+ };
536
+ }
@@ -0,0 +1,73 @@
1
+ import type { EditorRegionName, WorkspacePanelGlyphName } from '@volter/editor-sdk/widgets';
2
+
3
+ /** Stable, geometry-free inventory of the editor's built-in persistent panels.
4
+ *
5
+ * `region` is a panel's claim on an EDITOR-AREA fill (`EditorTheme.color.region`
6
+ * carries the measurement): the dock paints the group showing this panel with
7
+ * that region's colour instead of the one fill every group shares. A panel
8
+ * that claims none is painted exactly as before the claim existed, which is
9
+ * every panel no reference frame shows painted differently.
10
+ *
11
+ * `icon` is the panel's own glyph, drawn in Blender's EDITOR-TYPE WELL — the
12
+ * 32x20 box every area begins with under `groupTabs: 'well'`
13
+ * (`workspace-regions.ts`). The NAME is declared here and the drawing lives
14
+ * in the editor's icon registry (`components/primitives/editor-icons.ts`), which also records which two of these are
15
+ * Blender's own measured marks and which five are ours because no reference
16
+ * frame photographs that editor. The field is optional so a host may add a
17
+ * panel without one; every panel below declares one, so the well's
18
+ * glyph-less branch does not fire in this editor. */
19
+ export const WORKSPACE_STATIC_PANELS = [
20
+ {
21
+ kind: 'agent',
22
+ title: 'Conversations',
23
+ hotkeyScope: 'workspace',
24
+ selectableText: true,
25
+ icon: 'users',
26
+ },
27
+ {
28
+ kind: 'project-work',
29
+ title: 'Project work',
30
+ hotkeyScope: 'workspace',
31
+ selectableText: true,
32
+ icon: 'list',
33
+ },
34
+ {
35
+ kind: 'hierarchy',
36
+ title: 'Hierarchy',
37
+ hotkeyScope: 'hierarchy',
38
+ selectableText: false,
39
+ region: 'outliner',
40
+ icon: 'outliner',
41
+ },
42
+ {
43
+ kind: 'assets',
44
+ title: 'Content',
45
+ hotkeyScope: 'asset-browser',
46
+ selectableText: false,
47
+ icon: 'folder-open',
48
+ },
49
+ {
50
+ kind: 'asset-library',
51
+ title: 'Asset Library',
52
+ hotkeyScope: 'asset-browser',
53
+ selectableText: false,
54
+ icon: 'cubes-stacked',
55
+ },
56
+ {
57
+ kind: 'inspector',
58
+ title: 'Inspector',
59
+ hotkeyScope: 'inspector',
60
+ selectableText: false,
61
+ region: 'properties',
62
+ icon: 'properties',
63
+ },
64
+ ] as const satisfies ReadonlyArray<{
65
+ readonly kind: string;
66
+ readonly title: string;
67
+ readonly hotkeyScope: string;
68
+ readonly selectableText: boolean;
69
+ readonly region?: EditorRegionName;
70
+ readonly icon?: WorkspacePanelGlyphName;
71
+ }>;
72
+
73
+ export type WorkspaceStaticPanelKind = (typeof WORKSPACE_STATIC_PANELS)[number]['kind'];