@openacme/browser 0.4.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/LICENSE +21 -0
- package/dist/cdp.d.ts +16 -0
- package/dist/cdp.d.ts.map +1 -0
- package/dist/cdp.js +43 -0
- package/dist/cdp.js.map +1 -0
- package/dist/chrome.d.ts +46 -0
- package/dist/chrome.d.ts.map +1 -0
- package/dist/chrome.js +260 -0
- package/dist/chrome.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +91 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +539 -0
- package/dist/manager.js.map +1 -0
- package/dist/refs.d.ts +8 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +14 -0
- package/dist/refs.js.map +1 -0
- package/dist/snapshot.d.ts +10 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +16 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Utkarsh Kanwat
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cdp.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Browser } from "playwright-core";
|
|
2
|
+
/**
|
|
3
|
+
* Connect Playwright to a running Chrome via CDP, with retry + in-flight
|
|
4
|
+
* dedup. The caller owns the cache — pass `null` for a fresh attempt.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors openclaw's connectBrowser: 3 attempts with backoff, registers
|
|
7
|
+
* a `disconnected` listener so the cache can self-invalidate.
|
|
8
|
+
*/
|
|
9
|
+
export declare function connectOverCdp(opts: {
|
|
10
|
+
wsUrl: string;
|
|
11
|
+
onDisconnected: (browser: Browser) => void;
|
|
12
|
+
}): Promise<Browser>;
|
|
13
|
+
/** True when the error looks like a transient CDP disconnect that we can
|
|
14
|
+
* recover from by reconnecting and retrying once. */
|
|
15
|
+
export declare function isRecoverableDisconnect(err: unknown): boolean;
|
|
16
|
+
//# sourceMappingURL=cdp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.d.ts","sourceRoot":"","sources":["../src/cdp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnB;AAYD;sDACsD;AACtD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG7D"}
|
package/dist/cdp.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { chromium } from "playwright-core";
|
|
2
|
+
/**
|
|
3
|
+
* Connect Playwright to a running Chrome via CDP, with retry + in-flight
|
|
4
|
+
* dedup. The caller owns the cache — pass `null` for a fresh attempt.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors openclaw's connectBrowser: 3 attempts with backoff, registers
|
|
7
|
+
* a `disconnected` listener so the cache can self-invalidate.
|
|
8
|
+
*/
|
|
9
|
+
export async function connectOverCdp(opts) {
|
|
10
|
+
let lastErr;
|
|
11
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
12
|
+
try {
|
|
13
|
+
const browser = await chromium.connectOverCDP(opts.wsUrl, {
|
|
14
|
+
timeout: 5000 + attempt * 2000,
|
|
15
|
+
});
|
|
16
|
+
browser.on("disconnected", () => opts.onDisconnected(browser));
|
|
17
|
+
return browser;
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
lastErr = e;
|
|
21
|
+
await new Promise((r) => setTimeout(r, 250 + attempt * 250));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
throw lastErr instanceof Error
|
|
25
|
+
? lastErr
|
|
26
|
+
: new Error(`connectOverCDP failed: ${String(lastErr)}`);
|
|
27
|
+
}
|
|
28
|
+
const RECOVERABLE_PATTERNS = [
|
|
29
|
+
"target page, context or browser has been closed",
|
|
30
|
+
"browser has been closed",
|
|
31
|
+
"browser disconnected",
|
|
32
|
+
"target closed",
|
|
33
|
+
"connection closed",
|
|
34
|
+
"websocket closed",
|
|
35
|
+
"cdp socket closed",
|
|
36
|
+
];
|
|
37
|
+
/** True when the error looks like a transient CDP disconnect that we can
|
|
38
|
+
* recover from by reconnecting and retrying once. */
|
|
39
|
+
export function isRecoverableDisconnect(err) {
|
|
40
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
41
|
+
return RECOVERABLE_PATTERNS.some((p) => msg.includes(p));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=cdp.js.map
|
package/dist/cdp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.js","sourceRoot":"","sources":["../src/cdp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAGpC;IACC,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE;gBACxD,OAAO,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI;aAC/B,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/D,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,CAAC;YACZ,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,MAAM,OAAO,YAAY,KAAK;QAC5B,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,oBAAoB,GAAG;IAC3B,iDAAiD;IACjD,yBAAyB;IACzB,sBAAsB;IACtB,eAAe;IACf,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;CACpB,CAAC;AAEF;sDACsD;AACtD,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,MAAM,GAAG,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/chrome.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
import type { BrowserConfig } from "./types.js";
|
|
3
|
+
export interface RunningChrome {
|
|
4
|
+
proc: ChildProcess;
|
|
5
|
+
cdpPort: number;
|
|
6
|
+
cdpUrl: string;
|
|
7
|
+
userDataDir: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a Chrome-family executable for the current platform. Mirrors
|
|
11
|
+
* openclaw's per-platform search order: Chrome → Brave → Edge → Chromium.
|
|
12
|
+
*/
|
|
13
|
+
export declare function findChromeExecutable(override?: string): string | null;
|
|
14
|
+
export declare function chromeInstallHint(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Clean up stale Chrome singleton lock files left behind by a crashed
|
|
17
|
+
* Chrome instance. Mirrors openclaw's logic: read the SingletonLock symlink
|
|
18
|
+
* target (`host-pid` format); if pid is dead on this host, the lock files
|
|
19
|
+
* are removed. Returns true if any cleanup happened.
|
|
20
|
+
*/
|
|
21
|
+
export declare function clearStaleSingletonLocks(userDataDir: string): boolean;
|
|
22
|
+
export declare function buildLaunchArgs(opts: {
|
|
23
|
+
cdpPort: number;
|
|
24
|
+
userDataDir: string;
|
|
25
|
+
headless: boolean;
|
|
26
|
+
noSandbox: boolean;
|
|
27
|
+
}): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Poll /json/version until Chrome's CDP is up. Returns the
|
|
30
|
+
* `webSocketDebuggerUrl` advertised by Chrome.
|
|
31
|
+
*/
|
|
32
|
+
export declare function pollForCdpReady(opts: {
|
|
33
|
+
cdpPort: number;
|
|
34
|
+
budgetMs: number;
|
|
35
|
+
}): Promise<string>;
|
|
36
|
+
export declare function launchChrome(opts: {
|
|
37
|
+
exe: string;
|
|
38
|
+
cdpPort: number;
|
|
39
|
+
userDataDir: string;
|
|
40
|
+
headless: boolean;
|
|
41
|
+
noSandbox: boolean;
|
|
42
|
+
}): Promise<RunningChrome>;
|
|
43
|
+
export declare function killChrome(running: RunningChrome): Promise<void>;
|
|
44
|
+
export declare function resolveUserDataDir(dataDir: string): string;
|
|
45
|
+
export declare function resolveExecutableOrThrow(config: BrowserConfig): string;
|
|
46
|
+
//# sourceMappingURL=chrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../src/chrome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+CrE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAwBrE;AAaD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,EAAE,CAyBX;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlB;AAMD,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,aAAa,CAAC,CA+CzB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQtE"}
|
package/dist/chrome.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
const SINGLETON_FILES = ["SingletonLock", "SingletonSocket", "SingletonCookie"];
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a Chrome-family executable for the current platform. Mirrors
|
|
8
|
+
* openclaw's per-platform search order: Chrome → Brave → Edge → Chromium.
|
|
9
|
+
*/
|
|
10
|
+
export function findChromeExecutable(override) {
|
|
11
|
+
if (override && fs.existsSync(override))
|
|
12
|
+
return override;
|
|
13
|
+
const platform = process.platform;
|
|
14
|
+
if (platform === "darwin") {
|
|
15
|
+
const macCandidates = [
|
|
16
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
17
|
+
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
18
|
+
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
19
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
20
|
+
];
|
|
21
|
+
return macCandidates.find((p) => fs.existsSync(p)) ?? null;
|
|
22
|
+
}
|
|
23
|
+
if (platform === "linux") {
|
|
24
|
+
const linuxNames = [
|
|
25
|
+
"google-chrome",
|
|
26
|
+
"google-chrome-stable",
|
|
27
|
+
"chromium",
|
|
28
|
+
"chromium-browser",
|
|
29
|
+
"brave-browser",
|
|
30
|
+
"microsoft-edge",
|
|
31
|
+
];
|
|
32
|
+
const paths = (process.env.PATH ?? "").split(":");
|
|
33
|
+
for (const name of linuxNames) {
|
|
34
|
+
for (const dir of paths) {
|
|
35
|
+
if (!dir)
|
|
36
|
+
continue;
|
|
37
|
+
const full = path.join(dir, name);
|
|
38
|
+
try {
|
|
39
|
+
if (fs.existsSync(full))
|
|
40
|
+
return full;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// ignore
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (platform === "win32") {
|
|
50
|
+
const winCandidates = [
|
|
51
|
+
"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
|
|
52
|
+
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
|
|
53
|
+
"C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe",
|
|
54
|
+
"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
|
|
55
|
+
"C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe",
|
|
56
|
+
];
|
|
57
|
+
return winCandidates.find((p) => fs.existsSync(p)) ?? null;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
export function chromeInstallHint() {
|
|
62
|
+
switch (process.platform) {
|
|
63
|
+
case "darwin":
|
|
64
|
+
return "Install Google Chrome from https://www.google.com/chrome/ — or set browser.executablePath in config.";
|
|
65
|
+
case "linux":
|
|
66
|
+
return "Install with: apt-get install google-chrome-stable OR apt-get install chromium OR set browser.executablePath.";
|
|
67
|
+
case "win32":
|
|
68
|
+
return "Install Google Chrome from https://www.google.com/chrome/ — or set browser.executablePath in config.";
|
|
69
|
+
default:
|
|
70
|
+
return "Set browser.executablePath in config to a Chrome / Brave / Edge / Chromium binary.";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Clean up stale Chrome singleton lock files left behind by a crashed
|
|
75
|
+
* Chrome instance. Mirrors openclaw's logic: read the SingletonLock symlink
|
|
76
|
+
* target (`host-pid` format); if pid is dead on this host, the lock files
|
|
77
|
+
* are removed. Returns true if any cleanup happened.
|
|
78
|
+
*/
|
|
79
|
+
export function clearStaleSingletonLocks(userDataDir) {
|
|
80
|
+
const lockPath = path.join(userDataDir, "SingletonLock");
|
|
81
|
+
let target;
|
|
82
|
+
try {
|
|
83
|
+
target = fs.readlinkSync(lockPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
const match = /^(?<host>.+)-(?<pid>\d+)$/.exec(target);
|
|
89
|
+
if (!match?.groups)
|
|
90
|
+
return false;
|
|
91
|
+
const lockHost = match.groups.host ?? "";
|
|
92
|
+
const pid = Number.parseInt(match.groups.pid ?? "", 10);
|
|
93
|
+
if (lockHost === os.hostname() && processExists(pid)) {
|
|
94
|
+
// Lock is still held by a live Chrome on this host — don't touch.
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
for (const f of SINGLETON_FILES) {
|
|
98
|
+
try {
|
|
99
|
+
fs.rmSync(path.join(userDataDir, f), { force: true });
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// best-effort
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function processExists(pid) {
|
|
108
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
109
|
+
return false;
|
|
110
|
+
try {
|
|
111
|
+
process.kill(pid, 0);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (err.code === "EPERM")
|
|
116
|
+
return true;
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function buildLaunchArgs(opts) {
|
|
121
|
+
const args = [
|
|
122
|
+
`--remote-debugging-port=${opts.cdpPort}`,
|
|
123
|
+
`--user-data-dir=${opts.userDataDir}`,
|
|
124
|
+
"--no-first-run",
|
|
125
|
+
"--no-default-browser-check",
|
|
126
|
+
"--disable-sync",
|
|
127
|
+
"--disable-background-networking",
|
|
128
|
+
"--disable-component-update",
|
|
129
|
+
"--disable-features=Translate,MediaRouter",
|
|
130
|
+
"--disable-session-crashed-bubble",
|
|
131
|
+
"--hide-crash-restore-bubble",
|
|
132
|
+
"--password-store=basic",
|
|
133
|
+
"--no-proxy-server",
|
|
134
|
+
];
|
|
135
|
+
if (opts.headless) {
|
|
136
|
+
args.push("--headless=new", "--disable-gpu");
|
|
137
|
+
}
|
|
138
|
+
if (opts.noSandbox) {
|
|
139
|
+
args.push("--no-sandbox");
|
|
140
|
+
}
|
|
141
|
+
if (process.platform === "linux") {
|
|
142
|
+
args.push("--disable-dev-shm-usage");
|
|
143
|
+
}
|
|
144
|
+
return args;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Poll /json/version until Chrome's CDP is up. Returns the
|
|
148
|
+
* `webSocketDebuggerUrl` advertised by Chrome.
|
|
149
|
+
*/
|
|
150
|
+
export async function pollForCdpReady(opts) {
|
|
151
|
+
const start = Date.now();
|
|
152
|
+
const versionUrl = `http://127.0.0.1:${opts.cdpPort}/json/version`;
|
|
153
|
+
let lastErr = null;
|
|
154
|
+
while (Date.now() - start < opts.budgetMs) {
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(versionUrl);
|
|
157
|
+
if (res.ok) {
|
|
158
|
+
const payload = (await res.json());
|
|
159
|
+
if (payload.webSocketDebuggerUrl)
|
|
160
|
+
return payload.webSocketDebuggerUrl;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
lastErr = e;
|
|
165
|
+
}
|
|
166
|
+
await sleep(100);
|
|
167
|
+
}
|
|
168
|
+
throw new Error(`Chrome CDP did not become ready on port ${opts.cdpPort} within ${opts.budgetMs}ms` +
|
|
169
|
+
(lastErr instanceof Error ? `: ${lastErr.message}` : ""));
|
|
170
|
+
}
|
|
171
|
+
function sleep(ms) {
|
|
172
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
173
|
+
}
|
|
174
|
+
export async function launchChrome(opts) {
|
|
175
|
+
fs.mkdirSync(opts.userDataDir, { recursive: true });
|
|
176
|
+
clearStaleSingletonLocks(opts.userDataDir);
|
|
177
|
+
const args = buildLaunchArgs(opts);
|
|
178
|
+
const proc = spawn(opts.exe, args, {
|
|
179
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
180
|
+
detached: false,
|
|
181
|
+
env: process.env,
|
|
182
|
+
});
|
|
183
|
+
let earlyExit = null;
|
|
184
|
+
proc.once("exit", (code, signal) => {
|
|
185
|
+
earlyExit = { code, signal };
|
|
186
|
+
});
|
|
187
|
+
// Wait for CDP — fail fast if Chrome dies during startup.
|
|
188
|
+
try {
|
|
189
|
+
const wsUrl = await Promise.race([
|
|
190
|
+
pollForCdpReady({ cdpPort: opts.cdpPort, budgetMs: 15_000 }),
|
|
191
|
+
new Promise((_, reject) => {
|
|
192
|
+
const id = setInterval(() => {
|
|
193
|
+
if (earlyExit) {
|
|
194
|
+
clearInterval(id);
|
|
195
|
+
reject(new Error(`Chrome exited during startup (code=${earlyExit.code} signal=${earlyExit.signal})`));
|
|
196
|
+
}
|
|
197
|
+
}, 100);
|
|
198
|
+
}),
|
|
199
|
+
]);
|
|
200
|
+
return {
|
|
201
|
+
proc,
|
|
202
|
+
cdpPort: opts.cdpPort,
|
|
203
|
+
cdpUrl: wsUrl,
|
|
204
|
+
userDataDir: opts.userDataDir,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
try {
|
|
209
|
+
proc.kill("SIGTERM");
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// ignore
|
|
213
|
+
}
|
|
214
|
+
throw e;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export async function killChrome(running) {
|
|
218
|
+
if (running.proc.exitCode !== null || running.proc.signalCode !== null)
|
|
219
|
+
return;
|
|
220
|
+
await new Promise((resolve) => {
|
|
221
|
+
let resolved = false;
|
|
222
|
+
const done = () => {
|
|
223
|
+
if (resolved)
|
|
224
|
+
return;
|
|
225
|
+
resolved = true;
|
|
226
|
+
resolve();
|
|
227
|
+
};
|
|
228
|
+
running.proc.once("exit", done);
|
|
229
|
+
running.proc.once("close", done);
|
|
230
|
+
try {
|
|
231
|
+
running.proc.kill("SIGTERM");
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
done();
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
setTimeout(() => {
|
|
238
|
+
try {
|
|
239
|
+
if (running.proc.exitCode === null && running.proc.signalCode === null) {
|
|
240
|
+
running.proc.kill("SIGKILL");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// ignore
|
|
245
|
+
}
|
|
246
|
+
done();
|
|
247
|
+
}, 3000);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
export function resolveUserDataDir(dataDir) {
|
|
251
|
+
return path.join(dataDir, "browser-profile");
|
|
252
|
+
}
|
|
253
|
+
export function resolveExecutableOrThrow(config) {
|
|
254
|
+
const exe = findChromeExecutable(config.executablePath);
|
|
255
|
+
if (!exe) {
|
|
256
|
+
throw new Error(`No Chrome / Brave / Edge / Chromium binary found. ${chromeInstallHint()}`);
|
|
257
|
+
}
|
|
258
|
+
return exe;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=chrome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../src/chrome.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { BrowserManager } from "./manager.js";
|
|
2
|
+
export type { BrowserConfig, TabId, TabInfo, ConsoleEntry, NavigateParams, NavigateResult, SnapshotParams, SnapshotResult, ClickParams, TypeParams, PressKeyParams, ScreenshotParams, ScreenshotResult, WaitForParams, EvaluateParams, EvaluateResult, ConsoleMessagesParams, ConsoleMessagesResult, HoverParams, DragParams, SelectOptionParams, SelectOptionResult, FillFormField, FillFormParams, FillFormResult, FileUploadParams, HandleDialogParams, DialogResult, ResizeParams, ResizeResult, SaveAsPdfParams, PdfResult, ClickCoordsParams, NavHistoryResult, ActionResult, } from "./types.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,aAAa,EACb,KAAK,EACL,OAAO,EACP,YAAY,EACZ,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,WAAW,EACX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { BrowserConfig, ClickCoordsParams, ClickParams, ConsoleMessagesParams, ConsoleMessagesResult, DialogResult, DragParams, EvaluateParams, EvaluateResult, FileUploadParams, FillFormParams, FillFormResult, HandleDialogParams, HoverParams, NavHistoryResult, NavigateParams, NavigateResult, PdfResult, PressKeyParams, ResizeParams, ResizeResult, SaveAsPdfParams, ScreenshotParams, ScreenshotResult, SelectOptionParams, SelectOptionResult, SnapshotParams, SnapshotResult, TabId, TabInfo, TypeParams, WaitForParams, ActionResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Owns the single managed Chrome process for the OpenAcme workforce.
|
|
4
|
+
*
|
|
5
|
+
* One Chrome under `<dataDir>/browser-profile/`; one shared default
|
|
6
|
+
* `BrowserContext` so all agents share cookies / login state. Tabs are
|
|
7
|
+
* partitioned per-agent: each agent gets its own `t1`, `t2`, ... alias
|
|
8
|
+
* space. Cross-agent tab access is refused.
|
|
9
|
+
*
|
|
10
|
+
* Lazy: nothing happens until the first tool call. CDP disconnect on
|
|
11
|
+
* sleep/wake is recovered transparently — `cachedBrowser` is invalidated
|
|
12
|
+
* by the `disconnected` listener and re-established on next call.
|
|
13
|
+
*/
|
|
14
|
+
export declare class BrowserManager {
|
|
15
|
+
private readonly userDataDir;
|
|
16
|
+
private readonly cfg;
|
|
17
|
+
private running;
|
|
18
|
+
private cachedBrowser;
|
|
19
|
+
private connectingPromise;
|
|
20
|
+
private launchingPromise;
|
|
21
|
+
private tabOwnership;
|
|
22
|
+
private agentTabs;
|
|
23
|
+
private activeTabByAgent;
|
|
24
|
+
private pageState;
|
|
25
|
+
constructor(opts: {
|
|
26
|
+
dataDir: string;
|
|
27
|
+
config: BrowserConfig;
|
|
28
|
+
});
|
|
29
|
+
private ensureChrome;
|
|
30
|
+
private getBrowser;
|
|
31
|
+
private connectFresh;
|
|
32
|
+
private sharedContext;
|
|
33
|
+
private resetAllTabState;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
private observePage;
|
|
36
|
+
private agentTabsFor;
|
|
37
|
+
private assignTabAlias;
|
|
38
|
+
private trackPageForAgent;
|
|
39
|
+
private releaseTab;
|
|
40
|
+
private targetIdOf;
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the Page for `tabId` (or the active tab if omitted) and verify
|
|
43
|
+
* the agent owns it. Throws on missing tab / cross-agent access.
|
|
44
|
+
*/
|
|
45
|
+
private resolvePage;
|
|
46
|
+
private findPageByTargetId;
|
|
47
|
+
/**
|
|
48
|
+
* Run an action with one-shot reconnect on transient CDP disconnects.
|
|
49
|
+
* The action gets a fresh `page` resolution on retry.
|
|
50
|
+
*/
|
|
51
|
+
private withReconnect;
|
|
52
|
+
navigate(agentId: string, p: NavigateParams): Promise<NavigateResult>;
|
|
53
|
+
snapshot(agentId: string, p: SnapshotParams): Promise<SnapshotResult>;
|
|
54
|
+
click(agentId: string, p: ClickParams): Promise<ActionResult>;
|
|
55
|
+
type(agentId: string, p: TypeParams): Promise<ActionResult>;
|
|
56
|
+
pressKey(agentId: string, p: PressKeyParams): Promise<ActionResult>;
|
|
57
|
+
takeScreenshot(agentId: string, p: ScreenshotParams): Promise<ScreenshotResult>;
|
|
58
|
+
waitFor(agentId: string, p: WaitForParams): Promise<ActionResult>;
|
|
59
|
+
evaluate(agentId: string, p: EvaluateParams): Promise<EvaluateResult>;
|
|
60
|
+
consoleMessages(agentId: string, p: ConsoleMessagesParams): Promise<ConsoleMessagesResult>;
|
|
61
|
+
tabsList(agentId: string): Promise<TabInfo[]>;
|
|
62
|
+
tabsNew(agentId: string, p: {
|
|
63
|
+
url?: string;
|
|
64
|
+
}): Promise<TabInfo>;
|
|
65
|
+
tabsClose(agentId: string, p: {
|
|
66
|
+
tabId: TabId;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
tabsSelect(agentId: string, p: {
|
|
69
|
+
tabId: TabId;
|
|
70
|
+
}): Promise<TabInfo>;
|
|
71
|
+
hover(agentId: string, p: HoverParams): Promise<ActionResult>;
|
|
72
|
+
drag(agentId: string, p: DragParams): Promise<ActionResult>;
|
|
73
|
+
selectOption(agentId: string, p: SelectOptionParams): Promise<SelectOptionResult>;
|
|
74
|
+
fillForm(agentId: string, p: FillFormParams): Promise<FillFormResult>;
|
|
75
|
+
fileUpload(agentId: string, p: FileUploadParams): Promise<ActionResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Arm a one-shot dialog handler on the page. The handler resolves the
|
|
78
|
+
* NEXT dialog event with accept/dismiss + optional prompt text.
|
|
79
|
+
*/
|
|
80
|
+
handleDialog(agentId: string, p: HandleDialogParams): Promise<DialogResult>;
|
|
81
|
+
resize(agentId: string, p: ResizeParams): Promise<ResizeResult>;
|
|
82
|
+
navigateBack(agentId: string, p: {
|
|
83
|
+
tabId?: TabId;
|
|
84
|
+
}): Promise<NavHistoryResult>;
|
|
85
|
+
navigateForward(agentId: string, p: {
|
|
86
|
+
tabId?: TabId;
|
|
87
|
+
}): Promise<NavHistoryResult>;
|
|
88
|
+
saveAsPdf(agentId: string, p: SaveAsPdfParams): Promise<PdfResult>;
|
|
89
|
+
clickCoords(agentId: string, p: ClickCoordsParams): Promise<ActionResult>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|