@volter/editor-game 0.5.65 → 0.5.66

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 (141) hide show
  1. package/contributions/generation.service.ts +2 -2
  2. package/contributions/generations.status.tsx +1 -1
  3. package/contributions/godot.palette.json +99 -0
  4. package/contributions/godot.style.ts +62 -0
  5. package/contributions/godot.view.ts +69 -0
  6. package/contributions/ingest.service.ts +3 -3
  7. package/contributions/play.command.ts +1 -1
  8. package/contributions/react/react-inspector.service.ts +2 -2
  9. package/contributions/scene-document.service.ts +3 -3
  10. package/contributions/three/component-verbs.command.ts +3 -3
  11. package/contributions/unity.palette.json +102 -0
  12. package/contributions/unity.style.ts +62 -0
  13. package/contributions/unity.view.ts +76 -0
  14. package/contributions/unreal.palette.json +105 -0
  15. package/contributions/unreal.style.ts +58 -0
  16. package/contributions/unreal.view.ts +88 -0
  17. package/dist-node/serving.mjs +16 -0
  18. package/package.json +21 -14
  19. package/serving/index.ts +27 -0
  20. package/src/asset-budget/asset-budget-model.ts +3 -3
  21. package/src/asset-budget/optimize-apply.ts +7 -7
  22. package/src/bridge/dispatch.ts +2 -2
  23. package/src/bridge/screenshot.ts +3 -3
  24. package/src/coverage/live-authoring-surface.ts +1 -1
  25. package/src/coverage/live-project-verbs.ts +1 -1
  26. package/src/coverage/native-system-coverage.ts +1 -1
  27. package/src/coverage/session-coverage.ts +2 -2
  28. package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +10 -50
  29. package/src/game-document/GameCaptureFrameButton.tsx +1 -1
  30. package/src/game-document/GamePanel.tsx +4 -4
  31. package/src/generation/GenerationActivity.tsx +3 -5
  32. package/src/generation/generation-documents.tsx +3 -3
  33. package/src/generation/generation-jobs.ts +1 -1
  34. package/src/generation/generation-presentation.ts +1 -1
  35. package/src/host/adapter-reach.ts +1 -1
  36. package/src/host/adapter-runtime-bindings.ts +1 -1
  37. package/src/host/api/configurations.ts +2 -2
  38. package/src/host/authoring/babylon-authoring-adapter.ts +2 -2
  39. package/src/host/authoring/contract-hierarchy-authoring.ts +1 -1
  40. package/src/host/authoring/contract-scenes-stories.ts +1 -1
  41. package/src/host/authoring/creation-site-related.ts +2 -2
  42. package/src/host/authoring/ephemeral-persistence.ts +1 -1
  43. package/src/host/authoring/gesture-persist.ts +1 -1
  44. package/src/host/authoring/ingest-source-persistence.ts +4 -4
  45. package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
  46. package/src/host/authoring/pixi-authoring-adapter.ts +2 -2
  47. package/src/host/authoring/pixi-live-write-target.ts +3 -3
  48. package/src/host/authoring/pixi-still-presentation.ts +1 -1
  49. package/src/host/authoring/pixi-structure-history.ts +1 -1
  50. package/src/host/authoring/source-persistence-backend.ts +3 -3
  51. package/src/host/authoring/struct-write-pipe.ts +2 -2
  52. package/src/host/browser-transpile.ts +1 -1
  53. package/src/host/canvas-entry-runtime.ts +1 -1
  54. package/src/host/components/HeaderTelemetry.tsx +5 -12
  55. package/src/host/components/PixiIsolationSceneContent.tsx +8 -7
  56. package/src/host/components/ThreeIsolationSceneContent.tsx +2 -2
  57. package/src/host/components/scene-document.tsx +15 -47
  58. package/src/host/components/world-root-stage-binding.tsx +6 -15
  59. package/src/host/components/world-root-stage.ts +60 -14
  60. package/src/host/coverage/capability-coverage.ts +13 -1
  61. package/src/host/coverage/game-contract-seam-evidence.ts +1 -1
  62. package/src/host/coverage/project-verb-coverage.ts +2 -17
  63. package/src/host/coverage/system-adapter-coverage.ts +1 -1
  64. package/src/host/design-system-stories/fixtures/editor-runtime.tsx +9 -1
  65. package/src/host/document-preview-three.ts +1 -1
  66. package/src/host/game-module-access.ts +1 -1
  67. package/src/host/game-realm-page.ts +15 -7
  68. package/src/host/game-realm-reclaim.ts +1 -1
  69. package/src/host/gated-globals.ts +4 -4
  70. package/src/host/history/json-history-resource.ts +2 -2
  71. package/src/host/instance-extract-actions.ts +1 -1
  72. package/src/host/instance-fork-actions.ts +1 -1
  73. package/src/host/projection/dom.ts +2 -2
  74. package/src/host/projection/pixi.ts +1 -1
  75. package/src/host/r3f-entry-runtime.ts +1 -1
  76. package/src/host/react-mount-runtime.ts +1 -1
  77. package/src/host/realm-services.ts +1 -1
  78. package/src/host/roots/module-root.ts +1 -1
  79. package/src/host/scene-view-drawability.ts +2 -2
  80. package/src/host/server-log-bridge.ts +1 -1
  81. package/src/host/three-ingest-runtime.ts +1 -1
  82. package/src/host/use-active-performance-source.ts +1 -1
  83. package/src/ingest/active-ingest.ts +1 -1
  84. package/src/ingest/authoring/ingest-root-adapter.ts +5 -5
  85. package/src/ingest/capture-wait-report.ts +1 -1
  86. package/src/ingest/deferred-ingest-play.ts +5 -4
  87. package/src/ingest/ingest-boot-viewport.ts +4 -6
  88. package/src/ingest/ingest-canvas-scene-document.tsx +9 -8
  89. package/src/ingest/ingest-canvas-scene.ts +2 -5
  90. package/src/ingest/ingest-play-control.ts +3 -3
  91. package/src/ingest/ingest-render-debug.ts +1 -1
  92. package/src/ingest/ingest-siblings.ts +3 -3
  93. package/src/ingest/module-mode.ts +4 -5
  94. package/src/ingest/mount-canvas-ingest-root.ts +6 -6
  95. package/src/ingest/mount-coverage.ts +2 -2
  96. package/src/ingest/mount-dom-ingest-root.ts +5 -5
  97. package/src/ingest/mount-ingest-root.ts +7 -7
  98. package/src/ingest/mount-three-ingest-root.ts +4 -4
  99. package/src/ingest/unmount-ingest-root.ts +2 -2
  100. package/src/play/play-mode.ts +30 -16
  101. package/src/play/play-recording.ts +1 -1
  102. package/src/profiler/PerformancePanel.tsx +1 -1
  103. package/src/react/design-time-react-mount.ts +17 -23
  104. package/src/react/dom-authoring-adapter.ts +2 -2
  105. package/src/react/react-inspector-section.tsx +8 -8
  106. package/src/react/react-world-authoring-adapter.ts +20 -132
  107. package/src/react/story-documents/story-documents.tsx +9 -13
  108. package/src/react/ui-board-document.tsx +3 -4
  109. package/src/react/ui-component-board.ts +3 -3
  110. package/src/three/authoring/camera-runtime-inspector-section.tsx +1 -1
  111. package/src/three/authoring/constraint-inspector-section.tsx +3 -3
  112. package/src/three/authoring/model-asset-inspector-section.tsx +7 -11
  113. package/src/three/authoring/oid-source-persistence.ts +6 -6
  114. package/src/three/authoring/r3f-design-session.ts +21 -7
  115. package/src/three/authoring/r3f-source-authoring-adapter.ts +17 -17
  116. package/src/three/authoring/reflection-probe-inspector-section.tsx +3 -3
  117. package/src/three/authoring/spatial-joint-handles.ts +1 -1
  118. package/src/three/authoring/spatial-lod-handles.ts +1 -1
  119. package/src/three/authoring/spatial-particle-handles.ts +1 -1
  120. package/src/three/authoring/three-authoring-adapter.ts +4 -4
  121. package/src/three/component-verbs/extract-menu.ts +1 -1
  122. package/src/three/component-verbs/fork-menu.ts +1 -1
  123. package/src/three/component-verbs/internals-menu.ts +1 -1
  124. package/src/three/drei-asset-caches.ts +13 -0
  125. package/src/three/story-documents/three-story-documents.tsx +11 -21
  126. package/src/three/three-board/ThreeBoardDocument.tsx +12 -13
  127. package/src/three/three-board/board-scene.ts +1 -1
  128. package/src/three/three-board/three-component-board.ts +3 -3
  129. package/contributions/react/pasteboard.action.ts +0 -41
  130. package/contributions/xstate-behavior.action.ts +0 -42
  131. package/contributions/xstate-behavior.document.tsx +0 -73
  132. package/contributions/xstate-behavior.inspector.tsx +0 -28
  133. package/contributions/xstate-behavior.menu.ts +0 -23
  134. package/src/react/pasteboard-materialize.ts +0 -154
  135. package/src/xstate/XStateBehaviorSection.tsx +0 -130
  136. package/src/xstate/XStateMachineInspector.tsx +0 -566
  137. package/src/xstate/character-animation-machine.fixture.ts +0 -74
  138. package/src/xstate/live-behaviors.ts +0 -106
  139. package/src/xstate/use-live-actor-state.ts +0 -44
  140. package/src/xstate/xstate-graph.ts +0 -235
  141. package/src/xstate/xstate-layout.ts +0 -76
