@volter/editor-game 0.5.65 → 0.5.67

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 (281) hide show
  1. package/contributions/audio-unlock.service.ts +2 -2
  2. package/contributions/autoplay.service.ts +1 -1
  3. package/contributions/bridge.command.ts +3 -3
  4. package/contributions/canvas/component-board.service.ts +16 -0
  5. package/contributions/canvas/design-time-mount.service.ts +45 -0
  6. package/contributions/canvas-story-capture.service.ts +12 -0
  7. package/contributions/edit-mode-audio.service.ts +2 -2
  8. package/contributions/edit-mode-networking.service.ts +1 -1
  9. package/contributions/gameplay.command.ts +4 -4
  10. package/contributions/generation.service.ts +3 -3
  11. package/contributions/generations.status.tsx +1 -1
  12. package/contributions/godot.palette.json +99 -0
  13. package/contributions/godot.style.ts +82 -0
  14. package/contributions/godot.view.ts +75 -0
  15. package/contributions/ingest.service.ts +4 -4
  16. package/contributions/instances.command.ts +1 -1
  17. package/contributions/navmesh.menu.ts +1 -1
  18. package/contributions/network-observer.service.ts +14 -0
  19. package/contributions/play.command.ts +11 -5
  20. package/contributions/react/component-board.service.ts +1 -1
  21. package/contributions/react/design-time-mount.service.ts +1 -1
  22. package/contributions/react/react-inspector.service.ts +2 -2
  23. package/contributions/scene-document.service.ts +5 -5
  24. package/contributions/state-watch.menu.ts +1 -1
  25. package/contributions/state-watch.utility.tsx +1 -1
  26. package/contributions/team-playtest.service.ts +4 -4
  27. package/contributions/three/component-board.service.ts +1 -1
  28. package/contributions/three/component-verbs.command.ts +8 -8
  29. package/contributions/three/three-authoring.service.ts +8 -5
  30. package/contributions/three-story-capture.service.ts +12 -0
  31. package/contributions/unity.palette.json +102 -0
  32. package/contributions/unity.style.ts +72 -0
  33. package/contributions/unity.view.ts +82 -0
  34. package/contributions/unreal.palette.json +105 -0
  35. package/contributions/unreal.style.ts +66 -0
  36. package/contributions/unreal.view.ts +93 -0
  37. package/dist-node/serving.mjs +16 -0
  38. package/package.json +33 -16
  39. package/serving/index.ts +27 -0
  40. package/src/asset-budget/AssetBudgetPanel.tsx +1 -1
  41. package/src/asset-budget/asset-budget-model.ts +4 -4
  42. package/src/asset-budget/optimize-apply.ts +7 -7
  43. package/src/audio/AudioDebuggerPanel.tsx +1 -1
  44. package/src/bridge/dispatch.ts +16 -16
  45. package/src/bridge/live-frames.ts +1 -1
  46. package/src/bridge/screenshot.ts +6 -6
  47. package/src/build/BuildProfilesPanel.tsx +3 -3
  48. package/src/canvas/canvas-board/CanvasBoardDocument.tsx +676 -0
  49. package/src/canvas/canvas-board/canvas-board-model.ts +407 -0
  50. package/src/canvas/canvas-board/canvas-component-board.ts +56 -0
  51. package/src/canvas/canvas-design-mount.ts +524 -0
  52. package/src/canvas/design-time-canvas-mount.ts +79 -0
  53. package/src/coverage/live-authoring-surface.ts +6 -6
  54. package/src/coverage/live-project-verbs.ts +2 -2
  55. package/src/coverage/native-system-coverage.ts +6 -6
  56. package/src/coverage/root-coverage.ts +1 -1
  57. package/src/coverage/session-coverage.ts +5 -5
  58. package/src/design-system-stories/ApplicationChrome.stories.tsx +5 -5
  59. package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +13 -53
  60. package/src/edit-mode/edit-mode-audio.ts +4 -4
  61. package/src/edit-mode/edit-mode-networking.ts +2 -2
  62. package/src/game-document/GameCaptureFrameButton.tsx +2 -2
  63. package/src/game-document/GameDocument.tsx +2 -2
  64. package/src/game-document/GamePanel.tsx +8 -8
  65. package/src/game-document/InstanceInspectorPicker.tsx +2 -2
  66. package/src/game-document/crowd-debug.ts +1 -1
  67. package/src/game-document/device-preview.ts +10 -11
  68. package/src/game-document/physics-debug.ts +1 -1
  69. package/src/generation/GenerationActivity.tsx +6 -8
  70. package/src/generation/generation-documents.tsx +8 -8
  71. package/src/generation/generation-jobs.ts +2 -2
  72. package/src/generation/generation-presentation.ts +1 -1
  73. package/src/host/adapter-reach.ts +1 -1
  74. package/src/host/adapter-runtime-bindings.ts +97 -6
  75. package/src/host/api/configurations.ts +2 -2
  76. package/src/host/authoring/babylon-authoring-adapter.ts +8 -8
  77. package/src/host/authoring/contract-hierarchy-authoring.ts +1 -1
  78. package/src/host/authoring/contract-scenes-stories.ts +1 -1
  79. package/src/host/authoring/creation-site-related.ts +2 -2
  80. package/src/host/authoring/ephemeral-persistence.ts +1 -1
  81. package/src/host/authoring/gesture-persist.ts +2 -2
  82. package/src/host/authoring/ingest-data-writer.ts +1 -1
  83. package/src/host/authoring/ingest-source-persistence.ts +8 -8
  84. package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
  85. package/src/host/authoring/mounted-authoring.ts +4 -4
  86. package/src/host/authoring/phaser-live-authoring-adapter.ts +4 -4
  87. package/src/host/authoring/pixi-authoring-adapter.ts +42 -17
  88. package/src/host/authoring/pixi-creation-site-write-target.ts +2 -2
  89. package/src/host/authoring/pixi-live-write-target.ts +7 -7
  90. package/src/host/authoring/pixi-source-identity.ts +3 -3
  91. package/src/host/authoring/pixi-source-write-target.ts +1614 -0
  92. package/src/host/authoring/pixi-still-presentation.ts +2 -2
  93. package/src/host/authoring/pixi-structure-history.ts +3 -3
  94. package/src/host/authoring/pixi-transform-channels.ts +16 -14
  95. package/src/host/authoring/source-persistence-backend.ts +6 -6
  96. package/src/host/authoring/struct-write-pipe.ts +3 -3
  97. package/src/host/binding-resolver.ts +8 -9
  98. package/src/host/browser-transpile.ts +2 -2
  99. package/src/host/canvas-entry-runtime.ts +59 -48
  100. package/src/host/canvas-preview-frames.ts +482 -0
  101. package/src/host/components/CameraAuthoringOverlay.tsx +1 -1
  102. package/src/host/components/HeaderTelemetry.tsx +9 -16
  103. package/src/host/components/PixiIsolationSceneContent.tsx +17 -16
  104. package/src/host/components/ThreeIsolationSceneContent.tsx +5 -5
  105. package/src/host/components/frame-debugger-model.ts +2 -2
  106. package/src/host/components/header-telemetry-model.ts +2 -2
  107. package/src/host/components/scene-document.tsx +29 -61
  108. package/src/host/components/utility-view-state.ts +1 -1
  109. package/src/host/components/world-root-stage-binding.tsx +17 -26
  110. package/src/host/components/world-root-stage.ts +130 -63
  111. package/src/host/coverage/capability-coverage.ts +13 -1
  112. package/src/host/coverage/game-contract-seam-evidence.ts +1 -1
  113. package/src/host/coverage/project-verb-coverage.ts +2 -17
  114. package/src/host/coverage/system-adapter-coverage.ts +4 -5
  115. package/src/host/design-system-stories/fixtures/editor-runtime.tsx +14 -8
  116. package/src/host/document-preview-three.ts +2 -2
  117. package/src/host/entry-adjudication.ts +6 -6
  118. package/src/host/game-css-scope-transform.ts +4 -0
  119. package/src/host/game-module-access.ts +1 -1
  120. package/src/host/game-realm-page.ts +16 -8
  121. package/src/host/game-realm-reclaim.ts +1 -1
  122. package/src/host/gameplay-export.ts +25 -14
  123. package/src/host/gameplay-recording.ts +5 -5
  124. package/src/host/gated-globals.ts +6 -6
  125. package/src/host/history/json-history-resource.ts +3 -3
  126. package/src/host/instance-extract-actions.ts +1 -1
  127. package/src/host/instance-fork-actions.ts +1 -1
  128. package/src/host/projection/dom.ts +2 -2
  129. package/src/host/projection/pixi.ts +25 -3
  130. package/src/host/r3f-entry-runtime.ts +65 -34
  131. package/src/host/react-mount-runtime.ts +8 -49
  132. package/src/host/realm-services.ts +2 -2
  133. package/src/host/roots/canvas-root.tsx +361 -0
  134. package/src/host/roots/module-root.ts +1 -1
  135. package/src/host/roots/r3f-root.tsx +473 -0
  136. package/src/host/roots/react-root.ts +9 -43
  137. package/src/host/scene-view-drawability.ts +2 -2
  138. package/src/host/served-bundle-runtime-modules.ts +1 -19
  139. package/src/host/server-log-bridge.ts +3 -3
  140. package/src/host/stories/mounted-story-viewport-source.ts +1 -1
  141. package/src/host/stories/pixi-story-model.ts +30 -0
  142. package/src/host/stories/story-media-captures.ts +46 -0
  143. package/src/host/stories/story-media-presence.ts +3 -3
  144. package/src/host/stories/story-pixi-preview.ts +408 -0
  145. package/src/host/stories/story-three-preview.ts +806 -0
  146. package/src/host/stories/three-story-captures.ts +35 -0
  147. package/src/host/story-three-preview-runtime.ts +56 -0
  148. package/src/host/three-ingest-runtime.ts +1 -1
  149. package/src/host/use-active-performance-source.ts +3 -3
  150. package/src/host/viewport-pose-memory.ts +1 -1
  151. package/src/host/viewport-root-presentation.ts +6 -5
  152. package/src/ingest/active-ingest.ts +2 -2
  153. package/src/ingest/authoring/ingest-dom-surface-authoring.ts +4 -4
  154. package/src/ingest/authoring/ingest-root-adapter.ts +13 -13
  155. package/src/ingest/capture-wait-report.ts +1 -1
  156. package/src/ingest/deferred-ingest-play.ts +11 -10
  157. package/src/ingest/discovery-public-ingest.ts +2 -2
  158. package/src/ingest/ingest-boot-viewport.ts +6 -8
  159. package/src/ingest/ingest-canvas-scene-document.tsx +17 -16
  160. package/src/ingest/ingest-canvas-scene.ts +5 -8
  161. package/src/ingest/ingest-evidence-hook.ts +1 -1
  162. package/src/ingest/ingest-frame-snapshot.ts +1 -1
  163. package/src/ingest/ingest-play-control.ts +4 -4
  164. package/src/ingest/ingest-render-debug.ts +11 -11
  165. package/src/ingest/ingest-siblings.ts +16 -28
  166. package/src/ingest/module-mode.ts +18 -19
  167. package/src/ingest/mount-canvas-ingest-root.ts +27 -27
  168. package/src/ingest/mount-coverage.ts +4 -4
  169. package/src/ingest/mount-dom-ingest-root.ts +16 -16
  170. package/src/ingest/mount-ingest-root.ts +14 -14
  171. package/src/ingest/mount-three-ingest-root.ts +12 -12
  172. package/src/ingest/resolve-canvas.ts +1 -1
  173. package/src/ingest/served-html-boot.ts +1 -1
  174. package/src/ingest/surface-canvas.ts +1 -1
  175. package/src/ingest/unmount-ingest-root.ts +7 -7
  176. package/src/navmesh/navmesh-handler.ts +24 -16
  177. package/src/network/NetworkInspectorPanel.tsx +449 -14
  178. package/src/network/network-inspector-model.ts +14 -2
  179. package/src/play/play-log-events.ts +1 -1
  180. package/src/play/play-mode.ts +99 -142
  181. package/src/play/play-recording.ts +2 -2
  182. package/src/play/react-play-live-authoring.ts +3 -3
  183. package/src/play/run-selection.ts +93 -0
  184. package/src/play-bar/PlayBar.tsx +20 -39
  185. package/src/profiler/FrameDebuggerPanel.tsx +1 -1
  186. package/src/profiler/PerformancePanel.tsx +4 -4
  187. package/src/react/design-time-react-mount.ts +37 -85
  188. package/src/react/dom-authoring-adapter.ts +11 -11
  189. package/src/react/react-inspector-section.tsx +13 -13
  190. package/src/react/react-world-authoring-adapter.ts +31 -143
  191. package/src/react/story-documents/story-documents.tsx +18 -22
  192. package/src/react/ui-board-document.tsx +10 -11
  193. package/src/react/ui-component-board.ts +5 -5
  194. package/src/runtime/adapter/audio-meter.ts +21 -0
  195. package/src/runtime/adapter/first-party-audio-system.ts +230 -0
  196. package/src/runtime/adapter/ingest/contract-debug-adapter.ts +114 -0
  197. package/src/runtime/adapter/ingest/contract-system-adapters.ts +256 -0
  198. package/src/runtime/adapter/ingest/merge-debug-adapters.ts +197 -0
  199. package/src/runtime/adapter/ingest/observation-debug-adapter.ts +162 -0
  200. package/src/runtime/adapter/ingest/upstream-pin.ts +51 -0
  201. package/src/runtime/adapter/native-debug-module.ts +498 -0
  202. package/src/runtime/audio/bus-mixer.ts +161 -0
  203. package/src/runtime/audio/pose-guard.ts +80 -0
  204. package/src/runtime/core/frame-pacing.ts +126 -0
  205. package/src/runtime/core/game-loop.ts +225 -0
  206. package/src/runtime/core/game-scoped-slot.ts +28 -0
  207. package/src/runtime/core/seeded-random.ts +162 -0
  208. package/src/runtime/core/sim-clock.ts +391 -0
  209. package/src/runtime/core/system-runner.ts +269 -0
  210. package/src/runtime/core/types.ts +104 -0
  211. package/src/runtime/create-runtime.ts +1128 -0
  212. package/src/runtime/debug-bridge.ts +570 -0
  213. package/src/runtime/debug-registry.ts +899 -0
  214. package/src/runtime/dev/chrome-trace.ts +153 -0
  215. package/src/runtime/dev/instruments.ts +403 -0
  216. package/src/runtime/dev/logger.ts +119 -0
  217. package/src/runtime/dev/performance-profiler.ts +367 -0
  218. package/src/runtime/dev/register-render-vitals.ts +276 -0
  219. package/src/runtime/dev/render-census.ts +354 -0
  220. package/src/runtime/dev/render-debug-adapter.ts +218 -0
  221. package/src/runtime/dev/render-memory.ts +226 -0
  222. package/src/runtime/dev/render-vitals.ts +338 -0
  223. package/src/runtime/dev/static-batch-advisor.ts +188 -0
  224. package/src/runtime/dev/webgl-frame-capture.ts +366 -0
  225. package/src/runtime/dev/webgl-gpu-timer.ts +53 -0
  226. package/src/runtime/dev-build.ts +47 -0
  227. package/src/runtime/game.ts +1636 -0
  228. package/src/runtime/gameplay-rng-trap.ts +135 -0
  229. package/src/runtime/host-context.ts +64 -0
  230. package/src/runtime/input-router.ts +169 -0
  231. package/src/runtime/mount-manifest.ts +480 -0
  232. package/src/runtime/pixi/authoring.ts +706 -0
  233. package/src/runtime/pixi/ingest.ts +116 -0
  234. package/src/runtime/pixi/physics-registry.ts +49 -0
  235. package/src/runtime/pixi/render-pass-bracket.ts +117 -0
  236. package/src/runtime/pixi/scene-capture.ts +179 -0
  237. package/src/runtime/pixi/system-adapters.ts +69 -0
  238. package/src/runtime/playtest.ts +22 -0
  239. package/src/runtime/presentation.ts +141 -0
  240. package/src/runtime/render-control.ts +642 -0
  241. package/src/runtime/render-seed.ts +77 -0
  242. package/src/runtime/run-ticks-settled.ts +73 -0
  243. package/src/runtime/setup/setup-audio.ts +72 -0
  244. package/src/services/audio-pose-guard.ts +2 -2
  245. package/src/services/game-audio.ts +152 -0
  246. package/src/services/game-network.ts +657 -0
  247. package/src/services/game-physics.ts +334 -0
  248. package/src/state-watch/StateWatchPanel.tsx +1 -1
  249. package/src/three/authoring/camera-runtime-inspector-section.tsx +4 -3
  250. package/src/three/authoring/constraint-inspector-section.tsx +8 -7
  251. package/src/three/authoring/model-asset-inspector-section.tsx +14 -17
  252. package/src/three/authoring/oid-source-persistence.ts +13 -13
  253. package/src/three/authoring/r3f-design-session.ts +79 -61
  254. package/src/three/authoring/r3f-source-authoring-adapter.ts +112 -108
  255. package/src/three/authoring/reflection-probe-inspector-section.tsx +5 -4
  256. package/src/three/authoring/spatial-joint-handles.ts +1 -1
  257. package/src/three/authoring/spatial-lod-handles.ts +1 -1
  258. package/src/three/authoring/spatial-particle-handles.ts +1 -1
  259. package/src/three/authoring/three-authoring-adapter.ts +33 -33
  260. package/src/three/component-verbs/extract-menu.ts +8 -7
  261. package/src/three/component-verbs/fork-menu.ts +8 -7
  262. package/src/three/component-verbs/internals-menu.ts +3 -3
  263. package/src/three/drei-asset-caches.ts +13 -0
  264. package/src/three/story-documents/three-story-documents.tsx +24 -34
  265. package/src/three/three-board/ThreeBoardDocument.tsx +25 -25
  266. package/src/three/three-board/board-scene.ts +7 -7
  267. package/src/three/three-board/three-component-board.ts +5 -5
  268. package/contributions/react/pasteboard.action.ts +0 -41
  269. package/contributions/xstate-behavior.action.ts +0 -42
  270. package/contributions/xstate-behavior.document.tsx +0 -73
  271. package/contributions/xstate-behavior.inspector.tsx +0 -28
  272. package/contributions/xstate-behavior.menu.ts +0 -23
  273. package/src/react/pasteboard-materialize.ts +0 -154
  274. package/src/services/game-audio-unlock.ts +0 -48
  275. package/src/xstate/XStateBehaviorSection.tsx +0 -130
  276. package/src/xstate/XStateMachineInspector.tsx +0 -566
  277. package/src/xstate/character-animation-machine.fixture.ts +0 -74
  278. package/src/xstate/live-behaviors.ts +0 -106
  279. package/src/xstate/use-live-actor-state.ts +0 -44
  280. package/src/xstate/xstate-graph.ts +0 -235
  281. package/src/xstate/xstate-layout.ts +0 -76
