mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-23 16:36:23 +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.
63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import './e2e/fix-electron-tracing'
|
|
|
|
import { defineConfig, type ReporterDescription } from '@playwright/test'
|
|
|
|
/**
|
|
* Visual regression testing config.
|
|
*
|
|
* Screenshots are compared against baselines. On `main`, baselines are
|
|
* generated with `--update-snapshots` and cached. On PRs, the cached
|
|
* baselines are restored and screenshots are compared — but tests DON'T
|
|
* fail on visual diffs (see `expectVisualSnapshot` in visual-snapshot.ts).
|
|
* Instead, diffs are surfaced in the CI step summary and uploaded as
|
|
* artifacts for human review.
|
|
*
|
|
* To update baselines after an intentional UI change:
|
|
* npx playwright test --update-snapshots
|
|
*/
|
|
const reporters: ReporterDescription[] = [
|
|
['list'],
|
|
['html', { open: 'never', outputFolder: 'playwright-report' }],
|
|
]
|
|
|
|
if (process.env.CI) {
|
|
reporters.push(['json', { outputFile: 'playwright-report/results.json' }])
|
|
}
|
|
|
|
export default defineConfig({
|
|
/* Test files live under e2e/ so they never collide with the vitest suite
|
|
* under src/ or the node:test files under electron/. */
|
|
testDir: './e2e',
|
|
/* The desktop app can take a while to bootstrap on cold CI runners — 90 s
|
|
* per test gives us headroom without masking real hangs. */
|
|
timeout: 90_000,
|
|
retries: process.env.CI ? 1 : 0,
|
|
/* Each test gets its own worker so the Electron process is fully isolated. */
|
|
fullyParallel: false,
|
|
reporter: reporters,
|
|
use: {
|
|
screenshot: 'on',
|
|
trace: { mode: 'on', screenshots: true, snapshots: true, sources: true },
|
|
// Emulate prefers-reduced-motion: reduce so all CSS transitions and
|
|
// animations resolve instantly. This prevents boot/connecting overlays
|
|
// from being mid-fade when a screenshot fires, and skips JS-driven exit
|
|
// choreography in components that check matchMedia (onboarding, connecting
|
|
// overlay, DecodeText). Without this, screenshots capture the loading bar
|
|
// or overlay at a transient opacity because the text-content check fires
|
|
// before the visual transition finishes.
|
|
contextOptions: {
|
|
reducedMotion: 'reduce',
|
|
},
|
|
},
|
|
expect: {
|
|
toHaveScreenshot: {
|
|
// 1% of pixels may differ — absorbs sub-pixel font rendering variance
|
|
// between local and CI environments.
|
|
maxDiffPixelRatio: 0.01,
|
|
animations: 'disabled',
|
|
caret: 'hide',
|
|
// Per-channel threshold for "close enough" — anti-aliasing differences.
|
|
threshold: 0.2,
|
|
},
|
|
},
|
|
})
|