bb-browser 0.10.0 → 0.10.1

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.
File without changes
File without changes
File without changes
File without changes
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // packages/shared/dist/index.js
4
+ import { randomUUID } from "crypto";
4
5
  function generateId() {
5
- return crypto.randomUUID();
6
+ return randomUUID();
6
7
  }
7
8
  var DAEMON_PORT = 19824;
8
9
  var DAEMON_HOST = "localhost";
@@ -18,4 +19,4 @@ export {
18
19
  SSE_HEARTBEAT_INTERVAL,
19
20
  COMMAND_TIMEOUT
20
21
  };
21
- //# sourceMappingURL=chunk-DBJBHYC7.js.map
22
+ //# sourceMappingURL=chunk-XYKHDJST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/shared/src/protocol.ts","../packages/shared/src/constants.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\n\n/**\n * CLI 与 Chrome Extension 之间的通信协议类型定义\n */\n\n/** 支持的操作类型 */\nexport type ActionType =\n | \"open\"\n | \"snapshot\"\n | \"click\"\n | \"hover\"\n | \"fill\"\n | \"type\"\n | \"check\"\n | \"uncheck\"\n | \"select\"\n | \"get\"\n | \"screenshot\"\n | \"close\"\n | \"wait\"\n | \"press\"\n | \"scroll\"\n | \"back\"\n | \"forward\"\n | \"refresh\"\n | \"eval\"\n | \"tab_list\"\n | \"tab_new\"\n | \"tab_select\"\n | \"tab_close\"\n | \"frame\"\n | \"frame_main\"\n | \"dialog\"\n | \"network\"\n | \"console\"\n | \"errors\"\n | \"trace\"\n | \"history\";\n\n/** 请求类型 */\nexport interface Request {\n /** 请求唯一标识 */\n id: string;\n /** 操作类型 */\n action: ActionType;\n /** 目标 URL(open 操作时必填) */\n url?: string;\n /** 元素引用(click, fill, get 操作时使用) */\n ref?: string;\n /** 输入文本(fill 操作时使用) */\n text?: string;\n /** 获取属性类型(get 操作时使用) */\n attribute?: string;\n /** 截图保存路径(screenshot 操作时使用) */\n path?: string;\n /** 是否只输出可交互元素(snapshot 命令使用) */\n interactive?: boolean;\n /** 移除空结构节点(snapshot 命令使用) */\n compact?: boolean;\n /** 限制树深度(snapshot 命令使用) */\n maxDepth?: number;\n /** JavaScript 代码(eval 命令使用) */\n script?: string;\n /** 选项值(select 命令使用) */\n value?: string;\n /** 标签页索引(tab_select, tab_close 命令使用) */\n index?: number;\n /** 标签页 ID(tab_select, tab_close 命令使用,优先于 index) */\n tabId?: number | string;\n /** CSS 选择器(frame 命令使用,定位 iframe) */\n selector?: string;\n /** dialog 响应类型(dialog 命令使用) */\n dialogResponse?: \"accept\" | \"dismiss\";\n /** prompt 对话框的输入文本(dialog accept 时可选) */\n promptText?: string;\n /** network 子命令:requests, route, unroute, clear */\n networkCommand?: \"requests\" | \"route\" | \"unroute\" | \"clear\";\n /** network route 选项 */\n routeOptions?: {\n abort?: boolean;\n body?: string;\n status?: number;\n headers?: Record<string, string>;\n };\n /** 过滤字符串(network requests, console 使用) */\n filter?: string;\n /** network requests 是否包含 body/headers */\n withBody?: boolean;\n /** console 子命令:get, clear */\n consoleCommand?: \"get\" | \"clear\";\n /** errors 子命令:get, clear */\n errorsCommand?: \"get\" | \"clear\";\n /** trace 子命令:start, stop, status */\n traceCommand?: \"start\" | \"stop\" | \"status\";\n /** history 子命令:search, domains */\n historyCommand?: \"search\" | \"domains\";\n /** 按键名(press 命令使用) */\n key?: string;\n /** 修饰键列表(press 命令使用) */\n modifiers?: string[];\n /** 滚动方向(scroll 命令使用) */\n direction?: string;\n /** 滚动距离(scroll 命令使用) */\n pixels?: number;\n /** 等待类型(wait 命令使用) */\n waitType?: string;\n /** 等待毫秒数(wait 命令使用) */\n ms?: number;\n}\n\n/** 元素引用信息 */\nexport interface RefInfo {\n /** CDP backendDOMNodeId(主定位方式) */\n backendDOMNodeId?: number;\n /** 元素的 XPath(向后兼容) */\n xpath?: string;\n /** 可访问性角色 */\n role: string;\n /** 可访问名称 */\n name?: string;\n /** 标签名 */\n tagName?: string;\n}\n\n/** 标签页信息 */\nexport interface TabInfo {\n /** 标签页在窗口中的索引(0-based) */\n index: number;\n /** 标签页 URL */\n url: string;\n /** 标签页标题 */\n title: string;\n /** 是否是当前活动标签页 */\n active: boolean;\n /** 标签页 ID */\n tabId: number;\n}\n\n/** Snapshot 命令返回的数据 */\nexport interface SnapshotData {\n /** 文本格式的可访问性树 */\n snapshot: string;\n /** 元素引用映射,key 为 ref ID */\n refs: Record<string, RefInfo>;\n}\n\n/** 网络请求信息 */\nexport interface NetworkRequestInfo {\n requestId: string;\n url: string;\n method: string;\n type: string;\n timestamp: number;\n status?: number;\n statusText?: string;\n failed?: boolean;\n failureReason?: string;\n requestHeaders?: Record<string, string>;\n requestBody?: string;\n requestBodyTruncated?: boolean;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n responseBodyBase64?: boolean;\n responseBodyTruncated?: boolean;\n mimeType?: string;\n bodyError?: string;\n}\n\n/** 控制台消息 */\nexport interface ConsoleMessageInfo {\n type: 'log' | 'info' | 'warn' | 'error' | 'debug';\n text: string;\n timestamp: number;\n url?: string;\n lineNumber?: number;\n}\n\n/** JS 错误信息 */\nexport interface JSErrorInfo {\n message: string;\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: string;\n timestamp: number;\n}\n\n/** Trace 事件类型 - 录制用户操作 */\nexport interface TraceEvent {\n /** 事件类型 */\n type: 'click' | 'fill' | 'select' | 'check' | 'press' | 'scroll' | 'navigation';\n /** 时间戳 */\n timestamp: number;\n /** 事件发生时的页面 URL */\n url: string;\n \n /** 元素引用 - highlightIndex,可直接用于 @ref */\n ref?: number;\n /** 备用定位 - XPath */\n xpath?: string;\n /** CSS 选择器 */\n cssSelector?: string;\n \n /** 操作参数 - fill/select 的值 */\n value?: string;\n /** 操作参数 - press 的按键 */\n key?: string;\n /** 操作参数 - scroll 方向 */\n direction?: 'up' | 'down' | 'left' | 'right';\n /** 操作参数 - scroll 距离 */\n pixels?: number;\n /** 操作参数 - check/uncheck 状态 */\n checked?: boolean;\n \n /** 语义信息 - 元素角色 */\n elementRole?: string;\n /** 语义信息 - 元素名称 */\n elementName?: string;\n /** 语义信息 - 元素标签 */\n elementTag?: string;\n}\n\n/** Trace 录制状态 */\nexport interface TraceStatus {\n /** 是否正在录制 */\n recording: boolean;\n /** 已录制事件数量 */\n eventCount: number;\n /** 录制的标签页 ID */\n tabId?: number;\n}\n\n/** 响应数据 */\nexport interface ResponseData {\n /** 页面标题 */\n title?: string;\n /** 当前 URL */\n url?: string;\n /** Tab ID */\n tabId?: number;\n /** Snapshot 数据(snapshot 操作返回) */\n snapshotData?: SnapshotData;\n /** 获取的文本或属性值(get 操作返回) */\n value?: string;\n /** 截图路径(screenshot 操作返回) */\n screenshotPath?: string;\n /** 截图 data URL(screenshot 操作返回) */\n dataUrl?: string;\n /** eval 执行结果 */\n result?: unknown;\n /** 标签页列表(tab_list 命令返回) */\n tabs?: TabInfo[];\n /** 当前活动标签页索引(tab_list 命令返回) */\n activeIndex?: number;\n /** Frame 信息(frame 命令返回) */\n frameInfo?: {\n /** iframe 的 CSS 选择器 */\n selector?: string;\n /** iframe 的 name 属性 */\n name?: string;\n /** iframe 的 URL */\n url?: string;\n /** frame ID */\n frameId?: number;\n };\n /** dialog 信息(dialog 命令返回) */\n dialogInfo?: {\n /** 对话框类型:alert, confirm, prompt, beforeunload */\n type: string;\n /** 对话框消息 */\n message: string;\n /** 是否成功处理 */\n handled: boolean;\n };\n /** 网络请求列表(network requests 命令返回) */\n networkRequests?: NetworkRequestInfo[];\n /** 网络路由规则数量(network route/unroute 命令返回) */\n routeCount?: number;\n /** 控制台消息列表(console 命令返回) */\n consoleMessages?: ConsoleMessageInfo[];\n /** JS 错误列表(errors 命令返回) */\n jsErrors?: JSErrorInfo[];\n /** Trace 事件列表(trace stop 命令返回) */\n traceEvents?: TraceEvent[];\n /** Trace 录制状态(trace status 命令返回) */\n traceStatus?: TraceStatus;\n /** History 搜索结果 */\n historyItems?: Array<{\n url: string;\n title: string;\n visitCount: number;\n lastVisitTime: number;\n }>;\n /** History 域名聚合结果 */\n historyDomains?: Array<{\n domain: string;\n visits: number;\n titles: string[];\n }>;\n}\n\n/** 响应类型 */\nexport interface Response {\n /** 对应请求的 ID */\n id: string;\n /** 操作是否成功 */\n success: boolean;\n /** 成功时返回的数据 */\n data?: ResponseData;\n /** 失败时的错误信息 */\n error?: string;\n}\n\n/** SSE 事件类型 */\nexport type SSEEventType = \"connected\" | \"heartbeat\" | \"command\";\n\n/** SSE 事件数据 */\nexport interface SSEEvent {\n type: SSEEventType;\n data: unknown;\n}\n\n/** Daemon 状态 */\nexport interface DaemonStatus {\n running: boolean;\n extensionConnected: boolean;\n pendingRequests: number;\n uptime: number;\n}\n\n/**\n * 生成唯一请求 ID\n * @returns UUID v4 格式的字符串\n */\nexport function generateId(): string {\n return randomUUID();\n}\n","/**\n * bb-browser 共享常量\n */\n\n/** Daemon HTTP 服务端口 */\nexport const DAEMON_PORT = 19824;\n\n/** Daemon 主机地址 */\nexport const DAEMON_HOST = \"localhost\";\n\n/** Daemon 基础 URL */\nexport const DAEMON_BASE_URL = `http://${DAEMON_HOST}:${DAEMON_PORT}`;\n\n/** SSE 心跳间隔(毫秒) - 15秒确保 MV3 Service Worker 不休眠 */\nexport const SSE_HEARTBEAT_INTERVAL = 15000; // 15 秒\n\n/** 命令执行超时时间(毫秒) */\nexport const COMMAND_TIMEOUT = 30000; // 30 秒\n\n/** SSE 重连延迟(毫秒) */\nexport const SSE_RECONNECT_DELAY = 3000; // 3 秒\n\n/** SSE 最大重连尝试次数 */\nexport const SSE_MAX_RECONNECT_ATTEMPTS = 5;\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AA+UpB,SAAS,aAAqB;AACnC,SAAO,WAAW;AACpB;AC5UO,IAAM,cAAc;AAGpB,IAAM,cAAc;AAGpB,IAAM,kBAAkB,UAAU,WAAW,IAAI,WAAW;AAG5D,IAAM,yBAAyB;AAG/B,IAAM,kBAAkB;","names":[]}
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  COMMAND_TIMEOUT,
4
4
  generateId
