@volter/editor-game 0.5.69 → 0.5.71

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.
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * ## Why this is a package and not the host's
10
10
  *
11
- * It was `packages/editor/src/authoring/react-inspector-section.tsx`,
11
+ * It was the host's `authoring/react-inspector-section.tsx`,
12
12
  * registered at module scope and reached by ONE line in the host's entry:
13
13
  * `main.tsx:33`, `import './authoring/react-inspector-section';`. A bare
14
14
  * side-effect import has no `from`, so the closure gate's walk never followed
@@ -62,7 +62,7 @@
62
62
  * the DOM projection and the CSS inspection estate
63
63
  * (`components/RootSelectionOverlay.tsx`); the surgical JSX writer and the
64
64
  * structural write pipe (`authoring/r3f-source-authoring-adapter.ts`,
65
- * `@volter/canvas/pixi-source-write-target.ts`); the breakpoint state
65
+ * `@volter/editor-game`'s `src/host/authoring/pixi-source-write-target.ts`); the breakpoint state
66
66
  * (`components/BoardRulers.tsx`); `authoring/react-story-board.ts`, the
67
67
  * board's geometry, which three host surfaces read
68
68
  * (`components/RootSelectionOverlay.tsx:98`,
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.69",
5
+ "version": "0.5.71",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
@@ -101,11 +101,11 @@
101
101
  "serving": "./dist-node/serving.mjs"
102
102
  },
103
103
  "dependencies": {
104
- "@volter/editor-sdk": "0.5.69",
105
- "@volter/editor-project": "0.5.69",
106
- "@volter/editor-threejs": "0.5.69",
107
- "@volter/threejs-runtime": "0.5.69",
108
- "@volter/game-runtime": "0.5.69",
104
+ "@volter/editor-sdk": "0.5.71",
105
+ "@volter/editor-project": "0.5.71",
106
+ "@volter/editor-threejs": "0.5.71",
107
+ "@volter/threejs-runtime": "0.5.71",
108
+ "@volter/game-runtime": "0.5.71",
109
109
  "@colyseus/msgpackr": "^1.11.3",
110
110
  "@colyseus/schema": "^4.0.14",
111
111
  "@colyseus/sdk": "^0.17.34",
@@ -138,7 +138,7 @@
138
138
  "xstate": "^5.32.4",
139
139
  "zod": "^4.3.6",
140
140
  "@fortawesome/fontawesome-svg-core": "^7.2.0",
141
- "@volter/editor-react": "0.5.69"
141
+ "@volter/editor-react": "0.5.71"
142
142
  },
