@volter/editor-game 0.5.68 → 0.5.70

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 (169) hide show
  1. package/NOTICE +7 -7
  2. package/contributions/autoplay.service.ts +1 -1
  3. package/contributions/build-profiles.document.tsx +1 -1
  4. package/contributions/build-progress.status.tsx +2 -2
  5. package/contributions/build.header.tsx +1 -1
  6. package/contributions/connection.status.tsx +1 -1
  7. package/contributions/coverage.service.ts +2 -2
  8. package/contributions/game-eval.command.ts +6 -6
  9. package/contributions/gameplay.command.ts +2 -2
  10. package/contributions/generations.status.tsx +1 -1
  11. package/contributions/ingest.service.ts +2 -2
  12. package/contributions/play.command.ts +6 -6
  13. package/contributions/react/react-inspector.service.ts +2 -2
  14. package/package.json +8 -8
  15. package/serving/index.ts +1 -1
  16. package/src/asset-budget/AssetBudgetPanel.tsx +1 -1
  17. package/src/asset-budget/asset-budget-model.ts +14 -14
  18. package/src/asset-budget/optimize-apply.ts +8 -8
  19. package/src/bridge/call.ts +3 -3
  20. package/src/bridge/dispatch.ts +12 -12
  21. package/src/bridge/screenshot.ts +6 -6
  22. package/src/build/BuildProfilesPanel.tsx +8 -8
  23. package/src/canvas/canvas-board/CanvasBoardDocument.tsx +2 -2
  24. package/src/canvas/canvas-board/canvas-component-board.ts +1 -1
  25. package/src/canvas/canvas-design-mount.ts +1 -1
  26. package/src/coverage/live-project-verbs.ts +3 -3
  27. package/src/coverage/native-system-coverage.ts +3 -3
  28. package/src/coverage/root-coverage.ts +2 -2
  29. package/src/coverage/session-coverage.ts +2 -2
  30. package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +2 -2
  31. package/src/game-document/DevicePresetPicker.tsx +6 -6
  32. package/src/game-document/GameCaptureFrameButton.tsx +1 -1
  33. package/src/game-document/GameDocument.tsx +2 -2
  34. package/src/game-document/GamePanel.tsx +9 -9
  35. package/src/game-document/InstanceInspectorPicker.tsx +1 -1
  36. package/src/game-document/device-preview.ts +4 -4
  37. package/src/game-document/physics-debug.ts +2 -2
  38. package/src/generation/GenerationActivity.tsx +22 -22
  39. package/src/generation/GenerationGallery.css +79 -79
  40. package/src/generation/generation-documents.tsx +25 -25
  41. package/src/generation/generation-presentation.ts +1 -1
  42. package/src/host/adapter-reach.ts +1 -1
  43. package/src/host/adapter-runtime-bindings.ts +5 -5
  44. package/src/host/after-paint.ts +3 -3
  45. package/src/host/api/configurations.ts +1 -1
  46. package/src/host/authoring/canvas-runtime-recognition.ts +2 -2
  47. package/src/host/authoring/contract-hierarchy-authoring.ts +6 -6
  48. package/src/host/authoring/contract-scenes-stories.ts +5 -5
  49. package/src/host/authoring/ingest-data-writer.ts +1 -1
  50. package/src/host/authoring/ingest-source-persistence.ts +2 -2
  51. package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
  52. package/src/host/authoring/pixi-authoring-adapter.ts +60 -4
  53. package/src/host/authoring/pixi-creatable-kinds.ts +18 -0
  54. package/src/host/authoring/pixi-live-write-target.ts +6 -5
  55. package/src/host/authoring/pixi-source-write-target.ts +5 -2
  56. package/src/host/authoring/pixi-structure-history.ts +3 -3
  57. package/src/host/binding-resolver.ts +6 -6
  58. package/src/host/browser-transpile.ts +11 -11
  59. package/src/host/canvas-preview-frames.ts +1 -1
  60. package/src/host/components/CameraAuthoringOverlay.tsx +14 -14
  61. package/src/host/components/HeaderTelemetry.tsx +11 -11
  62. package/src/host/components/PixiIsolationSceneContent.tsx +2 -2
  63. package/src/host/components/ResolutionPicker.tsx +4 -4
  64. package/src/host/components/scene-document.tsx +3 -3
  65. package/src/host/components/world-root-stage-binding.tsx +1 -1
  66. package/src/host/components/world-root-stage.ts +1 -1
  67. package/src/host/coverage/authoring-read-probe.ts +1 -1
  68. package/src/host/coverage/capability-coverage.ts +22 -22
  69. package/src/host/coverage/game-contract-seam-evidence.ts +8 -8
  70. package/src/host/coverage/project-verb-coverage.ts +1 -1
  71. package/src/host/coverage/system-adapter-coverage.ts +19 -6
  72. package/src/host/game-location-guard.ts +4 -4
  73. package/src/host/game-module-access.ts +6 -6
  74. package/src/host/game-realm-page.ts +3 -3
  75. package/src/host/game-realm-reclaim.ts +1 -1
  76. package/src/host/gameplay-recording.ts +5 -5
  77. package/src/host/gated-globals.ts +13 -13
  78. package/src/host/ingest/registry.ts +14 -14
  79. package/src/host/play-control-hook.ts +1 -1
  80. package/src/host/playwright-shim.ts +3 -3
  81. package/src/host/projection/pixi.ts +2 -2
  82. package/src/host/react-mount-runtime.ts +1 -1
  83. package/src/host/roots/canvas-root.tsx +2 -2
  84. package/src/host/roots/r3f-root.tsx +1 -1
  85. package/src/host/scene-view-drawability.ts +1 -1
  86. package/src/host/sdk/tools.ts +1 -1
  87. package/src/host/staged-projects.ts +1 -1
  88. package/src/host/stories/story-pixi-preview.ts +1 -1
  89. package/src/host/stories/story-three-preview.ts +1 -1
  90. package/src/host/three-ingest-runtime.ts +1 -1
  91. package/src/ingest/active-ingest.ts +1 -1
  92. package/src/ingest/authoring/ingest-dom-surface-authoring.ts +4 -4
  93. package/src/ingest/authoring/ingest-root-adapter.ts +11 -11
  94. package/src/ingest/capture-wait-report.ts +4 -4
  95. package/src/ingest/discovery-public-ingest.ts +4 -4
  96. package/src/ingest/dom-stub-mark.ts +1 -1
  97. package/src/ingest/entry-load.ts +1 -1
  98. package/src/ingest/game-contract-realm.ts +3 -3
  99. package/src/ingest/game-pointer-lock.ts +1 -1
  100. package/src/ingest/ingest-canvas-scene-document.tsx +2 -2
  101. package/src/ingest/ingest-evidence-hook.ts +6 -6
  102. package/src/ingest/ingest-frame-snapshot.ts +2 -2
  103. package/src/ingest/ingest-play-commands.ts +1 -1
  104. package/src/ingest/ingest-play-control.ts +11 -11
  105. package/src/ingest/ingest-render-debug.ts +5 -5
  106. package/src/ingest/ingest-siblings.ts +3 -3
  107. package/src/ingest/module-mode.ts +2 -2
  108. package/src/ingest/mount-canvas-ingest-root.ts +10 -10
  109. package/src/ingest/mount-coverage.ts +3 -3
  110. package/src/ingest/mount-dom-ingest-root.ts +7 -7
  111. package/src/ingest/mount-ingest-root.ts +11 -11
  112. package/src/ingest/mount-three-ingest-root.ts +5 -5
  113. package/src/ingest/resolve-three.ts +2 -2
  114. package/src/ingest/served-bundle.ts +6 -6
  115. package/src/ingest/served-html-boot.ts +8 -8
  116. package/src/ingest/surface-dom.ts +9 -9
  117. package/src/ingest/surface-three.ts +1 -1
  118. package/src/ingest/types.ts +1 -1
  119. package/src/ingest/unmount-ingest-root.ts +3 -3
  120. package/src/network/NetworkInspectorPanel.tsx +2 -2
  121. package/src/play/play-boot-stall.ts +1 -1
  122. package/src/play/play-mode.ts +31 -30
  123. package/src/play/play-recording.ts +12 -12
  124. package/src/play-bar/PlayBar.tsx +8 -8
  125. package/src/play-bar/PlayerCountPicker.tsx +3 -3
  126. package/src/profiler/FrameDebuggerPanel.tsx +2 -2
  127. package/src/profiler/PerformancePanel.tsx +4 -4
  128. package/src/react/design-time-react-mount.ts +5 -5
  129. package/src/react/dom-authoring-adapter.ts +3 -3
  130. package/src/react/react-inspector-section.tsx +2 -2
  131. package/src/react/react-world-authoring-adapter.ts +20 -20
  132. package/src/react/story-documents/story-documents.tsx +4 -4
  133. package/src/react/ui-component-board.ts +1 -1
  134. package/src/runtime/adapter/audio-meter.ts +1 -1
  135. package/src/runtime/adapter/ingest/contract-debug-adapter.ts +4 -4
  136. package/src/runtime/adapter/ingest/contract-system-adapters.ts +9 -9
  137. package/src/runtime/adapter/ingest/merge-debug-adapters.ts +2 -2
  138. package/src/runtime/adapter/ingest/observation-debug-adapter.ts +1 -1
  139. package/src/runtime/adapter/native-debug-module.ts +5 -5
  140. package/src/runtime/audio/pose-guard.ts +1 -1
  141. package/src/runtime/core/game-scoped-slot.ts +1 -1
  142. package/src/runtime/create-runtime.ts +15 -15
  143. package/src/runtime/debug-bridge.ts +25 -25
  144. package/src/runtime/debug-registry.ts +17 -17
  145. package/src/runtime/dev/instruments.ts +1 -1
  146. package/src/runtime/dev/performance-profiler.ts +2 -2
  147. package/src/runtime/dev/register-render-vitals.ts +2 -2
  148. package/src/runtime/dev/static-batch-advisor.ts +3 -3
  149. package/src/runtime/dev-build.ts +3 -3
  150. package/src/runtime/game.ts +5 -5
  151. package/src/runtime/input-router.ts +1 -1
  152. package/src/runtime/mount-manifest.ts +10 -10
  153. package/src/runtime/pixi/authoring.ts +1 -1
  154. package/src/runtime/pixi/ingest.ts +1 -1
  155. package/src/runtime/presentation.ts +1 -1
  156. package/src/runtime/render-control.ts +21 -21
  157. package/src/runtime/render-seed.ts +3 -3
  158. package/src/runtime/run-ticks-settled.ts +1 -1
  159. package/src/services/game-audio.ts +3 -3
  160. package/src/services/game-network.ts +4 -4
  161. package/src/three/authoring/model-asset-inspector-section.css +15 -15
  162. package/src/three/authoring/model-asset-inspector-section.tsx +7 -7
  163. package/src/three/authoring/r3f-design-session.ts +10 -10
  164. package/src/three/authoring/r3f-source-authoring-adapter.ts +5 -5
  165. package/src/three/authoring/three-authoring-adapter.ts +5 -4
  166. package/src/three/authoring/typed-three-inspector.ts +1 -1
  167. package/src/three/story-documents/three-story-documents.tsx +3 -3
  168. package/src/three/three-board/board-scene.ts +9 -9
  169. package/src/three/three-board/three-component-board.ts +1 -1
