bb-browser-api 0.11.5

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.
@@ -0,0 +1,494 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ external_exports
4
+ } from "./chunk-ERAIAHQ5.js";
5
+
6
+ // packages/shared/dist/index.js
7
+ import { randomUUID } from "crypto";
8
+ import { readFile } from "fs/promises";
9
+ import { request as httpRequest } from "http";
10
+ import { homedir } from "os";
11
+ import { join } from "path";
12
+ function generateId() {
13
+ return randomUUID();
14
+ }
15
+ var DAEMON_PORT = 18888;
16
+ var DAEMON_HOST = "127.0.0.1";
17
+ var COMMAND_TIMEOUT = 3e4;
18
+ var COMMANDS = [
19
+ // ---------------------------------------------------------------------------
20
+ // Navigate
21
+ // ---------------------------------------------------------------------------
22
+ {
23
+ name: "open",
24
+ action: "open",
25
+ description: "Navigate to a URL. Opens in a new tab if no tab is specified.",
26
+ category: "navigate",
27
+ args: external_exports.object({
28
+ url: external_exports.string().describe("URL to open"),
29
+ tab: external_exports.string().optional().describe("Tab short ID to navigate in (omit to open in a new tab)")
30
+ })
31
+ },
32
+ {
33
+ name: "back",
34
+ action: "back",
35
+ description: "Navigate back in browser history",
36
+ category: "navigate",
37
+ args: external_exports.object({
38
+ tab: external_exports.string().optional().describe("Tab short ID")
39
+ })
40
+ },
41
+ {
42
+ name: "forward",
43
+ action: "forward",
44
+ description: "Navigate forward in browser history",
45
+ category: "navigate",
46
+ args: external_exports.object({
47
+ tab: external_exports.string().optional().describe("Tab short ID")
48
+ })
49
+ },
50
+ {
51
+ name: "refresh",
52
+ action: "refresh",
53
+ description: "Reload the current page",
54
+ category: "navigate",
55
+ args: external_exports.object({
56
+ tab: external_exports.string().optional().describe("Tab short ID")
57
+ })
58
+ },
59
+ {
60
+ name: "close",
61
+ action: "close",
62
+ description: "Close the current tab",
63
+ category: "navigate",
64
+ args: external_exports.object({
65
+ tab: external_exports.string().optional().describe("Tab short ID")
66
+ })
67
+ },
68
+ // ---------------------------------------------------------------------------
69
+ // Observe
70
+ // ---------------------------------------------------------------------------
71
+ {
72
+ name: "snapshot",
73
+ action: "snapshot",
74
+ description: "Get accessibility tree snapshot of the current page. Returns ref numbers for interactive elements.",
75
+ category: "observe",
76
+ args: external_exports.object({
77
+ tab: external_exports.string().optional().describe("Tab short ID"),
78
+ interactive: external_exports.boolean().optional().describe("Only show interactive elements"),
79
+ compact: external_exports.boolean().optional().describe("Remove empty structural nodes for a more concise tree"),
80
+ maxDepth: external_exports.number().optional().describe("Limit tree depth"),
81
+ selector: external_exports.string().optional().describe("CSS selector to filter the snapshot scope")
82
+ })
83
+ },
84
+ {
85
+ name: "screenshot",
86
+ action: "screenshot",
87
+ description: "Take a screenshot of the current page and return it as a PNG data URL",
88
+ category: "observe",
89
+ args: external_exports.object({
90
+ tab: external_exports.string().optional().describe("Tab short ID")
91
+ })
92
+ },
93
+ {
94
+ name: "get",
95
+ action: "get",
96
+ description: "Get element text, attribute, or page-level values (url, title)",
97
+ category: "observe",
98
+ args: external_exports.object({
99
+ attribute: external_exports.enum(["text", "url", "title", "value", "html"]).describe("Attribute to retrieve"),
100
+ ref: external_exports.string().optional().describe("Element ref from snapshot (optional for url/title)"),
101
+ tab: external_exports.string().optional().describe("Tab short ID")
102
+ })
103
+ },
104
+ // ---------------------------------------------------------------------------
105
+ // Interact
106
+ // ---------------------------------------------------------------------------
107
+ {
108
+ name: "click",
109
+ action: "click",
110
+ description: "Click an element by ref number from snapshot",
111
+ category: "interact",
112
+ args: external_exports.object({
113
+ ref: external_exports.string().describe("Element ref from snapshot"),
114
+ tab: external_exports.string().optional().describe("Tab short ID")
115
+ })
116
+ },
117
+ {
118
+ name: "hover",
119
+ action: "hover",
120
+ description: "Hover over an element by ref number from snapshot",
121
+ category: "interact",
122
+ args: external_exports.object({
123
+ ref: external_exports.string().describe("Element ref from snapshot"),
124
+ tab: external_exports.string().optional().describe("Tab short ID")
125
+ })
126
+ },
127
+ {
128
+ name: "fill",
129
+ action: "fill",
130
+ description: "Clear an input field and fill it with new text",
131
+ category: "interact",
132
+ args: external_exports.object({
133
+ ref: external_exports.string().describe("Element ref from snapshot"),
134
+ text: external_exports.string().describe("Text to fill"),
135
+ tab: external_exports.string().optional().describe("Tab short ID")
136
+ })
137
+ },
138
+ {
139
+ name: "type",
140
+ action: "type",
141
+ description: "Type text into an input field without clearing existing content",
142
+ category: "interact",
143
+ args: external_exports.object({
144
+ ref: external_exports.string().describe("Element ref from snapshot"),
145
+ text: external_exports.string().describe("Text to type"),
146
+ tab: external_exports.string().optional().describe("Tab short ID")
147
+ })
148
+ },
149
+ {
150
+ name: "check",
151
+ action: "check",
152
+ description: "Check a checkbox element",
153
+ category: "interact",
154
+ args: external_exports.object({
155
+ ref: external_exports.string().describe("Element ref from snapshot"),
156
+ tab: external_exports.string().optional().describe("Tab short ID")
157
+ })
158
+ },
159
+ {
160
+ name: "uncheck",
161
+ action: "uncheck",
162
+ description: "Uncheck a checkbox element",
163
+ category: "interact",
164
+ args: external_exports.object({
165
+ ref: external_exports.string().describe("Element ref from snapshot"),
166
+ tab: external_exports.string().optional().describe("Tab short ID")
167
+ })
168
+ },
169
+ {
170
+ name: "select",
171
+ action: "select",
172
+ description: "Select a value from a dropdown (select element)",
173
+ category: "interact",
174
+ args: external_exports.object({
175
+ ref: external_exports.string().describe("Element ref from snapshot"),
176
+ value: external_exports.string().describe("Option value to select"),
177
+ tab: external_exports.string().optional().describe("Tab short ID")
178
+ })
179
+ },
180
+ {
181
+ name: "press",
182
+ action: "press",
183
+ description: "Press a keyboard key (e.g. Enter, Tab, Control+a)",
184
+ category: "interact",
185
+ args: external_exports.object({
186
+ key: external_exports.string().describe("Key name to press, e.g. Enter or Control+a"),
187
+ tab: external_exports.string().optional().describe("Tab short ID")
188
+ })
189
+ },
190
+ {
191
+ name: "scroll",
192
+ action: "scroll",
193
+ description: "Scroll the page in a given direction",
194
+ category: "interact",
195
+ args: external_exports.object({
196
+ direction: external_exports.enum(["up", "down", "left", "right"]).describe("Scroll direction"),
197
+ pixels: external_exports.number().default(300).describe("Scroll distance in pixels"),
198
+ tab: external_exports.string().optional().describe("Tab short ID")
199
+ })
200
+ },
201
+ {
202
+ name: "eval",
203
+ action: "eval",
204
+ description: "Execute JavaScript in the page context and return the result",
205
+ category: "interact",
206
+ args: external_exports.object({
207
+ script: external_exports.string().describe("JavaScript source to execute"),
208
+ tab: external_exports.string().optional().describe("Tab short ID")
209
+ })
210
+ },
211
+ // ---------------------------------------------------------------------------
212
+ // System
213
+ // ---------------------------------------------------------------------------
214
+ {
215
+ name: "wait",
216
+ action: "wait",
217
+ description: "Wait for a specified number of milliseconds",
218
+ category: "system",
219
+ args: external_exports.object({
220
+ ms: external_exports.number().default(1e3).describe("Time to wait in milliseconds"),
221
+ tab: external_exports.string().optional().describe("Tab short ID")
222
+ })
223
+ },
224
+ {
225
+ name: "dialog",
226
+ action: "dialog",
227
+ description: "Arm a handler for the next browser dialog (alert, confirm, prompt, beforeunload)",
228
+ category: "system",
229
+ args: external_exports.object({
230
+ dialogResponse: external_exports.enum(["accept", "dismiss"]).default("accept").describe("How to respond to the dialog"),
231
+ promptText: external_exports.string().optional().describe("Text to enter in a prompt dialog (optional, used with accept)"),
232
+ tab: external_exports.string().optional().describe("Tab short ID")
233
+ })
234
+ },
235
+ {
236
+ name: "frame",
237
+ action: "frame",
238
+ description: "Switch context to an iframe by CSS selector",
239
+ category: "system",
240
+ args: external_exports.object({
241
+ selector: external_exports.string().describe("CSS selector for the iframe element"),
242
+ tab: external_exports.string().optional().describe("Tab short ID")
243
+ })
244
+ },
245
+ {
246
+ name: "frame_main",
247
+ action: "frame_main",
248
+ description: "Switch context back to the main frame",
249
+ category: "system",
250
+ args: external_exports.object({
251
+ tab: external_exports.string().optional().describe("Tab short ID")
252
+ })
253
+ },
254
+ // ---------------------------------------------------------------------------
255
+ // Tab
256
+ // ---------------------------------------------------------------------------
257
+ {
258
+ name: "tab_list",
259
+ action: "tab_list",
260
+ description: "List all open browser tabs with their URLs, titles, and short IDs",
261
+ category: "tab",
262
+ args: external_exports.object({})
263
+ },
264
+ {
265
+ name: "tab_new",
266
+ action: "tab_new",
267
+ description: "Open a new browser tab, optionally navigating to a URL",
268
+ category: "tab",
269
+ args: external_exports.object({
270
+ url: external_exports.string().optional().describe("URL to open in the new tab (defaults to about:blank)")
271
+ })
272
+ },
273
+ {
274
+ name: "tab_select",
275
+ action: "tab_select",
276
+ description: "Switch to a tab by short ID or index",
277
+ category: "tab",
278
+ args: external_exports.object({
279
+ tab: external_exports.string().optional().describe("Tab short ID or full target ID"),
280
+ index: external_exports.number().optional().describe("Tab index (0-based, used if tab is not specified)")
281
+ })
282
+ },
283
+ {
284
+ name: "tab_close",
285
+ action: "tab_close",
286
+ description: "Close a specific tab by short ID or index",
287
+ category: "tab",
288
+ args: external_exports.object({
289
+ tab: external_exports.string().optional().describe("Tab short ID or full target ID"),
290
+ index: external_exports.number().optional().describe("Tab index (0-based, used if tab is not specified)")
291
+ })
292
+ },
293
+ // ---------------------------------------------------------------------------
294
+ // Network / observation
295
+ // ---------------------------------------------------------------------------
296
+ {
297
+ name: "network",
298
+ action: "network",
299
+ description: "Inspect or manage network activity. Supports incremental queries with since.",
300
+ category: "network",
301
+ args: external_exports.object({
302
+ networkCommand: external_exports.enum(["requests", "route", "unroute", "clear"]).default("requests").describe("Network sub-command"),
303
+ filter: external_exports.string().optional().describe("URL substring filter for requests"),
304
+ since: external_exports.union([external_exports.literal("last_action"), external_exports.number()]).optional().describe("Incremental query: 'last_action' for events since last operation, or a seq number"),
305
+ method: external_exports.string().optional().describe("Filter by HTTP method (GET, POST, etc.)"),
306
+ status: external_exports.string().optional().describe("Filter by status: '4xx', '5xx', or exact code like '200'"),
307
+ limit: external_exports.number().optional().describe("Max number of results to return"),
308
+ withBody: external_exports.boolean().optional().describe("Include request and response bodies"),
309
+ tab: external_exports.string().optional().describe("Tab short ID")
310
+ })
311
+ },
312
+ {
313
+ name: "console",
314
+ action: "console",
315
+ description: "Get or clear console messages from the page",
316
+ category: "network",
317
+ args: external_exports.object({
318
+ consoleCommand: external_exports.enum(["get", "clear"]).default("get").describe("Console sub-command"),
319
+ filter: external_exports.string().optional().describe("Filter console messages by text substring"),
320
+ since: external_exports.union([external_exports.literal("last_action"), external_exports.number()]).optional().describe("Incremental query: 'last_action' for events since last operation, or a seq number"),
321
+ limit: external_exports.number().optional().describe("Max number of results to return"),
322
+ tab: external_exports.string().optional().describe("Tab short ID")
323
+ })
324
+ },
325
+ {
326
+ name: "errors",
327
+ action: "errors",
328
+ description: "Get or clear JavaScript errors from the page",
329
+ category: "network",
330
+ args: external_exports.object({
331
+ errorsCommand: external_exports.enum(["get", "clear"]).default("get").describe("Errors sub-command"),
332
+ filter: external_exports.string().optional().describe("Filter errors by text substring"),
333
+ since: external_exports.union([external_exports.literal("last_action"), external_exports.number()]).optional().describe("Incremental query: 'last_action' for events since last operation, or a seq number"),
334
+ limit: external_exports.number().optional().describe("Max number of results to return"),
335
+ tab: external_exports.string().optional().describe("Tab short ID")
336
+ })
337
+ },
338
+ {
339
+ name: "trace",
340
+ action: "trace",
341
+ description: "Record user interactions for replay or code generation",
342
+ category: "network",
343
+ args: external_exports.object({
344
+ traceCommand: external_exports.enum(["start", "stop", "status"]).describe("Trace sub-command"),
345
+ tab: external_exports.string().optional().describe("Tab short ID")
346
+ })
347
+ },
348
+ {
349
+ name: "history",
350
+ action: "history",
351
+ description: "Search browsing history or list domains (not supported in daemon mode)",
352
+ category: "network",
353
+ args: external_exports.object({
354
+ historyCommand: external_exports.enum(["search", "domains"]).describe("History sub-command"),
355
+ query: external_exports.string().optional().describe("Search query string (used with 'search' sub-command)"),
356
+ days: external_exports.number().default(30).describe("Number of days to look back")
357
+ })
358
+ },
359
+ // ---------------------------------------------------------------------------
360
+ // Site
361
+ // ---------------------------------------------------------------------------
362
+ {
363
+ name: "site_list",
364
+ action: "site_list",
365
+ description: "List all available site adapters",
366
+ category: "site",
367
+ args: external_exports.object({})
368
+ },
369
+ {
370
+ name: "site_search",
371
+ action: "site_search",
372
+ description: "Search site adapters by name, description, or domain",
373
+ category: "site",
374
+ args: external_exports.object({
375
+ query: external_exports.string().describe("Search query")
376
+ })
377
+ },
378
+ {
379
+ name: "site_info",
380
+ action: "site_info",
381
+ description: "Show detailed metadata for a site adapter",
382
+ category: "site",
383
+ args: external_exports.object({
384
+ name: external_exports.string().describe("Adapter name (e.g. reddit/thread)")
385
+ })
386
+ },
387
+ {
388
+ name: "site_recommend",
389
+ action: "site_recommend",
390
+ description: "Recommend site adapters based on browsing history",
391
+ category: "site",
392
+ args: external_exports.object({
393
+ days: external_exports.number().default(30).describe("Number of days of history to analyze")
394
+ })
395
+ },
396
+ {
397
+ name: "site_run",
398
+ action: "site_run",
399
+ description: "Run a site adapter to extract structured data from a website",
400
+ category: "site",
401
+ args: external_exports.object({
402
+ name: external_exports.string().describe("Adapter name (e.g. reddit/thread, twitter/user)"),
403
+ args: external_exports.string().optional().describe("Arguments to pass to the adapter (space-separated or --flag value)"),
404
+ tab: external_exports.string().optional().describe("Tab short ID (auto-detected from adapter domain if omitted)")
405
+ })
406
+ },
407
+ {
408
+ name: "site_update",
409
+ action: "site_update",
410
+ description: "Update community site adapter library (git clone/pull)",
411
+ category: "site",
412
+ args: external_exports.object({})
413
+ }
414
+ ];
415
+ var DAEMON_DIR = process.env.BB_BROWSER_HOME || join(homedir(), ".bb-browser");
416
+ var DAEMON_JSON = join(DAEMON_DIR, "daemon.json");
417
+ async function readDaemonJson() {
418
+ try {
419
+ const raw = await readFile(DAEMON_JSON, "utf8");
420
+ const info = JSON.parse(raw);
421
+ if (typeof info.pid === "number" && typeof info.host === "string" && typeof info.port === "number" && typeof info.token === "string") {
422
+ return info;
423
+ }
424
+ return null;
425
+ } catch {
426
+ return null;
427
+ }
428
+ }
429
+ function isProcessAlive(pid) {
430
+ try {
431
+ process.kill(pid, 0);
432
+ return true;
433
+ } catch {
434
+ return false;
435
+ }
436
+ }
437
+ function httpJson(method, urlPath, info, body, timeout = 5e3) {
438
+ return new Promise((resolveP, reject) => {
439
+ const payload = body !== void 0 ? JSON.stringify(body) : void 0;
440
+ const req = httpRequest(
441
+ {
442
+ hostname: info.host,
443
+ port: info.port,
444
+ path: urlPath,
445
+ method,
446
+ headers: {
447
+ Authorization: `Bearer ${info.token}`,
448
+ ...payload ? {
449
+ "Content-Type": "application/json",
450
+ "Content-Length": Buffer.byteLength(payload)
451
+ } : {}
452
+ },
453
+ timeout
454
+ },
455
+ (res) => {
456
+ const chunks = [];
457
+ res.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
458
+ res.on("end", () => {
459
+ const raw = Buffer.concat(chunks).toString("utf8");
460
+ if ((res.statusCode ?? 500) >= 400) {
461
+ reject(new Error(`Daemon HTTP ${res.statusCode}: ${raw}`));
462
+ return;
463
+ }
464
+ try {
465
+ resolveP(JSON.parse(raw));
466
+ } catch {
467
+ reject(new Error(`Invalid JSON from daemon: ${raw}`));
468
+ }
469
+ });
470
+ }
471
+ );
472
+ req.on("error", reject);
473
+ req.on("timeout", () => {
474
+ req.destroy();
475
+ reject(new Error("Daemon request timed out"));
476
+ });
477
+ if (payload) req.write(payload);
478
+ req.end();
479
+ });
480
+ }
481
+
482
+ export {
483
+ generateId,
484
+ DAEMON_PORT,
485
+ DAEMON_HOST,
486
+ COMMAND_TIMEOUT,
487
+ COMMANDS,
488
+ DAEMON_DIR,
489
+ DAEMON_JSON,
490
+ readDaemonJson,
491
+ isProcessAlive,
492
+ httpJson
493
+ };
494
+ //# sourceMappingURL=chunk-CRK6CV23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/shared/src/protocol.ts","../packages/shared/src/constants.ts","../packages/shared/src/commands.ts","../packages/shared/src/daemon-client.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\r\n\r\n/**\r\n * bb-browser 通信协议 — CLI/MCP ↔ Daemon ↔ Chrome CDP\r\n */\r\n\r\n/** 支持的操作类型 */\r\nexport type ActionType =\r\n | \"open\"\r\n | \"snapshot\"\r\n | \"click\"\r\n | \"hover\"\r\n | \"fill\"\r\n | \"type\"\r\n | \"check\"\r\n | \"uncheck\"\r\n | \"select\"\r\n | \"get\"\r\n | \"screenshot\"\r\n | \"close\"\r\n | \"wait\"\r\n | \"press\"\r\n | \"scroll\"\r\n | \"back\"\r\n | \"forward\"\r\n | \"refresh\"\r\n | \"eval\"\r\n | \"fetch\"\r\n | \"tab_list\"\r\n | \"tab_new\"\r\n | \"tab_select\"\r\n | \"tab_close\"\r\n | \"frame\"\r\n | \"frame_main\"\r\n | \"dialog\"\r\n | \"network\"\r\n | \"console\"\r\n | \"errors\"\r\n | \"trace\"\r\n | \"history\";\r\n\r\n/** 请求类型 */\r\nexport interface Request {\r\n /** 请求唯一标识 */\r\n id: string;\r\n /** 操作类型 */\r\n action: ActionType;\r\n /** 目标 URL(open 操作时必填) */\r\n url?: string;\r\n /** 元素引用(click, fill, get 操作时使用) */\r\n ref?: string;\r\n /** 输入文本(fill 操作时使用) */\r\n text?: string;\r\n /** 获取属性类型(get 操作时使用) */\r\n attribute?: string;\r\n /** 截图保存路径(screenshot 操作时使用) */\r\n path?: string;\r\n /** 是否只输出可交互元素(snapshot 命令使用) */\r\n interactive?: boolean;\r\n /** 移除空结构节点(snapshot 命令使用) */\r\n compact?: boolean;\r\n /** 限制树深度(snapshot 命令使用) */\r\n maxDepth?: number;\r\n /** JavaScript 代码(eval 命令使用) */\r\n script?: string;\r\n /** 选项值(select 命令使用) */\r\n value?: string;\r\n /** 标签页索引(tab_select, tab_close 命令使用) */\r\n index?: number;\r\n /** 标签页 ID(tab_select, tab_close 命令使用,优先于 index) */\r\n tabId?: number | string;\r\n /** CSS 选择器(frame 命令使用,定位 iframe) */\r\n selector?: string;\r\n /** dialog 响应类型(dialog 命令使用) */\r\n dialogResponse?: \"accept\" | \"dismiss\";\r\n /** prompt 对话框的输入文本(dialog accept 时可选) */\r\n promptText?: string;\r\n /** network 子命令:requests, route, unroute, clear */\r\n networkCommand?: \"requests\" | \"route\" | \"unroute\" | \"clear\";\r\n /** network route 选项 */\r\n routeOptions?: {\r\n abort?: boolean;\r\n body?: string;\r\n status?: number;\r\n headers?: Record<string, string>;\r\n };\r\n /** 过滤字符串(network requests, console 使用) */\r\n filter?: string;\r\n /** network requests 是否包含 body/headers */\r\n withBody?: boolean;\r\n /** console 子命令:get, clear */\r\n consoleCommand?: \"get\" | \"clear\";\r\n /** errors 子命令:get, clear */\r\n errorsCommand?: \"get\" | \"clear\";\r\n /** trace 子命令:start, stop, status */\r\n traceCommand?: \"start\" | \"stop\" | \"status\";\r\n /** history 子命令:search, domains */\r\n historyCommand?: \"search\" | \"domains\";\r\n /** 按键名(press 命令使用) */\r\n key?: string;\r\n /** 修饰键列表(press 命令使用) */\r\n modifiers?: string[];\r\n /** 滚动方向(scroll 命令使用) */\r\n direction?: string;\r\n /** 滚动距离(scroll 命令使用) */\r\n pixels?: number;\r\n /** 等待类型(wait 命令使用) */\r\n waitType?: string;\r\n /** 等待毫秒数(wait 命令使用) */\r\n ms?: number;\r\n /** 增量查询起点(observation 命令使用,支持 seq 数值或 \"last_action\") */\r\n since?: number | \"last_action\";\r\n /** HTTP 方法(network requests 过滤使用 / fetch 命令使用) */\r\n method?: string;\r\n /** HTTP 状态码过滤(network requests 使用,支持 \"4xx\"/\"5xx\" 或具体数字) */\r\n status?: string;\r\n /** 返回条数限制(observation 命令使用) */\r\n limit?: number;\r\n /** 请求体(fetch 命令使用) */\r\n body?: string;\r\n /** 请求头(fetch 命令使用) */\r\n headers?: Record<string, string>;\r\n /** fetch credentials 选项(fetch 命令使用,可选值:omit, same-origin, include,默认 omit) */\r\n credentials?: \"omit\" | \"same-origin\" | \"include\";\r\n}\r\n\r\n/** 元素引用信息 */\r\nexport interface RefInfo {\r\n /** CDP backendDOMNodeId(主定位方式) */\r\n backendDOMNodeId?: number;\r\n /** 元素的 XPath(向后兼容) */\r\n xpath?: string;\r\n /** 可访问性角色 */\r\n role: string;\r\n /** 可访问名称 */\r\n name?: string;\r\n /** 标签名 */\r\n tagName?: string;\r\n}\r\n\r\n/** 标签页信息 */\r\nexport interface TabInfo {\r\n /** 标签页在窗口中的索引(0-based) */\r\n index: number;\r\n /** 标签页 URL */\r\n url: string;\r\n /** 标签页标题 */\r\n title: string;\r\n /** 是否是当前活动标签页 */\r\n active: boolean;\r\n /** 标签页 ID(CDP targetId 或 extension tabId) */\r\n tabId: number | string;\r\n /** 短标签页 ID(daemon 模式) */\r\n tab?: string;\r\n}\r\n\r\n/** Snapshot 命令返回的数据 */\r\nexport interface SnapshotData {\r\n /** 文本格式的可访问性树 */\r\n snapshot: string;\r\n /** 元素引用映射,key 为 ref ID */\r\n refs: Record<string, RefInfo>;\r\n}\r\n\r\n/** 网络请求信息 */\r\nexport interface NetworkRequestInfo {\r\n requestId: string;\r\n url: string;\r\n method: string;\r\n type: string;\r\n timestamp: number;\r\n status?: number;\r\n statusText?: string;\r\n failed?: boolean;\r\n failureReason?: string;\r\n requestHeaders?: Record<string, string>;\r\n requestBody?: string;\r\n requestBodyTruncated?: boolean;\r\n responseHeaders?: Record<string, string>;\r\n responseBody?: string;\r\n responseBodyBase64?: boolean;\r\n responseBodyTruncated?: boolean;\r\n mimeType?: string;\r\n bodyError?: string;\r\n}\r\n\r\n/** 控制台消息 */\r\nexport interface ConsoleMessageInfo {\r\n type: 'log' | 'info' | 'warn' | 'error' | 'debug';\r\n text: string;\r\n timestamp: number;\r\n url?: string;\r\n lineNumber?: number;\r\n}\r\n\r\n/** JS 错误信息 */\r\nexport interface JSErrorInfo {\r\n message: string;\r\n url?: string;\r\n lineNumber?: number;\r\n columnNumber?: number;\r\n stackTrace?: string;\r\n timestamp: number;\r\n}\r\n\r\n/** Trace 事件类型 - 录制用户操作 */\r\nexport interface TraceEvent {\r\n /** 事件类型 */\r\n type: 'click' | 'fill' | 'select' | 'check' | 'press' | 'scroll' | 'navigation';\r\n /** 时间戳 */\r\n timestamp: number;\r\n /** 事件发生时的页面 URL */\r\n url: string;\r\n \r\n /** 元素引用 - highlightIndex,可直接用于 @ref */\r\n ref?: number;\r\n /** 备用定位 - XPath */\r\n xpath?: string;\r\n /** CSS 选择器 */\r\n cssSelector?: string;\r\n \r\n /** 操作参数 - fill/select 的值 */\r\n value?: string;\r\n /** 操作参数 - press 的按键 */\r\n key?: string;\r\n /** 操作参数 - scroll 方向 */\r\n direction?: 'up' | 'down' | 'left' | 'right';\r\n /** 操作参数 - scroll 距离 */\r\n pixels?: number;\r\n /** 操作参数 - check/uncheck 状态 */\r\n checked?: boolean;\r\n \r\n /** 语义信息 - 元素角色 */\r\n elementRole?: string;\r\n /** 语义信息 - 元素名称 */\r\n elementName?: string;\r\n /** 语义信息 - 元素标签 */\r\n elementTag?: string;\r\n}\r\n\r\n/** Trace 录制状态 */\r\nexport interface TraceStatus {\r\n /** 是否正在录制 */\r\n recording: boolean;\r\n /** 已录制事件数量 */\r\n eventCount: number;\r\n /** 录制的标签页 ID */\r\n tabId?: number;\r\n}\r\n\r\n/** 响应数据 */\r\nexport interface ResponseData {\r\n /** 页面标题 */\r\n title?: string;\r\n /** 当前 URL */\r\n url?: string;\r\n /** Tab ID */\r\n tabId?: number | string;\r\n /** 短标签页 ID(daemon 模式) */\r\n tab?: string;\r\n /** 全局操作序号 */\r\n seq?: number;\r\n /** 观测查询游标(用于 since 增量查询) */\r\n cursor?: number;\r\n /** Snapshot 数据(snapshot 操作返回) */\r\n snapshotData?: SnapshotData;\r\n /** 获取的文本或属性值(get 操作返回) */\r\n value?: string;\r\n /** 截图路径(screenshot 操作返回) */\r\n screenshotPath?: string;\r\n /** 截图 data URL(screenshot 操作返回) */\r\n dataUrl?: string;\r\n /** eval 执行结果 */\r\n result?: unknown;\r\n /** 标签页列表(tab_list 命令返回) */\r\n tabs?: TabInfo[];\r\n /** 当前活动标签页索引(tab_list 命令返回) */\r\n activeIndex?: number;\r\n /** Frame 信息(frame 命令返回) */\r\n frameInfo?: {\r\n /** iframe 的 CSS 选择器 */\r\n selector?: string;\r\n /** iframe 的 name 属性 */\r\n name?: string;\r\n /** iframe 的 URL */\r\n url?: string;\r\n /** frame ID */\r\n frameId?: number;\r\n };\r\n /** dialog 信息(dialog 命令返回) */\r\n dialogInfo?: {\r\n /** 对话框类型:alert, confirm, prompt, beforeunload */\r\n type: string;\r\n /** 对话框消息 */\r\n message: string;\r\n /** 是否成功处理 */\r\n handled: boolean;\r\n };\r\n /** 网络请求列表(network requests 命令返回) */\r\n networkRequests?: NetworkRequestInfo[];\r\n /** 网络路由规则数量(network route/unroute 命令返回) */\r\n routeCount?: number;\r\n /** 控制台消息列表(console 命令返回) */\r\n consoleMessages?: ConsoleMessageInfo[];\r\n /** JS 错误列表(errors 命令返回) */\r\n jsErrors?: JSErrorInfo[];\r\n /** Trace 事件列表(trace stop 命令返回) */\r\n traceEvents?: TraceEvent[];\r\n /** Trace 录制状态(trace status 命令返回) */\r\n traceStatus?: TraceStatus;\r\n /** History 搜索结果 */\r\n historyItems?: Array<{\r\n url: string;\r\n title: string;\r\n visitCount: number;\r\n lastVisitTime: number;\r\n }>;\r\n /** History 域名聚合结果 */\r\n historyDomains?: Array<{\r\n domain: string;\r\n visits: number;\r\n titles: string[];\r\n }>;\r\n /** fetch 响应数据(fetch 命令返回) */\r\n fetchResponse?: {\r\n status: number;\r\n contentType: string;\r\n body: unknown;\r\n };\r\n}\r\n\r\n/** 响应类型 */\r\nexport interface Response {\r\n /** 对应请求的 ID */\r\n id: string;\r\n /** 操作是否成功 */\r\n success: boolean;\r\n /** 成功时返回的数据 */\r\n data?: ResponseData;\r\n /** 失败时的错误信息 */\r\n error?: string;\r\n}\r\n\r\n/** Daemon 状态 */\r\nexport interface DaemonStatus {\r\n running: boolean;\r\n cdpConnected: boolean;\r\n uptime: number;\r\n currentSeq?: number;\r\n tabs?: Array<{\r\n shortId: string;\r\n targetId: string;\r\n networkRequests: number;\r\n consoleMessages: number;\r\n jsErrors: number;\r\n lastActionSeq: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * 生成唯一请求 ID\r\n * @returns UUID v4 格式的字符串\r\n */\r\nexport function generateId(): string {\r\n return randomUUID();\r\n}\r\n","/**\r\n * bb-browser 共享常量\r\n */\r\n\r\n/** Daemon HTTP 服务端口 */\r\nexport const DAEMON_PORT = 18888;\r\n\r\n/** Daemon 主机地址 */\r\nexport const DAEMON_HOST = \"127.0.0.1\";\r\n\r\n/** SSE 心跳间隔(毫秒) - 15秒确保 MV3 Service Worker 不休眠 */\r\nexport const SSE_HEARTBEAT_INTERVAL = 15000; // 15 秒\r\n\r\n/** 命令执行超时时间(毫秒) */\r\nexport const COMMAND_TIMEOUT = 30000; // 30 秒\r\n\r\n/** SSE 重连延迟(毫秒) */\r\nexport const SSE_RECONNECT_DELAY = 3000; // 3 秒\r\n\r\n/** SSE 最大重连尝试次数 */\r\nexport const SSE_MAX_RECONNECT_ATTEMPTS = 5;\r\n","/**\r\n * Unified command registry — single source of truth for all bb-browser commands.\r\n *\r\n * CLI, MCP, and Edge Clip can auto-generate their interfaces from this registry.\r\n * This module is metadata only — it does not execute anything.\r\n */\r\n\r\nimport { z } from \"zod\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface CommandDef {\r\n /** Human-readable name (e.g. \"snapshot\", \"click\") */\r\n name: string;\r\n /** Maps to command-dispatch case (e.g. \"snapshot\", \"click\") */\r\n action: string;\r\n /** One-line description */\r\n description: string;\r\n /** Command category */\r\n category: \"navigate\" | \"interact\" | \"observe\" | \"tab\" | \"network\" | \"site\" | \"system\";\r\n /** Zod schema for arguments */\r\n args: z.ZodObject<any>;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Command definitions\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const COMMANDS: CommandDef[] = [\r\n // ---------------------------------------------------------------------------\r\n // Navigate\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"open\",\r\n action: \"open\",\r\n description: \"Navigate to a URL. Opens in a new tab if no tab is specified.\",\r\n category: \"navigate\",\r\n args: z.object({\r\n url: z.string().describe(\"URL to open\"),\r\n tab: z.string().optional().describe(\"Tab short ID to navigate in (omit to open in a new tab)\"),\r\n }),\r\n },\r\n {\r\n name: \"back\",\r\n action: \"back\",\r\n description: \"Navigate back in browser history\",\r\n category: \"navigate\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"forward\",\r\n action: \"forward\",\r\n description: \"Navigate forward in browser history\",\r\n category: \"navigate\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"refresh\",\r\n action: \"refresh\",\r\n description: \"Reload the current page\",\r\n category: \"navigate\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"close\",\r\n action: \"close\",\r\n description: \"Close the current tab\",\r\n category: \"navigate\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // Observe\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"snapshot\",\r\n action: \"snapshot\",\r\n description: \"Get accessibility tree snapshot of the current page. Returns ref numbers for interactive elements.\",\r\n category: \"observe\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n interactive: z.boolean().optional().describe(\"Only show interactive elements\"),\r\n compact: z.boolean().optional().describe(\"Remove empty structural nodes for a more concise tree\"),\r\n maxDepth: z.number().optional().describe(\"Limit tree depth\"),\r\n selector: z.string().optional().describe(\"CSS selector to filter the snapshot scope\"),\r\n }),\r\n },\r\n {\r\n name: \"screenshot\",\r\n action: \"screenshot\",\r\n description: \"Take a screenshot of the current page and return it as a PNG data URL\",\r\n category: \"observe\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"get\",\r\n action: \"get\",\r\n description: \"Get element text, attribute, or page-level values (url, title)\",\r\n category: \"observe\",\r\n args: z.object({\r\n attribute: z.enum([\"text\", \"url\", \"title\", \"value\", \"html\"]).describe(\"Attribute to retrieve\"),\r\n ref: z.string().optional().describe(\"Element ref from snapshot (optional for url/title)\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // Interact\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"click\",\r\n action: \"click\",\r\n description: \"Click an element by ref number from snapshot\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"hover\",\r\n action: \"hover\",\r\n description: \"Hover over an element by ref number from snapshot\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"fill\",\r\n action: \"fill\",\r\n description: \"Clear an input field and fill it with new text\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n text: z.string().describe(\"Text to fill\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"type\",\r\n action: \"type\",\r\n description: \"Type text into an input field without clearing existing content\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n text: z.string().describe(\"Text to type\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"check\",\r\n action: \"check\",\r\n description: \"Check a checkbox element\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"uncheck\",\r\n action: \"uncheck\",\r\n description: \"Uncheck a checkbox element\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"select\",\r\n action: \"select\",\r\n description: \"Select a value from a dropdown (select element)\",\r\n category: \"interact\",\r\n args: z.object({\r\n ref: z.string().describe(\"Element ref from snapshot\"),\r\n value: z.string().describe(\"Option value to select\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"press\",\r\n action: \"press\",\r\n description: \"Press a keyboard key (e.g. Enter, Tab, Control+a)\",\r\n category: \"interact\",\r\n args: z.object({\r\n key: z.string().describe(\"Key name to press, e.g. Enter or Control+a\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"scroll\",\r\n action: \"scroll\",\r\n description: \"Scroll the page in a given direction\",\r\n category: \"interact\",\r\n args: z.object({\r\n direction: z.enum([\"up\", \"down\", \"left\", \"right\"]).describe(\"Scroll direction\"),\r\n pixels: z.number().default(300).describe(\"Scroll distance in pixels\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"eval\",\r\n action: \"eval\",\r\n description: \"Execute JavaScript in the page context and return the result\",\r\n category: \"interact\",\r\n args: z.object({\r\n script: z.string().describe(\"JavaScript source to execute\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // System\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"wait\",\r\n action: \"wait\",\r\n description: \"Wait for a specified number of milliseconds\",\r\n category: \"system\",\r\n args: z.object({\r\n ms: z.number().default(1000).describe(\"Time to wait in milliseconds\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"dialog\",\r\n action: \"dialog\",\r\n description: \"Arm a handler for the next browser dialog (alert, confirm, prompt, beforeunload)\",\r\n category: \"system\",\r\n args: z.object({\r\n dialogResponse: z.enum([\"accept\", \"dismiss\"]).default(\"accept\").describe(\"How to respond to the dialog\"),\r\n promptText: z.string().optional().describe(\"Text to enter in a prompt dialog (optional, used with accept)\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"frame\",\r\n action: \"frame\",\r\n description: \"Switch context to an iframe by CSS selector\",\r\n category: \"system\",\r\n args: z.object({\r\n selector: z.string().describe(\"CSS selector for the iframe element\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"frame_main\",\r\n action: \"frame_main\",\r\n description: \"Switch context back to the main frame\",\r\n category: \"system\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // Tab\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"tab_list\",\r\n action: \"tab_list\",\r\n description: \"List all open browser tabs with their URLs, titles, and short IDs\",\r\n category: \"tab\",\r\n args: z.object({}),\r\n },\r\n {\r\n name: \"tab_new\",\r\n action: \"tab_new\",\r\n description: \"Open a new browser tab, optionally navigating to a URL\",\r\n category: \"tab\",\r\n args: z.object({\r\n url: z.string().optional().describe(\"URL to open in the new tab (defaults to about:blank)\"),\r\n }),\r\n },\r\n {\r\n name: \"tab_select\",\r\n action: \"tab_select\",\r\n description: \"Switch to a tab by short ID or index\",\r\n category: \"tab\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID or full target ID\"),\r\n index: z.number().optional().describe(\"Tab index (0-based, used if tab is not specified)\"),\r\n }),\r\n },\r\n {\r\n name: \"tab_close\",\r\n action: \"tab_close\",\r\n description: \"Close a specific tab by short ID or index\",\r\n category: \"tab\",\r\n args: z.object({\r\n tab: z.string().optional().describe(\"Tab short ID or full target ID\"),\r\n index: z.number().optional().describe(\"Tab index (0-based, used if tab is not specified)\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // Network / observation\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"network\",\r\n action: \"network\",\r\n description: \"Inspect or manage network activity. Supports incremental queries with since.\",\r\n category: \"network\",\r\n args: z.object({\r\n networkCommand: z.enum([\"requests\", \"route\", \"unroute\", \"clear\"]).default(\"requests\").describe(\"Network sub-command\"),\r\n filter: z.string().optional().describe(\"URL substring filter for requests\"),\r\n since: z.union([z.literal(\"last_action\"), z.number()]).optional().describe(\"Incremental query: 'last_action' for events since last operation, or a seq number\"),\r\n method: z.string().optional().describe(\"Filter by HTTP method (GET, POST, etc.)\"),\r\n status: z.string().optional().describe(\"Filter by status: '4xx', '5xx', or exact code like '200'\"),\r\n limit: z.number().optional().describe(\"Max number of results to return\"),\r\n withBody: z.boolean().optional().describe(\"Include request and response bodies\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"console\",\r\n action: \"console\",\r\n description: \"Get or clear console messages from the page\",\r\n category: \"network\",\r\n args: z.object({\r\n consoleCommand: z.enum([\"get\", \"clear\"]).default(\"get\").describe(\"Console sub-command\"),\r\n filter: z.string().optional().describe(\"Filter console messages by text substring\"),\r\n since: z.union([z.literal(\"last_action\"), z.number()]).optional().describe(\"Incremental query: 'last_action' for events since last operation, or a seq number\"),\r\n limit: z.number().optional().describe(\"Max number of results to return\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"errors\",\r\n action: \"errors\",\r\n description: \"Get or clear JavaScript errors from the page\",\r\n category: \"network\",\r\n args: z.object({\r\n errorsCommand: z.enum([\"get\", \"clear\"]).default(\"get\").describe(\"Errors sub-command\"),\r\n filter: z.string().optional().describe(\"Filter errors by text substring\"),\r\n since: z.union([z.literal(\"last_action\"), z.number()]).optional().describe(\"Incremental query: 'last_action' for events since last operation, or a seq number\"),\r\n limit: z.number().optional().describe(\"Max number of results to return\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"trace\",\r\n action: \"trace\",\r\n description: \"Record user interactions for replay or code generation\",\r\n category: \"network\",\r\n args: z.object({\r\n traceCommand: z.enum([\"start\", \"stop\", \"status\"]).describe(\"Trace sub-command\"),\r\n tab: z.string().optional().describe(\"Tab short ID\"),\r\n }),\r\n },\r\n {\r\n name: \"history\",\r\n action: \"history\",\r\n description: \"Search browsing history or list domains (not supported in daemon mode)\",\r\n category: \"network\",\r\n args: z.object({\r\n historyCommand: z.enum([\"search\", \"domains\"]).describe(\"History sub-command\"),\r\n query: z.string().optional().describe(\"Search query string (used with 'search' sub-command)\"),\r\n days: z.number().default(30).describe(\"Number of days to look back\"),\r\n }),\r\n },\r\n\r\n // ---------------------------------------------------------------------------\r\n // Site\r\n // ---------------------------------------------------------------------------\r\n {\r\n name: \"site_list\",\r\n action: \"site_list\",\r\n description: \"List all available site adapters\",\r\n category: \"site\",\r\n args: z.object({}),\r\n },\r\n {\r\n name: \"site_search\",\r\n action: \"site_search\",\r\n description: \"Search site adapters by name, description, or domain\",\r\n category: \"site\",\r\n args: z.object({\r\n query: z.string().describe(\"Search query\"),\r\n }),\r\n },\r\n {\r\n name: \"site_info\",\r\n action: \"site_info\",\r\n description: \"Show detailed metadata for a site adapter\",\r\n category: \"site\",\r\n args: z.object({\r\n name: z.string().describe(\"Adapter name (e.g. reddit/thread)\"),\r\n }),\r\n },\r\n {\r\n name: \"site_recommend\",\r\n action: \"site_recommend\",\r\n description: \"Recommend site adapters based on browsing history\",\r\n category: \"site\",\r\n args: z.object({\r\n days: z.number().default(30).describe(\"Number of days of history to analyze\"),\r\n }),\r\n },\r\n {\r\n name: \"site_run\",\r\n action: \"site_run\",\r\n description: \"Run a site adapter to extract structured data from a website\",\r\n category: \"site\",\r\n args: z.object({\r\n name: z.string().describe(\"Adapter name (e.g. reddit/thread, twitter/user)\"),\r\n args: z.string().optional().describe(\"Arguments to pass to the adapter (space-separated or --flag value)\"),\r\n tab: z.string().optional().describe(\"Tab short ID (auto-detected from adapter domain if omitted)\"),\r\n }),\r\n },\r\n {\r\n name: \"site_update\",\r\n action: \"site_update\",\r\n description: \"Update community site adapter library (git clone/pull)\",\r\n category: \"site\",\r\n args: z.object({}),\r\n },\r\n];\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Find a command definition by its action name. */\r\nexport function findCommand(action: string): CommandDef | undefined {\r\n return COMMANDS.find((c) => c.action === action);\r\n}\r\n\r\n/** Get all commands in a given category. */\r\nexport function getCommandsByCategory(category: CommandDef[\"category\"]): CommandDef[] {\r\n return COMMANDS.filter((c) => c.category === category);\r\n}\r\n","/**\r\n * Shared daemon HTTP client utilities.\r\n *\r\n * Used by CLI (daemon-manager), MCP server, and Edge Clip provider\r\n * to communicate with the bb-browser daemon process.\r\n */\r\n\r\nimport { readFile } from \"node:fs/promises\";\r\nimport { request as httpRequest } from \"node:http\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Paths\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const DAEMON_DIR = process.env.BB_BROWSER_HOME || join(homedir(), \".bb-browser\");\r\nexport const DAEMON_JSON = join(DAEMON_DIR, \"daemon.json\");\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface DaemonInfo {\r\n pid: number;\r\n host: string;\r\n port: number;\r\n token: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// daemon.json\r\n// ---------------------------------------------------------------------------\r\n\r\nexport async function readDaemonJson(): Promise<DaemonInfo | null> {\r\n try {\r\n const raw = await readFile(DAEMON_JSON, \"utf8\");\r\n const info = JSON.parse(raw) as DaemonInfo;\r\n if (\r\n typeof info.pid === \"number\" &&\r\n typeof info.host === \"string\" &&\r\n typeof info.port === \"number\" &&\r\n typeof info.token === \"string\"\r\n ) {\r\n return info;\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Process liveness\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function isProcessAlive(pid: number): boolean {\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// HTTP client\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function httpJson<T>(\r\n method: \"GET\" | \"POST\",\r\n urlPath: string,\r\n info: { host: string; port: number; token: string },\r\n body?: unknown,\r\n timeout = 5000,\r\n): Promise<T> {\r\n return new Promise((resolveP, reject) => {\r\n const payload = body !== undefined ? JSON.stringify(body) : undefined;\r\n const req = httpRequest(\r\n {\r\n hostname: info.host,\r\n port: info.port,\r\n path: urlPath,\r\n method,\r\n headers: {\r\n Authorization: `Bearer ${info.token}`,\r\n ...(payload\r\n ? {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n }\r\n : {}),\r\n },\r\n timeout,\r\n },\r\n (res) => {\r\n const chunks: Buffer[] = [];\r\n res.on(\"data\", (chunk: Buffer) => chunks.push(Buffer.from(chunk)));\r\n res.on(\"end\", () => {\r\n const raw = Buffer.concat(chunks).toString(\"utf8\");\r\n if ((res.statusCode ?? 500) >= 400) {\r\n reject(new Error(`Daemon HTTP ${res.statusCode}: ${raw}`));\r\n return;\r\n }\r\n try {\r\n resolveP(JSON.parse(raw) as T);\r\n } catch {\r\n reject(new Error(`Invalid JSON from daemon: ${raw}`));\r\n }\r\n });\r\n },\r\n );\r\n req.on(\"error\", reject);\r\n req.on(\"timeout\", () => {\r\n req.destroy();\r\n reject(new Error(\"Daemon request timed out\"));\r\n });\r\n if (payload) req.write(payload);\r\n req.end();\r\n });\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+
32
+ export {
33
+ __commonJS,
34
+ __export,
35
+ __toESM
36
+ };
37
+ //# sourceMappingURL=chunk-D4HDZEJT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}