v1.0.4 — Stealth layer, deadlock fix, docs overhaul
Critical Bug Fixes
- Event-loop deadlock — _search_impl\ runs on the browser event loop; calling the sync \get_or_create_session()\ wrapper tried to submit a coroutine to the same loop and blocked, causing a 60s deadlock per attempt (~123s total). Fixed by using \�wait _get_or_create()\ / \�wait _release()\ directly.
- Double-submit timeout — after pressing Enter the send button becomes disabled; the old _click_submit()\ then waited 30s trying to click the disabled button. New _submit_query()\ checks the button state first and only clicks as a fallback.
Browser Stealth Layer
- New \stealth.py\ module — patches
avigator.webdriver, \chrome.runtime, plugins, languages, WebGL vendor, permissions, and window dimensions. - Human-like input helpers: \human_type()\ (per-char jitter 35–120ms), \human_click()\ (mouse-move + click),
andom_delay(). - Stealth context options: viewport jitter, locale, timezone, Sec-CH-UA client hints, device scale factor.
- Launch args: --disable-blink-features=AutomationControlled, --disable-infobars.
- User-Agent updated to Chrome/132.
Documentation
- README.md rewritten: concise, version-agnostic (overview, quick start, client setup, tools table, link to full docs).
- Release Notes page added to nav across all 9 doc pages.
- Architecture updated: session pool, stealth layer, anti-loop safety sections; updated diagram and project structure.
- Configuration updated: 9 new env vars (search/parsed/topic cache, rate limiting, session pool, topic preview).
Testing
- 22 new stealth tests; 151 total tests passing.
- Added \ ests/diagnose_search.py\ — standalone diagnostic script for headless chat debugging.
Full Changelog: v1.0.3...v1.0.4