@@ -29,16 +29,16 @@
29
29
  * subject, and it is the HUMAN-facing sentence that has to be a union.
30
30
  */
31
31
 
32
- import { mountedRootSubjects } from '@volter/editor-core/authoring/mounted-root-subjects';
32
+ import { mountedRootSubjects } from '@volter/editor-sdk/kit/authoring/mounted-root-subjects';
33
33
  import {
34
34
  type CoveragePart,
35
35
  formatCapabilityCoverageBlocks,
36
36
  unionCoverageReport,
37
37
  } from '../host/coverage/capability-coverage';
38
- import { editorConsole } from '@volter/editor-core/editor-console';
39
- import { editorIsPlaying } from '@volter/editor-core/editor-session-mode';
40
- import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
41
- import { getCurrentProject } from '@volter/editor-core/project-manager';
38
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
39
+ import { editorIsPlaying } from '@volter/editor-sdk/kit/editor-session-mode';
40
+ import { projectAdapterFacet } from '@volter/editor-sdk/kit/project-adapter';
41
+ import { getCurrentProject } from '@volter/editor-sdk/kit/active-project';
42
42
  import { authoringSurfaceCoverage } from './live-authoring-surface';
43
43
  import { projectVerbCoverage } from './live-project-verbs';
44
44
  import { nativeSystemCoverage } from './native-system-coverage';
