bb-browser 0.1.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/README.md +240 -0
- package/dist/chunk-KATHFDYJ.js +20 -0
- package/dist/chunk-KATHFDYJ.js.map +1 -0
- package/dist/cli.js +1800 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon.js +441 -0
- package/dist/daemon.js.map +1 -0
- package/extension/background.js +2943 -0
- package/extension/background.js.map +1 -0
- package/extension/buildDomTree.js +1505 -0
- package/extension/content/trace.js +339 -0
- package/extension/content/trace.js.map +1 -0
- package/extension/dist/background.js +2943 -0
- package/extension/dist/background.js.map +1 -0
- package/extension/dist/buildDomTree.js +1505 -0
- package/extension/dist/content/trace.js +339 -0
- package/extension/dist/content/trace.js.map +1 -0
- package/extension/dist/manifest.json +25 -0
- package/extension/manifest.json +25 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
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/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# bb-browser
|
|
2
|
+
|
|
3
|
+
面向 AI Agent 的浏览器自动化 CLI 工具。
|
|
4
|
+
|
|
5
|
+
## 核心特性
|
|
6
|
+
|
|
7
|
+
- **复用用户登录态** - 运行在用户的浏览器中,自动复用已登录的网站(Gmail, Twitter, 内部系统等)
|
|
8
|
+
- **AI Agent 友好** - 简洁的 CLI 接口,支持 JSON 输出,Ref 系统方便元素引用
|
|
9
|
+
- **反爬绕过** - 使用 chrome.debugger API,避免 Playwright 等工具的自动化指纹检测
|
|
10
|
+
|
|
11
|
+
## 架构
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
AI Agent (Claude, GPT, etc.)
|
|
15
|
+
│ CLI 命令
|
|
16
|
+
▼
|
|
17
|
+
bb-browser CLI ──HTTP──▶ Daemon ──SSE──▶ Chrome Extension
|
|
18
|
+
│
|
|
19
|
+
▼ chrome.debugger (CDP)
|
|
20
|
+
用户浏览器
|
|
21
|
+
(已登录的网站、Cookies)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 安装
|
|
25
|
+
|
|
26
|
+
### 方式 1:npm 安装(推荐)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g bb-browser
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 方式 2:从源码构建
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git clone https://github.com/yan5xu/bb-browser.git
|
|
36
|
+
cd bb-browser
|
|
37
|
+
pnpm install
|
|
38
|
+
pnpm build
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 加载 Chrome 扩展
|
|
42
|
+
|
|
43
|
+
**必须步骤**:CLI 需要配合 Chrome 扩展使用。
|
|
44
|
+
|
|
45
|
+
1. 打开 Chrome,访问 `chrome://extensions/`
|
|
46
|
+
2. 开启「开发者模式」(右上角开关)
|
|
47
|
+
3. 点击「加载已解压的扩展程序」
|
|
48
|
+
4. 选择扩展目录:
|
|
49
|
+
- npm 安装:`node_modules/bb-browser/extension/`
|
|
50
|
+
- 源码构建:`packages/extension/dist/`
|
|
51
|
+
5. 确认扩展已启用
|
|
52
|
+
|
|
53
|
+
## 使用
|
|
54
|
+
|
|
55
|
+
### 1. 启动 Daemon
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 前台启动(查看日志)
|
|
59
|
+
bb-browser daemon
|
|
60
|
+
|
|
61
|
+
# 或使用别名
|
|
62
|
+
bb-browser start
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. 基本操作
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 打开网页
|
|
69
|
+
bb-browser open https://example.com
|
|
70
|
+
|
|
71
|
+
# 获取页面快照(可交互元素)
|
|
72
|
+
bb-browser snapshot -i
|
|
73
|
+
|
|
74
|
+
# 输出示例:
|
|
75
|
+
# - link "Learn more" [ref=0]
|
|
76
|
+
# - button "Submit" [ref=1]
|
|
77
|
+
# - textbox "Search" [ref=2]
|
|
78
|
+
|
|
79
|
+
# 点击元素
|
|
80
|
+
bb-browser click @0
|
|
81
|
+
|
|
82
|
+
# 填充输入框
|
|
83
|
+
bb-browser fill @2 "search query"
|
|
84
|
+
|
|
85
|
+
# 按键
|
|
86
|
+
bb-browser press Enter
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. 完整命令列表
|
|
90
|
+
|
|
91
|
+
| 命令 | 说明 | 示例 |
|
|
92
|
+
|------|------|------|
|
|
93
|
+
| `open <url>` | 打开 URL | `bb-browser open https://x.com` |
|
|
94
|
+
| `snapshot` | 获取页面快照 | `bb-browser snapshot -i` |
|
|
95
|
+
| `click <ref>` | 点击元素 | `bb-browser click @5` |
|
|
96
|
+
| `hover <ref>` | 悬停元素 | `bb-browser hover @3` |
|
|
97
|
+
| `fill <ref> <text>` | 填充输入框(清空后填入) | `bb-browser fill @2 "hello"` |
|
|
98
|
+
| `type <ref> <text>` | 逐字符输入(追加) | `bb-browser type @2 " world"` |
|
|
99
|
+
| `check <ref>` | 勾选复选框 | `bb-browser check @7` |
|
|
100
|
+
| `uncheck <ref>` | 取消勾选 | `bb-browser uncheck @7` |
|
|
101
|
+
| `select <ref> <val>` | 下拉框选择 | `bb-browser select @4 "option1"` |
|
|
102
|
+
| `eval "<js>"` | 执行 JavaScript | `bb-browser eval "document.title"` |
|
|
103
|
+
| `get text <ref>` | 获取元素文本 | `bb-browser get text @5` |
|
|
104
|
+
| `get url` | 获取当前 URL | `bb-browser get url` |
|
|
105
|
+
| `get title` | 获取页面标题 | `bb-browser get title` |
|
|
106
|
+
| `screenshot [path]` | 截图 | `bb-browser screenshot ./shot.png` |
|
|
107
|
+
| `wait <ms\|@ref>` | 等待时间或元素 | `bb-browser wait 2000` |
|
|
108
|
+
| `press <key>` | 按键 | `bb-browser press Enter` |
|
|
109
|
+
| `scroll <dir> [px]` | 滚动 | `bb-browser scroll down 500` |
|
|
110
|
+
| `back` | 后退 | `bb-browser back` |
|
|
111
|
+
| `forward` | 前进 | `bb-browser forward` |
|
|
112
|
+
| `refresh` | 刷新 | `bb-browser refresh` |
|
|
113
|
+
| `close` | 关闭标签页 | `bb-browser close` |
|
|
114
|
+
|
|
115
|
+
### 4. 标签页管理
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# 列出所有标签页
|
|
119
|
+
bb-browser tab
|
|
120
|
+
|
|
121
|
+
# 新建标签页
|
|
122
|
+
bb-browser tab new https://google.com
|
|
123
|
+
|
|
124
|
+
# 切换到第 2 个标签页
|
|
125
|
+
bb-browser tab 2
|
|
126
|
+
|
|
127
|
+
# 关闭当前标签页
|
|
128
|
+
bb-browser tab close
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 5. iframe 支持
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# 切换到 iframe(通过选择器)
|
|
135
|
+
bb-browser frame "#iframe-id"
|
|
136
|
+
bb-browser frame "[name='content']"
|
|
137
|
+
|
|
138
|
+
# 返回主 frame
|
|
139
|
+
bb-browser frame main
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 6. 对话框处理
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# 接受 alert/confirm
|
|
146
|
+
bb-browser dialog accept
|
|
147
|
+
|
|
148
|
+
# 接受 prompt 并输入文本
|
|
149
|
+
bb-browser dialog accept "input text"
|
|
150
|
+
|
|
151
|
+
# 拒绝对话框
|
|
152
|
+
bb-browser dialog dismiss
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 7. 网络监控
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# 查看网络请求
|
|
159
|
+
bb-browser network requests
|
|
160
|
+
|
|
161
|
+
# 按关键词过滤
|
|
162
|
+
bb-browser network requests api
|
|
163
|
+
|
|
164
|
+
# 拦截并阻止请求
|
|
165
|
+
bb-browser network route "*ads*" --abort
|
|
166
|
+
|
|
167
|
+
# Mock 响应
|
|
168
|
+
bb-browser network route "/api/user" --body '{"name":"test"}'
|
|
169
|
+
|
|
170
|
+
# 移除拦截规则
|
|
171
|
+
bb-browser network unroute
|
|
172
|
+
|
|
173
|
+
# 清空请求记录
|
|
174
|
+
bb-browser network clear
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 8. 调试
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# 查看控制台消息
|
|
181
|
+
bb-browser console
|
|
182
|
+
|
|
183
|
+
# 清空控制台
|
|
184
|
+
bb-browser console --clear
|
|
185
|
+
|
|
186
|
+
# 查看 JS 错误
|
|
187
|
+
bb-browser errors
|
|
188
|
+
|
|
189
|
+
# 清空错误记录
|
|
190
|
+
bb-browser errors --clear
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 9. JSON 输出
|
|
194
|
+
|
|
195
|
+
所有命令支持 `--json` 参数,方便程序解析:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
bb-browser snapshot -i --json
|
|
199
|
+
# {"success":true,"data":{"snapshot":"...","refs":{...}}}
|
|
200
|
+
|
|
201
|
+
bb-browser get url --json
|
|
202
|
+
# {"success":true,"data":"https://example.com"}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## CDP 开发模式
|
|
206
|
+
|
|
207
|
+
以 CDP 调试模式启动 Chrome,支持 `reload` 命令热重载扩展:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# macOS
|
|
211
|
+
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
|
|
212
|
+
--remote-debugging-port=9222 \
|
|
213
|
+
--user-data-dir=/tmp/chrome-debug-profile
|
|
214
|
+
|
|
215
|
+
# 然后加载扩展,之后可以热重载
|
|
216
|
+
bb-browser reload
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## 项目结构
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
bb-browser/
|
|
223
|
+
├── packages/
|
|
224
|
+
│ ├── cli/ # CLI 工具
|
|
225
|
+
│ ├── daemon/ # HTTP Daemon(CLI 与扩展的桥梁)
|
|
226
|
+
│ ├── extension/ # Chrome 扩展
|
|
227
|
+
│ └── shared/ # 共享类型
|
|
228
|
+
└── README.md
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## 技术栈
|
|
232
|
+
|
|
233
|
+
- **CLI**: TypeScript, Commander.js
|
|
234
|
+
- **Daemon**: Node.js HTTP Server, SSE
|
|
235
|
+
- **Extension**: Chrome Manifest V3, chrome.debugger API
|
|
236
|
+
- **构建**: pnpm, Turbo, Vite, tsup
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
MIT
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// packages/shared/dist/index.js
|
|
4
|
+
function generateId() {
|
|
5
|
+
return crypto.randomUUID();
|
|
6
|
+
}
|
|
7
|
+
var DAEMON_PORT = 19824;
|
|
8
|
+
var DAEMON_HOST = "localhost";
|
|
9
|
+
var DAEMON_BASE_URL = `http://${DAEMON_HOST}:${DAEMON_PORT}`;
|
|
10
|
+
var SSE_HEARTBEAT_INTERVAL = 15e3;
|
|
11
|
+
var COMMAND_TIMEOUT = 3e4;
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
generateId,
|
|
15
|
+
DAEMON_PORT,
|
|
16
|
+
DAEMON_BASE_URL,
|
|
17
|
+
SSE_HEARTBEAT_INTERVAL,
|
|
18
|
+
COMMAND_TIMEOUT
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=chunk-KATHFDYJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/shared/src/protocol.ts","../packages/shared/src/constants.ts"],"sourcesContent":["/**\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\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 /** JavaScript 代码(eval 命令使用) */\n script?: string;\n /** 选项值(select 命令使用) */\n value?: string;\n /** 标签页索引(tab_select, tab_close 命令使用) */\n index?: number;\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 /** 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}\n\n/** 元素引用信息 */\nexport interface RefInfo {\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}\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 /** 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}\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 crypto.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":";;;AA4RO,SAAS,aAAqB;AACnC,SAAO,OAAO,WAAW;AAC3B;ACzRO,IAAM,cAAc;AAGpB,IAAM,cAAc;AAGpB,IAAM,kBAAkB,UAAU,WAAW,IAAI,WAAW;AAG5D,IAAM,yBAAyB;AAG/B,IAAM,kBAAkB;","names":[]}
|