@framers/agentos-ext-browser-automation 0.2.0 → 0.3.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 +91 -0
- package/dist/BrowserService.js +9 -45
- package/dist/BrowserService.js.map +1 -1
- package/dist/attach/AttachController.d.ts +54 -0
- package/dist/attach/AttachController.d.ts.map +1 -1
- package/dist/attach/AttachController.js +129 -41
- package/dist/attach/AttachController.js.map +1 -1
- package/dist/attach/backends/jxa.d.ts.map +1 -1
- package/dist/attach/backends/jxa.js +35 -62
- package/dist/attach/backends/jxa.js.map +1 -1
- package/dist/attach/backends/raw-cdp.d.ts +14 -0
- package/dist/attach/backends/raw-cdp.d.ts.map +1 -1
- package/dist/attach/backends/raw-cdp.js +66 -35
- package/dist/attach/backends/raw-cdp.js.map +1 -1
- package/dist/attach/daemon/client.d.ts +10 -0
- package/dist/attach/daemon/client.d.ts.map +1 -1
- package/dist/attach/daemon/client.js +34 -23
- package/dist/attach/daemon/client.js.map +1 -1
- package/dist/attach/daemon/daemon-lock.js +14 -17
- package/dist/attach/daemon/daemon-lock.js.map +1 -1
- package/dist/attach/daemon/daemon-main.d.ts +11 -0
- package/dist/attach/daemon/daemon-main.d.ts.map +1 -1
- package/dist/attach/daemon/daemon-main.js +39 -18
- package/dist/attach/daemon/daemon-main.js.map +1 -1
- package/dist/attach/daemon/daemon.d.ts.map +1 -1
- package/dist/attach/daemon/daemon.js +49 -32
- package/dist/attach/daemon/daemon.js.map +1 -1
- package/dist/attach/daemon/index.js +7 -25
- package/dist/attach/daemon/index.js.map +1 -1
- package/dist/attach/daemon/protocol.d.ts +1 -1
- package/dist/attach/daemon/protocol.d.ts.map +1 -1
- package/dist/attach/daemon/protocol.js +33 -45
- package/dist/attach/daemon/protocol.js.map +1 -1
- package/dist/attach/daemon/runner.js +1 -4
- package/dist/attach/daemon/runner.js.map +1 -1
- package/dist/attach/daemon/surface.d.ts +5 -0
- package/dist/attach/daemon/surface.d.ts.map +1 -1
- package/dist/attach/daemon/surface.js +16 -14
- package/dist/attach/daemon/surface.js.map +1 -1
- package/dist/attach/devtools-port.js +1 -4
- package/dist/attach/devtools-port.js.map +1 -1
- package/dist/attach/errors.js +4 -9
- package/dist/attach/errors.js.map +1 -1
- package/dist/attach/evidence.d.ts +64 -0
- package/dist/attach/evidence.d.ts.map +1 -0
- package/dist/attach/evidence.js +269 -0
- package/dist/attach/evidence.js.map +1 -0
- package/dist/attach/lease.js +18 -23
- package/dist/attach/lease.js.map +1 -1
- package/dist/attach/singleton-lock.js +1 -4
- package/dist/attach/singleton-lock.js.map +1 -1
- package/dist/attach/state.js +6 -13
- package/dist/attach/state.js.map +1 -1
- package/dist/attach/tools.d.ts +42 -2
- package/dist/attach/tools.d.ts.map +1 -1
- package/dist/attach/tools.js +124 -88
- package/dist/attach/tools.js.map +1 -1
- package/dist/attach/url-policy.js +2 -6
- package/dist/attach/url-policy.js.map +1 -1
- package/dist/attach.js +7 -23
- package/dist/attach.js.map +1 -1
- package/dist/captcha/CaptchaSolver.js +4 -7
- package/dist/captcha/CaptchaSolver.js.map +1 -1
- package/dist/captcha/ICaptchaProvider.js +1 -2
- package/dist/captcha/ICaptchaProvider.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -75
- package/dist/index.js.map +1 -1
- package/dist/proxy/IProxyProvider.js +1 -2
- package/dist/proxy/IProxyProvider.js.map +1 -1
- package/dist/proxy/ProxyManager.js +7 -10
- package/dist/proxy/ProxyManager.js.map +1 -1
- package/dist/tools/ClickTool.js +17 -20
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/EvaluateTool.js +16 -19
- package/dist/tools/EvaluateTool.js.map +1 -1
- package/dist/tools/ExtractTool.js +23 -26
- package/dist/tools/ExtractTool.js.map +1 -1
- package/dist/tools/FillTool.js +17 -20
- package/dist/tools/FillTool.js.map +1 -1
- package/dist/tools/NavigateTool.js +31 -34
- package/dist/tools/NavigateTool.js.map +1 -1
- package/dist/tools/PageSnapshotTool.js +13 -16
- package/dist/tools/PageSnapshotTool.js.map +1 -1
- package/dist/tools/ScreenshotTool.js +16 -19
- package/dist/tools/ScreenshotTool.js.map +1 -1
- package/dist/tools/ScrollTool.js +17 -20
- package/dist/tools/ScrollTool.js.map +1 -1
- package/dist/tools/SessionTool.js +24 -27
- package/dist/tools/SessionTool.js.map +1 -1
- package/dist/tools/WaitTool.js +22 -25
- package/dist/tools/WaitTool.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +5 -4
- package/dist/attach/__tests__/AttachController.test.d.ts +0 -2
- package/dist/attach/__tests__/AttachController.test.d.ts.map +0 -1
- package/dist/attach/__tests__/AttachController.test.js +0 -278
- package/dist/attach/__tests__/AttachController.test.js.map +0 -1
- package/dist/attach/__tests__/attach-primitives.test.d.ts +0 -2
- package/dist/attach/__tests__/attach-primitives.test.d.ts.map +0 -1
- package/dist/attach/__tests__/attach-primitives.test.js +0 -158
- package/dist/attach/__tests__/attach-primitives.test.js.map +0 -1
- package/dist/attach/__tests__/jxa-args.test.d.ts +0 -2
- package/dist/attach/__tests__/jxa-args.test.d.ts.map +0 -1
- package/dist/attach/__tests__/jxa-args.test.js +0 -37
- package/dist/attach/__tests__/jxa-args.test.js.map +0 -1
- package/dist/attach/__tests__/pack-registration.test.d.ts +0 -2
- package/dist/attach/__tests__/pack-registration.test.d.ts.map +0 -1
- package/dist/attach/__tests__/pack-registration.test.js +0 -34
- package/dist/attach/__tests__/pack-registration.test.js.map +0 -1
- package/dist/attach/__tests__/tools.test.d.ts +0 -2
- package/dist/attach/__tests__/tools.test.d.ts.map +0 -1
- package/dist/attach/__tests__/tools.test.js +0 -155
- package/dist/attach/__tests__/tools.test.js.map +0 -1
- package/dist/attach/backends/__tests__/raw-cdp.test.d.ts +0 -2
- package/dist/attach/backends/__tests__/raw-cdp.test.d.ts.map +0 -1
- package/dist/attach/backends/__tests__/raw-cdp.test.js +0 -133
- package/dist/attach/backends/__tests__/raw-cdp.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/client.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/client.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/client.test.js +0 -58
- package/dist/attach/daemon/__tests__/client.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-lock.test.js +0 -72
- package/dist/attach/daemon/__tests__/daemon-lock.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js +0 -102
- package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/harness.d.ts +0 -44
- package/dist/attach/daemon/__tests__/harness.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/harness.js +0 -96
- package/dist/attach/daemon/__tests__/harness.js.map +0 -1
- package/dist/attach/daemon/__tests__/protocol.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/protocol.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/protocol.test.js +0 -71
- package/dist/attach/daemon/__tests__/protocol.test.js.map +0 -1
- package/dist/attach/daemon/__tests__/runner.test.d.ts +0 -2
- package/dist/attach/daemon/__tests__/runner.test.d.ts.map +0 -1
- package/dist/attach/daemon/__tests__/runner.test.js +0 -67
- package/dist/attach/daemon/__tests__/runner.test.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# @framers/agentos-ext-browser-automation
|
|
2
|
+
|
|
3
|
+
Browser automation for AgentOS agents, in two independent lanes:
|
|
4
|
+
|
|
5
|
+
- **Launch lane** — 10 Playwright-backed tools (`browserNavigate`, `browserClick`, `browserFill`, `browserScreenshot`, `browserExtract`, `browserWait`, `browserScroll`, `browserSnapshot`, `browserEvaluate`, `browserSession`) that drive a browser the pack launches and owns. Optional CAPTCHA solving and proxy rotation.
|
|
6
|
+
- **Attach lane** — 7 `browser_attach_*` tools plus a persistent daemon that drive the user's **already-running, logged-in** browser. Opt-in only (`attach.expectedIdentity` required). Never launches a browser.
|
|
7
|
+
|
|
8
|
+
## Attach daemon
|
|
9
|
+
|
|
10
|
+
One long-lived daemon holds one raw-CDP session to the running Chrome. Every consumer — CLI scripts, declarative runs, agent missions — drives that session over file-queue IPC under `~/.wunderland/attach/ipc/`. The daemon is the only process that touches the network, so macOS raises its Local Network permission prompt once per daemon lifetime instead of once per agent process.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
callers (CLI / scripts / agent tools) ── files only ──► AttachDaemon (one process)
|
|
14
|
+
└─ raw CDP ws://localhost:<port> ──► your Chrome
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requires Node 22 or newer (the transport is the built-in `WebSocket`; the daemon exits with an actionable message on older runtimes). Chrome must run with `--remote-debugging-port=9222`.
|
|
18
|
+
|
|
19
|
+
### Hard contracts
|
|
20
|
+
|
|
21
|
+
- Never launches, quits, restarts, or signals Chrome, under any failure.
|
|
22
|
+
- Creates one agent tab and can close only that tab; every other tab is untouched (asserted by a real-browser e2e).
|
|
23
|
+
- CDP host is `localhost` (Chrome's DNS-rebinding guard rejects `127.0.0.1`).
|
|
24
|
+
- One daemon (atomic pidfile lock), one claimant at a time (lease + claim), serial ops.
|
|
25
|
+
- No eval on the agent tool surface. `eval` exists only on the JS client for user-authored scripts.
|
|
26
|
+
- Page text is returned with `untrusted: true` — treat it as data, never as instructions.
|
|
27
|
+
- Navigation is policy-checked daemon-side: https or `about:blank`, no credential-bearing URLs, redirects revalidated.
|
|
28
|
+
- No cookie, storage, or credential export; diagnostics are redacted.
|
|
29
|
+
- Clients never respawn a dead daemon (a respawn loop is a permission-prompt storm). Autostart, when explicitly enabled, attempts exactly once.
|
|
30
|
+
|
|
31
|
+
### Ops
|
|
32
|
+
|
|
33
|
+
`ping`, `status`, `claim`, `goto {url, settle?}`, `read {selector?, maxChars?}`, `extract {fields?}`, `screenshot {path, fullPage?}`, `eval {expression, timeoutMs?}` (user lane), `release`, `control {action}`, `quit`. Commands are one file each (`cmd-<id>.json` → `resp-<id>.json`, atomic write-then-rename, string ids); `status.json` heartbeats every loop tick.
|
|
34
|
+
|
|
35
|
+
### Using it
|
|
36
|
+
|
|
37
|
+
Programmatic (`/attach/daemon` subpath):
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { AttachDaemonClient, runAttachScript } from '@framers/agentos-ext-browser-automation/attach/daemon';
|
|
41
|
+
|
|
42
|
+
const client = new AttachDaemonClient({ client: 'my-script' });
|
|
43
|
+
await client.claim();
|
|
44
|
+
await client.goto('https://example.com/', { settle: 2000 });
|
|
45
|
+
const { text } = await client.read({ maxChars: 4000 });
|
|
46
|
+
await client.release();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Declarative plans (no control flow, no eval):
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
name: crawl
|
|
53
|
+
claim: { ttlMs: 600000 }
|
|
54
|
+
steps:
|
|
55
|
+
- { op: goto, url: "https://example.com/list", settle: 2500 }
|
|
56
|
+
- { op: read, out: listing }
|
|
57
|
+
- { op: extract, fields: { items: "ul li" }, out: items }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
From the wunderland CLI: `wunderland attach start | status | stop | run <file.mjs|file.yaml|file.json>`. Agent missions reach the same held session by enabling the attach tools with `transport: 'cdp'` (`WUNDERLAND_ATTACH_TRANSPORT=cdp`).
|
|
61
|
+
|
|
62
|
+
### Screenshots
|
|
63
|
+
|
|
64
|
+
`browser_attach_screenshot` (and `AttachController.screenshot`) writes a PNG of the agent tab to a new file in the evidence directory, `~/.wunderland/attach-evidence` unless `WUNDERLAND_ATTACH_EVIDENCE_DIR` (or the pack's `attach.evidenceDir` option, for the in-process controller) names another. It needs the CDP transport: the JXA transport has no pixel access and refuses with `UNSUPPORTED_OP`.
|
|
65
|
+
|
|
66
|
+
- `path` is relative to the evidence directory, or an absolute path inside it. A path that leaves the directory, passes through a link, or names a file that exists is refused before anything is captured, and the session stays ready. The file is created with flag `wx`, so no file is ever replaced, and the result gives the path written.
|
|
67
|
+
- The evidence directory is private to the user the session runs as. It and the directories in it are made with mode 0700; one that another user or group can write is refused, and so is one under a directory that another user can change (a sticky directory such as `/tmp` is fine). The directories are checked before the page is captured and again when the file is created, and the image is written only once the new file is found in the directory that was checked.
|
|
68
|
+
- A screenshot holds the session until its file is written: the in-process controller refuses a `goto` or `read` called meanwhile, and the daemon runs its queue one command at a time.
|
|
69
|
+
- `fullPage` captures the scrollable page, each side cut at 16,384 CSS pixels.
|
|
70
|
+
- The tool has side effects (it writes a file), so a deny-side-effects policy gates it.
|
|
71
|
+
|
|
72
|
+
### Environment
|
|
73
|
+
|
|
74
|
+
| Variable | Meaning |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `WUNDERLAND_ATTACH_IDENTITY` | Required. Profile identity the daemon must verify before claiming (e.g. your account email; matched against the identity-probe tab's title/url metadata). |
|
|
77
|
+
| `WUNDERLAND_ATTACH_TRANSPORT` | `jxa` (in-process, macOS AppleScript) or `cdp` (daemon-routed). |
|
|
78
|
+
| `WUNDERLAND_ATTACH_PROFILE_ROOT` | Chrome profile root holding `DevToolsActivePort`. |
|
|
79
|
+
| `WUNDERLAND_ATTACH_PROBE_URL` | Identity-probe URL substring (default `mail.google.com`). |
|
|
80
|
+
| `WUNDERLAND_ATTACH_HOSTS` | Comma-separated https host allowlist for navigation. |
|
|
81
|
+
| `WUNDERLAND_ATTACH_LEASE` | Lease file path override. |
|
|
82
|
+
| `WUNDERLAND_ATTACH_IPC_DIR` | IPC directory override (default `~/.wunderland/attach/ipc`). |
|
|
83
|
+
| `WUNDERLAND_ATTACH_PID_FILE` | Daemon pidfile override (default `~/.wunderland/attach/daemon.pid`). |
|
|
84
|
+
| `WUNDERLAND_ATTACH_AUTOSTART` | `1`/`true`: allow one autostart attempt when the daemon is down. |
|
|
85
|
+
| `WUNDERLAND_ATTACH_DRYRUN` | `1`/`true`: simulate navigation/reads without touching the browser. |
|
|
86
|
+
| `WUNDERLAND_ATTACH_DEADLINE_MS` | Per-operation deadline (default 45000). |
|
|
87
|
+
| `WUNDERLAND_ATTACH_EVIDENCE_DIR` | Where the daemon writes screenshots (default `~/.wunderland/attach-evidence`). A directory only the daemon's user can write. |
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
Apache-2.0
|
package/dist/BrowserService.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// @ts-nocheck
|
|
3
2
|
/**
|
|
4
3
|
* @fileoverview Singleton browser manager wrapping Playwright.
|
|
@@ -6,54 +5,20 @@
|
|
|
6
5
|
* Provides persistent browser context, session storage,
|
|
7
6
|
* auto-screenshot on errors, and page feedback capture.
|
|
8
7
|
*/
|
|
9
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
-
}
|
|
15
|
-
Object.defineProperty(o, k2, desc);
|
|
16
|
-
}) : (function(o, m, k, k2) {
|
|
17
|
-
if (k2 === undefined) k2 = k;
|
|
18
|
-
o[k2] = m[k];
|
|
19
|
-
}));
|
|
20
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
-
}) : function(o, v) {
|
|
23
|
-
o["default"] = v;
|
|
24
|
-
});
|
|
25
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
-
var ownKeys = function(o) {
|
|
27
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
-
var ar = [];
|
|
29
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
-
return ar;
|
|
31
|
-
};
|
|
32
|
-
return ownKeys(o);
|
|
33
|
-
};
|
|
34
|
-
return function (mod) {
|
|
35
|
-
if (mod && mod.__esModule) return mod;
|
|
36
|
-
var result = {};
|
|
37
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
-
__setModuleDefault(result, mod);
|
|
39
|
-
return result;
|
|
40
|
-
};
|
|
41
|
-
})();
|
|
42
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.BrowserService = void 0;
|
|
44
8
|
// ---------------------------------------------------------------------------
|
|
45
9
|
// BrowserService
|
|
46
10
|
// ---------------------------------------------------------------------------
|
|
47
|
-
class BrowserService {
|
|
11
|
+
export class BrowserService {
|
|
12
|
+
browser = null;
|
|
13
|
+
context = null;
|
|
14
|
+
page = null;
|
|
15
|
+
config;
|
|
16
|
+
consoleLogs = [];
|
|
17
|
+
initialized = false;
|
|
48
18
|
constructor(config = {}) {
|
|
49
|
-
this.browser = null;
|
|
50
|
-
this.context = null;
|
|
51
|
-
this.page = null;
|
|
52
|
-
this.consoleLogs = [];
|
|
53
|
-
this.initialized = false;
|
|
54
19
|
this.config = {
|
|
55
20
|
headless: true,
|
|
56
|
-
timeout:
|
|
21
|
+
timeout: 30_000,
|
|
57
22
|
viewport: { width: 1280, height: 720 },
|
|
58
23
|
...config,
|
|
59
24
|
};
|
|
@@ -62,7 +27,7 @@ class BrowserService {
|
|
|
62
27
|
async initialize() {
|
|
63
28
|
if (this.initialized)
|
|
64
29
|
return;
|
|
65
|
-
const { chromium } = await
|
|
30
|
+
const { chromium } = await import('playwright');
|
|
66
31
|
if (this.config.userDataDir) {
|
|
67
32
|
this.context = await chromium.launchPersistentContext(this.config.userDataDir, {
|
|
68
33
|
headless: this.config.headless,
|
|
@@ -328,5 +293,4 @@ class BrowserService {
|
|
|
328
293
|
return this.page;
|
|
329
294
|
}
|
|
330
295
|
}
|
|
331
|
-
exports.BrowserService = BrowserService;
|
|
332
296
|
//# sourceMappingURL=BrowserService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserService.js","sourceRoot":"","sources":["../src/BrowserService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BrowserService.js","sourceRoot":"","sources":["../src/BrowserService.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,13 @@ export interface AttachBackend {
|
|
|
48
48
|
* `UNSUPPORTED_OP` when missing. Never exposed on the agent tool surface.
|
|
49
49
|
*/
|
|
50
50
|
evalInTab?(tab: string, expression: string, timeoutMs?: number): Promise<unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* OPTIONAL: capture a PNG screenshot of the agent tab, returned as base64.
|
|
53
|
+
* CDP-only (`Page.captureScreenshot`); the JXA transport has no pixel access,
|
|
54
|
+
* so callers surface `UNSUPPORTED_OP` when this is absent. Read-only — capture
|
|
55
|
+
* never navigates, focuses, or mutates the page.
|
|
56
|
+
*/
|
|
57
|
+
screenshotTab?(tab: string, fullPage?: boolean): Promise<string>;
|
|
51
58
|
}
|
|
52
59
|
/**
|
|
53
60
|
* What `createAttachTools` needs: satisfied in-process by {@link AttachController}
|
|
@@ -63,6 +70,11 @@ export interface AttachSurface {
|
|
|
63
70
|
pause(): void;
|
|
64
71
|
resume(): void;
|
|
65
72
|
setDryRun(on: boolean): void;
|
|
73
|
+
/** OPTIONAL (CDP transport only): write a PNG of the agent tab to disk. */
|
|
74
|
+
screenshot?(filePath: string, fullPage?: boolean): Promise<{
|
|
75
|
+
path: string;
|
|
76
|
+
bytes: number;
|
|
77
|
+
}>;
|
|
66
78
|
}
|
|
67
79
|
/**
|
|
68
80
|
* Human-in-the-loop navigation decision. Called before every `goto` (after the
|
|
@@ -103,7 +115,16 @@ export interface AttachControllerOptions {
|
|
|
103
115
|
* the goto. Use to require operator approval for each page an assistant opens.
|
|
104
116
|
*/
|
|
105
117
|
onNavigate?: NavigationApprover;
|
|
118
|
+
/**
|
|
119
|
+
* The evidence directory: the one place {@link AttachController.screenshot}
|
|
120
|
+
* writes. Default `~/.wunderland/attach-evidence`. A screenshot path is
|
|
121
|
+
* resolved inside it and refused when it leaves it. The directory must be
|
|
122
|
+
* private to this user, under directories no other user can change (see
|
|
123
|
+
* `evidence.ts`).
|
|
124
|
+
*/
|
|
125
|
+
evidenceDir?: string;
|
|
106
126
|
}
|
|
127
|
+
export { DEFAULT_EVIDENCE_DIR } from './evidence.js';
|
|
107
128
|
/** Status snapshot returned by {@link AttachController.status}. */
|
|
108
129
|
export interface AttachStatus {
|
|
109
130
|
transport: 'cdp' | 'jxa' | 'none';
|
|
@@ -154,6 +175,39 @@ export declare class AttachController {
|
|
|
154
175
|
goto(url: string): Promise<string>;
|
|
155
176
|
/** Read text from the agent tab (size-capped by the backend). */
|
|
156
177
|
read(selector?: string, maxChars?: number): Promise<string>;
|
|
178
|
+
/**
|
|
179
|
+
* Capture a PNG screenshot of the agent tab and write it to a new file in
|
|
180
|
+
* the evidence directory.
|
|
181
|
+
*
|
|
182
|
+
* `filePath` is relative to the evidence directory, or an absolute path
|
|
183
|
+
* inside it. It is refused, before anything is captured, when it leaves the
|
|
184
|
+
* directory, passes through a link, or names a file that exists: the path
|
|
185
|
+
* comes from a tool argument, so it must not reach the rest of the disk or
|
|
186
|
+
* replace a file. `evidence.ts` holds the checks, made before the capture
|
|
187
|
+
* and again around the creation of the file.
|
|
188
|
+
*
|
|
189
|
+
* The operation holds the session from before its first await until the
|
|
190
|
+
* file is written, so a concurrent `goto` or `read` is refused instead of
|
|
191
|
+
* changing the page under the capture. A refused path leaves the session
|
|
192
|
+
* ready, and so does a file that cannot be written once the page is
|
|
193
|
+
* captured; a capture that fails leaves it failed, as a read does.
|
|
194
|
+
*
|
|
195
|
+
* CDP-only: the JXA transport has no pixel access, so a jxa-backed session
|
|
196
|
+
* refuses with `UNSUPPORTED_OP` rather than pretending. Read-only for the
|
|
197
|
+
* browser: capture never navigates, focuses, or mutates the page.
|
|
198
|
+
*
|
|
199
|
+
* @returns The path written, resolved inside the evidence directory, and
|
|
200
|
+
* its size in bytes, for evidence logging.
|
|
201
|
+
*/
|
|
202
|
+
screenshot(filePath: string, fullPage?: boolean): Promise<{
|
|
203
|
+
path: string;
|
|
204
|
+
bytes: number;
|
|
205
|
+
}>;
|
|
206
|
+
/**
|
|
207
|
+
* @throws UNKNOWN when the session is no longer in the `reading` state a
|
|
208
|
+
* screenshot put it in: it was detached while the screenshot awaited.
|
|
209
|
+
*/
|
|
210
|
+
private requireReading;
|
|
157
211
|
/** Fixed, parameterized extraction expression: the selector map is data, never code. */
|
|
158
212
|
private static extractExpression;
|
|
159
213
|
/** The backend's optional eval primitive, or a structured refusal. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachController.d.ts","sourceRoot":"","sources":["../../src/attach/AttachController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAkC,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"AttachController.d.ts","sourceRoot":"","sources":["../../src/attach/AttachController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AttachController = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview AttachController — the one object allowed to touch an attached
|
|
6
3
|
* (user-owned, already-running) browser.
|
|
@@ -23,25 +20,34 @@ exports.AttachController = void 0;
|
|
|
23
20
|
*
|
|
24
21
|
* @module browser-automation/attach/AttachController
|
|
25
22
|
*/
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
import { AttachError, toStructuredError } from './errors.js';
|
|
24
|
+
import { plannedEvidencePath, prepareEvidenceFile, writeEvidenceFile } from './evidence.js';
|
|
25
|
+
import { acquireLease, releaseLease, requireLease } from './lease.js';
|
|
26
|
+
import { AttachStateMachine, withDeadline } from './state.js';
|
|
27
|
+
import { isNavigationAllowed, revalidateRedirect } from './url-policy.js';
|
|
28
|
+
export { DEFAULT_EVIDENCE_DIR } from './evidence.js';
|
|
30
29
|
/**
|
|
31
30
|
* Orchestrates one attach session end to end. One controller instance = one
|
|
32
31
|
* lease = one agent tab.
|
|
33
32
|
*/
|
|
34
|
-
class AttachController {
|
|
33
|
+
export class AttachController {
|
|
34
|
+
backend;
|
|
35
|
+
opts;
|
|
36
|
+
machine = new AttachStateMachine();
|
|
37
|
+
lease;
|
|
38
|
+
tab;
|
|
39
|
+
lastError;
|
|
40
|
+
paused = false;
|
|
41
|
+
dryRun;
|
|
42
|
+
navigations = 0;
|
|
43
|
+
lastUrl;
|
|
35
44
|
constructor(opts) {
|
|
36
|
-
this.machine = new state_js_1.AttachStateMachine();
|
|
37
|
-
this.paused = false;
|
|
38
|
-
this.navigations = 0;
|
|
39
45
|
this.backend = opts.backend;
|
|
40
46
|
this.opts = opts;
|
|
41
47
|
this.dryRun = !!opts.dryRun;
|
|
42
48
|
}
|
|
43
49
|
get deadline() {
|
|
44
|
-
return this.opts.deadlineMs ??
|
|
50
|
+
return this.opts.deadlineMs ?? 45_000;
|
|
45
51
|
}
|
|
46
52
|
/** Non-throwing status snapshot. */
|
|
47
53
|
status() {
|
|
@@ -76,18 +82,18 @@ class AttachController {
|
|
|
76
82
|
async claim() {
|
|
77
83
|
this.machine.to('connecting');
|
|
78
84
|
try {
|
|
79
|
-
this.lease =
|
|
80
|
-
await
|
|
81
|
-
const identity = await
|
|
85
|
+
this.lease = acquireLease({ file: this.opts.leaseFile });
|
|
86
|
+
await withDeadline(this.backend.connect(), this.deadline, 'connect');
|
|
87
|
+
const identity = await withDeadline(this.backend.probeIdentity(), this.deadline, 'probeIdentity');
|
|
82
88
|
if (!identity.includes(this.opts.expectedIdentity)) {
|
|
83
|
-
throw new
|
|
89
|
+
throw new AttachError('PROFILE_MISMATCH', `attached browser did not present the expected profile identity (looked for "${this.opts.expectedIdentity}")`);
|
|
84
90
|
}
|
|
85
|
-
this.tab = await
|
|
91
|
+
this.tab = await withDeadline(this.backend.claimAgentTab(), this.deadline, 'claimAgentTab');
|
|
86
92
|
this.machine.to('ready');
|
|
87
93
|
return this.status();
|
|
88
94
|
}
|
|
89
95
|
catch (err) {
|
|
90
|
-
this.lastError =
|
|
96
|
+
this.lastError = toStructuredError(err);
|
|
91
97
|
this.machine.to('failed');
|
|
92
98
|
await this.safeReleaseOnFailure();
|
|
93
99
|
throw err;
|
|
@@ -96,9 +102,9 @@ class AttachController {
|
|
|
96
102
|
/** Navigate the agent tab (policy-checked, HITL-gated, redirect-revalidated). */
|
|
97
103
|
async goto(url) {
|
|
98
104
|
this.requireReady();
|
|
99
|
-
const verdict =
|
|
105
|
+
const verdict = isNavigationAllowed(url, this.opts.urlPolicy);
|
|
100
106
|
if (!verdict.allowed) {
|
|
101
|
-
throw new
|
|
107
|
+
throw new AttachError('POLICY_BLOCKED', `navigation to "${url}" rejected: ${verdict.reason}`);
|
|
102
108
|
}
|
|
103
109
|
// HITL gate: after the policy passes, an approver may still block the page.
|
|
104
110
|
if (this.opts.onNavigate) {
|
|
@@ -106,10 +112,10 @@ class AttachController {
|
|
|
106
112
|
const approved = typeof decision === 'boolean' ? decision : decision.approved;
|
|
107
113
|
if (!approved) {
|
|
108
114
|
const reason = typeof decision === 'object' && decision.reason ? decision.reason : 'operator denied';
|
|
109
|
-
throw new
|
|
115
|
+
throw new AttachError('POLICY_BLOCKED', `navigation to "${url}" denied by approver: ${reason}`);
|
|
110
116
|
}
|
|
111
117
|
}
|
|
112
|
-
|
|
118
|
+
requireLease(this.opts.leaseFile, this.lease.nonce);
|
|
113
119
|
// Dry-run: report the URL as the landed target without touching the browser.
|
|
114
120
|
if (this.dryRun) {
|
|
115
121
|
this.navigations += 1;
|
|
@@ -118,13 +124,13 @@ class AttachController {
|
|
|
118
124
|
}
|
|
119
125
|
this.machine.to('navigating');
|
|
120
126
|
try {
|
|
121
|
-
const landed = await
|
|
127
|
+
const landed = await withDeadline(this.backend.gotoTab(this.tab, url), this.deadline, 'goto');
|
|
122
128
|
this.navigations += 1;
|
|
123
129
|
this.lastUrl = landed;
|
|
124
|
-
const landedVerdict =
|
|
130
|
+
const landedVerdict = revalidateRedirect(landed, this.opts.urlPolicy);
|
|
125
131
|
if (!landedVerdict.allowed) {
|
|
126
132
|
this.machine.to('ready');
|
|
127
|
-
throw new
|
|
133
|
+
throw new AttachError('POLICY_BLOCKED', `redirect landed on a blocked target: ${landedVerdict.reason}`);
|
|
128
134
|
}
|
|
129
135
|
this.machine.to('ready');
|
|
130
136
|
return landed;
|
|
@@ -132,28 +138,111 @@ class AttachController {
|
|
|
132
138
|
catch (err) {
|
|
133
139
|
if (this.machine.state === 'navigating')
|
|
134
140
|
this.machine.to('failed');
|
|
135
|
-
this.lastError =
|
|
141
|
+
this.lastError = toStructuredError(err);
|
|
136
142
|
throw err;
|
|
137
143
|
}
|
|
138
144
|
}
|
|
139
145
|
/** Read text from the agent tab (size-capped by the backend). */
|
|
140
146
|
async read(selector, maxChars) {
|
|
141
147
|
this.requireReady();
|
|
142
|
-
|
|
148
|
+
requireLease(this.opts.leaseFile, this.lease.nonce);
|
|
143
149
|
if (this.dryRun)
|
|
144
150
|
return '[dry-run] read skipped';
|
|
145
151
|
this.machine.to('reading');
|
|
146
152
|
try {
|
|
147
|
-
const text = await
|
|
153
|
+
const text = await withDeadline(this.backend.readTab(this.tab, selector, maxChars), this.deadline, 'read');
|
|
148
154
|
this.machine.to('ready');
|
|
149
155
|
return text;
|
|
150
156
|
}
|
|
151
157
|
catch (err) {
|
|
152
158
|
if (this.machine.state === 'reading')
|
|
153
159
|
this.machine.to('failed');
|
|
154
|
-
this.lastError =
|
|
160
|
+
this.lastError = toStructuredError(err);
|
|
161
|
+
throw err;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Capture a PNG screenshot of the agent tab and write it to a new file in
|
|
166
|
+
* the evidence directory.
|
|
167
|
+
*
|
|
168
|
+
* `filePath` is relative to the evidence directory, or an absolute path
|
|
169
|
+
* inside it. It is refused, before anything is captured, when it leaves the
|
|
170
|
+
* directory, passes through a link, or names a file that exists: the path
|
|
171
|
+
* comes from a tool argument, so it must not reach the rest of the disk or
|
|
172
|
+
* replace a file. `evidence.ts` holds the checks, made before the capture
|
|
173
|
+
* and again around the creation of the file.
|
|
174
|
+
*
|
|
175
|
+
* The operation holds the session from before its first await until the
|
|
176
|
+
* file is written, so a concurrent `goto` or `read` is refused instead of
|
|
177
|
+
* changing the page under the capture. A refused path leaves the session
|
|
178
|
+
* ready, and so does a file that cannot be written once the page is
|
|
179
|
+
* captured; a capture that fails leaves it failed, as a read does.
|
|
180
|
+
*
|
|
181
|
+
* CDP-only: the JXA transport has no pixel access, so a jxa-backed session
|
|
182
|
+
* refuses with `UNSUPPORTED_OP` rather than pretending. Read-only for the
|
|
183
|
+
* browser: capture never navigates, focuses, or mutates the page.
|
|
184
|
+
*
|
|
185
|
+
* @returns The path written, resolved inside the evidence directory, and
|
|
186
|
+
* its size in bytes, for evidence logging.
|
|
187
|
+
*/
|
|
188
|
+
async screenshot(filePath, fullPage) {
|
|
189
|
+
this.requireReady();
|
|
190
|
+
requireLease(this.opts.leaseFile, this.lease.nonce);
|
|
191
|
+
const fn = this.backend.screenshotTab?.bind(this.backend);
|
|
192
|
+
if (!fn) {
|
|
193
|
+
throw new AttachError('UNSUPPORTED_OP', `${this.backend.kind} backend has no screenshot capability (CDP transport required)`);
|
|
194
|
+
}
|
|
195
|
+
// Dry-run: the path is read and reported; nothing is captured or written.
|
|
196
|
+
if (this.dryRun)
|
|
197
|
+
return { path: await plannedEvidencePath(this.opts.evidenceDir, filePath), bytes: 0 };
|
|
198
|
+
// Reserved here, before the first await.
|
|
199
|
+
this.machine.to('reading');
|
|
200
|
+
let prepared;
|
|
201
|
+
try {
|
|
202
|
+
prepared = await prepareEvidenceFile(this.opts.evidenceDir, filePath);
|
|
203
|
+
this.requireReading();
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
// A refused path asked nothing of the browser: the session is ready again.
|
|
207
|
+
if (this.machine.state === 'reading')
|
|
208
|
+
this.machine.to('ready');
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
let b64;
|
|
212
|
+
try {
|
|
213
|
+
b64 = await withDeadline(fn(this.tab, fullPage), this.deadline, 'screenshot');
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
if (this.machine.state === 'reading')
|
|
217
|
+
this.machine.to('failed');
|
|
218
|
+
this.lastError = toStructuredError(err);
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
// The capture is done: a file that cannot be written fails this call
|
|
222
|
+
// alone and leaves the session ready.
|
|
223
|
+
try {
|
|
224
|
+
this.requireReading();
|
|
225
|
+
const buf = Buffer.from(b64, 'base64');
|
|
226
|
+
await writeEvidenceFile(prepared, buf);
|
|
227
|
+
return { path: prepared.target, bytes: buf.length };
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
this.lastError = toStructuredError(err);
|
|
155
231
|
throw err;
|
|
156
232
|
}
|
|
233
|
+
finally {
|
|
234
|
+
if (this.machine.state === 'reading')
|
|
235
|
+
this.machine.to('ready');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* @throws UNKNOWN when the session is no longer in the `reading` state a
|
|
240
|
+
* screenshot put it in: it was detached while the screenshot awaited.
|
|
241
|
+
*/
|
|
242
|
+
requireReading() {
|
|
243
|
+
if (this.machine.state !== 'reading' || !this.tab || !this.lease) {
|
|
244
|
+
throw new AttachError('UNKNOWN', 'the attach session ended during the screenshot; no file was written');
|
|
245
|
+
}
|
|
157
246
|
}
|
|
158
247
|
/** Fixed, parameterized extraction expression: the selector map is data, never code. */
|
|
159
248
|
static extractExpression(fields) {
|
|
@@ -179,7 +268,7 @@ class AttachController {
|
|
|
179
268
|
requireEval() {
|
|
180
269
|
const fn = this.backend.evalInTab?.bind(this.backend);
|
|
181
270
|
if (!fn) {
|
|
182
|
-
throw new
|
|
271
|
+
throw new AttachError('UNSUPPORTED_OP', `${this.backend.kind} backend has no page-evaluation capability`);
|
|
183
272
|
}
|
|
184
273
|
return fn;
|
|
185
274
|
}
|
|
@@ -192,19 +281,19 @@ class AttachController {
|
|
|
192
281
|
async extract(fields) {
|
|
193
282
|
this.requireReady();
|
|
194
283
|
const evalFn = this.requireEval();
|
|
195
|
-
|
|
284
|
+
requireLease(this.opts.leaseFile, this.lease.nonce);
|
|
196
285
|
if (this.dryRun)
|
|
197
286
|
return { dryRun: true };
|
|
198
287
|
this.machine.to('reading');
|
|
199
288
|
try {
|
|
200
|
-
const out = await
|
|
289
|
+
const out = await withDeadline(evalFn(this.tab, AttachController.extractExpression(fields)), this.deadline, 'extract');
|
|
201
290
|
this.machine.to('ready');
|
|
202
291
|
return out;
|
|
203
292
|
}
|
|
204
293
|
catch (err) {
|
|
205
294
|
if (this.machine.state === 'reading')
|
|
206
295
|
this.machine.to('failed');
|
|
207
|
-
this.lastError =
|
|
296
|
+
this.lastError = toStructuredError(err);
|
|
208
297
|
throw err;
|
|
209
298
|
}
|
|
210
299
|
}
|
|
@@ -216,19 +305,19 @@ class AttachController {
|
|
|
216
305
|
async evaluate(expression, timeoutMs) {
|
|
217
306
|
this.requireReady();
|
|
218
307
|
const evalFn = this.requireEval();
|
|
219
|
-
|
|
308
|
+
requireLease(this.opts.leaseFile, this.lease.nonce);
|
|
220
309
|
if (this.dryRun)
|
|
221
310
|
return '[dry-run] evaluate skipped';
|
|
222
311
|
this.machine.to('reading');
|
|
223
312
|
try {
|
|
224
|
-
const out = await
|
|
313
|
+
const out = await withDeadline(evalFn(this.tab, expression, timeoutMs), Math.max(this.deadline, (timeoutMs ?? 0) + 5_000), 'evaluate');
|
|
225
314
|
this.machine.to('ready');
|
|
226
315
|
return out;
|
|
227
316
|
}
|
|
228
317
|
catch (err) {
|
|
229
318
|
if (this.machine.state === 'reading')
|
|
230
319
|
this.machine.to('failed');
|
|
231
|
-
this.lastError =
|
|
320
|
+
this.lastError = toStructuredError(err);
|
|
232
321
|
throw err;
|
|
233
322
|
}
|
|
234
323
|
}
|
|
@@ -243,7 +332,7 @@ class AttachController {
|
|
|
243
332
|
}
|
|
244
333
|
finally {
|
|
245
334
|
if (this.lease)
|
|
246
|
-
|
|
335
|
+
releaseLease(this.opts.leaseFile, this.lease.nonce);
|
|
247
336
|
this.lease = undefined;
|
|
248
337
|
this.tab = undefined;
|
|
249
338
|
if (this.machine.state !== 'disconnected') {
|
|
@@ -255,10 +344,10 @@ class AttachController {
|
|
|
255
344
|
}
|
|
256
345
|
requireReady() {
|
|
257
346
|
if (this.paused) {
|
|
258
|
-
throw new
|
|
347
|
+
throw new AttachError('UNKNOWN', 'attach session is paused — call resume() before further operations');
|
|
259
348
|
}
|
|
260
349
|
if (this.machine.state !== 'ready' || !this.tab || !this.lease) {
|
|
261
|
-
throw new
|
|
350
|
+
throw new AttachError('UNKNOWN', `attach session not ready (state=${this.machine.state}) — call claim() first`);
|
|
262
351
|
}
|
|
263
352
|
}
|
|
264
353
|
async safeReleaseOnFailure() {
|
|
@@ -270,7 +359,7 @@ class AttachController {
|
|
|
270
359
|
}
|
|
271
360
|
if (this.lease) {
|
|
272
361
|
try {
|
|
273
|
-
|
|
362
|
+
releaseLease(this.opts.leaseFile, this.lease.nonce);
|
|
274
363
|
}
|
|
275
364
|
catch {
|
|
276
365
|
/* foreign lease — leave it */
|
|
@@ -279,5 +368,4 @@ class AttachController {
|
|
|
279
368
|
}
|
|
280
369
|
}
|
|
281
370
|
}
|
|
282
|
-
exports.AttachController = AttachController;
|
|
283
371
|
//# sourceMappingURL=AttachController.js.map
|