@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
@@ -0,0 +1,105 @@
1
+ {
2
+ "schemaVersion": 3,
3
+ "name": "Unreal",
4
+ "theme": {
5
+ "id": "unreal",
6
+ "color": {
7
+ "surface": {
8
+ "shell": "#151515",
9
+ "panel": "#242424",
10
+ "chrome": "#151515",
11
+ "raised": "#383838",
12
+ "inset": "#0f0f0f",
13
+ "overlay": "rgba(36,36,36,0.97)"
14
+ },
15
+ "boundary": {
16
+ "default": "#151515",
17
+ "strong": "#0f0f0f",
18
+ "area": "#151515",
19
+ "indent": "#383838",
20
+ "divider": "#1a1a1a"
21
+ },
22
+ "content": {
23
+ "primary": "#c0c0c0",
24
+ "muted": "#b4b4b4",
25
+ "dim": "#858585",
26
+ "onAccent": "#ffffff",
27
+ "menu": "#c0c0c0",
28
+ "status": "#a7a7a7",
29
+ "placeholder": "#6d6d6d",
30
+ "active": "#4d9be9",
31
+ "selected": "#ffffff",
32
+ "onBright": {
33
+ "primary": "#151515",
34
+ "muted": "rgba(21,21,21,0.82)",
35
+ "dim": "rgba(21,21,21,0.7)"
36
+ }
37
+ },
38
+ "accent": {
39
+ "default": "#0f6ece",
40
+ "muted": "#40576f"
41
+ },
42
+ "widget": {
43
+ "regular": "#383838",
44
+ "menu": "#242424",
45
+ "field": "#0f0f0f",
46
+ "emboss": "rgba(0,0,0,0.2)"
47
+ },
48
+ "viewport": {
49
+ "background": "#000000",
50
+ "grid": "#5a5a5a",
51
+ "axisX": "#c02800",
52
+ "axisY": "#66a600",
53
+ "axisZ": "#2e75df",
54
+ "selection": "#eaa112",
55
+ "wire": "#eaa112",
56
+ "active": "#eaa112"
57
+ },
58
+ "gizmo": {
59
+ "x": "#c02800",
60
+ "y": "#66a600",
61
+ "z": "#2e75df",
62
+ "navigationX": "#ff0000",
63
+ "navigationY": "#00ff00",
64
+ "navigationZ": "#0000ff",
65
+ "hover": "#ffff00",
66
+ "drag": "#ffff00"
67
+ },
68
+ "region": {
69
+ "outliner": "#242424",
70
+ "properties": "#242424"
71
+ },
72
+ "category": {
73
+ "object": "#8fb8f0",
74
+ "modifier": "#8fb8f0",
75
+ "material": "#a27f4b",
76
+ "data": "#9fd88c",
77
+ "scene": "#c0c0c0",
78
+ "collection": "#c0c0c0",
79
+ "tool": "#c0c0c0",
80
+ "operator": "#9fd88c"
81
+ },
82
+ "semantic": {
83
+ "danger": "#ff6b5b",
84
+ "dangerMuted": "rgba(255,120,107,0.28)",
85
+ "dangerFaint": "rgba(255,120,107,0.12)",
86
+ "warning": "#ffc107",
87
+ "warningMuted": "rgba(255,221,101,0.28)",
88
+ "success": "#7cc576",
89
+ "successMuted": "rgba(69,255,139,0.28)",
90
+ "dynamic": "#ffdd65",
91
+ "dynamicMuted": "rgba(255,221,101,0.18)",
92
+ "instance": "#7bbcff"
93
+ },
94
+ "neutralOverlay": {
95
+ "hover": "rgba(255,255,255,0.1)",
96
+ "active": "rgba(255,255,255,0.16)"
97
+ },
98
+ "scrim": "rgba(0,0,0,0.6)"
99
+ },
100
+ "typography": {
101
+ "sans": "'Inter', 'Segoe UI', system-ui, sans-serif",
102
+ "mono": "'Roboto Mono', Menlo, monospace"
103
+ }
104
+ }
105
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * THE UNREAL LOOK — Unreal Engine 5's dark editor skin and its Level Editor viewport's
3
+ * colours, made only of values (`docs/VIEWPORT-STAGE.md`, the Unreal column).
4
+ *
5
+ * Unreal is not installed here and its documentation states none of these numbers, so every
6
+ * value is READ from the documentation's frames (`engine-reference/unreal/level-editor.png`,
7
+ * 1920 x 1020), not transcribed from source. The chrome: panels #242424 on a #151515 shell,
8
+ * #0f0f0f fields, the #0f6ece armed-tool blue, #40576f selected rows. The viewport: the
9
+ * selection outline's core #eaa112, about three pixels wide; the Move widget's axes, their
10
+ * brightest unshaded pixels (#c02800, #66a600, #2e75df); the corner triad's pure #ff0000,
11
+ * #00ff00, #0000ff. The fill is black, what an Unreal level with no sky shows.
12
+ * Light, sky and overlays are the VIEW's presentation, not this look's.
13
+ */
14
+ import type { StyleContribution } from '@volter/editor-sdk/looks';
15
+ import palette from './unreal.palette.json';
16
+
17
+ export const point = 'workspace.style';
18
+ export const style: StyleContribution = {
19
+ id: 'unreal',
20
+ title: 'Unreal',
21
+ paletteId: 'unreal',
22
+ materialId: 'unreal',
23
+ material: {
24
+ id: 'unreal',
25
+ title: 'Unreal',
26
+ description: 'Near-black flat panels, four-pixel corners, pill-shaped viewport toolbar buttons.',
27
+ shape: { small: '4px', medium: '4px', large: '6px', full: '9999px' },
28
+ elevation: {
29
+ small: 'none',
30
+ medium: '0 2px 8px rgba(0,0,0,0.55)',
31
+ large: '0 6px 18px rgba(0,0,0,0.6)',
32
+ },
33
+ stage: {
34
+ // Unreal keeps its widget a constant size on screen; in `level-editor.png` the Move
35
+ // arrows reach 85 to 100 px from the centre sphere. Fitted, not transcribed.
36
+ gizmoSize: 128,
37
+ // The axis triad in the viewport's bottom-left corner (`level-editor.png`).
38
+ navigationGizmo: 'triad',
39
+ navigationCorner: 'bottom-left',
40
+ navigationSize: 1.3,
41
+ // Unreal's arrows end in slim cones about 14 px long on ~85 px shafts (`level-editor.png`),
42
+ // fitted side by side at 1x.
43
+ gizmoArrowLength: 0.85,
44
+ gizmoArrowHead: 0.8,
45
+ // A hard yellow-orange line about three pixels wide around the whole silhouette; the
46
+ // parts other objects hide are drawn too (dotted in Unreal, behind the table). Widths
47
+ // over 4 widen the blur kernel and the band goes pale and soft (measured: 5 peaks at
48
+ // #dfad6b over the sky), so 3 is the widest solid band the crisp form draws.
49
+ outlineStyle: 'crisp',
50
+ outlineWidth: 3,
51
+ outlineHidden: true,
52
+ gridLineWidth: 1,
53
+ gridMajorWidth: 1,
54
+ gridMajorContrast: 1.3,
55
+ },
56
+ },
57
+ palette,
58
+ };
@@ -0,0 +1,88 @@
1
+ /**
2
+ * UNREAL'S DEFAULT LEVEL VIEWPORT: a preview sky standing in for the level's own, no grid, the
3
+ * outline, the Move tool with its free-move centre, a Z-up LEFT-handed world, and the axis
4
+ * triad as an indicator, and a preview floor taking the sun's shadow. The view's behaviour (tool,
5
+ * handles, axes, world, grid off) is read from `default-interface.png`; the sky, cloud and floor
6
+ * values are FITTED to `level-editor.png` (sampled pixel colours and a side-by-side), not
7
+ * transcribed from Unreal's own BP_Sky_Sphere or floor material.
8
+ * A named view (`@volter/editor-sdk/kit/viewport-presentation` `ViewPreset`): what the view does
9
+ * and how it is lit, never its look — pair it with the Unreal style for the whole target.
10
+ */
11
+ import type { ViewPreset } from '@volter/editor-sdk/kit/viewport-presentation';
12
+
13
+ export const point = 'workspace.view';
14
+ export const view: ViewPreset = {
15
+ id: 'unreal',
16
+ title: 'Unreal',
17
+ layer: {
18
+ all: {
19
+ lighting: {
20
+ source: 'preview',
21
+ preview: {
22
+ sun: {
23
+ enabled: true,
24
+ color: '#ffffff',
25
+ energy: 2.5,
26
+ altitude: 45,
27
+ azimuth: 300,
28
+ shadowDistance: 100,
29
+ },
30
+ environment: {
31
+ enabled: true,
32
+ sky: {
33
+ top: '#566b8c',
34
+ horizon: '#8ea6bf',
35
+ ground: '#2b323b',
36
+ topCurve: 0.1,
37
+ groundCurve: 0.12,
38
+ clouds: { cover: 0.55, opacity: 0.9, scale: 16 },
39
+ },
40
+ energy: 1,
41
+ rotation: 0,
42
+ },
43
+ },
44
+ tone: {
45
+ mapper: 'none',
46
+ exposure: 1,
47
+ },
48
+ },
49
+ backdrop: {
50
+ source: 'environment',
51
+ opacity: 1,
52
+ blur: 0,
53
+ },
54
+ },
55
+ overlays: {
56
+ navigation: 'indicator',
57
+ grid: {
58
+ visible: false,
59
+ },
60
+ floor: {
61
+ visible: true,
62
+ color: '#0a1428',
63
+ },
64
+ selection: {
65
+ outline: true,
66
+ wire: false,
67
+ box: false,
68
+ },
69
+ axes: {
70
+ x: false,
71
+ y: false,
72
+ z: false,
73
+ },
74
+ },
75
+ interaction: {
76
+ bootTool: 'move',
77
+ transformHandles: {
78
+ scale: false,
79
+ viewRotate: false,
80
+ freeMove: true,
81
+ },
82
+ },
83
+ world: {
84
+ upAxis: 'z',
85
+ handedness: 'left',
86
+ },
87
+ },
88
+ };
@@ -0,0 +1,16 @@
1
+ // serving/index.ts
2
+ import { fileURLToPath } from "node:url";
3
+ var GAME_MODULE_ACCESS = "@editor/game-module-access";
4
+ var ALIASED_GAME_MODULE_ACCESS = /\/editor-core\/src\/game-module-access$/;
5
+ var servingPlugins = (_services) => [
6
+ {
7
+ name: "volter-editor-game:game-module-access",
8
+ enforce: "pre",
9
+ resolveId(id) {
10
+ return id === GAME_MODULE_ACCESS || ALIASED_GAME_MODULE_ACCESS.test(id) ? fileURLToPath(new URL("../src/host/game-module-access.ts", import.meta.url)) : null;
11
+ }
12
+ }
13
+ ];
14
+ export {
15
+ servingPlugins
16
+ };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@volter/editor-game",
3
3
  "author": "Volter AI, Inc.",
4
4
  "license": "AGPL-3.0-only",
5
- "version": "0.5.65",
5
+ "version": "0.5.66",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
@@ -15,7 +15,9 @@
15
15
  },
