@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
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AttachDaemonClient = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Typed client for the attach daemon's file queue.
|
|
6
3
|
*
|
|
@@ -15,28 +12,34 @@ exports.AttachDaemonClient = void 0;
|
|
|
15
12
|
*
|
|
16
13
|
* @module browser-automation/attach/daemon/client
|
|
17
14
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
import { unlinkSync, existsSync } from 'node:fs';
|
|
16
|
+
import { AttachError } from '../errors.js';
|
|
17
|
+
import { resolveIpcDir, newCmdId, writeAtomicJson, readJson, cmdPath, respPath, statusPath, HEARTBEAT_STALE_MS, } from './protocol.js';
|
|
21
18
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
19
|
+
/** What a screenshot's answer may take beyond the operation timeout: preparing and writing its file. */
|
|
20
|
+
const SCREENSHOT_WRITE_MARGIN_MS = 15_000;
|
|
22
21
|
/** See fileoverview. All failures throw {@link AttachError} with a structured code. */
|
|
23
|
-
class AttachDaemonClient {
|
|
22
|
+
export class AttachDaemonClient {
|
|
23
|
+
ipcDir;
|
|
24
|
+
client;
|
|
25
|
+
pollMs;
|
|
26
|
+
opTimeoutMs;
|
|
24
27
|
constructor(opts = {}) {
|
|
25
|
-
this.ipcDir =
|
|
28
|
+
this.ipcDir = resolveIpcDir(opts.ipcDir);
|
|
26
29
|
this.client = `${opts.client ?? 'client'}-${process.pid}`;
|
|
27
30
|
this.pollMs = opts.pollMs ?? 400;
|
|
28
|
-
this.opTimeoutMs = opts.opTimeoutMs ??
|
|
31
|
+
this.opTimeoutMs = opts.opTimeoutMs ?? 45_000;
|
|
29
32
|
}
|
|
30
33
|
/** Fast, round-trip-free snapshot of status.json (undefined when absent). */
|
|
31
34
|
statusFile() {
|
|
32
|
-
return
|
|
35
|
+
return readJson(statusPath(this.ipcDir));
|
|
33
36
|
}
|
|
34
37
|
/** True when status.json shows a fresh heartbeat or a live recorded pid. */
|
|
35
38
|
daemonLooksAlive() {
|
|
36
39
|
const s = this.statusFile();
|
|
37
40
|
if (!s || s.state === 'stopped' || s.state === 'failed')
|
|
38
41
|
return false;
|
|
39
|
-
if (Date.now() - s.t <=
|
|
42
|
+
if (Date.now() - s.t <= HEARTBEAT_STALE_MS)
|
|
40
43
|
return true;
|
|
41
44
|
try {
|
|
42
45
|
process.kill(s.pid, 0);
|
|
@@ -72,7 +75,16 @@ class AttachDaemonClient {
|
|
|
72
75
|
}
|
|
73
76
|
/** USER LANE ONLY: arbitrary page evaluation for user-authored scripts. */
|
|
74
77
|
async evaluate(expression, timeoutMs) {
|
|
75
|
-
return (await this.request('eval', { expression, timeoutMs }, this.opTimeoutMs + (timeoutMs ??
|
|
78
|
+
return (await this.request('eval', { expression, timeoutMs }, this.opTimeoutMs + (timeoutMs ?? 30_000)));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Capture a PNG of the agent tab to `path`, inside the daemon's evidence
|
|
82
|
+
* directory (CDP transport only). The daemon's operation deadline bounds
|
|
83
|
+
* the capture, so the answer is awaited for this client's operation
|
|
84
|
+
* timeout (`opTimeoutMs`) plus a margin for the file.
|
|
85
|
+
*/
|
|
86
|
+
async screenshot(path, fullPage) {
|
|
87
|
+
return (await this.request('screenshot', { path, fullPage: !!fullPage }, this.opTimeoutMs + SCREENSHOT_WRITE_MARGIN_MS));
|
|
76
88
|
}
|
|
77
89
|
/** Give up driving rights (daemon parks the tab; its session persists). */
|
|
78
90
|
async release() {
|
|
@@ -88,33 +100,32 @@ class AttachDaemonClient {
|
|
|
88
100
|
}
|
|
89
101
|
async request(op, args = {}, timeoutMs) {
|
|
90
102
|
if (!this.daemonLooksAlive()) {
|
|
91
|
-
throw new
|
|
103
|
+
throw new AttachError('DAEMON_UNAVAILABLE', 'no live attach daemon behind this IPC dir; run `wunderland attach start`');
|
|
92
104
|
}
|
|
93
|
-
const id =
|
|
94
|
-
const cmdFile =
|
|
95
|
-
const respFile =
|
|
96
|
-
|
|
105
|
+
const id = newCmdId(this.client);
|
|
106
|
+
const cmdFile = cmdPath(this.ipcDir, id);
|
|
107
|
+
const respFile = respPath(this.ipcDir, id);
|
|
108
|
+
writeAtomicJson(cmdFile, { id, client: this.client, op, args });
|
|
97
109
|
const deadline = Date.now() + (timeoutMs ?? this.opTimeoutMs);
|
|
98
110
|
while (Date.now() < deadline) {
|
|
99
111
|
await sleep(this.pollMs);
|
|
100
|
-
const resp =
|
|
112
|
+
const resp = readJson(respFile);
|
|
101
113
|
if (!resp)
|
|
102
114
|
continue;
|
|
103
115
|
try {
|
|
104
|
-
|
|
116
|
+
unlinkSync(respFile);
|
|
105
117
|
}
|
|
106
118
|
catch {
|
|
107
119
|
/* raced with GC */
|
|
108
120
|
}
|
|
109
121
|
if (resp.ok)
|
|
110
122
|
return resp.data;
|
|
111
|
-
throw new
|
|
123
|
+
throw new AttachError(resp.error.code, resp.error.message);
|
|
112
124
|
}
|
|
113
|
-
const consumed = !
|
|
114
|
-
throw new
|
|
125
|
+
const consumed = !existsSync(cmdFile);
|
|
126
|
+
throw new AttachError(consumed ? 'CDP_TIMEOUT' : 'DAEMON_UNAVAILABLE', consumed
|
|
115
127
|
? `${op} timed out awaiting the daemon's response`
|
|
116
128
|
: `${op} was never consumed — daemon gone; run \`wunderland attach start\``);
|
|
117
129
|
}
|
|
118
130
|
}
|
|
119
|
-
exports.AttachDaemonClient = AttachDaemonClient;
|
|
120
131
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/attach/daemon/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/attach/daemon/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.acquireDaemonLock = acquireDaemonLock;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Atomic daemon singleton via an O_EXCL pidfile.
|
|
6
3
|
*
|
|
@@ -16,9 +13,9 @@ exports.acquireDaemonLock = acquireDaemonLock;
|
|
|
16
13
|
*
|
|
17
14
|
* @module browser-automation/attach/daemon/daemon-lock
|
|
18
15
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
import { openSync, writeSync, closeSync, readFileSync, unlinkSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import { dirname } from 'node:path';
|
|
18
|
+
import { AttachError } from '../errors.js';
|
|
22
19
|
/** True when `pid` refers to a live process we may signal (EPERM counts as alive). */
|
|
23
20
|
function pidAlive(pid) {
|
|
24
21
|
try {
|
|
@@ -39,21 +36,21 @@ function pidAlive(pid) {
|
|
|
39
36
|
*
|
|
40
37
|
* @throws {AttachError} `DAEMON_RUNNING` when another live daemon holds the lock.
|
|
41
38
|
*/
|
|
42
|
-
function acquireDaemonLock(pidFile) {
|
|
43
|
-
|
|
39
|
+
export function acquireDaemonLock(pidFile) {
|
|
40
|
+
mkdirSync(dirname(pidFile), { recursive: true, mode: 0o700 });
|
|
44
41
|
const body = { pid: process.pid, startedAt: Date.now() };
|
|
45
42
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
46
43
|
try {
|
|
47
|
-
const fd =
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
const fd = openSync(pidFile, 'wx', 0o600);
|
|
45
|
+
writeSync(fd, JSON.stringify(body));
|
|
46
|
+
closeSync(fd);
|
|
50
47
|
return {
|
|
51
48
|
pidFile,
|
|
52
49
|
release() {
|
|
53
50
|
try {
|
|
54
|
-
const cur = JSON.parse(
|
|
51
|
+
const cur = JSON.parse(readFileSync(pidFile, 'utf8'));
|
|
55
52
|
if (cur.pid === process.pid)
|
|
56
|
-
|
|
53
|
+
unlinkSync(pidFile);
|
|
57
54
|
}
|
|
58
55
|
catch {
|
|
59
56
|
/* released best-effort: file gone or owned by a newer daemon */
|
|
@@ -66,22 +63,22 @@ function acquireDaemonLock(pidFile) {
|
|
|
66
63
|
throw err;
|
|
67
64
|
let holder;
|
|
68
65
|
try {
|
|
69
|
-
holder = JSON.parse(
|
|
66
|
+
holder = JSON.parse(readFileSync(pidFile, 'utf8'));
|
|
70
67
|
}
|
|
71
68
|
catch {
|
|
72
69
|
/* torn or unreadable body: treat as reclaimable */
|
|
73
70
|
}
|
|
74
71
|
if (holder && pidAlive(holder.pid)) {
|
|
75
|
-
throw new
|
|
72
|
+
throw new AttachError('DAEMON_RUNNING', `daemon already running (pid ${holder.pid})`);
|
|
76
73
|
}
|
|
77
74
|
try {
|
|
78
|
-
|
|
75
|
+
unlinkSync(pidFile);
|
|
79
76
|
}
|
|
80
77
|
catch {
|
|
81
78
|
/* raced with another reclaimer; the retry create decides the winner */
|
|
82
79
|
}
|
|
83
80
|
}
|
|
84
81
|
}
|
|
85
|
-
throw new
|
|
82
|
+
throw new AttachError('DAEMON_RUNNING', 'daemon lock contention: another process reclaimed the pidfile first');
|
|
86
83
|
}
|
|
87
84
|
//# sourceMappingURL=daemon-lock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-lock.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-lock.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB3C,sFAAsF;AACtF,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAa,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACnE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,OAAO;gBACL,OAAO;gBACP,OAAO;oBACL,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAa,CAAC;wBAClE,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;4BAAE,UAAU,CAAC,OAAO,CAAC,CAAC;oBACnD,CAAC;oBAAC,MAAM,CAAC;wBACP,gEAAgE;oBAClE,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,MAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAa,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;YACD,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,+BAA+B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,CAAC;gBACH,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,qEAAqE,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -3,4 +3,15 @@
|
|
|
3
3
|
* code (0 clean stop, 2 failure). Exported for tests and for the CLI.
|
|
4
4
|
*/
|
|
5
5
|
export declare function main(env?: Record<string, string | undefined>): Promise<number>;
|
|
6
|
+
/**
|
|
7
|
+
* True when `moduleUrl` is the script Node was started with (`node <entryPath>`).
|
|
8
|
+
*
|
|
9
|
+
* Both sides resolve to a real path before the comparison: a file URL
|
|
10
|
+
* percent-encodes characters such as spaces, Node follows symlinks when it
|
|
11
|
+
* builds `import.meta.url` for the entry script but keeps them under
|
|
12
|
+
* `--preserve-symlinks-main`, and the entry path may be relative. A missing
|
|
13
|
+
* or unreadable entry path, or a module URL that is not a file, is not this
|
|
14
|
+
* module. Exported for tests.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isEntryPoint(moduleUrl: string, entryPath: string | undefined): boolean;
|
|
6
17
|
//# sourceMappingURL=daemon-main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-main.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-main.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAsB,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOtF"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.main = main;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview Runnable attach-daemon entry: `node .../daemon-main.js`.
|
|
6
3
|
*
|
|
@@ -11,20 +8,22 @@ exports.main = main;
|
|
|
11
8
|
*
|
|
12
9
|
* @module browser-automation/attach/daemon/daemon-main
|
|
13
10
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
import { realpathSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { AttachController } from '../AttachController.js';
|
|
16
|
+
import { RawCdpBackend } from '../backends/raw-cdp.js';
|
|
17
|
+
import { AttachDaemon } from './daemon.js';
|
|
18
|
+
import { resolveIpcDir, statusPath, writeAtomicJson, DEFAULT_PID_FILE } from './protocol.js';
|
|
20
19
|
/**
|
|
21
20
|
* Build and run the daemon from an environment map. Returns the process exit
|
|
22
21
|
* code (0 clean stop, 2 failure). Exported for tests and for the CLI.
|
|
23
22
|
*/
|
|
24
|
-
async function main(env = process.env) {
|
|
25
|
-
const ipcDir =
|
|
23
|
+
export async function main(env = process.env) {
|
|
24
|
+
const ipcDir = resolveIpcDir(undefined, env);
|
|
26
25
|
const fail = (msg) => {
|
|
27
|
-
|
|
26
|
+
writeAtomicJson(statusPath(ipcDir), { t: Date.now(), pid: process.pid, state: 'failed', lastError: msg });
|
|
28
27
|
console.error(`attach daemon: ${msg}`);
|
|
29
28
|
return 2;
|
|
30
29
|
};
|
|
@@ -37,7 +36,7 @@ async function main(env = process.env) {
|
|
|
37
36
|
if (!expectedIdentity) {
|
|
38
37
|
return fail('WUNDERLAND_ATTACH_IDENTITY is required (the profile identity the daemon must verify)');
|
|
39
38
|
}
|
|
40
|
-
const backend = new
|
|
39
|
+
const backend = new RawCdpBackend({
|
|
41
40
|
profileRoot: env.WUNDERLAND_ATTACH_PROFILE_ROOT?.trim() || undefined,
|
|
42
41
|
identityProbeUrl: env.WUNDERLAND_ATTACH_PROBE_URL?.trim() || undefined,
|
|
43
42
|
settleMs: 0, // settle is applied daemon-side per goto op (default 1800ms)
|
|
@@ -46,21 +45,23 @@ async function main(env = process.env) {
|
|
|
46
45
|
.map((s) => s.trim())
|
|
47
46
|
.filter(Boolean);
|
|
48
47
|
const deadlineMs = Number(env.WUNDERLAND_ATTACH_DEADLINE_MS);
|
|
49
|
-
const controller = new
|
|
48
|
+
const controller = new AttachController({
|
|
50
49
|
backend,
|
|
51
50
|
// Mirrors the pack default in src/index.ts so CLI-started and pack-embedded
|
|
52
51
|
// sessions contend on the SAME lease file.
|
|
53
|
-
leaseFile: env.WUNDERLAND_ATTACH_LEASE?.trim() ||
|
|
52
|
+
leaseFile: env.WUNDERLAND_ATTACH_LEASE?.trim() || join(homedir(), '.wunderland', 'attach.lease'),
|
|
54
53
|
expectedIdentity,
|
|
55
54
|
urlPolicy: allowHosts?.length ? { allowHosts } : undefined,
|
|
56
55
|
dryRun: env.WUNDERLAND_ATTACH_DRYRUN === '1' || env.WUNDERLAND_ATTACH_DRYRUN === 'true',
|
|
57
56
|
deadlineMs: Number.isFinite(deadlineMs) && deadlineMs > 0 ? deadlineMs : undefined,
|
|
57
|
+
// Where screenshots are written; the controller's default is ~/.wunderland/attach-evidence.
|
|
58
|
+
evidenceDir: env.WUNDERLAND_ATTACH_EVIDENCE_DIR?.trim() || undefined,
|
|
58
59
|
});
|
|
59
|
-
const daemon = new
|
|
60
|
+
const daemon = new AttachDaemon({
|
|
60
61
|
controller,
|
|
61
62
|
backend,
|
|
62
63
|
ipcDir,
|
|
63
|
-
pidFile: env.WUNDERLAND_ATTACH_PID_FILE?.trim() ||
|
|
64
|
+
pidFile: env.WUNDERLAND_ATTACH_PID_FILE?.trim() || DEFAULT_PID_FILE,
|
|
64
65
|
log: (line) => console.error(`[attach-daemon] ${line}`),
|
|
65
66
|
});
|
|
66
67
|
process.on('SIGTERM', () => daemon.requestStop('SIGTERM'));
|
|
@@ -73,8 +74,28 @@ async function main(env = process.env) {
|
|
|
73
74
|
return fail(err.message);
|
|
74
75
|
}
|
|
75
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* True when `moduleUrl` is the script Node was started with (`node <entryPath>`).
|
|
79
|
+
*
|
|
80
|
+
* Both sides resolve to a real path before the comparison: a file URL
|
|
81
|
+
* percent-encodes characters such as spaces, Node follows symlinks when it
|
|
82
|
+
* builds `import.meta.url` for the entry script but keeps them under
|
|
83
|
+
* `--preserve-symlinks-main`, and the entry path may be relative. A missing
|
|
84
|
+
* or unreadable entry path, or a module URL that is not a file, is not this
|
|
85
|
+
* module. Exported for tests.
|
|
86
|
+
*/
|
|
87
|
+
export function isEntryPoint(moduleUrl, entryPath) {
|
|
88
|
+
if (!entryPath)
|
|
89
|
+
return false;
|
|
90
|
+
try {
|
|
91
|
+
return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(entryPath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
76
97
|
// Invoked directly (not imported): run and exit with the returned code.
|
|
77
|
-
if (
|
|
98
|
+
if (isEntryPoint(import.meta.url, process.argv[1])) {
|
|
78
99
|
void main().then((code) => process.exit(code));
|
|
79
100
|
}
|
|
80
101
|
//# sourceMappingURL=daemon-main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-main.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-main.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAgB9E,2BAA2B;AAC3B,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,8FAA8F;IAC9F,OAAO,EAAE,aAAa,GAAG;QAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAQD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAE7C,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAqE;IACrF,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,IAAI,EAAE,mBAAmB;IAUrC,kDAAkD;IAClD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKjC,6EAA6E;IACvE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD1B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;YAOT,OAAO;YA+FP,QAAQ;CAgBvB"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AttachDaemon = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @fileoverview The attach daemon: one process, one controller, one held session.
|
|
6
3
|
*
|
|
@@ -20,35 +17,44 @@ exports.AttachDaemon = void 0;
|
|
|
20
17
|
*
|
|
21
18
|
* @module browser-automation/attach/daemon/daemon
|
|
22
19
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
import { unlinkSync } from 'node:fs';
|
|
21
|
+
import { AttachError, redactDiagnostic, toStructuredError } from '../errors.js';
|
|
22
|
+
import { acquireDaemonLock } from './daemon-lock.js';
|
|
23
|
+
import { resolveIpcDir, writeAtomicJson, readJson, listPendingCmds, gcStale, respPath, statusPath, } from './protocol.js';
|
|
27
24
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
28
|
-
const BACKOFF_START_MS =
|
|
29
|
-
const BACKOFF_CAP_MS =
|
|
25
|
+
const BACKOFF_START_MS = 5_000;
|
|
26
|
+
const BACKOFF_CAP_MS = 60_000;
|
|
30
27
|
/** Loop ticks between periodic GC passes (~35s at the default tick). */
|
|
31
28
|
const GC_EVERY_TICKS = 100;
|
|
32
29
|
/**
|
|
33
30
|
* See fileoverview. `run()` resolves after a `quit` op or {@link requestStop}.
|
|
34
31
|
* Never launches, quits, or signals Chrome under any failure.
|
|
35
32
|
*/
|
|
36
|
-
class AttachDaemon {
|
|
33
|
+
export class AttachDaemon {
|
|
34
|
+
controller;
|
|
35
|
+
backend;
|
|
36
|
+
ipcDir;
|
|
37
|
+
pidFile;
|
|
38
|
+
pollMs;
|
|
39
|
+
claimTtlMs;
|
|
40
|
+
log;
|
|
41
|
+
lock = null;
|
|
42
|
+
state = 'starting';
|
|
43
|
+
lastError;
|
|
44
|
+
identity;
|
|
45
|
+
claimant = null;
|
|
46
|
+
controllerClaimed = false;
|
|
47
|
+
stopRequested = false;
|
|
48
|
+
reconnectAt = 0;
|
|
49
|
+
backoffMs = BACKOFF_START_MS;
|
|
50
|
+
gcCountdown = GC_EVERY_TICKS;
|
|
37
51
|
constructor(opts) {
|
|
38
|
-
this.lock = null;
|
|
39
|
-
this.state = 'starting';
|
|
40
|
-
this.claimant = null;
|
|
41
|
-
this.controllerClaimed = false;
|
|
42
|
-
this.stopRequested = false;
|
|
43
|
-
this.reconnectAt = 0;
|
|
44
|
-
this.backoffMs = BACKOFF_START_MS;
|
|
45
|
-
this.gcCountdown = GC_EVERY_TICKS;
|
|
46
52
|
this.controller = opts.controller;
|
|
47
53
|
this.backend = opts.backend;
|
|
48
54
|
this.ipcDir = opts.ipcDir;
|
|
49
55
|
this.pidFile = opts.pidFile;
|
|
50
56
|
this.pollMs = opts.pollMs ?? 350;
|
|
51
|
-
this.claimTtlMs = opts.claimTtlMs ??
|
|
57
|
+
this.claimTtlMs = opts.claimTtlMs ?? 600_000;
|
|
52
58
|
this.log = opts.log ?? (() => { });
|
|
53
59
|
}
|
|
54
60
|
/** External stop (signal handlers route here). */
|
|
@@ -58,11 +64,15 @@ class AttachDaemon {
|
|
|
58
64
|
}
|
|
59
65
|
/** Acquire the singleton, open the transport, serve the queue until quit. */
|
|
60
66
|
async run() {
|
|
61
|
-
|
|
67
|
+
// Own the IPC dir: created here (0700) so embedders passing a raw path get
|
|
68
|
+
// a working daemon, and so the dir + a 'connecting' status.json both exist
|
|
69
|
+
// before run()'s first await returns control to the caller.
|
|
70
|
+
resolveIpcDir(this.ipcDir);
|
|
71
|
+
this.lock = acquireDaemonLock(this.pidFile);
|
|
62
72
|
try {
|
|
63
73
|
this.setState('connecting');
|
|
64
74
|
this.backend.onUnexpectedClose = (err) => {
|
|
65
|
-
this.setState('degraded',
|
|
75
|
+
this.setState('degraded', redactDiagnostic(err.message));
|
|
66
76
|
this.controllerClaimed = false;
|
|
67
77
|
this.claimant = null;
|
|
68
78
|
this.reconnectAt = Date.now() + this.backoffMs;
|
|
@@ -75,13 +85,13 @@ class AttachDaemon {
|
|
|
75
85
|
this.expireClaimant();
|
|
76
86
|
this.maybeReconnect();
|
|
77
87
|
if (--this.gcCountdown <= 0) {
|
|
78
|
-
|
|
88
|
+
gcStale(this.ipcDir);
|
|
79
89
|
this.gcCountdown = GC_EVERY_TICKS;
|
|
80
90
|
}
|
|
81
|
-
for (const pending of
|
|
82
|
-
const cmd =
|
|
91
|
+
for (const pending of listPendingCmds(this.ipcDir)) {
|
|
92
|
+
const cmd = readJson(pending.path);
|
|
83
93
|
try {
|
|
84
|
-
|
|
94
|
+
unlinkSync(pending.path);
|
|
85
95
|
}
|
|
86
96
|
catch {
|
|
87
97
|
/* consumed by a GC race */
|
|
@@ -91,7 +101,7 @@ class AttachDaemon {
|
|
|
91
101
|
continue;
|
|
92
102
|
}
|
|
93
103
|
const resp = await this.execute(cmd);
|
|
94
|
-
|
|
104
|
+
writeAtomicJson(respPath(this.ipcDir, cmd.id), resp);
|
|
95
105
|
if (cmd.op === 'quit' && resp.ok) {
|
|
96
106
|
this.stopRequested = true;
|
|
97
107
|
break;
|
|
@@ -112,7 +122,7 @@ class AttachDaemon {
|
|
|
112
122
|
}
|
|
113
123
|
heartbeat() {
|
|
114
124
|
const cs = this.controller.status();
|
|
115
|
-
|
|
125
|
+
writeAtomicJson(statusPath(this.ipcDir), {
|
|
116
126
|
t: Date.now(),
|
|
117
127
|
pid: process.pid,
|
|
118
128
|
state: this.state,
|
|
@@ -152,7 +162,7 @@ class AttachDaemon {
|
|
|
152
162
|
}
|
|
153
163
|
requireClaimant(cmd) {
|
|
154
164
|
if (!this.claimant || this.claimant.client !== cmd.client) {
|
|
155
|
-
throw new
|
|
165
|
+
throw new AttachError('NOT_CLAIMANT', 'no active claim for this client; send claim first');
|
|
156
166
|
}
|
|
157
167
|
this.claimant.expiresAt = Date.now() + this.claimant.ttlMs; // activity extends the ttl
|
|
158
168
|
}
|
|
@@ -176,7 +186,7 @@ class AttachDaemon {
|
|
|
176
186
|
};
|
|
177
187
|
case 'claim': {
|
|
178
188
|
if (this.claimant && this.claimant.client !== cmd.client) {
|
|
179
|
-
throw new
|
|
189
|
+
throw new AttachError('LEASE_DENIED', `claimed by ${this.claimant.client}`);
|
|
180
190
|
}
|
|
181
191
|
if (!this.controllerClaimed) {
|
|
182
192
|
await this.controller.claim();
|
|
@@ -205,6 +215,14 @@ class AttachDaemon {
|
|
|
205
215
|
const data = await this.controller.extract(a.fields);
|
|
206
216
|
return { ...base, ok: true, data: { untrusted: true, data } };
|
|
207
217
|
}
|
|
218
|
+
case 'screenshot': {
|
|
219
|
+
this.requireClaimant(cmd);
|
|
220
|
+
if (typeof a.path !== 'string' || !a.path) {
|
|
221
|
+
return { ...base, ok: false, error: { code: 'UNKNOWN', message: 'screenshot requires a path' } };
|
|
222
|
+
}
|
|
223
|
+
const shot = await this.controller.screenshot(a.path, a.fullPage === true);
|
|
224
|
+
return { ...base, ok: true, data: shot };
|
|
225
|
+
}
|
|
208
226
|
case 'eval': {
|
|
209
227
|
this.requireClaimant(cmd);
|
|
210
228
|
const value = await this.controller.evaluate(String(a.expression ?? ''), typeof a.timeoutMs === 'number' ? a.timeoutMs : undefined);
|
|
@@ -234,11 +252,11 @@ class AttachDaemon {
|
|
|
234
252
|
case 'quit':
|
|
235
253
|
return { ...base, ok: true, data: { stopping: true } };
|
|
236
254
|
default:
|
|
237
|
-
throw new
|
|
255
|
+
throw new AttachError('UNSUPPORTED_OP', `unknown op ${String(cmd.op)}`);
|
|
238
256
|
}
|
|
239
257
|
}
|
|
240
258
|
catch (err) {
|
|
241
|
-
const s =
|
|
259
|
+
const s = toStructuredError(err);
|
|
242
260
|
return { ...base, ok: false, error: { code: s.code, message: s.message } };
|
|
243
261
|
}
|
|
244
262
|
}
|
|
@@ -260,5 +278,4 @@ class AttachDaemon {
|
|
|
260
278
|
this.setState('stopped');
|
|
261
279
|
}
|
|
262
280
|
}
|
|
263
|
-
exports.AttachDaemon = AttachDaemon;
|
|
264
281
|
//# sourceMappingURL=daemon.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"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"}
|