diff --git a/cli/src/native/actions.rs b/cli/src/native/actions.rs index 00b046d..3d50fdf 100644 --- a/cli/src/native/actions.rs +++ b/cli/src/native/actions.rs @@ -672,7 +672,10 @@ impl DaemonState { } let tab_id = mgr.assign_tab_id(); - mgr.add_page(super::browser::PageInfo { + // Passively discovered (event-driven) — must NOT steal the + // active tab, or a foreign/user/other-session tab opening + // hijacks this session's eval/screenshot target. + mgr.add_background_page(super::browser::PageInfo { tab_id, label: None, target_id: te.target_info.target_id.clone(), diff --git a/cli/src/native/browser.rs b/cli/src/native/browser.rs index 6cfc72b..b27c90a 100644 --- a/cli/src/native/browser.rs +++ b/cli/src/native/browser.rs @@ -1532,6 +1532,21 @@ impl BrowserManager { self.active_page_index = index; } + /// Add a passively-discovered page WITHOUT changing the active tab. + /// + /// On a shared browser (ab-connect), `Target.targetCreated` events stream in + /// for tabs the user or OTHER agent sessions open. Those are drained on every + /// command; routing them through `add_page` made the active tab silently jump + /// to a foreign tab, so the session's own `eval`/`get title`/`screenshot` + /// landed on the wrong page. Passively-tracked pages must not steal focus — + /// only explicit opens (`tab new`, switch) set the active tab. + pub fn add_background_page(&mut self, page: PageInfo) { + if self.pages.iter().any(|p| p.target_id == page.target_id) { + return; + } + self.pages.push(page); + } + pub fn update_page_target_info(&mut self, target: &TargetInfo) -> bool { update_page_target_info_in_pages(&mut self.pages, target) }