16
16
  "files": [
17
17
  "src",
18
+ "serving",
18
19
  "contributions",
20
+ "dist-node",
19
21
  "LICENSE",
20
22
  "NOTICE"
21
23
  ],
@@ -51,6 +53,8 @@
51
53
  "./contributions/gameplay.command.ts",
52
54
  "./contributions/generation.service.ts",
53
55
  "./contributions/generations.status.tsx",
56
+ "./contributions/godot.style.ts",
57
+ "./contributions/godot.view.ts",
54
58
  "./contributions/ingest.service.ts",
55
59
  "./contributions/instances.command.ts",
56
60
  "./contributions/navmesh.menu.ts",
@@ -66,13 +70,12 @@
66
70
  "./contributions/state-watch.utility.tsx",
67
71
  "./contributions/team-playtest.service.ts",
68
72
  "./contributions/transport.header.tsx",
69
- "./contributions/xstate-behavior.action.ts",
70
- "./contributions/xstate-behavior.document.tsx",
71
- "./contributions/xstate-behavior.inspector.tsx",
72
- "./contributions/xstate-behavior.menu.ts",
73
+ "./contributions/unity.style.ts",
74
+ "./contributions/unity.view.ts",
75
+ "./contributions/unreal.style.ts",
76
+ "./contributions/unreal.view.ts",
73
77
  "./contributions/react/component-board.service.ts",