5
- } from "./chunk-DBJBHYC7.js";
5
+ } from "./chunk-XYKHDJST.js";
6
6
  import {
7
7
  applyJq
8
8
  } from "./chunk-AHGAQEFO.js";
@@ -99,10 +99,18 @@ function findBrowserExecutable() {
99
99
  return null;
100
100
  }
101
101
  if (process.platform === "win32") {
102
+ const localAppData = process.env.LOCALAPPDATA ?? "";
102
103
  const candidates = [
103
104
  "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
104
105
  "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
105
- "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
106
+ ...localAppData ? [
107
+ `${localAppData}\\Google\\Chrome Dev\\Application\\chrome.exe`,
108
+ `${localAppData}\\Google\\Chrome SxS\\Application\\chrome.exe`,
109
+ `${localAppData}\\Google\\Chrome Beta\\Application\\chrome.exe`
110
+ ] : [],
111
+ "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
112
+ "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe",
113
+ "C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"
106
114
  ];
107
115
  return candidates.find((candidate) => existsSync(candidate)) ?? null;
108
116
  }
@@ -689,8 +697,7 @@ async function evaluate(targetId, expression, returnByValue = true) {
689
697
  const result = await sessionCommand(targetId, "Runtime.evaluate", {
690
698
  expression,
691
699
  awaitPromise: true,
692
- returnByValue,
693
- replMode: true
700
+ returnByValue
694
701
  });
695
702
  if (result.exceptionDetails) {
696
703
  throw new Error(
@@ -2066,7 +2073,7 @@ async function siteRun(name, args, options) {
2066
2073
  const argsJson = JSON.stringify(argMap);
2067
2074
  const script = `(${jsBody})(${argsJson})`;
2068
2075
  if (options.openclaw) {
2069
- const { ocGetTabs, ocFindTabByDomain, ocOpenTab, ocEvaluate } = await import("./openclaw-bridge-HBJH6UFO.js");
2076
+ const { ocGetTabs, ocFindTabByDomain, ocOpenTab, ocEvaluate } = await import("./openclaw-bridge-7BW5M4YX.js");
2070
2077
  let targetId;
2071
2078
  if (site.domain) {
2072
2079
  const tabs = ocGetTabs();
@@ -3184,7 +3191,7 @@ async function dialogCommand(subCommand, promptText, options = {}) {
3184
3191
  // packages/cli/src/commands/network.ts
3185
3192
  async function networkCommand(subCommand, urlOrFilter, options = {}) {
3186
3193
  const response = await sendCommand2({
3187
- id: crypto.randomUUID(),
3194
+ id: generateId(),
3188
3195
  action: "network",
3189
3196
  networkCommand: subCommand,
3190
3197
  url: subCommand === "route" || subCommand === "unroute" ? urlOrFilter : void 0,
@@ -3271,7 +3278,7 @@ async function networkCommand(subCommand, urlOrFilter, options = {}) {
3271
3278
  // packages/cli/src/commands/console.ts
3272
3279
  async function consoleCommand(options = {}) {
3273
3280
  const response = await sendCommand2({
3274
- id: crypto.randomUUID(),
3281
+ id: generateId(),
3275
3282
  action: "console",
3276
3283
  consoleCommand: options.clear ? "clear" : "get",
3277
3284
  tabId: options.tabId
@@ -3316,7 +3323,7 @@ async function consoleCommand(options = {}) {
3316
3323
  // packages/cli/src/commands/errors.ts
3317
3324
  async function errorsCommand(options = {}) {
3318
3325
  const response = await sendCommand2({
3319
- id: crypto.randomUUID(),
3326
+ id: generateId(),
3320
3327
  action: "errors",
3321
3328
  errorsCommand: options.clear ? "clear" : "get",
3322
3329
  tabId: options.tabId
@@ -3356,7 +3363,7 @@ async function errorsCommand(options = {}) {
3356
3363
  // packages/cli/src/commands/trace.ts
3357
3364
  async function traceCommand(subCommand, options = {}) {
3358
3365
  const response = await sendCommand2({
3359
- id: crypto.randomUUID(),
3366
+ id: generateId(),
3360
3367
  action: "trace",
3361
3368
  traceCommand: subCommand,
3362
3369
  tabId: options.tabId
@@ -3561,7 +3568,7 @@ async function historyCommand(subCommand, options = {}) {
3561
3568
  const data = subCommand === "search" ? { historyItems: searchHistory(options.query, days) } : { historyDomains: getHistoryDomains(days) };
3562
3569
  if (options.json) {
3563
3570
  console.log(JSON.stringify({
3564
- id: crypto.randomUUID(),
3571
+ id: generateId(),
3565
3572
  success: true,
3566
3573
  data
3567
3574
  }));
@@ -3615,7 +3622,7 @@ async function statusCommand(options = {}) {
3615
3622
  }
3616
3623
 
3617
3624
  // packages/cli/src/index.ts
3618
- var VERSION = "0.10.0";
3625
+ var VERSION = "0.10.1";
3619
3626
  var HELP_TEXT = `
3620
3627
  bb-browser - AI Agent \u6D4F\u89C8\u5668\u81EA\u52A8\u5316\u5DE5\u5177
3621
3628