143
143
  "peerDependencies": {
144
144
  "@sparkjsdev/spark": "^2.1.0",
@@ -6,6 +6,7 @@
6
6
  * `@editor/*` alias until those modules move too. Nothing here is host API.
7
7
  */
8
8
 
9
+ import { getCurrentProject } from '@volter/editor-sdk/kit/active-project';
9
10
  import { commandLine } from '@volter/editor-sdk/kit/product-command';
10
11
  import {
11
12
  type CaptureFlatness,
@@ -230,6 +231,7 @@ export async function handleBridgeScreenshot(
230
231
  try {
231
232
  const composite = await capturePlayComposite(container, {
232
233
  canvasFrame: captureLiveCanvasFrame,
234
+ projectRoot: getCurrentProject()?.rootPath,
233
235
  // The DECLARED medium, from the adapter's region table. `undefined`
234
236
  // (no table loaded yet) leaves the compositor-settle heuristic on its
235
237
  // own canvas count, exactly as before.
@@ -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 'VOLTER 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)}`;
@@ -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 'VOLTER 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
  }
@@ -213,7 +213,7 @@ function unregisteredRuntimeModules(specifiers: readonly string[]): Error {
213
213
  'import to a dependency it ships; a package outside that list needs a dev server. Open ' +
214
214
  `the project locally with ${commandLine('edit')} (which resolves the project’s own node_modules), ` +
215
215
  'or add the package to a capability so it joins the list ' +
216
- '(packages/editor/src/served-bundle-runtime-modules.ts, gated by ' +
216
+ '(packages/editor-game/src/host/served-bundle-runtime-modules.ts, gated by ' +
217
217
  '`npm run validate-browser-runtime-modules`).',
218
218
  );
219
219
  }
@@ -17,7 +17,7 @@
17
17
  * five callers never had a story in hand (`authoring/canvas-design-mount.ts`,
18
18
  * `authoring/pixi-still-presentation.ts`, `components/world-root-stage.ts`,
19
19
  * `live-canvas-frame.ts`, and the ingest lane's canvas mount); moving it out is
20
- * the part of the CSF estate's exit to `@volter/game` (WORK.md §The open-source
20
+ * the part of the CSF estate's exit to `@volter/editor-game` (WORK.md §The open-source
21
21
  * launch, phase 1 unit 3) that does not wait on anything else.
22
22
  */
23
23
 
@@ -145,6 +145,6 @@ export function refusedNavigationMessage(attempt: string): string {
145
145
  `Ingested game attempted to navigate the editor away (${attempt}) — refused. ` +
146
146
  "A game running in-realm shares the editor's document, so leaving it would take the " +
147
147
  'whole session with it; game code sees a scoped `location` facade whose reads pass ' +
148
- 'through and whose navigating writes do not (packages/editor/src/game-location-guard.ts).'
148
+ 'through and whose navigating writes do not (packages/editor-game/src/host/game-location-guard.ts).'
149
149
  );
150
150
  }
@@ -61,7 +61,7 @@ export class PageShimUnsupportedError extends Error {
61
61
  `playwright-shim: ${objectName}.${member} is not supported by the in-page shim. ` +
62
62
  `Supported ${objectName} members: ${supported.join(', ')}. ` +
63
63
  'This shim is DOM-only — canvas gameplay input must use game.input.*, while React-only ' +
64
- 'DOM games may use Page keyboard/locator input. See packages/editor/src/playwright-shim.ts for ' +
64
+ 'DOM games may use Page keyboard/locator input. See packages/editor-game/src/host/playwright-shim.ts for ' +
65
65
  "the full supported subset and the wire's closure-capture limitation.",
66
66
  );
67
67
  this.name = 'PageShimUnsupportedError';
@@ -719,7 +719,7 @@ if (import.meta.env.DEV && typeof window !== 'undefined') {
719
719
  isActive: () => activeIngest()?.kind === 'dom',
720
720
  };
721
721
  // Headless-readable mount outcomes —
722
- // `packages/editor/src/authoring/mount-failure-report.ts`'s multi-entry
722
+ // `packages/editor-sdk/src/kit/mount-failure-report.ts`'s multi-entry
723
723
  // list is otherwise only ever read by the status bar's `mount-failure`
724
724
  // contribution (a React component), invisible to `page.evaluate()`. This is
725
725
  // a plain function returning the LIVE list — a probe's browser
@@ -1306,7 +1306,7 @@ export function resizeGame(width: number, height: number, pixelRatio?: number):
1306
1306
  * size exceeded` — not a hypothetical). In the field this window is entered
1307
1307
  * whenever a caller re-issues `play` before the browser has acked the first
1308
1308
  * (a slow scene boot outliving the relay's/SDK's own `play.start` timeout is
1309
- * the documented trigger — `packages/volter-sdk/src/play/transport.ts`'s
1309
+ * the documented trigger — `packages/editor-sdk/src/transport.ts`'s
1310
1310
  * `PLAY_START_TIMEOUT_MS`/`editor-server.ts`'s `PLAY_COMMAND_TIMEOUT_MS` —
1311
1311
  * and `play.start`'s own contract is explicitly "start (or restart)", so a
1312
1312
  * caller retrying after a timeout is using the API as documented, not
@@ -2,7 +2,7 @@
2
2
  * Meter arithmetic over an `AudioAdapter`'s `AudioMeterFrame.level` — the one
3
3
  * place a linear RMS level becomes dBFS and a bar fill. Lives beside the
4
4
  * adapter because both readers of a level (the editor's header meter and the
5
- * `@volter/game` audio debugger) are consumers of the adapter, and neither may
5
+ * `@volter/editor-game` audio debugger) are consumers of the adapter, and neither may
6
6
  * import the other.
7
7
  */
8
8
 
@@ -561,7 +561,7 @@ async function mountOneThreeRoot(
561
561
  * pinned to the mount-time `w`/`h` (same as three, until PIXI's own
562
562
  * construction-time resize runs), it self-heals the moment ANY real
563
563
  * `session.resize(rw, rh)` fires — every shipped standalone entry
564
- * (`packages/editor/template/src/main.ts`, `examples/tri-world/src/main.ts`)
564
+ * (`packages/game-editor/template/src/main.ts`, `examples/tri-world/src/main.ts`)
565
565
  * already calls `session.resize()` unconditionally right after mount, so
566
566
  * this never surfaces as a lasting bug the way three' buffer-only resize
567
567
  * did (never self-healing, by design — see above). */
@@ -7,7 +7,7 @@
7
7
  * boot still only ever gets a handle when the gate below actually passes).
8
8
  *
9
9
  * D17: this is door (a) of the seam's three doors — the SAME `DebugAdapter`
10
- * names/JSON the editor relay (door b) and `@volter/live` (door c, which
10
+ * names/JSON the editor relay (door b) and `@volter/game-live` (door c, which
11
11
  * drives door (a) itself over Playwright) all read. D18: the bridge installs
12
12
  * only when the page opts in (`?volter-debug=1`) AND is either a dev build
13
13
  * (`import.meta.env.DEV`) or the project's manifest explicitly opts a
@@ -148,7 +148,7 @@ export interface VolterDebugHandle {
148
148
  * (`DebugRegistry.registerWorldSettledProbe`, declared by the game's `debug.settled` entry
149
149
  * export) — so a tick never races a scene remount's async commit, and WHICH tick first runs
150
150
  * a freshly reloaded world is a function of the sim rather than wall timing. Session tick
151
- * drivers (`@volter/live`'s fastForward) prefer this door; with no probe registered it behaves
151
+ * drivers (`@volter/game-live`'s fastForward) prefer this door; with no probe registered it behaves
152
152
  * exactly like {@link runTicks}. Bounded: throws `WORLD_UNSETTLED_TIMEOUT` if a probe never
153
153
  * settles.
154
154
  */
@@ -159,7 +159,7 @@ export interface VolterDebugHandle {
159
159
  * this is the honest human-input-path proof) → `input.clearVirtualActions()`
160
160
  * into ONE async bridge call, as a TOP-LEVEL method (not under `input`)
161
161
  * because it needs the sim clock, not just the input target. Was 15+
162
- * transport round trips over the editor relay (`@volter/live`'s old
162
+ * transport round trips over the editor relay (`@volter/game-live`'s old
163
163
  * `GameInput.hold`: set → a 150ms-interval `waitSimTime` snapshot poll loop
164
164
  * → clear); now one `page.evaluate`/relay call that runs the wait
165
165
  * in-process on the page.
@@ -231,13 +231,13 @@ export interface MaybeInstallDebugBridgeOptions {
231
231
  const PAGE_ERROR_CAP = 100;
232
232
 
233
233
  /** `holdFor`'s in-process poll interval — this loop never leaves the page
234
- * (no transport round trip per poll, unlike `@volter/live`'s old
234
+ * (no transport round trip per poll, unlike `@volter/game-live`'s old
235
235
  * `waitSimTime`), so it can afford to be tighter than that loop's 150ms. */
236
236
  const HOLD_FOR_POLL_MS = 50;
237
237
 
238
238
  /** Consecutive `HOLD_FOR_POLL_MS` polls with the tick unchanged before
239
239
  * `holdFor` gives up waiting and treats the game as stopped — mirrors
240
- * `@volter/live`'s `WAIT_FOR_STALL_POLL_LIMIT` reasoning (`wait-for.ts`:
240
+ * `@volter/game-live`'s `WAIT_FOR_STALL_POLL_LIMIT` reasoning (`wait-for.ts`:
241
241
  * a genuinely frozen sim clock must never poll forever), scaled to this
242
242
  * faster in-process interval so the wall-clock grace period (~5s) lands in
243
243
  * the same neighborhood. */
@@ -107,7 +107,7 @@ export interface DebugCtxSurface {
107
107
 
108
108
  /** Engine-local error for the debug seam — mirrors the `code` + `data` shape
109
109
  * `packages/volter-sdk/src/errors.ts` uses (no import: the engine does not
110
- * depend on `@volter/sdk`). `code` is always machine-readable; nothing reading
110
+ * depend on the SDK). `code` is always machine-readable; nothing reading
111
111
  * this error may key off `message` prose. */
112
112
  export class DebugError extends Error {
113
113
  readonly code: string;
@@ -200,7 +200,7 @@ export interface InputTraceSnapshot {
200
200
  * (`runtime/game.ts`, D15/T-D15.3-.4) for full semantics. Named here (not
201
201
  * re-declared per-caller) so the bridge (`runtime/debug-bridge.ts`), the
202
202
  * editor relay (`command-listener.ts`'s `run-ticks` case), and
203
- * `play.runTicks` (`@volter/sdk`) all reference the SAME type. */
203
+ * `play.runTicks` (the SDK) all reference the SAME type. */
204
204
  export interface RunTicksOptions {
205
205
  /** `'last'` (default) — skip `preRender`/`render` for every tick except
206
206
  * the final one. `'all'` — render every tick. `'none'` — never render,
@@ -250,7 +250,7 @@ export function resolveManifest(raw: unknown): ResolvedGameManifest {
250
250
 
251
251
  // ---------------------------------------------------------------------------
252
252
  // Per-kind entry -> adapter resolution (mirrors `resolveRootBinding`'s
253
- // per-identity dispatch, `packages/editor/src/binding-resolver.ts`)
253
+ // per-identity dispatch, `packages/editor-game/src/host/binding-resolver.ts`)
254
254
  // ---------------------------------------------------------------------------
255
255
 
256
256
  function resolveThreeAdapter(