agent-browser-stealth 0.17.0-fork.2 → 0.24.0-fork.2

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.
Files changed (122) hide show
  1. package/README.md +1256 -240
  2. package/bin/agent-browser-darwin-arm64 +0 -0
  3. package/bin/agent-browser-darwin-x64 +0 -0
  4. package/bin/agent-browser-linux-arm64 +0 -0
  5. package/bin/agent-browser-linux-x64 +0 -0
  6. package/bin/agent-browser-win32-x64.exe +0 -0
  7. package/bin/agent-browser.js +13 -2
  8. package/extensions/tab-group-cdp/content-script.js +425 -0
  9. package/extensions/tab-group-cdp/icons/icon.svg +7 -0
  10. package/extensions/tab-group-cdp/manifest.json +34 -0
  11. package/extensions/tab-group-cdp/page-bridge.js +133 -0
  12. package/extensions/tab-group-cdp/service-worker.js +2249 -0
  13. package/extensions/tab-group-cdp/sidepanel.css +258 -0
  14. package/extensions/tab-group-cdp/sidepanel.html +28 -0
  15. package/extensions/tab-group-cdp/sidepanel.js +1225 -0
  16. package/package.json +17 -69
  17. package/scripts/build-all-platforms.sh +6 -0
  18. package/scripts/check-version-sync.js +14 -2
  19. package/scripts/copy-native.js +8 -50
  20. package/scripts/postinstall.js +149 -165
  21. package/scripts/windows-debug/provision.sh +220 -0
  22. package/scripts/windows-debug/run.sh +92 -0
  23. package/scripts/windows-debug/start.sh +43 -0
  24. package/scripts/windows-debug/stop.sh +28 -0
  25. package/scripts/windows-debug/sync.sh +27 -0
  26. package/skills/agent-browser/SKILL.md +256 -159
  27. package/skills/agent-browser/references/authentication.md +101 -0
  28. package/skills/agent-browser/references/commands.md +34 -2
  29. package/skills/agent-browser/references/snapshot-refs.md +25 -0
  30. package/skills/agentcore/SKILL.md +115 -0
  31. package/skills/dogfood/SKILL.md +4 -2
  32. package/skills/electron/SKILL.md +26 -2
  33. package/skills/slack/SKILL.md +0 -9
  34. package/skills/slack/references/slack-tasks.md +2 -8
  35. package/skills/vercel-sandbox/SKILL.md +280 -0
  36. package/bin/agent-browser-local +0 -0
  37. package/bin/agent-browser-stealth +0 -0
  38. package/bin/agent-browser-stealth.d +0 -1
  39. package/dist/action-policy.d.ts +0 -14
  40. package/dist/action-policy.d.ts.map +0 -1
  41. package/dist/action-policy.js +0 -253
  42. package/dist/action-policy.js.map +0 -1
  43. package/dist/actions.d.ts +0 -21
  44. package/dist/actions.d.ts.map +0 -1
  45. package/dist/actions.js +0 -2139
  46. package/dist/actions.js.map +0 -1
  47. package/dist/auth-cli.d.ts +0 -2
  48. package/dist/auth-cli.d.ts.map +0 -1
  49. package/dist/auth-cli.js +0 -97
  50. package/dist/auth-cli.js.map +0 -1
  51. package/dist/auth-vault.d.ts +0 -36
  52. package/dist/auth-vault.d.ts.map +0 -1
  53. package/dist/auth-vault.js +0 -125
  54. package/dist/auth-vault.js.map +0 -1
  55. package/dist/browser.d.ts +0 -665
  56. package/dist/browser.d.ts.map +0 -1
  57. package/dist/browser.js +0 -3210
  58. package/dist/browser.js.map +0 -1
  59. package/dist/confirmation.d.ts +0 -8
  60. package/dist/confirmation.d.ts.map +0 -1
  61. package/dist/confirmation.js +0 -30
  62. package/dist/confirmation.js.map +0 -1
  63. package/dist/daemon.d.ts +0 -78
  64. package/dist/daemon.d.ts.map +0 -1
  65. package/dist/daemon.js +0 -744
  66. package/dist/daemon.js.map +0 -1
  67. package/dist/diff.d.ts +0 -18
  68. package/dist/diff.d.ts.map +0 -1
  69. package/dist/diff.js +0 -271
  70. package/dist/diff.js.map +0 -1
  71. package/dist/domain-filter.d.ts +0 -28
  72. package/dist/domain-filter.d.ts.map +0 -1
  73. package/dist/domain-filter.js +0 -149
  74. package/dist/domain-filter.js.map +0 -1
  75. package/dist/encryption.d.ts +0 -73
  76. package/dist/encryption.d.ts.map +0 -1
  77. package/dist/encryption.js +0 -171
  78. package/dist/encryption.js.map +0 -1
  79. package/dist/ios-actions.d.ts +0 -11
  80. package/dist/ios-actions.d.ts.map +0 -1
  81. package/dist/ios-actions.js +0 -228
  82. package/dist/ios-actions.js.map +0 -1
  83. package/dist/ios-manager.d.ts +0 -266
  84. package/dist/ios-manager.d.ts.map +0 -1
  85. package/dist/ios-manager.js +0 -1073
  86. package/dist/ios-manager.js.map +0 -1
  87. package/dist/protocol.d.ts +0 -26
  88. package/dist/protocol.d.ts.map +0 -1
  89. package/dist/protocol.js +0 -990
  90. package/dist/protocol.js.map +0 -1
  91. package/dist/snapshot.d.ts +0 -67
  92. package/dist/snapshot.d.ts.map +0 -1
  93. package/dist/snapshot.js +0 -514
  94. package/dist/snapshot.js.map +0 -1
  95. package/dist/state-utils.d.ts +0 -77
  96. package/dist/state-utils.d.ts.map +0 -1
  97. package/dist/state-utils.js +0 -178
  98. package/dist/state-utils.js.map +0 -1
  99. package/dist/stealth.d.ts +0 -41
  100. package/dist/stealth.d.ts.map +0 -1
  101. package/dist/stealth.js +0 -1743
  102. package/dist/stealth.js.map +0 -1
  103. package/dist/stream-server.d.ts +0 -117
  104. package/dist/stream-server.d.ts.map +0 -1
  105. package/dist/stream-server.js +0 -309
  106. package/dist/stream-server.js.map +0 -1
  107. package/dist/types.d.ts +0 -973
  108. package/dist/types.d.ts.map +0 -1
  109. package/dist/types.js +0 -2
  110. package/dist/types.js.map +0 -1
  111. package/scripts/check-creepjs-headless.js +0 -137
  112. package/scripts/check-daemon-pid-recovery.js +0 -148
  113. package/scripts/check-sannysoft-webdriver.js +0 -112
  114. package/scripts/check-stealth-regression.js +0 -199
  115. package/scripts/check-turnstile-testkey.ts +0 -125
  116. package/scripts/clawhub-sync.sh +0 -27
  117. package/scripts/sync-upstream.sh +0 -142
  118. package/scripts/verify-bundled-binaries.js +0 -71
  119. package/scripts/verify-native-version.js +0 -48
  120. package/scripts/verify-packed-host-binary.js +0 -88
  121. package/scripts/verify-registry-host-binary.js +0 -120
  122. package/skills/agent-browser-stealth/SKILL.md +0 -127