74
78
  "./contributions/react/design-time-mount.service.ts",
75
- "./contributions/react/pasteboard.action.ts",
76
79
  "./contributions/react/react-inspector.service.ts",
77
80
  "./contributions/react/story-documents.service.ts",
78
81
  "./contributions/three/camera-runtime.inspector.tsx",
@@ -84,15 +87,16 @@
84
87
  "./contributions/three/reflection-probe-capture.inspector.tsx",
85
88
  "./contributions/three/story-documents.service.ts",
86
89
  "./contributions/three/three-authoring.service.ts"
87
- ]
90
+ ],
91
+ "serving": "./dist-node/serving.mjs"
88
92
  },
89
93
  "dependencies": {
90
- "@volter/editor-core": "0.5.65",
91
- "@volter/editor-sdk": "0.5.65",
92
- "@volter/editor-project": "0.5.65",
93
- "@volter/editor-threejs": "0.5.65",
94
- "@volter/threejs-runtime": "0.5.65",
95
- "@volter/game-runtime": "0.5.65",
94
+ "@volter/editor-core": "0.5.66",
95
+ "@volter/editor-sdk": "0.5.66",
96
+ "@volter/editor-project": "0.5.66",
97
+ "@volter/editor-threejs": "0.5.66",
98
+ "@volter/threejs-runtime": "0.5.66",
99
+ "@volter/game-runtime": "0.5.66",
96
100
  "@colyseus/schema": "^4.0.14",
97
101
  "@colyseus/sdk": "^0.17.34",
98
102
  "@fortawesome/free-solid-svg-icons": "^7.2.0",
@@ -122,7 +126,8 @@
122
126
  "recast-navigation": "^0.43.0",
123
127
  "xstate": "^5.32.4",
124
128
  "zod": "^4.3.6",
125
- "@fortawesome/fontawesome-svg-core": "^7.2.0"
129
+ "@fortawesome/fontawesome-svg-core": "^7.2.0",
130
+ "@volter/editor-react": "0.5.66"
126
131
  },