@@ -1,13 +1,13 @@
1
- import { ensureCoreUtilitiesRegistered } from '@volter/editor-core/components/core-utilities';
2
- import { ProjectHeader } from '@volter/editor-core/components/ProjectHeader';
3
- import { ensureCoreStatusContributionsRegistered } from '@volter/editor-core/components/status-contributions';
1
+ import { ensureCoreUtilitiesRegistered } from '@volter/editor-sdk/kit/components/core-utilities';
2
+ import { ProjectHeader } from '@volter/editor-sdk/kit/components/ProjectHeader';
3
+ import { ensureCoreStatusContributionsRegistered } from '@volter/editor-sdk/kit/components/status-contributions';
4
4
  import {
5
5
  installStoryWorkspaceUtilityController,
6
6
  StoryEditorRuntime,
7
7
  } from '../host/design-system-stories/fixtures/editor-runtime';
8
8
  import { DesignSystemPage, StorySection } from '../host/design-system-stories/StoryLayout';
9
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
10
- import { getCurrentProject, setActiveProject } from '@volter/editor-core/project-manager';
9
+ import { useEditorStore } from '@volter/editor-sdk/kit/editor-runtime';
10
+ import { getCurrentProject, setActiveProject } from '@volter/editor-sdk/kit/active-project';
11
11
  import type { Meta, StoryObj } from '@storybook/react';
