@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.
Files changed (143) hide show
  1. package/README.md +91 -0
  2. package/dist/BrowserService.js +9 -45
  3. package/dist/BrowserService.js.map +1 -1
  4. package/dist/attach/AttachController.d.ts +54 -0
  5. package/dist/attach/AttachController.d.ts.map +1 -1
  6. package/dist/attach/AttachController.js +129 -41
  7. package/dist/attach/AttachController.js.map +1 -1
  8. package/dist/attach/backends/jxa.d.ts.map +1 -1
  9. package/dist/attach/backends/jxa.js +35 -62
  10. package/dist/attach/backends/jxa.js.map +1 -1
  11. package/dist/attach/backends/raw-cdp.d.ts +14 -0
  12. package/dist/attach/backends/raw-cdp.d.ts.map +1 -1
  13. package/dist/attach/backends/raw-cdp.js +66 -35
  14. package/dist/attach/backends/raw-cdp.js.map +1 -1
  15. package/dist/attach/daemon/client.d.ts +10 -0
  16. package/dist/attach/daemon/client.d.ts.map +1 -1
  17. package/dist/attach/daemon/client.js +34 -23
  18. package/dist/attach/daemon/client.js.map +1 -1
  19. package/dist/attach/daemon/daemon-lock.js +14 -17
  20. package/dist/attach/daemon/daemon-lock.js.map +1 -1
  21. package/dist/attach/daemon/daemon-main.d.ts +11 -0
  22. package/dist/attach/daemon/daemon-main.d.ts.map +1 -1
  23. package/dist/attach/daemon/daemon-main.js +39 -18
  24. package/dist/attach/daemon/daemon-main.js.map +1 -1
  25. package/dist/attach/daemon/daemon.d.ts.map +1 -1
  26. package/dist/attach/daemon/daemon.js +49 -32
  27. package/dist/attach/daemon/daemon.js.map +1 -1
  28. package/dist/attach/daemon/index.js +7 -25
  29. package/dist/attach/daemon/index.js.map +1 -1
  30. package/dist/attach/daemon/protocol.d.ts +1 -1
  31. package/dist/attach/daemon/protocol.d.ts.map +1 -1
  32. package/dist/attach/daemon/protocol.js +33 -45
  33. package/dist/attach/daemon/protocol.js.map +1 -1
  34. package/dist/attach/daemon/runner.js +1 -4
  35. package/dist/attach/daemon/runner.js.map +1 -1
  36. package/dist/attach/daemon/surface.d.ts +5 -0
  37. package/dist/attach/daemon/surface.d.ts.map +1 -1
  38. package/dist/attach/daemon/surface.js +16 -14
  39. package/dist/attach/daemon/surface.js.map +1 -1
  40. package/dist/attach/devtools-port.js +1 -4
  41. package/dist/attach/devtools-port.js.map +1 -1
  42. package/dist/attach/errors.js +4 -9
  43. package/dist/attach/errors.js.map +1 -1
  44. package/dist/attach/evidence.d.ts +64 -0
  45. package/dist/attach/evidence.d.ts.map +1 -0
  46. package/dist/attach/evidence.js +269 -0
  47. package/dist/attach/evidence.js.map +1 -0
  48. package/dist/attach/lease.js +18 -23
  49. package/dist/attach/lease.js.map +1 -1
  50. package/dist/attach/singleton-lock.js +1 -4
  51. package/dist/attach/singleton-lock.js.map +1 -1
  52. package/dist/attach/state.js +6 -13
  53. package/dist/attach/state.js.map +1 -1
  54. package/dist/attach/tools.d.ts +42 -2
  55. package/dist/attach/tools.d.ts.map +1 -1
  56. package/dist/attach/tools.js +124 -88
  57. package/dist/attach/tools.js.map +1 -1
  58. package/dist/attach/url-policy.js +2 -6
  59. package/dist/attach/url-policy.js.map +1 -1
  60. package/dist/attach.js +7 -23
  61. package/dist/attach.js.map +1 -1
  62. package/dist/captcha/CaptchaSolver.js +4 -7
  63. package/dist/captcha/CaptchaSolver.js.map +1 -1
  64. package/dist/captcha/ICaptchaProvider.js +1 -2
  65. package/dist/captcha/ICaptchaProvider.js.map +1 -1
  66. package/dist/index.d.ts +8 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +56 -75
  69. package/dist/index.js.map +1 -1
  70. package/dist/proxy/IProxyProvider.js +1 -2
  71. package/dist/proxy/IProxyProvider.js.map +1 -1
  72. package/dist/proxy/ProxyManager.js +7 -10
  73. package/dist/proxy/ProxyManager.js.map +1 -1
  74. package/dist/tools/ClickTool.js +17 -20
  75. package/dist/tools/ClickTool.js.map +1 -1
  76. package/dist/tools/EvaluateTool.js +16 -19
  77. package/dist/tools/EvaluateTool.js.map +1 -1
  78. package/dist/tools/ExtractTool.js +23 -26
  79. package/dist/tools/ExtractTool.js.map +1 -1
  80. package/dist/tools/FillTool.js +17 -20
  81. package/dist/tools/FillTool.js.map +1 -1
  82. package/dist/tools/NavigateTool.js +31 -34
  83. package/dist/tools/NavigateTool.js.map +1 -1
  84. package/dist/tools/PageSnapshotTool.js +13 -16
  85. package/dist/tools/PageSnapshotTool.js.map +1 -1
  86. package/dist/tools/ScreenshotTool.js +16 -19
  87. package/dist/tools/ScreenshotTool.js.map +1 -1
  88. package/dist/tools/ScrollTool.js +17 -20
  89. package/dist/tools/ScrollTool.js.map +1 -1
  90. package/dist/tools/SessionTool.js +24 -27
  91. package/dist/tools/SessionTool.js.map +1 -1
  92. package/dist/tools/WaitTool.js +22 -25
  93. package/dist/tools/WaitTool.js.map +1 -1
  94. package/manifest.json +1 -1
  95. package/package.json +5 -4
  96. package/dist/attach/__tests__/AttachController.test.d.ts +0 -2
  97. package/dist/attach/__tests__/AttachController.test.d.ts.map +0 -1
  98. package/dist/attach/__tests__/AttachController.test.js +0 -278
  99. package/dist/attach/__tests__/AttachController.test.js.map +0 -1
  100. package/dist/attach/__tests__/attach-primitives.test.d.ts +0 -2
  101. package/dist/attach/__tests__/attach-primitives.test.d.ts.map +0 -1
  102. package/dist/attach/__tests__/attach-primitives.test.js +0 -158
  103. package/dist/attach/__tests__/attach-primitives.test.js.map +0 -1
  104. package/dist/attach/__tests__/jxa-args.test.d.ts +0 -2
  105. package/dist/attach/__tests__/jxa-args.test.d.ts.map +0 -1
  106. package/dist/attach/__tests__/jxa-args.test.js +0 -37
  107. package/dist/attach/__tests__/jxa-args.test.js.map +0 -1
  108. package/dist/attach/__tests__/pack-registration.test.d.ts +0 -2
  109. package/dist/attach/__tests__/pack-registration.test.d.ts.map +0 -1
  110. package/dist/attach/__tests__/pack-registration.test.js +0 -34
  111. package/dist/attach/__tests__/pack-registration.test.js.map +0 -1
  112. package/dist/attach/__tests__/tools.test.d.ts +0 -2
  113. package/dist/attach/__tests__/tools.test.d.ts.map +0 -1
  114. package/dist/attach/__tests__/tools.test.js +0 -155
  115. package/dist/attach/__tests__/tools.test.js.map +0 -1
  116. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts +0 -2
  117. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts.map +0 -1
  118. package/dist/attach/backends/__tests__/raw-cdp.test.js +0 -133
  119. package/dist/attach/backends/__tests__/raw-cdp.test.js.map +0 -1
  120. package/dist/attach/daemon/__tests__/client.test.d.ts +0 -2
  121. package/dist/attach/daemon/__tests__/client.test.d.ts.map +0 -1
  122. package/dist/attach/daemon/__tests__/client.test.js +0 -58
  123. package/dist/attach/daemon/__tests__/client.test.js.map +0 -1
  124. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts +0 -2
  125. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts.map +0 -1
  126. package/dist/attach/daemon/__tests__/daemon-lock.test.js +0 -72
  127. package/dist/attach/daemon/__tests__/daemon-lock.test.js.map +0 -1
  128. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts +0 -2
  129. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts.map +0 -1
  130. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js +0 -102
  131. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js.map +0 -1
  132. package/dist/attach/daemon/__tests__/harness.d.ts +0 -44
  133. package/dist/attach/daemon/__tests__/harness.d.ts.map +0 -1
  134. package/dist/attach/daemon/__tests__/harness.js +0 -96
  135. package/dist/attach/daemon/__tests__/harness.js.map +0 -1
  136. package/dist/attach/daemon/__tests__/protocol.test.d.ts +0 -2
  137. package/dist/attach/daemon/__tests__/protocol.test.d.ts.map +0 -1
  138. package/dist/attach/daemon/__tests__/protocol.test.js +0 -71
  139. package/dist/attach/daemon/__tests__/protocol.test.js.map +0 -1
  140. package/dist/attach/daemon/__tests__/runner.test.d.ts +0 -2
  141. package/dist/attach/daemon/__tests__/runner.test.d.ts.map +0 -1
  142. package/dist/attach/daemon/__tests__/runner.test.js +0 -67
  143. 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