127
132
  "peerDependencies": {
128
133
  "@sparkjsdev/spark": "^2.1.0",
@@ -134,6 +139,8 @@
134
139
  "@playwright/test": "^1.58.2"
135
140
  },
136
141
  "scripts": {
142
+ "build": "node scripts/build-serving.mjs",
143
+ "prepack": "npm run build",
137
144
  "typecheck": "tsc -p tsconfig.json"
138
145
  },
139
146
  "peerDependenciesMeta": {
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `@volter/editor-game`'s server half (`package.json#vgai.serving`): the one deep specifier a
3
+ * game's own contributions name, `@editor/game-module-access` (the template's
4
+ * `src/contributions/use-game-modules.ts`), resolved to this package's module. The page
5
+ * bundle maps the same specifier for its own copy (`src/host/served-bundle-runtime-modules.ts`);
6
+ * a contribution the session's Vite serves needs the file.
7
+ */
8
+
9
+ import { fileURLToPath } from 'node:url';
10
+ import type { ProjectServingServices } from '@volter/editor-sdk/session/project-serving';
11
+
12
+ const GAME_MODULE_ACCESS = '@editor/game-module-access';
13
+ /** The kit's `@editor/*` alias runs before any plugin and rewrites the specifier to the kit's
14
+ * own `src/`, where this module no longer lives; that form is this package's too. */
15
+ const ALIASED_GAME_MODULE_ACCESS = /\/editor-core\/src\/game-module-access$/;
16
+
17
+ export const servingPlugins = (_services: ProjectServingServices): readonly unknown[] => [
18
+ {
19
+ name: 'volter-editor-game:game-module-access',
20
+ enforce: 'pre',
21
+ resolveId(id: string): string | null {
22
+ return id === GAME_MODULE_ACCESS || ALIASED_GAME_MODULE_ACCESS.test(id)
23
+ ? fileURLToPath(new URL('../src/host/game-module-access.ts', import.meta.url))
24
+ : null;
25
+ },
26
+ },
27
+ ];
@@ -21,8 +21,8 @@
21
21
  * raw attribute/index bytes for geometry.
22
22
  */
23
23
 
24
- import { sha256Hex } from '@volter/editor-core/bytes-codec';
25
- import type { StorageBackend } from '@volter/editor-core/storage/types';
24
+ import { sha256Hex } from '@volter/editor-sdk/kit/bytes-codec';
25
+ import { isPublicRootedBackend, type StorageBackend } from '@volter/editor-sdk/kit/storage-types';
26
26
  import type { Document } from '@gltf-transform/core';
27
27
  import { inspect } from '@gltf-transform/functions';
28
28
  import { getGltfIO } from './gltf-io';
