@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,135 @@
1
+ /**
2
+ * H3 wiring — the instance row's two source actions, registered through the
3
+ * hierarchy contribution seam.
4
+ *
5
+ * This is the "adapter-module registration" half of the split
6
+ * `hierarchy-menu-registry.ts` describes: `GameHierarchy` stays contract-only
7
+ * and never learns that an R3F world has a callsite; THIS module is the one
8
+ * allowed to resolve the owning child adapter and probe it for source
9
+ * accessors. The sentences and the applicability rule are pure and live in
10
+ * `../instance-source-actions.ts`.
11
+ *
12
+ * ISOLATE IS DELIBERATELY ABSENT — see {@link enterInstanceRow}. The design
13
+ * record's "double-click = Isolate, reusing the catalog nodes' existing Isolate
14
+ * mount" is not reachable from a scene instance row, and faking it was
15
+ * explicitly out of scope.
16
+ */
17
+
18
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
19
+ import type { EditorShellStore } from '../editor-shell-store';
20
+ import { registerHierarchyMenuItems } from '../hierarchy-menu-registry';
21
+ import {
22
+ INSTANCE_SOURCE_LABELS,
23
+ type InstanceSourceLocator,
24
+ type InstanceSourceTarget,
25
+ instanceSourceTargets,
26
+ runInstanceSourceAction,
27
+ } from '../instance-source-actions';
28
+ import { showTransientHint } from '../transient-hint';
29
+ import { getActiveAuthoring } from './active-adapter';
30
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
31
+ import { enterSelectionScope } from './selection-scope';
32
+
33
+ /**
34
+ * The adapter whose source accessors answer for `nodeId`. Ownership is asked
35
+ * of the composite (`ownerOf`/`childAdapters`, the same public T0 query
36
+ * `GameHierarchy`'s own gates use) rather than decoded from the id — a
37
+ * composite's routers would otherwise answer for a row their owning child
38
+ * knows nothing about.
39
+ */
40
+ export function instanceSourceLocatorFor(
41
+ adapter: AuthoringAdapter,
42
+ nodeId: string,
43
+ ): InstanceSourceLocator | null {
44
+ const owner =
45
+ adapter instanceof CompositeAuthoringAdapter
46
+ ? (adapter.childAdapters().find((c) => c.worldId === adapter.ownerOf(nodeId))?.adapter ??
47
+ adapter)
48
+ : adapter;
49
+ const locator = owner as unknown as InstanceSourceLocator;
50
+ return typeof locator.sourceLocation === 'function' ||
51
+ typeof locator.definitionLocation === 'function'
52
+ ? locator
53
+ : null;
54
+ }
55
+
56
+ /** Run one target and SAY what happened — every path returns a sentence
57
+ * (copied / not in the index / clipboard refused), so no click is silent. */
58
+ function runAndReport(
59
+ locator: InstanceSourceLocator | null,
60
+ nodeId: string,
61
+ target: InstanceSourceTarget,
62
+ ): void {
63
+ void runInstanceSourceAction(locator, nodeId, target).then(showTransientHint);
64
+ }
65
+
66
+ /**
67
+ * Double-click on an instance row.
68
+ *
69
+ * An instance row is already the native authoring subject; portable CSF
70
+ * selects complete design-time states and does not provide a second subtree
71
+ * isolation protocol. Double-click therefore ENTERS the instance's scope and
72
+ * falls back to its callsite when the row cannot be entered.
73
+ *
74
+ * That fallback is the COMMON case, not the corner one: `projectedChildren`
75
+ * collapses everything an instance rendered itself (same `authoringInstance`),
76
+ * so an instance row has children only when it contains a NESTED instance.
77
+ * Every other instance row is a hierarchy leaf, `enterSelectionScope` refuses
78
+ * it for having no children, and until now that double-click did nothing at
79
+ * all — the silent no-op this whole decision exists to kill.
80
+ *
81
+ * Rename is NOT in conflict: `Row`'s `onDoubleClick` already routes every
82
+ * `component`/`instance`/`boundary` row here BEFORE its rename branch, so an
83
+ * instance row has never started a rename on double-click; rename stays
84
+ * reachable on the context menu, where it is always offered for a non-group row.
85
+ */
86
+ export function enterInstanceRow(adapter: AuthoringAdapter, nodeId: string): void {
87
+ if (enterSelectionScope(adapter, nodeId)) return;
88
+ runCallsite(adapter, nodeId);
89
+ }
90
+
91
+ function runCallsite(adapter: AuthoringAdapter, nodeId: string): void {
92
+ const node = adapter.hierarchy.node(nodeId);
93
+ const locator = instanceSourceLocatorFor(adapter, nodeId);
94
+ // Only a row that ADVERTISES a callsite falls through to the source action —
95
+ // a boundary/placeholder row with nothing to open keeps double-clicking to
96
+ // nothing, exactly as before, rather than raising a hint the user did not ask
97
+ // for by picking a source verb.
98
+ if (!instanceSourceTargets(node, locator, nodeId).includes('callsite')) return;
99
+ runAndReport(locator, nodeId, 'callsite');
100
+ }
101
+
102
+ let unregister: (() => void) | null = null;
103
+
104
+ /** Idempotent install of the two H3 items (see the register module). */
105
+ export function ensureInstanceSourceMenuRegistered(): void {
106
+ if (unregister) return;
107
+ unregister = registerHierarchyMenuItems(
108
+ ({ nodeId, store }) => targetsFor(store, nodeId).length > 0,
109
+ ({ nodeId, store }) => {
110
+ const adapter = getActiveAuthoring(store);
111
+ const locator = instanceSourceLocatorFor(adapter, nodeId);
112
+ return targetsFor(store, nodeId).map((target) => ({
113
+ label: INSTANCE_SOURCE_LABELS[target],
114
+ action: () => {
115
+ runAndReport(locator, nodeId, target);
116
+ },
117
+ }));
118
+ },
119
+ );
120
+ }
121
+
122
+ function targetsFor(store: EditorShellStore, nodeId: string): InstanceSourceTarget[] {
123
+ const adapter = getActiveAuthoring(store);
124
+ return instanceSourceTargets(
125
+ adapter.hierarchy.node(nodeId),
126
+ instanceSourceLocatorFor(adapter, nodeId),
127
+ nodeId,
128
+ );
129
+ }
130
+
131
+ /** Test-only: drop the registration so a suite can reset the shared registry. */
132
+ export function __unregisterInstanceSourceMenuForTest(): void {
133
+ unregister?.();
134
+ unregister = null;
135
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Layered viewport picking (B4, D12) — "click anything you can see; topmost
3
+ * visible layer wins." Shell POLICY over the composite's public seams, kept a
4
+ * separate module (rather than living inline in `editor-viewport.ts`) so it
5
+ * stays lean AND unit-testable with plain fake adapters — no real DOM/canvas
6
+ * needed.
7
+ *
8
+ * This module speaks ONLY the public contract: `CompositeAuthoringAdapter
9
+ * .childAdapters()` (T0), the `AuthoringAdapter.pickable` provider (D12,
10
+ * `@volter/editor-project/adapter`), and `world-session-state.ts`'s session toggles. It never
11
+ * reaches into any one child adapter's own private, format-specific model (no
12
+ * concrete-world-shape vocabulary of any kind here) — `instanceof
13
+ * CompositeAuthoringAdapter` is the ONE sanctioned type check (that class's
14
+ * own doc comment blesses exactly this use, mirroring
15
+ * `authoring/first-party-inspector/is-first-party-selection.ts`'s identical
16
+ * precedent).
17
+ *
18
+ * Walk order: the composite's NON-threejs children (react/pixi design-time
19
+ * layers), topmost-first by (install-time) manifest zOrder — `stackOrder`
20
+ * sorts bottom-to-top, so `.reverse()` gives topmost-first while preserving
21
+ * its own tie-break rule. The Three world is appended LAST
22
+ * (canvas-bottom) regardless of its manifest zOrder — it always renders
23
+ * beneath every positioned design-time layer (`design-time-layers.ts`'s own
24
+ * doc comment: "the three canvas keeps its existing slot"), so it is
25
+ * correct for it to lose every pick to a layer that also claims the point.
26
+ *
27
+ * A layer that is eye-hidden or pick-locked (`world-session-state.ts`, B1) is
28
+ * skipped ENTIRELY — its `pickable.pick` is never even called. This is a
29
+ * SEPARATE mechanism from a layer's `interactive` toggle: an interactive
30
+ * layer's DOM has `pointer-events: auto`, so a real pointer event lands on the
31
+ * layer's own element and this walk (triggered only by the CANVAS's own
32
+ * `pointerup` listener) never runs at all for that event — mutually exclusive
33
+ * by construction, no code needed here for it.
34
+ *
35
+ * When the active adapter is NOT a composite (single-world project, or a
36
+ * non-composite override), this degrades to that one adapter's own
37
+ * `pickable.pick` (or `null` if it doesn't have one) — today's single-world
38
+ * behavior, unchanged.
39
+ */
40
+
41
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
42
+ import { stackOrder } from '@volter/editor-project/adapter/root-stacking';
43
+ import type { EditorShellStore } from '../editor-shell-store';
44
+ import { SCENE_DOCUMENT_ID } from '../workspace-document-ids';
45
+ import { activeWorkspaceDocumentId } from '../workspace-document-registry';
46
+ import { getActiveAuthoring } from './active-adapter';
47
+ import { CompositeAuthoringAdapter } from './composite-authoring-adapter';
48
+ import { currentSelectionScopeId } from './selection-scope';
49
+ import { isRootHidden, isRootPickLocked } from './world-session-state';
50
+
51
+ export function resolveAdapterPick(
52
+ adapter: AuthoringAdapter,
53
+ clientX: number,
54
+ clientY: number,
55
+ intent: 'normal' | 'deep',
56
+ ): string | null {
57
+ const raw = adapter.pickable?.pick(clientX, clientY) ?? null;
58
+ if (!raw) return null;
59
+ return (
60
+ adapter.selection?.resolve?.(raw, {
61
+ intent,
62
+ scopeId: currentSelectionScopeId(),
63
+ })?.id ?? raw
64
+ );
65
+ }
66
+
67
+ function resolveAdapterCandidates(
68
+ adapter: AuthoringAdapter,
69
+ clientX: number,
70
+ clientY: number,
71
+ intent: 'normal' | 'deep',
72
+ ): string[] {
73
+ const raw = adapter.pickable?.candidates?.(clientX, clientY) ?? [];
74
+ const resolved: string[] = [];
75
+ const seen = new Set<string>();
76
+ for (const id of raw) {
77
+ const candidate =
78
+ adapter.selection?.resolve?.(id, {
79
+ intent,
80
+ scopeId: currentSelectionScopeId(),
81
+ })?.id ?? id;
82
+ if (!seen.has(candidate)) {
83
+ seen.add(candidate);
84
+ resolved.push(candidate);
85
+ }
86
+ }
87
+ return resolved;
88
+ }
89
+
90
+ /** Topmost-first pick across every visible, pick-unlocked layer of the active
91
+ * (possibly composite) authoring adapter. Returns the winning node id, or
92
+ * `null` when nothing under `(clientX, clientY)` claims the point. */
93
+ export function pickTopmost(
94
+ store: EditorShellStore,
95
+ clientX: number,
96
+ clientY: number,
97
+ options: { intent?: 'normal' | 'deep' } = {},
98
+ ): string | null {
99
+ const intent = options.intent ?? 'normal';
100
+ const active = getActiveAuthoring(store);
101
+ if (!(active instanceof CompositeAuthoringAdapter)) {
102
+ return resolveAdapterPick(active, clientX, clientY, intent);
103
+ }
104
+
105
+ const children = active.childAdapters();
106
+ // The Game document stays mounted warm while Scene is active. Its DOM rects
107
+ // therefore still exist even though it is not painted. Document ownership,
108
+ // not mount lifetime, decides which layers may claim the pointer.
109
+ const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
110
+ const layered = sceneDocumentActive ? [] : children.filter((c) => c.kind !== 'three');
111
+ const three = children.filter((c) => c.kind === 'three');
112
+
113
+ // `stackOrder` wants `{id, zOrder}` (`ClaimEntry`) — reuse `worldId` as its
114
+ // `id` (this walk has no separate id vocabulary of its own).
115
+ const layeredClaims = layered.map((c) => ({
116
+ id: c.worldId,
117
+ zOrder: c.zOrder,
118
+ worldId: c.worldId,
119
+ adapter: c.adapter,
120
+ }));
121
+
122
+ // Topmost-first: `stackOrder` is bottom-to-top (ascending zOrder, ties by
123
+ // original array order) — `.reverse()` flips it without disturbing its own
124
+ // tie-break rule (a later-declared same-zOrder layer still wins the tie,
125
+ // now by being checked FIRST instead of sorting last).
126
+ const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
127
+ ...stackOrder(layeredClaims).reverse(),
128
+ // The Three world paints/picks LAST — canvas-bottom, regardless
129
+ // of its own manifest zOrder (see module doc comment).
130
+ ...three,
131
+ ];
132
+
133
+ for (const { worldId, adapter } of order) {
134
+ if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
135
+ const hit = resolveAdapterPick(adapter, clientX, clientY, intent);
136
+ if (hit) return hit;
137
+ }
138
+ return null;
139
+ }
140
+
141
+ /** Ordered overlap stack across the same visible layers as {@link pickTopmost}. */
142
+ export function pickCandidates(
143
+ store: EditorShellStore,
144
+ clientX: number,
145
+ clientY: number,
146
+ options: { intent?: 'normal' | 'deep'; adapter?: AuthoringAdapter } = {},
147
+ ): string[] {
148
+ const intent = options.intent ?? 'normal';
149
+ const active = options.adapter ?? getActiveAuthoring(store);
150
+ if (!(active instanceof CompositeAuthoringAdapter)) {
151
+ const candidates = resolveAdapterCandidates(active, clientX, clientY, intent);
152
+ const fallback = resolveAdapterPick(active, clientX, clientY, intent);
153
+ return candidates.length > 0 ? candidates : fallback ? [fallback] : [];
154
+ }
155
+
156
+ const children = active.childAdapters();
157
+ const sceneDocumentActive = activeWorkspaceDocumentId() === SCENE_DOCUMENT_ID;
158
+ const layered = sceneDocumentActive ? [] : children.filter((child) => child.kind !== 'three');
159
+ const three = children.filter((child) => child.kind === 'three');
160
+ const layeredClaims = layered.map((child) => ({
161
+ id: child.worldId,
162
+ zOrder: child.zOrder,
163
+ worldId: child.worldId,
164
+ adapter: child.adapter,
165
+ }));
166
+ const order: Array<{ worldId: string; adapter: AuthoringAdapter }> = [
167
+ ...stackOrder(layeredClaims).reverse(),
168
+ ...three,
169
+ ];
170
+ const result: string[] = [];
171
+ const seen = new Set<string>();
172
+ for (const { worldId, adapter } of order) {
173
+ if (isRootHidden(worldId) || isRootPickLocked(worldId)) continue;
174
+ const candidates = resolveAdapterCandidates(adapter, clientX, clientY, intent);
175
+ const fallback = resolveAdapterPick(adapter, clientX, clientY, intent);
176
+ for (const id of candidates.length > 0 ? candidates : fallback ? [fallback] : []) {
177
+ if (seen.has(id)) continue;
178
+ seen.add(id);
179
+ result.push(id);
180
+ }
181
+ }
182
+ return result;
183
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * "A continuous viewport gesture is happening right now" — the one fact the
3
+ * absorb-by-remount cycle needs from the gizmo.
4
+ *
5
+ * A source write remounts the world; a drag that is STILL RUNNING when the
6
+ * swap lands moves old-scene objects, and the adopted scene snaps them back
7
+ * to the written values — a human moving a three-cube selection "bit by bit"
8
+ * watched one member stay behind on every quick successive drag (runhuman
9
+ * passes 49/54, both ranked it their #1 fix). The design session builds the
10
+ * new world in parallel but awaits {@link whenLiveGestureIdle} before the
11
+ * swap, so a drag always completes on the objects it started on.
12
+ *
13
+ * Deliberately module-scoped and frameworkless: the setter is the viewport's
14
+ * `dragging-changed` handler and the consumer is the design session — no
15
+ * React context reaches both.
16
+ */
17
+
18
+ let active = 0;
19
+ let waiters: Array<() => void> = [];
20
+
21
+ export function beginLiveGesture(): void {
22
+ active += 1;
23
+ }
24
+
25
+ export function endLiveGesture(): void {
26
+ active = Math.max(0, active - 1);
27
+ if (active === 0) {
28
+ const resolved = waiters;
29
+ waiters = [];
30
+ for (const resolve of resolved) resolve();
31
+ }
32
+ }
33
+
34
+ /** Whether any gesture (a drag, or a gesture's still-landing write) holds
35
+ * the lock right now — the swap's settle loop re-checks this after each
36
+ * wait, because a lock taken in the same task that released the previous
37
+ * one can race a waiter that already resolved. */
38
+ export function liveGestureActive(): boolean {
39
+ return active > 0;
40
+ }
41
+
42
+ /** Resolves immediately when no gesture is running, else on the current
43
+ * gesture's end. */
44
+ export function whenLiveGestureIdle(): Promise<void> {
45
+ return active === 0
46
+ ? Promise.resolve()
47
+ : new Promise((resolve) => {
48
+ waiters.push(resolve);
49
+ });
50
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Reading the transform of a LIVE `Object3D` the editor did not write.
3
+ *
4
+ * THE TRAP, measured on the racing-game ingest (2026-08-15). A physics library
5
+ * that drives a node writes the node's MATRIX and turns matrix composition off:
6
+ * `@react-three/cannon`'s frame handler is literally
7
+ * `object.matrixAutoUpdate = false; object.matrix.copy(m)`. Three never
8
+ * decomposes that back, so `object.position`/`.quaternion`/`.scale` keep
9
+ * whatever they held when the body was created — forever. Everything derived
10
+ * from `matrixWorld` (selection brackets, bounds, three's own
11
+ * `TransformControls`) tracks the truth, while everything derived from
12
+ * `.position` shows the spawn point. Measured side by side: the driven chassis
13
+ * reported `[-110, 0.75, 220]` in the Inspector while the game's own state
14
+ * provider put it at `(-24.5, 0.85, 186.2)`.
15
+ *
16
+ * That mismatch is worse than a wrong number: origin markers and gizmo anchors
17
+ * derived from `.position` sit somewhere the object is not, while the bounding
18
+ * box around them is correct, so the editor contradicts itself on screen.
19
+ *
20
+ * THE RULE: **when a node owns its own matrix (`matrixAutoUpdate === false`),
21
+ * the MATRIX is the transform.** Decompose it — through three's own
22
+ * `Matrix4.decompose`, never a re-derivation. Otherwise the vector fields are
23
+ * authoritative and are read directly: deliberately not "always decompose",
24
+ * because for an ordinary node `matrix` is one frame BEHIND a write the editor
25
+ * just made, and reading it back would make a gizmo drag stutter.
26
+ *
27
+ * Nothing here is library-specific: the predicate is three's own flag, so any
28
+ * driver following the same convention (cannon, a custom integrator, an
29
+ * animation system baking matrices) is covered without naming it.
30
+ */
31
+
32
+ import * as THREE from 'three';
33
+
34
+ export interface LocalTransformRead {
35
+ readonly position: [number, number, number];
36
+ readonly quaternion: [number, number, number, number];
37
+ readonly scale: [number, number, number];
38
+ }
39
+
40
+ const _position = new THREE.Vector3();
41
+ const _quaternion = new THREE.Quaternion();
42
+ const _scale = new THREE.Vector3();
43
+
44
+ /**
45
+ * The node's LOCAL transform, from whichever of the two representations it
46
+ * actually maintains.
47
+ */
48
+ export function localTransformOf(object: THREE.Object3D): LocalTransformRead {
49
+ if (object.matrixAutoUpdate === false) {
50
+ object.matrix.decompose(_position, _quaternion, _scale);
51
+ return {
52
+ position: _position.toArray() as [number, number, number],
53
+ quaternion: _quaternion.toArray() as [number, number, number, number],
54
+ scale: _scale.toArray() as [number, number, number],
55
+ };
56
+ }
57
+ return {
58
+ position: object.position.toArray() as [number, number, number],
59
+ quaternion: object.quaternion.toArray() as [number, number, number, number],
60
+ scale: object.scale.toArray() as [number, number, number],
61
+ };
62
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Mount-failure report — D-W3: every manifest world's auto-launch route
3
+ * degrades to exactly one `editorConsole.error` line today (§0.4 — ground
4
+ * truth: the default Untitled scene is already showing by the time a manifest
5
+ * route fails, so a broken world mounts to what LOOKS like a normal empty
6
+ * project). This module is the structured half of the fix: a global mount-
7
+ * failure slot every manifest-route catch block populates.
8
+ *
9
+ * WHERE IT SHOWS — there is ONE error home, the editor's bottom surface, and
10
+ * this slot rides it rather than owning a surface of its own:
11
+ *
12
+ * 1. the `editorConsole.error` line each route already writes (the full
13
+ * trace lives there, and the status bar's `console-counts` counts it);
14
+ * 2. the status bar's `mount-failure` contribution
15
+ * (`../components/status-contributions.tsx`) — a sticky, danger-toned
16
+ * "N worlds failed to mount" item that names each world in its title and
17
+ * opens the Console on click. Sticky is the point: a dead world stays
18
+ * dead until it is fixed, so unlike a transient hint this item persists
19
+ * until the slot clears;
20
+ * 3. the Console utility is REVEALED on the empty→failing edge
21
+ * (`../workspace-utility-commands.ts`'s auto-open policy, the same one a
22
+ * failed build uses) — that reveal is what makes a mount failure loud
23
+ * without a second surface, and it is why the Console not being the
24
+ * default bottom tab is no longer an argument for one.
25
+ *
26
+ * A separate top-of-shell banner used to render this slot. It was a SECOND
27
+ * error home — users had to learn two places to look — and it is gone.
28
+ *
29
+ * D-V5 (composite): a composite manifest (one ingest world + siblings,
30
+ * `ingest-siblings.ts`) can fail SEVERAL roots independently in one mount
31
+ * attempt (a `default-three` sibling, a throwing `default-react` sibling, …)
32
+ * — a single-slot "last failure wins" model would silently drop every failure
33
+ * but the latest, the exact F9 anti-pattern this module exists to close. The
34
+ * slot is an ORDERED LIST: `addMountFailureReport` (deduped by `worldId` — a
35
+ * re-attempt for the SAME world replaces that world's entry in place, keeping
36
+ * list order stable), `getMountFailureReports()`,
37
+ * `clearMountFailureReports()`.
38
+ *
39
+ * The slot owns its own `subscribe` (same shape as
40
+ * `../asset-workflow/asset-materialization-report.ts`) rather than
41
+ * piggybacking on `EditorShellStore.subscribe`: the readers are no longer
42
+ * mounted inside a store-subscribed panel, and the per-world clears
43
+ * (`clearMountFailureReport`) run from root-level lifecycles that do not all
44
+ * broadcast a store notification. `getMountFailureReports()` returns a frozen
45
+ * snapshot whose identity changes only when the list does, so it is a valid
46
+ * `useSyncExternalStore` getSnapshot.
47
+ */
48
+
49
+ /** One manifest world's mount failure — the exact fields the status item shows. */
50
+ export interface MountFailureReport {
51
+ /** The failing world's manifest id (`ResolvedAdapterRoot.id`), or the
52
+ * vendored/fixture route's discovered game/folder id. */
53
+ readonly worldId: string;
54
+ /** The world's render substrate kind (`ResolvedAdapterRoot.kind`, e.g.
55
+ * `'three'`/`'canvas'`/`'react'`) — or, for the URL-fallback route
56
+ * (which has no `ResolvedAdapterRoot` to read a kind from), the same
57
+ * vocabulary inferred from which fixture glob resolved the id. */
58
+ readonly kind: string;
59
+ /** The resolved adapter identity (`ResolvedAdapter['identity']` — e.g.
60
+ * `'ingest-three'`/`'ingest-pixi'`/`'ingest-react'`/`'module'`). */
61
+ readonly identity: string;
62
+ /** The caught error's message — never the raw `Error` object (never
63
+ * fabricated; empty only if the thrown value truly stringifies empty). */
64
+ readonly message: string;
65
+ }
66
+
67
+ /** D-V5: an ORDERED list now backs the slot (insertion order — the order
68
+ * roots actually failed in, which for a composite's sibling loop is
69
+ * manifest order). Every accessor below is a thin view over this same
70
+ * array — never a second, parallel source of truth. Replaced wholesale
71
+ * rather than mutated so the snapshot identity is a real change signal. */
72
+ let _reports: readonly MountFailureReport[] = [];
73
+ const _listeners = new Set<() => void>();
74
+
75
+ function notify(): void {
76
+ for (const listener of _listeners) listener();
77
+ }
78
+
79
+ /** `useSyncExternalStore`-compatible subscribe for the status contribution
80
+ * and the Console auto-open policy. */
81
+ export function subscribeToMountFailures(callback: () => void): () => void {
82
+ _listeners.add(callback);
83
+ return () => {
84
+ _listeners.delete(callback);
85
+ };
86
+ }
87
+
88
+ /**
89
+ * D-V5: append one world's failure, deduped by `worldId` — a re-attempt for
90
+ * a world that already has an entry REPLACES it in place (keeps list order
91
+ * stable: retrying world B in `[A, B]` yields `[A, B']`, never `[A, B]` moved
92
+ * to the end).
93
+ */
94
+ export function addMountFailureReport(report: MountFailureReport): void {
95
+ const index = _reports.findIndex((r) => r.worldId === report.worldId);
96
+ if (index === -1) {
97
+ _reports = [..._reports, report];
98
+ } else {
99
+ const next = [..._reports];
100
+ next[index] = report;
101
+ _reports = next;
102
+ }
103
+ notify();
104
+ }
105
+
106
+ /** D-V5: every mount failure from the current attempt, oldest first. */
107
+ export function getMountFailureReports(): readonly MountFailureReport[] {
108
+ return _reports;
109
+ }
110
+
111
+ /** Drop every recorded failure — what a successful mount (or a torn-down
112
+ * session, which has nothing left to report) calls. */
113
+ export function clearMountFailureReports(): void {
114
+ if (_reports.length === 0) return;
115
+ _reports = [];
116
+ notify();
117
+ }
118
+
119
+ /**
120
+ * PD-1: drop ONE world's recorded failure — what a route that mounts a single
121
+ * world calls after that world mounts successfully.
122
+ *
123
+ * `clearMountFailureReports()` above is the whole-attempt reset an ingest/
124
+ * module route can afford because it owns the entire mount. The R3F design
125
+ * session and the design-time layer loop do NOT: they mount roots
126
+ * independently, so a blanket clear on one root's success would erase a
127
+ * SIBLING root's still-true failure — the exact D-V5 drop the ordered list
128
+ * exists to prevent. Keyed by the same `worldId` `addMountFailureReport`
129
+ * dedupes on, and a no-op when that world has no entry.
130
+ *
131
+ * Not clearing at all is what PD-1 measured: an R3F world that failed to mount
132
+ * once kept reporting that failure through `vgai status`'s "MOUNT FAILED —
133
+ * THIS WORLD IS NOT RUNNING" line (and the in-editor surface) for the rest of
134
+ * the page's life, including while the very same world was mounted and
135
+ * PLAYING. A diagnostic that cannot go back to healthy is worse than none.
136
+ */
137
+ export function clearMountFailureReport(worldId: string): void {
138
+ const index = _reports.findIndex((r) => r.worldId === worldId);
139
+ if (index === -1) return;
140
+ _reports = _reports.filter((_, i) => i !== index);
141
+ notify();
142
+ }
143
+
144
+ /**
145
+ * Build a `MountFailureReport['message']` from a caught value the same way
146
+ * every route's existing `editorConsole.error` line already stringifies it
147
+ * (`` `...failed: ${err}` `` — kept byte-for-byte at each call site so the
148
+ * console's full trace is unchanged) — an `Error`'s own `.message` reads
149
+ * better in a one-line summary than its `String(err)` form (`"Error: <msg>"`),
150
+ * so the report uses this instead of the console's template-literal form.
151
+ */
152
+ export function formatMountFailureMessage(err: unknown): string {
153
+ return err instanceof Error ? err.message : String(err);
154
+ }