@bitmagic/cli 0.1.37 → 0.1.39

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 (51) hide show
  1. package/README.md +41 -3
  2. package/dist/auth/subscribe-flow.d.ts +59 -0
  3. package/dist/auth/subscribe-flow.js +102 -0
  4. package/dist/auth/subscribe-flow.js.map +1 -0
  5. package/dist/browser-gl.d.ts +23 -0
  6. package/dist/browser-gl.js +50 -0
  7. package/dist/browser-gl.js.map +1 -1
  8. package/dist/cli.d.ts +41 -1
  9. package/dist/cli.js +4 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/login.js +33 -5
  12. package/dist/commands/login.js.map +1 -1
  13. package/dist/commands/subscribe.d.ts +14 -0
  14. package/dist/commands/subscribe.js +60 -0
  15. package/dist/commands/subscribe.js.map +1 -0
  16. package/dist/commands/usage.d.ts +76 -0
  17. package/dist/commands/usage.js +117 -0
  18. package/dist/commands/usage.js.map +1 -0
  19. package/dist/commands/verify.d.ts +13 -1
  20. package/dist/commands/verify.js +139 -15
  21. package/dist/commands/verify.js.map +1 -1
  22. package/dist/commands/whoami.d.ts +10 -4
  23. package/dist/commands/whoami.js +22 -7
  24. package/dist/commands/whoami.js.map +1 -1
  25. package/dist/forge/upload-proxy.js +1 -1
  26. package/dist/http/client.d.ts +10 -0
  27. package/dist/http/client.js +38 -2
  28. package/dist/http/client.js.map +1 -1
  29. package/dist/scaffold/claude-settings.js +4 -0
  30. package/dist/scaffold/claude-settings.js.map +1 -1
  31. package/dist/scaffold/project-files.d.ts +9 -0
  32. package/dist/scaffold/project-files.js +70 -9
  33. package/dist/scaffold/project-files.js.map +1 -1
  34. package/dist/scaffold/project.js +2 -1
  35. package/dist/scaffold/project.js.map +1 -1
  36. package/dist/verify/browser.d.ts +37 -1
  37. package/dist/verify/browser.js +389 -97
  38. package/dist/verify/browser.js.map +1 -1
  39. package/dist/verify/classify.d.ts +75 -2
  40. package/dist/verify/classify.js +48 -2
  41. package/dist/verify/classify.js.map +1 -1
  42. package/dist/verify/iterate.d.ts +47 -0
  43. package/dist/verify/iterate.js +162 -0
  44. package/dist/verify/iterate.js.map +1 -0
  45. package/dist/verify/result.d.ts +16 -3
  46. package/dist/verify/result.js +13 -3
  47. package/dist/verify/result.js.map +1 -1
  48. package/dist/verify/settle.d.ts +60 -0
  49. package/dist/verify/settle.js +90 -0
  50. package/dist/verify/settle.js.map +1 -0
  51. package/package.json +1 -1
@@ -2,6 +2,8 @@ import * as fs from 'fs';
2
2
  import { chromium } from 'playwright-core';
3
3
  import { browserGlArgs } from '../browser-gl.js';
4
4
  import { CliError } from '../errors.js';