@@ -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: 30000,
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 Promise.resolve().then(() => __importStar(require('playwright')));
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":"AAAA,cAAc;AACd;;;;;GAKG;AAgFH,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,OAAO,cAAc;IACjB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAA0B,IAAI,CAAC;IACtC,IAAI,GAAgB,IAAI,CAAC;IACzB,MAAM,CAAgB;IACtB,WAAW,GAAa,EAAE,CAAC;IAC3B,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,SAAwB,EAAE;QACpC,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YACtC,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED,kBAAkB;IAElB,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC7E,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;aACjF,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACnC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aAC/B,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;aACjF,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAQ,CAAC,CAAC;QAElD,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG;gBAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAChD,CAAC;IAED,mBAAmB;IAEnB,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEzE,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;YACzB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI;YAClC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC;IACJ,CAAC;IAED,oBAAoB;IAEpB,KAAK,CAAC,KAAK,CAAC,OAA4D;QACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,KAAa;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA0E;QACrF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,sBAAsB,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;QACpC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACtD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,2BAA2B;IAE3B,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAAsC,MAAM,EAAE,SAAkB;QAC9F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,KAAK,WAAW;gBACd,OAAO,MAAM,OAAO,CAAC,YAAY,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAChE;gBACE,OAAO,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED,mBAAmB;IAEnB,KAAK,CAAC,UAAU,CAAC,OAAmD;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,aAAa;IAEb,KAAK,CAAC,IAAI,CAAC,OAAwG;QACjH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;aAClC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,uDAAuD;IAEvD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACnD,MAAM,SAAS,GAAG,8FAA8F,CAAC;YACjH,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,MAAM,GAAU,EAAE,CAAC;YAEzB,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACzB,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC;gBACpG,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAErC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,CAAC;oBACR,GAAG;oBACH,IAAI,EAAG,EAAuB,CAAC,IAAI,IAAI,SAAS;oBAChD,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS;oBAC1C,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACjD,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;oBAC3B,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,SAAS;oBACrD,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,SAAS;oBACxD,SAAS;iBACV,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,SAAS,aAAa,CAAC,EAAW;gBAChC,IAAI,EAAE,CAAC,EAAE;oBAAE,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC;YACxE,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACrC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC9B,MAAM,CAAC,CAAC,EAAE,EAAoE,EAAE,CAC/E,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;qBACtD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACZ,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;oBACtB,IAAI,EAAG,EAAuB,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;oBAC/D,QAAQ,EAAE,EAAE,CAAC,QAAQ;oBACrB,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,SAAS;iBACzD,CAAC,CAAC;aACN,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACrC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/E,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC/C,IAAI,EAAG,CAAuB,CAAC,IAAI;gBACnC,UAAU,EAAE,CAAE,CAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;aACrE,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACpC,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,QAAQ,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACpE,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBACvE,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,GAAG,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACf,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;YACzB,mBAAmB;YACnB,KAAK;YACL,KAAK;YACL,IAAI;SACL,CAAC;IACJ,CAAC;IAED,8BAA8B;IAE9B,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,2BAA2B;IAE3B,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9D,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAkB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAmB;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE9D,cAAc;QACd,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,kCAAkC;QAClC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IAEjB,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,MAAM,SAAS,GAAG;gBAChB,gBAAgB,EAAE,kBAAkB,EAAE,yBAAyB;gBAC/D,qBAAqB,EAAE,kBAAkB;aAC1C,CAAC;YACF,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CACpF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC1C,MAAM,SAAS,GAAG;gBAChB,kBAAkB,EAAE,oBAAoB,EAAE,uBAAuB;gBACjE,cAAc,EAAE,aAAa,EAAE,mBAAmB;aACnD,CAAC;YACF,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CACpF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAC1D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAElD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACpE,CAAC;IAED,cAAc;IAEd,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,mEAAmE;QACnE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;QACjC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,iBAAiB;IAET,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -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":"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"}
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
- const errors_js_1 = require("./errors.js");
27
- const lease_js_1 = require("./lease.js");
28
- const state_js_1 = require("./state.js");
29
- const url_policy_js_1 = require("./url-policy.js");
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 ?? 45000;
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 = (0, lease_js_1.acquireLease)({ file: this.opts.leaseFile });
80
- await (0, state_js_1.withDeadline)(this.backend.connect(), this.deadline, 'connect');
81
- const identity = await (0, state_js_1.withDeadline)(this.backend.probeIdentity(), this.deadline, 'probeIdentity');
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 errors_js_1.AttachError('PROFILE_MISMATCH', `attached browser did not present the expected profile identity (looked for "${this.opts.expectedIdentity}")`);
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 (0, state_js_1.withDeadline)(this.backend.claimAgentTab(), this.deadline, 'claimAgentTab');
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 = (0, errors_js_1.toStructuredError)(err);
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 = (0, url_policy_js_1.isNavigationAllowed)(url, this.opts.urlPolicy);
105
+ const verdict = isNavigationAllowed(url, this.opts.urlPolicy);
100
106
  if (!verdict.allowed) {
101
- throw new errors_js_1.AttachError('POLICY_BLOCKED', `navigation to "${url}" rejected: ${verdict.reason}`);
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 errors_js_1.AttachError('POLICY_BLOCKED', `navigation to "${url}" denied by approver: ${reason}`);
115
+ throw new AttachError('POLICY_BLOCKED', `navigation to "${url}" denied by approver: ${reason}`);
110
116
  }
