mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-24 16:54:43 +00:00
Blocking #1 — gateway-connecting-overlay.tsx reduced-motion regression: the top `if (reduce) setPhase('gone')` fired unconditionally on mount whenever reduce-motion was on, so every OS reduced-motion user lost the CONNECTING overlay during cold boot entirely (jumped to 'gone' before the gateway was even open). The intent was to skip the exit *choreography*, not to skip showing the overlay. Removed the unconditional top block and the redundant nested preview block; kept only the third branch (`gatewayState === 'open' && shownRef.current` → `reduce ? 'gone' : 'text-out'`) which correctly gates the short-circuit on connect. Also fixed `if(reduce)` missing-space, 6-space misindent, and the same 3-line comment pasted three times. Nit #1 — tsconfig excludes e2e, so specs were never typechecked in CI. Added tsconfig.e2e.json (extends base, includes e2e/ + playwright.config.ts, adds @playwright/test types) and wired it into the typecheck script. This surfaced three latent type errors that are fixed in the same commit: - fix-electron-tracing.ts: `app._context` and `electron._playwright` are private APIs — added `as any` on the access before the existing cast. - playwright.config.ts: `reducedMotion: 'reduce'` directly under `use:` is not a valid UseOptions property in playwright 1.58; it's a BrowserContextOption accessed via `contextOptions: { reducedMotion: 'reduce' }`. The old form was silently ignored at runtime, so reduced-motion emulation wasn't actually active — screenshots could catch overlays mid-fade (exactly what the comment warned about). Nit #2 — fix-electron-tracing.ts reaches into Playwright internals (_playwright, _allContexts, _context) with no public contract. Added a header comment calling out the `@playwright/test` exact pin (=1.58.2) so a future bump knows to re-verify the private symbols still exist. Nit #3 — main.ts TEST_WORKER_INDEX block had stray 6-space indentation. Verified: tsc -p . && tsconfig.electron && tsconfig.e2e → 0 errors; vitest boot-failure-overlay (3/3) + boot-failure-reauth (21/21) pass; npm run build clean; playwright e2e/boot-failure.spec.ts 2/2 pass.
72 lines
3 KiB
TypeScript
72 lines
3 KiB
TypeScript
/**
|
|
* Monkey-patch: playwright's test runner never calls tracing.start() on
|
|
* Electron's internal BrowserContext because:
|
|
* 1. Playwright._allContexts() only returns [chromium, firefox, webkit]
|
|
* contexts — Electron's context is excluded.
|
|
* 2. ArtifactsRecorder.didCreateBrowserContext runs in willStartTest, before
|
|
* beforeAll launches the electron app.
|
|
* 3. The runAfterCreateBrowserContext hook doesn't exist on the Electron
|
|
* class (only on BrowserType).
|
|
*
|
|
* As a result, trace screenshots (screencast) and DOM snapshots are never
|
|
* captured for electron tests.
|
|
*
|
|
* This patch:
|
|
* 1. Patches _allContexts() to include electron contexts, so the test
|
|
* runner's didFinishTest() cleanup calls _stopTracing() → stopChunk()
|
|
* on the electron context (saving the trace chunk + merging it into
|
|
* the final trace.zip).
|
|
* 2. Manually calls tracing.start() + startChunk() after launch.
|
|
* 3. Wraps tracing.start to become startChunk after the first call,
|
|
* so the test runner's willStartTest doesn't throw "already started".
|
|
*
|
|
* Imported from playwright.config.ts so it runs before any test.
|
|
*
|
|
* Pinned dependency: this file reaches into Playwright internals (_playwright,
|
|
* _allContexts, _context) that have no public contract. @playwright/test is
|
|
* pinned exact (=1.58.2 in package.json) so a bump can't silently break the
|
|
* monkeypatch. When bumping, re-verify these private symbols still exist on
|
|
* the Electron / PlaywrightInternal classes and that tracing still merges.
|
|
*/
|
|
|
|
import { _electron as electron, type BrowserContext } from '@playwright/test'
|
|
import * as crypto from 'node:crypto'
|
|
|
|
const electronContexts = new Set<BrowserContext>()
|
|
const originalLaunch = electron.launch.bind(electron)
|
|
|
|
electron.launch = async (options: any) => {
|
|
const app = await originalLaunch(options)
|
|
const ctx = (app as any)._context as BrowserContext
|
|
electronContexts.add(ctx)
|
|
ctx.once('close', () => electronContexts.delete(ctx))
|
|
|
|
// Patch _allContexts so the test runner sees the electron context
|
|
// (didFinishTest cleanup → _stopTracing → stopChunk → merge into trace.zip).
|
|
const pw = (electron as any)._playwright as any
|
|
if (pw && !pw.__electronTracingPatched) {
|
|
pw.__electronTracingPatched = true
|
|
const original = pw._allContexts.bind(pw)
|
|
pw._allContexts = () => [...original(), ...electronContexts]
|
|
}
|
|
|
|
// Start tracing — mirrors ArtifactsRecorder.didCreateBrowserContext.
|
|
const traceName = crypto.randomUUID()
|
|
await ctx.tracing.start({
|
|
screenshots: true,
|
|
snapshots: true,
|
|
sources: true,
|
|
}).catch(() => {})
|
|
await ctx.tracing.startChunk({ title: 'electron', name: traceName }).catch(() => {})
|
|
|
|
// Wrap tracing.start to redirect to startChunk after the first call.
|
|
// The test runner's willStartTest calls tracing.start() on all contexts
|
|
// in _allContexts(). Since we already started, redirect to startChunk
|
|
// to avoid "Tracing has been already started" errors.
|
|
const tracing = ctx.tracing as any
|
|
tracing.start = async (opts: any) => {
|
|
return tracing.startChunk(opts)
|
|
}
|
|
|
|
return app
|
|
}
|