5
+ import { RESPAWN_LINE, } from './classify.js';
6
+ import { DEFAULT_SETTLE_CONFIG, SETTLE_POLL_MS, isFreefalling, settleVerdict, } from './settle.js';
5
7
  export const DEFAULT_START_INTERACTION = {
6
8
  playButtonSelector: '#play-button, .hud-play-button',
7
9
  startedConsoleMarker: '🎮 Starting game...',
@@ -13,116 +15,406 @@ export const DEFAULT_START_INTERACTION = {
13
15
  * browser rather than a downloaded one, so installing the CLI stays a small, fast npm install.
14
16
  */
15
17
  export async function runHeadlessCheck(options) {
16
- let browser;
18
+ const session = await VerifyBrowserSession.launch(options.browserArgs);
17
19
  try {
18
- // `--mute-audio` because headless Chrome still plays sound through the machine's speakers:
19
- // without it every verify run blares the game's music and effects at whoever is sitting there.
20
- // The GL flags are not an optimisation — without them the game renders in software on a
21
- // machine with a perfectly good GPU, and a run that should take seconds crawls (browser-gl.ts).
22
- browser = await chromium.launch({
23
- headless: true,
24
- channel: 'chrome',
25
- args: ['--mute-audio', ...browserGlArgs(process.env)],
26
- });
20
+ return await session.check(options);
27
21
  }
28
- catch {
29
- // Not a game failure. Saying so plainly matters: an agent told "verification failed" would
30
- // start editing game code to fix a missing browser.
31
- throw new CliError('Could not launch Google Chrome. `bitmagic verify` drives the Chrome installed on this ' +
32
- 'machine — install it from https://www.google.com/chrome/ and run verify again.');
22
+ finally {
23
+ await session.close();
33
24
  }
34
- // Declared outside the try so the `finally` below can write whatever was captured even if the
35
- // browser phase throws (e.g. page.goto timing out) — artifacts are the point of a failing run.
36
- const consoleLines = [];
37
- const pageErrors = [];
38
- try {
39
- const context = await browser.newContext({ viewport: { width: 1280, height: 720 } });
40
- const page = await context.newPage();
41
- await armContextLossProbe(page);
42
- page.on('console', (message) => consoleLines.push(`${message.type()}: ${message.text()}`));
43
- page.on('pageerror', (error) => pageErrors.push(error.message));
44
- page.on('requestfailed', (request) => consoleLines.push(`requestfailed: ${request.url()} ${request.failure()?.errorText ?? ''}`));
25
+ }
26
+ /**
27
+ * A launched headless Chrome that can run any number of checks, each in a fresh browser context.
28
+ *
29
+ * One-shot verify launches, checks and closes (`runHeadlessCheck`). `--watch` keeps one session
30
+ * alive across iterations launching Chrome is by far the most expensive fixed cost of a run —
31
+ * while the per-check context still gives every iteration a clean slate: fresh init scripts,
32
+ * fresh listeners, fresh storage, and engine disposal via the page teardown.
33
+ */
34
+ export class VerifyBrowserSession {
35
+ browser;
36
+ constructor(browser) {
37
+ this.browser = browser;
38
+ }
39
+ static async launch(browserArgs) {
45
40
  try {
46
- await page.goto(options.url, { waitUntil: 'load', timeout: 45_000 });
41
+ // `--mute-audio` because headless Chrome still plays sound through the machine's speakers:
42
+ // without it every verify run blares the game's music and effects at whoever is sitting
43
+ // there. The GL flags are not an optimisation — without them the game renders in software
44
+ // on a machine with a perfectly good GPU, and a run that should take seconds crawls
45
+ // (browser-gl.ts).
46
+ return new VerifyBrowserSession(await chromium.launch({
47
+ headless: true,
48
+ channel: 'chrome',
49
+ args: ['--mute-audio', ...(browserArgs ?? browserGlArgs(process.env))],
50
+ }));
47
51
  }
48
- catch (error) {
49
- // Best-effort screenshot of whatever the page shows right now often still blank, but
50
- // worth having. The console log (written in `finally` below) is the useful artifact here.
52
+ catch {
53
+ // Not a game failure. Saying so plainly matters: an agent told "verification failed" would
54
+ // start editing game code to fix a missing browser.
55
+ throw new CliError('Could not launch Google Chrome. `bitmagic verify` drives the Chrome installed on this ' +
56
+ 'machine — install it from https://www.google.com/chrome/ and run verify again.');
57
+ }
58
+ }
59
+ async close() {
60
+ await this.browser.close();
61
+ }
62
+ async check(options) {
63
+ // Declared outside the try so the `finally` below can write whatever was captured even if the
64
+ // browser phase throws (e.g. page.goto timing out) — artifacts are the point of a failing run.
65
+ const consoleLines = [];
66
+ const pageErrors = [];
67
+ const context = await this.browser.newContext({ viewport: { width: 1280, height: 720 } });
68
+ try {
69
+ const page = await context.newPage();
70
+ await armContextLossProbe(page);
71
+ await armFrameCounter(page);
72
+ page.on('console', (message) => consoleLines.push(`${message.type()}: ${message.text()}`));
73
+ page.on('pageerror', (error) => pageErrors.push(error.message));
74
+ page.on('requestfailed', (request) => consoleLines.push(`requestfailed: ${request.url()} ${request.failure()?.errorText ?? ''}`));
51
75
  try {
52
- fs.writeFileSync(options.screenshotPath, await page.screenshot());
76
+ await page.goto(options.url, { waitUntil: 'load', timeout: 45_000 });
53
77
  }
54
- catch {
55
- // Page may already be unusable (closed context, crashed renderer)nothing to save.
78
+ catch (error) {
79
+ // Best-effort screenshot of whatever the page shows right nowoften still blank, but
80
+ // worth having. The console log (written in `finally` below) is the useful artifact here.
81
+ if (options.captureScreenshot !== false) {
82
+ try {
83
+ fs.writeFileSync(options.screenshotPath, await page.screenshot());
84
+ }
85
+ catch {
86
+ // Page may already be unusable (closed context, crashed renderer) — nothing to save.
87
+ }
88
+ }
89
+ const detail = error instanceof Error ? error.message : String(error);
90
+ throw new CliError(`The page never finished loading at ${options.url}: ${detail}`);
91
+ }
92
+ const interaction = options.startInteraction === undefined
93
+ ? null
94
+ : await performStartInteraction(page, consoleLines, options.startInteraction);
95
+ // Verify settles adaptively — a game that provably reached stable gameplay is observed
96
+ // after a few seconds instead of the full fixed window, with `settleMs` as the hard cap.
97
+ // The smoke check keeps the fixed wait: its game lives in an iframe this probe does not
98
+ // reach, and its question ("does the published bundle come up") has no early exit.
99
+ let settle;
100
+ let settleSamples = [];
101
+ if (options.startInteraction === undefined) {
102
+ await page.waitForTimeout(options.settleMs);
103
+ }
104
+ else {
105
+ ({ settle, samples: settleSamples } = await adaptiveSettle(page, consoleLines, options.settleMs));
106
+ }
107
+ // Same probe either way; only the frame it runs in differs. A missing child frame leaves
108
+ // `target` null, which classifies as "no canvas" — correct, because a harness whose iframe
109
+ // never loaded (a download, a 404) is exactly the failure this mode exists to catch.
110
+ const target = options.probeFrameUrlIncludes === undefined
111
+ ? page
112
+ : page.frames().find((frame) => frame.url().includes(options.probeFrameUrlIncludes)) ?? null;
113
+ const canvas = target === null ? null : await target.evaluate(() => {
114
+ // This callback runs inside the browser Playwright drives, not in the CLI's Node process,
115
+ // so `document` is a real global there even though the CLI's eslint config declares no
116
+ // DOM globals for the process it actually lints.
117
+ // eslint-disable-next-line no-undef
118
+ const element = document.querySelector('#game-container canvas');
119
+ if (!(element instanceof HTMLCanvasElement))
120
+ return null;
121
+ const rect = element.getBoundingClientRect();
122
+ return {
123
+ width: Math.round(rect.width),
124
+ height: Math.round(rect.height),
125
+ // The drawing-buffer attributes, not CSS size — see CanvasObservation in classify.ts for
126
+ // why this replaced a getContext() probe.
127
+ bufferWidth: element.width,
128
+ bufferHeight: element.height,
129
+ // Page coordinates of the rect, for sampling the captured frame below. Kept out of
130
+ // CanvasObservation, which is about whether a renderer claimed the canvas, not where.
131
+ left: Math.round(rect.left),
132
+ top: Math.round(rect.top),
133
+ };
134
+ });
135
+ // `--fast` skips the whole screenshot pipeline — capture, disk write, and the in-page PNG
136
+ // re-decode of measureCanvasFrame. The context-loss probe, frame counter and state
137
+ // snapshot still catch the black-frame family; what is lost is only the pixel evidence,
138
+ // which the inner loop does not need and publish's own smoke check always recaptures.
139
+ let screenshotBytes = null;
140
+ let canvasFrame = null;
141
+ if (options.captureScreenshot !== false) {
142
+ const screenshotBuffer = await page.screenshot();
143
+ fs.writeFileSync(options.screenshotPath, screenshotBuffer);
144
+ screenshotBytes = screenshotBuffer.length;
145
+ canvasFrame = canvas === null
146
+ ? null
147
+ : await measureCanvasFrame(page, screenshotBuffer, canvas);
148
+ }
149
+ const webglContextLost = await page.evaluate(
150
+ // eslint-disable-next-line no-undef -- browser-side callback, see the canvas probe above.
151
+ (flag) => window[flag] === true, CONTEXT_LOST_FLAG);
152
+ const renderer = options.requestedRenderer === undefined
153
+ ? undefined
154
+ : target === null
155
+ ? { requested: options.requestedRenderer, rendererType: null, backend: null }
156
+ : await probeRenderer(target, options.requestedRenderer);
157
+ const snapshot = options.startInteraction === undefined || target === null
158
+ ? undefined
159
+ : await captureStateSnapshot(target, settleSamples);
160
+ let start;
161
+ if (options.startInteraction !== undefined && interaction !== null) {
162
+ start = {
163
+ ...interaction,
164
+ // Recomputed from the full console capture rather than taken from the interaction step,
165
+ // so a start that only lands during the settle (slow world load) still counts.
166
+ gameStartDetected: hasStartMarker(consoleLines, options.startInteraction.startedConsoleMarker),
167
+ menuVisibleAfterSettle: await isMenuVisible(page),
168
+ };
56
169
  }
57
- const detail = error instanceof Error ? error.message : String(error);
58
- throw new CliError(`The page never finished loading at ${options.url}: ${detail}`);
59
- }
60
- const interaction = options.startInteraction === undefined
61
- ? null
62
- : await performStartInteraction(page, consoleLines, options.startInteraction);
63
- await page.waitForTimeout(options.settleMs);
64
- // Same probe either way; only the frame it runs in differs. A missing child frame leaves
65
- // `target` null, which classifies as "no canvas" — correct, because a harness whose iframe
66
- // never loaded (a download, a 404) is exactly the failure this mode exists to catch.
67
- const target = options.probeFrameUrlIncludes === undefined
68
- ? page
69
- : page.frames().find((frame) => frame.url().includes(options.probeFrameUrlIncludes)) ?? null;
70
- const canvas = target === null ? null : await target.evaluate(() => {
71
- // This callback runs inside the browser Playwright drives, not in the CLI's Node process,
72
- // so `document` is a real global there even though the CLI's eslint config declares no
73
- // DOM globals for the process it actually lints.
74
- // eslint-disable-next-line no-undef
75
- const element = document.querySelector('#game-container canvas');
76
- if (!(element instanceof HTMLCanvasElement))
77
- return null;
78
- const rect = element.getBoundingClientRect();
79
170
  return {
80
- width: Math.round(rect.width),
81
- height: Math.round(rect.height),
82
- // The drawing-buffer attributes, not CSS size — see CanvasObservation in classify.ts for
83
- // why this replaced a getContext() probe.
84
- bufferWidth: element.width,
85
- bufferHeight: element.height,
86
- // Page coordinates of the rect, for sampling the captured frame below. Kept out of
87
- // CanvasObservation, which is about whether a renderer claimed the canvas, not where.
88
- left: Math.round(rect.left),
89
- top: Math.round(rect.top),
90
- };
91
- });
92
- const screenshotBuffer = await page.screenshot();
93
- fs.writeFileSync(options.screenshotPath, screenshotBuffer);
94
- const canvasFrame = canvas === null
95
- ? null
96
- : await measureCanvasFrame(page, screenshotBuffer, canvas);
97
- const webglContextLost = await page.evaluate(
98
- // eslint-disable-next-line no-undef -- browser-side callback, see the canvas probe above.
99
- (flag) => window[flag] === true, CONTEXT_LOST_FLAG);
100
- let start;
101
- if (options.startInteraction !== undefined && interaction !== null) {
102
- start = {
103
- ...interaction,
104
- // Recomputed from the full console capture rather than taken from the interaction step,
105
- // so a start that only lands during the settle (slow world load) still counts.
106
- gameStartDetected: hasStartMarker(consoleLines, options.startInteraction.startedConsoleMarker),
107
- menuVisibleAfterSettle: await isMenuVisible(page),
171
+ consoleLines,
172
+ pageErrors,
173
+ canvas,
174
+ screenshotBytes,
175
+ webglContextLost,
176
+ canvasFrame,
177
+ start,
178
+ renderer,
179
+ snapshot,
180
+ settle,
108
181
  };
109
182
  }
110
- return {
111
- consoleLines,
112
- pageErrors,
113
- canvas,
114
- screenshotBytes: screenshotBuffer.length,
115
- webglContextLost,
116
- canvasFrame,
117
- start,
183
+ finally {
184
+ // Written on success and failure alike, including when the try block above threw before
185
+ // ever reaching the screenshot: the console log is the most useful thing a creator or their
186
+ // agent can look at when the page never came up at all.
187
+ fs.writeFileSync(options.consolePath, [...consoleLines, ...pageErrors.map((e) => `pageerror: ${e}`)].join('\n'));
188
+ await context.close();
189
+ }
190
+ }
191
+ }
192
+ /** Window counter the init script below increments on every rAF tick. */
193
+ const FRAME_COUNT_FLAG = '__bitmagicFrameCount';
194
+ /**
195
+ * Count rendered frames from before any page script runs.
196
+ *
197
+ * rAF rate is the page's heartbeat: a page whose loop stalls (a hung WebGPU init, a crashed
198
+ * renderer process) keeps its DOM and console looking healthy while this counter freezes, and
199
+ * the settle loop reads it every poll to prove the game is actually running, not just loaded.
200
+ */
201
+ async function armFrameCounter(page) {
202
+ await page.addInitScript((flag) => {
203
+ /* eslint-disable no-undef -- browser-side callback, see the canvas probe above. */
204
+ const w = window;
205
+ w[flag] = 0;
206
+ const tick = () => {
207
+ w[flag] = w[flag] + 1;
208
+ requestAnimationFrame(tick);
118
209
  };
210
+ requestAnimationFrame(tick);
211
+ /* eslint-enable no-undef */
212
+ }, FRAME_COUNT_FLAG);
213
+ }
214
+ /**
215
+ * Settle by watching the live game rather than waiting a fixed time: poll the engine every
216
+ * `SETTLE_POLL_MS` and stop as soon as `settleVerdict` says stable gameplay has been observed,
217
+ * with `maxMs` (the old fixed settle) as the hard cap. The samples come back with the result
218
+ * because the final state snapshot derives fps and the falling judgement from them.
219
+ */
220
+ async function adaptiveSettle(page, consoleLines, maxMs) {
221
+ const samples = [];
222
+ const startedAt = Date.now();
223
+ for (;;) {
224
+ const elapsed = Date.now() - startedAt;
225
+ if (elapsed >= maxMs) {
226
+ return { settle: { durationMs: elapsed, reason: 'timeout' }, samples };
227
+ }
228
+ await page.waitForTimeout(Math.min(SETTLE_POLL_MS, maxMs - elapsed));
229
+ samples.push(await takeSettleSample(page, Date.now() - startedAt, consoleLines));
230
+ if (settleVerdict(samples, DEFAULT_SETTLE_CONFIG) === 'settled') {
231
+ return { settle: { durationMs: Date.now() - startedAt, reason: 'stable' }, samples };
232
+ }
119
233
  }
120
- finally {
121
- // Written on success and failure alike, including when the try block above threw before
122
- // ever reaching the screenshot: the console log is the most useful thing a creator or their
123
- // agent can look at when the page never came up at all.
124
- fs.writeFileSync(options.consolePath, [...consoleLines, ...pageErrors.map((e) => `pageerror: ${e}`)].join('\n'));
125
- await browser.close();
234
+ }
235
+ /**
236
+ * One poll of the live page. Every probe is feature-detected and the whole evaluate is wrapped
237
+ * twice (in the page and out here): a page that cannot answer yields nulls, which
238
+ * `settleVerdict` treats as "cannot settle early" — the run then simply waits out the cap,
239
+ * exactly the pre-adaptive behaviour.
240
+ */
241
+ async function takeSettleSample(page, atMs, consoleLines) {
242
+ const errorEventCount = consoleLines.filter((line) => line.startsWith('error:') || line.includes(RESPAWN_LINE)).length;
243
+ const unobserved = { frameCount: null, gameState: null, hasStarted: null, playerY: null };
244
+ try {
245
+ const probed = await page.evaluate((flag) => {
246
+ /* eslint-disable no-undef -- browser-side callback, see the canvas probe above. */
247
+ try {
248
+ const w = window;
249
+ const frameCount = typeof w[flag] === 'number' ? w[flag] : null;
250
+ const template = w.gameTemplate;
251
+ const engine = template?.getGameEngine?.();
252
+ let gameState = null;
253
+ let hasStarted = null;
254
+ let playerY = null;
255
+ if (engine) {
256
+ const state = engine.gameStateManager?.getCurrentState?.();
257
+ gameState = typeof state === 'string' ? state : null;
258
+ const started = engine.gameStateManager?.hasStarted?.();
259
+ hasStarted = typeof started === 'boolean' ? started : null;
260
+ const player = typeof engine.getCurrentPlayer === 'function'
261
+ ? engine.getCurrentPlayer()
262
+ : null;
263
+ const position = typeof player?.getPosition === 'function'
264
+ ? player.getPosition()
265
+ : player?.player?.position;
266
+ const y = position?.y;
267
+ playerY = typeof y === 'number' && Number.isFinite(y) ? y : null;
268
+ }
269
+ return { frameCount, gameState, hasStarted, playerY };
270
+ }
271
+ catch {
272
+ return { frameCount: null, gameState: null, hasStarted: null, playerY: null };
273
+ }
274
+ /* eslint-enable no-undef */
275
+ }, FRAME_COUNT_FLAG);
276
+ return { atMs, errorEventCount, ...probed };
277
+ }
278
+ catch {
279
+ return { atMs, errorEventCount, ...unobserved };
280
+ }
281
+ }
282
+ /**
283
+ * End-of-run engine state, read through the same debug handle as `probeRenderer` and under the
284
+ * same contract: every field feature-detected, null meaning "not observed", the whole snapshot
285
+ * null when the engine cannot be reached at all. fps and the falling judgement come from the
286
+ * settle samples rather than the page, because both are derivatives of change over time and a
287
+ * single evaluate cannot see time.
288
+ */
289
+ async function captureStateSnapshot(target, samples) {
290
+ let probed;
291
+ try {
292
+ probed = await target.evaluate(() => {
293
+ /* eslint-disable no-undef -- browser-side callback, see the canvas probe above. */
294
+ try {
295
+ const w = window;
296
+ const template = w.gameTemplate;
297
+ const engine = template?.getGameEngine?.();
298
+ if (!engine)
299
+ return null;
300
+ const state = engine.gameStateManager?.getCurrentState?.();
301
+ const started = engine.gameStateManager?.hasStarted?.();
302
+ const elapsed = typeof engine.getElapsedTime === 'function' ? engine.getElapsedTime() : null;
303
+ const playerHandle = typeof engine.getCurrentPlayer === 'function'
304
+ ? engine.getCurrentPlayer()
305
+ : null;
306
+ const position = typeof playerHandle?.getPosition === 'function'
307
+ ? playerHandle.getPosition()
308
+ : playerHandle?.player?.position;
309
+ const p = position;
310
+ const player = typeof p?.x === 'number' && typeof p?.y === 'number' && typeof p?.z === 'number'
311
+ ? { x: p.x, y: p.y, z: p.z }
312
+ : null;
313
+ const stats = engine.physicsWorld?.getStats?.();
314
+ const physics = typeof stats?.rigidBodyCount === 'number' && typeof stats?.colliderCount === 'number'
315
+ ? { rigidBodyCount: stats.rigidBodyCount, colliderCount: stats.colliderCount }
316
+ : null;
317
+ let scene = null;
318
+ if (engine.scene && typeof engine.scene.traverse === 'function') {
319
+ let objects = 0;
320
+ let meshes = 0;
321
+ let lights = 0;
322
+ engine.scene.traverse((object) => {
323
+ objects++;
324
+ const o = object;
325
+ if (o.isMesh === true)
326
+ meshes++;
327
+ if (o.isLight === true)
328
+ lights++;
329
+ });
330
+ scene = { objects, meshes, lights };
331
+ }
332
+ const registry = typeof engine.getNpcRegistry === 'function'
333
+ ? engine.getNpcRegistry()
334
+ : null;
335
+ const count = registry?.getCount?.();
336
+ return {
337
+ gameState: typeof state === 'string' ? state : null,
338
+ hasStarted: typeof started === 'boolean' ? started : null,
339
+ elapsedTimeSeconds: typeof elapsed === 'number' && Number.isFinite(elapsed) ? elapsed : null,
340
+ player,
341
+ physics,
342
+ scene,
343
+ npcCount: typeof count === 'number' ? count : null,
344
+ };
345
+ }
346
+ catch {
347
+ return null;
348
+ }
349
+ /* eslint-enable no-undef */
350
+ });
351
+ }
352
+ catch {
353
+ return null;
354
+ }
355
+ if (probed === null)
356
+ return null;
357
+ return {
358
+ ...probed,
359
+ fps: measureFps(samples),
360
+ player: probed.player === null ? null : { ...probed.player, isFalling: isFreefalling(samples) },
361
+ };
362
+ }
363
+ /**
364
+ * Page rAF rate across the final settle polls (up to four, ~1.5s), or null when the counter was
365
+ * not observed twice. The window is wider than one poll on purpose: a slow-but-alive loop
366
+ * (software rendering at a frame a second) can produce zero frames in any single 500ms interval,
367
+ * and 0 is reserved for a loop that is actually stalled — any observed frame reports at least 1.
368
+ */
369
+ function measureFps(samples) {
370
+ const counted = samples.filter((sample) => sample.frameCount !== null).slice(-4);
371
+ if (counted.length < 2)
372
+ return null;
373
+ const last = counted[counted.length - 1];
374
+ const first = counted[0];
375
+ const intervalMs = last.atMs - first.atMs;
376
+ if (intervalMs <= 0)
377
+ return null;
378
+ const frames = last.frameCount - first.frameCount;
379
+ if (frames <= 0)
380
+ return 0;
381
+ return Math.max(1, Math.round((frames * 1000) / intervalMs));
382
+ }
383
+ /**
384
+ * What renderer class the engine constructed and what backend is actually driving the canvas,
385
+ * read from the live engine through the debug handle `GameTemplate` installs on `window`.
386
+ *
387
+ * Everything is feature-detected and the whole probe returns nulls on any throw: an older engine
388
+ * without these getters, or a page too broken to answer, classifies as "not observed" — never as
389
+ * a failure of the game. The one distinction that matters is `backend === 'webgl2'` when WebGPU
390
+ * was requested: three's WebGPURenderer runs a WebGL2 fallback backend without erroring, and this
391
+ * getter is the only place that state is visible.
392
+ */
393
+ async function probeRenderer(target, requested) {
394
+ try {
395
+ const observed = await target.evaluate(() => {
396
+ /* eslint-disable no-undef -- browser-side callback, see the canvas probe above. */
397
+ try {
398
+ const template = window.gameTemplate;
399
+ const engine = template?.getGameEngine?.();
400
+ if (!engine)
401
+ return { rendererType: null, backend: null };
402
+ const rendererType = typeof engine.getRendererType === 'function' ? engine.getRendererType() : null;
403
+ const backend = typeof engine.getActiveBackend === 'function' ? engine.getActiveBackend() : null;
404
+ return {
405
+ rendererType: typeof rendererType === 'string' ? rendererType : null,
406
+ backend: typeof backend === 'string' ? backend : null,
407
+ };
408
+ }
409
+ catch {
410
+ return { rendererType: null, backend: null };
411
+ }
412
+ /* eslint-enable no-undef */
413
+ });
414
+ return { requested, ...observed };
415
+ }
416
+ catch {
417
+ return { requested, rendererType: null, backend: null };
126
418
  }
127
419
  }
128
420
  /** Window flag the init script below sets when the page loses its WebGL context. */
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/verify/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/verify/browser.ts"],"names":[],"mappings":"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"}