| 1 | import { desktopHost } from "../lib/desktopHost"; |
| 2 | export interface ForegroundBrowserTurn { taskId?: string; turnId?: string; sessionId?: string; reveal(): void } |
| 3 | export function observeFirstBrowserOpen(current: () => ForegroundBrowserTurn) { |
| 4 | const browser = desktopHost().browser; |
| 5 | if (!browser) return () => {}; |
| 6 | const seen = new Map<string, string>(); |
| 7 | let closed = false, revision = 0; |
| 8 | let known = new Set<string>(); |
| 9 | const off = browser.onTabs(tabs => { |
| 10 | revision++; |
| 11 | const additions = tabs.filter(tab => !known.has(tab.id)); |
| 12 | known = new Set(tabs.map(tab => tab.id)); |
| 13 | const { taskId, turnId, sessionId, reveal } = current(); |
| 14 | if (!taskId || !turnId || seen.get(taskId) === turnId || !additions.some(tab => tab.taskId === taskId && (!sessionId || !tab.sessionId || tab.sessionId === sessionId))) return; |
| 15 | seen.set(taskId, turnId); reveal(); |
| 16 | }); |
| 17 | const initial = revision; |
| 18 | void browser.list().then(tabs => { if (!closed && initial === revision) known = new Set(tabs.map(tab => tab.id)); }).catch(() => {}); |
| 19 | return () => { closed = true; off(); }; |
| 20 | } |
| 21 |