cdp-mcp-server 5.0.2 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/connection/browser-discovery.d.ts +41 -4
- package/dist/connection/browser-discovery.js +125 -8
- package/dist/connection/browser-discovery.js.map +1 -1
- package/dist/connection/capabilities.d.ts +58 -0
- package/dist/connection/capabilities.js +126 -0
- package/dist/connection/capabilities.js.map +1 -0
- package/dist/connection/health-monitor.d.ts +22 -0
- package/dist/connection/health-monitor.js +155 -28
- package/dist/connection/health-monitor.js.map +1 -1
- package/dist/connection/index.d.ts +4 -3
- package/dist/connection/index.js +2 -1
- package/dist/connection/index.js.map +1 -1
- package/dist/connection/tab-session-service.d.ts +12 -2
- package/dist/connection/tab-session-service.js +48 -14
- package/dist/connection/tab-session-service.js.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/snapshot/accessibility.d.ts +2 -0
- package/dist/snapshot/accessibility.js +1 -1
- package/dist/snapshot/accessibility.js.map +1 -1
- package/dist/tools/device-presets.d.ts +24 -0
- package/dist/tools/device-presets.js +62 -0
- package/dist/tools/device-presets.js.map +1 -0
- package/dist/tools/emulate.js +79 -0
- package/dist/tools/emulate.js.map +1 -1
- package/dist/tools/interact.js +191 -31
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/observe.js +201 -27
- package/dist/tools/observe.js.map +1 -1
- package/dist/tools/page.d.ts +52 -1
- package/dist/tools/page.js +242 -25
- package/dist/tools/page.js.map +1 -1
- package/dist/tools/storage.d.ts +1 -1
- package/dist/tools/storage.js +115 -3
- package/dist/tools/storage.js.map +1 -1
- package/dist/tools/tabs.js +4 -2
- package/dist/tools/tabs.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/utils/actionability.d.ts +62 -0
- package/dist/utils/actionability.js +190 -0
- package/dist/utils/actionability.js.map +1 -0
- package/dist/utils/connect-diagnostics.d.ts +46 -0
- package/dist/utils/connect-diagnostics.js +124 -0
- package/dist/utils/connect-diagnostics.js.map +1 -0
- package/dist/utils/wait.d.ts +0 -25
- package/dist/utils/wait.js +0 -76
- package/dist/utils/wait.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils/retry.d.ts +0 -40
- package/dist/utils/retry.js +0 -75
- package/dist/utils/retry.js.map +0 -1
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* 3. Lazy auto-connect on first tool call (Fix 8)
|
|
8
8
|
*/
|
|
9
9
|
import WebSocket from 'ws';
|
|
10
|
-
import { discoverBrowserInstances, resolveWsUrlAsync, findBestInstance, } from './browser-discovery.js';
|
|
10
|
+
import { discoverBrowserInstances, resolveWsUrlAsync, findBestInstance, scanBrowserProcesses, } from './browser-discovery.js';
|
|
11
11
|
import { ActionableError } from '../utils/error-handler.js';
|
|
12
|
-
|
|
12
|
+
import { classifyConnectFailure, } from '../utils/connect-diagnostics.js';
|
|
13
13
|
export class HealthMonitor {
|
|
14
14
|
client;
|
|
15
15
|
timer = null;
|
|
@@ -19,6 +19,8 @@ export class HealthMonitor {
|
|
|
19
19
|
lastGoodWsUrl = null;
|
|
20
20
|
/** When true, onDisconnect() skips auto-reconnect (P1-4: browser.connect race). */
|
|
21
21
|
suppressAutoReconnect = false;
|
|
22
|
+
/** How the current connection was established (5.0.3). */
|
|
23
|
+
connectionMode = 'unknown';
|
|
22
24
|
// Options (with defaults)
|
|
23
25
|
pingIntervalMs;
|
|
24
26
|
pongTimeoutMs;
|
|
@@ -29,6 +31,10 @@ export class HealthMonitor {
|
|
|
29
31
|
cdpPort;
|
|
30
32
|
overrideUserDataDir;
|
|
31
33
|
preferredProfile;
|
|
34
|
+
extraUserDataDirs;
|
|
35
|
+
processScan;
|
|
36
|
+
scanFn;
|
|
37
|
+
discoverFn;
|
|
32
38
|
// Observable health state
|
|
33
39
|
health = {
|
|
34
40
|
status: 'disconnected',
|
|
@@ -47,6 +53,10 @@ export class HealthMonitor {
|
|
|
47
53
|
this.cdpPort = opts.cdpPort ?? 9222;
|
|
48
54
|
this.overrideUserDataDir = opts.overrideUserDataDir ?? null;
|
|
49
55
|
this.preferredProfile = opts.preferredProfile ?? '';
|
|
56
|
+
this.extraUserDataDirs = opts.extraUserDataDirs ?? [];
|
|
57
|
+
this.processScan = opts.processScan ?? true;
|
|
58
|
+
this.scanFn = opts.scanFn ?? scanBrowserProcesses;
|
|
59
|
+
this.discoverFn = opts.discoverFn ?? discoverBrowserInstances;
|
|
50
60
|
}
|
|
51
61
|
// ── Lifecycle ───────────────────────────────────────────────────
|
|
52
62
|
/** Start the periodic health-check timer. */
|
|
@@ -86,7 +96,7 @@ export class HealthMonitor {
|
|
|
86
96
|
const delay = this.reconnectBaseDelayMs * Math.pow(2, this.reconnectAttempts - 1);
|
|
87
97
|
await this._sleep(delay);
|
|
88
98
|
try {
|
|
89
|
-
const { wsUrl } = await resolveWsUrlAsync(this.overrideUserDataDir, this.cdpHost, this.cdpPort);
|
|
99
|
+
const { wsUrl } = await resolveWsUrlAsync(this.overrideUserDataDir, this.extraUserDataDirs, this.cdpHost, this.cdpPort);
|
|
90
100
|
await this.client.connect(wsUrl);
|
|
91
101
|
this.lastGoodWsUrl = wsUrl;
|
|
92
102
|
this.onConnected();
|
|
@@ -120,14 +130,21 @@ export class HealthMonitor {
|
|
|
120
130
|
}
|
|
121
131
|
/** Internal auto-connect implementation. */
|
|
122
132
|
async _doAutoConnect() {
|
|
133
|
+
const probes = [];
|
|
134
|
+
const connectErrors = [];
|
|
135
|
+
let portFilesFound = 0;
|
|
136
|
+
let scan = null;
|
|
123
137
|
// Strategy 1: Try last known good connection
|
|
124
138
|
if (this.lastGoodWsUrl) {
|
|
125
139
|
try {
|
|
126
140
|
await this.client.connect(this.lastGoodWsUrl);
|
|
127
141
|
this.onConnected();
|
|
142
|
+
this.connectionMode = await this._detectMode();
|
|
128
143
|
return;
|
|
129
144
|
}
|
|
130
|
-
catch {
|
|
145
|
+
catch (e) {
|
|
146
|
+
connectErrors.push(errText(e));
|
|
147
|
+
}
|
|
131
148
|
}
|
|
132
149
|
// Strategy 2: Probe common debugging ports via HTTP /json/version
|
|
133
150
|
const COMMON_PORTS = [this.cdpPort, 9222, 9229, 9333, 9515];
|
|
@@ -137,41 +154,145 @@ export class HealthMonitor {
|
|
|
137
154
|
const resp = await fetch(`http://${this.cdpHost}:${port}/json/version`, {
|
|
138
155
|
signal: AbortSignal.timeout(2000),
|
|
139
156
|
});
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
await
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
157
|
+
if (resp.ok) {
|
|
158
|
+
probes.push({ port, outcome: 'ok', status: resp.status });
|
|
159
|
+
const data = (await resp.json());
|
|
160
|
+
if (data.webSocketDebuggerUrl) {
|
|
161
|
+
await this.client.connect(data.webSocketDebuggerUrl);
|
|
162
|
+
this.lastGoodWsUrl = data.webSocketDebuggerUrl;
|
|
163
|
+
this.onConnected();
|
|
164
|
+
this.connectionMode = 'legacy';
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
probes.push({
|
|
170
|
+
port,
|
|
171
|
+
outcome: resp.status === 404 ? 'not_found' : 'error',
|
|
172
|
+
status: resp.status,
|
|
173
|
+
});
|
|
146
174
|
}
|
|
147
175
|
}
|
|
148
|
-
catch {
|
|
149
|
-
|
|
176
|
+
catch (e) {
|
|
177
|
+
probes.push({ port, outcome: 'refused', detail: errText(e) });
|
|
150
178
|
}
|
|
151
179
|
}
|
|
152
|
-
// Strategy 3: File-based discovery (DevToolsActivePort)
|
|
153
|
-
|
|
154
|
-
|
|
180
|
+
// Strategy 3: File-based discovery (DevToolsActivePort). The port file
|
|
181
|
+
// points at /devtools/browser/<uuid> — the same WS endpoint the gated
|
|
182
|
+
// approval-mode server exposes — so a connect here succeeds where HTTP
|
|
183
|
+
// discovery 404s (approval mode), and the user gets a permission dialog.
|
|
184
|
+
const tryFileDiscovery = async (extraDirs) => {
|
|
185
|
+
const instances = this.discoverFn({ extraPaths: extraDirs });
|
|
186
|
+
portFilesFound += instances.length;
|
|
187
|
+
if (instances.length === 0)
|
|
188
|
+
return false;
|
|
155
189
|
const best = this.preferredProfile
|
|
156
190
|
? findBestInstance(instances, this.preferredProfile)
|
|
157
191
|
: instances[0];
|
|
158
|
-
if (best)
|
|
192
|
+
if (!best)
|
|
193
|
+
return false;
|
|
194
|
+
try {
|
|
195
|
+
await this.client.connect(best.wsUrl);
|
|
196
|
+
this.lastGoodWsUrl = best.wsUrl;
|
|
197
|
+
this.overrideUserDataDir = best.userDataDir;
|
|
198
|
+
this.onConnected();
|
|
199
|
+
this.connectionMode = await this._detectMode();
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
connectErrors.push(errText(e));
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
if (await tryFileDiscovery(this.extraUserDataDirs))
|
|
208
|
+
return;
|
|
209
|
+
// Strategy 4: Process command-line scan (default ON) — finds
|
|
210
|
+
// portable/custom browser data dirs and debug ports, then retries the
|
|
211
|
+
// HTTP probe and file discovery with enriched inputs.
|
|
212
|
+
if (this.processScan) {
|
|
213
|
+
scan = await this.scanFn();
|
|
214
|
+
const enrichedPorts = scan.ports.filter((p) => !uniquePorts.includes(p));
|
|
215
|
+
for (const port of enrichedPorts) {
|
|
159
216
|
try {
|
|
160
|
-
await this.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
217
|
+
const resp = await fetch(`http://${this.cdpHost}:${port}/json/version`, {
|
|
218
|
+
signal: AbortSignal.timeout(2000),
|
|
219
|
+
});
|
|
220
|
+
if (resp.ok) {
|
|
221
|
+
probes.push({ port, outcome: 'ok', status: resp.status });
|
|
222
|
+
const data = (await resp.json());
|
|
223
|
+
if (data.webSocketDebuggerUrl) {
|
|
224
|
+
await this.client.connect(data.webSocketDebuggerUrl);
|
|
225
|
+
this.lastGoodWsUrl = data.webSocketDebuggerUrl;
|
|
226
|
+
this.onConnected();
|
|
227
|
+
this.connectionMode = 'legacy';
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
probes.push({
|
|
233
|
+
port,
|
|
234
|
+
outcome: resp.status === 404 ? 'not_found' : 'error',
|
|
235
|
+
status: resp.status,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
165
238
|
}
|
|
166
|
-
catch {
|
|
239
|
+
catch (e) {
|
|
240
|
+
probes.push({ port, outcome: 'refused', detail: errText(e) });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (scan.userDataDirs.length > 0 &&
|
|
244
|
+
(await tryFileDiscovery(scan.userDataDirs))) {
|
|
245
|
+
return;
|
|
167
246
|
}
|
|
168
247
|
}
|
|
169
|
-
// All strategies failed — throw actionable error
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
248
|
+
// All strategies failed — classify and throw an actionable error
|
|
249
|
+
const processInfo = scan
|
|
250
|
+
? {
|
|
251
|
+
browsersRunning: scan.browsersRunning,
|
|
252
|
+
flagPresent: scan.ports.length > 0,
|
|
253
|
+
}
|
|
254
|
+
: null;
|
|
255
|
+
const diagnosis = classifyConnectFailure({
|
|
256
|
+
probes,
|
|
257
|
+
portFilesFound,
|
|
258
|
+
connectErrors,
|
|
259
|
+
processInfo,
|
|
260
|
+
host: this.cdpHost,
|
|
261
|
+
primaryPort: this.cdpPort,
|
|
262
|
+
});
|
|
263
|
+
throw new ActionableError(diagnosis.headline, diagnosis.fix, {
|
|
264
|
+
kind: diagnosis.kind,
|
|
265
|
+
probes,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* After a successful connect via the file-based path, detect whether the
|
|
270
|
+
* browser is a legacy CDP server or the gated/approval-mode server by
|
|
271
|
+
* probing /json/version (which only legacy servers answer).
|
|
272
|
+
*/
|
|
273
|
+
async _detectMode() {
|
|
274
|
+
let host = this.cdpHost;
|
|
275
|
+
let port = this.cdpPort;
|
|
276
|
+
const url = this.client.url;
|
|
277
|
+
if (url) {
|
|
278
|
+
try {
|
|
279
|
+
const parsed = new URL(url);
|
|
280
|
+
host = parsed.hostname || host;
|
|
281
|
+
port = parseInt(parsed.port || String(this.cdpPort), 10);
|
|
282
|
+
}
|
|
283
|
+
catch { /* keep defaults */ }
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
const resp = await fetch(`http://${host}:${port}/json/version`, {
|
|
287
|
+
signal: AbortSignal.timeout(2000),
|
|
288
|
+
});
|
|
289
|
+
return resp.ok ? 'legacy' : 'approval';
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// Legacy servers always answer /json/version; failure + live WS
|
|
293
|
+
// strongly suggests approval mode, but stay honest.
|
|
294
|
+
return 'approval';
|
|
295
|
+
}
|
|
175
296
|
}
|
|
176
297
|
/** Update the override directory (e.g. after `browser.connect`). */
|
|
177
298
|
setOverrideUserDataDir(dir) {
|
|
@@ -216,4 +337,10 @@ export class HealthMonitor {
|
|
|
216
337
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
217
338
|
}
|
|
218
339
|
}
|
|
340
|
+
/** Extract a short error message from an unknown thrown value. */
|
|
341
|
+
function errText(e) {
|
|
342
|
+
if (e instanceof Error)
|
|
343
|
+
return e.message;
|
|
344
|
+
return String(e);
|
|
345
|
+
}
|
|
219
346
|
//# sourceMappingURL=health-monitor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../src/connection/health-monitor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../src/connection/health-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { CDPClient } from './cdp-client.js';
|
|
5
5
|
export type { ConnectionState, CDPClientOptions } from './cdp-client.js';
|
|
6
|
-
export { discoverBrowserInstances, resolveWsUrl, resolveWsUrlAsync, findBestInstance, } from './browser-discovery.js';
|
|
7
|
-
export type { DiscoverOptions, WsUrlResult } from './browser-discovery.js';
|
|
6
|
+
export { discoverBrowserInstances, resolveWsUrl, resolveWsUrlAsync, findBestInstance, parseBrowserCommandLine, scanBrowserProcesses, } from './browser-discovery.js';
|
|
7
|
+
export type { DiscoverOptions, WsUrlResult, CommandLineInfo, ProcessScanResult, } from './browser-discovery.js';
|
|
8
8
|
export { HealthMonitor } from './health-monitor.js';
|
|
9
|
-
export
|
|
9
|
+
export { DomainCapabilities } from './capabilities.js';
|
|
10
|
+
export type { HealthStatus, HealthState, HealthMonitorOptions, ConnectionMode, } from './health-monitor.js';
|
|
10
11
|
export { DomainManager } from './domain-manager.js';
|
|
11
12
|
export { TabSessionService } from './tab-session-service.js';
|
package/dist/connection/index.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Connection module — public surface.
|
|
3
3
|
*/
|
|
4
4
|
export { CDPClient } from './cdp-client.js';
|
|
5
|
-
export { discoverBrowserInstances, resolveWsUrl, resolveWsUrlAsync, findBestInstance, } from './browser-discovery.js';
|
|
5
|
+
export { discoverBrowserInstances, resolveWsUrl, resolveWsUrlAsync, findBestInstance, parseBrowserCommandLine, scanBrowserProcesses, } from './browser-discovery.js';
|
|
6
6
|
export { HealthMonitor } from './health-monitor.js';
|
|
7
|
+
export { DomainCapabilities } from './capabilities.js';
|
|
7
8
|
export { DomainManager } from './domain-manager.js';
|
|
8
9
|
export { TabSessionService } from './tab-session-service.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connection/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connection/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -19,6 +19,10 @@ export declare class TabSessionService {
|
|
|
19
19
|
private childToParent;
|
|
20
20
|
/** uid → childSessionId routing for cross-frame element resolution */
|
|
21
21
|
private refSessionRouting;
|
|
22
|
+
/** CDP sessionId → tabId (reverse lookup for auto-attach event routing) */
|
|
23
|
+
private sessionToTab;
|
|
24
|
+
/** CDP clients already wired for auto-attach event routing */
|
|
25
|
+
private wiredClients;
|
|
22
26
|
/**
|
|
23
27
|
* Get (or create) a CDP session for a tab.
|
|
24
28
|
*
|
|
@@ -32,9 +36,15 @@ export declare class TabSessionService {
|
|
|
32
36
|
*/
|
|
33
37
|
ensureDomain(cdpClient: CDPClient, tabId: string, domain: string): Promise<void>;
|
|
34
38
|
/**
|
|
35
|
-
*
|
|
39
|
+
* Register Target.autoAttach event routing (idempotent per CDP client).
|
|
40
|
+
*
|
|
41
|
+
* `Target.attachedToTarget` events emitted by managed page sessions are
|
|
42
|
+
* translated into child-session registrations (OOP iframes);
|
|
43
|
+
* `Target.detachedFromTarget` prunes them. This is what feeds
|
|
44
|
+
* `captureFullTree`'s multi-frame snapshot and the uid → child-session
|
|
45
|
+
* routing used for cross-frame element interaction.
|
|
36
46
|
*/
|
|
37
|
-
|
|
47
|
+
private wireAutoAttachEvents;
|
|
38
48
|
/** Track a child session (OOP iframe) under a parent session. */
|
|
39
49
|
addChildSession(parentSessionId: string, childTargetId: string, childSessionId: string, url: string): void;
|
|
40
50
|
/** Remove a child session when an OOP iframe detaches. */
|
|
@@ -18,6 +18,10 @@ export class TabSessionService {
|
|
|
18
18
|
childToParent = new Map();
|
|
19
19
|
/** uid → childSessionId routing for cross-frame element resolution */
|
|
20
20
|
refSessionRouting = new Map();
|
|
21
|
+
/** CDP sessionId → tabId (reverse lookup for auto-attach event routing) */
|
|
22
|
+
sessionToTab = new Map();
|
|
23
|
+
/** CDP clients already wired for auto-attach event routing */
|
|
24
|
+
wiredClients = new WeakSet();
|
|
21
25
|
/**
|
|
22
26
|
* Get (or create) a CDP session for a tab.
|
|
23
27
|
*
|
|
@@ -25,21 +29,28 @@ export class TabSessionService {
|
|
|
25
29
|
* Otherwise calls Target.attachToTarget with flatten: true.
|
|
26
30
|
*/
|
|
27
31
|
async getSession(cdpClient, tabId) {
|
|
32
|
+
// Idempotent: register auto-attach event routing before any session can
|
|
33
|
+
// emit Target.attachedToTarget (no missed events on first attach)
|
|
34
|
+
this.wireAutoAttachEvents(cdpClient);
|
|
28
35
|
// Check the CDPClient's own session pool first, then our map
|
|
29
36
|
const pooled = cdpClient.getPooledSession(tabId);
|
|
30
37
|
if (pooled) {
|
|
31
38
|
this.sessions.set(tabId, pooled);
|
|
39
|
+
this.sessionToTab.set(pooled, tabId);
|
|
32
40
|
return pooled;
|
|
33
41
|
}
|
|
34
42
|
const existing = this.sessions.get(tabId);
|
|
35
|
-
if (existing)
|
|
43
|
+
if (existing) {
|
|
44
|
+
this.sessionToTab.set(existing, tabId);
|
|
36
45
|
return existing;
|
|
46
|
+
}
|
|
37
47
|
const result = await cdpClient.send('Target.attachToTarget', {
|
|
38
48
|
targetId: tabId,
|
|
39
49
|
flatten: true,
|
|
40
50
|
});
|
|
41
51
|
const sessionId = result.sessionId;
|
|
42
52
|
this.sessions.set(tabId, sessionId);
|
|
53
|
+
this.sessionToTab.set(sessionId, tabId);
|
|
43
54
|
cdpClient.poolSession(tabId, sessionId);
|
|
44
55
|
// Enable auto-attach for OOP (cross-origin) iframe discovery
|
|
45
56
|
try {
|
|
@@ -72,20 +83,41 @@ export class TabSessionService {
|
|
|
72
83
|
// Domain manager already tracks via ensureDomain if needed externally
|
|
73
84
|
}
|
|
74
85
|
/**
|
|
75
|
-
*
|
|
86
|
+
* Register Target.autoAttach event routing (idempotent per CDP client).
|
|
87
|
+
*
|
|
88
|
+
* `Target.attachedToTarget` events emitted by managed page sessions are
|
|
89
|
+
* translated into child-session registrations (OOP iframes);
|
|
90
|
+
* `Target.detachedFromTarget` prunes them. This is what feeds
|
|
91
|
+
* `captureFullTree`'s multi-frame snapshot and the uid → child-session
|
|
92
|
+
* routing used for cross-frame element interaction.
|
|
76
93
|
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
wireAutoAttachEvents(cdpClient) {
|
|
95
|
+
if (this.wiredClients.has(cdpClient))
|
|
96
|
+
return;
|
|
97
|
+
this.wiredClients.add(cdpClient);
|
|
98
|
+
cdpClient.on('event', (event) => {
|
|
99
|
+
if (event.method === 'Target.attachedToTarget' && event.sessionId) {
|
|
100
|
+
const parentSessionId = event.sessionId;
|
|
101
|
+
// Only page sessions we manage — browser-level / foreign events ignored
|
|
102
|
+
if (!this.sessionToTab.has(parentSessionId))
|
|
103
|
+
return;
|
|
104
|
+
const params = event.params;
|
|
105
|
+
if (!params?.sessionId || !params.targetInfo?.targetId)
|
|
106
|
+
return;
|
|
107
|
+
if (params.targetInfo.type !== 'iframe')
|
|
108
|
+
return;
|
|
109
|
+
this.addChildSession(parentSessionId, params.targetInfo.targetId, params.sessionId, params.targetInfo.url ?? '');
|
|
110
|
+
}
|
|
111
|
+
else if (event.method === 'Target.detachedFromTarget') {
|
|
112
|
+
const params = event.params;
|
|
113
|
+
if (!params?.sessionId)
|
|
114
|
+
return;
|
|
115
|
+
const parentSessionId = this.getParentSession(params.sessionId);
|
|
116
|
+
if (parentSessionId) {
|
|
117
|
+
this.removeChildSession(parentSessionId, params.sessionId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
89
121
|
}
|
|
90
122
|
/** Track a child session (OOP iframe) under a parent session. */
|
|
91
123
|
addChildSession(parentSessionId, childTargetId, childSessionId, url) {
|
|
@@ -148,6 +180,7 @@ export class TabSessionService {
|
|
|
148
180
|
this.childSessions.delete(sessionId);
|
|
149
181
|
}
|
|
150
182
|
this.refSessionRouting.delete(sessionId);
|
|
183
|
+
this.sessionToTab.delete(sessionId);
|
|
151
184
|
cdpClient?.unpoolSession(tabId);
|
|
152
185
|
}
|
|
153
186
|
this.sessions.delete(tabId);
|
|
@@ -167,6 +200,7 @@ export class TabSessionService {
|
|
|
167
200
|
this.childSessions.clear();
|
|
168
201
|
this.childToParent.clear();
|
|
169
202
|
this.refSessionRouting.clear();
|
|
203
|
+
this.sessionToTab.clear();
|
|
170
204
|
}
|
|
171
205
|
/** Iterate over all [tabId, sessionId] pairs. */
|
|
172
206
|
entries() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-session-service.js","sourceRoot":"","sources":["../../src/connection/tab-session-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"tab-session-service.js","sourceRoot":"","sources":["../../src/connection/tab-session-service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -30,6 +30,7 @@ import { SessionManager } from './session/session-manager.js';
|
|
|
30
30
|
import { TabOwnership } from './session/tab-ownership.js';
|
|
31
31
|
import { ModalStateManager } from './session/modal-state.js';
|
|
32
32
|
import { HealthMonitor } from './connection/health-monitor.js';
|
|
33
|
+
import { DomainCapabilities } from './connection/capabilities.js';
|
|
33
34
|
import { SnapshotCache } from './snapshot/cache.js';
|
|
34
35
|
import { ToolRegistry } from './tools/registry.js';
|
|
35
36
|
import { preprocessToolCall } from './tools/dispatch.js';
|
|
@@ -50,7 +51,7 @@ import { registerDebugTools } from './tools/debug.js';
|
|
|
50
51
|
import { registerFormTools } from './tools/form.js';
|
|
51
52
|
import { getSlimTools, mapSlimToFull } from './tools/slim-mode.js';
|
|
52
53
|
// ─── Bootstrap ──────────────────────────────────────────────────────
|
|
53
|
-
const VERSION = '5.0
|
|
54
|
+
const VERSION = '5.1.0';
|
|
54
55
|
const config = loadConfig();
|
|
55
56
|
const cdpClient = new CDPClient({ commandTimeout: config.globalTimeout });
|
|
56
57
|
// Lazy initialization: HealthMonitor is created but doesn't discover browsers
|
|
@@ -58,10 +59,14 @@ const healthMonitor = new HealthMonitor(cdpClient, {
|
|
|
58
59
|
cdpHost: config.cdpHost,
|
|
59
60
|
cdpPort: config.cdpPort,
|
|
60
61
|
preferredProfile: config.autoConnectProfile,
|
|
62
|
+
extraUserDataDirs: config.userDataDir ? [config.userDataDir] : [],
|
|
63
|
+
processScan: config.processScan,
|
|
61
64
|
});
|
|
62
65
|
const domainManager = new DomainManager();
|
|
63
66
|
const tabSessionService = new TabSessionService();
|
|
64
67
|
const snapshotCache = new SnapshotCache();
|
|
68
|
+
// CDP domain capability report (5.1.0 B1) — invalidated on disconnect below
|
|
69
|
+
const capabilities = new DomainCapabilities();
|
|
65
70
|
const registry = new ToolRegistry();
|
|
66
71
|
// Wire auto-reconnect: when the WebSocket drops, let HealthMonitor retry
|
|
67
72
|
// and clear domain state since all sessions are invalidated
|
|
@@ -72,6 +77,7 @@ cdpClient.on('disconnected', () => {
|
|
|
72
77
|
eventPipelineWired = false;
|
|
73
78
|
domainManager.clearAll();
|
|
74
79
|
snapshotCache.clear();
|
|
80
|
+
capabilities.clear();
|
|
75
81
|
tabSessionService.clear();
|
|
76
82
|
healthMonitor.onDisconnect().catch(() => {
|
|
77
83
|
// Reconnect failed — next tool call will trigger autoConnect
|
|
@@ -404,6 +410,7 @@ function wireEventPipeline(serverCtx) {
|
|
|
404
410
|
}
|
|
405
411
|
// ─── Server Context (DI container) ──────────────────────────────────
|
|
406
412
|
const ctx = {
|
|
413
|
+
capabilities,
|
|
407
414
|
config,
|
|
408
415
|
cdpClient,
|
|
409
416
|
healthMonitor,
|
|
@@ -420,6 +427,7 @@ const ctx = {
|
|
|
420
427
|
networkReqs: new Map(),
|
|
421
428
|
downloads: new Map(),
|
|
422
429
|
pendingDialogs: new Map(),
|
|
430
|
+
findState: new Map(),
|
|
423
431
|
pendingFileChoosers: new Map(),
|
|
424
432
|
pausedTabs: new Map(),
|
|
425
433
|
pendingFetchRequests: new Map(),
|
|
@@ -440,11 +448,13 @@ async function ensureConnected() {
|
|
|
440
448
|
}
|
|
441
449
|
}
|
|
442
450
|
// ─── Demo Tools ─────────────────────────────────────────────────────
|
|
451
|
+
const AUTO_CONNECT_HINT = '\nBrowser connects automatically when you use any browser tool — just call tabs.list or page.goto.';
|
|
443
452
|
registry.register(defineTool({
|
|
444
453
|
name: 'ping',
|
|
445
454
|
description: 'Health check. Returns server version and connection status.',
|
|
446
455
|
inputSchema: { type: 'object', properties: {} },
|
|
447
|
-
handler: async () => success(`pong — CDP Browser MCP v${VERSION}\nConnected: ${cdpClient.isConnected}`
|
|
456
|
+
handler: async () => success(`pong — CDP Browser MCP v${VERSION}\nConnected: ${cdpClient.isConnected}` +
|
|
457
|
+
(cdpClient.isConnected ? `\nMode: ${healthMonitor.connectionMode}` : AUTO_CONNECT_HINT)),
|
|
448
458
|
}));
|
|
449
459
|
registry.register(defineTool({
|
|
450
460
|
name: 'status',
|
|
@@ -454,11 +464,43 @@ registry.register(defineTool({
|
|
|
454
464
|
const lines = [
|
|
455
465
|
`## CDP Browser MCP Server v${VERSION}`,
|
|
456
466
|
`Connected: ${cdpClient.isConnected}`,
|
|
467
|
+
...(cdpClient.isConnected
|
|
468
|
+
? [`Connection mode: ${healthMonitor.connectionMode}`]
|
|
469
|
+
: [AUTO_CONNECT_HINT.trim()]),
|
|
470
|
+
`Process scan: ${config.processScan ? 'on' : 'off'}`,
|
|
457
471
|
`Default timeout: ${config.globalTimeout}ms`,
|
|
458
472
|
`Default cleanup: ${config.defaultCleanupStrategy}`,
|
|
459
473
|
`Session TTL: ${config.sessionTTL}ms`,
|
|
460
474
|
`Registered tools: ${registry.size}`,
|
|
461
475
|
];
|
|
476
|
+
if (cdpClient.isConnected) {
|
|
477
|
+
try {
|
|
478
|
+
// Probe through a managed page session - the browser-level endpoint
|
|
479
|
+
// only serves browser-wide domains, so page-scoped domains (Overlay,
|
|
480
|
+
// FindInPage, Ads, ...) report "wasn't found" without one.
|
|
481
|
+
let firstSession = tabSessionService.entries().next().value?.[1];
|
|
482
|
+
if (!firstSession) {
|
|
483
|
+
// No managed tab yet - attach to any open page tab just for probing
|
|
484
|
+
// (canaries are read-only or validation-rejected; attaching is inert)
|
|
485
|
+
try {
|
|
486
|
+
const { targetInfos } = (await cdpClient.send('Target.getTargets', {}));
|
|
487
|
+
const pageTarget = targetInfos?.find((t) => t.type === 'page');
|
|
488
|
+
if (pageTarget) {
|
|
489
|
+
firstSession = (await tabSessionService.getSession(cdpClient, pageTarget.targetId));
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
catch { /* fall back to browser-level probe */ }
|
|
493
|
+
}
|
|
494
|
+
const { count, missing } = await capabilities.summarize(cdpClient, firstSession);
|
|
495
|
+
lines.push(`CDP features (probed${firstSession ? ' on page session' : ' browser-level - no page session'}): ${count}/${count + missing.length}`);
|
|
496
|
+
if (missing.length > 0) {
|
|
497
|
+
lines.push(`Notable domains missing: ${missing.join(', ')}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch (e) {
|
|
501
|
+
lines.push('CDP features: unavailable (' + (e instanceof Error ? e.message : String(e)) + ')');
|
|
502
|
+
}
|
|
503
|
+
}
|
|
462
504
|
return success(lines.join('\n'));
|
|
463
505
|
},
|
|
464
506
|
}));
|
|
@@ -484,7 +526,7 @@ if (config.slimMode) {
|
|
|
484
526
|
registerFormTools(registry, ctx);
|
|
485
527
|
}
|
|
486
528
|
else {
|
|
487
|
-
// Full mode: all
|
|
529
|
+
// Full mode: all 14 tools
|
|
488
530
|
registerTabsTools(registry, ctx);
|
|
489
531
|
registerPageTools(registry, ctx);
|
|
490
532
|
registerInteractTools(registry, ctx);
|
|
@@ -499,7 +541,12 @@ else {
|
|
|
499
541
|
registerFormTools(registry, ctx);
|
|
500
542
|
}
|
|
501
543
|
// ─── MCP Server─────────────────────────────────────────────────────
|
|
502
|
-
const server = new Server({ name: 'cdp-browser', version: VERSION }, {
|
|
544
|
+
const server = new Server({ name: 'cdp-browser', version: VERSION }, {
|
|
545
|
+
capabilities: { tools: {} },
|
|
546
|
+
instructions: `CDP Browser MCP attaches your REAL running browser (cookies, logins, extensions stay). 14 tools: tabs, page, interact, form, execute, observe, emulate, storage, intercept, debug, browser, cleanup, ping, status. The browser connects automatically on the first browser-tool call - ping/status may say Connected: false before that; just call any browser tool.
|
|
547
|
+
|
|
548
|
+
CALLING CONVENTION (critical): every tool is ONE tool with an action enum parameter - there are NO per-action subtools. Call like tools["cdp-browser"].tabs({ action: "list" }), tools["cdp-browser"].page({ action: "goto", tabId, url }), tools["cdp-browser"].interact({ action: "click", tabId, uid }). WRONG: tabs.list(), tabs(), page.goto(url) - these tool names do not exist and fail schema validation. If unsure of an action or parameter, read the tool's description/enum first; tabs without action defaults to listing. Two connection modes: launch flag (--remote-debugging-port + explicit --user-data-dir) or the browser built-in chrome://inspect/#remote-debugging toggle (a permission dialog appears - click Allow).`,
|
|
549
|
+
});
|
|
503
550
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
504
551
|
tools: config.slimMode
|
|
505
552
|
? registry.list().filter(t => t.name.startsWith('browser_') || t.name === 'ping' || t.name === 'status')
|