返回 DeepSeek-Reasonix
browserFirstOpenLifecycle.ts
根目录 / desktop / frontend / src / app-runtime / browserFirstOpenLifecycle.ts
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
21 lines TYPESCRIPT