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
|
@@ -1,57 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
parseOpenClawJson
|
|
4
|
+
} from "./chunk-FSL4RNI6.js";
|
|
2
5
|
import "./chunk-D4HDZEJT.js";
|
|
3
6
|
|
|
4
7
|
// packages/cli/src/openclaw-bridge.ts
|
|
5
8
|
import { execFileSync } from "child_process";
|
|
6
|
-
|
|
7
|
-
// packages/cli/src/openclaw-json.ts
|
|
8
|
-
function buildPreview(raw) {
|
|
9
|
-
return raw.length > 200 ? `${raw.slice(0, 200)}...` : raw;
|
|
10
|
-
}
|
|
11
|
-
function tryParseJson(raw) {
|
|
12
|
-
try {
|
|
13
|
-
return { ok: true, value: JSON.parse(raw) };
|
|
14
|
-
} catch (error) {
|
|
15
|
-
return {
|
|
16
|
-
ok: false,
|
|
17
|
-
error: error instanceof Error ? error : new Error(String(error))
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function tryParseLastJsonLineBlock(raw) {
|
|
22
|
-
const lines = raw.split(/\r?\n/);
|
|
23
|
-
for (let end = lines.length; end > 0; end -= 1) {
|
|
24
|
-
for (let start = end - 1; start >= 0; start -= 1) {
|
|
25
|
-
const candidate = lines.slice(start, end).join("\n").trim();
|
|
26
|
-
if (!candidate) {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
const parsed = tryParseJson(candidate);
|
|
30
|
-
if (parsed.ok) {
|
|
31
|
-
return parsed;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
function parseOpenClawJson(raw) {
|
|
38
|
-
const trimmed = raw.trim();
|
|
39
|
-
if (!trimmed) {
|
|
40
|
-
throw new Error("OpenClaw returned empty output");
|
|
41
|
-
}
|
|
42
|
-
const direct = tryParseJson(trimmed);
|
|
43
|
-
if (direct.ok) {
|
|
44
|
-
return direct.value;
|
|
45
|
-
}
|
|
46
|
-
const lineBlock = tryParseLastJsonLineBlock(trimmed);
|
|
47
|
-
if (lineBlock) {
|
|
48
|
-
return lineBlock.value;
|
|
49
|
-
}
|
|
50
|
-
throw new Error(`Failed to parse OpenClaw JSON output: ${direct.error.message}
|
|
51
|
-
Raw (preview): ${buildPreview(trimmed)}`);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// packages/cli/src/openclaw-bridge.ts
|
|
55
9
|
var OPENCLAW_EVALUATE_TIMEOUT_MS = 12e4;
|
|
56
10
|
var EXEC_TIMEOUT_BUFFER_MS = 5e3;
|
|
57
11
|
function buildOpenClawArgs(args, timeout) {
|
|
@@ -59,7 +13,16 @@ function buildOpenClawArgs(args, timeout) {
|
|
|
59
13
|
if (!subcommand) {
|
|
60
14
|
throw new Error("OpenClaw browser command requires a subcommand");
|
|
61
15
|
}
|
|
62
|
-
|
|
16
|
+
const browserLevelFlags = [];
|
|
17
|
+
const subcommandArgs = [];
|
|
18
|
+
for (const arg of rest) {
|
|
19
|
+
if (arg === "--json") {
|
|
20
|
+
browserLevelFlags.push(arg);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
subcommandArgs.push(arg);
|
|
24
|
+
}
|
|
25
|
+
return ["openclaw", "browser", ...browserLevelFlags, "--timeout", String(timeout), subcommand, ...subcommandArgs];
|
|
63
26
|
}
|
|
64
27
|
function getOpenClawExecTimeout(timeout) {
|
|
65
28
|
return timeout + EXEC_TIMEOUT_BUFFER_MS;
|
|
@@ -103,4 +66,4 @@ export {
|
|
|
103
66
|
ocGetTabs,
|
|
104
67
|
ocOpenTab
|
|
105
68
|
};
|
|
106
|
-
//# sourceMappingURL=openclaw-bridge-
|
|
69
|
+
//# sourceMappingURL=openclaw-bridge-4XJKWEQ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/cli/src/openclaw-bridge.ts"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { parseOpenClawJson } from \"./openclaw-json.js\";\n\nconst OPENCLAW_EVALUATE_TIMEOUT_MS = 120000;\nconst EXEC_TIMEOUT_BUFFER_MS = 5000;\n\nexport interface OCTab {\n targetId: string;\n url: string;\n title: string;\n type: string;\n}\n\nexport function buildOpenClawArgs(args: string[], timeout: number): string[] {\n const [subcommand, ...rest] = args;\n if (!subcommand) {\n throw new Error(\"OpenClaw browser command requires a subcommand\");\n }\n\n const browserLevelFlags: string[] = [];\n const subcommandArgs: string[] = [];\n for (const arg of rest) {\n if (arg === \"--json\") {\n browserLevelFlags.push(arg);\n continue;\n }\n subcommandArgs.push(arg);\n }\n\n return [\"openclaw\", \"browser\", ...browserLevelFlags, \"--timeout\", String(timeout), subcommand, ...subcommandArgs];\n}\n\nexport function getOpenClawExecTimeout(timeout: number): number {\n return timeout + EXEC_TIMEOUT_BUFFER_MS;\n}\n\nfunction runOpenClaw(args: string[], timeout: number): string {\n return execFileSync(\"npx\", buildOpenClawArgs(args, timeout), {\n encoding: \"utf-8\",\n timeout: getOpenClawExecTimeout(timeout),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nexport function ocGetTabs(): OCTab[] {\n const raw = runOpenClaw([\"tabs\", \"--json\"], 15000);\n const data = parseOpenClawJson<{ tabs?: OCTab[] }>(raw);\n return (data.tabs || []).filter((tab: OCTab) => tab.type === \"page\");\n}\n\nexport function ocFindTabByDomain(tabs: OCTab[], domain: string): OCTab | undefined {\n return tabs.find((tab) => {\n try {\n const hostname = new URL(tab.url).hostname;\n return hostname === domain || hostname.endsWith(`.${domain}`);\n } catch {\n return false;\n }\n });\n}\n\nexport function ocOpenTab(url: string): string {\n const raw = runOpenClaw([\"open\", url, \"--json\"], 30000);\n const data = parseOpenClawJson<{ id?: string; targetId?: string }>(raw);\n return data.id || data.targetId;\n}\n\nexport function ocEvaluate(targetId: string, fn: string): unknown {\n const raw = runOpenClaw([\"evaluate\", \"--fn\", fn, \"--target-id\", targetId], OPENCLAW_EVALUATE_TIMEOUT_MS);\n return parseOpenClawJson(raw);\n}\n"],"mappings":";;;;;;;AAAA,SAAS,oBAAoB;AAG7B,IAAM,+BAA+B;AACrC,IAAM,yBAAyB;AASxB,SAAS,kBAAkB,MAAgB,SAA2B;AAC3E,QAAM,CAAC,YAAY,GAAG,IAAI,IAAI;AAC9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,oBAA8B,CAAC;AACrC,QAAM,iBAA2B,CAAC;AAClC,aAAW,OAAO,MAAM;AACtB,QAAI,QAAQ,UAAU;AACpB,wBAAkB,KAAK,GAAG;AAC1B;AAAA,IACF;AACA,mBAAe,KAAK,GAAG;AAAA,EACzB;AAEA,SAAO,CAAC,YAAY,WAAW,GAAG,mBAAmB,aAAa,OAAO,OAAO,GAAG,YAAY,GAAG,cAAc;AAClH;AAEO,SAAS,uBAAuB,SAAyB;AAC9D,SAAO,UAAU;AACnB;AAEA,SAAS,YAAY,MAAgB,SAAyB;AAC5D,SAAO,aAAa,OAAO,kBAAkB,MAAM,OAAO,GAAG;AAAA,IAC3D,UAAU;AAAA,IACV,SAAS,uBAAuB,OAAO;AAAA,IACvC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,EAChC,CAAC,EAAE,KAAK;AACV;AAEO,SAAS,YAAqB;AACnC,QAAM,MAAM,YAAY,CAAC,QAAQ,QAAQ,GAAG,IAAK;AACjD,QAAM,OAAO,kBAAsC,GAAG;AACtD,UAAQ,KAAK,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAe,IAAI,SAAS,MAAM;AACrE;AAEO,SAAS,kBAAkB,MAAe,QAAmC;AAClF,SAAO,KAAK,KAAK,CAAC,QAAQ;AACxB,QAAI;AACF,YAAM,WAAW,IAAI,IAAI,IAAI,GAAG,EAAE;AAClC,aAAO,aAAa,UAAU,SAAS,SAAS,IAAI,MAAM,EAAE;AAAA,IAC9D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEO,SAAS,UAAU,KAAqB;AAC7C,QAAM,MAAM,YAAY,CAAC,QAAQ,KAAK,QAAQ,GAAG,GAAK;AACtD,QAAM,OAAO,kBAAsD,GAAG;AACtE,SAAO,KAAK,MAAM,KAAK;AACzB;AAEO,SAAS,WAAW,UAAkB,IAAqB;AAChE,QAAM,MAAM,YAAY,CAAC,YAAY,QAAQ,IAAI,eAAe,QAAQ,GAAG,4BAA4B;AACvG,SAAO,kBAAkB,GAAG;AAC9B;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bb-browser",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "Your browser is the API. CLI + MCP server for AI agents to control Chrome with your login state.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"main": "./dist/cli.js",
|
|
11
11
|
"files": [
|
|
12
12
|
"dist",
|
|
13
|
-
"
|
|
13
|
+
"packages/shared/buildDomTree.js",
|
|
14
14
|
"README.md",
|
|
15
15
|
"LICENSE"
|
|
16
16
|
],
|
|
@@ -62,11 +62,10 @@
|
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "turbo run build && pnpm build:release",
|
|
65
|
-
"build:release": "tsup
|
|
66
|
-
"build:extension": "rm -rf extension && cp -r packages/extension/dist extension",
|
|
65
|
+
"build:release": "tsup",
|
|
67
66
|
"dev": "turbo run dev",
|
|
68
67
|
"test": "turbo run test",
|
|
69
68
|
"lint": "turbo run lint",
|
|
70
|
-
"clean": "turbo run clean && rm -rf node_modules dist
|
|
69
|
+
"clean": "turbo run clean && rm -rf node_modules dist"
|
|
71
70
|
}
|
|
72
71
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/cli/src/openclaw-bridge.ts","../packages/cli/src/openclaw-json.ts"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { parseOpenClawJson } from \"./openclaw-json.js\";\n\nconst OPENCLAW_EVALUATE_TIMEOUT_MS = 120000;\nconst EXEC_TIMEOUT_BUFFER_MS = 5000;\n\nexport interface OCTab {\n targetId: string;\n url: string;\n title: string;\n type: string;\n}\n\nexport function buildOpenClawArgs(args: string[], timeout: number): string[] {\n const [subcommand, ...rest] = args;\n if (!subcommand) {\n throw new Error(\"OpenClaw browser command requires a subcommand\");\n }\n\n return [\"openclaw\", \"browser\", subcommand, \"--timeout\", String(timeout), ...rest];\n}\n\nexport function getOpenClawExecTimeout(timeout: number): number {\n return timeout + EXEC_TIMEOUT_BUFFER_MS;\n}\n\nfunction runOpenClaw(args: string[], timeout: number): string {\n return execFileSync(\"npx\", buildOpenClawArgs(args, timeout), {\n encoding: \"utf-8\",\n timeout: getOpenClawExecTimeout(timeout),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nexport function ocGetTabs(): OCTab[] {\n const raw = runOpenClaw([\"tabs\", \"--json\"], 15000);\n const data = parseOpenClawJson<{ tabs?: OCTab[] }>(raw);\n return (data.tabs || []).filter((tab: OCTab) => tab.type === \"page\");\n}\n\nexport function ocFindTabByDomain(tabs: OCTab[], domain: string): OCTab | undefined {\n return tabs.find((tab) => {\n try {\n const hostname = new URL(tab.url).hostname;\n return hostname === domain || hostname.endsWith(`.${domain}`);\n } catch {\n return false;\n }\n });\n}\n\nexport function ocOpenTab(url: string): string {\n const raw = runOpenClaw([\"open\", url, \"--json\"], 30000);\n const data = parseOpenClawJson<{ id?: string; targetId?: string }>(raw);\n return data.id || data.targetId;\n}\n\nexport function ocEvaluate(targetId: string, fn: string): unknown {\n const raw = runOpenClaw([\"evaluate\", \"--fn\", fn, \"--target-id\", targetId], OPENCLAW_EVALUATE_TIMEOUT_MS);\n return parseOpenClawJson(raw);\n}\n","interface ParseSuccess<T> {\n ok: true;\n value: T;\n}\n\ninterface ParseFailure {\n ok: false;\n error: Error;\n}\n\nfunction buildPreview(raw: string): string {\n return raw.length > 200 ? `${raw.slice(0, 200)}...` : raw;\n}\n\nfunction tryParseJson<T>(raw: string): ParseSuccess<T> | ParseFailure {\n try {\n return { ok: true, value: JSON.parse(raw) as T };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\nfunction tryParseLastJsonLineBlock<T>(raw: string): ParseSuccess<T> | null {\n const lines = raw.split(/\\r?\\n/);\n\n // OpenClaw diagnostics are emitted as extra lines around the JSON payload,\n // so prefer the last contiguous block of lines that parses cleanly as JSON.\n for (let end = lines.length; end > 0; end -= 1) {\n for (let start = end - 1; start >= 0; start -= 1) {\n const candidate = lines.slice(start, end).join(\"\\n\").trim();\n if (!candidate) {\n continue;\n }\n\n const parsed = tryParseJson<T>(candidate);\n if (parsed.ok) {\n return parsed;\n }\n }\n }\n\n return null;\n}\n\nexport function parseOpenClawJson<T>(raw: string): T {\n const trimmed = raw.trim();\n if (!trimmed) {\n throw new Error(\"OpenClaw returned empty output\");\n }\n\n const direct = tryParseJson<T>(trimmed);\n if (direct.ok) {\n return direct.value;\n }\n\n const lineBlock = tryParseLastJsonLineBlock<T>(trimmed);\n if (lineBlock) {\n return lineBlock.value;\n }\n\n throw new Error(`Failed to parse OpenClaw JSON output: ${direct.error.message}\\nRaw (preview): ${buildPreview(trimmed)}`);\n}\n"],"mappings":"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","names":[]}
|