@@ -30,7 +30,8 @@
30
30
  * ingest keeps its own lifecycle).
31
31
  */
32
32
 
33
- import { commandLine } from '@volter/editor-core/product-command';
33
+ import { activateLiveDocument } from '@volter/editor-sdk/kit/live-document';
34
+ import { commandLine } from '@volter/editor-sdk/kit/product-command';
34
35
  import { queueEditModeRebuild } from '@volter/editor-core/authoring/edit-mode-authoring';
35
36
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
36
37
  import { fetchGameManifest } from '@volter/editor-core/manifest-project';
@@ -188,8 +189,9 @@ export async function mountDeferredIngestForPlay(store: EditorShellStore): Promi
188
189
  // the Scene tab because, until now, that mount WAS edit mode; a play-time
189
190
  // mount belongs on the play surface — which is also what opens the input
190
191
  // gate (`mount-three-ingest-root.ts`'s `ingestInputActive` requires the play
191
- // tab), so the game is drivable rather than merely visible.
192
- store.setActiveViewportTab('play');
192
+ // tab, which is the Game document having focus), so the game is drivable rather than
193
+ // merely visible.
194
+ activateLiveDocument();
193
195
  getIngestPlayControl()?.play();
194
196
  return true;
195
197
  }
@@ -207,7 +209,6 @@ export function exitDeferredIngestPlay(store: EditorShellStore): boolean {
207
209
  // the adopted scene, and resets the play surface.
208
210
  exitActiveIngest();
209
211
  store.setPlayState('stopped');
210
- store.setActiveViewportTab('edit');
211
212
  // Edit mode is rebuilt through the ONE authoritative reinstall path
212
213
  // (`the world root's stage`'s `installAll`), which is what recreates the R3F design
213
214
  // session over the world component.
@@ -15,19 +15,18 @@
15
15
  * while it constructs, then explicitly releases the hold and flips to Game.
16
16
  */
17
17
 
18
- import { editorConsole } from '@volter/editor-core/editor-console';
19
- import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
18
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
20
19
  import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
21
20
  import { sceneDocumentId } from '@volter/editor-core/scene-document-plan';
22
- import { CANVAS_SCENE_DOCUMENT_ID, SCENE_DOCUMENT_ID } from '@volter/editor-core/workspace-document-ids';
21
+ import { CANVAS_SCENE_DOCUMENT_ID, SCENE_DOCUMENT_ID } from '@volter/editor-sdk/kit/workspace-document-ids';
23
22
  import {
24
23
  activateWorkspaceDocument,
25
24
  openWorkspaceDocuments,
26
- } from '@volter/editor-core/workspace-document-registry';
25
+ } from '@volter/editor-sdk/kit/workspace-document-registry';
27
26
  import { activeIngest } from './active-ingest';