12
12
  import { useLayoutEffect, useState } from 'react';
13
13
  // The transport is `@volter/editor-game`'s; this gallery story shows its view over
@@ -14,9 +14,6 @@
14
14
  * subject wrapping them is synthetic (a live react/DOM subject needs a
15
15
  * running document session + OID index, not constructible in a bounded
16
16
  * story).
17
- * - State machine — the REAL `XStateMachineInspector` over the REAL
18
- * `characterAnimationMachine` fixture. Fully real; no live actor is needed
19
- * (the static graph view is the design-time state).
20
17
  * - Ingest coverage — the REAL `ingestCoverageSection(deriveCapabilityCoverage(…))`
21
18
  * section, the exact one the Game Inspector composes.
22
19
  * - Typed-three groups — a REAL composed subject: `AuthoringInspectorSurface`
@@ -30,21 +27,21 @@
30
27
  */
31
28
 
32
29
  import { UNCAPTURED_REACH } from '../host/adapter-reach';
33
- import { SourceObject3DAuthoringAdapter } from '@volter/editor-core/authoring/source-object3d-authoring-adapter';
34
- import { faBrain, faPalette } from '@fortawesome/free-solid-svg-icons';
30
+ import { SourceObject3DAuthoringAdapter } from '@volter/editor-threejs/kit/authoring/source-object3d-authoring-adapter';
31
+ import { faPalette } from '@fortawesome/free-solid-svg-icons';
35
32
  import type { Meta, StoryObj } from '@storybook/react';
36
33
  import { type ReactNode, useState } from 'react';
37
34
  import * as THREE from 'three';
38
35
  // Side-effect: registers the model-asset section contributions (Geometry,
39
36
  // Animation, Materials, Source) into the inspector-section registry.
40
- import '@volter/editor-core/authoring/model-asset-inspector-section';
41
- import { ingestCoverageSection } from '@volter/editor-core/components/CapabilityCoverageSection';
42
- import { InspectionProjectionView } from '@volter/editor-core/components/InspectionProjection';
43
- import { AuthoringInspectorSurface } from '@volter/editor-core/components/Inspector';
37
+ import '../three/authoring/model-asset-inspector-section';
38
+ import { ingestCoverageSection } from '@volter/editor-sdk/kit/CapabilityCoverageSection';
39
+ import { InspectionProjectionView } from '@volter/editor-sdk/kit/components/InspectionProjection';
40
+ import { AuthoringInspectorSurface } from '@volter/editor-sdk/kit/components/Inspector';
44
41
  import { deriveCapabilityCoverage } from '../host/coverage/capability-coverage';
45
42
  import { createAuthoringFixture } from '../host/design-system-stories/fixtures/authoring';
46
- import { StoryEditorRuntime } from '../host/design-system-stories/fixtures/editor-runtime';
47
- import type { InspectionSection, InspectionSubject } from '@volter/editor-core/inspection/model';
43
+ import { StoryEditorRuntime, storyThreeStore } from '../host/design-system-stories/fixtures/editor-runtime';
44
+ import type { InspectionSection, InspectionSubject } from '@volter/editor-sdk/kit/inspection-model';
48
45
  import {
49
46
  AlignmentGrid,
50
47
  type AlignmentValue,
@@ -65,8 +62,6 @@ import {
65
62
  uniformBorder,
66
63
  uniformRadius,
67
64
  } from '@volter/editor-sdk/widgets';
68
- import { characterAnimationMachine } from '../xstate/character-animation-machine.fixture';
69
- import { XStateMachineInspector } from '../xstate/XStateMachineInspector';
70
65
 
71
66
  /** The narrow column's target width. `overflow: hidden` so a body that was
72
67
  * built wider than the rail SPILLS visibly instead of scrolling. */
@@ -208,28 +203,6 @@ const cssSubject = columnSubject({
208
203
  ],
209
204
  });
210
205
 
211
- // ---- State machine (real inspector + real fixture machine) ---------------
212
-
213
- const stateMachineSubject = columnSubject({
214
- id: 'asset:character-animation',
215
- title: 'Character Animation',
216
- kindLabel: 'State machine',
217
- sections: [
218
- customSection(
219
- 'state-machine',
220
- 'State machine',
221
- faBrain,
222
- 4000,
223
- <div style={{ height: 300, minHeight: 0 }}>
224
- <XStateMachineInspector
225
- machine={characterAnimationMachine}
226
- currentStateId="character-animation.idle"
227
- />
228
- </div>,
229
- ),
230
- ],
231
- });
232
-
233
206
  // ---- Ingest coverage (the real composed section) -------------------------
234
207
 
