cdp-mcp-server 5.0.1 → 5.0.3
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 +91 -0
- package/dist/config.js +4 -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/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 +3 -3
- package/dist/connection/index.js +1 -1
- package/dist/connection/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/form.js +150 -150
- package/dist/tools/interact.js +137 -137
- package/dist/tools/tabs.js +3 -3
- package/dist/types.d.ts +4 -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/package.json +17 -13
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# CDP Browser MCP Server
|
|
2
|
+
|
|
3
|
+
Connects AI agents to your **real running Chrome** — your cookies, logins, and
|
|
4
|
+
extensions stay intact. 14 tools / 90+ actions over the Chrome DevTools
|
|
5
|
+
Protocol: navigation, accessibility snapshots, element interaction, smart form
|
|
6
|
+
filling, network interception, device emulation, cookies/storage, and a full
|
|
7
|
+
JS debugger.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g cdp-mcp-server
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or reference it directly in any MCP client (no global install needed):
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"mcpServers": {
|
|
20
|
+
"cdp-browser": {
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["-y", "cdp-mcp-server@latest"]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## One-time Chrome setup
|
|
29
|
+
|
|
30
|
+
Chrome must expose the DevTools protocol. Pick one:
|
|
31
|
+
|
|
32
|
+
1. Open `chrome://flags/#enable-remote-debugging`, set **Enabled**, relaunch
|
|
33
|
+
(persists across restarts — recommended)
|
|
34
|
+
2. Or launch Chrome with the flag:
|
|
35
|
+
`chrome.exe --remote-debugging-port=9222`
|
|
36
|
+
|
|
37
|
+
Verify it works: open `http://localhost:9222/json/version` — you should see
|
|
38
|
+
JSON output.
|
|
39
|
+
|
|
40
|
+
The server auto-connects to Chrome on your first tool call. Edge and Brave
|
|
41
|
+
work the same way (same protocol).
|
|
42
|
+
|
|
43
|
+
## Troubleshooting
|
|
44
|
+
|
|
45
|
+
Connect errors name the exact failure mode and print the exact fix:
|
|
46
|
+
|
|
47
|
+
- `no browser with debugging enabled` — nothing listening on any debug port,
|
|
48
|
+
no browser processes found: launch with `--remote-debugging-port=9222`
|
|
49
|
+
plus an explicit `--user-data-dir`
|
|
50
|
+
- Browser running but launched without the flag — same guidance; Chrome/Brave
|
|
51
|
+
153+ can instead enable `chrome://inspect/#remote-debugging`
|
|
52
|
+
("Allow remote debugging for this browser instance")
|
|
53
|
+
- Port bound but `/json/version` returns 404 — gated remote-debugging is
|
|
54
|
+
active: click **Allow** on Chrome's permission dialog when the server
|
|
55
|
+
connects (needs a visible browser window), or relaunch with the flag +
|
|
56
|
+
explicit non-default `--user-data-dir`
|
|
57
|
+
- Flag given but connection refused (Chrome 136+ default-profile restriction)
|
|
58
|
+
— pair `--remote-debugging-port` with an explicit **non-default**
|
|
59
|
+
`--user-data-dir` (Chrome for Testing exempt)
|
|
60
|
+
|
|
61
|
+
Discovery scans running browser processes' command lines for the port and
|
|
62
|
+
profile directory (portable/custom installs need zero configuration; full
|
|
63
|
+
command lines are never logged — disable with `CDP_PROCESS_SCAN=false`), and
|
|
64
|
+
can connect via the `chrome://inspect` toggle by reading `DevToolsActivePort`.
|
|
65
|
+
`ping`/`status` report the connection mode (`legacy` | `approval`).
|
|
66
|
+
|
|
67
|
+
## Environment variables
|
|
68
|
+
|
|
69
|
+
| Variable | Default | Description |
|
|
70
|
+
|----------|---------|-------------|
|
|
71
|
+
| `CDP_PROCESS_SCAN` | `true` | Scan running browser processes' command lines for `--user-data-dir` / `--remote-debugging-port` |
|
|
72
|
+
| `CDP_USER_DATA` | — | Extra User Data directory checked first during discovery |
|
|
73
|
+
|
|
74
|
+
## Highlights
|
|
75
|
+
|
|
76
|
+
- Stable element refs that survive DOM changes
|
|
77
|
+
- Smart form filling (React/Greenhouse comboboxes, country codes, dates)
|
|
78
|
+
- Auto-waiting after every action (no "click and pray")
|
|
79
|
+
- Token-optimized accessibility snapshots (~15KB)
|
|
80
|
+
- Multi-agent safe: per-agent session isolation + exclusive tab locks
|
|
81
|
+
- Network mocking via request interception
|
|
82
|
+
- Playwright-compatible slim mode for small-context models
|
|
83
|
+
|
|
84
|
+
## Documentation
|
|
85
|
+
|
|
86
|
+
Full tool reference, environment variables, and guides:
|
|
87
|
+
https://github.com/Tushar49/cdp-browser-mcp#readme
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT
|
package/dist/config.js
CHANGED
|
@@ -29,6 +29,10 @@ export function loadConfig() {
|
|
|
29
29
|
maxTempFiles: 50,
|
|
30
30
|
maxTempAgeMs: 30 * 60 * 1000, // 30 minutes
|
|
31
31
|
autoConnectProfile: process.env.CDP_PROFILE || '',
|
|
32
|
+
/** Extra User Data dir checked first during discovery (CDP_USER_DATA). */
|
|
33
|
+
userDataDir: process.env.CDP_USER_DATA || '',
|
|
34
|
+
/** Process command-line scan on discovery failure (default ON). */
|
|
35
|
+
processScan: process.env.CDP_PROCESS_SCAN !== 'false',
|
|
32
36
|
slimMode: process.env.CDP_SLIM_MODE === 'true',
|
|
33
37
|
};
|
|
34
38
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,WAAW;QAC5C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;QAErD,kBAAkB;QAClB,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC;QACtE,iBAAiB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9E,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC;QAC1E,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC;QAE/D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,QAAQ,EAAE,EAAE,CAAC;QACjE,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC;QAE1E,mEAAmE;QACnE,sBAAsB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAwC,IAAI,QAAQ;QAEnE,YAAY,EAAE,MAAM;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,sBAAsB;QAC/D,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;QAE3C,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;QAEjD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM;KAC/C,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,WAAW;QAC5C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;QAErD,kBAAkB;QAClB,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,EAAE,EAAE,CAAC;QACtE,iBAAiB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9E,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC;QAC1E,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC;QAE/D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,QAAQ,EAAE,EAAE,CAAC;QACjE,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,EAAE,EAAE,CAAC;QAE1E,mEAAmE;QACnE,sBAAsB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAwC,IAAI,QAAQ;QAEnE,YAAY,EAAE,MAAM;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,sBAAsB;QAC/D,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;QAE3C,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;QAEjD,0EAA0E;QAC1E,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;QAE5C,mEAAmE;QACnE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO;QAErD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -23,22 +23,59 @@ export type { BrowserInstance, ProfileInfo };
|
|
|
23
23
|
export declare function discoverBrowserInstances(opts?: DiscoverOptions): BrowserInstance[];
|
|
24
24
|
/**
|
|
25
25
|
* Resolve the WebSocket URL by scanning known User Data directories
|
|
26
|
-
* for a DevToolsActivePort file. Falls back to
|
|
27
|
-
*
|
|
26
|
+
* for a DevToolsActivePort file. Falls back to constructing a URL
|
|
27
|
+
* (caller should try /json/version at runtime) (P0-3).
|
|
28
28
|
*
|
|
29
29
|
* @param overrideDir User Data dir override (e.g. from `browser.connect`)
|
|
30
|
+
* @param extraPaths Additional dirs to check first (CDP_USER_DATA,
|
|
31
|
+
* process-scan results — configured upstream)
|
|
30
32
|
* @param fallbackHost Default host (from config)
|
|
31
33
|
* @param fallbackPort Default port (from config)
|
|
32
34
|
*/
|
|
33
|
-
export declare function resolveWsUrl(overrideDir: string | null, fallbackHost: string, fallbackPort: number): WsUrlResult;
|
|
35
|
+
export declare function resolveWsUrl(overrideDir: string | null, extraPaths: string[], fallbackHost: string, fallbackPort: number): WsUrlResult;
|
|
34
36
|
/**
|
|
35
37
|
* Async variant that queries /json/version when file-based discovery fails.
|
|
36
38
|
* P0-3 fix: Uses the HTTP endpoint to get the correct WebSocket URL
|
|
37
39
|
* instead of guessing.
|
|
38
40
|
*/
|
|
39
|
-
export declare function resolveWsUrlAsync(overrideDir: string | null, fallbackHost: string, fallbackPort: number): Promise<WsUrlResult>;
|
|
41
|
+
export declare function resolveWsUrlAsync(overrideDir: string | null, extraPaths: string[], fallbackHost: string, fallbackPort: number): Promise<WsUrlResult>;
|
|
40
42
|
/**
|
|
41
43
|
* Find the best matching instance given user input (name, port, or path).
|
|
42
44
|
* Returns null if no match is found.
|
|
43
45
|
*/
|
|
44
46
|
export declare function findBestInstance(instances: BrowserInstance[], input: string): BrowserInstance | null;
|
|
47
|
+
export interface CommandLineInfo {
|
|
48
|
+
/** Recognized browser basename (e.g. 'brave'), if the line is a browser. */
|
|
49
|
+
browserName?: string;
|
|
50
|
+
/** Extracted --user-data-dir value, if present. */
|
|
51
|
+
userDataDir?: string;
|
|
52
|
+
/** Extracted --remote-debugging-port value, if present. */
|
|
53
|
+
port?: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ProcessScanResult {
|
|
56
|
+
/** Discovered User Data dirs (deduped, order-stable). */
|
|
57
|
+
userDataDirs: string[];
|
|
58
|
+
/** Discovered debug ports (deduped). */
|
|
59
|
+
ports: number[];
|
|
60
|
+
/** Recognized browser basenames seen running (deduped). */
|
|
61
|
+
browsersRunning: string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse one process command line. Extracts ONLY the two flags we need —
|
|
65
|
+
* full command lines are never returned or logged (privacy rule).
|
|
66
|
+
*/
|
|
67
|
+
export declare function parseBrowserCommandLine(cmd: string): CommandLineInfo;
|
|
68
|
+
type ProcessRunner = (file: string, args: string[], timeoutMs: number) => Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Scan running Chromium-family browser processes for their launch flags.
|
|
71
|
+
* Read-only, same-user, non-elevated. Returns ONLY extracted fields —
|
|
72
|
+
* never raw command lines (privacy rule).
|
|
73
|
+
*
|
|
74
|
+
* Controlled by `CDP_PROCESS_SCAN` (default ON, `false` disables) —
|
|
75
|
+
* enforced by the caller.
|
|
76
|
+
*/
|
|
77
|
+
export declare function scanBrowserProcesses(opts?: {
|
|
78
|
+
timeoutMs?: number;
|
|
79
|
+
runner?: ProcessRunner;
|
|
80
|
+
os?: string;
|
|
81
|
+
}): Promise<ProcessScanResult>;
|
|
@@ -4,14 +4,16 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Extracted from `discoverChromeInstances` and `getWsUrl` in server.js.
|
|
6
6
|
*/
|
|
7
|
+
import { execFile } from 'child_process';
|
|
7
8
|
import { readFileSync } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
+
import { join, basename } from 'path';
|
|
9
10
|
import { platform, homedir } from 'os';
|
|
10
11
|
function getBrowserCandidates() {
|
|
11
12
|
const os = platform();
|
|
12
13
|
const home = homedir();
|
|
13
14
|
if (os === 'win32') {
|
|
14
15
|
const local = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');
|
|
16
|
+
const roaming = process.env.APPDATA || join(home, 'AppData', 'Roaming');
|
|
15
17
|
return [
|
|
16
18
|
{ name: 'Chrome', path: join(local, 'Google', 'Chrome', 'User Data') },
|
|
17
19
|
{ name: 'Chrome Beta', path: join(local, 'Google', 'Chrome Beta', 'User Data') },
|
|
@@ -19,6 +21,8 @@ function getBrowserCandidates() {
|
|
|
19
21
|
{ name: 'Chromium', path: join(local, 'Chromium', 'User Data') },
|
|
20
22
|
{ name: 'Edge', path: join(local, 'Microsoft', 'Edge', 'User Data') },
|
|
21
23
|
{ name: 'Brave', path: join(local, 'BraveSoftware', 'Brave-Browser', 'User Data') },
|
|
24
|
+
{ name: 'Vivaldi', path: join(local, 'Vivaldi', 'User Data') },
|
|
25
|
+
{ name: 'Opera', path: join(roaming, 'Opera Software', 'Opera Stable') },
|
|
22
26
|
];
|
|
23
27
|
}
|
|
24
28
|
else if (os === 'darwin') {
|
|
@@ -29,6 +33,8 @@ function getBrowserCandidates() {
|
|
|
29
33
|
{ name: 'Chromium', path: join(appSupport, 'Chromium') },
|
|
30
34
|
{ name: 'Edge', path: join(appSupport, 'Microsoft Edge') },
|
|
31
35
|
{ name: 'Brave', path: join(appSupport, 'BraveSoftware', 'Brave-Browser') },
|
|
36
|
+
{ name: 'Vivaldi', path: join(appSupport, 'Vivaldi') },
|
|
37
|
+
{ name: 'Opera', path: join(appSupport, 'com.operasoftware.Opera') },
|
|
32
38
|
];
|
|
33
39
|
}
|
|
34
40
|
else {
|
|
@@ -38,6 +44,8 @@ function getBrowserCandidates() {
|
|
|
38
44
|
{ name: 'Chromium', path: join(home, '.config', 'chromium') },
|
|
39
45
|
{ name: 'Edge', path: join(home, '.config', 'microsoft-edge') },
|
|
40
46
|
{ name: 'Brave', path: join(home, '.config', 'BraveSoftware', 'Brave-Browser') },
|
|
47
|
+
{ name: 'Vivaldi', path: join(home, '.config', 'vivaldi') },
|
|
48
|
+
{ name: 'Opera', path: join(home, '.config', 'opera') },
|
|
41
49
|
];
|
|
42
50
|
}
|
|
43
51
|
}
|
|
@@ -107,19 +115,22 @@ export function discoverBrowserInstances(opts = {}) {
|
|
|
107
115
|
}
|
|
108
116
|
/**
|
|
109
117
|
* Resolve the WebSocket URL by scanning known User Data directories
|
|
110
|
-
* for a DevToolsActivePort file. Falls back to
|
|
111
|
-
*
|
|
118
|
+
* for a DevToolsActivePort file. Falls back to constructing a URL
|
|
119
|
+
* (caller should try /json/version at runtime) (P0-3).
|
|
112
120
|
*
|
|
113
121
|
* @param overrideDir User Data dir override (e.g. from `browser.connect`)
|
|
122
|
+
* @param extraPaths Additional dirs to check first (CDP_USER_DATA,
|
|
123
|
+
* process-scan results — configured upstream)
|
|
114
124
|
* @param fallbackHost Default host (from config)
|
|
115
125
|
* @param fallbackPort Default port (from config)
|
|
116
126
|
*/
|
|
117
|
-
export function resolveWsUrl(overrideDir, fallbackHost, fallbackPort) {
|
|
127
|
+
export function resolveWsUrl(overrideDir, extraPaths, fallbackHost, fallbackPort) {
|
|
118
128
|
const extra = [];
|
|
119
129
|
if (overrideDir)
|
|
120
130
|
extra.push(overrideDir);
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
for (const p of extraPaths)
|
|
132
|
+
if (p)
|
|
133
|
+
extra.push(p);
|
|
123
134
|
const candidates = getCandidates(extra);
|
|
124
135
|
for (const { path: udPath } of candidates) {
|
|
125
136
|
const portInfo = readPortFile(udPath);
|
|
@@ -141,9 +152,9 @@ export function resolveWsUrl(overrideDir, fallbackHost, fallbackPort) {
|
|
|
141
152
|
* P0-3 fix: Uses the HTTP endpoint to get the correct WebSocket URL
|
|
142
153
|
* instead of guessing.
|
|
143
154
|
*/
|
|
144
|
-
export async function resolveWsUrlAsync(overrideDir, fallbackHost, fallbackPort) {
|
|
155
|
+
export async function resolveWsUrlAsync(overrideDir, extraPaths, fallbackHost, fallbackPort) {
|
|
145
156
|
// Try synchronous file-based discovery first
|
|
146
|
-
const syncResult = resolveWsUrl(overrideDir, fallbackHost, fallbackPort);
|
|
157
|
+
const syncResult = resolveWsUrl(overrideDir, extraPaths, fallbackHost, fallbackPort);
|
|
147
158
|
if (syncResult.userDataDir)
|
|
148
159
|
return syncResult;
|
|
149
160
|
// File-based discovery failed — try HTTP /json/version endpoint
|
|
@@ -173,4 +184,110 @@ export function findBestInstance(instances, input) {
|
|
|
173
184
|
i.port.toString() === needle ||
|
|
174
185
|
i.userDataDir.toLowerCase() === needle) ?? null);
|
|
175
186
|
}
|
|
187
|
+
// ─── Process Command-Line Scan (5.0.3) ──────────────────────────────
|
|
188
|
+
/** Chromium-family browser executables we recognize (basename, lowercase, no ext). */
|
|
189
|
+
const KNOWN_BROWSERS = [
|
|
190
|
+
'chrome',
|
|
191
|
+
'brave',
|
|
192
|
+
'msedge',
|
|
193
|
+
'chromium',
|
|
194
|
+
'vivaldi',
|
|
195
|
+
'opera',
|
|
196
|
+
];
|
|
197
|
+
/**
|
|
198
|
+
* Parse one process command line. Extracts ONLY the two flags we need —
|
|
199
|
+
* full command lines are never returned or logged (privacy rule).
|
|
200
|
+
*/
|
|
201
|
+
export function parseBrowserCommandLine(cmd) {
|
|
202
|
+
// Executable may be quoted ("C:\Program Files\...\chrome.exe")
|
|
203
|
+
const exeMatch = cmd.match(/^\s*(?:"([^"]+)"|'([^']+)'|(\S+))/);
|
|
204
|
+
const firstToken = (exeMatch
|
|
205
|
+
? exeMatch[1] ?? exeMatch[2] ?? exeMatch[3]
|
|
206
|
+
: '').toLowerCase();
|
|
207
|
+
const base = basename(firstToken).replace(/\.exe$/, '');
|
|
208
|
+
const browserName = KNOWN_BROWSERS.find((n) => base === n || base.startsWith(`${n}-`));
|
|
209
|
+
const info = {};
|
|
210
|
+
if (!browserName)
|
|
211
|
+
return info;
|
|
212
|
+
info.browserName = browserName;
|
|
213
|
+
const dirMatch = cmd.match(/--user-data-dir=(?:"([^"]+)"|'([^']+)'|([^\s]+))/);
|
|
214
|
+
if (dirMatch)
|
|
215
|
+
info.userDataDir = dirMatch[1] ?? dirMatch[2] ?? dirMatch[3];
|
|
216
|
+
const portMatch = cmd.match(/--remote-debugging-port=(\d+)/);
|
|
217
|
+
if (portMatch)
|
|
218
|
+
info.port = parseInt(portMatch[1], 10);
|
|
219
|
+
return info;
|
|
220
|
+
}
|
|
221
|
+
function defaultRunner(file, args, timeoutMs) {
|
|
222
|
+
return new Promise((resolve, reject) => {
|
|
223
|
+
execFile(file, args, { timeout: timeoutMs, windowsHide: true }, (err, stdout) => {
|
|
224
|
+
if (err)
|
|
225
|
+
reject(err);
|
|
226
|
+
else
|
|
227
|
+
resolve(stdout);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
function buildProcessQueryCommand(os) {
|
|
232
|
+
if (os === 'win32') {
|
|
233
|
+
const filter = ["Name='chrome.exe'", "Name='brave.exe'", "Name='msedge.exe'",
|
|
234
|
+
"Name='chromium.exe'", "Name='vivaldi.exe'", "Name='opera.exe'"].join(' OR ');
|
|
235
|
+
return {
|
|
236
|
+
file: 'powershell.exe',
|
|
237
|
+
args: [
|
|
238
|
+
'-NoProfile',
|
|
239
|
+
'-NonInteractive',
|
|
240
|
+
'-Command',
|
|
241
|
+
`Get-CimInstance Win32_Process -Filter "${filter}" | Select-Object -ExpandProperty CommandLine`,
|
|
242
|
+
],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// macOS + Linux: ps is universal enough for same-user processes
|
|
246
|
+
return { file: 'ps', args: ['-axo', 'command'] };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Scan running Chromium-family browser processes for their launch flags.
|
|
250
|
+
* Read-only, same-user, non-elevated. Returns ONLY extracted fields —
|
|
251
|
+
* never raw command lines (privacy rule).
|
|
252
|
+
*
|
|
253
|
+
* Controlled by `CDP_PROCESS_SCAN` (default ON, `false` disables) —
|
|
254
|
+
* enforced by the caller.
|
|
255
|
+
*/
|
|
256
|
+
export async function scanBrowserProcesses(opts = {}) {
|
|
257
|
+
const timeoutMs = opts.timeoutMs ?? 5000;
|
|
258
|
+
const runner = opts.runner ?? defaultRunner;
|
|
259
|
+
const os = opts.os ?? platform();
|
|
260
|
+
const result = {
|
|
261
|
+
userDataDirs: [],
|
|
262
|
+
ports: [],
|
|
263
|
+
browsersRunning: [],
|
|
264
|
+
};
|
|
265
|
+
const { file, args } = buildProcessQueryCommand(os);
|
|
266
|
+
let stdout;
|
|
267
|
+
try {
|
|
268
|
+
stdout = await runner(file, args, timeoutMs);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return result; // non-fatal: scan is best-effort
|
|
272
|
+
}
|
|
273
|
+
const dirs = new Set();
|
|
274
|
+
const ports = new Set();
|
|
275
|
+
const names = new Set();
|
|
276
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
277
|
+
if (!line.trim())
|
|
278
|
+
continue;
|
|
279
|
+
const info = parseBrowserCommandLine(line);
|
|
280
|
+
if (!info.browserName)
|
|
281
|
+
continue;
|
|
282
|
+
names.add(info.browserName);
|
|
283
|
+
if (info.userDataDir)
|
|
284
|
+
dirs.add(info.userDataDir);
|
|
285
|
+
if (info.port !== undefined)
|
|
286
|
+
ports.add(info.port);
|
|
287
|
+
}
|
|
288
|
+
result.userDataDirs = [...dirs];
|
|
289
|
+
result.ports = [...ports];
|
|
290
|
+
result.browsersRunning = [...names];
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
176
293
|
//# sourceMappingURL=browser-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-discovery.js","sourceRoot":"","sources":["../../src/connection/browser-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-discovery.js","sourceRoot":"","sources":["../../src/connection/browser-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* 3. Lazy auto-connect on first tool call (Fix 8)
|
|
8
8
|
*/
|
|
9
9
|
import type { CDPClient } from './cdp-client.js';
|
|
10
|
+
import { discoverBrowserInstances, scanBrowserProcesses } from './browser-discovery.js';
|
|
10
11
|
export type HealthStatus = 'disconnected' | 'connected' | 'unhealthy' | 'dead' | 'error';
|
|
11
12
|
export interface HealthState {
|
|
12
13
|
status: HealthStatus;
|
|
@@ -33,7 +34,16 @@ export interface HealthMonitorOptions {
|
|
|
33
34
|
overrideUserDataDir?: string | null;
|
|
34
35
|
/** Preferred Chrome profile for auto-connect (from CDP_PROFILE env). */
|
|
35
36
|
preferredProfile?: string;
|
|
37
|
+
/** Extra User Data dirs to check first (CDP_USER_DATA). */
|
|
38
|
+
extraUserDataDirs?: string[];
|
|
39
|
+
/** Process command-line scan on discovery failure (CDP_PROCESS_SCAN, default true). */
|
|
40
|
+
processScan?: boolean;
|
|
41
|
+
/** Injected process scanner (tests). Defaults to scanBrowserProcesses. */
|
|
42
|
+
scanFn?: typeof scanBrowserProcesses;
|
|
43
|
+
/** Injected instance discovery (tests). Defaults to discoverBrowserInstances. */
|
|
44
|
+
discoverFn?: typeof discoverBrowserInstances;
|
|
36
45
|
}
|
|
46
|
+
export type ConnectionMode = 'legacy' | 'approval' | 'unknown';
|
|
37
47
|
export declare class HealthMonitor {
|
|
38
48
|
private client;
|
|
39
49
|
private timer;
|
|
@@ -43,6 +53,8 @@ export declare class HealthMonitor {
|
|
|
43
53
|
private lastGoodWsUrl;
|
|
44
54
|
/** When true, onDisconnect() skips auto-reconnect (P1-4: browser.connect race). */
|
|
45
55
|
suppressAutoReconnect: boolean;
|
|
56
|
+
/** How the current connection was established (5.0.3). */
|
|
57
|
+
connectionMode: ConnectionMode;
|
|
46
58
|
private pingIntervalMs;
|
|
47
59
|
private pongTimeoutMs;
|
|
48
60
|
private maxMissedPongs;
|
|
@@ -52,6 +64,10 @@ export declare class HealthMonitor {
|
|
|
52
64
|
private cdpPort;
|
|
53
65
|
private overrideUserDataDir;
|
|
54
66
|
private preferredProfile;
|
|
67
|
+
private extraUserDataDirs;
|
|
68
|
+
private processScan;
|
|
69
|
+
private scanFn;
|
|
70
|
+
private discoverFn;
|
|
55
71
|
readonly health: HealthState;
|
|
56
72
|
constructor(client: CDPClient, opts?: HealthMonitorOptions);
|
|
57
73
|
/** Start the periodic health-check timer. */
|
|
@@ -75,6 +91,12 @@ export declare class HealthMonitor {
|
|
|
75
91
|
autoConnect(): Promise<void>;
|
|
76
92
|
/** Internal auto-connect implementation. */
|
|
77
93
|
private _doAutoConnect;
|
|
94
|
+
/**
|
|
95
|
+
* After a successful connect via the file-based path, detect whether the
|
|
96
|
+
* browser is a legacy CDP server or the gated/approval-mode server by
|
|
97
|
+
* probing /json/version (which only legacy servers answer).
|
|
98
|
+
*/
|
|
99
|
+
private _detectMode;
|
|
78
100
|
/** Update the override directory (e.g. after `browser.connect`). */
|
|
79
101
|
setOverrideUserDataDir(dir: string | null): void;
|
|
80
102
|
private _ping;
|