28
27
  import { activeIngestPauseGap, holdIngestContentTimeForMode } from './ingest-play-control';
29
28
 
30
- export function landIngestBootInEdit(store: EditorShellStore): void {
29
+ export function landIngestBootInEdit(): void {
31
30
  const active = activeIngest();
32
31
  if (active) {
33
32
  const held = holdIngestContentTimeForMode('edit');
@@ -42,7 +41,6 @@ export function landIngestBootInEdit(store: EditorShellStore): void {
42
41
  'ingest',
43
42
  );
44
43
  }
45
- store.setActiveViewportTab('edit');
46
44
  const open = openWorkspaceDocuments();
47
45
  const defaultId = projectAdapterFacet()?.scenes.default;
48
46
  const isolationId = defaultId ? sceneDocumentId(defaultId) : undefined;
@@ -17,9 +17,9 @@
17
17
  import {
18
18
  getMountFailureReports,
19
19
  subscribeToMountFailures,
20
- } from '@volter/editor-core/authoring/mount-failure-report';
20
+ } from '@volter/editor-sdk/kit/mount-failure-report';
21
21
  import { installCanvasSceneNavigation } from '@volter/editor-core/authoring/react-canvas-navigation';
22
- import { createRootViewController } from '@volter/editor-core/authoring/world-pan-state';
22
+ import { createRootViewController } from '@volter/editor-sdk/kit/world-pan-state';
23
23
  import {
24
24
  CANVAS_SCENE_BACKGROUND,
25
25
  CanvasSceneBackdrop,
@@ -28,14 +28,14 @@ import {
28
28
  import { RootSelectionOverlay } from '@volter/editor-core/components/RootSelectionOverlay';
29
29
  import { SurfaceStateOverlay } from '@volter/editor-core/components/SurfaceStateOverlay';
30
30
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
31
- import { liveDocumentContainer } from '@volter/editor-core/live-document';
31
+ import { liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
32
32
  import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
33
- import { readinessFacet, subscribeRootReadiness } from '@volter/editor-core/readiness';
34
- import { explainSurface } from '@volter/editor-core/surface-state';
33
+ import { readinessFacet, subscribeRootReadiness } from '@volter/editor-sdk/kit/readiness';
34
+ import { explainSurface } from '@volter/editor-sdk/kit/surface-state';
35
35
  import {
36
36
  registerWorkspaceDocumentSelection,
37
37
  type WorkspaceDocumentContentProps,
38
- } from '@volter/editor-core/workspace-document-registry';
38
+ } from '@volter/editor-sdk/kit/workspace-document-registry';
39
39
  import type { AuthoringAdapter } from '@volter/editor-project/adapter';
40
40
  import { useEffect, useRef, useSyncExternalStore } from 'react';
41
41
  import { activeIngest } from './active-ingest';
@@ -147,7 +147,7 @@ export function IngestCanvasSceneContent({
147
147
  touchAction: 'none',
148
148
  }}
149
149
  >
150
- <CanvasSceneBackdrop view={view} />
150
+ <CanvasSceneBackdrop view={view} documentId={documentId} />
151
151
  <RootSelectionOverlay adapter={adapter} view={view} transformModeAware />
152
152
  <SurfaceStateOverlay
153
153
  explanation={surfaceExplanation}
@@ -159,6 +159,7 @@ export function IngestCanvasSceneContent({
159
159
  adapter={adapter}
160
160
  containerRef={containerRef}
161
161
  view={view}
162
+ documentId={documentId}
162
163
  />
163
164
  </div>
164
165
  );
@@ -173,5 +174,5 @@ export function installIngestCanvasScene(store: EditorShellStore): () => void {
173
174
  const Content = (props: WorkspaceDocumentContentProps) => (
174
175
  <IngestCanvasSceneContent {...props} adapter={adapter} store={store} worldId={worldId} />
175
176
  );
176
- return installIngestCanvasSceneDocument(store, Content);
177
+ return installIngestCanvasSceneDocument(Content);
177
178
  }
@@ -4,22 +4,20 @@
4
4
  * installer can be unit-tested without pulling Pixi/Three into jsdom.
5
5
  */
6
6
 
7
- import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
8
7
  import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
9
8
  import { isolationTabsReplaceGenericScene } from '@volter/editor-core/scene-document-plan';
10
- import { CANVAS_SCENE_DOCUMENT_ID } from '@volter/editor-core/workspace-document-ids';
9
+ import { CANVAS_SCENE_DOCUMENT_ID } from '@volter/editor-sdk/kit/workspace-document-ids';
11
10
  import {
12
11
  activateWorkspaceDocument,
13
12
  closeWorkspaceDocument,
14
13
  openWorkspaceDocument,
15
14
  type WorkspaceDocumentContentProps,
16
- } from '@volter/editor-core/workspace-document-registry';
15
+ } from '@volter/editor-sdk/kit/workspace-document-registry';
17
16
  import { registerRootDocumentRoute } from '@volter/editor-core/world-document-routing';
18
17
  import type { ReactNode } from 'react';
19
18
  import { activeIngest } from './active-ingest';
20
19
 
21
20
  export function installIngestCanvasSceneDocument(
22
- store: EditorShellStore,
23
21
  Content: (props: WorkspaceDocumentContentProps) => ReactNode,
24
22
  ): () => void {
25
23
  const live = activeIngest();
@@ -38,7 +36,6 @@ export function installIngestCanvasSceneDocument(
38
36
  Content,
39
37
  closeable: false,
40
38
  presentation: () => ({ kind: 'world', id: worldId }),
41
- onActivate: () => store.setActiveViewportTab('edit'),
42
39
  });
43
40
  activateWorkspaceDocument(CANVAS_SCENE_DOCUMENT_ID);
44
41
  const unregisterRoute = registerRootDocumentRoute(worldId, CANVAS_SCENE_DOCUMENT_ID);
@@ -9,9 +9,9 @@
9
9
  */
10
10
 
11
11
  import { gameContractEpoch } from '../host/coverage/game-contract-seam-evidence';
12
- import { recordLiveSeamEvidence } from '@volter/editor-core/coverage/live-seam-evidence';
13
- import { editorConsole } from '@volter/editor-core/editor-console';
14
- import { activateLiveDocument } from '@volter/editor-core/live-document';
12
+ import { recordLiveSeamEvidence } from '@volter/editor-sdk/kit/live-seam-evidence';
13
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
14
+ import { activateLiveDocument } from '@volter/editor-sdk/kit/live-document';
15
15
  import type { VgaiGameContract } from '@volter/editor-project/adapter/ingest/game-contract';
16
16
  import { activeIngest, type IngestLifecycleControl } from './active-ingest';
17
17
  import { readIngestGameContract } from './game-contract-realm';
@@ -55,7 +55,7 @@
55
55
  * notice.
56
56
  */
57
57
 
58
- import { adapterObservations } from '@volter/editor-core/adapter-observation';
58
+ import { adapterObservations } from '@volter/editor-sdk/kit/adapter-observation';
59
59
  import { createContractDebugAdapter } from '@volter/game-runtime/adapter/ingest/contract-debug-adapter';
60
60
  import {
61
61
  type ContractSurface,
@@ -46,14 +46,14 @@
46
46
  import {
47
47
  addMountFailureReport,
48
48
  formatMountFailureMessage,
49
- } from '@volter/editor-core/authoring/mount-failure-report';
49
+ } from '@volter/editor-sdk/kit/mount-failure-report';
50
50
  import { withStoreSelection } from '../host/authoring/mounted-authoring';
51
51
  import { makeNoAuthoringAdapter } from '@volter/editor-core/authoring/no-authoring-adapter';
52
52
  import { PixiAuthoringAdapter } from '../host/authoring/pixi-authoring-adapter';
53
53
  import { createLiveCanvasWriteTarget } from '../host/authoring/pixi-live-write-target';
54
54
  import { resolveCanvasPixiForEditor } from '../host/canvas-entry-runtime';
55
- import { CrashNullBoundary } from '@volter/editor-core/crash-null-boundary';
56
- import { editorConsole } from '@volter/editor-core/editor-console';
55
+ import { CrashNullBoundary } from '@volter/editor-sdk/kit/crash-null-boundary';
56
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
57
57
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
58
58
  import { authoringJournal } from '../host/history/json-history-resource';
59
59
  import { activeRealmServices } from '../host/realm-services';
@@ -12,10 +12,10 @@ import {
12
12
  addMountFailureReport,
13
13
  clearMountFailureReports,
14
14
  formatMountFailureMessage,
15
- } from '@volter/editor-core/authoring/mount-failure-report';
15
+ } from '@volter/editor-sdk/kit/mount-failure-report';
16
16
  import { makeNoAuthoringAdapter } from '@volter/editor-core/authoring/no-authoring-adapter';
17
17
  import { resolveAllRoots } from '../host/binding-resolver';
18
- import { editorConsole } from '@volter/editor-core/editor-console';
18
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
19
19
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
20
20
  import { fetchGameManifest } from '@volter/editor-core/manifest-project';
21
21
  import { getCurrentProject } from '@volter/editor-core/project-manager';
@@ -146,7 +146,6 @@ export async function enterModuleModeFromManifestRoot(
146
146
  }
147
147
  setActiveAuthoring(activeAuthoring);
148
148
  setActiveSystems(mounted.systems ?? {});
149
- store.setActiveViewportTab('play');
150
149
  store.notifyIngestEdit();
151
150
  clearMountFailureReports(); // D-W3: mount succeeded
152
151
 
@@ -215,9 +214,9 @@ export async function tryManifestModuleRoute(store: EditorShellStore): Promise<b
215
214
  return true;
216
215
  }
217
216
 
218
- import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-core/live-document';
217
+ import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
219
218
  // THE MODULE LANE, as the host sees it (`live-session-registry.ts`).
220
- import { registerLiveSession } from '@volter/editor-core/live-session-registry';
219
+ import { registerLiveSession } from '@volter/editor-sdk/kit/live-session-registry';
221
220
 
222
221
  registerLiveSession({
223
222
  id: 'module',
@@ -35,7 +35,7 @@ import {
35
35
  type ContractScenesStories,
36
36
  createContractScenesStories,
37
37
  } from '../host/authoring/contract-scenes-stories';
38
- import { clearMountFailureReports } from '@volter/editor-core/authoring/mount-failure-report';
38
+ import { clearMountFailureReports } from '@volter/editor-sdk/kit/mount-failure-report';
39
39
  import { PhaserLiveAuthoringAdapter } from '../host/authoring/phaser-live-authoring-adapter';
40
40
  import { PixiAuthoringAdapter } from '../host/authoring/pixi-authoring-adapter';
41
41
  import { createCreationSiteCanvasWriteTarget } from '../host/authoring/pixi-creation-site-write-target';
@@ -44,7 +44,7 @@ import {
44
44
  capturePixiDisplayObjectThumbnail,
45
45
  registerPresentedPixiApps,
46
46
  } from '@volter/editor-core/canvas-preview-frames';
47
- import { editorConsole } from '@volter/editor-core/editor-console';
47
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
48
48
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
49
49
  import { GAME_SURFACE_CONTAINMENT_CSS } from '../host/game-realm-page';
50
50
  import {
@@ -54,9 +54,9 @@ import {
54
54
  setGameSurface,
55
55
  } from '../host/gated-globals';
56
56
  import { authoringJournal } from '../host/history/json-history-resource';
57
- import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-core/live-document';
57
+ import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
58
58
  import { getCurrentProject } from '@volter/editor-core/project-manager';
59
- import { recordRootReadiness } from '@volter/editor-core/readiness';
59
+ import { recordRootReadiness } from '@volter/editor-sdk/kit/readiness';
60
60
  import type { MeasuredLoop } from '../host/same-realm-loop-gate';
61
61
  import { projectContractSystemAdapters } from '@volter/game-runtime/adapter/ingest/contract-system-adapters';
62
62
  import type { RenderDebugWiring } from '@volter/game-runtime/dev/render-debug-adapter';
@@ -346,7 +346,7 @@ function publishStructuralCanvasRuntime(
346
346
  // host-owned registry carrier to compose with either: what the game itself
347
347
  // declared is the only physics this route can have.
348
348
  publishCanvasIngestSystems(game.name, undefined, declaredCanvasPhysics());
349
- landIngestBootInEdit(store);
349
+ landIngestBootInEdit();
350
350
  store.notifyIngestEdit();
351
351
  clearMountFailureReports();
352
352
 
@@ -770,7 +770,7 @@ async function mountCanvasIngestRootInner(
770
770
  mount.capture.captured?.renderer,
771
771
  declaredPhysics ? physicsAdapter : null,
772
772
  );
773
- landIngestBootInEdit(store);
773
+ landIngestBootInEdit();
774
774
  store.notifyIngestEdit();
775
775
  clearMountFailureReports(); // D-W3: mount succeeded
776
776
  // PD-3: the mount stood — but `contract-ready` may only be recorded when the
@@ -26,8 +26,8 @@ import {
26
26
  type SystemAdapterMeasurement,
27
27
  type WriteReachFacts,
28
28
  } from '../host/coverage/capability-coverage';
29
- import { inspectSystemAdapterSeam } from '@volter/editor-core/coverage/system-seam-evidence';
30
- import { editorConsole } from '@volter/editor-core/editor-console';
29
+ import { inspectSystemAdapterSeam } from '@volter/editor-sdk/kit/system-seam-evidence';
30
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
31
31
  import {
32
32
  type MeasuredLoop,
33
33
  measuredLoop,
@@ -8,13 +8,13 @@
8
8
  import { measureAdapterReach } from '../host/adapter-reach';
9
9
  import { setActiveAuthoring } from '@volter/editor-core/authoring/active-adapter';
10
10
  import { setActiveSystems } from '@volter/editor-core/authoring/active-systems';
11
- import { clearMountFailureReports } from '@volter/editor-core/authoring/mount-failure-report';
11
+ import { clearMountFailureReports } from '@volter/editor-sdk/kit/mount-failure-report';
12
12
  import { resolveAllRoots } from '../host/binding-resolver';
13
- import { editorConsole } from '@volter/editor-core/editor-console';
13
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
14
14
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
15
15
  import { setGameInputGate } from '../host/gated-globals';
16
16
  import { authoringJournal } from '../host/history/json-history-resource';
17
- import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-core/live-document';
17
+ import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
18
18
  import { DomAuthoringAdapter } from '../react/dom-authoring-adapter';
19
19
  import type { ResolvedAdapterRoot, ResolvedGameManifest } from '@volter/editor-project/manifest/load';
20
20
  import { serializeEntry, setActiveIngest } from './active-ingest';
@@ -148,7 +148,7 @@ async function mountDomIngestRootInner(store: EditorShellStore, folderId: string
148
148
 
149
149
  setActiveAuthoring(adapter);
150
150
  setActiveSystems({});
151
- landIngestBootInEdit(store);
151
+ landIngestBootInEdit();
152
152
  store.notifyIngestEdit();
153
153
  clearMountFailureReports(); // D-W3: mount succeeded
154
154
 
@@ -253,7 +253,7 @@ export async function mountDomIngestRootFromManifest(
253
253
 
254
254
  setActiveAuthoring(adapter);
255
255
  setActiveSystems({});
256
- landIngestBootInEdit(store);
256
+ landIngestBootInEdit();
257
257
  store.notifyIngestEdit();
258
258
  clearMountFailureReports(); // D-W3: mount succeeded
259
259
 
@@ -34,14 +34,14 @@ import {
34
34
  formatMountFailureMessage,
35
35
  getMountFailureReports,
36
36
  type MountFailureReport,
37
- } from '@volter/editor-core/authoring/mount-failure-report';
38
- import { editorConsole } from '@volter/editor-core/editor-console';
37
+ } from '@volter/editor-sdk/kit/mount-failure-report';
38
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
39
39
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
40
- import { registerEditorStateFacet } from '@volter/editor-core/editor-state-facets';
41
- import { liveDocumentContainer } from '@volter/editor-core/live-document';
40
+ import { registerEditorStateFacet } from '@volter/editor-sdk/kit/editor-state-facets';
41
+ import { liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
42
42
  import { fetchGameManifest, isManifestAbsence } from '@volter/editor-core/manifest-project';
43
43
  import { getCurrentProject } from '@volter/editor-core/project-manager';
44
- import { onShellStore } from '@volter/editor-core/shell-store-door';
44
+ import { onThreeStore } from '@volter/editor-core/shell-store-door';
45
45
  import { ingestRoots, rootById } from '@volter/editor-project/adapter/manifest-interpreter';
46
46
  import { MANIFEST_FILENAME } from '@volter/editor-project/manifest/filename';
47
47
  import type { ResolvedAdapterRoot, ResolvedGameManifest } from '@volter/editor-project/manifest/load';
@@ -149,7 +149,7 @@ let _boundStore: EditorShellStore | null = null;
149
149
  * `project-session-reset.ts`, fired by `project-manager.ts`'s
150
150
  * `onProjectSessionEnd`.
151
151
  */
152
- onShellStore((store) => {
152
+ onThreeStore((store) => {
153
153
  _boundStore = store;
154
154
  clearMountFailureReports();
155
155
  });
@@ -677,7 +677,7 @@ async function autoLaunchIngestInner(store: EditorShellStore): Promise<void> {
677
677
  // never let an old bootstrap override it.
678
678
  if (deferredIngestPlayActive()) return;
679
679
  const { landIngestBootInEdit } = await import('./ingest-boot-viewport');
680
- landIngestBootInEdit(store);
680
+ landIngestBootInEdit();
681
681
  return;
682
682
  }
683
683
  await launchIngestRoutes(store);
@@ -22,11 +22,11 @@ import { measureAdapterReach } from '../host/adapter-reach';
22
22
  import { setActiveAuthoring } from '@volter/editor-core/authoring/active-adapter';
23
23
  import { setActiveSystems } from '@volter/editor-core/authoring/active-systems';
24
24
  import { withContractHierarchy } from '../host/authoring/contract-hierarchy-authoring';
25
- import { clearMountFailureReports } from '@volter/editor-core/authoring/mount-failure-report';
26
- import { editorConsole } from '@volter/editor-core/editor-console';
25
+ import { clearMountFailureReports } from '@volter/editor-sdk/kit/mount-failure-report';
26
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
27
27
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
28
28
  import { gameLoopGate, setGameInputGate } from '../host/gated-globals';
29
- import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-core/live-document';
29
+ import { acquireLiveDocument, liveDocumentContainer } from '@volter/editor-sdk/kit/live-document';
30
30
  import { pickGameCamera } from '@volter/editor-core/scene-framing';
31
31
  import type { ResolvedAdapterRoot } from '@volter/editor-project/manifest/load';
32
32
  import type { CaptureMechanism } from '@volter/threejs-runtime/adapter/ingest/scene-capture';
@@ -164,7 +164,7 @@ function activateCapturedThreeIngest(args: {
164
164
  // level-streaming game captures on its first drawn frame and then parses its
165
165
  // world in for several seconds afterwards.
166
166
  store.focusOnScene(() => pickGameCamera(mount.capture.captured?.camera, liveScene));
167
- landIngestBootInEdit(store);
167
+ landIngestBootInEdit();
168
168
  store.notifyIngestEdit(); // ensure panels re-render against the override
169
169
  clearMountFailureReports(); // D-W3: mount succeeded
170
170
 
@@ -18,8 +18,8 @@
18
18
 
19
19
  import { setActiveAuthoring } from '@volter/editor-core/authoring/active-adapter';
20
20
  import { setActiveSystems } from '@volter/editor-core/authoring/active-systems';
21
- import { clearMountFailureReports } from '@volter/editor-core/authoring/mount-failure-report';
22
- import { editorConsole } from '@volter/editor-core/editor-console';
21
+ import { clearMountFailureReports } from '@volter/editor-sdk/kit/mount-failure-report';
22
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
23
23
  import { reclaimGameRealm } from '../host/game-realm-reclaim';
24
24
  import { setGameRealmReloadHandler } from '../host/gated-globals';
25
25
  import {
@@ -1,4 +1,5 @@
1
- import { onAssetReload } from '@volter/editor-core/project-asset-refresh';
1
+ import { onAssetReload } from '@volter/editor-sdk/kit/project-asset-refresh';
2
+ import { evictDreiCaches } from '../three/drei-asset-caches';
2
3
  import { editorHost } from '@volter/editor-sdk/host';
3
4
 
4
5
  /**
@@ -33,22 +34,22 @@ import {
33
34
  resolvesLiveOnly,
34
35
  runWritePipe,
35
36
  type WriteAck,
36
- } from '@volter/editor-core/authoring/write-pipe';
37
+ } from '@volter/editor-sdk/kit/write-pipe';
37
38
  import { resolveAllRootEntries } from '../host/binding-resolver';
38
39
  import type { LogEntry } from '@volter/editor-core/editor-api';
39
40
  import { endLogSession, flushLogEntries, startLogSession } from '@volter/editor-core/editor-api';
40
- import type { ConsoleEntry } from '@volter/editor-core/editor-console';
41
+ import type { ConsoleEntry } from '@volter/editor-sdk/kit/editor-console';
41
42
  import {
42
43
  editorConsole,
43
44
  formatConsoleArgs,
44
45
  resumeEditorConsoleCapture,
45
46
  suspendEditorConsoleCapture,
46
- } from '@volter/editor-core/editor-console';
47
+ } from '@volter/editor-sdk/kit/editor-console';
47
48
  import { EDITOR_PARTICIPANT_ID, sendControl } from '@volter/editor-core/editor-presence';
48
49
  import {
49
50
  isEditorPresentationActive,
50
51
  subscribeEditorPresentationActivity,
51
- } from '@volter/editor-core/editor-presentation-activity';
52
+ } from '@volter/editor-sdk/kit/editor-presentation-activity';
52
53
  import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
53
54
  import { GAME_SURFACE_CONTAINMENT_CSS } from '../host/game-realm-page';
54
55
  import { reclaimGameRealm } from '../host/game-realm-reclaim';
@@ -60,9 +61,9 @@ import {
60
61
  setGameInputGate,
61
62
  setGameSurface,
62
63
  } from '../host/gated-globals';
63
- import { hierarchyProjectionFromProjectConfig } from '@volter/editor-core/hierarchy-projection';
64
+ import { hierarchyProjectionFromProjectConfig } from '@volter/editor-sdk/kit/hierarchy-projection';
64
65
  import { type JournalSubject, playJournal } from '../host/history/json-history-resource';
65
- import { isEditableTarget, setActiveScope } from '@volter/editor-core/hotkeys';
66
+ import { isEditableTarget, setActiveScope } from '@volter/editor-sdk/kit/hotkeys';
66
67
  import { projectBootstrapSettled } from '@volter/editor-core/initial-project';
67
68
  import { registerGameNullSubject } from '@volter/editor-core/inspection/game-subject';
68
69
  import { fetchGameManifest } from '@volter/editor-core/manifest-project';
@@ -73,21 +74,21 @@ import {
73
74
  markPlayBootPhase,
74
75
  type PlayBootPhase,
75
76
  } from '@volter/editor-core/play-boot-phase';
76
- import { presentationSurface } from '@volter/editor-core/presentation-surface';
77
+ import { presentationSurface } from '@volter/editor-sdk/kit/presentation-surface';
77
78
  import { getCurrentProject } from '@volter/editor-core/project-manager';
78
79
  import {
79
80
  beginProjectModuleSplitWatch,
80
81
  clearProjectModuleSplitReports,
81
82
  endProjectModuleSplitWatch,
82
83
  formatProjectModuleSplitMessage,
83
- } from '@volter/editor-core/project-module-split';
84
- import { clearRootReadiness, recordRootReadiness } from '@volter/editor-core/readiness';
85
- import { onShellStore } from '@volter/editor-core/shell-store-door';
84
+ } from '@volter/editor-sdk/kit/project-module-split';
85
+ import { clearRootReadiness, recordRootReadiness } from '@volter/editor-sdk/kit/readiness';
86
+ import { onThreeStore } from '@volter/editor-core/shell-store-door';
86
87
  import { mountedStoryHasPixiContent } from '@volter/editor-core/stories/pixi-story-model';
87
88
  import { domHasRenderableContent, threeSceneHasRenderableContent } from '../host/surface-content';
88
- import { subscribeSurfaceKeyboard, surfaceHoldsKeyboard } from '@volter/editor-core/surface-keyboard';
89
+ import { subscribeSurfaceKeyboard, surfaceHoldsKeyboard } from '@volter/editor-sdk/kit/surface-keyboard';
89
90
  import { publishToolContributionPlay } from '@volter/editor-core/tool-contribution-play';
90
- import { liveWorldId } from '../host/viewport-root-presentation';
91
+ import { liveWorldId, presentThreeRoots } from '../host/viewport-root-presentation';
91
92
  import {
92
93
  cancelPendingWorkspacePlayUtilities,
93
94
  revealWorkspacePlayUtilities,
@@ -945,7 +946,9 @@ function drainDebugEventsToPlayLog(): void {
945
946
  }
946
947
 
947
948
  // Asset bytes have changed, but a running game retains its own instances.
948
- const stopAssetReload = onAssetReload(() => {
949
+ const stopAssetReload = onAssetReload((paths) => {
950
+ // Cleared whether or not a run is live, so the next run loads the new bytes.
951
+ void evictDreiCaches(paths);
949
952
  if (!_instance.session) return;
950
953
  markRestartRequired(
951
954
  'Project assets changed — restart play to load the revised models or textures.',
@@ -1036,7 +1039,7 @@ function focusGameSurface(): void {
1036
1039
  * workspace panel names Play to hand it the store; the authored viewport is
1037
1040
  * read through `viewport-door.ts` when a session presents its roots.
1038
1041
  */
1039
- onShellStore((store) => bindPlayMode(store));
1042
+ onThreeStore((store) => bindPlayMode(store));
1040
1043
 
1041
1044
  export function bindPlayMode(store: EditorShellStore): void {
1042
1045
  _ctx = { store, gameContainer: null! }; // set dynamically from the live document's container
@@ -1821,7 +1824,12 @@ async function enterPlayModeInner(
1821
1824
  // liveHierarchy: first-party play mode is the ONLY adoption path that may
1822
1825
  // synthesize descriptors for untagged runtime objects (anti-shim rule —
1823
1826
  // ingest/module mounts adopt foreign scenes and must never fabricate).
1824
- _instance.presentation = editorHost().viewport.presentRoots(session.game.roots);
1827
+ // With no stage bound to present them (no Scene tab open: the Game tab and a model document
1828
+ // are the whole layout), Play still adopts its roots, so the hierarchy door and every
1829
+ // inspector reach the live objects exactly as they do beside a Scene tab.
1830
+ _instance.presentation =
1831
+ editorHost().viewport.presentRoots(session.game.roots) ??
1832
+ presentThreeRoots(store, session.game.roots);
1825
1833
  markPlayBootPhase('installing play authoring for each root');
1826
1834
  await installPlayRootAuthoring(
1827
1835
  store,
@@ -1883,6 +1891,12 @@ async function enterPlayModeInner(
1883
1891
  // baked into their own urls, so the gate has to be registered under it or
1884
1892
  // the modules find the default realm's gate instead of their own.
1885
1893
  setGameInputGate(() => instanceInputActive(mountId), mountId);
1894
+ // THE DEFAULT REALM follows the focused instance too. Module-lifetime code
1895
+ // that no mount id reaches lives there — a game's own `InputManager`
1896
+ // (`@volter/game-runtime`'s input, served through the realm shadow) — and
1897
+ // the stop path leaves it open, so a key aimed at a Model document while
1898
+ // the game played still reached it.
1899
+ setGameInputGate(() => instanceInputActive(focusedInstanceId()));
1886
1900
  // Sync EVERY live instance's first-party InputManager from the play/tab/
1887
1901
  // focus predicate whenever the store changes (a tab switch flips the active
1888
1902
  // viewport for all of them). `resyncInstanceInputs` resolves each
@@ -38,7 +38,7 @@
38
38
  */
39
39
 
40
40
  import { isRootCanvas } from '@volter/editor-core/composite-screenshot';
41
- import { editorConsole } from '@volter/editor-core/editor-console';
41
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
42
42
  import {
43
43
  type GameplayRecordingCapture,
44
44
  type GameplayRecordingStarted,
@@ -17,7 +17,7 @@ import {
17
17
  type TimeSpentRow,
18
18
  timeSpentRows,
19
19
  } from '../host/components/frame-debugger-model';
20
- import { isJsHeapReading, readJsHeap } from '@volter/editor-core/js-heap';
20
+ import { isJsHeapReading, readJsHeap } from '@volter/editor-sdk/kit/js-heap';
21
21
  import { useActivePerformanceSource } from '../host/use-active-performance-source';
22
22
  import { editorHost, useHostAvailabilitySelector } from '@volter/editor-sdk/host';
23
23
  import {
@@ -4,8 +4,8 @@
4
4
  * composed story of the project laid out as an isolated, labeled frame, with
5
5
  * the root entry's own story (derived, never labeled — the story whose CSF
6
6
  * `meta.component` is the entry's default export) as the frame it opens on.
7
- * A project with no stories, and the pasteboard document's `entryOnly`
8
- * descriptor, fall back to mounting the entry once against an inert Game.
7
+ * A project with no stories falls back to mounting the entry once against an
8
+ * inert Game.
9
9
  *
10
10
  * ## Why this is a package and not the host's
11
11
  *
@@ -38,8 +38,7 @@
38
38
  * them as `@volter/editor-game/react/…` and declares the dependency.
39
39
  * - `@editor/authoring/react-story-board.ts` (the board geometry) —
40
40
  * `@editor/components/RootSelectionOverlay.tsx:98`,
41
- * `@editor/components/ReactCanvasControls.tsx:15`,
42
- * `@editor/pasteboard-materialize.ts:20` and
41
+ * `@editor/components/ReactCanvasControls.tsx:15` and
43
42
  * `@editor/canvas-board/CanvasBoardDocument.tsx:57` read its frame
44
43
  * placements. Host chrome drawn OVER the board, which is a different
45
44
  * question from how the board mounts.
@@ -65,17 +64,17 @@ import {
65
64
  rememberPortableStory,
66
65
  } from '@volter/editor-core/authoring/design-time-layers';
67
66
  import type { DesignTimeMountContext } from '@volter/editor-core/authoring/design-time-mount-registry';
68
- import { formatMountFailureMessage } from '@volter/editor-core/authoring/mount-failure-report';
67
+ import { formatMountFailureMessage } from '@volter/editor-sdk/kit/mount-failure-report';
69
68
  import type { ReactStoryBoardSelectionIntent } from '@volter/editor-core/authoring/react-story-board';
70
69
  import { createReactStoryBoard } from '@volter/editor-core/authoring/react-story-board';
71
70
  import {
72
71
  getRootCanvasViewport,
73
72
  setRootCanvasViewport,
74
- } from '@volter/editor-core/authoring/world-canvas-viewport-state';
75
- import { recordAuthoringConsumerUse } from '@volter/editor-core/coverage/authoring-seam-evidence';
76
- import { CrashNullBoundary } from '@volter/editor-core/crash-null-boundary';
73
+ } from '@volter/editor-sdk/kit/world-canvas-viewport-state';
74
+ import { recordAuthoringConsumerUse } from '@volter/editor-sdk/kit/authoring-seam-evidence';
75
+ import { CrashNullBoundary } from '@volter/editor-sdk/kit/crash-null-boundary';
77
76
  import { readProjectTextFile } from '@volter/editor-core/editor-api';
78
- import { editorConsole } from '@volter/editor-core/editor-console';
77
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
79
78
  import {
80
79
  resolveReactRootMountRuntime,
81
80
  resolveWorldProviderForProject,
@@ -101,7 +100,7 @@ import {
101
100
  import { domStoryBoardMembers } from '@volter/editor-core/stories/three-story-model';
102
101
  import { getDesignTokens } from '@volter/editor-core/ui-source/inspect';
103
102
  import { tierSourceWriteBackend } from '@volter/editor-core/ui-source/tier-source-write-backend';
104
- import { recordViewportFirstFrame } from '@volter/editor-core/viewport-activation-timings';
103
+ import { recordViewportFirstFrame } from '@volter/editor-sdk/kit/viewport-activation-timings';
105
104
  import { createAssetCache } from '@volter/threejs-runtime/assets';
106
105
  import { createGameLoop } from '@volter/game-runtime/core/game-loop';
107
106
  import type { ResolvedAdapterRoot } from '@volter/editor-project/manifest/load';
@@ -352,7 +351,7 @@ export async function mountReactDesignLayer(
352
351
  // is only what picks the INITIAL frame). Without this the derivation would
353
352
  // silently gate the entire design surface — a broken entry would take every
354
353
  // story down with it.
355
- if (portableStories.length > 0 && !candidate.entryOnly) {
354
+ if (portableStories.length > 0) {
356
355
  const rememberedStoryId = rememberedPortableStory(projectRoot, candidate.worldId);
357
356
  // Remembered choice, else the derived default, else discovery order —
358
357
  // the same "no explicit default falls back to first" rule the registry
@@ -612,18 +611,13 @@ export async function mountReactDesignLayer(
612
611
  // (the caller degrades it to a #18 disclosure node).
613
612
  if (!entry.ok) throw entry.error instanceof Error ? entry.error : new Error(String(entry.error));
614
613
 
615
- // An entryOnly mount (the pasteboard document) ASKED for exactly this
616
- // branch — the file is the canvas and its default export the one subject —
617
- // so "no CSF preview, falling back" would be noise about working-as-designed.
618
- if (!candidate.entryOnly) {
619
- editorConsole.warn(
620
- `[design-time-layers] React root "${candidate.worldId}" has no portable CSF preview — the ` +
621
- 'project declares no UI stories. Add a *.stories.tsx; give it a `meta.component` of ' +
622
- `this root's entry component${entryComponentName ? ` (${entryComponentName}, ${candidate.path})` : ''} ` +
623
- 'to make it this root’s default preview. Falling back to the inert-Game preview.',
624
- 'authoring',
625
- );
626
- }
614
+ editorConsole.warn(
615
+ `[design-time-layers] React root "${candidate.worldId}" has no portable CSF preview — the ` +
616
+ 'project declares no UI stories. Add a *.stories.tsx; give it a `meta.component` of ' +
617
+ `this root's entry component${entryComponentName ? ` (${entryComponentName}, ${candidate.path})` : ''} ` +
618
+ 'to make it this root’s default preview. Falling back to the inert-Game preview.',
619
+ 'authoring',
620
+ );
627
621
 
628
622
  const Entry = entry.Entry;
629
623
  const WorldProvider = await resolveWorldProviderForProject();