@@ -0,0 +1,280 @@
1
+ ---
2
+ name: vercel-sandbox
3
+ description: Run agent-browser + Chrome inside Vercel Sandbox microVMs for browser automation from any Vercel-deployed app. Use when the user needs browser automation in a Vercel app (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.), wants to run headless Chrome without binary size limits, needs persistent browser sessions across commands, or wants ephemeral isolated browser environments. Triggers include "Vercel Sandbox browser", "microVM Chrome", "agent-browser in sandbox", "browser automation on Vercel", or any task requiring Chrome in a Vercel Sandbox.
4
+ ---
5
+
6
+ # Browser Automation with Vercel Sandbox
7
+
8
+ Run agent-browser + headless Chrome inside ephemeral Vercel Sandbox microVMs. A Linux VM spins up on demand, executes browser commands, and shuts down. Works with any Vercel-deployed framework (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.).
9
+
10
+ ## Dependencies
11
+
12
+ ```bash
13
+ pnpm add @vercel/sandbox
14
+ ```
15
+
16
+ The sandbox VM needs system dependencies for Chromium plus agent-browser itself. Use sandbox snapshots (below) to pre-install everything for sub-second startup.
17
+
18
+ ## Core Pattern
19
+
20
+ ```ts
21
+ import { Sandbox } from "@vercel/sandbox";
22
+
23
+ // System libraries required by Chromium on the sandbox VM (Amazon Linux / dnf)
24
+ const CHROMIUM_SYSTEM_DEPS = [
25
+ "nss", "nspr", "libxkbcommon", "atk", "at-spi2-atk", "at-spi2-core",
26
+ "libXcomposite", "libXdamage", "libXrandr", "libXfixes", "libXcursor",
27
+ "libXi", "libXtst", "libXScrnSaver", "libXext", "mesa-libgbm", "libdrm",
28
+ "mesa-libGL", "mesa-libEGL", "cups-libs", "alsa-lib", "pango", "cairo",
29
+ "gtk3", "dbus-libs",
30
+ ];
31
+
32
+ function getSandboxCredentials() {
33
+ if (
34
+ process.env.VERCEL_TOKEN &&
35
+ process.env.VERCEL_TEAM_ID &&
36
+ process.env.VERCEL_PROJECT_ID
37
+ ) {
38
+ return {
39
+ token: process.env.VERCEL_TOKEN,
40
+ teamId: process.env.VERCEL_TEAM_ID,
41
+ projectId: process.env.VERCEL_PROJECT_ID,
42
+ };
43
+ }
44
+ return {};
45
+ }
46
+
47
+ async function withBrowser<T>(
48
+ fn: (sandbox: InstanceType<typeof Sandbox>) => Promise<T>,
49
+ ): Promise<T> {
50
+ const snapshotId = process.env.AGENT_BROWSER_SNAPSHOT_ID;
51
+ const credentials = getSandboxCredentials();
52
+
53
+ const sandbox = snapshotId
54
+ ? await Sandbox.create({
55
+ ...credentials,
56
+ source: { type: "snapshot", snapshotId },
57
+ timeout: 120_000,
58
+ })
59
+ : await Sandbox.create({ ...credentials, runtime: "node24", timeout: 120_000 });
60
+
61
+ if (!snapshotId) {
62
+ await sandbox.runCommand("sh", [
63
+ "-c",
64
+ `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
65
+ ]);
66
+ await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
67
+ await sandbox.runCommand("npx", ["agent-browser", "install"]);
68
+ }
69
+
70
+ try {
71
+ return await fn(sandbox);
72
+ } finally {
73
+ await sandbox.stop();
74
+ }
75
+ }
76
+ ```
77
+
78
+ ## Screenshot
79
+
80
+ The `screenshot --json` command saves to a file and returns the path. Read the file back as base64:
81
+
82
+ ```ts
83
+ export async function screenshotUrl(url: string) {
84
+ return withBrowser(async (sandbox) => {
85
+ await sandbox.runCommand("agent-browser", ["open", url]);
86
+
87
+ const titleResult = await sandbox.runCommand("agent-browser", [
88
+ "get", "title", "--json",
89
+ ]);
90
+ const title = JSON.parse(await titleResult.stdout())?.data?.title || url;
91
+
92
+ const ssResult = await sandbox.runCommand("agent-browser", [
93
+ "screenshot", "--json",
94
+ ]);
95
+ const ssPath = JSON.parse(await ssResult.stdout())?.data?.path;
96
+ const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
97
+ const screenshot = (await b64Result.stdout()).trim();
98
+
99
+ await sandbox.runCommand("agent-browser", ["close"]);
100
+
101
+ return { title, screenshot };
102
+ });
103
+ }
104
+ ```
105
+
106
+ ## Accessibility Snapshot
107
+
108
+ ```ts
109
+ export async function snapshotUrl(url: string) {
110
+ return withBrowser(async (sandbox) => {
111
+ await sandbox.runCommand("agent-browser", ["open", url]);
112
+
113
+ const titleResult = await sandbox.runCommand("agent-browser", [
114
+ "get", "title", "--json",
115
+ ]);
116
+ const title = JSON.parse(await titleResult.stdout())?.data?.title || url;
117
+
118
+ const snapResult = await sandbox.runCommand("agent-browser", [
119
+ "snapshot", "-i", "-c",
120
+ ]);
121
+ const snapshot = await snapResult.stdout();
122
+
123
+ await sandbox.runCommand("agent-browser", ["close"]);
124
+
125
+ return { title, snapshot };
126
+ });
127
+ }
128
+ ```
129
+
130
+ ## Multi-Step Workflows
131
+
132
+ The sandbox persists between commands, so you can run full automation sequences:
133
+
134
+ ```ts
135
+ export async function fillAndSubmitForm(url: string, data: Record<string, string>) {
136
+ return withBrowser(async (sandbox) => {
137
+ await sandbox.runCommand("agent-browser", ["open", url]);
138
+
139
+ const snapResult = await sandbox.runCommand("agent-browser", [
140
+ "snapshot", "-i",
141
+ ]);
142
+ const snapshot = await snapResult.stdout();
143
+ // Parse snapshot to find element refs...
144
+
145
+ for (const [ref, value] of Object.entries(data)) {
146
+ await sandbox.runCommand("agent-browser", ["fill", ref, value]);
147
+ }
148
+
149
+ await sandbox.runCommand("agent-browser", ["click", "@e5"]);
150
+ await sandbox.runCommand("agent-browser", ["wait", "--load", "networkidle"]);
151
+
152
+ const ssResult = await sandbox.runCommand("agent-browser", [
153
+ "screenshot", "--json",
154
+ ]);
155
+ const ssPath = JSON.parse(await ssResult.stdout())?.data?.path;
156
+ const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
157
+ const screenshot = (await b64Result.stdout()).trim();
158
+
159
+ await sandbox.runCommand("agent-browser", ["close"]);
160
+
161
+ return { screenshot };
162
+ });
163
+ }
164
+ ```
165
+
166
+ ## Sandbox Snapshots (Fast Startup)
167
+
168
+ A **sandbox snapshot** is a saved VM image of a Vercel Sandbox with system dependencies + agent-browser + Chromium already installed. Think of it like a Docker image -- instead of installing dependencies from scratch every time, the sandbox boots from the pre-built image.
169
+
170
+ This is unrelated to agent-browser's *accessibility snapshot* feature (`agent-browser snapshot`), which dumps a page's accessibility tree. A sandbox snapshot is a Vercel infrastructure concept for fast VM startup.
171
+
172
+ Without a sandbox snapshot, each run installs system deps + agent-browser + Chromium (~30s). With one, startup is sub-second.
173
+
174
+ ### Creating a sandbox snapshot
175
+
176
+ The snapshot must include system dependencies (via `dnf`), agent-browser, and Chromium:
177
+
178
+ ```ts
179
+ import { Sandbox } from "@vercel/sandbox";
180
+
181
+ const CHROMIUM_SYSTEM_DEPS = [
182
+ "nss", "nspr", "libxkbcommon", "atk", "at-spi2-atk", "at-spi2-core",
183
+ "libXcomposite", "libXdamage", "libXrandr", "libXfixes", "libXcursor",
184
+ "libXi", "libXtst", "libXScrnSaver", "libXext", "mesa-libgbm", "libdrm",
185
+ "mesa-libGL", "mesa-libEGL", "cups-libs", "alsa-lib", "pango", "cairo",
186
+ "gtk3", "dbus-libs",
187
+ ];
188
+
189
+ async function createSnapshot(): Promise<string> {
190
+ const sandbox = await Sandbox.create({
191
+ runtime: "node24",
192
+ timeout: 300_000,
193
+ });
194
+
195
+ await sandbox.runCommand("sh", [
196
+ "-c",
197
+ `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
198
+ ]);
199
+ await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
200
+ await sandbox.runCommand("npx", ["agent-browser", "install"]);
201
+
202
+ const snapshot = await sandbox.snapshot();
203
+ return snapshot.snapshotId;
204
+ }
205
+ ```
206
+
207
+ Run this once, then set the environment variable:
208
+
209
+ ```bash
210
+ AGENT_BROWSER_SNAPSHOT_ID=snap_xxxxxxxxxxxx
211
+ ```
212
+
213
+ A helper script is available in the demo app:
214
+
215
+ ```bash
216
+ npx tsx examples/environments/scripts/create-snapshot.ts
217
+ ```
218
+
219
+ Recommended for any production deployment using the Sandbox pattern.
220
+
221
+ ## Authentication
222
+
223
+ On Vercel deployments, the Sandbox SDK authenticates automatically via OIDC. For local development or explicit control, set:
224
+
225
+ ```bash
226
+ VERCEL_TOKEN=<personal-access-token>
227
+ VERCEL_TEAM_ID=<team-id>
228
+ VERCEL_PROJECT_ID=<project-id>
229
+ ```
230
+
231
+ These are spread into `Sandbox.create()` calls. When absent, the SDK falls back to `VERCEL_OIDC_TOKEN` (automatic on Vercel).
232
+
233
+ ## Scheduled Workflows (Cron)
234
+
235
+ Combine with Vercel Cron Jobs for recurring browser tasks:
236
+
237
+ ```ts
238
+ // app/api/cron/route.ts (or equivalent in your framework)
239
+ export async function GET() {
240
+ const result = await withBrowser(async (sandbox) => {
241
+ await sandbox.runCommand("agent-browser", ["open", "https://example.com/pricing"]);
242
+ const snap = await sandbox.runCommand("agent-browser", ["snapshot", "-i", "-c"]);
243
+ await sandbox.runCommand("agent-browser", ["close"]);
244
+ return await snap.stdout();
245
+ });
246
+
247
+ // Process results, send alerts, store data...
248
+ return Response.json({ ok: true, snapshot: result });
249
+ }
250
+ ```
251
+
252
+ ```json
253
+ // vercel.json
254
+ { "crons": [{ "path": "/api/cron", "schedule": "0 9 * * *" }] }
255
+ ```
256
+
257
+ ## Environment Variables
258
+
259
+ | Variable | Required | Description |
260
+ |---|---|---|
261
+ | `AGENT_BROWSER_SNAPSHOT_ID` | No (but recommended) | Pre-built sandbox snapshot ID for sub-second startup (see above) |
262
+ | `VERCEL_TOKEN` | No | Vercel personal access token (for local dev; OIDC is automatic on Vercel) |
263
+ | `VERCEL_TEAM_ID` | No | Vercel team ID (for local dev) |
264
+ | `VERCEL_PROJECT_ID` | No | Vercel project ID (for local dev) |
265
+
266
+ ## Framework Examples
267
+
268
+ The pattern works identically across frameworks. The only difference is where you put the server-side code:
269
+
270
+ | Framework | Server code location |
271
+ |---|---|
272
+ | Next.js | Server actions, API routes, route handlers |
273
+ | SvelteKit | `+page.server.ts`, `+server.ts` |
274
+ | Nuxt | `server/api/`, `server/routes/` |
275
+ | Remix | `loader`, `action` functions |
276
+ | Astro | `.astro` frontmatter, API routes |
277
+
278
+ ## Example
279
+
280
+ See `examples/environments/` in the agent-browser repo for a working app with the Vercel Sandbox pattern, including a sandbox snapshot creation script, streaming progress UI, and rate limiting.
Binary file
Binary file
@@ -1 +0,0 @@
1
- /Users/leo/github.com/agent-browser/cli/target/release/agent-browser-stealth: /Users/leo/github.com/agent-browser/cli/build.rs /Users/leo/github.com/agent-browser/cli/cdp-protocol/browser_protocol.json /Users/leo/github.com/agent-browser/cli/cdp-protocol/js_protocol.json /Users/leo/github.com/agent-browser/cli/src/color.rs /Users/leo/github.com/agent-browser/cli/src/commands.rs /Users/leo/github.com/agent-browser/cli/src/connection.rs /Users/leo/github.com/agent-browser/cli/src/flags.rs /Users/leo/github.com/agent-browser/cli/src/install.rs /Users/leo/github.com/agent-browser/cli/src/main.rs /Users/leo/github.com/agent-browser/cli/src/main_stealth.rs /Users/leo/github.com/agent-browser/cli/src/output.rs /Users/leo/github.com/agent-browser/cli/src/validation.rs
@@ -1,14 +0,0 @@
1
- export interface ActionPolicy {
2
- default: 'allow' | 'deny';
3
- allow?: string[];
4
- deny?: string[];
5
- }
6
- export type PolicyDecision = 'allow' | 'deny' | 'confirm';
7
- export declare const KNOWN_CATEGORIES: Set<string>;
8
- export declare function getActionCategory(action: string): string;
9
- export declare function loadPolicyFile(policyPath: string): ActionPolicy;
10
- export declare function initPolicyReloader(policyPath: string, policy: ActionPolicy): void;
11
- export declare function reloadPolicyIfChanged(): ActionPolicy | null;
12
- export declare function checkPolicy(action: string, policy: ActionPolicy | null, confirmCategories: Set<string>): PolicyDecision;
13
- export declare function describeAction(action: string, command: Record<string, unknown>): string;
14
- //# sourceMappingURL=action-policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action-policy.d.ts","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AA4K1D,eAAO,MAAM,gBAAgB,aAE5B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAwB/D;AAQD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAIjF;AAED,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,IAAI,CAkB3D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,cAAc,CAkBhB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAyBvF"}
@@ -1,253 +0,0 @@
1
- import { readFileSync, statSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- const ACTION_CATEGORIES = {
4
- navigate: 'navigate',
5
- back: 'navigate',
6
- forward: 'navigate',
7
- reload: 'navigate',
8
- tab_new: 'navigate',
9
- click: 'click',
10
- dblclick: 'click',
11
- tap: 'click',
12
- fill: 'fill',
13
- type: 'fill',
14
- // The `keyboard` action is a compound command that dispatches to sub-actions
15
- // (type, inserttext, press, down, up). Its primary use is text input, so it
16
- // maps to 'fill'. The interact-like sub-actions (press, down, up) are less
17
- // common and don't have separate top-level action names in the protocol.
18
- keyboard: 'fill',
19
- inserttext: 'fill',
20
- select: 'fill',
21
- multiselect: 'fill',
22
- check: 'fill',
23
- uncheck: 'fill',
24
- clear: 'fill',
25
- selectall: 'fill',
26
- setvalue: 'fill',
27
- download: 'download',
28
- waitfordownload: 'download',
29
- upload: 'upload',
30
- evaluate: 'eval',
31
- evalhandle: 'eval',
32
- addscript: 'eval',
33
- addinitscript: 'eval',
34
- snapshot: 'snapshot',
35
- screenshot: 'snapshot',
36
- pdf: 'snapshot',
37
- diff_snapshot: 'snapshot',
38
- diff_screenshot: 'snapshot',
39
- diff_url: 'snapshot',
40
- scroll: 'scroll',
41
- scrollintoview: 'scroll',
42
- wait: 'wait',
43
- waitforurl: 'wait',
44
- waitforloadstate: 'wait',
45
- waitforfunction: 'wait',
46
- gettext: 'get',
47
- content: 'get',
48
- innerhtml: 'get',
49
- innertext: 'get',
50
- inputvalue: 'get',
51
- url: 'get',
52
- title: 'get',
53
- getattribute: 'get',
54
- count: 'get',
55
- boundingbox: 'get',
56
- styles: 'get',
57
- isvisible: 'get',
58
- isenabled: 'get',
59
- ischecked: 'get',
60
- responsebody: 'get',
61
- route: 'network',
62
- unroute: 'network',
63
- requests: 'network',
64
- state_save: 'state',
65
- state_load: 'state',
66
- cookies_set: 'state',
67
- storage_set: 'state',
68
- credentials: 'state',
69
- hover: 'interact',
70
- focus: 'interact',
71
- drag: 'interact',
72
- press: 'interact',
73
- keydown: 'interact',
74
- keyup: 'interact',
75
- mousemove: 'interact',
76
- mousedown: 'interact',
77
- mouseup: 'interact',
78
- wheel: 'interact',
79
- dispatch: 'interact',
80
- // These are always allowed (internal/meta operations)
81
- launch: '_internal',
82
- close: '_internal',
83
- tab_list: '_internal',
84
- tab_switch: '_internal',
85
- tab_close: '_internal',
86
- window_new: '_internal',
87
- frame: '_internal',
88
- mainframe: '_internal',
89
- dialog: '_internal',
90
- session: '_internal',
91
- console: '_internal',
92
- errors: '_internal',
93
- cookies_get: '_internal',
94
- cookies_clear: '_internal',
95
- storage_get: '_internal',
96
- storage_clear: '_internal',
97
- state_list: '_internal',
98
- state_show: '_internal',
99
- state_clear: '_internal',
100
- state_clean: '_internal',
101
- state_rename: '_internal',
102
- highlight: '_internal',
103
- bringtofront: '_internal',
104
- trace_start: '_internal',
105
- trace_stop: '_internal',
106
- har_start: '_internal',
107
- har_stop: '_internal',
108
- video_start: '_internal',
109
- video_stop: '_internal',
110
- recording_start: '_internal',
111
- recording_stop: '_internal',
112
- recording_restart: '_internal',
113
- profiler_start: '_internal',
114
- profiler_stop: '_internal',
115
- clipboard: '_internal',
116
- viewport: '_internal',
117
- useragent: '_internal',
118
- device: '_internal',
119
- geolocation: '_internal',
120
- permissions: '_internal',
121
- emulatemedia: '_internal',
122
- offline: '_internal',
123
- headers: '_internal',
124
- addstyle: 'eval',
125
- expose: 'eval',
126
- timezone: '_internal',
127
- locale: '_internal',
128
- pause: '_internal',
129
- setcontent: 'eval',
130
- screencast_start: '_internal',
131
- screencast_stop: '_internal',
132
- input_mouse: '_internal',
133
- input_keyboard: '_internal',
134
- input_touch: '_internal',
135
- auth_save: '_internal',
136
- auth_login: '_internal',
137
- auth_list: '_internal',
138
- auth_delete: '_internal',
139
- auth_show: '_internal',
140
- confirm: '_internal',
141
- deny: '_internal',
142
- // Find/semantic locator actions (read-only element resolution)
143
- getbyrole: 'get',
144
- getbytext: 'get',
145
- getbylabel: 'get',
146
- getbyplaceholder: 'get',
147
- getbyalttext: 'get',
148
- getbytitle: 'get',
149
- getbytestid: 'get',
150
- nth: 'get',
151
- };
152
- // User-facing categories used in policy files. '_internal' is excluded because
153
- // internal actions always bypass policy. 'unknown' is intentionally not a value
154
- // in ACTION_CATEGORIES -- it is only the fallback return of getActionCategory()
155
- // for unrecognized actions. If a user puts "unknown" in a policy file,
156
- // loadPolicyFile will warn about it as unrecognized, which is correct.
157
- export const KNOWN_CATEGORIES = new Set(Object.values(ACTION_CATEGORIES).filter((c) => c !== '_internal'));
158
- export function getActionCategory(action) {
159
- return ACTION_CATEGORIES[action] ?? 'unknown';
160
- }
161
- export function loadPolicyFile(policyPath) {
162
- const resolved = resolve(policyPath);
163
- const content = readFileSync(resolved, 'utf-8');
164
- const policy = JSON.parse(content);
165
- if (policy.default !== 'allow' && policy.default !== 'deny') {
166
- throw new Error(`Invalid action policy: "default" must be "allow" or "deny", got "${policy.default}"`);
167
- }
168
- for (const list of [policy.allow, policy.deny]) {
169
- if (!list)
170
- continue;
171
- for (const category of list) {
172
- if (!KNOWN_CATEGORIES.has(category)) {
173
- console.warn(`[agent-browser] Warning: unrecognized action category "${category}" in policy file. ` +
174
- `Known categories: ${[...KNOWN_CATEGORIES].sort().join(', ')}`);
175
- }
176
- }
177
- }
178
- return policy;
179
- }
180
- let cachedPolicyPath = null;
181
- let cachedPolicyMtimeMs = 0;
182
- let cachedPolicy = null;
183
- const RELOAD_CHECK_INTERVAL_MS = 5_000;
184
- let lastCheckMs = 0;
185
- export function initPolicyReloader(policyPath, policy) {
186
- cachedPolicyPath = resolve(policyPath);
187
- cachedPolicyMtimeMs = statSync(cachedPolicyPath).mtimeMs;
188
- cachedPolicy = policy;
189
- }
190
- export function reloadPolicyIfChanged() {
191
- if (!cachedPolicyPath)
192
- return cachedPolicy;
193
- const now = Date.now();
194
- if (now - lastCheckMs < RELOAD_CHECK_INTERVAL_MS)
195
- return cachedPolicy;
196
- lastCheckMs = now;
197
- try {
198
- const currentMtime = statSync(cachedPolicyPath).mtimeMs;
199
- if (currentMtime !== cachedPolicyMtimeMs) {
200
- cachedPolicy = loadPolicyFile(cachedPolicyPath);
201
- cachedPolicyMtimeMs = currentMtime;
202
- }
203
- }
204
- catch {
205
- // File may have been removed; keep using cached policy
206
- }
207
- return cachedPolicy;
208
- }
209
- export function checkPolicy(action, policy, confirmCategories) {
210
- const category = getActionCategory(action);
211
- // Internal actions are always allowed
212
- if (category === '_internal')
213
- return 'allow';
214
- // Explicit deny takes precedence over confirmation
215
- if (policy?.deny?.includes(category))
216
- return 'deny';
217
- // Check if this category requires confirmation
218
- if (confirmCategories.has(category))
219
- return 'confirm';
220
- if (!policy)
221
- return 'allow';
222
- // Explicit allow list
223
- if (policy.allow?.includes(category))
224
- return 'allow';
225
- return policy.default;
226
- }
227
- export function describeAction(action, command) {
228
- const category = getActionCategory(action);
229
- switch (action) {
230
- case 'navigate':
231
- return `Navigate to ${command.url}`;
232
- case 'evaluate':
233
- case 'evalhandle':
234
- return `Evaluate JavaScript: ${String(command.script ?? '').slice(0, 80)}`;
235
- case 'fill':
236
- return `Fill ${command.selector}`;
237
- case 'type':
238
- return `Type into ${command.selector}`;
239
- case 'click':
240
- return `Click ${command.selector}`;
241
- case 'dblclick':
242
- return `Double-click ${command.selector}`;
243
- case 'tap':
244
- return `Tap ${command.selector}`;
245
- case 'download':
246
- return `Download via ${command.selector} to ${command.path}`;
247
- case 'upload':
248
- return `Upload files to ${command.selector}`;
249
- default:
250
- return `${category}: ${action}`;
251
- }
252
- }
253
- //# sourceMappingURL=action-policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action-policy.js","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"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"}
package/dist/actions.d.ts DELETED
@@ -1,21 +0,0 @@
1
- import type { BrowserManager, ScreencastFrame } from './browser.js';
2
- import type { Command, Response, RiskSignal } from './types.js';
3
- /**
4
- * Set the callback for screencast frames
5
- * This is called by the daemon to set up frame streaming
6
- */
7
- export declare function setScreencastFrameCallback(callback: ((frame: ScreencastFrame) => void) | null): void;
8
- /**
9
- * Convert Playwright errors to AI-friendly messages
10
- * @internal Exported for testing
11
- */
12
- export declare function toAIFriendlyError(error: unknown, selector: string): Error;
13
- /**
14
- * Execute a command and return a response
15
- */
16
- export declare function executeCommand(command: Command, browser: BrowserManager): Promise<Response>;
17
- /**
18
- * Detect verification/captcha interstitials and return structured risk evidence.
19
- */
20
- export declare function detectRiskSignals(url: string, title: string, pageText?: string): RiskSignal[];
21
- //# sourceMappingURL=actions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAUpE,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EAoIR,UAAU,EACX,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,GAClD,IAAI,CAEN;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAqDzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyRjG;AA8LD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,UAAU,EAAE,CA2EjG"}