111
117
  }
112
- (0, lease_js_1.requireLease)(this.opts.leaseFile, this.lease.nonce);
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 (0, state_js_1.withDeadline)(this.backend.gotoTab(this.tab, url), this.deadline, 'goto');
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 = (0, url_policy_js_1.revalidateRedirect)(landed, this.opts.urlPolicy);
130
+ const landedVerdict = revalidateRedirect(landed, this.opts.urlPolicy);
125
131
  if (!landedVerdict.allowed) {
126
132
  this.machine.to('ready');
127
- throw new errors_js_1.AttachError('POLICY_BLOCKED', `redirect landed on a blocked target: ${landedVerdict.reason}`);
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 = (0, errors_js_1.toStructuredError)(err);
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
- (0, lease_js_1.requireLease)(this.opts.leaseFile, this.lease.nonce);
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 (0, state_js_1.withDeadline)(this.backend.readTab(this.tab, selector, maxChars), this.deadline, 'read');
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 = (0, errors_js_1.toStructuredError)(err);
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 errors_js_1.AttachError('UNSUPPORTED_OP', `${this.backend.kind} backend has no page-evaluation capability`);
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
- (0, lease_js_1.requireLease)(this.opts.leaseFile, this.lease.nonce);
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 (0, state_js_1.withDeadline)(evalFn(this.tab, AttachController.extractExpression(fields)), this.deadline, 'extract');
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 = (0, errors_js_1.toStructuredError)(err);
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
- (0, lease_js_1.requireLease)(this.opts.leaseFile, this.lease.nonce);
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 (0, state_js_1.withDeadline)(evalFn(this.tab, expression, timeoutMs), Math.max(this.deadline, (timeoutMs ?? 0) + 5000), 'evaluate');
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 = (0, errors_js_1.toStructuredError)(err);
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
- (0, lease_js_1.releaseLease)(this.opts.leaseFile, this.lease.nonce);
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 errors_js_1.AttachError('UNKNOWN', 'attach session is paused — call resume() before further operations');
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 errors_js_1.AttachError('UNKNOWN', `attach session not ready (state=${this.machine.state}) — call claim() first`);
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
- (0, lease_js_1.releaseLease)(this.opts.leaseFile, this.lease.nonce);
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