@@ -482,7 +482,7 @@ export async function collectProjectBudgetSource(
482
482
  // `/vgai.project.json` (`manifest-project.ts`) and the `.vgai/`-scoped
483
483
  // `/__editor/vgai-file` route (`project-provenance.ts`). Anything
484
484
  // unavailable stays honestly absent — no fabricated owners or stamps.
485
- if (backend.id === 'http') {
485
+ if (isPublicRootedBackend(backend)) {
486
486
  const ownerFiles: AssetBudgetFile[] = [];
487
487
  const virtualTexts = new Map<string, string>();
488
488
  try {
@@ -20,11 +20,11 @@
20
20
  * happened, so the failure is returned for the UI to surface.
21
21
  */
22
22
 
23
- import { sha256Hex } from '@volter/editor-core/bytes-codec';
24
- import { assertEditorServerAnswered } from '@volter/editor-core/editor-server-response';
25
- import { sourceMutationAttribution } from '@volter/editor-core/editor-session-attribution';
26
- import { handleProjectMutationFailure } from '@volter/editor-core/source-conflict';
27
- import type { StorageBackend } from '@volter/editor-core/storage/types';
23
+ import { sha256Hex } from '@volter/editor-sdk/kit/bytes-codec';
24
+ import { assertEditorServerAnswered } from '@volter/editor-sdk/kit/editor-server-response';
25
+ import { sourceMutationAttribution } from '@volter/editor-sdk/kit/editor-session-attribution';
26
+ import { handleProjectMutationFailure } from '@volter/editor-sdk/kit/source-conflict';
27
+ import { isPublicRootedBackend, type StorageBackend } from '@volter/editor-sdk/kit/storage-types';
28
28
  import { invalidateCachedAsset } from '@volter/threejs-runtime/asset-loaders';
29
29
 
30
30
  const PROVENANCE_PATH = '.vgai/provenance.json';
@@ -82,7 +82,7 @@ function ledgerAssetPath(storagePath: string): string {
82
82
  * backend reaches the project root directly.
83
83
  */
84
84
  async function readLedgerText(backend: StorageBackend): Promise<string | null> {
85
- if (backend.id === 'http') {
85
+ if (isPublicRootedBackend(backend)) {
86
86
  // NOT read through `editor-server-response.ts`: the GET half of this route
87
87
  // answers `text/plain` (routes/project-source.ts) because it serves raw
88
88
  // file bytes, and that reader's whole rule is "the editor server answers
@@ -99,7 +99,7 @@ async function readLedgerText(backend: StorageBackend): Promise<string | null> {
99
99
  }
100
100
 
101
101
  async function writeLedgerText(backend: StorageBackend, content: string): Promise<void> {
102
- if (backend.id === 'http') {
102
+ if (isPublicRootedBackend(backend)) {
103
103
  const write = async () => {
104
104
  const res = await fetch('/__editor/vgai-file', {
105
105
  method: 'POST',
@@ -16,8 +16,8 @@ import {
16
16
  } from '@volter/editor-core/authoring/active-systems';
17
17
  import { collectPlayRunPageErrors } from '@volter/editor-core/command-listener';
18
18
  import { gameContractEpoch } from '../host/coverage/game-contract-seam-evidence';
19
- import { recordLiveSeamEvidence } from '@volter/editor-core/coverage/live-seam-evidence';
20
- import { systemAdapterEpoch } from '@volter/editor-core/coverage/system-seam-evidence';
19
+ import { recordLiveSeamEvidence } from '@volter/editor-sdk/kit/live-seam-evidence';
20
+ import { systemAdapterEpoch } from '@volter/editor-sdk/kit/system-seam-evidence';
21
21
  import {
22
22
  HOLD_STARVED_NO_DRIVER_REASON,
23
23
  waitForHoldBudget,
@@ -6,15 +6,15 @@
6
6
  * `@editor/*` alias until those modules move too. Nothing here is host API.
7
7
  */
8
8
 
9
- import { commandLine } from '@volter/editor-core/product-command';
9
+ import { commandLine } from '@volter/editor-sdk/kit/product-command';
10
10
  import {
11
11
  type CaptureFlatness,
12
12
  CaptureLayerError,
13
13
  capturePlayComposite,
14
14
  sampleFlatness,
15
15
  } from '@volter/editor-core/composite-screenshot';
16
- import { editorConsole } from '@volter/editor-core/editor-console';
17
- import { presentationSurface } from '@volter/editor-core/presentation-surface';
16
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
17
+ import { presentationSurface } from '@volter/editor-sdk/kit/presentation-surface';
18
18
  import type { EditorCommandMessage, EditorCommandResult } from '@volter/editor-sdk/commands';
19
19
  import { notPlayingResult, structuredErrorResult } from '../command-results';
20
20
  import { isIngestActive } from '../ingest/active-ingest';
@@ -14,7 +14,7 @@ import { getCurrentProject } from '@volter/editor-core/project-manager';
14
14
  import { authoringSurfaceFromTable } from '@volter/editor-core/scene-document-plan';
15
15
  import { projectStoriesReady } from '@volter/editor-core/stories/story-registry';
16
16
  import { availableWorkspaceDocuments } from '@volter/editor-core/workspace-available-documents';
17
- import { openWorkspaceDocuments } from '@volter/editor-core/workspace-document-registry';
17
+ import { openWorkspaceDocuments } from '@volter/editor-sdk/kit/workspace-document-registry';
18
18
 
19
19
  export function authoringSurfaceCoverage(): CapabilityCoverageReport | null {
20
20
  const facet = projectAdapterFacet();
@@ -38,7 +38,7 @@ import {
38
38
  type ProjectRootFact,
39
39
  type ProjectVerbFacts,
40
40
  } from '../host/coverage/project-verb-coverage';
41
- import { editorServerJson } from '@volter/editor-core/editor-server-response';
41
+ import { editorServerJson } from '@volter/editor-sdk/kit/editor-server-response';
42
42
  import { getCurrentProject } from '@volter/editor-core/project-manager';
43
43
 
44
44
  /** What the server answers on `/__editor/project-verbs` — facts only. */
@@ -35,7 +35,7 @@ import {
35
35
  deriveCapabilityCoverage,
36
36
  } from '../host/coverage/capability-coverage';
37
37
  import { measureNativeSystemAdapters } from '../host/coverage/system-adapter-coverage';
38
- import { liveCoverage } from '@volter/editor-core/live-session-registry';
38
+ import { liveCoverage } from '@volter/editor-sdk/kit/live-session-registry';
39
39
  import { getCurrentProject } from '@volter/editor-core/project-manager';
40
40
  import { toolContributionPlay } from '@volter/editor-core/tool-contribution-play';
41
41
  import type { DeclaredSystemAbsence, Game } from '@volter/game-runtime/runtime/game';
@@ -35,8 +35,8 @@ import {
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';
38
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
39
+ import { editorIsPlaying } from '@volter/editor-sdk/kit/editor-session-mode';
40
40
  import { projectAdapterFacet } from '@volter/editor-core/project-adapter';
41
41
  import { getCurrentProject } from '@volter/editor-core/project-manager';
42
42
  import { authoringSurfaceCoverage } from './live-authoring-surface';
@@ -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`
@@ -31,20 +28,20 @@
31
28
 
32
29
  import { UNCAPTURED_REACH } from '../host/adapter-reach';
33
30
  import { SourceObject3DAuthoringAdapter } from '@volter/editor-core/authoring/source-object3d-authoring-adapter';
34
- import { faBrain, faPalette } from '@fortawesome/free-solid-svg-icons';
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
37
  import '@volter/editor-core/authoring/model-asset-inspector-section';
41
- import { ingestCoverageSection } from '@volter/editor-core/components/CapabilityCoverageSection';
38
+ import { ingestCoverageSection } from '@volter/editor-sdk/kit/CapabilityCoverageSection';
42
39
  import { InspectionProjectionView } from '@volter/editor-core/components/InspectionProjection';
43
40
  import { AuthoringInspectorSurface } from '@volter/editor-core/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({
@@ -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: () => {
@@ -369,7 +329,7 @@ export const TypedThreeGroupsColumn: Story = {
369
329
  {(runtime) => (
370
330
  <RailColumn>
371
331
  <AuthoringInspectorSurface
372
- store={runtime.store}
332
+ store={storyThreeStore(runtime)}
373
333
  adapter={adapter}
374
334
  documentSelection={{ adapter, nodeId: 'player' }}
375
335
  presentation="column"
@@ -382,17 +342,17 @@ 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
395
- store={runtime.store}
355
+ store={storyThreeStore(runtime)}
396
356
  adapter={adapter}
397
357
  documentSelection={{ adapter, nodeId: adapter.documentId }}
398
358
  presentation="column"
@@ -11,7 +11,7 @@
11
11
  * the button stays on this side of the line with the store and model it reads.
12
12
  */
13
13
  import { getInspectedRenderDebug } from '@volter/editor-core/authoring/active-systems';
14
- import { useAvailabilitySelector } from '@volter/editor-core/availability-tick';
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';