@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,113 @@
1
+ import type { ToolObject3DGesture, ToolObject3DPointerEvent } from '@volter/editor-sdk/contributions';
2
+
3
+ export interface Object3DGestureControllerOptions {
4
+ readonly begin: (event: ToolObject3DPointerEvent) => ToolObject3DGesture | null;
5
+ readonly persist: (label?: string) => Promise<void>;
6
+ readonly reportError: (error: unknown) => void;
7
+ }
8
+
9
+ /** Exactly one project gesture at a time; every terminal path is explicit. */
10
+ export class Object3DGestureController {
11
+ private active: { pointerId: number; gesture: ToolObject3DGesture } | null = null;
12
+ private settling = false;
13
+ private readonly idleWaiters = new Set<() => void>();
14
+
15
+ constructor(private readonly options: Object3DGestureControllerOptions) {}
16
+
17
+ begin(event: ToolObject3DPointerEvent): boolean {
18
+ if (this.active || this.settling) return false;
19
+ try {
20
+ const gesture = this.options.begin(event);
21
+ if (!gesture) return false;
22
+ this.active = { pointerId: event.pointerId, gesture };
23
+ return true;
24
+ } catch (error) {
25
+ this.options.reportError(error);
26
+ return false;
27
+ }
28
+ }
29
+
30
+ update(event: ToolObject3DPointerEvent): void {
31
+ if (!this.active || this.active.pointerId !== event.pointerId) return;
32
+ try {
33
+ this.active.gesture.update(event);
34
+ } catch (error) {
35
+ void this.cancelWithError(error);
36
+ }
37
+ }
38
+
39
+ async commit(event: ToolObject3DPointerEvent): Promise<boolean> {
40
+ const active = this.take(event.pointerId);
41
+ if (!active) return false;
42
+ this.settling = true;
43
+ try {
44
+ await active.commit(event);
45
+ await this.options.persist(active.label);
46
+ return true;
47
+ } catch (error) {
48
+ try {
49
+ await active.cancel();
50
+ } catch (cancelError) {
51
+ this.options.reportError({ operationError: error, rollbackError: cancelError });
52
+ return false;
53
+ }
54
+ this.options.reportError(error);
55
+ return false;
56
+ } finally {
57
+ this.settling = false;
58
+ for (const resolve of this.idleWaiters) resolve();
59
+ this.idleWaiters.clear();
60
+ }
61
+ }
62
+
63
+ async cancel(pointerId?: number): Promise<boolean> {
64
+ const active = this.take(pointerId);
65
+ if (!active) return false;
66
+ this.settling = true;
67
+ try {
68
+ await active.cancel();
69
+ return true;
70
+ } catch (error) {
71
+ this.options.reportError(error);
72
+ return false;
73
+ } finally {
74
+ this.settling = false;
75
+ for (const resolve of this.idleWaiters) resolve();
76
+ this.idleWaiters.clear();
77
+ }
78
+ }
79
+
80
+ /** A source handoff waits for persistence/rollback, including pointer-up work. */
81
+ async settle(): Promise<void> {
82
+ if (this.active) await this.cancel();
83
+ if (this.settling) await new Promise<void>((resolve) => this.idleWaiters.add(resolve));
84
+ }
85
+
86
+ hasActiveGesture(): boolean {
87
+ return this.active !== null;
88
+ }
89
+
90
+ private take(pointerId?: number): ToolObject3DGesture | null {
91
+ if (!this.active || (pointerId !== undefined && this.active.pointerId !== pointerId))
92
+ return null;
93
+ const gesture = this.active.gesture;
94
+ this.active = null;
95
+ return gesture;
96
+ }
97
+
98
+ private async cancelWithError(error: unknown): Promise<void> {
99
+ const active = this.take();
100
+ if (!active) return;
101
+ this.settling = true;
102
+ try {
103
+ await active.cancel();
104
+ this.options.reportError(error);
105
+ } catch (rollbackError) {
106
+ this.options.reportError({ operationError: error, rollbackError });
107
+ } finally {
108
+ this.settling = false;
109
+ for (const resolve of this.idleWaiters) resolve();
110
+ this.idleWaiters.clear();
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,121 @@
1
+ /**
2
+ * ONE resolver for "which authoring adapter do the shared panels drive?" —
3
+ * the Hierarchy and the Inspector must never disagree, and before this module
4
+ * they each open-coded the same expression.
5
+ *
6
+ * ## The defect this exists for (audit A1/A3, 2026-08-01) — and its MEASURED cause
7
+ *
8
+ * Symptom: every pixi ingest (the in-tree canvas fixtures, and
9
+ * the synthetic `ingest-pixi` manifest fixtures) mounted, captured and drew,
10
+ * `getAuthoringOverride()` held a healthy `PixiAuthoringAdapter` with
11
+ * `{transform, inspectorFields, persist}` all true — and the Hierarchy still
12
+ * rendered "No authoring adapter" while the Inspector took its
13
+ * nothing-to-show branch. The three route (the `games-fps` fixture) bound fine in the same session
14
+ * shape.
15
+ *
16
+ * The audit's hypothesis was adapter RESOLUTION: that the active workspace
17
+ * document's adapter shadowed the ingest override at `Inspector.tsx`'s
18
+ * `documentSelection?.adapter ?? getActiveAuthoring(store)`. Reproduced live on
19
+ * a single-`ingest-pixi`-root project and measured: `activeWorkspaceDocument
20
+ * Selection()` is `null`, the only open document is `workspace:game`, and the
21
+ * override is already correct at the moment the panels are showing the wrong
22
+ * thing. Resolution was never wrong. **It was a stale render**: the override
23
+ * slot is module state with no change notification, and the panels only
24
+ * re-rendered because ingest entry ALSO calls `setActiveViewportTab`, which in
25
+ * a Three-rooted project activates a different center document and the
26
+ * workspace registry's `notifyChanged()` re-rendered them incidentally. With no
27
+ * Three root there is one center document, that activation is a no-op, and the
28
+ * incidental notification never happens.
29
+ *
30
+ * The fix is therefore in `active-adapter.ts` (the slot notifies) plus the
31
+ * subscription the panels take out beside this resolver. This module exists so
32
+ * the two panels share ONE expression and one subscription set instead of two
33
+ * copies that can drift apart again.
34
+ *
35
+ * ## Why the resolution ORDER is unchanged
36
+ *
37
+ * An earlier revision of this fix also made an ingest override outrank a
38
+ * document-published adapter — the audit's hypothesis, kept "just in case". It
39
+ * is deliberately NOT here: it was never observed (measured null document
40
+ * selection in the reproduction above), and reaching `isIngestActive` from a
41
+ * module both shared panels import drags `ingest/mount-ingest-root.ts`'s whole transitive
42
+ * graph — the pixi stack and the engine renderer setup — into the
43
+ * Hierarchy's module graph, which broke six unit suites outright on a
44
+ * `URL.createObjectURL` that does not exist in the node test environment. A
45
+ * behavior change nobody could demonstrate is not worth a dependency edge that
46
+ * heavy. If document shadowing is ever actually observed, it should be fixed
47
+ * where the document's provider is registered (`world-documents.tsx`), which
48
+ * is the layer that knows a foreign session is live.
49
+ */
50
+
51
+ import type { AdapterSurface, AuthoringAdapter } from '@volter/editor-project/adapter';
52
+ import type { EditorShellStore } from '../editor-shell-store';
53
+ import {
54
+ activeWorkspaceDocument,
55
+ activeWorkspaceDocumentSelection,
56
+ type WorkspaceDocumentSelection,
57
+ } from '../workspace-document-registry';
58
+ import { getActiveAuthoring } from './active-adapter';
59
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
60
+
61
+ export interface PanelAuthoringBinding {
62
+ /** The adapter the Hierarchy/Inspector must drive. */
63
+ readonly adapter: AuthoringAdapter;
64
+ /** Render substrate owned by the active authored document. `null` for
65
+ * composition/reference documents that do not focus one root surface. */
66
+ readonly surface: AdapterSurface | null;
67
+ /** The active document's selection context, when it publishes one. */
68
+ readonly documentSelection: WorkspaceDocumentSelection | null;
69
+ }
70
+
71
+ /**
72
+ * An authored root document projects only the root it is showing. The Game
73
+ * document intentionally falls through to the full composite: composition is
74
+ * its subject, while a Scene/world document's subject is one root.
75
+ *
76
+ * `world` documents carry their manifest root id as provenance. The pinned
77
+ * Three Scene document predates per-root document ids, so its focused child is
78
+ * the one live Three adapter that honestly reports transform authoring.
79
+ */
80
+ function adapterSurface(kind: string): AdapterSurface | null {
81
+ return kind === 'three' || kind === 'canvas' || kind === 'dom' ? kind : null;
82
+ }
83
+
84
+ function rootDocumentBinding(
85
+ active: AuthoringAdapter,
86
+ ): { adapter: AuthoringAdapter; surface: AdapterSurface } | null {
87
+ if (!(active instanceof CompositeAuthoringAdapter)) return null;
88
+ const document = activeWorkspaceDocument()?.descriptor;
89
+ if (!document) return null;
90
+
91
+ const children = active.childAdapters();
92
+ if (document.kind === 'world') {
93
+ const rootId = document.provenance?.rootId;
94
+ const child = rootId ? children.find((candidate) => candidate.worldId === rootId) : undefined;
95
+ const surface = child ? adapterSurface(child.kind) : null;
96
+ return child && surface ? { adapter: child.adapter, surface } : null;
97
+ }
98
+ if (document.kind === 'scene') {
99
+ const child = children.find(
100
+ (candidate) => candidate.kind === 'three' && candidate.adapter.capabilities.transform,
101
+ );
102
+ if (!child) return null;
103
+ return {
104
+ adapter: active.projectedDocumentAdapter(child.worldId) ?? child.adapter,
105
+ surface: 'three',
106
+ };
107
+ }
108
+ return null;
109
+ }
110
+
111
+ export function resolvePanelAuthoring(store: EditorShellStore): PanelAuthoringBinding {
112
+ const documentSelection = activeWorkspaceDocumentSelection();
113
+ const active = getActiveAuthoring(store);
114
+ const rootBinding = rootDocumentBinding(active);
115
+ const documentKind = activeWorkspaceDocument()?.descriptor.kind;
116
+ return {
117
+ adapter: documentSelection?.adapter ?? rootBinding?.adapter ?? active,
118
+ surface: documentKind === 'story' ? 'dom' : (rootBinding?.surface ?? null),
119
+ documentSelection,
120
+ };
121
+ }
@@ -0,0 +1,237 @@
1
+ import { faCubesStacked } from '@fortawesome/free-solid-svg-icons';
2
+ import {
3
+ Button,
4
+ Checkbox,
5
+ Dialog,
6
+ DialogBody,
7
+ DialogFooter,
8
+ DialogHeader,
9
+ FieldRow,
10
+ Text,
11
+ themeVars,
12
+ } from '@volter/editor-sdk/widgets';
13
+ import type {
14
+ AuthoringAdapter,
15
+ ComponentInstanceOverride,
16
+ EditorNode,
17
+ } from '@volter/editor-project/adapter';
18
+ import { useEffect, useState } from 'react';
19
+ import { createHmrRegistrationGroup } from '../hmr-registration-group';
20
+ import { GROUP_SECTION_ORDER, type InspectionSection } from '../inspection/model';
21
+ import { registerInspectorSections } from '../inspector-section-registry';
22
+ import { showTransientHint } from '../transient-hint';
23
+ import {
24
+ applyAuthoringInstanceToComponent,
25
+ openAuthoringComponent,
26
+ revertAuthoringInstance,
27
+ } from './consumer-actions';
28
+ import { matchesPrefabInstance, prefabInstanceStoryAction } from './prefab-instance-section-model';
29
+
30
+ function display(value: unknown): string {
31
+ return typeof value === 'string' ? value : JSON.stringify(value);
32
+ }
33
+
34
+ function PrefabInstanceSection({ adapter, nodeId }: { adapter: AuthoringAdapter; nodeId: string }) {
35
+ const description = adapter.instances?.describe(nodeId) ?? null;
36
+ const [selected, setSelected] = useState<Set<string>>(new Set());
37
+ const [applyTarget, setApplyTarget] = useState<ComponentInstanceOverride | null>(null);
38
+ const [busy, setBusy] = useState(false);
39
+
40
+ useEffect(() => {
41
+ setSelected(new Set());
42
+ setApplyTarget(null);
43
+ }, [nodeId]);
44
+
45
+ if (!description) return null;
46
+ const storyAction = prefabInstanceStoryAction(adapter, nodeId);
47
+
48
+ const toggle = (path: string, checked: boolean): void => {
49
+ setSelected((current) => {
50
+ const next = new Set(current);
51
+ if (checked) next.add(path);
52
+ else next.delete(path);
53
+ return next;
54
+ });
55
+ };
56
+
57
+ const revertSelected = async (): Promise<void> => {
58
+ if (selected.size === 0 || !adapter.instances) return;
59
+ setBusy(true);
60
+ try {
61
+ await revertAuthoringInstance(adapter, nodeId, [...selected]);
62
+ setSelected(new Set());
63
+ showTransientHint(
64
+ `Reverted ${selected.size} prefab override${selected.size === 1 ? '' : 's'}.`,
65
+ );
66
+ } finally {
67
+ setBusy(false);
68
+ }
69
+ };
70
+
71
+ const apply = async (): Promise<void> => {
72
+ if (!applyTarget || !adapter.instances) return;
73
+ setBusy(true);
74
+ try {
75
+ const result = await applyAuthoringInstanceToComponent(adapter, nodeId, applyTarget.path);
76
+ showTransientHint(result.message);
77
+ if (result.changed) setApplyTarget(null);
78
+ } finally {
79
+ setBusy(false);
80
+ }
81
+ };
82
+
83
+ return (
84
+ <div style={{ display: 'grid', gap: 10 }} data-testid="prefab-instance-overrides">
85
+ <FieldRow label="Prefab">
86
+ <Text>{description.componentName}</Text>
87
+ </FieldRow>
88
+ <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
89
+ <Button
90
+ size="compact"
91
+ disabled={!adapter.instances?.openComponent}
92
+ onClick={() => openAuthoringComponent(adapter, nodeId)}
93
+ >
94
+ Open Component
95
+ </Button>
96
+ <Button
97
+ size="compact"
98
+ disabled={!storyAction}
99
+ title={
100
+ storyAction ? `Open ${storyAction.story.label}` : 'This prefab has no composed story.'
101
+ }
102
+ onClick={() => storyAction?.open()}
103
+ >
104
+ Open Story
105
+ </Button>
106
+ </div>
107
+
108
+ <div>
109
+ <Text tone="muted">Overrides ({description.overrides.length})</Text>
110
+ {description.overrides.length === 0 ? (
111
+ <div style={{ paddingTop: 6 }}>
112
+ <Text tone="muted">
113
+ Using component defaults. Change a property above and it will be listed here as an
114
+ override you can apply or revert.
115
+ </Text>
116
+ </div>
117
+ ) : (
118
+ <div style={{ display: 'grid', gap: 4, paddingTop: 6 }}>
119
+ {description.overrides.map((override) => (
120
+ <div
121
+ key={override.path}
122
+ style={{
123
+ border: `1px solid ${themeVars.boundary.default}`,
124
+ borderRadius: 5,
125
+ display: 'grid',
126
+ gap: 4,
127
+ padding: 6,
128
+ }}
129
+ >
130
+ <label style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
131
+ <Checkbox
132
+ checked={selected.has(override.path)}
133
+ onChange={(event) => toggle(override.path, event.target.checked)}
134
+ />
135
+ <Text>{override.label}</Text>
136
+ <Text tone="muted">{display(override.value)}</Text>
137
+ </label>
138
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, paddingLeft: 22 }}>
139
+ <Text tone="muted">default: {override.defaultText ?? 'component fallback'}</Text>
140
+ <Button
141
+ size="compact"
142
+ disabled={!override.canApplyToComponent || busy}
143
+ title={override.applyUnavailableReason}
144
+ onClick={() => setApplyTarget(override)}
145
+ >
146
+ Apply…
147
+ </Button>
148
+ </div>
149
+ </div>
150
+ ))}
151
+ </div>
152
+ )}
153
+ </div>
154
+ {description.overrides.length > 0 ? (
155
+ <Button
156
+ size="compact"
157
+ disabled={selected.size === 0 || busy}
158
+ title={selected.size === 0 ? 'Tick an override above to select it first.' : undefined}
159
+ onClick={() => void revertSelected()}
160
+ >
161
+ Revert Selected
162
+ </Button>
163
+ ) : null}
164
+
165
+ {applyTarget ? (
166
+ <Dialog
167
+ labelledBy="apply-prefab-default-title"
168
+ onDismiss={() => !busy && setApplyTarget(null)}
169
+ >
170
+ <DialogHeader
171
+ titleId="apply-prefab-default-title"
172
+ title={`Apply “${applyTarget.label} = ${display(applyTarget.value)}” to ${description.componentName}?`}
173
+ />
174
+ <DialogBody>
175
+ <div style={{ display: 'grid', gap: 8 }}>
176
+ <Text>
177
+ This changes the default used by {applyTarget.affectedInstanceCount} placed instance
178
+ {applyTarget.affectedInstanceCount === 1 ? '' : 's'}.
179
+ </Text>
180
+ <FieldRow label="Current default">
181
+ <Text tone="muted">{applyTarget.defaultText ?? 'component fallback'}</Text>
182
+ </FieldRow>
183
+ <FieldRow label="New default">
184
+ <Text>{display(applyTarget.value)}</Text>
185
+ </FieldRow>
186
+ </div>
187
+ </DialogBody>
188
+ <DialogFooter>
189
+ <Button disabled={busy} onClick={() => setApplyTarget(null)}>
190
+ Cancel
191
+ </Button>
192
+ <Button disabled={busy} onClick={() => void apply()}>
193
+ Apply
194
+ </Button>
195
+ </DialogFooter>
196
+ </Dialog>
197
+ ) : null}
198
+ </div>
199
+ );
200
+ }
201
+
202
+ function sections(
203
+ node: EditorNode | null,
204
+ adapter: AuthoringAdapter,
205
+ ): readonly InspectionSection[] {
206
+ if (!node || !matchesPrefabInstance(node, adapter)) return [];
207
+ const description = adapter.instances?.describe(node.id);
208
+ if (!description) return [];
209
+ return [
210
+ {
211
+ id: 'prefab-instance',
212
+ title: 'Prefab Instance',
213
+ icon: faCubesStacked,
214
+ order: GROUP_SECTION_ORDER + 125,
215
+ body: {
216
+ kind: 'custom',
217
+ render: () => <PrefabInstanceSection adapter={adapter} nodeId={node.id} />,
218
+ data: {
219
+ component: description.componentName,
220
+ sourcePath: description.sourcePath ?? null,
221
+ overrideCount: description.overrides.length,
222
+ overrides: description.overrides.map((override) => ({
223
+ path: override.path,
224
+ value: override.value,
225
+ default: override.defaultText ?? null,
226
+ canApplyToComponent: override.canApplyToComponent,
227
+ })),
228
+ },
229
+ },
230
+ },
231
+ ];
232
+ }
233
+
234
+ const registrationGroup = createHmrRegistrationGroup(import.meta.hot, 'prefab-instance-inspector');
235
+ registrationGroup.ensure((track) => {
236
+ track(registerInspectorSections({ match: matchesPrefabInstance, sections }));
237
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The two decisions the Prefab Instance inspector section makes before it
3
+ * renders anything: does this selection HAVE a prefab-instance description, and
4
+ * does it have a story of its own to open.
5
+ *
6
+ * They live here rather than inside the section because the section is a React
7
+ * component in a repo whose unit tests run headless (`environment: 'node'`) —
8
+ * the same reason `components/inspector-stories-gating.ts` exists. Both are
9
+ * pure functions of (adapter, node).
10
+ */
11
+
12
+ import type { AuthoringAdapter, EditorNode, StoryRef } from '@volter/editor-project/adapter';
13
+ import { resolveNodeScopedStories } from '../components/inspector-stories-gating';
14
+
15
+ /**
16
+ * Whether `node` is a component instance this adapter can describe.
17
+ *
18
+ * Both halves are load-bearing. `adapter.instances` is OPTIONAL, so an adapter
19
+ * that has no instances provider at all must not match — the section would then
20
+ * register for every selection in that world and render nothing, an empty
21
+ * registered section. (`undefined !== null` is `true`: the absent provider
22
+ * cannot be tested by comparing its answer.)
23
+ */
24
+ export function matchesPrefabInstance(node: EditorNode | null, adapter: AuthoringAdapter): boolean {
25
+ const instances = adapter.instances;
26
+ if (!node || !instances) return false;
27
+ return instances.describe(node.id) !== null;
28
+ }
29
+
30
+ /** The section's "Open Story" affordance, bound to the node's own first story. */
31
+ export interface PrefabInstanceStoryAction {
32
+ readonly story: StoryRef;
33
+ /** Put the node's component into that story (opens its story document). */
34
+ readonly open: () => void;
35
+ }
36
+
37
+ /**
38
+ * The story this prefab instance can open, or `null` when it has none.
39
+ *
40
+ * Routed through {@link resolveNodeScopedStories} rather than `adapter.stories`
41
+ * because a world-level provider answers the same rows for EVERY node: on an
42
+ * ingest root those rows are the game's own scenes, and applying one navigates
43
+ * the whole game from inside a per-node section. When only a world-level
44
+ * provider exists this section offers no story action at all — the honest
45
+ * absence, since the node genuinely has no composed story.
46
+ */
47
+ export function prefabInstanceStoryAction(
48
+ adapter: AuthoringAdapter,
49
+ nodeId: string,
50
+ ): PrefabInstanceStoryAction | null {
51
+ const provider = resolveNodeScopedStories(adapter, nodeId);
52
+ const story = provider?.storiesFor(nodeId)[0];
53
+ if (!provider || !story) return null;
54
+ return { story, open: () => provider.apply(nodeId, story.id) };
55
+ }
@@ -0,0 +1,105 @@
1
+ /** The project owns its authoring session. Scene tabs attach renderers to it;
2
+ * closing a viewport must not remove the other scenes or component canvases. */
3
+ import type { EditorShellStore } from '../editor-shell-store';
4
+ import { runProjectReady } from '../project-ready';
5
+ import {
6
+ availableWorkspaceDocuments,
7
+ requestAvailableWorkspaceDocument,
8
+ } from '../workspace-available-documents';
9
+ import { activeWorkspaceDocumentId, openWorkspaceDocuments } from '../workspace-document-registry';
10
+ import type { CompositeAuthoringAdapter } from './composite-authoring-adapter';
11
+ import {
12
+ bindEditModeRebuildOwner,
13
+ exitEditModeAuthoring,
14
+ installEditModeAuthoringForProject,
15
+ } from './edit-mode-authoring';
16
+
17
+ type Stage = (composite: CompositeAuthoringAdapter) => Promise<void>;
18
+ class ProjectAuthoringSession {
19
+ private references = 0;
20
+ private disposed = false;
21
+ private composite: CompositeAuthoringAdapter | undefined;
22
+ private disposeDocuments: (() => void) | undefined;
23
+ private stages = new Set<Stage>();
24
+ private tail: Promise<void> = Promise.resolve();
25
+ private unbind: () => void;
26
+ readonly ready: Promise<void>;
27
+
28
+ constructor(private readonly store: EditorShellStore) {
29
+ this.unbind = bindEditModeRebuildOwner(() => this.rebuild());
30
+ this.ready = this.rebuild();
31
+ }
32
+ retain(): () => void {
33
+ this.references++;
34
+ return () => {
35
+ if (--this.references > 0) return;
36
+ this.disposed = true;
37
+ this.unbind();
38
+ this.disposeDocuments?.();
39
+ exitEditModeAuthoring(this.composite);
40
+ sessions.delete(this.store);
41
+ };
42
+ }
43
+ attach(stage: Stage): { ready: Promise<void>; dispose: () => void } {
44
+ const release = this.retain();
45
+ this.stages.add(stage);
46
+ // A stage attached during a rebuild is mounted by that rebuild. A later
47
+ // stage attaches to the already installed project without reinstalling it.
48
+ const ready = this.composite ? stage(this.composite) : this.tail;
49
+ return {
50
+ ready,
51
+ dispose: () => {
52
+ this.stages.delete(stage);
53
+ release();
54
+ },
55
+ };
56
+ }
57
+ private rebuild(): Promise<void> {
58
+ const run = this.tail.then(async () => {
59
+ if (this.disposed) return;
60
+ const active = activeWorkspaceDocumentId();
61
+ const available = new Set(availableWorkspaceDocuments().map((entry) => entry.descriptor.id));
62
+ const reopen = this.composite
63
+ ? openWorkspaceDocuments()
64
+ .map((document) => document.descriptor.id)
65
+ .filter((id) => available.has(id))
66
+ : [];
67
+ this.disposeDocuments?.();
68
+ this.disposeDocuments = undefined;
69
+ exitEditModeAuthoring(this.composite);
70
+ this.composite = undefined;
71
+ const composite = await installEditModeAuthoringForProject(this.store);
72
+ if (this.disposed) {
73
+ exitEditModeAuthoring(composite);
74
+ return;
75
+ }
76
+ const { installRootDocuments } = await import('../components/world-documents');
77
+ if (this.disposed) {
78
+ exitEditModeAuthoring(composite);
79
+ return;
80
+ }
81
+ this.composite = composite;
82
+ this.disposeDocuments = installRootDocuments(this.store, composite);
83
+ for (const id of reopen) requestAvailableWorkspaceDocument(id, id === active);
84
+ await Promise.all([...this.stages].map((stage) => stage(composite)));
85
+ });
86
+ this.tail = run.catch(() => undefined);
87
+ return run;
88
+ }
89
+ }
90
+ const sessions = new Map<EditorShellStore, ProjectAuthoringSession>();
91
+ function sessionFor(store: EditorShellStore): ProjectAuthoringSession {
92
+ let session = sessions.get(store);
93
+ if (!session) {
94
+ session = new ProjectAuthoringSession(store);
95
+ sessions.set(store, session);
96
+ }
97
+ return session;
98
+ }
99
+ export function retainProjectAuthoringSession(store: EditorShellStore) {
100
+ const session = sessionFor(store);
101
+ return { ready: session.ready.then(() => runProjectReady()), dispose: session.retain() };
102
+ }
103
+ export function attachProjectAuthoringStage(store: EditorShellStore, stage: Stage) {
104
+ return sessionFor(store).attach(stage);
105
+ }