@framers/agentos-ext-browser-automation 0.1.0 → 0.2.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 (129) hide show
  1. package/dist/attach/AttachController.d.ts +183 -0
  2. package/dist/attach/AttachController.d.ts.map +1 -0
  3. package/dist/attach/AttachController.js +283 -0
  4. package/dist/attach/AttachController.js.map +1 -0
  5. package/dist/attach/__tests__/AttachController.test.d.ts +2 -0
  6. package/dist/attach/__tests__/AttachController.test.d.ts.map +1 -0
  7. package/dist/attach/__tests__/AttachController.test.js +278 -0
  8. package/dist/attach/__tests__/AttachController.test.js.map +1 -0
  9. package/dist/attach/__tests__/attach-primitives.test.d.ts +2 -0
  10. package/dist/attach/__tests__/attach-primitives.test.d.ts.map +1 -0
  11. package/dist/attach/__tests__/attach-primitives.test.js +158 -0
  12. package/dist/attach/__tests__/attach-primitives.test.js.map +1 -0
  13. package/dist/attach/__tests__/jxa-args.test.d.ts +2 -0
  14. package/dist/attach/__tests__/jxa-args.test.d.ts.map +1 -0
  15. package/dist/attach/__tests__/jxa-args.test.js +37 -0
  16. package/dist/attach/__tests__/jxa-args.test.js.map +1 -0
  17. package/dist/attach/__tests__/pack-registration.test.d.ts +2 -0
  18. package/dist/attach/__tests__/pack-registration.test.d.ts.map +1 -0
  19. package/dist/attach/__tests__/pack-registration.test.js +34 -0
  20. package/dist/attach/__tests__/pack-registration.test.js.map +1 -0
  21. package/dist/attach/__tests__/tools.test.d.ts +2 -0
  22. package/dist/attach/__tests__/tools.test.d.ts.map +1 -0
  23. package/dist/attach/__tests__/tools.test.js +155 -0
  24. package/dist/attach/__tests__/tools.test.js.map +1 -0
  25. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts +2 -0
  26. package/dist/attach/backends/__tests__/raw-cdp.test.d.ts.map +1 -0
  27. package/dist/attach/backends/__tests__/raw-cdp.test.js +133 -0
  28. package/dist/attach/backends/__tests__/raw-cdp.test.js.map +1 -0
  29. package/dist/attach/backends/jxa.d.ts +39 -0
  30. package/dist/attach/backends/jxa.d.ts.map +1 -0
  31. package/dist/attach/backends/jxa.js +188 -0
  32. package/dist/attach/backends/jxa.js.map +1 -0
  33. package/dist/attach/backends/raw-cdp.d.ts +53 -0
  34. package/dist/attach/backends/raw-cdp.d.ts.map +1 -0
  35. package/dist/attach/backends/raw-cdp.js +216 -0
  36. package/dist/attach/backends/raw-cdp.js.map +1 -0
  37. package/dist/attach/daemon/__tests__/client.test.d.ts +2 -0
  38. package/dist/attach/daemon/__tests__/client.test.d.ts.map +1 -0
  39. package/dist/attach/daemon/__tests__/client.test.js +58 -0
  40. package/dist/attach/daemon/__tests__/client.test.js.map +1 -0
  41. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts +2 -0
  42. package/dist/attach/daemon/__tests__/daemon-lock.test.d.ts.map +1 -0
  43. package/dist/attach/daemon/__tests__/daemon-lock.test.js +72 -0
  44. package/dist/attach/daemon/__tests__/daemon-lock.test.js.map +1 -0
  45. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts +2 -0
  46. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.d.ts.map +1 -0
  47. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js +102 -0
  48. package/dist/attach/daemon/__tests__/daemon-loop.integration.test.js.map +1 -0
  49. package/dist/attach/daemon/__tests__/harness.d.ts +44 -0
  50. package/dist/attach/daemon/__tests__/harness.d.ts.map +1 -0
  51. package/dist/attach/daemon/__tests__/harness.js +96 -0
  52. package/dist/attach/daemon/__tests__/harness.js.map +1 -0
  53. package/dist/attach/daemon/__tests__/protocol.test.d.ts +2 -0
  54. package/dist/attach/daemon/__tests__/protocol.test.d.ts.map +1 -0
  55. package/dist/attach/daemon/__tests__/protocol.test.js +71 -0
  56. package/dist/attach/daemon/__tests__/protocol.test.js.map +1 -0
  57. package/dist/attach/daemon/__tests__/runner.test.d.ts +2 -0
  58. package/dist/attach/daemon/__tests__/runner.test.d.ts.map +1 -0
  59. package/dist/attach/daemon/__tests__/runner.test.js +67 -0
  60. package/dist/attach/daemon/__tests__/runner.test.js.map +1 -0
  61. package/dist/attach/daemon/client.d.ts +64 -0
  62. package/dist/attach/daemon/client.d.ts.map +1 -0
  63. package/dist/attach/daemon/client.js +120 -0
  64. package/dist/attach/daemon/client.js.map +1 -0
  65. package/dist/attach/daemon/daemon-lock.d.ts +19 -0
  66. package/dist/attach/daemon/daemon-lock.d.ts.map +1 -0
  67. package/dist/attach/daemon/daemon-lock.js +87 -0
  68. package/dist/attach/daemon/daemon-lock.js.map +1 -0
  69. package/dist/attach/daemon/daemon-main.d.ts +6 -0
  70. package/dist/attach/daemon/daemon-main.d.ts.map +1 -0
  71. package/dist/attach/daemon/daemon-main.js +80 -0
  72. package/dist/attach/daemon/daemon-main.js.map +1 -0
  73. package/dist/attach/daemon/daemon.d.ts +52 -0
  74. package/dist/attach/daemon/daemon.d.ts.map +1 -0
  75. package/dist/attach/daemon/daemon.js +264 -0
  76. package/dist/attach/daemon/daemon.js.map +1 -0
  77. package/dist/attach/daemon/index.d.ts +12 -0
  78. package/dist/attach/daemon/index.d.ts.map +1 -0
  79. package/dist/attach/daemon/index.js +30 -0
  80. package/dist/attach/daemon/index.js.map +1 -0
  81. package/dist/attach/daemon/protocol.d.ts +69 -0
  82. package/dist/attach/daemon/protocol.d.ts.map +1 -0
  83. package/dist/attach/daemon/protocol.js +108 -0
  84. package/dist/attach/daemon/protocol.js.map +1 -0
  85. package/dist/attach/daemon/runner.d.ts +64 -0
  86. package/dist/attach/daemon/runner.d.ts.map +1 -0
  87. package/dist/attach/daemon/runner.js +60 -0
  88. package/dist/attach/daemon/runner.js.map +1 -0
  89. package/dist/attach/daemon/surface.d.ts +31 -0
  90. package/dist/attach/daemon/surface.d.ts.map +1 -0
  91. package/dist/attach/daemon/surface.js +89 -0
  92. package/dist/attach/daemon/surface.js.map +1 -0
  93. package/dist/attach/devtools-port.d.ts +37 -0
  94. package/dist/attach/devtools-port.d.ts.map +1 -0
  95. package/dist/attach/devtools-port.js +50 -0
  96. package/dist/attach/devtools-port.js.map +1 -0
  97. package/dist/attach/errors.d.ts +38 -0
  98. package/dist/attach/errors.d.ts.map +1 -0
  99. package/dist/attach/errors.js +72 -0
  100. package/dist/attach/errors.js.map +1 -0
  101. package/dist/attach/lease.d.ts +43 -0
  102. package/dist/attach/lease.d.ts.map +1 -0
  103. package/dist/attach/lease.js +92 -0
  104. package/dist/attach/lease.js.map +1 -0
  105. package/dist/attach/singleton-lock.d.ts +21 -0
  106. package/dist/attach/singleton-lock.d.ts.map +1 -0
  107. package/dist/attach/singleton-lock.js +30 -0
  108. package/dist/attach/singleton-lock.js.map +1 -0
  109. package/dist/attach/state.d.ts +31 -0
  110. package/dist/attach/state.d.ts.map +1 -0
  111. package/dist/attach/state.js +78 -0
  112. package/dist/attach/state.js.map +1 -0
  113. package/dist/attach/tools.d.ts +208 -0
  114. package/dist/attach/tools.d.ts.map +1 -0
  115. package/dist/attach/tools.js +195 -0
  116. package/dist/attach/tools.js.map +1 -0
  117. package/dist/attach/url-policy.d.ts +41 -0
  118. package/dist/attach/url-policy.d.ts.map +1 -0
  119. package/dist/attach/url-policy.js +59 -0
  120. package/dist/attach/url-policy.js.map +1 -0
  121. package/dist/attach.d.ts +18 -0
  122. package/dist/attach.d.ts.map +1 -0
  123. package/dist/attach.js +34 -0
  124. package/dist/attach.js.map +1 -0
  125. package/dist/index.d.ts +30 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +29 -1
  128. package/dist/index.js.map +1 -1
  129. package/package.json +22 -7
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = main;
4
+ /**
5
+ * @fileoverview Runnable attach-daemon entry: `node .../daemon-main.js`.
6
+ *
7
+ * Spawned by `wunderland attach start` (and by autostart, exactly once).
8
+ * Reads WUNDERLAND_ATTACH_* env, builds RawCdpBackend + AttachController +
9
+ * AttachDaemon, runs until quit/SIGTERM. This process is the ONLY one that
10
+ * touches the network; every caller talks to it through files.
11
+ *
12
+ * @module browser-automation/attach/daemon/daemon-main
13
+ */
14
+ const node_os_1 = require("node:os");
15
+ const node_path_1 = require("node:path");
16
+ const AttachController_js_1 = require("../AttachController.js");
17
+ const raw_cdp_js_1 = require("../backends/raw-cdp.js");
18
+ const daemon_js_1 = require("./daemon.js");
19
+ const protocol_js_1 = require("./protocol.js");
20
+ /**
21
+ * Build and run the daemon from an environment map. Returns the process exit
22
+ * code (0 clean stop, 2 failure). Exported for tests and for the CLI.
23
+ */
24
+ async function main(env = process.env) {
25
+ const ipcDir = (0, protocol_js_1.resolveIpcDir)(undefined, env);
26
+ const fail = (msg) => {
27
+ (0, protocol_js_1.writeAtomicJson)((0, protocol_js_1.statusPath)(ipcDir), { t: Date.now(), pid: process.pid, state: 'failed', lastError: msg });
28
+ console.error(`attach daemon: ${msg}`);
29
+ return 2;
30
+ };
31
+ // Node 22 floor: the raw-CDP transport is the built-in WebSocket. Guarded so
32
+ // an older runtime gets an actionable message, never a bare ReferenceError.
33
+ if (typeof WebSocket === 'undefined') {
34
+ return fail('this runtime has no built-in WebSocket; the attach daemon requires Node 22 or newer');
35
+ }
36
+ const expectedIdentity = env.WUNDERLAND_ATTACH_IDENTITY?.trim();
37
+ if (!expectedIdentity) {
38
+ return fail('WUNDERLAND_ATTACH_IDENTITY is required (the profile identity the daemon must verify)');
39
+ }
40
+ const backend = new raw_cdp_js_1.RawCdpBackend({
41
+ profileRoot: env.WUNDERLAND_ATTACH_PROFILE_ROOT?.trim() || undefined,
42
+ identityProbeUrl: env.WUNDERLAND_ATTACH_PROBE_URL?.trim() || undefined,
43
+ settleMs: 0, // settle is applied daemon-side per goto op (default 1800ms)
44
+ });
45
+ const allowHosts = env.WUNDERLAND_ATTACH_HOSTS?.split(',')
46
+ .map((s) => s.trim())
47
+ .filter(Boolean);
48
+ const deadlineMs = Number(env.WUNDERLAND_ATTACH_DEADLINE_MS);
49
+ const controller = new AttachController_js_1.AttachController({
50
+ backend,
51
+ // Mirrors the pack default in src/index.ts so CLI-started and pack-embedded
52
+ // sessions contend on the SAME lease file.
53
+ leaseFile: env.WUNDERLAND_ATTACH_LEASE?.trim() || (0, node_path_1.join)((0, node_os_1.homedir)(), '.wunderland', 'attach.lease'),
54
+ expectedIdentity,
55
+ urlPolicy: allowHosts?.length ? { allowHosts } : undefined,
56
+ dryRun: env.WUNDERLAND_ATTACH_DRYRUN === '1' || env.WUNDERLAND_ATTACH_DRYRUN === 'true',
57
+ deadlineMs: Number.isFinite(deadlineMs) && deadlineMs > 0 ? deadlineMs : undefined,
58
+ });
59
+ const daemon = new daemon_js_1.AttachDaemon({
60
+ controller,
61
+ backend,
62
+ ipcDir,
63
+ pidFile: env.WUNDERLAND_ATTACH_PID_FILE?.trim() || protocol_js_1.DEFAULT_PID_FILE,
64
+ log: (line) => console.error(`[attach-daemon] ${line}`),
65
+ });
66
+ process.on('SIGTERM', () => daemon.requestStop('SIGTERM'));
67
+ process.on('SIGINT', () => daemon.requestStop('SIGINT'));
68
+ try {
69
+ await daemon.run();
70
+ return 0;
71
+ }
72
+ catch (err) {
73
+ return fail(err.message);
74
+ }
75
+ }
76
+ // Invoked directly (not imported): run and exit with the returned code.
77
+ if (process.argv[1] && import.meta.url === `file://${process.argv[1]}`) {
78
+ void main().then((code) => process.exit(code));
79
+ }
80
+ //# sourceMappingURL=daemon-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-main.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon-main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { AttachBackend, AttachController } from '../AttachController.js';
2
+ /** Constructor options. */
3
+ export interface AttachDaemonOptions {
4
+ controller: AttachController;
5
+ /** Same backend instance the controller wraps (boot connect + drop hook + identity cache). */
6
+ backend: AttachBackend & {
7
+ onUnexpectedClose?: ((err: Error) => void) | null;
8
+ };
9
+ ipcDir: string;
10
+ pidFile: string;
11
+ /** Loop tick ms (default 350). */
12
+ pollMs?: number;
13
+ /** Default claimant ttl ms (default 600000). */
14
+ claimTtlMs?: number;
15
+ log?: (line: string) => void;
16
+ }
17
+ /**
18
+ * See fileoverview. `run()` resolves after a `quit` op or {@link requestStop}.
19
+ * Never launches, quits, or signals Chrome under any failure.
20
+ */
21
+ export declare class AttachDaemon {
22
+ private readonly controller;
23
+ private readonly backend;
24
+ private readonly ipcDir;
25
+ private readonly pidFile;
26
+ private readonly pollMs;
27
+ private readonly claimTtlMs;
28
+ private readonly log;
29
+ private lock;
30
+ private state;
31
+ private lastError?;
32
+ private identity?;
33
+ private claimant;
34
+ private controllerClaimed;
35
+ private stopRequested;
36
+ private reconnectAt;
37
+ private backoffMs;
38
+ private gcCountdown;
39
+ constructor(opts: AttachDaemonOptions);
40
+ /** External stop (signal handlers route here). */
41
+ requestStop(reason: string): void;
42
+ /** Acquire the singleton, open the transport, serve the queue until quit. */
43
+ run(): Promise<void>;
44
+ private setState;
45
+ private heartbeat;
46
+ private expireClaimant;
47
+ private maybeReconnect;
48
+ private requireClaimant;
49
+ private execute;
50
+ private shutdown;
51
+ }
52
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +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;AAe9E,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;IAgD1B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;YAOT,OAAO;YAuFP,QAAQ;CAgBvB"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AttachDaemon = void 0;
4
+ /**
5
+ * @fileoverview The attach daemon: one process, one controller, one held session.
6
+ *
7
+ * Owns the file-queue loop. Consumes `cmd-*.json` oldest-first, executes ops
8
+ * SERIALLY against the hosted {@link AttachController} (the single policy
9
+ * enforcement point), writes `resp-<id>.json`, and heartbeats `status.json`
10
+ * every tick. Command files are deleted BEFORE execution (at-most-once: a
11
+ * crash mid-op must never replay a navigation on restart). Responses are
12
+ * deleted by their reader; strays age out via the periodic GC — shutdown does
13
+ * not bulk-sweep, because that would race a client still polling for the quit
14
+ * response.
15
+ *
16
+ * Two-layer claim model: the controller's lease belongs to this process for
17
+ * the daemon's lifetime; per-caller driving rights are daemon-level
18
+ * bookkeeping (`claimant`). `release` parks the tab and clears the claimant;
19
+ * only `quit` detaches the controller.
20
+ *
21
+ * @module browser-automation/attach/daemon/daemon
22
+ */
23
+ const node_fs_1 = require("node:fs");
24
+ const errors_js_1 = require("../errors.js");
25
+ const daemon_lock_js_1 = require("./daemon-lock.js");
26
+ const protocol_js_1 = require("./protocol.js");
27
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
28
+ const BACKOFF_START_MS = 5000;
29
+ const BACKOFF_CAP_MS = 60000;
30
+ /** Loop ticks between periodic GC passes (~35s at the default tick). */
31
+ const GC_EVERY_TICKS = 100;
32
+ /**
33
+ * See fileoverview. `run()` resolves after a `quit` op or {@link requestStop}.
34
+ * Never launches, quits, or signals Chrome under any failure.
35
+ */
36
+ class AttachDaemon {
37
+ 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
+ this.controller = opts.controller;
47
+ this.backend = opts.backend;
48
+ this.ipcDir = opts.ipcDir;
49
+ this.pidFile = opts.pidFile;
50
+ this.pollMs = opts.pollMs ?? 350;
51
+ this.claimTtlMs = opts.claimTtlMs ?? 600000;
52
+ this.log = opts.log ?? (() => { });
53
+ }
54
+ /** External stop (signal handlers route here). */
55
+ requestStop(reason) {
56
+ this.log(`stop requested: ${reason}`);
57
+ this.stopRequested = true;
58
+ }
59
+ /** Acquire the singleton, open the transport, serve the queue until quit. */
60
+ async run() {
61
+ this.lock = (0, daemon_lock_js_1.acquireDaemonLock)(this.pidFile);
62
+ try {
63
+ this.setState('connecting');
64
+ this.backend.onUnexpectedClose = (err) => {
65
+ this.setState('degraded', (0, errors_js_1.redactDiagnostic)(err.message));
66
+ this.controllerClaimed = false;
67
+ this.claimant = null;
68
+ this.reconnectAt = Date.now() + this.backoffMs;
69
+ };
70
+ await this.backend.connect();
71
+ this.setState('connected');
72
+ while (!this.stopRequested) {
73
+ await sleep(this.pollMs);
74
+ this.heartbeat();
75
+ this.expireClaimant();
76
+ this.maybeReconnect();
77
+ if (--this.gcCountdown <= 0) {
78
+ (0, protocol_js_1.gcStale)(this.ipcDir);
79
+ this.gcCountdown = GC_EVERY_TICKS;
80
+ }
81
+ for (const pending of (0, protocol_js_1.listPendingCmds)(this.ipcDir)) {
82
+ const cmd = (0, protocol_js_1.readJson)(pending.path);
83
+ try {
84
+ (0, node_fs_1.unlinkSync)(pending.path);
85
+ }
86
+ catch {
87
+ /* consumed by a GC race */
88
+ }
89
+ if (!cmd || typeof cmd.id !== 'string' || typeof cmd.op !== 'string' || typeof cmd.client !== 'string') {
90
+ this.log(`malformed cmd file dropped: ${pending.path}`);
91
+ continue;
92
+ }
93
+ const resp = await this.execute(cmd);
94
+ (0, protocol_js_1.writeAtomicJson)((0, protocol_js_1.respPath)(this.ipcDir, cmd.id), resp);
95
+ if (cmd.op === 'quit' && resp.ok) {
96
+ this.stopRequested = true;
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ await this.shutdown();
102
+ }
103
+ finally {
104
+ this.lock?.release();
105
+ this.lock = null;
106
+ }
107
+ }
108
+ setState(state, lastError) {
109
+ this.state = state;
110
+ this.lastError = lastError;
111
+ this.heartbeat();
112
+ }
113
+ heartbeat() {
114
+ const cs = this.controller.status();
115
+ (0, protocol_js_1.writeAtomicJson)((0, protocol_js_1.statusPath)(this.ipcDir), {
116
+ t: Date.now(),
117
+ pid: process.pid,
118
+ state: this.state,
119
+ targetId: cs.agentTab,
120
+ identity: this.identity,
121
+ claimant: this.claimant?.client,
122
+ paused: cs.paused,
123
+ dryRun: cs.dryRun,
124
+ lastError: this.lastError,
125
+ });
126
+ }
127
+ expireClaimant() {
128
+ if (this.claimant && Date.now() > this.claimant.expiresAt) {
129
+ this.log(`claim ttl expired for ${this.claimant.client}; parking`);
130
+ this.claimant = null;
131
+ if (this.controllerClaimed) {
132
+ void this.controller.goto('about:blank').catch(() => {
133
+ /* park is best-effort */
134
+ });
135
+ }
136
+ }
137
+ }
138
+ maybeReconnect() {
139
+ if (this.state !== 'degraded' || Date.now() < this.reconnectAt)
140
+ return;
141
+ this.reconnectAt = Number.MAX_SAFE_INTEGER; // one attempt in flight
142
+ void this.backend
143
+ .connect()
144
+ .then(() => {
145
+ this.backoffMs = BACKOFF_START_MS;
146
+ this.setState('connected');
147
+ })
148
+ .catch(() => {
149
+ this.backoffMs = Math.min(this.backoffMs * 2, BACKOFF_CAP_MS);
150
+ this.reconnectAt = Date.now() + this.backoffMs;
151
+ });
152
+ }
153
+ requireClaimant(cmd) {
154
+ if (!this.claimant || this.claimant.client !== cmd.client) {
155
+ throw new errors_js_1.AttachError('NOT_CLAIMANT', 'no active claim for this client; send claim first');
156
+ }
157
+ this.claimant.expiresAt = Date.now() + this.claimant.ttlMs; // activity extends the ttl
158
+ }
159
+ async execute(cmd) {
160
+ const base = { id: cmd.id, op: cmd.op };
161
+ try {
162
+ const a = cmd.args ?? {};
163
+ switch (cmd.op) {
164
+ case 'ping':
165
+ return { ...base, ok: true, data: { pong: true, pid: process.pid } };
166
+ case 'status':
167
+ return {
168
+ ...base,
169
+ ok: true,
170
+ data: {
171
+ ...this.controller.status(),
172
+ daemonState: this.state,
173
+ identity: this.identity,
174
+ claimant: this.claimant?.client ?? null,
175
+ },
176
+ };
177
+ case 'claim': {
178
+ if (this.claimant && this.claimant.client !== cmd.client) {
179
+ throw new errors_js_1.AttachError('LEASE_DENIED', `claimed by ${this.claimant.client}`);
180
+ }
181
+ if (!this.controllerClaimed) {
182
+ await this.controller.claim();
183
+ this.controllerClaimed = true;
184
+ this.identity = await this.backend.probeIdentity().catch(() => undefined);
185
+ }
186
+ const ttlMs = typeof a.ttlMs === 'number' && a.ttlMs > 0 ? a.ttlMs : this.claimTtlMs;
187
+ this.claimant = { client: cmd.client, ttlMs, expiresAt: Date.now() + ttlMs };
188
+ return { ...base, ok: true, data: { ...this.controller.status(), identity: this.identity } };
189
+ }
190
+ case 'goto': {
191
+ this.requireClaimant(cmd);
192
+ const landed = await this.controller.goto(String(a.url ?? ''));
193
+ const settle = typeof a.settle === 'number' && a.settle >= 0 ? a.settle : 1800;
194
+ if (settle > 0)
195
+ await sleep(settle);
196
+ return { ...base, ok: true, data: { url: landed } };
197
+ }
198
+ case 'read': {
199
+ this.requireClaimant(cmd);
200
+ const text = await this.controller.read(typeof a.selector === 'string' ? a.selector : undefined, typeof a.maxChars === 'number' ? a.maxChars : undefined);
201
+ return { ...base, ok: true, data: { untrusted: true, text } };
202
+ }
203
+ case 'extract': {
204
+ this.requireClaimant(cmd);
205
+ const data = await this.controller.extract(a.fields);
206
+ return { ...base, ok: true, data: { untrusted: true, data } };
207
+ }
208
+ case 'eval': {
209
+ this.requireClaimant(cmd);
210
+ const value = await this.controller.evaluate(String(a.expression ?? ''), typeof a.timeoutMs === 'number' ? a.timeoutMs : undefined);
211
+ return { ...base, ok: true, data: { untrusted: true, value } };
212
+ }
213
+ case 'release': {
214
+ this.requireClaimant(cmd);
215
+ this.claimant = null;
216
+ await this.controller.goto('about:blank').catch(() => {
217
+ /* park is best-effort */
218
+ });
219
+ return { ...base, ok: true, data: { released: true } };
220
+ }
221
+ case 'control': {
222
+ this.requireClaimant(cmd);
223
+ const action = String(a.action ?? 'status');
224
+ if (action === 'pause')
225
+ this.controller.pause();
226
+ else if (action === 'resume')
227
+ this.controller.resume();
228
+ else if (action === 'dry_run_on')
229
+ this.controller.setDryRun(true);
230
+ else if (action === 'dry_run_off')
231
+ this.controller.setDryRun(false);
232
+ return { ...base, ok: true, data: this.controller.status() };
233
+ }
234
+ case 'quit':
235
+ return { ...base, ok: true, data: { stopping: true } };
236
+ default:
237
+ throw new errors_js_1.AttachError('UNSUPPORTED_OP', `unknown op ${String(cmd.op)}`);
238
+ }
239
+ }
240
+ catch (err) {
241
+ const s = (0, errors_js_1.toStructuredError)(err);
242
+ return { ...base, ok: false, error: { code: s.code, message: s.message } };
243
+ }
244
+ }
245
+ async shutdown() {
246
+ if (this.controllerClaimed) {
247
+ await this.controller.goto('about:blank').catch(() => {
248
+ /* park best-effort */
249
+ });
250
+ await this.controller.detach().catch(() => {
251
+ /* transport may be gone */
252
+ });
253
+ }
254
+ else {
255
+ await this.backend.disconnectTransport().catch(() => {
256
+ /* never held a tab */
257
+ });
258
+ }
259
+ this.claimant = null;
260
+ this.setState('stopped');
261
+ }
262
+ }
263
+ exports.AttachDaemon = AttachDaemon;
264
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/attach/daemon/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileoverview Barrel for the attach daemon lane (`./attach/daemon` subpath).
3
+ * @module browser-automation/attach/daemon
4
+ */
5
+ export * from './protocol.js';
6
+ export * from './daemon-lock.js';
7
+ export * from './daemon.js';
8
+ export * from './client.js';
9
+ export * from './surface.js';
10
+ export * from './runner.js';
11
+ export { main as daemonMain } from './daemon-main.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.daemonMain = void 0;
18
+ /**
19
+ * @fileoverview Barrel for the attach daemon lane (`./attach/daemon` subpath).
20
+ * @module browser-automation/attach/daemon
21
+ */
22
+ __exportStar(require("./protocol.js"), exports);
23
+ __exportStar(require("./daemon-lock.js"), exports);
24
+ __exportStar(require("./daemon.js"), exports);
25
+ __exportStar(require("./client.js"), exports);
26
+ __exportStar(require("./surface.js"), exports);
27
+ __exportStar(require("./runner.js"), exports);
28
+ var daemon_main_js_1 = require("./daemon-main.js");
29
+ Object.defineProperty(exports, "daemonMain", { enumerable: true, get: function () { return daemon_main_js_1.main; } });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/attach/daemon/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;GAGG;AACH,gDAA8B;AAC9B,mDAAiC;AACjC,8CAA4B;AAC5B,8CAA4B;AAC5B,+CAA6B;AAC7B,8CAA4B;AAC5B,mDAAsD;AAA7C,4GAAA,IAAI,OAAc"}
@@ -0,0 +1,69 @@
1
+ /** Daemon-routable operations. */
2
+ export type AttachOp = 'ping' | 'status' | 'claim' | 'goto' | 'read' | 'extract' | 'eval' | 'release' | 'control' | 'quit';
3
+ /** A command file body. */
4
+ export interface AttachCmd {
5
+ id: string;
6
+ client: string;
7
+ op: AttachOp;
8
+ args?: Record<string, unknown>;
9
+ }
10
+ /** Response bodies (structured error codes ride `error.code`). */
11
+ export type AttachResp = {
12
+ id: string;
13
+ op: AttachOp;
14
+ ok: true;
15
+ data: unknown;
16
+ } | {
17
+ id: string;
18
+ op: AttachOp;
19
+ ok: false;
20
+ error: {
21
+ code: string;
22
+ message: string;
23
+ };
24
+ };
25
+ /** Daemon lifecycle states mirrored in status.json. */
26
+ export type DaemonState = 'starting' | 'connecting' | 'connected' | 'degraded' | 'stopped' | 'failed';
27
+ /** status.json shape (heartbeat `t` refreshes every daemon loop tick). */
28
+ export interface DaemonStatusFile {
29
+ t: number;
30
+ pid: number;
31
+ state: DaemonState;
32
+ targetId?: string;
33
+ identity?: string;
34
+ claimant?: string;
35
+ paused?: boolean;
36
+ dryRun?: boolean;
37
+ lastError?: string;
38
+ }
39
+ /** Default IPC directory (created 0700). */
40
+ export declare const DEFAULT_IPC_DIR: string;
41
+ /** Default daemon pidfile. */
42
+ export declare const DEFAULT_PID_FILE: string;
43
+ /** cmd/resp files older than this are garbage-collected. */
44
+ export declare const STALE_FILE_MS: number;
45
+ /** status.json heartbeats older than this mark the daemon stale. */
46
+ export declare const HEARTBEAT_STALE_MS = 30000;
47
+ /** Resolve the IPC dir from an explicit override or env, ensuring it exists 0700. */
48
+ export declare function resolveIpcDir(override?: string, env?: Record<string, string | undefined>): string;
49
+ /** New string command id: `<client>-<epochMs>-<random8>`. */
50
+ export declare function newCmdId(client: string): string;
51
+ /** Path of a command file. */
52
+ export declare function cmdPath(dir: string, id: string): string;
53
+ /** Path of a response file. */
54
+ export declare function respPath(dir: string, id: string): string;
55
+ /** Path of the daemon heartbeat file. */
56
+ export declare function statusPath(dir: string): string;
57
+ /** Write JSON via tmp-then-rename so readers never see a torn body. */
58
+ export declare function writeAtomicJson(file: string, value: unknown): void;
59
+ /** Read+parse JSON; undefined when missing or torn. */
60
+ export declare function readJson<T>(file: string): T | undefined;
61
+ /** Pending command files, oldest first (mtime, then name for determinism). */
62
+ export declare function listPendingCmds(dir: string): Array<{
63
+ id: string;
64
+ path: string;
65
+ mtimeMs: number;
66
+ }>;
67
+ /** Delete cmd/resp files older than {@link STALE_FILE_MS} (pass `now` = Infinity to sweep all). */
68
+ export declare function gcStale(dir: string, now?: number): void;
69
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/attach/daemon/protocol.ts"],"names":[],"mappings":"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"}