@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,195 @@
1
+ import type { AuthoringAdapter, EditorNode } from '@volter/editor-project/adapter';
2
+ import { setAuthoringSelection } from './consumer-actions';
3
+
4
+ /** Session-only contents scope shared by hierarchy, viewport picking, and
5
+ * hotkeys. The adapter remains the source of hierarchy/ownership truth; this
6
+ * module only records which semantic boundary the user has opened. */
7
+ interface SelectionScopeState {
8
+ adapter: AuthoringAdapter;
9
+ stack: string[];
10
+ }
11
+
12
+ let state: SelectionScopeState | null = null;
13
+ const listeners = new Set<() => void>();
14
+ let version = 0;
15
+
16
+ function emit(): void {
17
+ version += 1;
18
+ for (const listener of listeners) listener();
19
+ }
20
+
21
+ function isScopeNode(node: EditorNode | null): boolean {
22
+ return (
23
+ !!node && (node.role === 'component' || node.role === 'instance' || node.role === 'boundary')
24
+ );
25
+ }
26
+
27
+ function isDescendant(adapter: AuthoringAdapter, id: string, ancestorId: string): boolean {
28
+ let current: string | null = id;
29
+ let guard = 0;
30
+ while (current && guard++ < 1000) {
31
+ if (current === ancestorId) return true;
32
+ current = adapter.hierarchy.node(current)?.parentId ?? null;
33
+ }
34
+ return false;
35
+ }
36
+
37
+ export function subscribeSelectionScope(listener: () => void): () => void {
38
+ listeners.add(listener);
39
+ return () => listeners.delete(listener);
40
+ }
41
+
42
+ export function selectionScopeVersion(): number {
43
+ return version;
44
+ }
45
+
46
+ /** Current boundary id for pick resolution. Deliberately adapter-agnostic:
47
+ * layered picking resolves through a composite's child adapter while the
48
+ * hierarchy owns the composite adapter that opened the scope. */
49
+ export function currentSelectionScopeId(): string | null {
50
+ return state?.stack.at(-1) ?? null;
51
+ }
52
+
53
+ export function selectionScopeStack(adapter: AuthoringAdapter): string[] {
54
+ if (state?.adapter !== adapter) return [];
55
+ const valid = state.stack.filter((id) => adapter.hierarchy.node(id) !== null);
56
+ if (valid.length !== state.stack.length) {
57
+ state = valid.length > 0 ? { adapter, stack: valid } : null;
58
+ }
59
+ return valid;
60
+ }
61
+
62
+ export function enterSelectionScope(adapter: AuthoringAdapter, id: string): boolean {
63
+ const node = adapter.hierarchy.node(id);
64
+ if (!isScopeNode(node) || node!.childIds.length === 0) return false;
65
+
66
+ const current = state?.adapter === adapter ? state.stack : [];
67
+ const parentScope = current.at(-1);
68
+ if (parentScope && !isDescendant(adapter, id, parentScope)) return false;
69
+ if (parentScope === id) return false;
70
+ state = { adapter, stack: [...current, id] };
71
+ setAuthoringSelection(adapter, [id]);
72
+ emit();
73
+ return true;
74
+ }
75
+
76
+ /** Navigate to an existing breadcrumb boundary, or null for the full Game. */
77
+ export function setSelectionScope(adapter: AuthoringAdapter, id: string | null): void {
78
+ if (id === null) {
79
+ if (state === null) return;
80
+ state = null;
81
+ emit();
82
+ return;
83
+ }
84
+ const current = selectionScopeStack(adapter);
85
+ const index = current.indexOf(id);
86
+ if (index < 0) return;
87
+ state = { adapter, stack: current.slice(0, index + 1) };
88
+ setAuthoringSelection(adapter, [id]);
89
+ emit();
90
+ }
91
+
92
+ export function exitSelectionScope(adapter: AuthoringAdapter): boolean {
93
+ if (state && state.adapter !== adapter) {
94
+ state = null;
95
+ emit();
96
+ return true;
97
+ }
98
+ const current = selectionScopeStack(adapter);
99
+ if (current.length === 0) return false;
100
+ const next = current.slice(0, -1);
101
+ state = next.length > 0 ? { adapter, stack: next } : null;
102
+ const selectionId = next.at(-1) ?? current[0]!;
103
+ setAuthoringSelection(adapter, [selectionId]);
104
+ emit();
105
+ return true;
106
+ }
107
+
108
+ export function enterSelectedScope(adapter: AuthoringAdapter): boolean {
109
+ const selected = adapter.selection?.get() ?? [];
110
+ return selected.length === 1 ? enterSelectionScope(adapter, selected[0]!) : false;
111
+ }
112
+
113
+ /**
114
+ * Drill in ONE level (the viewport's double-click, Figma's own gesture): open
115
+ * `boundaryId`'s scope, then select whatever the SAME pointer resolves to now
116
+ * that the scope is open.
117
+ *
118
+ * `repick` is the caller's own pick — `layered-pick.ts` already passes
119
+ * `currentSelectionScopeId()` into `SelectionProvider.resolve`, and the
120
+ * adapter's resolve already answers with the next member down its own owner
121
+ * chain. So there is no second chain-walking rule here, and this module still
122
+ * knows nothing about how a surface picks. Repeat the gesture to keep
123
+ * descending; {@link exitSelectionScope} (Escape) walks back out.
124
+ */
125
+ export function drillIntoSelectionScope(
126
+ adapter: AuthoringAdapter,
127
+ boundaryId: string,
128
+ repick: () => string | null,
129
+ ): boolean {
130
+ if (!enterSelectionScope(adapter, boundaryId)) return false;
131
+ // `enterSelectionScope` already selected the boundary; a deeper member under
132
+ // the same pointer is what the gesture actually asked for. When the chain
133
+ // ends here the boundary stays selected — entering was still correct.
134
+ const deeper = repick();
135
+ if (deeper && deeper !== boundaryId) setAuthoringSelection(adapter, [deeper]);
136
+ return true;
137
+ }
138
+
139
+ /**
140
+ * Figma's outside-click rule: a click that lands outside an open scope leaves
141
+ * it. Pops every entry whose boundary does not CONTAIN `id`, so the stack
142
+ * follows the click to the level that does; a `null` id (empty space) closes
143
+ * every scope.
144
+ *
145
+ * Selection stays the caller's to set — the pick that produced `id` was
146
+ * already resolved against the scope that was open (a chain without the scope
147
+ * in it resolves to its own outermost owner), so this only makes the stack
148
+ * agree with where the click landed.
149
+ */
150
+ export function popSelectionScopesToContain(adapter: AuthoringAdapter, id: string | null): boolean {
151
+ const current = selectionScopeStack(adapter);
152
+ if (current.length === 0) return false;
153
+ let depth = 0;
154
+ while (id !== null && depth < current.length && isDescendant(adapter, id, current[depth]!)) {
155
+ depth += 1;
156
+ }
157
+ if (depth === current.length) return false;
158
+ state = depth > 0 ? { adapter, stack: current.slice(0, depth) } : null;
159
+ emit();
160
+ return true;
161
+ }
162
+
163
+ /**
164
+ * ONE click's answer, across the scope exit the click itself causes — the
165
+ * whole of the viewport's single-click resolution.
166
+ *
167
+ * A pick resolves against whatever scope is OPEN (`layered-pick.ts` hands
168
+ * `currentSelectionScopeId()` to the adapter's own resolve), so a click that
169
+ * leaves the innermost scope was resolved by a scope that is about to be
170
+ * wrong. With a one-deep stack that is invisible — popping lands at "no
171
+ * scope", which is what the stale answer already assumed. With a stack THREE
172
+ * deep it is visible: the stale resolve answers with the chain's outermost
173
+ * owner, one level shallower than the same click gives once the stack has
174
+ * followed it, so the user has to click twice to land where one click should
175
+ * have (reviewer, #1235).
176
+ *
177
+ * So: resolve, let {@link popSelectionScopesToContain} follow the hit, and
178
+ * re-resolve ONCE — only when the stack actually moved, because a click that
179
+ * stays inside the open scope has nothing to re-resolve against. The second
180
+ * answer needs no second pop: it is a member of the scope the first pop
181
+ * settled on.
182
+ */
183
+ export function pickAcrossScopeExit(
184
+ adapter: AuthoringAdapter,
185
+ repick: () => string | null,
186
+ ): string | null {
187
+ const hit = repick();
188
+ return popSelectionScopesToContain(adapter, hit) ? repick() : hit;
189
+ }
190
+
191
+ /** Test-only reset; production scope is intentionally session-local. */
192
+ export function _resetSelectionScopeForTest(): void {
193
+ state = null;
194
+ emit();
195
+ }
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Format-neutral shell document operations.
3
+ *
4
+ * Save destination, save state, hierarchy rows and select-all are questions
5
+ * about a DOCUMENT, and the shell owns none. Answering them from store fields
6
+ * would bind the shell chrome — status bar, application menus, command relay,
7
+ * hotkeys — to one format; these helpers ask the ACTIVE
8
+ * {@link AuthoringAdapter} instead, so the same chrome works for a TSX/R3F
9
+ * world, a React root, and an ingested game alike.
10
+ */
11
+
12
+ import type { AuthoringAdapter, NodeCreationSite, WriteAnchorKind } from '@volter/editor-project/adapter';
13
+ import type { EditorShellStore } from '../editor-shell-store';
14
+ import { forEachHierarchyNode } from '../hierarchy-walk';
15
+ import { getActiveAuthoring } from './active-adapter';
16
+ import { saveAuthoringDocument, setAuthoringSelection } from './consumer-actions';
17
+ import { resolvePanelAuthoring } from './panel-authoring';
18
+
19
+ /** The authoring adapter owned by the active center document. This is the same
20
+ * resolution used by Hierarchy and Inspector; shell commands must not keep
21
+ * driving the scene adapter after an asset/source document becomes active. */
22
+ export function activeDocumentAuthoring(store: EditorShellStore): AuthoringAdapter {
23
+ return resolvePanelAuthoring(store).adapter;
24
+ }
25
+
26
+ /** One flattened hierarchy row — the wire shape `editor.hierarchy.inspect` reports. */
27
+ export interface ShellHierarchyRow {
28
+ id: string;
29
+ name: string;
30
+ childIds: string[];
31
+ }
32
+
33
+ /**
34
+ * The active adapter's hierarchy, flattened breadth-first to id/name/childIds
35
+ * rows. `[]` when the adapter owns no tree (the no-authoring floor).
36
+ */
37
+ export function activeHierarchyRows(store: EditorShellStore): ShellHierarchyRow[] {
38
+ const rows: ShellHierarchyRow[] = [];
39
+ forEachHierarchyNode(activeDocumentAuthoring(store).hierarchy, (node) => {
40
+ rows.push({ id: node.id, name: node.label, childIds: [...node.childIds] });
41
+ });
42
+ return rows;
43
+ }
44
+
45
+ /**
46
+ * The source path represented by an adapter's document node.
47
+ *
48
+ * Source-authored adapters persist edits immediately and intentionally expose
49
+ * no PersistenceProvider. Their hierarchy still owns an honest document node
50
+ * whose secondary label is the project-relative source path (`src/world.tsx`,
51
+ * for example). Prefer that source identity for document chrome instead of
52
+ * leaking a composite persistence fallback such as "(no persistable child)".
53
+ */
54
+ export function authoringDocumentSourcePath(adapter: AuthoringAdapter): string | null {
55
+ let found: string | null = null;
56
+ forEachHierarchyNode(adapter.hierarchy, (node) => {
57
+ const sourcePath = node.secondaryLabel?.trim();
58
+ if (node.role !== 'document' || !sourcePath) return;
59
+ found = sourcePath;
60
+ return false; // the first document row answers; never walk the whole tree for it
61
+ });
62
+ return found;
63
+ }
64
+
65
+ /** The active source-authored document path, when its adapter exposes one. */
66
+ export function activeDocumentSourcePath(store: EditorShellStore): string | null {
67
+ return authoringDocumentSourcePath(getActiveAuthoring(store));
68
+ }
69
+
70
+ /** The exact source filename represented by a project-relative path. */
71
+ export function sourceFileName(sourcePath: string | null | undefined): string | null {
72
+ const trimmed = sourcePath?.trim();
73
+ if (!trimmed) return null;
74
+ return trimmed.split(/[\\/]/).filter(Boolean).at(-1) ?? null;
75
+ }
76
+
77
+ /**
78
+ * Where a save would land, straight from the active adapter's
79
+ * `PersistenceProvider`, or `null` when this adapter persists nothing.
80
+ */
81
+ export function activeSaveDestination(store: EditorShellStore): string | null {
82
+ const adapter = getActiveAuthoring(store);
83
+ return adapter.capabilities.persist ? (adapter.persistence?.destination ?? null) : null;
84
+ }
85
+
86
+ /**
87
+ * Whether the active adapter has unsaved edits.
88
+ *
89
+ * A source-backed adapter may be clean because it rolled a failed write back.
90
+ * Its provider still reports that failure until a later successful write
91
+ * clears the project-history error; clean and successful are not synonyms.
92
+ */
93
+ export function activeSaveState(store: EditorShellStore): 'saved' | 'unsaved' | 'failed' {
94
+ const persistence = getActiveAuthoring(store).persistence;
95
+ if (persistence?.lastError?.()) return 'failed';
96
+ return persistence?.isDirty() ? 'unsaved' : 'saved';
97
+ }
98
+
99
+ /** The active adapter's human-readable persistence failure, when any. */
100
+ export function activeSaveFailure(store: EditorShellStore): string | null {
101
+ return getActiveAuthoring(store).persistence?.lastError?.() ?? null;
102
+ }
103
+
104
+ /**
105
+ * The creation-site anchor for the CURRENT selection, as the control
106
+ * API reports it (`vgai status` / `vgai eval`'s `editor.status()`).
107
+ *
108
+ * `null` has one meaning and one only: there is nothing to ask about — no
109
+ * selection, or an active adapter that indexes no creation sites. Whenever the
110
+ * adapter DOES index them the answer is a record, anchored or reasoned; a
111
+ * silent blank for "we couldn't find it" is exactly what the honest-floor rule
112
+ * forbids.
113
+ */
114
+ export function activeSelectionCreationSite(store: EditorShellStore): NodeCreationSite | null {
115
+ const adapter = activeDocumentAuthoring(store);
116
+ const id = adapter.selection?.get()[0] ?? null;
117
+ if (!id) return null;
118
+ return adapter.truth?.resolve(id, 'position').site ?? null;
119
+ }
120
+
121
+ /**
122
+ * The WRITE-side sibling of {@link activeSelectionCreationSite}: which lane
123
+ * would carry an edit to the current selection (`WriteAnchorKind`).
124
+ *
125
+ * Reported beside the anchor because the anchor alone cannot answer it — two
126
+ * subjects at the same kind of `file:line` can belong to different lanes with
127
+ * different correctness contracts. A caller sweeping the hierarchy for one
128
+ * subject per lane reads this per row; `vgai doctor`'s edit-write walk is that
129
+ * caller, and it is what makes the walk exhaustive over the kinds a world has
130
+ * instead of stopping at whichever row answered first.
131
+ *
132
+ * `null` on the same terms as the anchor: nothing selected, or an adapter that
133
+ * plans no distinguishable lanes.
134
+ *
135
+ * READ THROUGH THE SAME BINDING THE WRITE TAKES ({@link activeDocumentAuthoring},
136
+ * which is what `setActiveInspectionField` resolves too). A classifier reached
137
+ * through a different resolver than the writer is how a subject came to be
138
+ * reported in one lane while its edit travelled another.
139
+ */
140
+ export function activeSelectionWriteAnchorKind(store: EditorShellStore): WriteAnchorKind | null {
141
+ const adapter = activeDocumentAuthoring(store);
142
+ const id = adapter.selection?.get()[0] ?? null;
143
+ if (!id) return null;
144
+ return adapter.truth?.resolve(id, 'position').writeAnchorKind ?? null;
145
+ }
146
+
147
+ /** Current document-local selection, shared by UI actions and the control API. */
148
+ export function activeSelectionIds(store: EditorShellStore): string[] {
149
+ return [...(activeDocumentAuthoring(store).selection?.get() ?? store.selectedEntityIds)];
150
+ }
151
+
152
+ /** Route selection through the active document's native adapter. */
153
+ export function selectAuthoringNodes(store: EditorShellStore, ids: readonly string[]): void {
154
+ const adapter = activeDocumentAuthoring(store);
155
+ if (!setAuthoringSelection(adapter, ids)) store.selectMultiple([...ids]);
156
+ }
157
+
158
+ /** Select every node the active adapter's hierarchy exposes. */
159
+ export function selectAllAuthoringNodes(store: EditorShellStore): void {
160
+ selectAuthoringNodes(
161
+ store,
162
+ activeHierarchyRows(store).map((row) => row.id),
163
+ );
164
+ }
165
+
166
+ /** Save through the active adapter's persistence provider (no-op when it has none). */
167
+ export async function saveActiveAuthoring(store: EditorShellStore): Promise<void> {
168
+ await saveAuthoringDocument(getActiveAuthoring(store), 'the shell saved the active document');
169
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * THE SHELL'S ANSWERS to `Object3DDocumentWritePolicy` — the composition the
3
+ * editor installs at boot (`EditorContext.tsx`'s `EditorProvider`).
4
+ *
5
+ * `openPersistence` and `replaceSource` are one-line delegations to the
6
+ * modules that already owned them. `saveThumbnailFraming` moved here WHOLE
7
+ * from `components/Object3DDocumentToolbar.tsx` (nothing about it changed) —
8
+ * merging `.vgai/thumbnails.json` is transport work end to end: read the
9
+ * project's manifest, refuse an unreadable one, write the merged bytes back
10
+ * through the project-file route.
11
+ *
12
+ * The point of the seam is only that the Asset Lab 3D document and its
13
+ * toolbar no longer import the server SDK barrel, the project file history,
14
+ * or the storage backend (ARCHITECTURE-CORE §Editor chrome, "the viewport
15
+ * stack is separable").
16
+ *
17
+ * This file is the shell side of that boundary and is free to import all of
18
+ * them.
19
+ */
20
+
21
+ import {
22
+ loadProjectThumbnailManifest,
23
+ resetProjectThumbnailManifestCache,
24
+ THUMBNAIL_MANIFEST_PATH,
25
+ THUMBNAIL_PROFILE,
26
+ } from '../asset-workflow/thumbnail-system';
27
+ import { workspaceHistoryService } from '../components/workspace-history';
28
+ import { projectFiles } from '../files/project-files';
29
+ import { getProjectFileHistory } from '../history/project-file-history';
30
+ import { getProjectResourceHistoryBackend } from '../history/project-root-history-backends';
31
+ import { replaceProjectSource } from '../history/source-history-backend';
32
+ import type {
33
+ Object3DDocumentThumbnailFraming,
34
+ Object3DDocumentWritePolicy,
35
+ } from '../object3d-document-write-policy';
36
+ import { sourceWriteBackendIfPrimed } from '../ui-source/tier-source-write-backend';
37
+ import { openObject3DDocumentPersistence } from './object3d-document-persistence';
38
+
39
+ async function persistThumbnailFraming(
40
+ assetPath: string,
41
+ framing: Object3DDocumentThumbnailFraming | undefined,
42
+ ): Promise<void> {
43
+ const read = await loadProjectThumbnailManifest();
44
+ // REFUSE rather than rebuild. `absent` and `unreadable` used to arrive as the
45
+ // same `null`, so a manifest that merely failed to parse was treated as "no
46
+ // manifest yet" and the write below replaced every framing entry in the
47
+ // project with `{}`.
48
+ if (read.status === 'unreadable') {
49
+ throw new Error(
50
+ `${THUMBNAIL_MANIFEST_PATH} is present but could not be read (${read.reason}). ` +
51
+ 'Refusing to overwrite it — fix or delete the file, then try again.',
52
+ );
53
+ }
54
+ const manifest =
55
+ read.status === 'ok'
56
+ ? read.manifest
57
+ : {
58
+ version: 1 as const,
59
+ profile: THUMBNAIL_PROFILE.version,
60
+ generatedAt: new Date().toISOString(),
61
+ entries: {},
62
+ };
63
+ const key = assetPath.replace(/^\/+/, '');
64
+ const prior = manifest.entries[key] ?? {
65
+ state: 'fallback' as const,
66
+ profileVersion: THUMBNAIL_PROFILE.version,
67
+ issueCode: 'thumbnail.pending-regeneration',
68
+ };
69
+ const updated = {
70
+ ...manifest,
71
+ // Re-stamp the profile that produced this rewrite while KEEPING every
72
+ // existing entry; each entry's own `profileVersion` is what marks it stale.
73
+ profile: THUMBNAIL_PROFILE.version,
74
+ generatedAt: new Date().toISOString(),
75
+ entries: {
76
+ ...manifest.entries,
77
+ [key]: { ...prior, framing },
78
+ },
79
+ };
80
+ const content = `${JSON.stringify(updated, null, 2)}\n`;
81
+ const history = workspaceHistoryService();
82
+ const written = history
83
+ ? await getProjectFileHistory(
84
+ history,
85
+ getProjectResourceHistoryBackend(),
86
+ 'project-resources',
87
+ ).write(THUMBNAIL_MANIFEST_PATH, content, {
88
+ label: `${framing ? 'Save' : 'Reset'} thumbnail framing ${assetPath}`,
89
+ kind: 'project-file',
90
+ contentType: 'application/json',
91
+ })
92
+ : await projectFiles.write(THUMBNAIL_MANIFEST_PATH, content).then(() => true);
93
+ if (written) resetProjectThumbnailManifestCache();
94
+ }
95
+
96
+ export const SHELL_OBJECT3D_DOCUMENT_WRITE_POLICY: Object3DDocumentWritePolicy = {
97
+ openPersistence: (options) => openObject3DDocumentPersistence(options),
98
+ replaceSource: async (history, request) => {
99
+ // The session's recorder, read per use rather than captured: it is
100
+ // confirmed once at boot and a caller that captured it earlier would hold
101
+ // `undefined` for the session (a human hit exactly that duplicating from
102
+ // the Asset Editor — runhuman pass 41).
103
+ const backend = sourceWriteBackendIfPrimed('The Asset Editor');
104
+ if (!backend) throw new Error('This editor tier cannot write project source.');
105
+ return replaceProjectSource(backend, history, request);
106
+ },
107
+ saveThumbnailFraming: persistThumbnailFraming,
108
+ };
@@ -0,0 +1,48 @@
1
+ /**
2
+ * THE SHELL'S ANSWERS to `ViewportAuthoringPolicy` — the composition the
3
+ * editor installs at boot (`EditorContext.tsx`'s `EditorProvider`).
4
+ *
5
+ * Every member here is a one-line delegation to the module that already owned
6
+ * that answer. Nothing moved and nothing was reimplemented: the point of the
7
+ * seam is only that `editor-viewport.ts` no longer imports these modules, so
8
+ * the gizmo viewport does not carry the composite adapter, the workspace
9
+ * document registry, or the layered-pick walk in its own closure
10
+ * (ARCHITECTURE-CORE §Editor chrome, "the viewport stack is separable").
11
+ *
12
+ * This file is the shell side of that boundary and is free to import all of
13
+ * them.
14
+ */
15
+
16
+ import type { ViewportAuthoringPolicy } from '../viewport-authoring-policy';
17
+ import { getActiveAuthoring } from './active-adapter';
18
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
19
+ import { pickTopmost } from './layered-pick';
20
+ import { resolvePanelAuthoring } from './panel-authoring';
21
+ import { isViewportToolContextVisible, resolveViewportToolContext } from './viewport-tool-context';
22
+ import {
23
+ applyRootHiddenVisibility,
24
+ isThreejsSurfaceVisible,
25
+ resolveThreeViewportRootId,
26
+ suppressRootEnvironment,
27
+ } from './world-hidden-viewport';
28
+
29
+ export const SHELL_VIEWPORT_AUTHORING_POLICY: ViewportAuthoringPolicy = {
30
+ activeAuthoring: (store) => getActiveAuthoring(store),
31
+ panelAuthoring: (store) => resolvePanelAuthoring(store).adapter,
32
+ pick: (store, clientX, clientY, intent) => pickTopmost(store, clientX, clientY, { intent }),
33
+ toolOwner: (adapter, selectedIds) => resolveViewportToolContext(adapter, selectedIds),
34
+ // Both halves of "is this owner painted here" — visibility says a three
35
+ // surface is drawn at all, selection ownership says it is the world being
36
+ // edited. The viewport ANDs the result with `kind === 'three'`, exactly as it
37
+ // did when it called these two itself.
38
+ toolOwnerPainted: (store, owner) =>
39
+ isThreejsSurfaceVisible(store) && isViewportToolContextVisible(store, owner),
40
+ threeSurfaceShowing: (store, adapter) =>
41
+ isThreejsSurfaceVisible(store) &&
42
+ (adapter instanceof CompositeAuthoringAdapter
43
+ ? adapter.childAdapters().some((child) => child.kind === 'three')
44
+ : !adapter.rects && typeof adapter.hierarchy.object3D === 'function'),
45
+ threeViewportRootId: (store) => resolveThreeViewportRootId(store),
46
+ applyRootHiddenVisibility,
47
+ suppressRootEnvironment,
48
+ };