@everydaydevopsio/pilot 0.5.2 → 0.6.1
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/.mcp.json +9 -0
- package/AGENTS.md +9 -0
- package/CHANGELOG.md +64 -0
- package/CLAUDE.md +7 -7
- package/README.md +282 -69
- package/dist/browser/browser-manager.d.ts +60 -0
- package/dist/browser/browser-manager.d.ts.map +1 -0
- package/dist/browser/browser-manager.js +355 -0
- package/dist/browser/browser-manager.js.map +1 -0
- package/dist/browser/chrome-launcher.d.ts +31 -0
- package/dist/browser/chrome-launcher.d.ts.map +1 -0
- package/dist/browser/chrome-launcher.js +225 -0
- package/dist/browser/chrome-launcher.js.map +1 -0
- package/dist/browser/connection.d.ts +23 -0
- package/dist/browser/connection.d.ts.map +1 -0
- package/dist/browser/connection.js +53 -0
- package/dist/browser/connection.js.map +1 -0
- package/dist/browser/events.d.ts +9 -0
- package/dist/browser/events.d.ts.map +1 -0
- package/dist/browser/events.js +99 -0
- package/dist/browser/events.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/inspect/element-ref.d.ts +23 -0
- package/dist/browser/inspect/element-ref.d.ts.map +1 -0
- package/dist/browser/inspect/element-ref.js +52 -0
- package/dist/browser/inspect/element-ref.js.map +1 -0
- package/dist/browser/inspect/snapshot.d.ts +11 -0
- package/dist/browser/inspect/snapshot.d.ts.map +1 -0
- package/dist/browser/inspect/snapshot.js +282 -0
- package/dist/browser/inspect/snapshot.js.map +1 -0
- package/dist/browser/inspect/styles.d.ts +45 -0
- package/dist/browser/inspect/styles.d.ts.map +1 -0
- package/dist/browser/inspect/styles.js +190 -0
- package/dist/browser/inspect/styles.js.map +1 -0
- package/dist/browser/inspect/types.d.ts +35 -0
- package/dist/browser/inspect/types.d.ts.map +1 -0
- package/dist/browser/inspect/types.js +2 -0
- package/dist/browser/inspect/types.js.map +1 -0
- package/dist/browser/interaction/dialogs.d.ts +18 -0
- package/dist/browser/interaction/dialogs.d.ts.map +1 -0
- package/dist/browser/interaction/dialogs.js +35 -0
- package/dist/browser/interaction/dialogs.js.map +1 -0
- package/dist/browser/interaction/downloads.d.ts +23 -0
- package/dist/browser/interaction/downloads.d.ts.map +1 -0
- package/dist/browser/interaction/downloads.js +87 -0
- package/dist/browser/interaction/downloads.js.map +1 -0
- package/dist/browser/interaction/events.d.ts +17 -0
- package/dist/browser/interaction/events.d.ts.map +1 -0
- package/dist/browser/interaction/events.js +66 -0
- package/dist/browser/interaction/events.js.map +1 -0
- package/dist/browser/interaction/ref-resolver.d.ts +18 -0
- package/dist/browser/interaction/ref-resolver.d.ts.map +1 -0
- package/dist/browser/interaction/ref-resolver.js +32 -0
- package/dist/browser/interaction/ref-resolver.js.map +1 -0
- package/dist/browser/interaction/uploads.d.ts +4 -0
- package/dist/browser/interaction/uploads.d.ts.map +1 -0
- package/dist/browser/interaction/uploads.js +43 -0
- package/dist/browser/interaction/uploads.js.map +1 -0
- package/dist/browser/network/network-buffer.d.ts +19 -0
- package/dist/browser/network/network-buffer.d.ts.map +1 -0
- package/dist/browser/network/network-buffer.js +118 -0
- package/dist/browser/network/network-buffer.js.map +1 -0
- package/dist/browser/network/network-monitor.d.ts +8 -0
- package/dist/browser/network/network-monitor.d.ts.map +1 -0
- package/dist/browser/network/network-monitor.js +85 -0
- package/dist/browser/network/network-monitor.js.map +1 -0
- package/dist/browser/network/redaction.d.ts +3 -0
- package/dist/browser/network/redaction.d.ts.map +1 -0
- package/dist/browser/network/redaction.js +36 -0
- package/dist/browser/network/redaction.js.map +1 -0
- package/dist/browser/network/types.d.ts +45 -0
- package/dist/browser/network/types.d.ts.map +1 -0
- package/dist/browser/network/types.js +2 -0
- package/dist/browser/network/types.js.map +1 -0
- package/dist/browser/performance/analyze.d.ts +5 -0
- package/dist/browser/performance/analyze.d.ts.map +1 -0
- package/dist/browser/performance/analyze.js +230 -0
- package/dist/browser/performance/analyze.js.map +1 -0
- package/dist/browser/performance/trace.d.ts +10 -0
- package/dist/browser/performance/trace.d.ts.map +1 -0
- package/dist/browser/performance/trace.js +38 -0
- package/dist/browser/performance/trace.js.map +1 -0
- package/dist/browser/performance/types.d.ts +31 -0
- package/dist/browser/performance/types.d.ts.map +1 -0
- package/dist/browser/performance/types.js +2 -0
- package/dist/browser/performance/types.js.map +1 -0
- package/dist/browser/preflight.d.ts +20 -0
- package/dist/browser/preflight.d.ts.map +1 -0
- package/dist/browser/preflight.js +105 -0
- package/dist/browser/preflight.js.map +1 -0
- package/dist/browser/security/origins.d.ts +18 -0
- package/dist/browser/security/origins.d.ts.map +1 -0
- package/dist/browser/security/origins.js +84 -0
- package/dist/browser/security/origins.js.map +1 -0
- package/dist/browser/tabs.d.ts +15 -0
- package/dist/browser/tabs.d.ts.map +1 -0
- package/dist/browser/tabs.js +71 -0
- package/dist/browser/tabs.js.map +1 -0
- package/dist/browser/types.d.ts +32 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/browser.d.ts +2 -99
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -653
- package/dist/browser.js.map +1 -1
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +33 -48
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/linux-check.d.ts +2 -0
- package/dist/cli/linux-check.d.ts.map +1 -0
- package/dist/cli/linux-check.js +20 -0
- package/dist/cli/linux-check.js.map +1 -0
- package/dist/cli/skill-template.d.ts +1 -1
- package/dist/cli/skill-template.d.ts.map +1 -1
- package/dist/cli/skill-template.js +3 -113
- package/dist/cli/skill-template.js.map +1 -1
- package/dist/commands/check.d.ts +17 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +38 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/click.d.ts +3 -1
- package/dist/commands/click.d.ts.map +1 -1
- package/dist/commands/click.js +16 -4
- package/dist/commands/click.js.map +1 -1
- package/dist/commands/connect.d.ts +14 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +19 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/dialog.d.ts +19 -0
- package/dist/commands/dialog.d.ts.map +1 -0
- package/dist/commands/dialog.js +51 -0
- package/dist/commands/dialog.js.map +1 -0
- package/dist/commands/downloads.d.ts +30 -0
- package/dist/commands/downloads.d.ts.map +1 -0
- package/dist/commands/downloads.js +66 -0
- package/dist/commands/downloads.js.map +1 -0
- package/dist/commands/fill.d.ts +16 -0
- package/dist/commands/fill.d.ts.map +1 -0
- package/dist/commands/fill.js +15 -0
- package/dist/commands/fill.js.map +1 -0
- package/dist/commands/find.d.ts +14 -0
- package/dist/commands/find.d.ts.map +1 -0
- package/dist/commands/find.js +26 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/hover.d.ts +13 -0
- package/dist/commands/hover.d.ts.map +1 -0
- package/dist/commands/hover.js +24 -0
- package/dist/commands/hover.js.map +1 -0
- package/dist/commands/navigate.d.ts.map +1 -1
- package/dist/commands/navigate.js +13 -0
- package/dist/commands/navigate.js.map +1 -1
- package/dist/commands/network.d.ts +33 -0
- package/dist/commands/network.d.ts.map +1 -0
- package/dist/commands/network.js +84 -0
- package/dist/commands/network.js.map +1 -0
- package/dist/commands/performance.d.ts +12 -0
- package/dist/commands/performance.d.ts.map +1 -0
- package/dist/commands/performance.js +26 -0
- package/dist/commands/performance.js.map +1 -0
- package/dist/commands/press_key.d.ts +10 -0
- package/dist/commands/press_key.d.ts.map +1 -0
- package/dist/commands/press_key.js +103 -0
- package/dist/commands/press_key.js.map +1 -0
- package/dist/commands/scroll.d.ts +21 -0
- package/dist/commands/scroll.d.ts.map +1 -0
- package/dist/commands/scroll.js +54 -0
- package/dist/commands/scroll.js.map +1 -0
- package/dist/commands/select.d.ts +18 -0
- package/dist/commands/select.d.ts.map +1 -0
- package/dist/commands/select.js +53 -0
- package/dist/commands/select.js.map +1 -0
- package/dist/commands/snapshot.d.ts +9 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +7 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/styles.d.ts +13 -0
- package/dist/commands/styles.d.ts.map +1 -0
- package/dist/commands/styles.js +7 -0
- package/dist/commands/styles.js.map +1 -0
- package/dist/commands/type.d.ts +3 -1
- package/dist/commands/type.d.ts.map +1 -1
- package/dist/commands/type.js +11 -2
- package/dist/commands/type.js.map +1 -1
- package/dist/commands/upload.d.ts +12 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +13 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/mcp/console-buffer.d.ts +9 -0
- package/dist/mcp/console-buffer.d.ts.map +1 -1
- package/dist/mcp/console-buffer.js.map +1 -1
- package/dist/mcp/index.js +20 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +63 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/browser.d.ts.map +1 -1
- package/dist/mcp/tools/browser.js +109 -11
- package/dist/mcp/tools/browser.js.map +1 -1
- package/dist/mcp/tools/connect.d.ts +5 -0
- package/dist/mcp/tools/connect.d.ts.map +1 -0
- package/dist/mcp/tools/connect.js +48 -0
- package/dist/mcp/tools/connect.js.map +1 -0
- package/dist/mcp/tools/files.d.ts +4 -0
- package/dist/mcp/tools/files.d.ts.map +1 -0
- package/dist/mcp/tools/files.js +85 -0
- package/dist/mcp/tools/files.js.map +1 -0
- package/dist/mcp/tools/interaction.d.ts +4 -0
- package/dist/mcp/tools/interaction.d.ts.map +1 -0
- package/dist/mcp/tools/interaction.js +176 -0
- package/dist/mcp/tools/interaction.js.map +1 -0
- package/dist/mcp/tools/names.d.ts +1 -1
- package/dist/mcp/tools/names.d.ts.map +1 -1
- package/dist/mcp/tools/names.js +19 -1
- package/dist/mcp/tools/names.js.map +1 -1
- package/dist/mcp/tools/network.d.ts +4 -0
- package/dist/mcp/tools/network.d.ts.map +1 -0
- package/dist/mcp/tools/network.js +68 -0
- package/dist/mcp/tools/network.js.map +1 -0
- package/dist/mcp/tools/performance.d.ts +4 -0
- package/dist/mcp/tools/performance.d.ts.map +1 -0
- package/dist/mcp/tools/performance.js +26 -0
- package/dist/mcp/tools/performance.js.map +1 -0
- package/dist/mcp/tools/runtime.d.ts +4 -0
- package/dist/mcp/tools/runtime.d.ts.map +1 -0
- package/dist/mcp/tools/runtime.js +128 -0
- package/dist/mcp/tools/runtime.js.map +1 -0
- package/dist/mcp/tools/snapshot.d.ts +4 -0
- package/dist/mcp/tools/snapshot.d.ts.map +1 -0
- package/dist/mcp/tools/snapshot.js +42 -0
- package/dist/mcp/tools/snapshot.js.map +1 -0
- package/dist/mcp/tools/styles.d.ts +4 -0
- package/dist/mcp/tools/styles.d.ts.map +1 -0
- package/dist/mcp/tools/styles.js +27 -0
- package/dist/mcp/tools/styles.js.map +1 -0
- package/dist/util/config.d.ts.map +1 -1
- package/dist/util/config.js +3 -2
- package/dist/util/config.js.map +1 -1
- package/package.json +5 -4
- package/skills/pilot/SKILL.md +48 -0
- package/src/browser/browser-manager.ts +465 -0
- package/src/browser/chrome-launcher.ts +282 -0
- package/src/browser/connection.ts +84 -0
- package/src/browser/events.ts +121 -0
- package/src/browser/index.ts +20 -0
- package/src/browser/inspect/element-ref.ts +68 -0
- package/src/browser/inspect/snapshot.ts +348 -0
- package/src/browser/inspect/styles.ts +258 -0
- package/src/browser/inspect/types.ts +37 -0
- package/src/browser/interaction/dialogs.ts +54 -0
- package/src/browser/interaction/downloads.ts +116 -0
- package/src/browser/interaction/events.ts +79 -0
- package/src/browser/interaction/ref-resolver.ts +53 -0
- package/src/browser/interaction/uploads.ts +60 -0
- package/src/browser/network/network-buffer.ts +133 -0
- package/src/browser/network/network-monitor.ts +107 -0
- package/src/browser/network/redaction.ts +42 -0
- package/src/browser/network/types.ts +47 -0
- package/src/browser/performance/analyze.ts +298 -0
- package/src/browser/performance/trace.ts +60 -0
- package/src/browser/performance/types.ts +34 -0
- package/src/browser/preflight.ts +144 -0
- package/src/browser/security/origins.ts +102 -0
- package/src/browser/tabs.ts +110 -0
- package/src/browser/types.ts +32 -0
- package/src/browser.ts +22 -798
- package/src/cli/init.ts +40 -49
- package/src/cli/linux-check.ts +23 -0
- package/src/cli/skill-template.ts +4 -113
- package/src/commands/check.ts +59 -0
- package/src/commands/click.ts +18 -4
- package/src/commands/connect.ts +40 -0
- package/src/commands/dialog.ts +79 -0
- package/src/commands/downloads.ts +111 -0
- package/src/commands/fill.ts +34 -0
- package/src/commands/find.ts +52 -0
- package/src/commands/hover.ts +42 -0
- package/src/commands/navigate.ts +20 -0
- package/src/commands/network.ts +141 -0
- package/src/commands/performance.ts +51 -0
- package/src/commands/press_key.ts +134 -0
- package/src/commands/scroll.ts +79 -0
- package/src/commands/select.ts +78 -0
- package/src/commands/snapshot.ts +18 -0
- package/src/commands/styles.ts +24 -0
- package/src/commands/type.ts +12 -2
- package/src/commands/upload.ts +36 -0
- package/src/mcp/console-buffer.ts +10 -0
- package/src/mcp/index.ts +24 -2
- package/src/mcp/server.ts +74 -2
- package/src/mcp/tools/browser.ts +125 -9
- package/src/mcp/tools/connect.ts +62 -0
- package/src/mcp/tools/files.ts +120 -0
- package/src/mcp/tools/interaction.ts +232 -0
- package/src/mcp/tools/names.ts +19 -1
- package/src/mcp/tools/network.ts +86 -0
- package/src/mcp/tools/performance.ts +40 -0
- package/src/mcp/tools/runtime.ts +164 -0
- package/src/mcp/tools/snapshot.ts +64 -0
- package/src/mcp/tools/styles.ts +41 -0
- package/src/util/config.ts +3 -2
package/dist/util/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACxD,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC1D,OAAO,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@everydaydevopsio/pilot",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "DevTools-grade browser control for AI agents via MCP + CDP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/mcp/index.js",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"pilot": "dist/mcp/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "
|
|
11
|
+
"build:skill": "node scripts/build-skill.mjs",
|
|
12
|
+
"build": "pnpm run build:skill && rimraf ./dist && tsc",
|
|
12
13
|
"start": "node dist/mcp/index.js",
|
|
13
14
|
"dev": "tsx src/mcp/index.ts",
|
|
14
15
|
"lint": "eslint .",
|
|
@@ -17,8 +18,8 @@
|
|
|
17
18
|
"prettier:fix": "prettier . --write",
|
|
18
19
|
"test": "jest",
|
|
19
20
|
"test:coverage": "jest --coverage",
|
|
20
|
-
"test:e2e:mcp": "
|
|
21
|
-
"test:e2e:mcp:ci": "jest --config jest.e2e-mcp.config.js --verbose",
|
|
21
|
+
"test:e2e:mcp": "jest --config jest.e2e-mcp.config.js --verbose",
|
|
22
|
+
"test:e2e:mcp:ci": "PILOT_HEADLESS=true jest --config jest.e2e-mcp.config.js --verbose",
|
|
22
23
|
"test:e2e:mcp:docker": "docker compose -f docker-compose.e2e.yml up --build --abort-on-container-exit --exit-code-from e2e",
|
|
23
24
|
"pretest:smoke": "pnpm run build",
|
|
24
25
|
"test:smoke": "tsx smoke/mcp-smoke.ts",
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pilot
|
|
3
|
+
description: Control and debug web pages with the Pilot MCP browser tools. Use when the user asks to open, inspect, test, or troubleshoot a site in Chrome with Pilot.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pilot browser workflow
|
|
7
|
+
|
|
8
|
+
Use the `pilot` MCP tools to operate Chrome through the Chrome DevTools Protocol.
|
|
9
|
+
|
|
10
|
+
## Start and inspect
|
|
11
|
+
|
|
12
|
+
1. Call `browser_start` before any other Pilot browser tool. Use visible mode unless the user requests headless operation or the environment has no graphical display.
|
|
13
|
+
2. Navigate with `browser_navigate`, then confirm the result with `browser_page_info` or `browser_snapshot`.
|
|
14
|
+
3. Use refs returned by `browser_snapshot` or `browser_find` for interaction. Take a fresh snapshot after navigation or substantial DOM changes because refs can become stale.
|
|
15
|
+
4. For debugging, clear errors before reproducing the problem, then inspect `browser_errors`, `browser_console`, and `browser_network`. Use performance tracing only when the user asks about load or runtime performance.
|
|
16
|
+
5. Call `browser_stop` when the browser is no longer needed.
|
|
17
|
+
|
|
18
|
+
Do not enter credentials, submit consequential forms, upload files, or make other externally visible changes unless the user authorized that action.
|
|
19
|
+
|
|
20
|
+
## Troubleshooting
|
|
21
|
+
|
|
22
|
+
### Visible Chrome on Linux
|
|
23
|
+
|
|
24
|
+
Run `pilot check` when `browser_start` fails. Visible Chrome requires `DISPLAY` or `WAYLAND_DISPLAY` in the Pilot MCP server process. Headless operation does not.
|
|
25
|
+
|
|
26
|
+
If desktop applications open but Pilot reports that the display is missing, inspect the graphical session with `printenv DISPLAY`. Forward the returned value through the MCP server configuration and restart the agent so Pilot is relaunched. For Codex:
|
|
27
|
+
|
|
28
|
+
```toml
|
|
29
|
+
[mcp_servers.pilot]
|
|
30
|
+
command = "npx"
|
|
31
|
+
args = ["-y", "@everydaydevopsio/pilot"]
|
|
32
|
+
env = { DISPLAY = ":1" }
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Replace `:1` with the actual value. If the X server requires a cookie, forward `XAUTHORITY` in the same map. For SSH, use trusted X11 forwarding (`ssh -Y`) when policy permits, or use a remote desktop session and its display value. Use `PILOT_HEADLESS=true` on systems without a desktop. In CI, use headless mode or run Pilot under Xvfb.
|
|
36
|
+
|
|
37
|
+
### Other Linux preflight failures
|
|
38
|
+
|
|
39
|
+
- If the profile directory is not writable, set `XDG_DATA_HOME` to a writable directory.
|
|
40
|
+
- If loopback binding fails with `EPERM`, the host or container must allow binding on `127.0.0.1`; disabling Chrome's renderer sandbox does not fix it.
|
|
41
|
+
- If Chrome is not detected, set `PILOT_CHROME_PATH` to its executable.
|
|
42
|
+
- Avoid `PILOT_CHROME_NO_SANDBOX=true` unless the runtime genuinely cannot support Chrome's sandbox and the user accepts the security tradeoff.
|
|
43
|
+
|
|
44
|
+
### Connection and page failures
|
|
45
|
+
|
|
46
|
+
- Confirm the active page with `browser_page_info` and list tabs if Pilot controls the wrong tab.
|
|
47
|
+
- Inspect failed document, script, XHR, and fetch requests with `browser_network`.
|
|
48
|
+
- If element refs stop resolving after a page update, take another snapshot and retry with the new refs.
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import type { Client } from 'chrome-remote-interface';
|
|
2
|
+
import type { ChildProcess } from 'child_process';
|
|
3
|
+
import { mkdirSync } from 'fs';
|
|
4
|
+
import { getLogger } from '../util/logger.js';
|
|
5
|
+
import type { Config } from '../util/config.js';
|
|
6
|
+
import type { ViewportConfig } from '../viewport.js';
|
|
7
|
+
import { resolveViewport } from '../viewport.js';
|
|
8
|
+
import type {
|
|
9
|
+
BrowserEventCallback,
|
|
10
|
+
BrowserState,
|
|
11
|
+
LaunchOptions,
|
|
12
|
+
TabInfo
|
|
13
|
+
} from './types.js';
|
|
14
|
+
import {
|
|
15
|
+
findChromeExecutable,
|
|
16
|
+
findFreePort,
|
|
17
|
+
isProfileLocked,
|
|
18
|
+
launchChrome,
|
|
19
|
+
resolveUserDataDir,
|
|
20
|
+
waitForChromeReady,
|
|
21
|
+
cleanupLockFiles
|
|
22
|
+
} from './chrome-launcher.js';
|
|
23
|
+
import { assertLinuxBrowserPrerequisites } from './preflight.js';
|
|
24
|
+
import {
|
|
25
|
+
connectToChrome,
|
|
26
|
+
enableDomains,
|
|
27
|
+
getConnectionInfo,
|
|
28
|
+
type ConnectionInfo
|
|
29
|
+
} from './connection.js';
|
|
30
|
+
import { attachEventListeners } from './events.js';
|
|
31
|
+
import {
|
|
32
|
+
listTabs as listTabsImpl,
|
|
33
|
+
createTab as createTabImpl,
|
|
34
|
+
closeTab as closeTabImpl,
|
|
35
|
+
switchTab as switchTabImpl
|
|
36
|
+
} from './tabs.js';
|
|
37
|
+
|
|
38
|
+
export class BrowserManager {
|
|
39
|
+
private client: Client | null = null;
|
|
40
|
+
private targetId: string | null = null;
|
|
41
|
+
private currentUrl: string | null = null;
|
|
42
|
+
private retryTimer: ReturnType<typeof setTimeout> | null = null;
|
|
43
|
+
private retryMs: number;
|
|
44
|
+
private destroyed = false;
|
|
45
|
+
private intentionalClose = false;
|
|
46
|
+
private eventCallback: BrowserEventCallback | null = null;
|
|
47
|
+
private pendingNetworkRequests = new Set<string>();
|
|
48
|
+
private networkIdleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
49
|
+
private networkIdleResolvers: Array<() => void> = [];
|
|
50
|
+
private chromeProcess: ChildProcess | null = null;
|
|
51
|
+
private launchedCdpPort: number | null = null;
|
|
52
|
+
private viewportConfig: ViewportConfig | null = null;
|
|
53
|
+
private launchedUserDataDir: string | null = null;
|
|
54
|
+
private external = false;
|
|
55
|
+
private externalHost: string | null = null;
|
|
56
|
+
private externalPort: number | null = null;
|
|
57
|
+
|
|
58
|
+
constructor(private readonly config: Config) {
|
|
59
|
+
this.retryMs = config.cdpRetryMs;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setEventCallback(cb: BrowserEventCallback): void {
|
|
63
|
+
this.eventCallback = cb;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private emit(event: string, data: unknown): void {
|
|
67
|
+
this.eventCallback?.(event, data);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
getState(): BrowserState {
|
|
71
|
+
return {
|
|
72
|
+
client: this.client,
|
|
73
|
+
targetId: this.targetId,
|
|
74
|
+
url: this.currentUrl,
|
|
75
|
+
connected: this.client !== null
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
getClient(): Client | null {
|
|
80
|
+
return this.client;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
isConnected(): boolean {
|
|
84
|
+
return this.client !== null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
isLaunched(): boolean {
|
|
88
|
+
return this.chromeProcess !== null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
isExternalChrome(): boolean {
|
|
92
|
+
return this.external;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
getViewportConfig(): ViewportConfig | null {
|
|
96
|
+
return this.viewportConfig;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
setViewportConfig(config: ViewportConfig): void {
|
|
100
|
+
this.viewportConfig = config;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static findChromeExecutable(override?: string): string {
|
|
104
|
+
return findChromeExecutable(override);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static async findFreePort(): Promise<number> {
|
|
108
|
+
return findFreePort();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private getConnectionInfo(): ConnectionInfo {
|
|
112
|
+
return getConnectionInfo(this.config, this.launchedCdpPort);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private makeEventListenerOpts() {
|
|
116
|
+
return {
|
|
117
|
+
emit: (event: string, data: unknown) => this.emit(event, data),
|
|
118
|
+
onDisconnect: () => {
|
|
119
|
+
if (this.intentionalClose) {
|
|
120
|
+
this.intentionalClose = false;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const logger = getLogger();
|
|
124
|
+
logger.warn('Chrome disconnected');
|
|
125
|
+
this.client = null;
|
|
126
|
+
this.targetId = null;
|
|
127
|
+
this.emit('browser_disconnected', {
|
|
128
|
+
reason: 'chrome_disconnected'
|
|
129
|
+
});
|
|
130
|
+
this.scheduleReconnect();
|
|
131
|
+
},
|
|
132
|
+
pendingNetworkRequests: this.pendingNetworkRequests,
|
|
133
|
+
checkNetworkIdle: () => this.checkNetworkIdle(),
|
|
134
|
+
onFrameNavigated: (url: string) => {
|
|
135
|
+
this.currentUrl = url;
|
|
136
|
+
this.emit('page_navigated', {
|
|
137
|
+
url,
|
|
138
|
+
timestamp: Date.now()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async launch(
|
|
145
|
+
opts: LaunchOptions = {}
|
|
146
|
+
): Promise<{ headless: boolean; viewport: string }> {
|
|
147
|
+
if (this.chromeProcess) {
|
|
148
|
+
throw new Error('Chrome is already launched');
|
|
149
|
+
}
|
|
150
|
+
if (this.destroyed) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
'BrowserManager has been destroyed; create a new instance'
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const chromePath = findChromeExecutable(opts.chromePath);
|
|
157
|
+
|
|
158
|
+
const profileName = opts.profileName ?? this.config.profileName;
|
|
159
|
+
const userDataDir = resolveUserDataDir(profileName);
|
|
160
|
+
|
|
161
|
+
if (isProfileLocked(userDataDir)) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
`Profile "${profileName}" is already in use by another browser instance.`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const viewportPreset = opts.viewport ?? this.config.viewport;
|
|
168
|
+
this.viewportConfig = resolveViewport({
|
|
169
|
+
preset: viewportPreset,
|
|
170
|
+
width: opts.viewportWidth,
|
|
171
|
+
height: opts.viewportHeight,
|
|
172
|
+
deviceScaleFactor: opts.deviceScaleFactor,
|
|
173
|
+
responsive: opts.responsive ?? this.config.responsive
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const headless = opts.headless ?? this.config.headless;
|
|
177
|
+
|
|
178
|
+
await assertLinuxBrowserPrerequisites({
|
|
179
|
+
headless,
|
|
180
|
+
chromePath,
|
|
181
|
+
profileName,
|
|
182
|
+
checkNetwork: false
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
mkdirSync(userDataDir, { recursive: true });
|
|
186
|
+
const port = await findFreePort();
|
|
187
|
+
|
|
188
|
+
this.chromeProcess = launchChrome({
|
|
189
|
+
chromePath,
|
|
190
|
+
port,
|
|
191
|
+
userDataDir,
|
|
192
|
+
headless,
|
|
193
|
+
windowWidth: this.viewportConfig.width,
|
|
194
|
+
windowHeight: this.viewportConfig.height
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
this.launchedCdpPort = port;
|
|
198
|
+
this.launchedUserDataDir = userDataDir;
|
|
199
|
+
|
|
200
|
+
const stderrChunks: string[] = [];
|
|
201
|
+
this.chromeProcess.stderr?.on('data', (data: Buffer) => {
|
|
202
|
+
stderrChunks.push(data.toString());
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
this.chromeProcess.on('exit', (code, signal) => {
|
|
206
|
+
const logger = getLogger();
|
|
207
|
+
const stderr = stderrChunks.join('').trim();
|
|
208
|
+
const stderrFiltered = stderr
|
|
209
|
+
.split('\n')
|
|
210
|
+
.filter((l) => !l.includes('dbus/bus.cc'))
|
|
211
|
+
.join('\n')
|
|
212
|
+
.trim();
|
|
213
|
+
logger.warn(
|
|
214
|
+
{
|
|
215
|
+
code,
|
|
216
|
+
signal,
|
|
217
|
+
...(stderrFiltered && { stderr: stderrFiltered.slice(0, 1000) }),
|
|
218
|
+
...(stderr && !stderrFiltered && { stderrRaw: stderr.slice(0, 500) })
|
|
219
|
+
},
|
|
220
|
+
'Chrome process exited'
|
|
221
|
+
);
|
|
222
|
+
this.chromeProcess = null;
|
|
223
|
+
this.launchedCdpPort = null;
|
|
224
|
+
this.cleanupUserDataDir();
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
await waitForChromeReady(port, opts.startupTimeoutMs);
|
|
228
|
+
await this.connect();
|
|
229
|
+
|
|
230
|
+
return { headless, viewport: viewportPreset };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async connect(): Promise<void> {
|
|
234
|
+
if (this.destroyed) return;
|
|
235
|
+
const logger = getLogger();
|
|
236
|
+
|
|
237
|
+
try {
|
|
238
|
+
const connInfo = this.getConnectionInfo();
|
|
239
|
+
const { client, targetId, url } = await connectToChrome(connInfo);
|
|
240
|
+
|
|
241
|
+
this.client = client;
|
|
242
|
+
this.targetId = targetId;
|
|
243
|
+
this.currentUrl = url;
|
|
244
|
+
this.retryMs = this.config.cdpRetryMs;
|
|
245
|
+
|
|
246
|
+
await enableDomains(client, this.viewportConfig);
|
|
247
|
+
attachEventListeners(client, this.makeEventListenerOpts());
|
|
248
|
+
|
|
249
|
+
logger.info(
|
|
250
|
+
{ targetId: this.targetId, url: this.currentUrl },
|
|
251
|
+
'Connected to Chrome'
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
this.emit('browser_connected', {
|
|
255
|
+
targetId: this.targetId,
|
|
256
|
+
url: this.currentUrl
|
|
257
|
+
});
|
|
258
|
+
} catch (err) {
|
|
259
|
+
logger.warn(
|
|
260
|
+
{ err, retryMs: this.retryMs },
|
|
261
|
+
'Failed to connect to Chrome, retrying...'
|
|
262
|
+
);
|
|
263
|
+
this.scheduleReconnect();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async connectExisting(opts: {
|
|
268
|
+
host?: string;
|
|
269
|
+
port?: number;
|
|
270
|
+
}): Promise<{ tabs: TabInfo[] }> {
|
|
271
|
+
if (this.chromeProcess) {
|
|
272
|
+
throw new Error(
|
|
273
|
+
'Chrome was launched by Pilot. Use browser_stop first, then browser_connect.'
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
if (this.destroyed) {
|
|
277
|
+
throw new Error(
|
|
278
|
+
'BrowserManager has been destroyed; create a new instance'
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const logger = getLogger();
|
|
283
|
+
const host = opts.host ?? '127.0.0.1';
|
|
284
|
+
const port = opts.port ?? 9222;
|
|
285
|
+
|
|
286
|
+
this.external = true;
|
|
287
|
+
this.externalHost = host;
|
|
288
|
+
this.externalPort = port;
|
|
289
|
+
this.launchedCdpPort = port;
|
|
290
|
+
|
|
291
|
+
// Override connection info for external Chrome
|
|
292
|
+
const connInfo: ConnectionInfo = { host, port };
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
const { client, targetId, url } = await connectToChrome(connInfo);
|
|
296
|
+
|
|
297
|
+
this.client = client;
|
|
298
|
+
this.targetId = targetId;
|
|
299
|
+
this.currentUrl = url;
|
|
300
|
+
this.retryMs = this.config.cdpRetryMs;
|
|
301
|
+
|
|
302
|
+
await enableDomains(client, this.viewportConfig);
|
|
303
|
+
attachEventListeners(client, this.makeEventListenerOpts());
|
|
304
|
+
|
|
305
|
+
logger.info(
|
|
306
|
+
{ host, port, targetId, url },
|
|
307
|
+
'Connected to existing Chrome'
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
this.emit('browser_connected', { targetId, url });
|
|
311
|
+
|
|
312
|
+
const tabs = await this.listTabs();
|
|
313
|
+
return { tabs };
|
|
314
|
+
} catch (cause) {
|
|
315
|
+
this.external = false;
|
|
316
|
+
this.externalHost = null;
|
|
317
|
+
this.externalPort = null;
|
|
318
|
+
this.launchedCdpPort = null;
|
|
319
|
+
throw new Error(
|
|
320
|
+
`Could not connect to Chrome at ${host}:${port}. ` +
|
|
321
|
+
`Start Chrome with --remote-debugging-port=${port} or use browser_start to launch a new instance.`,
|
|
322
|
+
{ cause }
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
private checkNetworkIdle(): void {
|
|
328
|
+
if (this.pendingNetworkRequests.size === 0) {
|
|
329
|
+
if (this.networkIdleTimer) clearTimeout(this.networkIdleTimer);
|
|
330
|
+
this.networkIdleTimer = setTimeout(() => {
|
|
331
|
+
const resolvers = this.networkIdleResolvers.splice(0);
|
|
332
|
+
resolvers.forEach((r) => r());
|
|
333
|
+
}, 500);
|
|
334
|
+
this.networkIdleTimer.unref();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
waitForNetworkIdle(timeoutMs = 10000): Promise<void> {
|
|
339
|
+
return new Promise((resolve, reject) => {
|
|
340
|
+
if (this.pendingNetworkRequests.size === 0) {
|
|
341
|
+
resolve();
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const timer = setTimeout(() => {
|
|
345
|
+
const idx = this.networkIdleResolvers.indexOf(resolve);
|
|
346
|
+
if (idx !== -1) this.networkIdleResolvers.splice(idx, 1);
|
|
347
|
+
reject(new Error('timeout waiting for network idle'));
|
|
348
|
+
}, timeoutMs);
|
|
349
|
+
|
|
350
|
+
this.networkIdleResolvers.push(() => {
|
|
351
|
+
clearTimeout(timer);
|
|
352
|
+
resolve();
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
async listTabs(): Promise<TabInfo[]> {
|
|
358
|
+
return listTabsImpl(this.getConnectionInfo(), this.targetId);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
async createTab(url?: string): Promise<TabInfo> {
|
|
362
|
+
return createTabImpl(this.getConnectionInfo(), url);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
async closeTab(targetId: string): Promise<void> {
|
|
366
|
+
return closeTabImpl(this.getConnectionInfo(), targetId, this.targetId);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async switchTab(targetId: string): Promise<void> {
|
|
370
|
+
if (targetId === this.targetId) return;
|
|
371
|
+
|
|
372
|
+
// Clear any pending reconnect from a prior disconnect
|
|
373
|
+
if (this.retryTimer) {
|
|
374
|
+
clearTimeout(this.retryTimer);
|
|
375
|
+
this.retryTimer = null;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
this.intentionalClose = true;
|
|
379
|
+
|
|
380
|
+
const result = await switchTabImpl(
|
|
381
|
+
this.getConnectionInfo(),
|
|
382
|
+
targetId,
|
|
383
|
+
this.targetId,
|
|
384
|
+
this.client,
|
|
385
|
+
this.viewportConfig,
|
|
386
|
+
this.makeEventListenerOpts()
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
this.client = result.client;
|
|
390
|
+
this.targetId = result.targetId;
|
|
391
|
+
this.currentUrl = result.url;
|
|
392
|
+
this.retryMs = this.config.cdpRetryMs;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
private scheduleReconnect(): void {
|
|
396
|
+
if (this.destroyed) return;
|
|
397
|
+
if (this.retryTimer) return;
|
|
398
|
+
|
|
399
|
+
this.retryTimer = setTimeout(() => {
|
|
400
|
+
this.retryTimer = null;
|
|
401
|
+
this.retryMs = Math.min(this.retryMs * 2, this.config.cdpMaxRetryMs);
|
|
402
|
+
void this.connect();
|
|
403
|
+
}, this.retryMs);
|
|
404
|
+
this.retryTimer.unref();
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private cleanupUserDataDir(): void {
|
|
408
|
+
if (this.launchedUserDataDir) {
|
|
409
|
+
cleanupLockFiles(this.launchedUserDataDir);
|
|
410
|
+
}
|
|
411
|
+
this.launchedUserDataDir = null;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async destroy(): Promise<void> {
|
|
415
|
+
this.destroyed = true;
|
|
416
|
+
if (this.retryTimer) {
|
|
417
|
+
clearTimeout(this.retryTimer);
|
|
418
|
+
this.retryTimer = null;
|
|
419
|
+
}
|
|
420
|
+
if (this.networkIdleTimer) {
|
|
421
|
+
clearTimeout(this.networkIdleTimer);
|
|
422
|
+
}
|
|
423
|
+
if (this.client) {
|
|
424
|
+
await this.client.close();
|
|
425
|
+
this.client = null;
|
|
426
|
+
}
|
|
427
|
+
// External Chrome: just disconnect, don't kill the process
|
|
428
|
+
if (this.external) {
|
|
429
|
+
this.external = false;
|
|
430
|
+
this.externalHost = null;
|
|
431
|
+
this.externalPort = null;
|
|
432
|
+
this.launchedCdpPort = null;
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (this.chromeProcess) {
|
|
436
|
+
const proc = this.chromeProcess;
|
|
437
|
+
this.chromeProcess = null;
|
|
438
|
+
this.launchedCdpPort = null;
|
|
439
|
+
try {
|
|
440
|
+
proc.kill();
|
|
441
|
+
} catch {
|
|
442
|
+
// process may have already exited
|
|
443
|
+
}
|
|
444
|
+
await new Promise<void>((resolve) => {
|
|
445
|
+
if (proc.exitCode !== null) {
|
|
446
|
+
resolve();
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const timer = setTimeout(() => {
|
|
450
|
+
try {
|
|
451
|
+
proc.kill('SIGKILL');
|
|
452
|
+
} catch {
|
|
453
|
+
// process may have already exited
|
|
454
|
+
}
|
|
455
|
+
resolve();
|
|
456
|
+
}, 5000);
|
|
457
|
+
proc.once('exit', () => {
|
|
458
|
+
clearTimeout(timer);
|
|
459
|
+
resolve();
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
this.cleanupUserDataDir();
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|