Repository navigation
Conversation
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 23, 2026 16:40
d39da5a to
b11c371
Compare
ctate
reviewed
Oct 23, 2026
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 23, 2026 20:45
b11c371 to
1d222eb
Compare
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 23, 2026 22:30
1d222eb to
f115779
Compare
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 23, 2026 22:52
f115779 to
d8ac0fb
Compare
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 23, 2026 23:21
d8ac0fb to
e9a1eef
Compare
brcampos-ia
approved these changes
Oct 24, 2026
lahfir
force-pushed
the
laf/bidi-live-view-docs
branch
from
October 26, 2026 20:33
e9a1eef to
c9c59be
Compare
ctate
reviewed
Nov 7, 2026
38 tests were lost in the move from firefox/ to bidi/. Restore them, porting the touch tap and stale-ref recovery tests to the new Origin and document-identity APIs.
Keep the opener-based active tab fallback and clear the ids, labels, refs and prompts of a destroyed tab. The tab-closed test now checks that cleanup.
ctate
approved these changes
Nov 8, 2026
The refactored Firefox modules land in bidi/: navigation and daemon own loading and page resets, pointer and text entry own their policies, and network owns event recording scope and the allowlist entry point.
The page already lists firefox, so the edit no longer applies and the docs contract test fails on the missing anchor.
The fixture listed the same replacement twice, so the second pass failed. Keep a single entry and leave the baseline untouched, so the route contract sees the Firefox engine list.
The env table row changed with the engine list, so the route contract needs the matching edit.
The rendered sample and the table markup carry the engine list in different forms, so both need the edit.
ctate
approved these changes
Nov 8, 2026
ctate
approved these changes
Nov 8, 2026
ctate
approved these changes
Nov 9, 2026
| } | ||
| } | ||
| if state.browser.is_none() && state.firefox.is_some() { | ||
| state.broadcast_firefox_tabs().await; |
Collaborator
There was a problem hiding this comment.
With streaming enabled this runs after every Firefox command and issues a getTree plus one document.title eval per tab even when no dashboard client is connected, so a stalled page adds up to ~1.25 s to each CLI command. Not reproduced.
| }; | ||
| let size = live | ||
| .bidi | ||
| .call_function( |
Collaborator
There was a problem hiding this comment.
The poll loop awaits this call and the screenshot before it can select again, both with the 30 s default timeout, so one unresponsive tab freezes frame publishing and prompt-pause tracking for up to 30 s. Not reproduced.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
bidi, and defines their routing once.Demo
The terminal drives a Firefox session over WebDriver BiDi; the right side shows that Firefox page as each command runs.
demo.mp4
Architecture
flowchart TB subgraph Clients CLI[CLI] MCP[MCP server] DASH[Dashboard] end CLI & MCP & DASH -->|JSON over daemon socket| EX subgraph Daemon["Daemon (native/actions.rs)"] EX[execute_command] GATES[Policy + confirmation gates<br/>implicit launch / relaunch] ROUTE{engine == firefox?} CDPH[Existing CDP handlers<br/>Chrome, Lightpanda, Obscura,<br/>--cdp, providers] WD[WebDriver path<br/>Safari / iOS] EX --> GATES --> ROUTE ROUTE -->|no| CDPH ROUTE -->|no, provider ios/safari| WD end ROUTE -->|yes| BA subgraph Bidi["native/bidi/ (BiDi protocol module)"] BA[actions.rs<br/>One handler declaration / Chrome-only errors<br/>dialog guard, dispatch] subgraph Handlers["Handlers (any BiDi browser)"] PAGE[page: navigate, history, waits, content] TABS[tabs: t1..tN ids, new/switch/close] FORMS[forms: fill, type, press, select, check, upload, inserttext] INTER[interact: click, hover, drag, scroll, tap, dialog] QUERY[query: get/is, find/getby*, frame] CAP[capture: screenshot, annotate, pdf] STOR[storage: cookies, storage, state save/load] NET[network: route, HAR, requests, headers, auth, downloads] EMU[emulation: viewport, device, geo, media, offline] SNAP[snapshot: tree + refs] TGT[target: ref / selector resolver] INP[input: key + pointer action builders] STRM[stream: dashboard polling + input] end SESS[session.rs FirefoxSession<br/>active/top context, tab ids,<br/>ref side table i64 to sharedId,<br/>event pump] CLIENT[client.rs BiDi WebSocket client<br/>send, send_typed, events] TYPES[types.rs LocalValue, RemoteValue,<br/>BytesValue, Cookie, events] FF[firefox.rs find, validate, launch<br/>temp profile, prefs, process group] DEVT[firefox_devtools.rs RDP client<br/>accessibility tree, media simulation] BA --> Handlers Handlers --> SESS SESS --> CLIENT CLIENT --- TYPES SESS --> DEVT FF --> SESS end subgraph Shared["Shared with Chrome (reused, not copied)"] JS[Page JS constants<br/>element.rs / interaction.rs] RENDER[Snapshot renderer + RefMap<br/>build_tree / render_tree] POLICY[DomainFilter, route matching,<br/>state format, screenshot/pdf/upload helpers] end FORMS & INTER & QUERY -.-> JS SNAP -.-> RENDER NET & STOR & CAP -.-> POLICY CDPH -.-> JS & RENDER & POLICY subgraph Firefox["Firefox 150+ (owned temp profile)"] RA[Remote Agent<br/>WebDriver BiDi] DS[DevTools server<br/>accessibility actor] end CLIENT <-->|ws://127.0.0.1:random/session| RA DEVT <-->|unix socket in 0700 dir<br/>or loopback port on Windows| DS FF -->|spawn| FirefoxLaunch sequence