235
208
  const coverageReport = deriveCapabilityCoverage({
@@ -295,7 +268,7 @@ const coverageSubject = columnSubject({
295
268
 
296
269
  /** A real THREE model scene → the source-object3d model adapter, the same
297
270
  * fixture the model-asset workflow exercises. */
298
- function buildModelAdapter(store: Parameters<typeof AuthoringInspectorSurface>[0]['store']) {
271
+ function buildModelAdapter(store: ConstructorParameters<typeof SourceObject3DAuthoringAdapter>[0]) {
299
272
  const scene = new THREE.Scene();
300
273
  const root = new THREE.Group();
301
274
  root.name = 'Ship';
@@ -337,20 +310,7 @@ export const CssEditorsColumn: Story = {
337
310
  ),
338
311
  };
339
312
 
340
- /** (2) The real xstate machine inspector (static graph view). */
341
- export const StateMachineColumn: Story = {
342
- render: () => (
343
- <RailColumn>
344
- <InspectionProjectionView
345
- subject={stateMachineSubject}
346
- presentation="column"
347
- surface="asset-lab"
348
- />
349
- </RailColumn>
350
- ),
351
- };
352
-
353
- /** (3) The real ingest coverage section. */
313
+ /** (2) The real ingest coverage section. */
354
314
  export const IngestCoverageColumn: Story = {
355
315
  render: () => (
356
316
  <RailColumn>
@@ -359,7 +319,7 @@ export const IngestCoverageColumn: Story = {
359
319
  ),
360
320
  };
361
321
 
362
- /** (4) Typed-three grouped descriptor bodies — a real composed mesh subject
322
+ /** (3) Typed-three grouped descriptor bodies — a real composed mesh subject
363
323
  * (Material / Gameplay groups + loose fields). */
364
324
  export const TypedThreeGroupsColumn: Story = {
365
325
  render: () => {
@@ -382,13 +342,13 @@ export const TypedThreeGroupsColumn: Story = {
382
342
  },
383
343
  };
384
344
 
385
- /** (5) Model-asset sections — a real composed subject (Geometry / Animation /
345
+ /** (4) Model-asset sections — a real composed subject (Geometry / Animation /
386
346
  * Materials / Source) from a hand-authored THREE scene. */
387
347
  export const ModelAssetColumn: Story = {
388
348
  render: () => (
389
349
  <StoryEditorRuntime>
390
350
  {(runtime) => {
391
- const adapter = buildModelAdapter(runtime.store);
351
+ const adapter = buildModelAdapter(storyThreeStore(runtime));
392
352
  return (
393
353
  <RailColumn>
394
354
  <AuthoringInspectorSurface
@@ -6,7 +6,7 @@
6
6
  * while Play is active; on Stop, `getActiveAudio()` falls back to this graph.
7
7
  *
8
8
  * It lives in `@volter/editor-game` because it IS the engine's audio runtime — the
9
- * mixer, the bus graph and the pose guard behind `@volter/game-runtime/setup/setup-audio` —
9
+ * mixer, the bus graph and the pose guard behind `@volter/editor-game/runtime/setup/setup-audio` —
10
10
  * and the host was installing all of it at boot for every project, including a
11
11
  * models project that plays nothing and has no sound (WORK.md §The open-source
12
12
  * launch, phase 1 unit 7). The one host surface that reads it, the header
@@ -15,12 +15,12 @@
15
15
  * unit 2. Same shape as `edit-mode-networking.ts` beside it.
16
16
  */
17
17
 
18
- import { setEditModeAudio } from '@volter/editor-core/authoring/active-systems';
18
+ import { setEditModeAudio } from '@volter/editor-sdk/kit/authoring/active-systems';
19
19
  import {
20
20
  createAudioSystemAdapter,
21
21
  releaseAudioMeters,
22
- } from '@volter/game-runtime/adapter/first-party-audio-system';
23
- import { setupAudio } from '@volter/game-runtime/setup/setup-audio';
22
+ } from '../runtime/adapter/first-party-audio-system';
23
+ import { setupAudio } from '../runtime/setup/setup-audio';
24
24
  import * as THREE from 'three';
25
25
 
26
26
  export function installEditModeAudio(camera: THREE.Camera = new THREE.Camera()): () => void {
@@ -30,8 +30,8 @@
30
30
  * active; on Stop, `getActiveNetworking()` falls back to this one.
31
31
  */
32
32
 
33
- import { setEditModeNetworking } from '@volter/editor-core/authoring/active-systems';
34
- import { getCurrentProject } from '@volter/editor-core/project-manager';
33
+ import { setEditModeNetworking } from '@volter/editor-sdk/kit/authoring/active-systems';
34
+ import { getCurrentProject } from '@volter/editor-sdk/kit/active-project';
35
35
  import type {
36
36
  ConnectionState,
37
37
  NetPeer,
@@ -10,8 +10,8 @@
10
10
  * host module: the host imports no package (WORKBENCH.md §The invariants), so
11
11
  * the button stays on this side of the line with the store and model it reads.
12
12
  */
13
- import { getInspectedRenderDebug } from '@volter/editor-core/authoring/active-systems';
14
- import { useAvailabilitySelector } from '@volter/editor-core/availability-tick';
13
+ import { getInspectedRenderDebug } from '@volter/editor-sdk/kit/authoring/active-systems';
14
+ import { useAvailabilitySelector } from '@volter/editor-sdk/kit/availability-tick';
15
15
  import { deriveRenderDebugCapabilities } from '../host/components/frame-debugger-model';
16
16
  import { profilerView } from '../host/components/utility-view-state';
17
17
  import { Button } from '@volter/editor-sdk/widgets';
@@ -12,8 +12,8 @@ import { PlayBar } from '../play-bar/PlayBar';
12
12
  */
13
13
 
14
14
  import { ResolutionPicker } from '../host/components/ResolutionPicker';
15
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
16
- import { getCurrentProject, onProjectChange } from '@volter/editor-core/project-manager';
15
+ import { useEditorStore } from '@volter/editor-sdk/kit/editor-runtime';
16
+ import { getCurrentProject, onProjectChange } from '@volter/editor-sdk/kit/active-project';
17
17
  import type { LiveDocumentContentProps } from '@volter/editor-sdk/host';
18
18
  import {
19
19
  AnchoredMenu,
@@ -13,21 +13,21 @@
13
13
  import {
14
14
  getMountFailureReports,
15
15
  subscribeToMountFailures,
16
- } from '@volter/editor-core/authoring/mount-failure-report';
17
- import { SurfaceStateOverlay } from '@volter/editor-core/components/SurfaceStateOverlay';
18
- import { editorConsole } from '@volter/editor-core/editor-console';
19
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
20
- import { getCurrentProject, onProjectChange } from '@volter/editor-core/project-manager';
21
- import { readinessFacet, subscribeRootReadiness } from '@volter/editor-core/readiness';
16
+ } from '@volter/editor-sdk/kit/mount-failure-report';
17
+ import { SurfaceStateOverlay } from '@volter/editor-sdk/kit/components/SurfaceStateOverlay';
18
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
19
+ import { useEditorStore } from '@volter/editor-sdk/kit/editor-runtime';
20
+ import { getCurrentProject, onProjectChange } from '@volter/editor-sdk/kit/active-project';
21
+ import { readinessFacet, subscribeRootReadiness } from '@volter/editor-sdk/kit/readiness';
22
22
  import { domHasRenderableContent } from '../host/surface-content';
23
- import { explainSurface } from '@volter/editor-core/surface-state';
23
+ import { explainSurface } from '@volter/editor-sdk/kit/surface-state';
24
24
  import { editorHost } from '@volter/editor-sdk/host';
25
25
  import { themeVars } from '@volter/editor-sdk/widgets';
26
26
  import {
27
27
  fitPresentation,
28
28
  type PresentedSize,
29
29
  resolvePresentedSize,
30
- } from '@volter/game-runtime/runtime/presentation';
30
+ } from '../runtime/presentation';
31
31
  import {
32
32
  type ReactNode,
33
33
  useCallback,
@@ -4,8 +4,8 @@ import {
4
4
  inspectedInstanceVersion,
5
5
  setInspectedInstance,
6
6
  subscribeInspectedInstance,
7
- } from '@volter/editor-core/authoring/active-systems';
8
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
7
+ } from '@volter/editor-sdk/kit/authoring/active-systems';
8
+ import { useEditorStore } from '@volter/editor-sdk/kit/editor-runtime';
9
9
  import { gameRealmDiagnostics } from '../host/gated-globals';
10
10
  import { faEye } from '@fortawesome/free-solid-svg-icons';
11
11
  import {
@@ -13,7 +13,7 @@
13
13
  * the active-document debug-control pattern there.
14
14
  */
15
15
 
16
- import { getActiveSystems } from '@volter/editor-core/authoring/active-systems';
16
+ import { getActiveSystems } from '@volter/editor-sdk/kit/authoring/active-systems';
17
17
  import type { NavCrowdAgentState } from '@volter/editor-project/adapter';
18
18
  import { setUserData } from '@volter/threejs-runtime/ecs/user-data';
19
19
  import * as THREE from 'three';
@@ -27,14 +27,13 @@
27
27
  * game registered (raw canvas listeners, gated `window`/`document`
28
28
  * listeners via `gated-globals.ts` — the clone bubbles to the real window
29
29
  * exactly like the original would, so the T6.3 input gate still applies)
30
- * sees touch. The engine `InputManager` is untouched: it listens for
31
- * compatibility `mouse*` events on `window`, which the browser still
32
- * fires (we never `preventDefault()` the pointer event). Fidelity limits,
33
- * recorded: real mobile fires compat mousedown/up AFTER a tap completes
34
- * and never streams hover mousemove — here the InputManager sees
35
- * desktop-timed mouse events alongside the touch clones, so games mixing
36
- * pointer handlers with InputManager mouse state get simultaneous rather
37
- * than sequenced input, and hover-dependent logic that breaks on device
30
+ * sees touch. A game listening for compatibility `mouse*` events on
31
+ * `window` still hears them: the browser still fires them (we never
32
+ * `preventDefault()` the pointer event). Fidelity limits, recorded: real
33
+ * mobile fires compat mousedown/up AFTER a tap completes and never streams
34
+ * hover mousemove — here a game sees desktop-timed mouse events alongside
35
+ * the touch clones, so games mixing pointer handlers with mouse state get
36
+ * simultaneous rather than sequenced input, and hover-dependent logic that breaks on device
38
37
  * still works in emulation. No `TouchEvent` (`touchstart`/`touchmove`)
39
38
  * synthesis (Chrome device mode does synthesize these) — raw-touch-event
40
39
  * games see nothing. A game capture-phase window/document pointer
@@ -47,7 +46,7 @@
47
46
  * everyone who opens it.
48
47
  */
49
48
 
50
- import { projectSettings, updateProjectSettings } from '@volter/editor-core/settings-store';
49
+ import { projectSettings, updateProjectSettings } from '@volter/editor-sdk/kit/settings-store';
51
50
 
52
51
  export type DevicePresetKind = 'fit' | 'phone' | 'tablet' | 'desktop';
53
52
 
@@ -253,8 +252,8 @@ function interceptPointer(e: Event): void {
253
252
  // listeners, gated window/document listeners) …
254
253
  e.stopImmediatePropagation();
255
254
  // … and deliver the identical gesture as touch. Compat mouse events are
256
- // deliberately NOT suppressed (no preventDefault): the engine InputManager
257
- // listens for window `mouse*` and keeps working, exactly as on a real
255
+ // deliberately NOT suppressed (no preventDefault): a game listening for
256
+ // window `mouse*` keeps working, exactly as on a real
258
257
  // mobile browser where compat mouse events accompany touches.
259
258
  const clone = new PointerEvent(e.type, {
260
259
  bubbles: true,
@@ -23,7 +23,7 @@
23
23
  * destroyed, so nothing leaks into the next session.
24
24
  */
25
25
 
26
- import { getActiveSystems } from '@volter/editor-core/authoring/active-systems';
26
+ import { getActiveSystems } from '@volter/editor-sdk/kit/authoring/active-systems';
27
27
  import { nodeKeyedPhysics, type PhysicsAdapter } from '@volter/editor-project/adapter';
28
28
  import { setUserData } from '@volter/threejs-runtime/ecs/user-data';
29
29
  import * as THREE from 'three';
@@ -12,12 +12,11 @@ import { faFile, faFileLines, faTriangleExclamation } from '@fortawesome/free-so
12
12
  import type { GenerationJob } from '@volter/editor-sdk/generations';
13
13
  import { useState, useSyncExternalStore } from 'react';
14
14
  import './GenerationGallery.css';
15
- import { assetCapabilities, assetDocumentKind } from '@volter/editor-core/asset-workflow/asset-capabilities';
16
- import { openAssetDocument } from '@volter/editor-core/components/asset-documents';
17
- import { AudioAssetThumb, ModelThumbnail } from '@volter/editor-core/components/asset-thumbnails';
18
- import { editorConsole } from '@volter/editor-core/editor-console';
19
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
20
- import { modelThumbnailFormat } from '@volter/editor-core/model-thumbnail';
15
+ import { assetCapabilities, assetDocumentKind } from '@volter/editor-sdk/kit/asset-capabilities';
16
+ import { openAssetDocument } from '@volter/editor-sdk/kit/components/asset-documents';
17
+ import { AudioAssetThumb, ModelThumbnail } from '@volter/editor-sdk/kit/components/asset-thumbnails';
18
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
19
+ import { modelThumbnailFormat } from '@volter/editor-threejs/kit/model-thumbnail';
21
20
  import {
22
21
  Button,
23
22
  EditorBadge,
@@ -238,7 +237,6 @@ function GenerationCard({
238
237
  error: string | null;
239
238
  run: (action: () => Promise<void>) => void;
240
239
  }) {
241
- const store = useEditorStore();
242
240
  const state = generationCardState(job);
243
241
  const outputs = generationOutputs(job);
244
242
  const prompt = generationPrompt(job);
@@ -247,7 +245,7 @@ function GenerationCard({
247
245
  if (!output.url) return undefined;
248
246
  const kind = assetDocumentKind(assetCapabilities(output.name));
249
247
  if (!kind) return undefined;
250
- return () => openAssetDocument(store, output.url as string, kind);
248
+ return () => openAssetDocument(output.url as string, kind);
251
249
  };
252
250
 
253
251
  return (
@@ -6,26 +6,26 @@ import {
6
6
  accountVersion,
7
7
  contributionAccount,
8
8
  subscribeAccount,
9
- } from '@volter/editor-core/account';
10
- import { toolContributionSurfaces } from '@volter/editor-core/components/ToolContributionSurfaces';
11
- import { ToolErrorBoundary } from '@volter/editor-core/components/ToolHost';
12
- import { openToolDocument } from '@volter/editor-core/components/tool-documents';
9
+ } from '@volter/editor-sdk/kit/account-client';
10
+ import { toolContributionSurfaces } from '@volter/editor-sdk/kit/components/ToolContributionSurfaces';
11
+ import { ToolErrorBoundary } from '@volter/editor-sdk/kit/components/ToolHost';
12
+ import { openToolDocument } from '@volter/editor-sdk/kit/components/tool-documents';
13
13
  import {
14
14
  subscribeToolContributionPlay,
15
15
  toolContributionPlay,
16
16
  toolContributionPlayKey,
17
- } from '@volter/editor-core/tool-contribution-play';
17
+ } from '@volter/editor-sdk/kit/tool-contribution-play';
18
18
  import {
19
19
  getGenerationResultContribution,
20
20
  getGlobalToolContributions,
21
21
  getToolContributionClient,
22
22
  subscribeToolContributions,
23
- } from '@volter/editor-core/tool-loader';
23
+ } from '@volter/editor-sdk/kit/tool-loader';
24
24
  import {
25
25
  closeWorkspaceDocument,
26
26
  openWorkspaceDocument,
27
27
  type WorkspaceDocumentContentProps,
28
- } from '@volter/editor-core/workspace-document-registry';
28
+ } from '@volter/editor-sdk/kit/workspace-document-registry';
29
29
  import { Button, TextInput } from '@volter/editor-sdk/widgets';
30
30
  import {
31
31
  acceptGenerationJob,
@@ -134,7 +134,7 @@ export function GenerationCreateDocumentContent() {
134
134
  variant="ghost"
135
135
  className="vgai-generation-create-card"
136
136
  key={contribution.id}
137
- onClick={() => openToolDocument(null, contribution.id)}
137
+ onClick={() => openToolDocument(contribution.id)}
138
138
  >
139
139
  <strong>{contribution.title}</strong>
140
140
  <span>{contribution.tool?.summary}</span>
@@ -1,5 +1,5 @@
1
- import { assertEditorServerResponse, editorServerJson } from '@volter/editor-core/editor-server-response';
2
- import { runProjectTool } from '@volter/editor-core/project-tools';
1
+ import { assertEditorServerResponse, editorServerJson } from '@volter/editor-sdk/kit/editor-server-response';
2
+ import { runProjectTool } from '@volter/editor-sdk/kit/project-tools';
3
3
  import type { GenerationJob, GenerationJobsDocument } from '@volter/editor-sdk/generations';
4
4
 
5
5
  const EMPTY: GenerationJobsDocument = { version: 1, jobs: [] };
@@ -7,7 +7,7 @@
7
7
  * plus the small amount of text (state, model, charge) that frames them.
8
8
  */
9
9
 
10
- import { ASSET_ROOTS, assetRootServingUrl } from '@volter/editor-core/asset-workflow/project-asset-roots';
10
+ import { ASSET_ROOTS, assetRootServingUrl } from '@volter/editor-sdk/kit/project-asset-roots';
11
11
  import type { GenerationBilling, GenerationJob } from '@volter/editor-sdk/generations';
12
12
 
13
13
  /**
@@ -55,7 +55,7 @@ import { probeAuthoringReads } from './coverage/authoring-read-probe';
55
55
  import {
56
56
  authoringAdapterEpoch,
57
57
  inspectAuthoringAdapterSeams,
58
- } from '@volter/editor-core/coverage/authoring-seam-evidence';
58
+ } from '@volter/editor-sdk/kit/authoring-seam-evidence';
59
59
 
60
60
  /** Re-exported so consumers of a coverage row need one import, not two. */
61
61
  export type { AuthoringProviderKey };
@@ -8,15 +8,15 @@
8
8
  import {
9
9
  installNativeDebugBindings,
10
10
  installNativeSystemsBindings,
11
- } from '@volter/game-runtime/adapter/native-debug-module';
12
- import { publishDevInstruments } from '@volter/game-runtime/dev/instruments';
11
+ } from '../runtime/adapter/native-debug-module';
12
+ import { publishDevInstruments } from '../runtime/dev/instruments';
13
13
  import {
14
14
  DebugError,
15
15
  type DebugRegistry,
16
16
  type DebugVirtualInputTarget,
17
17
  getDebugRegistry,
18
- } from '@volter/game-runtime/runtime/debug-registry';
19
- import type { Game } from '@volter/game-runtime/runtime/game';
18
+ } from '../runtime/debug-registry';
19
+ import type { Game } from '../runtime/game';
20
20
  import {
21
21
  ADAPTER_INPUT_VALUE_TYPES,
22
22
  type AdapterInputAction,
@@ -26,7 +26,13 @@ import {
26
26
  type ObservationDeclaration,
27
27
  } from '@volter/editor-project/adapter/adapter-module';
28
28
  import type { ObservationBinding } from '@volter/editor-project/adapter/binding';
29
- import { adapterInputBinding, adapterObservations } from '@volter/editor-core/adapter-observation';
29
+ import { adapterInputBinding, adapterObservations } from '@volter/editor-sdk/kit/adapter-observation';
30
+ import { observedGameAudio } from '../services/game-audio';
31
+ import { observedGameNetwork } from '../services/game-network';
32
+ import { observedRapierPhysics, rapierContextFor } from '../services/game-physics';
33
+ import { projectDependencyNames, projectVerbFacts } from '../coverage/live-project-verbs';
34
+ import type * as THREE from 'three';
35
+ import type { NativeSystemsBinding } from '@volter/editor-project/adapter/native-entry-surface';
30
36
 
31
37
  const ADAPTER_REGISTRATION_ID = '__adapter__';
32
38
  const installedGames = new WeakSet<Game>();
@@ -52,6 +58,88 @@ function entryBindings<K extends 'entryDebug' | 'entrySystems'>(
52
58
  return out;
53
59
  }
54
60
 
61
+ /**
62
+ * A game that says nothing about its audio is heard through the editor's observer of the
63
+ * page's Web Audio (`services/game-audio.ts`), on every root, so each world's pause gate and the
64
+ * editor's mute reach the one page-wide adapter. A game whose roots declare audio, or its
65
+ * absence, has spoken for it and gets no observer beside its own.
66
+ */
67
+ function withObservedAudio(game: Game, bindings: NativeSystemsBinding[]): NativeSystemsBinding[] {
68
+ if (bindings.some((binding) => binding.slots.audio || binding.absent.some((slot) => slot.slot === 'audio'))) {
69
+ return bindings;
70
+ }
71
+ return game.roots.map((root) => {
72
+ const own = bindings.find((binding) => binding.rootId === root.id);
73
+ return { rootId: root.id, slots: { ...own?.slots, audio: observedGameAudio }, absent: own?.absent ?? [] };
74
+ });
75
+ }
76
+
77
+ /** The libraries whose presence says a project joins Colyseus rooms. */
78
+ const COLYSEUS_CLIENT_LIBRARIES = ['@colyseus/sdk', 'colyseus.js'];
79
+
80
+ /**
81
+ * A game that says nothing about its networking, and ships a Colyseus client, is inspected
82
+ * through the editor's observer of the page's room sockets (`services/game-network.ts`), on its
83
+ * first root: the page has one set of sockets, and the inspector reads one adapter. A game that
84
+ * declares networking, or its absence, has spoken for it; a project known to ship no Colyseus
85
+ * client gets nothing that pretends.
86
+ */
87
+ function withObservedNetworking(game: Game, bindings: NativeSystemsBinding[]): NativeSystemsBinding[] {
88
+ const declared = bindings.some(
89
+ (binding) => binding.slots.networking || binding.absent.some((slot) => slot.slot === 'networking'),
90
+ );
91
+ // While the project's dependency list is still loading the answer is unknown, not no (Play
92
+ // starts that read and mounts in the same breath), so the observer is attached; it answers
93
+ // `disconnected` until the game joins a room.
94
+ projectVerbFacts();
95
+ const dependencies = projectDependencyNames();
96
+ const shipsClient = dependencies === null || dependencies.some((name) => COLYSEUS_CLIENT_LIBRARIES.includes(name));
97
+ const first = game.roots[0];
98
+ if (declared || !shipsClient || !first) return bindings;
99
+ const index = bindings.findIndex((binding) => binding.rootId === first.id);
100
+ const own = index >= 0 ? bindings[index] : undefined;
101
+ const binding: NativeSystemsBinding = {
102
+ rootId: first.id,
103
+ slots: { ...own?.slots, networking: observedGameNetwork },
104
+ absent: own?.absent ?? [],
105
+ };
106
+ const out = [...bindings];
107
+ if (index >= 0) out[index] = binding;
108
+ else out.push(binding);
109
+ return out;
110
+ }
111
+
112
+ /** The libraries whose presence says a project simulates Rapier physics. */
113
+ const RAPIER_LIBRARIES = ['@react-three/rapier', '@dimforge/rapier3d-compat'];
114
+
115
+ /**
116
+ * A three world that declares no physics, and whose own mount carries none, is edited through
117
+ * the editor's observer of its `@react-three/rapier` world (`services/game-physics.ts`) when the
118
+ * world has one: a `<Physics>` already mounted, or a project that ships Rapier (its provider
119
+ * mounts only once the WASM loads). A world with neither gets nothing that pretends. While the
120
+ * project's dependency list is still loading (`projectVerbFacts` starts that read) the answer is
121
+ * unknown, not no, so the observer is attached; it answers `unresolved` until a world mounts.
122
+ */
123
+ export function withObservedPhysics(game: Game, bindings: NativeSystemsBinding[]): NativeSystemsBinding[] {
124
+ projectVerbFacts();
125
+ const dependencies = projectDependencyNames();
126
+ const shipsRapier = dependencies === null || dependencies.some((name) => RAPIER_LIBRARIES.includes(name));
127
+ const out = [...bindings];
128
+ for (const root of game.roots) {
129
+ if (root.mounted.kind !== 'three' || root.mounted.systems?.physics) continue;
130
+ const index = out.findIndex((binding) => binding.rootId === root.id);
131
+ const own = index >= 0 ? out[index] : undefined;
132
+ if (own && (own.slots.physics || own.absent.some((slot) => slot.slot === 'physics'))) continue;
133
+ const scene = root.mounted.scene as THREE.Object3D;
134
+ if (!shipsRapier && !rapierContextFor(scene)) continue;
135
+ const physics = observedRapierPhysics(scene);
136
+ const binding: NativeSystemsBinding = { rootId: root.id, slots: { ...own?.slots, physics }, absent: own?.absent ?? [] };
137
+ if (index >= 0) out[index] = binding;
138
+ else out.push(binding);
139
+ }
140
+ return out;
141
+ }
142
+
55
143
  function installObservations(
56
144
  game: Game,
57
145
  registry: DebugRegistry,
@@ -275,7 +363,10 @@ function installInput(game: Game, registry: DebugRegistry, binding: AdapterInput
275
363
  export function installAdapterRuntimeBindings(game: Game): void {
276
364
  if (installedGames.has(game)) return;
277
365
  installNativeDebugBindings(game, entryBindings(game, 'entryDebug'));
278
- installNativeSystemsBindings(game, entryBindings(game, 'entrySystems'));
366
+ installNativeSystemsBindings(
367
+ game,
368
+ withObservedNetworking(game, withObservedPhysics(game, withObservedAudio(game, entryBindings(game, 'entrySystems')))),
369
+ );
279
370
  // The engine's universal instruments (time scale, pause/frame-step,
280
371
  // collider draw, frame time) — HOST-published, so every game gets them for
281
372
  // zero lines and no in-world mount. The disposer is deliberately dropped:
@@ -4,8 +4,8 @@
4
4
  * verbs the transport's picker and `vgai run` share.
5
5
  */
6
6
 
7
- import { assertEditorServerResponse, editorServerJson } from '@volter/editor-core/editor-server-response';
8
- import { BASE } from '@volter/editor-core/api/base';
7
+ import { assertEditorServerResponse, editorServerJson } from '@volter/editor-sdk/kit/editor-server-response';
8
+ import { BASE } from '@volter/editor-sdk/kit/api-base';
9
9
 
10
10
  export interface ConfigurationStatus {
11
11
  readonly id: string;