mirror of https://github.com/garrytan/gstack.git
2 Commits
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
e7c37d76b9 |
fix(tests): stop browse/design teardowns from killing the whole bun run
Several browse and design test files armed `setTimeout(() => process.exit(0), 500)` inside afterAll as a workaround for a browser close() that can hang. That assumes each test file runs in its own process. It doesn't: `bun test` runs EVERY file in one shared process. The 500ms timer therefore fired partway through a LATER test file and terminated the entire run with exit code 0 and no summary. Because the exit code was 0, the suite could not gate — only a fraction of the files ran, and every downstream failure was silently masked. The fix removes the delayed process.exit from teardown and instead time-boxes the resource cleanup: browser teardowns race `close()` against a short timeout and abandon it if it hangs (the child is reaped at real process exit), and the design daemon /shutdown test stubs `process.exit` around the shutdown timers so they fire harmlessly. A new static-guard test, test/no-suicide-exit.test.ts, scans every *.test.ts and fails if any file schedules a delayed process.exit, so the pattern cannot silently return. test/user-slug-fallback.test.ts is made deterministic via HOME isolation. Verified: test/no-suicide-exit.test.ts + test/user-slug-fallback.test.ts pass (15/15); browse/test/commands.test.ts passes standalone (243/243) and now runs to a full summary; design/test/daemon.test.ts passes (34/34) with no early exit. Honest note: with the suite now able to run to completion, it surfaces pre-existing failures that the early exit had been hiding — e.g. design/test/feedback-roundtrip.test.ts fails identically on unmodified origin/main (a `session.clearLoadedHtml` stub gap), independent of this change. These are not introduced here; this change only makes them visible so they can be gated on and fixed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
|
|
|
1868636f49
|
refactor: extract TabSession for per-tab state isolation (v0.15.16.0) (#873)
* plan: batch command endpoint + multi-tab parallel execution for GStack Browser * refactor: extract TabSession from BrowserManager for per-tab state Move per-tab state (refMap, lastSnapshot, frame) into a new TabSession class. BrowserManager delegates to the active TabSession via getActiveSession(). Zero behavior change — all existing tests pass. This is the foundation for the /batch endpoint: both /command and /batch will use the same handler functions with TabSession, eliminating shared state races during parallel tab execution. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: update handler signatures to use TabSession Change handleReadCommand and handleSnapshot to take TabSession instead of BrowserManager. Change handleWriteCommand to take both TabSession (per-tab ops) and BrowserManager (global ops like viewport, headers, dialog). handleMetaCommand keeps BrowserManager for tab management. Tests use thin wrapper functions that bridge the old 3-arg call pattern to the new signatures via bm.getActiveSession(). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add POST /batch endpoint for parallel multi-tab execution Execute multiple commands across tabs in a single HTTP request. Commands targeting different tabs run concurrently via Promise.allSettled. Commands targeting the same tab run sequentially within that group. Features: - Batch-safe command subset (text, goto, click, snapshot, screenshot, etc.) - newtab/closetab as special commands within batch - SSE streaming mode (stream: true) for partial results - Per-command error isolation (one tab failing doesn't abort the batch) - Max 50 commands per batch, soft batch-level timeout A 143-page crawl drops from ~45 min (serial HTTP) to ~5 min (20 tabs in parallel, batched commands). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add batch endpoint integration tests 10 tests covering: - Multi-tab parallel execution (goto + text on different tabs) - Same-tab sequential ordering - Per-command error isolation (one tab fails, others succeed) - Page-scoped refs (snapshot refs are per-session, not global) - Per-tab lastSnapshot (snapshot -D with independent baselines) - getSession/getActiveSession API - Batch-safe command subset validation - closeTab via page.close preserves at-least-one-page invariant - Parallel goto on 3 tabs simultaneously Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: harden codex-review E2E — extract SKILL.md section, bump maxTurns to 25 The test was copying the full 55KB/1075-line codex SKILL.md into the fixture, requiring 8 Read calls just to consume it and exhausting the 15-turn budget before reaching the actual codex review command. Now extracts only the review-relevant section (~6KB/148 lines), reducing Read calls from 8 to 1. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: move batch endpoint plan into BROWSER.md as feature documentation The batch endpoint is implemented — document it as an actual feature in BROWSER.md (architecture, API shape, design decisions, usage pattern) and remove the standalone plan file. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: bump version and changelog (v0.15.16.0) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: gstack <ship@gstack.dev> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |