@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,422 @@
1
+ /**
2
+ * Active system adapters the editor's authoring path coordinates with.
3
+ *
4
+ * A mounted game may expose `SystemAdapters` (physics / networking / …). The
5
+ * editor's gizmo-commit (through the `AuthoringAdapter.transforms` provider)
6
+ * consults THESE so it can:
7
+ * - freeze a physics-owned body while the gizmo edits it, then commit the edited
8
+ * pose to the body and resume (the `PhysicsAdapter` frozen-edit mode);
9
+ * - report a network-owned object's authority and keep remote/server-authoritative
10
+ * objects inspect-only (`NetworkingAdapter`).
11
+ *
12
+ * Play-mode (first-party) installs the first-party `RapierPhysicsAdapter` /
13
+ * `ColyseusNetworkingAdapter` here on enter and clears them on exit; an ingested
14
+ * game would install its own. The editor never names Rapier/Colyseus — only the
15
+ * `PhysicsAdapter` / `NetworkingAdapter` interfaces.
16
+ */
17
+
18
+ import type { SystemAdapters } from '@volter/editor-project/adapter';
19
+ import { nodeKeyedPhysics, type PhysicsAdapter } from '@volter/editor-project/adapter/system-adapter';
20
+ import { inspectSystemAdapterSeam } from '../coverage/system-seam-evidence';
21
+
22
+ let _systems: SystemAdapters = {};
23
+ let _editModeAudio: SystemAdapters['audio'] | null = null;
24
+ let _editModeNetworking: SystemAdapters['networking'] | null = null;
25
+ const _networkingListeners = new Set<() => void>();
26
+ const _audioListeners = new Set<() => void>();
27
+ const _navigationListeners = new Set<() => void>();
28
+ let _audioVersion = 0;
29
+
30
+ function notifyNavigationChanged(): void {
31
+ for (const listener of _navigationListeners) listener();
32
+ }
33
+
34
+ function notifyNetworkingChanged(previous: SystemAdapters['networking'] | null): void {
35
+ if (previous === getActiveNetworking()) return;
36
+ for (const listener of _networkingListeners) listener();
37
+ }
38
+
39
+ function notifyAudioChanged(
40
+ previous: SystemAdapters['audio'] | null,
41
+ previousAll: readonly NonNullable<SystemAdapters['audio']>[],
42
+ ): void {
43
+ const nextAll = getAllActiveAudio();
44
+ if (
45
+ previous === getActiveAudio() &&
46
+ previousAll.length === nextAll.length &&
47
+ previousAll.every((adapter, index) => adapter === nextAll[index])
48
+ )
49
+ return;
50
+ _audioVersion++;
51
+ for (const listener of _audioListeners) listener();
52
+ }
53
+
54
+ /**
55
+ * MULTI-INSTANCE: every mounted instance's adapters, keyed by mount id.
56
+ *
57
+ * Three DIFFERENT questions are asked of this module and conflating them is the
58
+ * bug to avoid:
59
+ *
60
+ * - "the PRIMARY authoring mount" — hierarchy selection, gizmo commit, and
61
+ * source-backed editing. That is what {@link getActiveSystems} continues
62
+ * to mean; a runtime-context click must never retarget source authoring.
63
+ * - "the instance whose RUNTIME I am inspecting" — Profiler, Frame, Audio,
64
+ * Network, and runtime status. {@link getInspectedSystems} follows the
65
+ * explicit Inspect selector (and the normal click-to-focus gesture).
66
+ * - "the instance I ADDRESSED" — the CLI session wire
67
+ * (`vgai eval`/`e2e` → `command-listener.ts`). With one instance the two
68
+ * coincide, which is exactly why a single `let` worked and why nothing
69
+ * noticed it was implicit; with several, resolving an addressed command
70
+ * through editor focus would let a bot drive whichever game the user last
71
+ * clicked. {@link systemsForInstance} answers this one.
72
+ */
73
+ const _byInstance = new Map<string, SystemAdapters>();
74
+ let _inspectedInstanceId: string | null = null;
75
+ let _inspectedVersion = 0;
76
+ const _inspectedListeners = new Set<() => void>();
77
+
78
+ /** The mount id of a single-instance session. */
79
+ const SOLO_INSTANCE = '';
80
+
81
+ function assertSystemAdapterShapes(systems: SystemAdapters, mountId: string): void {
82
+ const slots = [
83
+ 'physics',
84
+ 'networking',
85
+ 'navigation',
86
+ 'audio',
87
+ 'camera',
88
+ 'debug',
89
+ 'renderDebug',
90
+ ] as const satisfies readonly (keyof SystemAdapters)[];
91
+ for (const slot of slots) {
92
+ const adapter = systems[slot];
93
+ if (!adapter) continue;
94
+ const verdict = inspectSystemAdapterSeam({
95
+ slot,
96
+ adapter: adapter as NonNullable<SystemAdapters[typeof slot]>,
97
+ subject: mountId || 'game',
98
+ });
99
+ if (verdict.state === 'failed') {
100
+ throw new Error(`system adapter refused: ${verdict.detail}`);
101
+ }
102
+ }
103
+ }
104
+
105
+ function resolvedInspectedInstanceId(): string | null {
106
+ if (_inspectedInstanceId !== null && _byInstance.has(_inspectedInstanceId)) {
107
+ return _inspectedInstanceId;
108
+ }
109
+ return _byInstance.keys().next().value ?? null;
110
+ }
111
+
112
+ function notifyInspectedSystems(): void {
113
+ _inspectedVersion++;
114
+ for (const listener of _inspectedListeners) listener();
115
+ }
116
+
117
+ /** Select which live mount the runtime instruments inspect. This never changes
118
+ * the authoring adapter, hierarchy, scene selection, or addressed automation. */
119
+ export function setInspectedInstance(mountId: string | null): void {
120
+ const previous = resolvedInspectedInstanceId();
121
+ _inspectedInstanceId = mountId;
122
+ if (previous !== resolvedInspectedInstanceId()) {
123
+ notifyInspectedSystems();
124
+ _audioVersion++;
125
+ for (const listener of _networkingListeners) listener();
126
+ for (const listener of _audioListeners) listener();
127
+ }
128
+ }
129
+
130
+ export function inspectedInstanceId(): string | null {
131
+ return resolvedInspectedInstanceId();
132
+ }
133
+
134
+ export function subscribeInspectedInstance(listener: () => void): () => void {
135
+ _inspectedListeners.add(listener);
136
+ return () => _inspectedListeners.delete(listener);
137
+ }
138
+
139
+ export function inspectedInstanceVersion(): number {
140
+ return _inspectedVersion;
141
+ }
142
+
143
+ export function getInspectedSystems(): SystemAdapters {
144
+ const id = resolvedInspectedInstanceId();
145
+ return (id === null ? undefined : _byInstance.get(id)) ?? _systems;
146
+ }
147
+
148
+ /** Install a mounted game's System adapters (play-mode on enter).
149
+ *
150
+ * `mountId` omitted is the solo case — today's every caller. Passing `null`
151
+ * systems unregisters the instance, so a stopped instance stops being
152
+ * addressable rather than lingering as an empty bag that answers commands. */
153
+ export function setActiveSystems(systems: SystemAdapters | null, mountId = SOLO_INSTANCE): void {
154
+ const previousInspected = resolvedInspectedInstanceId();
155
+ const previousNetworking = getActiveNetworking();
156
+ const previousAudio = getActiveAudio();
157
+ const previousAllAudio = getAllActiveAudio();
158
+ if (systems) {
159
+ assertSystemAdapterShapes(systems, mountId);
160
+ _byInstance.set(mountId, systems);
161
+ // Preserve the historical primary-authoring aggregate. Runtime instruments
162
+ // resolve through `_inspectedInstanceId` instead of silently inheriting it.
163
+ _systems = systems;
164
+ notifyNetworkingChanged(previousNetworking);
165
+ notifyAudioChanged(previousAudio, previousAllAudio);
166
+ notifyNavigationChanged();
167
+ if (previousInspected !== resolvedInspectedInstanceId()) notifyInspectedSystems();
168
+ return;
169
+ }
170
+ _byInstance.delete(mountId);
171
+ // Unregistering a seat must NOT blank editor focus while OTHER instances are
172
+ // still live — that reset `_systems = {}` left mute/debug/profiler/gizmo dead
173
+ // for the rest of a split session when any additional seat was removed. Fall
174
+ // back to a remaining instance (the primary is the first-inserted entry) and
175
+ // only go empty when the last instance is gone.
176
+ _systems = _byInstance.values().next().value ?? {};
177
+ notifyNetworkingChanged(previousNetworking);
178
+ notifyAudioChanged(previousAudio, previousAllAudio);
179
+ notifyNavigationChanged();
180
+ if (previousInspected !== resolvedInspectedInstanceId()) notifyInspectedSystems();
181
+ }
182
+
183
+ /**
184
+ * Unregister EVERY instance — the previous project's session is over.
185
+ * Registered with `onProjectSessionEnd`.
186
+ *
187
+ * Instances are unregistered one at a time by the mount that owns them, and a
188
+ * project switch is the one path that ends every mount at once without any of
189
+ * them running its own teardown. A registry left populated across a switch
190
+ * keeps the OLD game's physics/networking/audio/debug adapters answering the
191
+ * gizmo, the instruments and the CLI wire under the new project.
192
+ *
193
+ * Routed through `setActiveSystems(null, id)` per instance rather than clearing
194
+ * the map, so the networking/audio/navigation/inspected notifications fire
195
+ * exactly as they do for a normal unregister.
196
+ */
197
+ export function resetActiveSystemsForNewProject(): void {
198
+ for (const id of [..._byInstance.keys()]) setActiveSystems(null, id);
199
+ setInspectedInstance(null);
200
+ }
201
+
202
+ /** Refresh one mounted instance's late-registered adapters without stealing
203
+ * editor focus from a different instance. */
204
+ export function updateInstanceSystems(systems: SystemAdapters, mountId = SOLO_INSTANCE): void {
205
+ const previousNetworking = getActiveNetworking();
206
+ const previousAudio = getActiveAudio();
207
+ const previousAllAudio = getAllActiveAudio();
208
+ const previousSystems = _byInstance.get(mountId);
209
+ assertSystemAdapterShapes(systems, mountId);
210
+ _byInstance.set(mountId, systems);
211
+ if (_systems === previousSystems) _systems = systems;
212
+ notifyNetworkingChanged(previousNetworking);
213
+ notifyAudioChanged(previousAudio, previousAllAudio);
214
+ notifyNavigationChanged();
215
+ if (resolvedInspectedInstanceId() === mountId) notifyInspectedSystems();
216
+ }
217
+
218
+ /** The primary AUTHORING mount's adapters — hierarchy/gizmo/source consumers. */
219
+ export function getActiveSystems(): SystemAdapters {
220
+ return _systems;
221
+ }
222
+
223
+ /** Observe replacement or late registration of the primary authoring mount's
224
+ * navigation adapter. The navmesh UI binds to this instead of constructing an
225
+ * editor-owned navigation implementation. */
226
+ export function subscribeActiveNavigation(listener: () => void): () => void {
227
+ _navigationListeners.add(listener);
228
+ return () => _navigationListeners.delete(listener);
229
+ }
230
+
231
+ /** Live instance ids, for error messages and for the CLI's own listing. */
232
+ export function liveInstanceIds(): string[] {
233
+ return [..._byInstance.keys()];
234
+ }
235
+
236
+ /**
237
+ * The live ids as a reader can ACT on them.
238
+ *
239
+ * The solo instance's id is the empty string, so the obvious
240
+ * `ids.map(i => `"${i}"`)` renders it as `live instances: ""` — an id nobody
241
+ * can name, in the message whose entire job is to say what to name instead.
242
+ * Found by driving a real editor; every unit test used named instances and
243
+ * none of them could see it.
244
+ */
245
+ function describeInstances(ids: readonly string[]): string {
246
+ const named = ids.filter((id) => id !== SOLO_INSTANCE);
247
+ const hasSolo = ids.length > named.length;
248
+ const parts = named.map((id) => `"${id}"`);
249
+ if (hasSolo) parts.push('the unnamed default (address it with no id at all)');
250
+ return parts.join(', ');
251
+ }
252
+
253
+ /** Raised when an addressed command cannot name exactly one instance. Carries
254
+ * the live ids so the caller can say WHICH, never just "ambiguous". */
255
+ export class InstanceResolutionError extends Error {
256
+ readonly instances: string[];
257
+ constructor(message: string, instances: string[]) {
258
+ super(message);
259
+ this.name = 'InstanceResolutionError';
260
+ this.instances = instances;
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Resolve an ADDRESSED instance's adapters for the session wire.
266
+ *
267
+ * The rule deliberately mirrors `vgai edit`'s session selection rather than
268
+ * inventing a second one: take the unambiguous case silently, refuse the
269
+ * ambiguous one BY NAME, and never guess.
270
+ *
271
+ * - explicit id → that instance, or a named error listing what exists;
272
+ * - omitted, one → that one (every existing call is unchanged);
273
+ * - omitted, several → refuse, naming the live instances.
274
+ *
275
+ * The last is the point. Silently picking the newest is how a bot drives the
276
+ * wrong player while every log line still reads as success — the failure is
277
+ * invisible in exactly the situation multi-instance exists to create.
278
+ */
279
+ export function systemsForInstance(mountId?: string): SystemAdapters {
280
+ const ids = liveInstanceIds();
281
+ if (mountId !== undefined) {
282
+ const found = _byInstance.get(mountId);
283
+ if (found) return found;
284
+ throw new InstanceResolutionError(
285
+ ids.length === 0
286
+ ? `no instance "${mountId}" — no game is mounted`
287
+ : `no instance "${mountId}" — live: ${describeInstances(ids)}`,
288
+ ids,
289
+ );
290
+ }
291
+ if (ids.length === 1) return _byInstance.get(ids[0]!)!;
292
+ if (ids.length === 0) return _systems; // global adapters before a root instance registers
293
+ throw new InstanceResolutionError(
294
+ `${ids.length} instances are live (${describeInstances(ids)}) — ` +
295
+ 'name one in your program (`game.instance(id)`, or `await game.instances()` ' +
296
+ 'for handles); refusing to guess',
297
+ ids,
298
+ );
299
+ }
300
+
301
+ /**
302
+ * The focused game's physics carrier AS A NODE-ID-KEYED ONE — `null` when the
303
+ * slot holds a canvas mount's display-keyed carrier
304
+ * (`@vgai/game-runtime/pixi/system-adapters`).
305
+ *
306
+ * That narrowing is the point rather than a formality: this registry is
307
+ * game-scoped and surface-blind, so with a canvas game focused the slot really
308
+ * can hold a carrier whose `freeze(display: Container)` a three consumer would
309
+ * be calling with a node-id string. The canvas lane never reads this — its
310
+ * gizmo path holds its own carrier (`ingest/mount-canvas-ingest-root.ts` →
311
+ * `authoring/pixi-live-write-target.ts`), already resolved to display objects.
312
+ */
313
+ export function getActivePhysics(): PhysicsAdapter | null {
314
+ return nodeKeyedPhysics(_systems.physics);
315
+ }
316
+
317
+ /** The focused game's optional camera-controller introspection seam. Camera
318
+ * authoring itself stays on the active AuthoringAdapter; this is runtime-only
319
+ * ownership/priority/blend state for the selected native camera. */
320
+ export function getActiveCamera(): NonNullable<SystemAdapters['camera']> | null {
321
+ return _systems.camera ?? null;
322
+ }
323
+
324
+ export function getActiveNetworking(): NonNullable<SystemAdapters['networking']> | null {
325
+ return _systems.networking ?? _editModeNetworking ?? null;
326
+ }
327
+
328
+ export function getInspectedNetworking(): NonNullable<SystemAdapters['networking']> | null {
329
+ return getInspectedSystems().networking ?? _editModeNetworking ?? null;
330
+ }
331
+
332
+ /** Observe replacement of the effective networking adapter. Runtime adapters
333
+ * may register after Play has entered, so consumers must be able to move off
334
+ * the edit-time declaration and onto the live room without polling. */
335
+ export function subscribeActiveNetworking(listener: () => void): () => void {
336
+ _networkingListeners.add(listener);
337
+ return () => _networkingListeners.delete(listener);
338
+ }
339
+
340
+ /** Install the editor's edit-time networking seam — the declared server config
341
+ * and authored player identity a multiplayer project exposes with no game
342
+ * running. Play-mode's `setActiveSystems` temporarily overrides it with the
343
+ * mounted game's live adapter; on Stop, `getActiveNetworking()` falls back to
344
+ * this one. Passing `null` clears it (a project with no declared server never
345
+ * installs one, so networking presence stays meaningful). Mirrors
346
+ * `setEditModeAudio`. */
347
+ export function setEditModeNetworking(networking: SystemAdapters['networking'] | null): void {
348
+ const previousNetworking = getActiveNetworking();
349
+ _editModeNetworking = networking;
350
+ notifyNetworkingChanged(previousNetworking);
351
+ }
352
+
353
+ /** The active game's debug seam (`DebugAdapter`) —
354
+ * installed with the whole bag by play-mode's `setActiveSystems`, read by
355
+ * the State Watch utility and the CLI command relay. Null
356
+ * outside play (or for a mount exposing no debug adapter) — the panels'
357
+ * hide signal. */
358
+ export function getActiveDebug(): SystemAdapters['debug'] | null {
359
+ return _systems.debug ?? null;
360
+ }
361
+
362
+ /** Install the editor project's real first-party audio graph. Play-mode may
363
+ * temporarily override it with the mounted game's adapter; clearing the
364
+ * session restores this edit-mode adapter instead of making audio disappear. */
365
+ export function setEditModeAudio(audio: SystemAdapters['audio'] | null): void {
366
+ const previousAudio = getActiveAudio();
367
+ const previousAllAudio = getAllActiveAudio();
368
+ _editModeAudio = audio;
369
+ notifyAudioChanged(previousAudio, previousAllAudio);
370
+ }
371
+
372
+ /** The active audio seam (`AudioAdapter` + W3c introspection capabilities).
373
+ * A running game's adapter takes precedence; otherwise the editor project's
374
+ * real audio graph remains available for authoring and preview. */
375
+ export function getActiveAudio(): SystemAdapters['audio'] | null {
376
+ return _systems.audio ?? _editModeAudio;
377
+ }
378
+
379
+ export function getInspectedAudio(): SystemAdapters['audio'] | null {
380
+ return getInspectedSystems().audio ?? _editModeAudio;
381
+ }
382
+
383
+ /** Observe replacement of the effective audio adapter. Header telemetry and
384
+ * the Audio debugger acquire real meter handles whose lifetime must follow
385
+ * that identity exactly; polling adapter identity would leave analyser taps
386
+ * attached for up to a tick after a world was replaced. */
387
+ export function subscribeActiveAudio(listener: () => void): () => void {
388
+ _audioListeners.add(listener);
389
+ return () => _audioListeners.delete(listener);
390
+ }
391
+
392
+ /** `useSyncExternalStore` snapshot for {@link subscribeActiveAudio}. */
393
+ export function activeAudioVersion(): number {
394
+ return _audioVersion;
395
+ }
396
+
397
+ /** EVERY live instance's audio adapter (plus edit-mode audio when nothing is
398
+ * playing). Mute must silence the WHOLE split — with N seats, muting only the
399
+ * focused/primary one leaves the other N-1 games audible with no way to
400
+ * quiet them. De-duplicated by identity (seats may share an adapter). */
401
+ export function getAllActiveAudio(): NonNullable<SystemAdapters['audio']>[] {
402
+ const out = new Set<NonNullable<SystemAdapters['audio']>>();
403
+ for (const systems of _byInstance.values()) {
404
+ if (systems.audio) out.add(systems.audio);
405
+ }
406
+ if (out.size === 0 && _editModeAudio) out.add(_editModeAudio);
407
+ return [...out];
408
+ }
409
+
410
+ /** The active game's render-debug seam (`RenderDebugAdapter` + the W4b F11
411
+ * frame-capture / render-memory capabilities) — installed with the whole bag
412
+ * by play-mode's `setActiveSystems`, read by the Frame debugger tab and the
413
+ * Profiler's Memory view. Null outside a running game session, or for a
414
+ * headless/non-real-context mount that registers none (the surface renders
415
+ * the honest register-an-adapter notice; it never fabricates a draw list). */
416
+ export function getActiveRenderDebug(): SystemAdapters['renderDebug'] | null {
417
+ return _systems.renderDebug ?? null;
418
+ }
419
+
420
+ export function getInspectedRenderDebug(): SystemAdapters['renderDebug'] | null {
421
+ return getInspectedSystems().renderDebug ?? null;
422
+ }
@@ -0,0 +1,18 @@
1
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
2
+
3
+ let nextKey = 1;
4
+ const keys = new WeakMap<AuthoringAdapter, number>();
5
+
6
+ /**
7
+ * Adapter-owned UI state must not outlive the adapter that created it.
8
+ * Remounting also keeps React DEV prop-diff instrumentation from traversing
9
+ * live renderer objects and invoking their legacy getters on adapter handoff.
10
+ */
11
+ export function authoringAdapterKey(adapter: AuthoringAdapter | undefined): number {
12
+ if (!adapter) return 0;
13
+ const existing = keys.get(adapter);
14
+ if (existing !== undefined) return existing;
15
+ const key = nextKey++;
16
+ keys.set(adapter, key);
17
+ return key;
18
+ }
@@ -0,0 +1,27 @@
1
+ import type { AuthoringAssetSubject } from '@volter/editor-project/adapter';
2
+
3
+ const SVG_XMLNS = 'http://www.w3.org/2000/svg';
4
+
5
+ /**
6
+ * HTML gives an embedded `<svg>` its namespace implicitly, so `outerHTML`
7
+ * commonly omits `xmlns`. An `<img>` data URL is a standalone XML document
8
+ * and needs the namespace spelled out. Preserve an adapter that already
9
+ * supplied one and otherwise add it to the root SVG start tag.
10
+ */
11
+ export function standaloneSvgMarkup(markup: string): string {
12
+ const root = /<svg\b/i.exec(markup);
13
+ if (!root) return markup;
14
+ const tagEnd = markup.indexOf('>', root.index);
15
+ if (tagEnd < 0) return markup;
16
+ const startTag = markup.slice(root.index, tagEnd + 1);
17
+ if (/\sxmlns\s*=/.test(startTag)) return markup;
18
+ const insertAt = root.index + root[0].length;
19
+ return `${markup.slice(0, insertAt)} xmlns="${SVG_XMLNS}"${markup.slice(insertAt)}`;
20
+ }
21
+
22
+ /** A browser-safe URL for an adapter-owned in-memory image asset. */
23
+ export function authoringAssetDataUrl(subject: AuthoringAssetSubject): string {
24
+ const text =
25
+ subject.mediaType === 'image/svg+xml' ? standaloneSvgMarkup(subject.text) : subject.text;
26
+ return `data:${subject.mediaType};charset=utf-8,${encodeURIComponent(text)}`;
27
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Editor-session authoring bootstrap readiness.
3
+ *
4
+ * The workspace restores before a project's async authoring adapter
5
+ * necessarily exists. During that interval, "no Inspector subject" is UNKNOWN rather
6
+ * than a final answer: destructively reconciling it removes the user's saved
7
+ * Inspector group, and the later adapter mount can only recreate that group
8
+ * at its default position. This tiny project-keyed signal lets workspace
9
+ * geometry preserve optional authoring chrome until the real adapter has
10
+ * answered once. State is keyed by the session's EditorShellStore, so closing
11
+ * and reopening the same project cannot inherit a previous mount's readiness.
12
+ */
13
+
14
+ import type { EditorShellStore } from '../editor-shell-store';
15
+
16
+ type BootstrapState = {
17
+ readonly generation: number;
18
+ readonly settled: boolean;
19
+ };
20
+
21
+ const states = new WeakMap<EditorShellStore, BootstrapState>();
22
+ const listeners = new Set<() => void>();
23
+
24
+ function notify(): void {
25
+ for (const listener of listeners) listener();
26
+ }
27
+
28
+ /** Begin one bootstrap generation and return its race-safe completion hook. */
29
+ export function beginAuthoringBootstrap(store: EditorShellStore): () => void {
30
+ const generation = (states.get(store)?.generation ?? 0) + 1;
31
+ states.set(store, { generation, settled: false });
32
+ notify();
33
+ return () => {
34
+ const current = states.get(store);
35
+ if (!current || current.generation !== generation || current.settled) return;
36
+ states.set(store, { generation, settled: true });
37
+ notify();
38
+ };
39
+ }
40
+
41
+ /** False before this project's first real adapter bootstrap has completed. */
42
+ export function authoringBootstrapSettled(store: EditorShellStore): boolean {
43
+ return states.get(store)?.settled === true;
44
+ }
45
+
46
+ export function subscribeAuthoringBootstrap(listener: () => void): () => void {
47
+ listeners.add(listener);
48
+ return () => listeners.delete(listener);
49
+ }