"""The Juggler client in Python: the break from Playwright, piece by piece.

| module | what it does |
|---|---|
| `protocol.py` | GENERATED by `scripts/gen_juggler_protocol.py` reading the `Protocol.js` that lives inside the SHIPPED binary. No count here: the one that stood in this line went stale by four commands while a test kept asserting it, and the e2e job now runs `--check` against the pinned engine instead |
| `connection.py` | the pipe to Juggler. JSON delimited by a zero byte; fd 3/4 on POSIX, inheritable HANDLEs on Windows |
| `lifecycle.py` | frame tree, navigations, the four load states |
| `injected.py` | loads `injected.js` into the UTILITY world and calls it: selectors and actionability |
| `injected.js` | extracted from the bundle with `scripts/gen_injected_source.py`. It is not upstream: it carries the fork's stealth fixes |

⛔ **No product module imports this package yet**: it is inert by
construction, and stays that way until `_impl` leans on it. What is missing
lives in `docs/firefox-stealth-architecture/32-stacco-da-playwright.md` §6,
which is also the only place where the design and the inventory of
constraints live.

⛔ **What lives here REACHES the user**, because it sits under
`src/invisible_playwright/`. A tool that only serves us goes in `scripts/`,
which the wheel does not include.
"""