@@ -7,66 +7,66 @@
7
7
  * query drops the card to a single readable column in a genuinely narrow dock.
8
8
  */
9
9
 
10
- .vgai-generation-gallery {
10
+ .volter-generation-gallery {
11
11
  display: flex;
12
12
  height: 100%;
13
13
  flex-direction: column;
14
- color: var(--vgai-content-primary);
14
+ color: var(--volter-content-primary);
15
15
  /* `size`, not `inline-size`: the cards answer to the drawer's HEIGHT as well
16
16
  * as its width — a short bottom drawer gets a shorter preview so the name,
17
17
  * cost and actions still land inside it. */
18
18
  container-type: size;
19
19
  }
20
- .vgai-generation-gallery .vgai-toolbar {
20
+ .volter-generation-gallery .volter-toolbar {
21
21
  flex: 0 0 auto;
22
22
  }
23
- .vgai-generation-gallery-bar {
24
- gap: var(--vgai-space-2);
23
+ .volter-generation-gallery-bar {
24
+ gap: var(--volter-space-2);
25
25
  }
26
- .vgai-generation-gallery-alert {
27
- margin: var(--vgai-space-3);
26
+ .volter-generation-gallery-alert {
27
+ margin: var(--volter-space-3);
28
28
  }
29
- .vgai-generation-gallery-empty {
29
+ .volter-generation-gallery-empty {
30
30
  margin: auto;
31
31
  max-width: 420px;
32
32
  text-align: center;
33
33
  }
34
34
 
35
- .vgai-generation-grid {
35
+ .volter-generation-grid {
36
36
  display: grid;
37
37
  min-height: 0;
38
38
  flex: 1;
39
39
  align-content: start;
40
- gap: var(--vgai-space-3);
41
- padding: var(--vgai-space-3);
40
+ gap: var(--volter-space-3);
41
+ padding: var(--volter-space-3);
42
42
  overflow-y: auto;
43
43
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
44
44
  grid-auto-rows: max-content;
45
45
  }
46
46
  @container (max-width: 380px) {
47
- .vgai-generation-grid {
47
+ .volter-generation-grid {
48
48
  grid-template-columns: 1fr;
49
49
  }
50
50
  }
51
- .vgai-generation-card {
51
+ .volter-generation-card {
52
52
  display: flex;
53
53
  flex-direction: column;
54
54
  overflow: hidden;
55
- border: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
56
- border-radius: var(--vgai-radius-md);
57
- background: var(--vgai-surface-panel);
55
+ border: var(--volter-stroke-resting) solid var(--volter-boundary-default);
56
+ border-radius: var(--volter-radius-md);
57
+ background: var(--volter-surface-panel);
58
58
  }
59
- .vgai-generation-card[data-state="failed"],
60
- .vgai-generation-card[data-state="save-failed"] {
61
- border-color: var(--vgai-danger-muted);
59
+ .volter-generation-card[data-state="failed"],
60
+ .volter-generation-card[data-state="save-failed"] {
61
+ border-color: var(--volter-danger-muted);
62
62
  }
63
- .vgai-generation-card[data-state="ready"] {
64
- border-color: var(--vgai-boundary-strong);
63
+ .volter-generation-card[data-state="ready"] {
64
+ border-color: var(--volter-boundary-strong);
65
65
  }
66
66
 
67
67
  /* The preview. One output fills the box; several share it as a tile grid, so a
68
68
  * multi-output job shows every file it produced without a second surface. */
69
- .vgai-generation-card-media {
69
+ .volter-generation-card-media {
70
70
  display: grid;
71
71
  /* `flex-shrink: 0` and the height cap are load-bearing TOGETHER: in the
72
72
  * ordinary ~260px bottom drawer the card was squeezed to a ~50px strip with
@@ -75,38 +75,38 @@
75
75
  flex-shrink: 0;
76
76
  height: 160px;
77
77
  max-height: 160px;
78
- gap: var(--vgai-stroke-active);
79
- background: var(--vgai-bg-inset);
78
+ gap: var(--volter-stroke-active);
79
+ background: var(--volter-bg-inset);
80
80
  grid-template-columns: 1fr;
81
81
  }
82
- .vgai-generation-card-media[data-outputs="2"],
83
- .vgai-generation-card-media[data-outputs="3"],
84
- .vgai-generation-card-media[data-outputs="4"] {
82
+ .volter-generation-card-media[data-outputs="2"],
83
+ .volter-generation-card-media[data-outputs="3"],
84
+ .volter-generation-card-media[data-outputs="4"] {
85
85
  grid-template-columns: 1fr 1fr;
86
86
  }
87
- .vgai-generation-output {
87
+ .volter-generation-output {
88
88
  display: flex;
89
89
  min-width: 0;
90
90
  min-height: 0;
91
91
  align-items: center;
92
92
  justify-content: center;
93
93
  overflow: hidden;
94
- padding: var(--vgai-space-1);
94
+ padding: var(--volter-space-1);
95
95
  }
96
96
  /* `contain`, never `cover`: cropping a generated frame hides exactly the part
97
97
  * a game developer is judging. */
98
- .vgai-generation-output-media {
98
+ .volter-generation-output-media {
99
99
  display: block;
100
100
  width: 100%;
101
101
  height: 100%;
102
102
  max-width: 100%;
103
103
  max-height: 100%;
104
- border-radius: var(--vgai-radius-sm);
104
+ border-radius: var(--volter-radius-sm);
105
105
  object-fit: contain;
106
106
  }
107
107
  /* The preview's own click target: a real Button stripped back to the image it
108
108
  * contains, so the gallery's most obvious gesture is still a focusable control. */
109
- .vgai-generation-output .vgai-generation-output-open.vgai-btn {
109
+ .volter-generation-output .volter-generation-output-open.volter-btn {
110
110
  display: flex;
111
111
  width: 100%;
112
112
  height: 100%;
@@ -119,113 +119,113 @@
119
119
  background: transparent;
120
120
  cursor: zoom-in;
121
121
  }
122
- video.vgai-generation-output-media {
122
+ video.volter-generation-output-media {
123
123
  width: 100%;
124
124
  }
125
- .vgai-generation-output-audio {
125
+ .volter-generation-output-audio {
126
126
  display: flex;
127
127
  width: 100%;
128
128
  height: 100%;
129
129
  flex-direction: column;
130
130
  align-items: center;
131
131
  justify-content: center;
132
- gap: var(--vgai-space-2);
133
- padding: var(--vgai-space-2);
132
+ gap: var(--volter-space-2);
133
+ padding: var(--volter-space-2);
134
134
  }
135
- .vgai-generation-output-audio audio {
135
+ .volter-generation-output-audio audio {
136
136
  width: 100%;
137
137
  }
138
- .vgai-generation-output-file {
138
+ .volter-generation-output-file {
139
139
  display: flex;
140
140
  flex-direction: column;
141
141
  align-items: center;
142
- gap: var(--vgai-space-2);
143
- padding: var(--vgai-space-3);
144
- color: var(--vgai-content-muted);
142
+ gap: var(--volter-space-2);
143
+ padding: var(--volter-space-3);
144
+ color: var(--volter-content-muted);
145
145
  text-align: center;
146
146
  overflow-wrap: anywhere;
147
147
  }
148
148
 
149
- .vgai-generation-state-media {
149
+ .volter-generation-state-media {
150
150
  display: flex;
151
151
  flex-direction: column;
152
152
  align-items: center;
153
153
  justify-content: center;
154
- gap: var(--vgai-space-2);
155
- padding: var(--vgai-space-3);
154
+ gap: var(--volter-space-2);
155
+ padding: var(--volter-space-3);
156
156
  text-align: center;
157
157
  }
158
- .vgai-generation-progress {
158
+ .volter-generation-progress {
159
159
  width: 70%;
160
160
  height: 4px;
161
- accent-color: var(--vgai-accent);
161
+ accent-color: var(--volter-accent);
162
162
  }
163
163
 
164
- .vgai-generation-card-body {
164
+ .volter-generation-card-body {
165
165
  display: flex;
166
166
  min-width: 0;
167
167
  flex-direction: column;
168
- gap: var(--vgai-space-1);
169
- padding: var(--vgai-space-3);
168
+ gap: var(--volter-space-1);
169
+ padding: var(--volter-space-3);
170
170
  }
171
- .vgai-generation-card-heading {
171
+ .volter-generation-card-heading {
172
172
  display: flex;
173
173
  min-width: 0;
174
174
  align-items: center;
175
- gap: var(--vgai-space-2);
175
+ gap: var(--volter-space-2);
176
176
  }
177
- .vgai-generation-card-heading > .vgai-text {
177
+ .volter-generation-card-heading > .volter-text {
178
178
  min-width: 0;
179
179
  flex: 1;
180
180
  }
181
- .vgai-generation-chip {
181
+ .volter-generation-chip {
182
182
  flex: 0 0 auto;
183
183
  }
184
- .vgai-generation-chip[data-state="ready"] {
185
- color: var(--vgai-success);
186
- border-color: var(--vgai-success-muted);
184
+ .volter-generation-chip[data-state="ready"] {
185
+ color: var(--volter-success);
186
+ border-color: var(--volter-success-muted);
187
187
  }
188
- .vgai-generation-chip[data-state="failed"],
189
- .vgai-generation-chip[data-state="save-failed"] {
190
- color: var(--vgai-danger);
191
- border-color: var(--vgai-danger-muted);
188
+ .volter-generation-chip[data-state="failed"],
189
+ .volter-generation-chip[data-state="save-failed"] {
190
+ color: var(--volter-danger);
191
+ border-color: var(--volter-danger-muted);
192
192
  }
193
- .vgai-generation-chip[data-state="queued"],
194
- .vgai-generation-chip[data-state="running"],
195
- .vgai-generation-chip[data-state="saving"],
196
- .vgai-generation-chip[data-state="new"] {
197
- color: var(--vgai-accent);
198
- border-color: var(--vgai-accent-muted);
193
+ .volter-generation-chip[data-state="queued"],
194
+ .volter-generation-chip[data-state="running"],
195
+ .volter-generation-chip[data-state="saving"],
196
+ .volter-generation-chip[data-state="new"] {
197
+ color: var(--volter-accent);
198
+ border-color: var(--volter-accent-muted);
199
199
  }
200
200
 
201
201
  /* The prompt is available, never dominant: two lines, full text on hover. */
202
- .vgai-generation-card-prompt {
202
+ .volter-generation-card-prompt {
203
203
  display: -webkit-box;
204
- margin: var(--vgai-space-1) 0 0;
204
+ margin: var(--volter-space-1) 0 0;
205
205
  overflow: hidden;
206
- color: var(--vgai-content-dim);
207
- font-size: var(--vgai-font-sm);
208
- line-height: var(--vgai-leading-normal);
206
+ color: var(--volter-content-dim);
207
+ font-size: var(--volter-font-sm);
208
+ line-height: var(--volter-leading-normal);
209
209
  -webkit-box-orient: vertical;
210
210
  -webkit-line-clamp: 2;
211
211
  line-clamp: 2;
212
212
  }
213
- .vgai-generation-card-alert {
214
- margin-top: var(--vgai-space-2);
215
- font-size: var(--vgai-font-sm);
213
+ .volter-generation-card-alert {
214
+ margin-top: var(--volter-space-2);
215
+ font-size: var(--volter-font-sm);
216
216
  }
217
- .vgai-generation-card-actions {
217
+ .volter-generation-card-actions {
218
218
  display: flex;
219
219
  flex-wrap: wrap;
220
- gap: var(--vgai-space-2);
221
- margin-top: var(--vgai-space-2);
220
+ gap: var(--volter-space-2);
221
+ margin-top: var(--volter-space-2);
222
222
  }
223
223
 
224
224
  @container (max-height: 300px) {
225
- .vgai-generation-card-media {
225
+ .volter-generation-card-media {
226
226
  height: 96px;
227
227
  }
228
- .vgai-generation-card-prompt {
228
+ .volter-generation-card-prompt {
229
229
  display: none;
230
230
  }
231
231
  }
@@ -49,7 +49,7 @@ function billingLabel(billing: GenerationBilling): string {
49
49
  if (billing.route === 'managed') {
50
50
  if (billing.settledCredits !== undefined) return `${billing.settledCredits} credits settled`;
51
51
  if (billing.estimatedCredits !== undefined) return `Up to ${billing.estimatedCredits} credits`;
52
- return 'VGAI subscription · estimate unavailable';
52
+ return 'Volter subscription · estimate unavailable';
53
53
  }
54
54
  if (billing.settledAmount !== undefined) return `$${billing.settledAmount.toFixed(3)} settled`;
55
55
  if (billing.estimatedAmount !== undefined) return `Up to $${billing.estimatedAmount.toFixed(3)}`;
@@ -109,11 +109,11 @@ export function GenerationCreateDocumentContent() {
109
109
  providers.set(provider, [...(providers.get(provider) ?? []), item]);
110
110
  }
111
111
  return (
112
- <div className="vgai-tool-page" data-testid="generation-create-catalog">
113
- <header className="vgai-tool-header">
114
- <div className="vgai-tool-eyebrow">Installed provider extensions</div>
115
- <h2 className="vgai-tool-title">Create an asset</h2>
116
- <p className="vgai-tool-description">
112
+ <div className="volter-tool-page" data-testid="generation-create-catalog">
113
+ <header className="volter-tool-header">
114
+ <div className="volter-tool-eyebrow">Installed provider extensions</div>
115
+ <h2 className="volter-tool-title">Create an asset</h2>
116
+ <p className="volter-tool-description">
117
117
  Choose a native provider operation. Mock, managed, and BYOK execution remain explicit in
118
118
  the operation you open. Current default: {account.preferredRoute}.
119
119
  </p>
@@ -126,13 +126,13 @@ export function GenerationCreateDocumentContent() {
126
126
  onChange={(event) => setQuery(event.target.value)}
127
127
  />
128
128
  {[...providers.entries()].map(([provider, contributions]) => (
129
- <section className="vgai-tool-card" key={provider}>
130
- <h3 className="vgai-tool-section-title">{provider}</h3>
131
- <div className="vgai-generation-create-grid">
129
+ <section className="volter-tool-card" key={provider}>
130
+ <h3 className="volter-tool-section-title">{provider}</h3>
131
+ <div className="volter-generation-create-grid">
132
132
  {contributions.map((contribution) => (
133
133
  <Button
134
134
  variant="ghost"
135
- className="vgai-generation-create-card"
135
+ className="volter-generation-create-card"
136
136
  key={contribution.id}
137
137
  onClick={() => openToolDocument(contribution.id)}
138
138
  >
@@ -144,7 +144,7 @@ export function GenerationCreateDocumentContent() {
144
144
  </section>
145
145
  ))}
146
146
  {tools.length === 0 && (
147
- <div className="vgai-generation-document-empty">
147
+ <div className="volter-generation-document-empty">
148
148
  No installed generation operation matches this search.
149
149
  </div>
150
150
  )}
@@ -173,7 +173,7 @@ function ProviderResult({
173
173
  );
174
174
  const contribution = getGenerationResultContribution(job.poll.tool, job, result);
175
175
  if (!contribution) {
176
- return <pre className="vgai-generation-native-result">{JSON.stringify(result, null, 2)}</pre>;
176
+ return <pre className="volter-generation-native-result">{JSON.stringify(result, null, 2)}</pre>;
177
177
  }
178
178
  const Component = contribution.Component;
179
179
  return (
@@ -228,7 +228,7 @@ export function GenerationDocumentContent({ documentId, active }: WorkspaceDocum
228
228
 
229
229
  if (!job) {
230
230
  return (
231
- <div className="vgai-generation-document-empty">
231
+ <div className="volter-generation-document-empty">
232
232
  This generation is no longer in project activity.
233
233
  </div>
234
234
  );
@@ -244,18 +244,18 @@ export function GenerationDocumentContent({ documentId, active }: WorkspaceDocum
244
244
  : null);
245
245
 
246
246
  return (
247
- <div className="vgai-generation-document" data-status={job.status}>
248
- <header className="vgai-generation-document-header">
247
+ <div className="volter-generation-document" data-status={job.status}>
248
+ <header className="volter-generation-document-header">
249
249
  <div>
250
- <div className="vgai-tool-eyebrow">
250
+ <div className="volter-tool-eyebrow">
251
251
  {job.provider} · {job.operation}
252
252
  </div>
253
- <h2 className="vgai-tool-title">{job.label}</h2>
254
- <div className="vgai-generation-job-meta">
253
+ <h2 className="volter-tool-title">{job.label}</h2>
254
+ <div className="volter-generation-job-meta">
255
255
  {GENERATION_STATE_LABEL[generationCardState(job)]} · {billingLabel(job.billing)}
256
256
  </div>
257
257
  </div>
258
- <div className="vgai-tool-actions">
258
+ <div className="volter-tool-actions">
259
259
  <Button
260
260
  size="compact"
261
261
  variant="ghost"
@@ -289,16 +289,16 @@ export function GenerationDocumentContent({ documentId, active }: WorkspaceDocum
289
289
  </div>
290
290
  </header>
291
291
 
292
- {job.message && <div className="vgai-tool-status">{job.message}</div>}
292
+ {job.message && <div className="volter-tool-status">{job.message}</div>}
293
293
  {alert && (
294
- <div className="vgai-tool-status" data-tone="error" role="alert">
294
+ <div className="volter-tool-status" data-tone="error" role="alert">
295
295
  {alert}
296
296
  </div>
297
297
  )}
298
298
 
299
- <section className="vgai-generation-result" aria-label="Generation result">
299
+ <section className="volter-generation-result" aria-label="Generation result">
300
300
  {result === undefined ? (
301
- <div className="vgai-generation-document-empty">
301
+ <div className="volter-generation-document-empty">
302
302
  {loading ? 'Loading provider result…' : 'No provider result is available yet.'}
303
303
  </div>
304
304
  ) : (
@@ -307,7 +307,7 @@ export function GenerationDocumentContent({ documentId, active }: WorkspaceDocum
307
307
  </section>
308
308
 
309
309
  {job.outputPaths && job.outputPaths.length > 0 && (
310
- <section className="vgai-generation-output-paths">
310
+ <section className="volter-generation-output-paths">
311
311
  <strong>Project assets</strong>
312
312
  {job.outputPaths.map((path) => (
313
313
  <code key={path}>{path}</code>
@@ -316,7 +316,7 @@ export function GenerationDocumentContent({ documentId, active }: WorkspaceDocum
316
316
  )}
317
317
 
318
318
  {generationRemovable(job) && (
319
- <div className="vgai-generation-document-footer">
319
+ <div className="volter-generation-document-footer">
320
320
  <Button
321
321
  size="compact"
322
322
  variant="ghost"
@@ -219,7 +219,7 @@ export function generationModelLabel(job: GenerationJob): string {
219
219
  }
220
220
 
221
221
  export function generationRouteLabel(job: GenerationJob): string {
222
- if (job.mode === 'managed') return 'VGAI subscription';
222
+ if (job.mode === 'managed') return 'Volter subscription';
223
223
  if (job.mode === 'direct') return 'Your provider key';
224
224
  return 'Mock';
225
225
  }
@@ -116,7 +116,7 @@ export const CAPTURE_GAP: CapabilityGap = {
116
116
  * it as a false alarm and stops trusting the instrument, which is the exact
117
117
  * failure this module's header forbids.
118
118
  *
119
- * MEASURED 2026-09-19 on a `--template game` scaffold, standalone `vgai edit`
119
+ * MEASURED 2026-09-19 on a `--template game` scaffold, standalone `volter-game-editor edit`
120
120
  * (it is NOT frame-specific): `hierarchy.roots()` passed, ten `hierarchy
121
121
  * .node()` calls passed, and the walk still failed — three of the default
122
122
  * scene's nodes report a `parentId` their listed parent does not claim. What
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Installs the loaded `vgai.adapter.ts` runtime bindings onto one mounted
2
+ * Installs the loaded `volter.adapter.ts` runtime bindings onto one mounted
3
3
  * Game. Game modules stay native: adapter closures close over app-owned stores
4
4
  * and functions, while this host-side file projects them onto the existing
5
5
  * session command/state/input doors.
@@ -188,7 +188,7 @@ function installObservations(
188
188
  function actionMap(binding: AdapterInputBinding, game: Game): Map<string, AdapterInputValueType> {
189
189
  const actions = binding.actions(game);
190
190
  if (!Array.isArray(actions)) {
191
- throw new Error('vgai.adapter.ts input.actions must return an array.');
191
+ throw new Error('volter.adapter.ts input.actions must return an array.');
192
192
  }
193
193
  const out = new Map<string, AdapterInputValueType>();
194
194
  for (const candidate of actions as readonly Partial<AdapterInputAction>[]) {
@@ -198,13 +198,13 @@ function actionMap(binding: AdapterInputBinding, game: Game): Map<string, Adapte
198
198
  !ADAPTER_INPUT_VALUE_TYPES.includes(candidate.valueType as AdapterInputValueType)
199
199
  ) {
200
200
  throw new Error(
201
- 'vgai.adapter.ts input.actions returned an invalid action; each action needs a non-empty ' +
201
+ 'volter.adapter.ts input.actions returned an invalid action; each action needs a non-empty ' +
202
202
  '`name` and a supported `valueType`.',
203
203
  );
204
204
  }
205
205
  if (out.has(candidate.name)) {
206
206
  throw new Error(
207
- `vgai.adapter.ts input.actions returned duplicate action "${candidate.name}".`,
207
+ `volter.adapter.ts input.actions returned duplicate action "${candidate.name}".`,
208
208
  );
209
209
  }
210
210
  out.set(candidate.name, candidate.valueType as AdapterInputValueType);
@@ -228,7 +228,7 @@ function valueMatches(type: AdapterInputValueType, value: AdapterInputValue): bo
228
228
  function installInput(game: Game, registry: DebugRegistry, binding: AdapterInputBinding): void {
229
229
  if (!game.world(binding.root)) {
230
230
  throw new Error(
231
- `vgai.adapter.ts input.root names "${binding.root}", which is not a mounted manifest root.`,
231
+ `volter.adapter.ts input.root names "${binding.root}", which is not a mounted manifest root.`,
232
232
  );
233
233
  }
234
234
 
@@ -4,13 +4,13 @@
4
4
  * READ THIS BEFORE WRITING `requestAnimationFrame` INTO A BOOT PATH.
5
5
  * **rAF does not fire in a hidden tab, ever** — not throttled, not late:
6
6
  * zero callbacks until the tab is foregrounded. And "hidden at boot" is the
7
- * ORDINARY case for this editor, not an edge: every `vgai edit` session rooted
7
+ * ORDINARY case for this editor, not an edge: every `volter-game-editor edit` session rooted
8
8
  * in an agent worktree opens its one tab behind the human's window
9
- * (`server/open-browser.ts` → `open -g`), and any `vgai edit` that fires while
9
+ * (`server/open-browser.ts` → `open -g`), and any `volter-game-editor edit` that fires while
10
10
  * the browser is not frontmost lands the same way. Measured twice in one hour:
11
11
  * an editor whose shell mount sat behind a bare double-rAF heartbeat for 20
12
12
  * minutes with the relay answering, `document.visibilityState: "hidden"`, and
13
- * zero console errors, while every `vgai play` refused with "the editor shell
13
+ * zero console errors, while every `volter-game-editor play` refused with "the editor shell
14
14
  * is not bound yet".
15
15
  *
16
16
  * A paint deferral is only ever an OPTIMISATION — let the committed chrome
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The client half of `/__editor/configurations` (`server/routes/run.ts`): the project's
3
3
  * declared run configurations and their runtime status, and the start/stop
4
- * verbs the transport's picker and `vgai run` share.
4
+ * verbs the transport's picker uses.
5
5
  */
6
6
 
7
7
  import { assertEditorServerResponse, editorServerJson } from '@volter/editor-sdk/kit/editor-server-response';
@@ -22,7 +22,7 @@ export interface PhaserRealmLike {
22
22
  export interface BabylonRealmLike {
23
23
  BABYLON?: { Engine?: { Instances?: BabylonEngineLike[] } };
24
24
  /** Host build seam for module-bundled Babylon, where no BABYLON global exists. */
25
- __vgaiBabylon?: {
25
+ __volterBabylon?: {
26
26
  engines?: BabylonEngineLike[];
27
27
  /** Optional boot promise published by a host-built classic bundle. */
28
28
  ready?: PromiseLike<unknown>;
@@ -39,7 +39,7 @@ export function findPhaserGame(realm: PhaserRealmLike | null): PhaserGameLike |
39
39
 
40
40
  /** Recognize Babylon from its public engine registry or the module-build host seam. */
41
41
  export function findBabylonEngine(realm: BabylonRealmLike | null): BabylonEngineLike | null {
42
- const bridged = realm?.__vgaiBabylon?.engines;
42
+ const bridged = realm?.__volterBabylon?.engines;
43
43
  const engines = Array.isArray(bridged) ? bridged : realm?.BABYLON?.Engine?.Instances;
44
44
  if (!Array.isArray(engines)) return null;
45
45
  return (
@@ -8,8 +8,8 @@
8
8
 
9
9
  import type { AuthoringAdapter, EditorNode, HierarchyProvider } from '@volter/editor-project/adapter';
10
10
  import type {
11
- VgaiGameHierarchyGroup,
12
- VgaiGameHierarchyProvider,
11
+ VolterGameHierarchyGroup,
12
+ VolterGameHierarchyProvider,
13
13
  } from '@volter/editor-project/adapter/ingest/game-contract';
14
14
  import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
15
15
 
@@ -20,7 +20,7 @@ function groupNodeId(id: string): string {
20
20
  return `${GROUP_PREFIX}${encodeURIComponent(id)}`;
21
21
  }
22
22
 
23
- function groupNode(group: VgaiGameHierarchyGroup): EditorNode {
23
+ function groupNode(group: VolterGameHierarchyGroup): EditorNode {
24
24
  return {
25
25
  id: groupNodeId(group.id),
26
26
  label: group.label,
@@ -32,7 +32,7 @@ function groupNode(group: VgaiGameHierarchyGroup): EditorNode {
32
32
  };
33
33
  }
34
34
 
35
- function assertGroups(value: unknown): VgaiGameHierarchyGroup[] {
35
+ function assertGroups(value: unknown): VolterGameHierarchyGroup[] {
36
36
  if (!Array.isArray(value)) throw new Error('hierarchy() did not return an array');
37
37
  const ids = new Set<string>();
38
38
  for (const group of value) {
@@ -58,12 +58,12 @@ function assertGroups(value: unknown): VgaiGameHierarchyGroup[] {
58
58
  /** Identity-preserving when the game declares no hierarchy surface. */
59
59
  export function withContractHierarchy(
60
60
  base: AuthoringAdapter,
61
- provider: VgaiGameHierarchyProvider | undefined,
61
+ provider: VolterGameHierarchyProvider | undefined,
62
62
  ): AuthoringAdapter {
63
63
  if (!provider) return base;
64
64
 
65
65
  let warned = false;
66
- const groups = (): VgaiGameHierarchyGroup[] => {
66
+ const groups = (): VolterGameHierarchyGroup[] => {
67
67
  try {
68
68
  return assertGroups(provider());
69
69
  } catch (error) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Projects an ingested game's declared SCENES (`window.vgaiGame.scenes`, see
2
+ * Projects an ingested game's declared SCENES (`window.volterGame.scenes`, see
3
3
  * `@volter/editor-project/adapter/ingest/game-contract`) onto the ordinary
4
4
  * {@link StoriesProvider} the editor's story picker already reads — the sibling
5
5
  * of `contract-hierarchy-authoring.ts`, which does the same job for the
@@ -29,11 +29,11 @@ import type {
29
29
  LiveSceneTable,
30
30
  } from '@volter/editor-sdk/host';
31
31
  import type { StoriesProvider, StoryRef } from '@volter/editor-project/adapter';
32
- import type { VgaiGameContract, VgaiGameScene } from '@volter/editor-project/adapter/ingest/game-contract';
32
+ import type { VolterGameContract, VolterGameScene } from '@volter/editor-project/adapter/ingest/game-contract';
33
33
  import { readGameScenes } from '@volter/editor-project/adapter/ingest/game-contract';
34
34
  import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
35
35
 
36
- function assertScenes(value: unknown): VgaiGameScene[] {
36
+ function assertScenes(value: unknown): VolterGameScene[] {
37
37
  if (!Array.isArray(value)) throw new Error('scenes.list() did not return an array');
38
38
  const ids = new Set<string>();
39
39
  for (const scene of value) {
@@ -111,7 +111,7 @@ export interface ContractScenesSeams {
111
111
  * bound: `readGameScenes` owns that shape check.
112
112
  */
113
113
  export function createContractScenesStories(
114
- contract: VgaiGameContract | null | undefined,
114
+ contract: VolterGameContract | null | undefined,
115
115
  seams: ContractScenesSeams = {},
116
116
  ): ContractScenesStories | null {
117
117
  const { scenes, malformed } = readGameScenes(contract);
@@ -121,7 +121,7 @@ export function createContractScenesStories(
121
121
  if (!scenes) return null;
122
122
 
123
123
  let warned = false;
124
- const list = (): VgaiGameScene[] => {
124
+ const list = (): VolterGameScene[] => {
125
125
  try {
126
126
  return assertScenes(scenes.list());
127
127
  } catch (error) {
@@ -53,7 +53,7 @@ import type { ChannelValue } from '@volter/editor-sdk/kit/creation-site-edit';
53
53
  * that carries none: that object is unanchored, with its reason, and its edits
54
54
  * stay live-only (the anti-shim rule).
55
55
  */
56
- export const DATA_RECORD_KEY = 'vgaiRecordIndex';
56
+ export const DATA_RECORD_KEY = 'volterRecordIndex';
57
57
 
58
58
  /** The record index a live object declares, or `null` when it declares none. */
59
59
  export function dataRecordIndexOf(object: unknown): number | null {
@@ -772,7 +772,7 @@ export class IngestSourcePersistence {
772
772
  const history = this.history!;
773
773
  const descriptor = history.registry.registerProject(
774
774
  'overlay',
775
- '.vgai/ingest-live-objects',
775
+ '.volter/ingest-live-objects',
776
776
  'Ingested game objects',
777
777
  );
778
778
  const driver: ResourceDriver = {
@@ -813,7 +813,7 @@ export class IngestSourcePersistence {
813
813
  /**
814
814
  * Report a refusal where the user can see it, once per gesture.
815
815
  *
816
- * A WARNING, not a log line, because of where each one goes: `vgai status`
816
+ * A WARNING, not a log line, because of where each one goes: `volter-game-editor status`
817
817
  * surfaces `sessionWarnings` and shows nothing at all for `log`. A refused
818
818
  * write was invisible to every door the product has — the user's edit did not
819
819
  * reach their file and the only explanation lived in a panel nobody could read
@@ -148,7 +148,7 @@ export async function mountIsolatedPixiScreen(
148
148
  preserveDrawingBuffer: true,
149
149
  });
150
150
  const canvas = app.canvas as HTMLCanvasElement;
151
- canvas.dataset['vgaiCanvasSceneSurface'] = 'true';
151
+ canvas.dataset['volterCanvasSceneSurface'] = 'true';
152
152
  canvas.style.position = 'absolute';
153
153
  canvas.style.inset = '0';
154
154
  canvas.style.width = '100%';