bb-browser 0.11.0 → 0.11.2
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 +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/chunk-FSL4RNI6.js +53 -0
- package/dist/chunk-FSL4RNI6.js.map +1 -0
- package/dist/{chunk-5WGFUZLM.js → chunk-H2VEQBAU.js} +2 -2
- package/dist/{chunk-5WGFUZLM.js.map → chunk-H2VEQBAU.js.map} +1 -1
- package/dist/cli.js +374 -70
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +48 -39
- package/dist/daemon.js.map +1 -1
- package/dist/mcp.js +25 -4
- package/dist/mcp.js.map +1 -1
- package/dist/{openclaw-bridge-Q6EFUQCH.js → openclaw-bridge-4XJKWEQ3.js} +14 -51
- package/dist/openclaw-bridge-4XJKWEQ3.js.map +1 -0
- package/package.json +4 -5
- package/dist/openclaw-bridge-Q6EFUQCH.js.map +0 -1
- package/extension/background.js +0 -3258
- package/extension/background.js.map +0 -1
- package/extension/content/trace.js +0 -339
- package/extension/content/trace.js.map +0 -1
- package/extension/manifest.json +0 -45
- package/extension/options.html +0 -26
- package/extension/options.js +0 -19
- package/extension/options.js.map +0 -1
- /package/{extension → packages/shared}/buildDomTree.js +0 -0
package/dist/daemon.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
COMMAND_TIMEOUT,
|
|
4
4
|
DAEMON_HOST,
|
|
5
5
|
DAEMON_PORT
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-H2VEQBAU.js";
|
|
7
7
|
import "./chunk-D4HDZEJT.js";
|
|
8
8
|
|
|
9
9
|
// packages/daemon/src/index.ts
|
|
@@ -35,16 +35,13 @@ function loadBuildDomTreeScript() {
|
|
|
35
35
|
if (cachedBuildDomTreeScript) return cachedBuildDomTreeScript;
|
|
36
36
|
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
37
37
|
const candidates = [
|
|
38
|
-
|
|
39
|
-
path.resolve(currentDir, "../
|
|
40
|
-
|
|
41
|
-
path.resolve(currentDir, "
|
|
42
|
-
|
|
43
|
-
path.resolve(currentDir, "
|
|
44
|
-
path.resolve(currentDir, "
|
|
45
|
-
path.resolve(currentDir, "../../extension/buildDomTree.js"),
|
|
46
|
-
path.resolve(currentDir, "../../../packages/extension/dist/buildDomTree.js"),
|
|
47
|
-
path.resolve(currentDir, "../../../packages/extension/public/buildDomTree.js")
|
|
38
|
+
// Built dist: dist/daemon.js → ../packages/shared/buildDomTree.js
|
|
39
|
+
path.resolve(currentDir, "../packages/shared/buildDomTree.js"),
|
|
40
|
+
// Dev mode: packages/daemon/src/ → ../../shared/buildDomTree.js
|
|
41
|
+
path.resolve(currentDir, "../../shared/buildDomTree.js"),
|
|
42
|
+
// npm installed: dist/daemon.js → same level
|
|
43
|
+
path.resolve(currentDir, "./buildDomTree.js"),
|
|
44
|
+
path.resolve(currentDir, "../buildDomTree.js")
|
|
48
45
|
];
|
|
49
46
|
for (const candidate of candidates) {
|
|
50
47
|
try {
|
|
@@ -1021,11 +1018,15 @@ var HttpServer = class {
|
|
|
1021
1018
|
(_, reject) => setTimeout(() => reject(new Error("CDP connection timeout")), COMMAND_TIMEOUT)
|
|
1022
1019
|
)
|
|
1023
1020
|
]);
|
|
1024
|
-
} catch
|
|
1021
|
+
} catch {
|
|
1022
|
+
const cdpTarget = `${this.cdp.host}:${this.cdp.port}`;
|
|
1023
|
+
const reason = this.cdp.lastError || "unknown";
|
|
1025
1024
|
this.sendJson(res, 503, {
|
|
1026
1025
|
id: request.id,
|
|
1027
1026
|
success: false,
|
|
1028
|
-
error:
|
|
1027
|
+
error: `Chrome not connected (CDP at ${cdpTarget})`,
|
|
1028
|
+
reason,
|
|
1029
|
+
hint: "Make sure Chrome is running. Try: bb-browser daemon shutdown && bb-browser tab list"
|
|
1029
1030
|
});
|
|
1030
1031
|
return;
|
|
1031
1032
|
}
|
|
@@ -1151,6 +1152,8 @@ var CdpConnection = class {
|
|
|
1151
1152
|
currentTargetId;
|
|
1152
1153
|
connectionPromise = null;
|
|
1153
1154
|
_connected = false;
|
|
1155
|
+
/** Last connection error (for diagnostics in 503 responses). */
|
|
1156
|
+
lastError = null;
|
|
1154
1157
|
/** Resolvers for commands queued before CDP is ready. */
|
|
1155
1158
|
readyWaiters = [];
|
|
1156
1159
|
constructor(host, port, tabManager) {
|
|
@@ -1174,6 +1177,15 @@ var CdpConnection = class {
|
|
|
1174
1177
|
this.connectionPromise = this.doConnect();
|
|
1175
1178
|
try {
|
|
1176
1179
|
await this.connectionPromise;
|
|
1180
|
+
this.lastError = null;
|
|
1181
|
+
} catch (err) {
|
|
1182
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
1183
|
+
const connErr = new Error(this.lastError);
|
|
1184
|
+
for (const waiter of this.readyWaiters) {
|
|
1185
|
+
waiter.reject(connErr);
|
|
1186
|
+
}
|
|
1187
|
+
this.readyWaiters = [];
|
|
1188
|
+
throw err;
|
|
1177
1189
|
} finally {
|
|
1178
1190
|
this.connectionPromise = null;
|
|
1179
1191
|
}
|
|
@@ -1205,6 +1217,7 @@ var CdpConnection = class {
|
|
|
1205
1217
|
/** Wait until CDP connection is established (for two-phase startup). */
|
|
1206
1218
|
waitUntilReady() {
|
|
1207
1219
|
if (this._connected) return Promise.resolve();
|
|
1220
|
+
if (this.lastError) return Promise.reject(new Error(this.lastError));
|
|
1208
1221
|
return new Promise((resolve, reject) => {
|
|
1209
1222
|
this.readyWaiters.push({ resolve, reject });
|
|
1210
1223
|
});
|
|
@@ -1311,10 +1324,16 @@ var CdpConnection = class {
|
|
|
1311
1324
|
ws.on("close", () => {
|
|
1312
1325
|
this._connected = false;
|
|
1313
1326
|
this.socket = null;
|
|
1327
|
+
this.lastError = "CDP WebSocket closed unexpectedly";
|
|
1314
1328
|
for (const p of this.pending.values()) {
|
|
1315
1329
|
p.reject(new Error("CDP connection closed"));
|
|
1316
1330
|
}
|
|
1317
1331
|
this.pending.clear();
|
|
1332
|
+
const closeErr = new Error(this.lastError);
|
|
1333
|
+
for (const waiter of this.readyWaiters) {
|
|
1334
|
+
waiter.reject(closeErr);
|
|
1335
|
+
}
|
|
1336
|
+
this.readyWaiters = [];
|
|
1318
1337
|
});
|
|
1319
1338
|
ws.on("error", () => {
|
|
1320
1339
|
});
|
|
@@ -1822,9 +1841,8 @@ var TabStateManager = class {
|
|
|
1822
1841
|
};
|
|
1823
1842
|
|
|
1824
1843
|
// packages/daemon/src/index.ts
|
|
1825
|
-
var
|
|
1826
|
-
var
|
|
1827
|
-
var TOKEN_FILE = path2.join(DAEMON_DIR, "daemon.token");
|
|
1844
|
+
var DAEMON_DIR = process.env.BB_BROWSER_HOME || path2.join(os.homedir(), ".bb-browser");
|
|
1845
|
+
var DAEMON_JSON = path2.join(DAEMON_DIR, "daemon.json");
|
|
1828
1846
|
var DEFAULT_CDP_PORT = 19825;
|
|
1829
1847
|
function parseOptions() {
|
|
1830
1848
|
const { values } = parseArgs({
|
|
@@ -1893,28 +1911,17 @@ Endpoints:
|
|
|
1893
1911
|
token
|
|
1894
1912
|
};
|
|
1895
1913
|
}
|
|
1896
|
-
function
|
|
1897
|
-
writeFileSync(PID_FILE_PATH, String(process.pid), "utf-8");
|
|
1898
|
-
}
|
|
1899
|
-
function cleanupPidFile() {
|
|
1900
|
-
if (existsSync(PID_FILE_PATH)) {
|
|
1901
|
-
try {
|
|
1902
|
-
unlinkSync(PID_FILE_PATH);
|
|
1903
|
-
} catch {
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
}
|
|
1907
|
-
function writeTokenFile(token) {
|
|
1914
|
+
function writeDaemonJson(info) {
|
|
1908
1915
|
try {
|
|
1909
1916
|
mkdirSync(DAEMON_DIR, { recursive: true });
|
|
1910
|
-
writeFileSync(
|
|
1917
|
+
writeFileSync(DAEMON_JSON, JSON.stringify(info), { mode: 384 });
|
|
1911
1918
|
} catch {
|
|
1912
1919
|
}
|
|
1913
1920
|
}
|
|
1914
|
-
function
|
|
1915
|
-
if (existsSync(
|
|
1921
|
+
function cleanupDaemonJson() {
|
|
1922
|
+
if (existsSync(DAEMON_JSON)) {
|
|
1916
1923
|
try {
|
|
1917
|
-
unlinkSync(
|
|
1924
|
+
unlinkSync(DAEMON_JSON);
|
|
1918
1925
|
} catch {
|
|
1919
1926
|
}
|
|
1920
1927
|
}
|
|
@@ -1935,7 +1942,7 @@ async function discoverCdpPort(host, port) {
|
|
|
1935
1942
|
}
|
|
1936
1943
|
} catch {
|
|
1937
1944
|
}
|
|
1938
|
-
const managedPortFile = path2.join(
|
|
1945
|
+
const managedPortFile = path2.join(DAEMON_DIR, "browser", "cdp-port");
|
|
1939
1946
|
try {
|
|
1940
1947
|
const rawPort = readFileSync2(managedPortFile, "utf8").trim();
|
|
1941
1948
|
const managedPort = parseInt(rawPort, 10);
|
|
@@ -1982,8 +1989,7 @@ async function main() {
|
|
|
1982
1989
|
console.error("[Daemon] Shutting down...");
|
|
1983
1990
|
cdp.disconnect();
|
|
1984
1991
|
await httpServer.stop();
|
|
1985
|
-
|
|
1986
|
-
cleanupTokenFile();
|
|
1992
|
+
cleanupDaemonJson();
|
|
1987
1993
|
process.exit(0);
|
|
1988
1994
|
};
|
|
1989
1995
|
const httpServer = new HttpServer({
|
|
@@ -1996,8 +2002,12 @@ async function main() {
|
|
|
1996
2002
|
process.on("SIGINT", shutdown);
|
|
1997
2003
|
process.on("SIGTERM", shutdown);
|
|
1998
2004
|
await httpServer.start();
|
|
1999
|
-
|
|
2000
|
-
|
|
2005
|
+
writeDaemonJson({
|
|
2006
|
+
pid: process.pid,
|
|
2007
|
+
host: options.host,
|
|
2008
|
+
port: options.port,
|
|
2009
|
+
token: options.token
|
|
2010
|
+
});
|
|
2001
2011
|
console.error(
|
|
2002
2012
|
`[Daemon] HTTP server listening on http://${options.host}:${options.port}`
|
|
2003
2013
|
);
|
|
@@ -2020,8 +2030,7 @@ async function main() {
|
|
|
2020
2030
|
}
|
|
2021
2031
|
main().catch((error) => {
|
|
2022
2032
|
console.error("[Daemon] Fatal error:", error);
|
|
2023
|
-
|
|
2024
|
-
cleanupTokenFile();
|
|
2033
|
+
cleanupDaemonJson();
|
|
2025
2034
|
process.exit(1);
|
|
2026
2035
|
});
|
|
2027
2036
|
//# sourceMappingURL=daemon.js.map
|