@mearl/client 2.1.0 → 2.2.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.
@@ -1,3 +1,4 @@
1
+ import type { BrowserCommandAction } from './generated-browser-action-protocol.js';
1
2
  export interface ParamDef {
2
3
  name: string;
3
4
  type: string;
@@ -5,7 +6,7 @@ export interface ParamDef {
5
6
  description: string;
6
7
  }
7
8
  export interface CommandDef {
8
- name: string;
9
+ name: BrowserCommandAction;
9
10
  description: string;
10
11
  /** payload 字段说明 */
11
12
  params?: ParamDef[];
@@ -13,6 +14,891 @@ export interface CommandDef {
13
14
  outputFlag?: boolean;
14
15
  examples?: string[];
15
16
  }
16
- export declare const COMMANDS: CommandDef[];
17
- export type KnownAction = 'get_requests' | 'get_logs' | 'get_events' | 'get_api_schema' | 'set_mock' | 'get_mocks' | 'set_rule' | 'get_rules' | 'send_request' | 'send_mtop_request' | 'tab_open' | 'tab_close' | 'tab_list' | 'page_click' | 'page_type' | 'page_hover' | 'page_scroll' | 'page_eval' | 'page_press' | 'page_wait' | 'page_navigate' | 'page_upload' | 'page_snapshot' | 'page_screenshot' | 'page_selected_element' | 'page_frames' | 'set_device_emulation' | 'set_timezone' | 'get_cookie' | 'set_cookie' | 'record_start' | 'record_stop' | 'request_domain_permission' | 'get_user_info' | 'browser_list' | 'browser_release' | 'browser_launch' | 'browser_close' | 'run_actions';
18
- export declare const COMMAND_MAP: Map<string, CommandDef>;
17
+ export declare const COMMANDS: readonly [{
18
+ readonly name: "get_requests";
19
+ readonly description: "获取最近的网络请求(mtop 或普通 xhr/fetch)";
20
+ readonly params: [{
21
+ readonly name: "tabId";
22
+ readonly type: "number";
23
+ readonly description: "目标标签页 ID,从 tab_list 获取";
24
+ }, {
25
+ readonly name: "count";
26
+ readonly type: "number";
27
+ readonly description: "返回条数,默认 10";
28
+ }, {
29
+ readonly name: "source";
30
+ readonly type: "\"mtop\" | \"requests\"";
31
+ readonly description: "数据来源,不填时默认 mtop";
32
+ }, {
33
+ readonly name: "filter";
34
+ readonly type: "string";
35
+ readonly description: "按 URL 或 API 名称过滤,支持正则";
36
+ }, {
37
+ readonly name: "includeBody";
38
+ readonly type: "boolean";
39
+ readonly description: "是否包含请求/响应体,默认 true";
40
+ }];
41
+ readonly examples: ["get_requests --payload '{\"count\":5}'", "get_requests --payload '{\"source\":\"mtop\",\"filter\":\"cart\"}'"];
42
+ }, {
43
+ readonly name: "get_logs";
44
+ readonly description: "获取浏览器控制台日志";
45
+ readonly params: [{
46
+ readonly name: "tabId";
47
+ readonly type: "number";
48
+ readonly description: "目标标签页 ID,从 tab_list 获取";
49
+ }, {
50
+ readonly name: "limit";
51
+ readonly type: "number";
52
+ readonly description: "返回条数,默认 20";
53
+ }, {
54
+ readonly name: "level";
55
+ readonly type: "string";
56
+ readonly description: "按日志级别过滤:log/info/warn/error";
57
+ }, {
58
+ readonly name: "filter";
59
+ readonly type: "string";
60
+ readonly description: "按内容过滤,支持正则";
61
+ }];
62
+ readonly examples: ["get_logs --payload '{\"limit\":10,\"level\":\"error\"}'"];
63
+ }, {
64
+ readonly name: "get_events";
65
+ readonly description: "获取 RUM/aplus/ARMS 埋点事件";
66
+ readonly params: [{
67
+ readonly name: "tabId";
68
+ readonly type: "number";
69
+ readonly description: "目标标签页 ID,从 tab_list 获取";
70
+ }, {
71
+ readonly name: "source";
72
+ readonly type: "\"rum\" | \"aplus\" | \"arms\" | \"all\"";
73
+ readonly description: "数据来源,默认 all";
74
+ }, {
75
+ readonly name: "event_type";
76
+ readonly type: "string";
77
+ readonly description: "按事件类型过滤,支持正则,如 CLK/PV";
78
+ }, {
79
+ readonly name: "filter";
80
+ readonly type: "string";
81
+ readonly description: "按 name 或 url 过滤,支持正则";
82
+ }, {
83
+ readonly name: "since";
84
+ readonly type: "number";
85
+ readonly description: "只返回最近 N 秒内的事件";
86
+ }, {
87
+ readonly name: "limit";
88
+ readonly type: "number";
89
+ readonly description: "返回条数,默认 20";
90
+ }, {
91
+ readonly name: "includeRaw";
92
+ readonly type: "boolean";
93
+ readonly description: "返回完整 URL、_raw 和 _context;默认 false";
94
+ }];
95
+ readonly examples: ["get_events --payload '{\"source\":\"aplus\",\"event_type\":\"CLK\",\"limit\":10}'", "get_events --payload '{\"filter\":\"order\",\"includeRaw\":true,\"limit\":1}'", "get_events --payload '{\"tabId\":12345,\"source\":\"all\",\"limit\":20}'"];
96
+ }, {
97
+ readonly name: "get_api_schema";
98
+ readonly description: "获取 API 接口 schema(出入参定义)";
99
+ readonly params: [{
100
+ readonly name: "api";
101
+ readonly type: "string";
102
+ readonly required: true;
103
+ readonly description: "API 名称";
104
+ }, {
105
+ readonly name: "fields";
106
+ readonly type: "(\"schema\" | \"hsf\")[]";
107
+ readonly description: "指定返回内容;不填时返回全部可用内容";
108
+ }];
109
+ readonly examples: ["get_api_schema --payload '{\"api\":\"mtop.trade.order.detail\"}'"];
110
+ }, {
111
+ readonly name: "set_mock";
112
+ readonly description: "设置 API mock 数据";
113
+ readonly params: [{
114
+ readonly name: "tabId";
115
+ readonly type: "number";
116
+ readonly description: "目标标签页 ID,从 tab_list 获取";
117
+ }, {
118
+ readonly name: "apiName";
119
+ readonly type: "string";
120
+ readonly required: true;
121
+ readonly description: "API 名称或正则表达式";
122
+ }, {
123
+ readonly name: "mockData";
124
+ readonly type: "object";
125
+ readonly description: "完整 mock 响应数据(与 fields 二选一)";
126
+ }, {
127
+ readonly name: "fields";
128
+ readonly type: "array";
129
+ readonly description: "按字段路径修改真实响应(与 mockData 二选一)";
130
+ }, {
131
+ readonly name: "enabled";
132
+ readonly type: "boolean";
133
+ readonly description: "是否启用,默认 true。false 时恢复真实数据";
134
+ }, {
135
+ readonly name: "duration";
136
+ readonly type: "number";
137
+ readonly description: "完整响应时长(毫秒):mock 的总耗时,绕过真实服务器精确控制";
138
+ }, {
139
+ readonly name: "conditions";
140
+ readonly type: "object";
141
+ readonly description: "请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序";
142
+ }];
143
+ readonly examples: ["set_mock --payload '{\"apiName\":\"mtop.cart.query\",\"mockData\":{\"ret\":[\"SUCCESS::调用成功\"]}}'", "set_mock --payload-file ./mock-data.json"];
144
+ }, {
145
+ readonly name: "get_mocks";
146
+ readonly description: "查看当前生效的 mock 列表";
147
+ readonly params: [{
148
+ readonly name: "tabId";
149
+ readonly type: "number";
150
+ readonly description: "目标标签页 ID,从 tab_list 获取";
151
+ }, {
152
+ readonly name: "apiName";
153
+ readonly type: "string";
154
+ readonly description: "按 API 名称或正则表达式过滤";
155
+ }];
156
+ readonly examples: ["get_mocks"];
157
+ }, {
158
+ readonly name: "set_rule";
159
+ readonly description: "添加 Chrome declarativeNetRequest 规则(重定向/修改请求头/拦截请求)";
160
+ readonly examples: ["set_rule --payload '{\"rule\":{...}}'"];
161
+ }, {
162
+ readonly name: "get_rules";
163
+ readonly description: "查看当前存储的全部请求规则(含 Options 面板配置的)";
164
+ readonly examples: ["get_rules"];
165
+ }, {
166
+ readonly name: "send_request";
167
+ readonly description: "发送 HTTP 请求,自动携带浏览器 Cookie";
168
+ readonly params: [{
169
+ readonly name: "url";
170
+ readonly type: "string";
171
+ readonly required: true;
172
+ readonly description: "完整目标 URL";
173
+ }, {
174
+ readonly name: "method";
175
+ readonly type: "string";
176
+ readonly description: "HTTP 方法,默认 GET";
177
+ }, {
178
+ readonly name: "headers";
179
+ readonly type: "object";
180
+ readonly description: "自定义请求头";
181
+ }, {
182
+ readonly name: "params";
183
+ readonly type: "object";
184
+ readonly description: "URL 查询参数";
185
+ }, {
186
+ readonly name: "body";
187
+ readonly type: "any";
188
+ readonly description: "请求体(传对象时自动 JSON 序列化)";
189
+ }, {
190
+ readonly name: "withCookies";
191
+ readonly type: "boolean";
192
+ readonly description: "是否附加浏览器 Cookie,默认 true";
193
+ }, {
194
+ readonly name: "cookieDomain";
195
+ readonly type: "string";
196
+ readonly description: "指定 Cookie 域名,不填时从 url 提取";
197
+ }, {
198
+ readonly name: "timeout";
199
+ readonly type: "number";
200
+ readonly description: "超时毫秒数,默认 30000";
201
+ }];
202
+ readonly examples: ["send_request --payload '{\"url\":\"https://api.example.com/data\",\"method\":\"GET\"}'"];
203
+ }, {
204
+ readonly name: "send_mtop_request";
205
+ readonly description: "在页面上下文中发起 mtop 请求,自动处理签名和 token";
206
+ readonly params: [{
207
+ readonly name: "api";
208
+ readonly type: "string";
209
+ readonly required: true;
210
+ readonly description: "mtop API 名称";
211
+ }, {
212
+ readonly name: "data";
213
+ readonly type: "object";
214
+ readonly description: "请求数据";
215
+ }, {
216
+ readonly name: "version";
217
+ readonly type: "string";
218
+ readonly description: "API 版本,默认 1.0";
219
+ }, {
220
+ readonly name: "method";
221
+ readonly type: "string";
222
+ readonly description: "HTTP 方法,默认 GET";
223
+ }, {
224
+ readonly name: "env";
225
+ readonly type: "\"online\" | \"pre\"";
226
+ readonly description: "请求环境,默认 online";
227
+ }, {
228
+ readonly name: "timeout";
229
+ readonly type: "number";
230
+ readonly description: "超时毫秒数,默认 10000";
231
+ }];
232
+ readonly examples: ["send_mtop_request --payload '{\"api\":\"mtop.trade.order.detail\",\"data\":{\"orderId\":\"123\"}}'"];
233
+ }, {
234
+ readonly name: "tdbank_account";
235
+ readonly description: "TDBank 账号操作:获取当前账号、账号列表、切换账号、快速借用并切换账号";
236
+ readonly params: [{
237
+ readonly name: "tabId";
238
+ readonly type: "number";
239
+ readonly description: "CDP 模式下可指定用于读取 Cookie 的标签页 ID";
240
+ }, {
241
+ readonly name: "operation";
242
+ readonly type: "\"current\" | \"list\" | \"switch\" | \"borrow\"";
243
+ readonly description: "操作类型,默认 list";
244
+ }, {
245
+ readonly name: "refresh";
246
+ readonly type: "boolean";
247
+ readonly description: "list 时是否强制刷新账号列表";
248
+ }, {
249
+ readonly name: "accountId";
250
+ readonly type: "string | number";
251
+ readonly description: "switch 时使用账号列表中的 id";
252
+ }, {
253
+ readonly name: "havanaId";
254
+ readonly type: "string | number";
255
+ readonly description: "switch 时也可直接指定 havanaId";
256
+ }, {
257
+ readonly name: "site";
258
+ readonly type: "string | number";
259
+ readonly description: "直接指定 havanaId 时必填";
260
+ }, {
261
+ readonly name: "query";
262
+ readonly type: "string";
263
+ readonly description: "borrow 时输入要借用的账号 loginId/关键词";
264
+ }];
265
+ readonly examples: ["tdbank_account --payload '{\"operation\":\"current\"}'", "tdbank_account --payload '{\"operation\":\"list\",\"refresh\":true}'", "tdbank_account --payload '{\"operation\":\"switch\",\"accountId\":12345}'", "tdbank_account --payload '{\"operation\":\"borrow\",\"query\":\"test_account\"}'"];
266
+ }, {
267
+ readonly name: "browser_list";
268
+ readonly description: "列出所有浏览器及其连接状态、类型和托管实例信息";
269
+ readonly examples: ["browser_list"];
270
+ }, {
271
+ readonly name: "browser_release";
272
+ readonly description: "按用户明确要求释放调试控制和会话级临时效果(含设备/时区模拟),保留浏览器和全部标签页;不用于普通任务收尾";
273
+ readonly examples: ["browser_release", "browser_release --browser chrome-a"];
274
+ }, {
275
+ readonly name: "browser_launch";
276
+ readonly description: "启动独立 Chrome,可在新实例中通过 TDBank 登录指定账号";
277
+ readonly params: [{
278
+ readonly name: "name";
279
+ readonly type: "string";
280
+ readonly required: true;
281
+ readonly description: "实例名称,最多 64 个字符";
282
+ }, {
283
+ readonly name: "headless";
284
+ readonly type: "boolean";
285
+ readonly description: "是否无头运行,默认 true";
286
+ }, {
287
+ readonly name: "userAgentMode";
288
+ readonly type: "\"default\" | \"desktop\"";
289
+ readonly description: "UA 模式:default 使用 Chrome 默认 UA,desktop 使用匹配本机版本的桌面 UA";
290
+ }, {
291
+ readonly name: "persistent";
292
+ readonly type: "boolean";
293
+ readonly description: "关闭后是否保留独立 Profile,默认 false";
294
+ }, {
295
+ readonly name: "url";
296
+ readonly type: "string";
297
+ readonly description: "登录完成后打开的初始页面";
298
+ }, {
299
+ readonly name: "executablePath";
300
+ readonly type: "string";
301
+ readonly description: "自定义 Chrome 可执行文件路径";
302
+ }, {
303
+ readonly name: "accountId";
304
+ readonly type: "string | number";
305
+ readonly description: "登录账号列表中的 accountId";
306
+ }, {
307
+ readonly name: "havanaId";
308
+ readonly type: "string | number";
309
+ readonly description: "直接登录 havanaId;需要同时传 site";
310
+ }, {
311
+ readonly name: "site";
312
+ readonly type: "string | number";
313
+ readonly description: "havanaId 对应的站点";
314
+ }, {
315
+ readonly name: "query";
316
+ readonly type: "string";
317
+ readonly description: "搜索、借用并登录匹配的 TDBank 账号";
318
+ }, {
319
+ readonly name: "tabId";
320
+ readonly type: "number";
321
+ readonly description: "CDP 控制浏览器中用于读取 TDBank Cookie 的标签页";
322
+ }, {
323
+ readonly name: "copyCookieDomains";
324
+ readonly type: "string[]";
325
+ readonly description: "从控制浏览器复制到新实例的 Cookie 域名列表,可与 TDBank 登录组合";
326
+ }];
327
+ readonly examples: ["browser_launch --payload '{\"name\":\"account-a\",\"headless\":true,\"accountId\":12345}'", "browser_launch --payload '{\"name\":\"figma\",\"userAgentMode\":\"desktop\",\"copyCookieDomains\":[\"figma.com\"]}'", "browser_launch --payload '{\"name\":\"account-b\",\"query\":\"test_account\",\"url\":\"https://www.taobao.com\"}'", "browser_launch --payload '{\"name\":\"with-cookies\",\"copyCookieDomains\":[\"example.com\",\"sub.example.org\"]}'"];
328
+ }, {
329
+ readonly name: "browser_close";
330
+ readonly description: "关闭指定托管浏览器并按策略清理独立 Profile";
331
+ readonly params: [{
332
+ readonly name: "browser";
333
+ readonly type: "string";
334
+ readonly required: true;
335
+ readonly description: "托管浏览器的 browserId 或名称";
336
+ }, {
337
+ readonly name: "deleteProfile";
338
+ readonly type: "boolean";
339
+ readonly description: "强制删除持久化 Profile,默认 false";
340
+ }];
341
+ readonly examples: ["browser_close --payload '{\"browser\":\"managed:account-a\"}'", "browser_close --payload '{\"browser\":\"account-b\",\"deleteProfile\":true}'"];
342
+ }, {
343
+ readonly name: "tab_open";
344
+ readonly description: "打开或按 URL 规则复用 Tab,并等待新页面加载完成";
345
+ readonly params: [{
346
+ readonly name: "url";
347
+ readonly type: "string";
348
+ readonly required: true;
349
+ readonly description: "要打开的 URL";
350
+ }, {
351
+ readonly name: "active";
352
+ readonly type: "boolean";
353
+ readonly description: "是否激活新 Tab,默认 false";
354
+ }, {
355
+ readonly name: "closeExisting";
356
+ readonly type: "boolean";
357
+ readonly description: "打开前先关闭 Agent 受控的已有标签页,默认 false";
358
+ }, {
359
+ readonly name: "group";
360
+ readonly type: "string";
361
+ readonly description: "把新 Tab 加入指定标题的标签页分组(同名分组存在则加入,否则新建)。仅扩展模式支持";
362
+ }, {
363
+ readonly name: "reuse";
364
+ readonly type: "\"never\" | \"prefer\" | \"require\"";
365
+ readonly description: "never 始终新开;prefer 优先复用;require 只允许复用。默认 never";
366
+ }, {
367
+ readonly name: "match";
368
+ readonly type: "object";
369
+ readonly description: "复用匹配规则:urlPattern(支持 *)、ignoreSearch、ignoreHash、onMultiple(error/first)";
370
+ }, {
371
+ readonly name: "restoreFocusOnClose";
372
+ readonly type: "boolean";
373
+ readonly description: "关闭本次新开的 active Tab 后恢复原活动标签页,默认 false";
374
+ }, {
375
+ readonly name: "emulation";
376
+ readonly type: "object";
377
+ readonly description: "开 tab 即进入移动端模拟态(首屏即移动态、无需 reload)。字段同 set_device_emulation 去掉 enabled,如 {\"preset\":\"iphone-15-pro\"}";
378
+ }];
379
+ readonly examples: ["tab_open --payload '{\"url\":\"https://example.com\"}'", "tab_open --payload '{\"url\":\"https://example.com/page\",\"reuse\":\"prefer\",\"match\":{\"ignoreSearch\":true}}'", "tab_open --payload '{\"url\":\"https://m.example.com\",\"emulation\":{\"preset\":\"iphone-15-pro\"}}'", "tab_open --payload '{\"url\":\"https://example.com\",\"group\":\"验证任务\"}'"];
380
+ }, {
381
+ readonly name: "tab_close";
382
+ readonly description: "关闭指定标签页";
383
+ readonly params: [{
384
+ readonly name: "tabId";
385
+ readonly type: "number";
386
+ readonly required: true;
387
+ readonly description: "要关闭的标签页 ID";
388
+ }];
389
+ readonly examples: ["tab_close --payload '{\"tabId\":123}'"];
390
+ }, {
391
+ readonly name: "tab_list";
392
+ readonly description: "获取当前窗口所有标签页列表";
393
+ readonly examples: ["tab_list"];
394
+ }, {
395
+ readonly name: "page_click";
396
+ readonly description: "点击页面元素,支持 selector / text / point 三种定位方式;auto 在可见页按设备模拟状态使用可信 mouse/touch,隐藏页使用 DOM fallback";
397
+ readonly params: [{
398
+ readonly name: "selector";
399
+ readonly type: "string";
400
+ readonly description: "原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)。不支持 :has-text/:visible 等 Playwright 私有伪类";
401
+ }, {
402
+ readonly name: "text";
403
+ readonly type: "string";
404
+ readonly description: "按可见文本(accessibility name)定位。需要时配合 role/exact 消歧;多匹配会报错并列出候选";
405
+ }, {
406
+ readonly name: "point";
407
+ readonly type: "{ x: number; y: number }";
408
+ readonly description: "按视口坐标点击(CSS 像素)。selector/text 都不适用的兜底场景";
409
+ }, {
410
+ readonly name: "role";
411
+ readonly type: "string";
412
+ readonly description: "配合 text 使用,按 AX role 过滤(如 button、link、heading)";
413
+ }, {
414
+ readonly name: "exact";
415
+ readonly type: "boolean";
416
+ readonly description: "配合 text 使用,默认 true 精确匹配;false 时按子串匹配";
417
+ }, {
418
+ readonly name: "scope";
419
+ readonly type: "string";
420
+ readonly description: "配合 text 使用,把文本匹配限制在指定 CSS 元素或 @eN ref 子树内,适合消除重复文案歧义";
421
+ }, {
422
+ readonly name: "clickMode";
423
+ readonly type: "\"auto\" | \"dom\" | \"mouse\" | \"touch\"";
424
+ readonly description: "点击模式;auto 在可见页按设备模拟状态选择可信 mouse/touch、隐藏页走 DOM,checkbox/radio 校验状态;其他值强制指定派发方式";
425
+ }, {
426
+ readonly name: "observe";
427
+ readonly type: "object | false";
428
+ readonly description: "观察选项(quietMs/firstChangeTimeoutMs/timeoutMs/navigationGraceMs/navigationTimeoutMs/networkIdleMs/contentReadyAfterMs);传 false 关闭内置观察,仅执行裸动作";
429
+ }, {
430
+ readonly name: "tabId";
431
+ readonly type: "number";
432
+ readonly required: true;
433
+ readonly description: "目标标签页 ID";
434
+ }];
435
+ readonly examples: ["page_click --payload '{\"text\":\"提交\"}'", "page_click --payload '{\"text\":\"退款明细\",\"role\":\"button\"}'", "page_click --payload '{\"text\":\"确定\",\"scope\":\"@e12\"}'", "page_click --payload '{\"selector\":\"@e3\"}'", "page_click --payload '{\"selector\":\".submit-btn\"}'", "page_click --payload '{\"selector\":\".gesture-btn\",\"clickMode\":\"touch\"}'", "page_click --payload '{\"point\":{\"x\":336,\"y\":117}}'"];
436
+ }, {
437
+ readonly name: "page_type";
438
+ readonly description: "向输入框填写文本,兼容 React 受控组件;默认观察校验提示等异步变化";
439
+ readonly params: [{
440
+ readonly name: "selector";
441
+ readonly type: "string";
442
+ readonly required: true;
443
+ readonly description: "原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)";
444
+ }, {
445
+ readonly name: "text";
446
+ readonly type: "string";
447
+ readonly required: true;
448
+ readonly description: "要填写的文本";
449
+ }, {
450
+ readonly name: "clearFirst";
451
+ readonly type: "boolean";
452
+ readonly description: "是否先清空原有内容,默认 true";
453
+ }, {
454
+ readonly name: "observe";
455
+ readonly type: "object | false";
456
+ readonly description: "观察选项;传 false 关闭内置观察,仅执行裸动作";
457
+ }, {
458
+ readonly name: "tabId";
459
+ readonly type: "number";
460
+ readonly required: true;
461
+ readonly description: "目标标签页 ID";
462
+ }];
463
+ readonly examples: ["page_type --payload '{\"selector\":\"@e6\",\"text\":\"搜索关键词\"}'"];
464
+ }, {
465
+ readonly name: "page_hover";
466
+ readonly description: "将鼠标悬停在元素上,默认观察下拉菜单、提示信息等 hover 后变化";
467
+ readonly params: [{
468
+ readonly name: "selector";
469
+ readonly type: "string";
470
+ readonly required: true;
471
+ readonly description: "原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)";
472
+ }, {
473
+ readonly name: "observe";
474
+ readonly type: "object | false";
475
+ readonly description: "观察选项;传 false 关闭内置观察,仅执行裸动作";
476
+ }, {
477
+ readonly name: "tabId";
478
+ readonly type: "number";
479
+ readonly required: true;
480
+ readonly description: "目标标签页 ID";
481
+ }];
482
+ readonly examples: ["page_hover --payload '{\"selector\":\".nav-menu\"}'"];
483
+ }, {
484
+ readonly name: "page_scroll";
485
+ readonly description: "滚动页面或指定容器,默认观察懒加载等滚动后变化";
486
+ readonly params: [{
487
+ readonly name: "direction";
488
+ readonly type: "\"up\" | \"down\" | \"top\" | \"bottom\"";
489
+ readonly required: true;
490
+ readonly description: "滚动方向";
491
+ }, {
492
+ readonly name: "distance";
493
+ readonly type: "number";
494
+ readonly description: "滚动距离(px),默认 600";
495
+ }, {
496
+ readonly name: "selector";
497
+ readonly type: "string";
498
+ readonly description: "目标滚动容器的原生 CSS 选择器,或 page_snapshot 返回的 @eN ref;不传时滚动页面";
499
+ }, {
500
+ readonly name: "containerPolicy";
501
+ readonly type: "\"self\" | \"nearest\"";
502
+ readonly description: "默认 self,要求 selector 本身可滚动;nearest 会在其不可滚动时使用最近的可滚动祖先";
503
+ }, {
504
+ readonly name: "observe";
505
+ readonly type: "object | false";
506
+ readonly description: "观察选项;传 false 关闭内置观察,仅执行裸动作";
507
+ }, {
508
+ readonly name: "tabId";
509
+ readonly type: "number";
510
+ readonly required: true;
511
+ readonly description: "目标标签页 ID";
512
+ }];
513
+ readonly examples: ["page_scroll --payload '{\"direction\":\"down\"}'", "page_scroll --payload '{\"direction\":\"bottom\"}'", "page_scroll --payload '{\"selector\":\".virtual-list\",\"direction\":\"down\",\"distance\":800}'", "page_scroll --payload '{\"selector\":\"@e8\",\"containerPolicy\":\"nearest\",\"direction\":\"bottom\"}'"];
514
+ }, {
515
+ readonly name: "page_eval";
516
+ readonly description: "在页面上下文中执行任意 JavaScript 表达式";
517
+ readonly params: [{
518
+ readonly name: "expression";
519
+ readonly type: "string";
520
+ readonly required: true;
521
+ readonly description: "要执行的 JS 表达式";
522
+ }, {
523
+ readonly name: "awaitPromise";
524
+ readonly type: "boolean";
525
+ readonly description: "表达式返回 Promise 时等待完成,默认 true";
526
+ }, {
527
+ readonly name: "observe";
528
+ readonly type: "object";
529
+ readonly description: "仅在表达式会修改页面且需要观察结果时显式传入;不传保持轻量裸执行";
530
+ }, {
531
+ readonly name: "tabId";
532
+ readonly type: "number";
533
+ readonly required: true;
534
+ readonly description: "目标标签页 ID";
535
+ }];
536
+ readonly examples: ["page_eval --payload '{\"expression\":\"document.title\"}'"];
537
+ }, {
538
+ readonly name: "page_press";
539
+ readonly description: "在页面中按下键盘按键,默认观察提交、关闭弹窗等结果";
540
+ readonly params: [{
541
+ readonly name: "key";
542
+ readonly type: "string";
543
+ readonly required: true;
544
+ readonly description: "按键名称:Enter/Tab/Escape/Backspace 等";
545
+ }, {
546
+ readonly name: "modifiers";
547
+ readonly type: "string[]";
548
+ readonly description: "修饰键数组:ctrl/alt/shift/meta/cmd";
549
+ }, {
550
+ readonly name: "observe";
551
+ readonly type: "object | false";
552
+ readonly description: "观察选项;传 false 关闭内置观察,仅执行裸动作";
553
+ }, {
554
+ readonly name: "tabId";
555
+ readonly type: "number";
556
+ readonly required: true;
557
+ readonly description: "目标标签页 ID";
558
+ }];
559
+ readonly examples: ["page_press --payload '{\"key\":\"Enter\"}'"];
560
+ }, {
561
+ readonly name: "page_wait";
562
+ readonly description: "等待指定时间、元素出现或页面条件成立";
563
+ readonly params: [{
564
+ readonly name: "time";
565
+ readonly type: "number";
566
+ readonly description: "等待毫秒数(与 selector 二选一)";
567
+ }, {
568
+ readonly name: "selector";
569
+ readonly type: "string";
570
+ readonly description: "等待元素出现的 CSS 选择器(与 time/condition 三选一)";
571
+ }, {
572
+ readonly name: "condition";
573
+ readonly type: "string";
574
+ readonly description: "在页面主上下文轮询的 JS 表达式,返回 truthy 时结束";
575
+ }, {
576
+ readonly name: "timeout";
577
+ readonly type: "number";
578
+ readonly description: "等待超时毫秒数,默认 10000";
579
+ }, {
580
+ readonly name: "interval";
581
+ readonly type: "number";
582
+ readonly description: "轮询间隔毫秒数,默认 200";
583
+ }, {
584
+ readonly name: "tabId";
585
+ readonly type: "number";
586
+ readonly required: true;
587
+ readonly description: "目标标签页 ID";
588
+ }];
589
+ readonly examples: ["page_wait --payload '{\"time\":1000}'", "page_wait --payload '{\"selector\":\".loaded\"}'", "page_wait --payload '{\"condition\":\"window.appReady === true\",\"timeout\":30000}'"];
590
+ }, {
591
+ readonly name: "page_navigate";
592
+ readonly description: "在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进";
593
+ readonly params: [{
594
+ readonly name: "url";
595
+ readonly type: "string";
596
+ readonly description: "要导航到的 URL;与 refresh/history 互斥";
597
+ }, {
598
+ readonly name: "refresh";
599
+ readonly type: "boolean";
600
+ readonly description: "为 true 时直接重新加载当前页面;与 url/history 互斥";
601
+ }, {
602
+ readonly name: "history";
603
+ readonly type: "\"back\" | \"forward\"";
604
+ readonly description: "沿当前标签页浏览历史后退或前进;与 url/refresh 互斥";
605
+ }, {
606
+ readonly name: "tabId";
607
+ readonly type: "number";
608
+ readonly required: true;
609
+ readonly description: "目标标签页 ID";
610
+ }];
611
+ readonly examples: ["page_navigate --payload '{\"tabId\":12345,\"url\":\"https://example.com/page2\"}'", "page_navigate --payload '{\"tabId\":12345,\"refresh\":true}'", "page_navigate --payload '{\"tabId\":12345,\"history\":\"back\"}'"];
612
+ }, {
613
+ readonly name: "page_upload";
614
+ readonly description: "向 <input type=\"file\"> 元素上传文件,默认观察上传状态变化";
615
+ readonly params: [{
616
+ readonly name: "selector";
617
+ readonly type: "string";
618
+ readonly required: true;
619
+ readonly description: "原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀),必须指向 input[type=file]";
620
+ }, {
621
+ readonly name: "filePaths";
622
+ readonly type: "string[]";
623
+ readonly required: true;
624
+ readonly description: "本地文件路径数组";
625
+ }, {
626
+ readonly name: "observe";
627
+ readonly type: "object | false";
628
+ readonly description: "观察选项;传 false 关闭内置观察,仅执行裸动作";
629
+ }, {
630
+ readonly name: "tabId";
631
+ readonly type: "number";
632
+ readonly required: true;
633
+ readonly description: "目标标签页 ID";
634
+ }];
635
+ readonly examples: ["page_upload --payload '{\"selector\":\"#file-input\",\"filePaths\":[\"/Users/me/photo.jpg\"]}'"];
636
+ }, {
637
+ readonly name: "page_snapshot";
638
+ readonly description: "获取页面无障碍树快照,支持完整、交互元素或当前视口范围(含 @ref)";
639
+ readonly params: [{
640
+ readonly name: "depth";
641
+ readonly type: "number";
642
+ readonly description: "树深度,默认 15,复杂页面可调大";
643
+ }, {
644
+ readonly name: "mode";
645
+ readonly type: "\"full\" | \"interactive\" | \"viewport\"";
646
+ readonly description: "输出范围,默认 full;interactive 只保留当前视口内的语义控件;长列表优先使用 viewport";
647
+ }, {
648
+ readonly name: "rootSelector";
649
+ readonly type: "string";
650
+ readonly description: "只获取指定 CSS 元素的 AX 子树,可与 mode 组合;与 rootRef 互斥";
651
+ }, {
652
+ readonly name: "rootRef";
653
+ readonly type: "string";
654
+ readonly description: "以已有 @eN ref 为根获取局部 AX 子树;与 rootSelector 互斥";
655
+ }, {
656
+ readonly name: "ancestorDepth";
657
+ readonly type: "number";
658
+ readonly description: "rootRef 向上扩展的 DOM 祖先层数,默认 0,最大 20";
659
+ }, {
660
+ readonly name: "query";
661
+ readonly type: "{ text?: string; role?: string; exact?: boolean }";
662
+ readonly description: "服务端过滤 AX 树,只保留按 accessibility name / role 命中的节点及祖先路径";
663
+ }, {
664
+ readonly name: "maxNodes";
665
+ readonly type: "number";
666
+ readonly description: "最多输出节点数,0 表示不限制";
667
+ }, {
668
+ readonly name: "maxChars";
669
+ readonly type: "number";
670
+ readonly description: "快照文本最大字符数,默认 60000,超出保留首尾;传 0 不限制";
671
+ }, {
672
+ readonly name: "tabId";
673
+ readonly type: "number";
674
+ readonly required: true;
675
+ readonly description: "目标标签页 ID";
676
+ }];
677
+ readonly examples: ["page_snapshot", "page_snapshot --payload '{\"tabId\":1,\"mode\":\"viewport\"}'", "page_snapshot --payload '{\"tabId\":1,\"rootSelector\":\"[role=dialog]\"}'", "page_snapshot --payload '{\"tabId\":1,\"rootRef\":\"@e8\",\"ancestorDepth\":1}'", "page_snapshot --payload '{\"tabId\":1,\"query\":{\"text\":\"保存\",\"role\":\"button\"}}'"];
678
+ }, {
679
+ readonly name: "page_screenshot";
680
+ readonly description: "获取当前页面或指定元素截图";
681
+ readonly outputFlag: true;
682
+ readonly params: [{
683
+ readonly name: "selector";
684
+ readonly type: "string";
685
+ readonly description: "CSS 选择器,提供后只截取该元素区域";
686
+ }, {
687
+ readonly name: "format";
688
+ readonly type: "\"png\" | \"jpeg\"";
689
+ readonly description: "图片格式,默认 png";
690
+ }, {
691
+ readonly name: "quality";
692
+ readonly type: "number";
693
+ readonly description: "JPEG 压缩质量(0-100),默认 80";
694
+ }, {
695
+ readonly name: "tabId";
696
+ readonly type: "number";
697
+ readonly required: true;
698
+ readonly description: "目标标签页 ID";
699
+ }];
700
+ readonly examples: ["page_screenshot --output ./screenshot.png", "page_screenshot --payload '{\"selector\":\".product-card\"}' --output ./card.png"];
701
+ }, {
702
+ readonly name: "page_selected_element";
703
+ readonly description: "获取 DevTools Elements 面板当前选中元素的详细信息";
704
+ readonly outputFlag: true;
705
+ readonly params: [{
706
+ readonly name: "includeOuterHTML";
707
+ readonly type: "boolean";
708
+ readonly description: "是否返回 outerHTML(最多 3000 字符),默认 true";
709
+ }, {
710
+ readonly name: "includeScreenshot";
711
+ readonly type: "boolean";
712
+ readonly description: "是否附带元素截图,默认 false;指定 --output 时自动开启";
713
+ }, {
714
+ readonly name: "tabId";
715
+ readonly type: "number";
716
+ readonly required: true;
717
+ readonly description: "目标标签页 ID";
718
+ }];
719
+ readonly examples: ["page_selected_element", "page_selected_element --output ./element.png"];
720
+ }, {
721
+ readonly name: "get_user_info";
722
+ readonly description: "获取当前登录用户的信息";
723
+ readonly params: [{
724
+ readonly name: "detail";
725
+ readonly type: "boolean";
726
+ readonly description: "是否获取完整用户信息,默认 false(只返回工号)";
727
+ }];
728
+ readonly examples: ["get_user_info", "get_user_info --payload '{\"detail\":true}'"];
729
+ }, {
730
+ readonly name: "record_start";
731
+ readonly description: "开始录制用户操作";
732
+ readonly params: [{
733
+ readonly name: "tabId";
734
+ readonly type: "number";
735
+ readonly description: "目标标签页 ID,从 tab_list 获取";
736
+ }];
737
+ readonly examples: ["record_start"];
738
+ }, {
739
+ readonly name: "record_stop";
740
+ readonly description: "停止录制并返回完整结果(操作 + 关联请求);未在录制时不报错,返回 wasRecording: false";
741
+ readonly params: [{
742
+ readonly name: "tabId";
743
+ readonly type: "number";
744
+ readonly description: "目标标签页 ID,从 tab_list 获取";
745
+ }];
746
+ readonly examples: ["record_stop"];
747
+ }, {
748
+ readonly name: "set_device_emulation";
749
+ readonly description: "把目标 tab 切换为移动端模拟(视口/UA/触摸),等价 DevTools 设备工具栏,作用域 per-tab;需保持调试控制才持续生效";
750
+ readonly params: [{
751
+ readonly name: "enabled";
752
+ readonly type: "boolean";
753
+ readonly required: true;
754
+ readonly description: "true=启用,false=清除";
755
+ }, {
756
+ readonly name: "preset";
757
+ readonly type: "\"iphone-15-pro\" | \"iphone-se\" | \"pixel-8\" | \"ipad-mini\" | \"galaxy-s23\"";
758
+ readonly description: "内置设备预设,提供 width/height/DPR/UA 默认值";
759
+ }, {
760
+ readonly name: "width";
761
+ readonly type: "number";
762
+ readonly description: "视口宽度(覆盖 preset)";
763
+ }, {
764
+ readonly name: "height";
765
+ readonly type: "number";
766
+ readonly description: "视口高度(覆盖 preset)";
767
+ }, {
768
+ readonly name: "deviceScaleFactor";
769
+ readonly type: "number";
770
+ readonly description: "DPR(覆盖 preset)";
771
+ }, {
772
+ readonly name: "mobile";
773
+ readonly type: "boolean";
774
+ readonly description: "是否走移动渲染模式,默认从 preset 推断";
775
+ }, {
776
+ readonly name: "userAgent";
777
+ readonly type: "string";
778
+ readonly description: "自定义 UA(覆盖 preset)";
779
+ }, {
780
+ readonly name: "orientation";
781
+ readonly type: "\"portrait\" | \"landscape\"";
782
+ readonly description: "横竖屏,默认 portrait";
783
+ }, {
784
+ readonly name: "touch";
785
+ readonly type: "boolean";
786
+ readonly description: "是否启用触摸事件,默认 mobile 为真时启用";
787
+ }, {
788
+ readonly name: "reload";
789
+ readonly type: "boolean";
790
+ readonly description: "启用后是否重载页面,默认 true";
791
+ }, {
792
+ readonly name: "tabId";
793
+ readonly type: "number";
794
+ readonly required: true;
795
+ readonly description: "目标标签页 ID";
796
+ }];
797
+ readonly examples: ["set_device_emulation --payload '{\"enabled\":true,\"preset\":\"iphone-15-pro\"}'", "set_device_emulation --payload '{\"enabled\":true,\"preset\":\"pixel-8\",\"orientation\":\"landscape\"}'", "set_device_emulation --payload '{\"enabled\":false}'"];
798
+ }, {
799
+ readonly name: "set_timezone";
800
+ readonly description: "覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区";
801
+ readonly params: [{
802
+ readonly name: "tabId";
803
+ readonly type: "number";
804
+ readonly required: true;
805
+ readonly description: "目标标签页 ID";
806
+ }, {
807
+ readonly name: "timezone";
808
+ readonly type: "string";
809
+ readonly required: true;
810
+ readonly description: "IANA 时区标识(如 Asia/Shanghai);空字符串表示清除覆盖";
811
+ }];
812
+ readonly examples: ["set_timezone --payload '{\"tabId\":12345,\"timezone\":\"America/New_York\"}'", "set_timezone --payload '{\"tabId\":12345,\"timezone\":\"\"}'"];
813
+ }, {
814
+ readonly name: "get_cookie";
815
+ readonly description: "读取当前标签页的一个指定非分区 Cookie;拒绝返回 HttpOnly Cookie";
816
+ readonly params: [{
817
+ readonly name: "tabId";
818
+ readonly type: "number";
819
+ readonly required: true;
820
+ readonly description: "目标标签页 ID";
821
+ }, {
822
+ readonly name: "name";
823
+ readonly type: "string";
824
+ readonly required: true;
825
+ readonly description: "要读取的 Cookie 名称;不支持列举全部 Cookie";
826
+ }, {
827
+ readonly name: "domain";
828
+ readonly type: "string";
829
+ readonly description: "可选精确域过滤,只允许当前 host 或其父域";
830
+ }, {
831
+ readonly name: "path";
832
+ readonly type: "string";
833
+ readonly description: "可选精确 path 过滤";
834
+ }];
835
+ readonly examples: ["get_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\"}'", "get_cookie --payload '{\"tabId\":12345,\"name\":\"edith_switch_br.rx-vehicle-search_home\",\"domain\":\"taobao.com\"}'"];
836
+ }, {
837
+ readonly name: "set_cookie";
838
+ readonly description: "设置当前标签页域下的一个指定非分区 session Cookie,可选刷新页面";
839
+ readonly params: [{
840
+ readonly name: "tabId";
841
+ readonly type: "number";
842
+ readonly required: true;
843
+ readonly description: "目标标签页 ID";
844
+ }, {
845
+ readonly name: "name";
846
+ readonly type: "string";
847
+ readonly required: true;
848
+ readonly description: "Cookie 名称";
849
+ }, {
850
+ readonly name: "value";
851
+ readonly type: "string";
852
+ readonly required: true;
853
+ readonly description: "Cookie 值,可传空字符串;空字符串不会删除 Cookie";
854
+ }, {
855
+ readonly name: "domain";
856
+ readonly type: "string";
857
+ readonly description: "Cookie 域,默认当前 host;只允许当前 host 或其父域";
858
+ }, {
859
+ readonly name: "path";
860
+ readonly type: "string";
861
+ readonly description: "Cookie path,默认 /";
862
+ }, {
863
+ readonly name: "reload";
864
+ readonly type: "boolean";
865
+ readonly description: "设置后是否刷新页面,默认 false";
866
+ }];
867
+ readonly examples: ["set_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\",\"value\":\"enabled\"}'", "set_cookie --payload '{\"tabId\":12345,\"name\":\"edith_switch_br.rx-vehicle-search_home\",\"value\":\"3.6.63\",\"domain\":\"taobao.com\",\"reload\":true}'"];
868
+ }, {
869
+ readonly name: "page_frames";
870
+ readonly description: "获取页面所有 iframe 列表";
871
+ readonly params: [{
872
+ readonly name: "tabId";
873
+ readonly type: "number";
874
+ readonly required: true;
875
+ readonly description: "目标标签页 ID";
876
+ }];
877
+ readonly examples: ["page_frames --payload '{\"tabId\":12345}'"];
878
+ }, {
879
+ readonly name: "request_domain_permission";
880
+ readonly description: "申请访问指定域名的权限(弹窗让用户授权)";
881
+ readonly params: [{
882
+ readonly name: "domain";
883
+ readonly type: "string";
884
+ readonly required: true;
885
+ readonly description: "需要授权的域名,如 example.com";
886
+ }];
887
+ readonly examples: ["request_domain_permission --payload '{\"domain\":\"example.com\"}'"];
888
+ }, {
889
+ readonly name: "run_actions";
890
+ readonly description: "批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察";
891
+ readonly params: [{
892
+ readonly name: "actions";
893
+ readonly type: "Array<{action: string, data?: object}>";
894
+ readonly required: true;
895
+ readonly description: "要依次执行的 action 列表";
896
+ }, {
897
+ readonly name: "tabId";
898
+ readonly type: "number";
899
+ readonly required: true;
900
+ readonly description: "所有步骤共享的 tabId,步骤自身指定的优先";
901
+ }];
902
+ readonly examples: ["run_actions --payload '{\"actions\":[{\"action\":\"page_scroll\",\"data\":{\"direction\":\"down\"}},{\"action\":\"page_wait\",\"data\":{\"time\":500}},{\"action\":\"page_screenshot\"}]}'"];
903
+ }];
904
+ export declare const COMMAND_MAP: ReadonlyMap<string, CommandDef>;