@mearl/client 3.0.0-beta.4 → 3.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -16
- package/dist/actionTimeouts.js +1 -1
- package/dist/autoUpdate.js +2 -1
- package/dist/capabilityHelp.d.ts +4 -0
- package/dist/capabilityHelp.js +69 -0
- package/dist/check.d.ts +5 -6
- package/dist/check.js +4 -7
- package/dist/cli.js +22 -56
- package/dist/commandHelp.d.ts +3 -0
- package/dist/commandHelp.js +79 -0
- package/dist/commandSuggestions.d.ts +3 -0
- package/dist/commandSuggestions.js +16 -5
- package/dist/commands.d.ts +78 -62
- package/dist/commands.js +67 -49
- package/dist/index.d.ts +6 -2
- package/dist/index.js +10 -4
- package/dist/nativeHost.js +1 -1
- package/dist/plugins/clients/pluginHostConnection.d.ts +2 -0
- package/dist/plugins/clients/pluginHostConnection.js +3 -1
- package/dist/plugins/officialPluginInstaller.js +2 -1
- package/dist/plugins/pluginRegistry.d.ts +1 -1
- package/dist/plugins/pluginRegistry.js +12 -4
- package/dist/plugins/runtime/pluginCommandWorker.js +8 -6
- package/dist/plugins/runtime/pluginExecutor.d.ts +5 -0
- package/dist/plugins/runtime/pluginExecutor.js +15 -2
- package/dist/plugins/runtime/pluginExecutorProtocol.d.ts +4 -0
- package/dist/plugins/runtime/pluginExecutorSupervisor.js +2 -1
- package/dist/plugins/runtime/pluginHostServer.js +4 -0
- package/dist/plugins/runtime/pluginPageManager.js +0 -4
- package/dist/plugins/runtime/pluginRevision.js +0 -51
- package/dist/plugins/runtime/pluginStateStore.js +3 -8
- package/dist/plugins/runtime/pluginTaskManager.js +4 -8
- package/dist/plugins/sdk/plugin.js +1 -1
- package/dist/plugins/sdk/pluginModelDefinition.js +0 -6
- package/dist/plugins/sdk/pluginPageDefinition.d.ts +0 -1
- package/dist/plugins/sdk/pluginPageDefinition.js +2 -18
- package/dist/plugins/sdk/pluginRecoveryDefinition.js +0 -3
- package/dist/plugins/sdk/pluginStateDefinition.d.ts +0 -1
- package/dist/plugins/sdk/pluginStateDefinition.js +0 -11
- package/dist/runtimePaths.d.ts +1 -0
- package/dist/runtimePaths.js +1 -0
- package/dist/script.d.ts +30 -0
- package/dist/script.js +261 -0
- package/dist/scriptCli.d.ts +1 -0
- package/dist/scriptCli.js +94 -0
- package/dist/scriptErrors.d.ts +8 -0
- package/dist/scriptErrors.js +21 -0
- package/dist/scriptWorker.d.ts +1 -0
- package/dist/scriptWorker.js +50 -0
- package/dist/sdkMethods.d.ts +3 -0
- package/dist/sdkMethods.js +9 -0
- package/dist/socket.js +34 -9
- package/dist/unified.js +11 -1
- package/dist/unifiedConfig.d.ts +4 -0
- package/dist/unifiedConfig.js +11 -0
- package/package.json +13 -11
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export interface SuggestableCommand {
|
|
2
2
|
readonly aliases?: readonly string[];
|
|
3
|
+
/** Suggestion-only expressions whose canonical invocation needs a specific payload. */
|
|
4
|
+
readonly aliasExamples?: Readonly<Record<string, string>>;
|
|
3
5
|
readonly description: string;
|
|
4
6
|
readonly examples?: readonly string[];
|
|
5
7
|
readonly name: string;
|
|
@@ -7,6 +9,7 @@ export interface SuggestableCommand {
|
|
|
7
9
|
export interface CommandSuggestion {
|
|
8
10
|
command: SuggestableCommand;
|
|
9
11
|
score: number;
|
|
12
|
+
example?: string;
|
|
10
13
|
}
|
|
11
14
|
export declare function commandInput(args: readonly string[]): string;
|
|
12
15
|
export declare function findCommandSuggestions(args: readonly string[], commands: readonly SuggestableCommand[], limit?: number): CommandSuggestion[];
|
|
@@ -40,9 +40,20 @@ export function findCommandSuggestions(args, commands, limit = 3) {
|
|
|
40
40
|
return [];
|
|
41
41
|
const ranked = commands
|
|
42
42
|
.map(command => {
|
|
43
|
-
const keys = [command.name, ...(command.aliases ?? [])].map(
|
|
44
|
-
const
|
|
45
|
-
|
|
43
|
+
const keys = [command.name, ...(command.aliases ?? [])].map(name => ({ name }));
|
|
44
|
+
for (const [name, example] of Object.entries(command.aliasExamples ?? {})) {
|
|
45
|
+
keys.push({ name, example });
|
|
46
|
+
}
|
|
47
|
+
let score = -1;
|
|
48
|
+
let example;
|
|
49
|
+
for (const key of keys) {
|
|
50
|
+
const candidate = Math.max(...queries.map(query => similarity(query, normalizeCommand(key.name))));
|
|
51
|
+
if (candidate > score) {
|
|
52
|
+
score = candidate;
|
|
53
|
+
example = key.example;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { command, score, ...(example ? { example } : {}) };
|
|
46
57
|
})
|
|
47
58
|
.filter(suggestion => suggestion.score >= MIN_SIMILARITY)
|
|
48
59
|
.sort((left, right) => right.score - left.score || left.command.name.localeCompare(right.command.name));
|
|
@@ -52,8 +63,8 @@ export function findCommandSuggestions(args, commands, limit = 3) {
|
|
|
52
63
|
return ranked.filter(suggestion => bestScore - suggestion.score <= MAX_SCORE_GAP).slice(0, limit);
|
|
53
64
|
}
|
|
54
65
|
export function formatCommandSuggestions(commandName, suggestions) {
|
|
55
|
-
return suggestions.map(({ command }) => {
|
|
56
|
-
const invocation = command.examples?.[0] ?? command.name;
|
|
66
|
+
return suggestions.map(({ command, example }) => {
|
|
67
|
+
const invocation = example ?? command.examples?.[0] ?? command.name;
|
|
57
68
|
return ` ${commandName} ${invocation}\n ${command.description}`;
|
|
58
69
|
});
|
|
59
70
|
}
|
package/dist/commands.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface CommandDef {
|
|
|
14
14
|
summary?: string;
|
|
15
15
|
/** CLI 中用于推荐 canonical action 的常见表达,不会作为可执行 action。 */
|
|
16
16
|
aliases?: readonly string[];
|
|
17
|
+
/** 仅用于错误建议;按表达给出 canonical action 的适用示例,不增加可执行别名。 */
|
|
18
|
+
aliasExamples?: Readonly<Record<string, string>>;
|
|
17
19
|
/** payload 字段说明 */
|
|
18
20
|
params?: ParamDef[];
|
|
19
21
|
/** 是否支持 --output */
|
|
@@ -23,6 +25,16 @@ export interface CommandDef {
|
|
|
23
25
|
result?: readonly string[];
|
|
24
26
|
}
|
|
25
27
|
export declare const COMMANDS: readonly [{
|
|
28
|
+
readonly name: "get_capabilities";
|
|
29
|
+
readonly description: "只读查询当前目标浏览器的动作、设备和已安装 App 能力、限制与 Skill/帮助入口;不打开页面或启用模拟";
|
|
30
|
+
readonly params: [{
|
|
31
|
+
readonly name: "app";
|
|
32
|
+
readonly type: "string";
|
|
33
|
+
readonly description: "可选,使用目录中的完整 App ID 查询桥方法、可调设置和默认版本详情";
|
|
34
|
+
}];
|
|
35
|
+
readonly notes: readonly ["沿用 --browser / --session 路由;不传 app 返回摘要。apps.status=partial 表示目录未完整取得,unsupported 表示目标未提供目录;不能把两者当作未安装。", "available=false 的 App 当前不可启用;支持某个 action 不代表已有域名权限或真实设备授权。按需读取 usage.skills / usage.documentation,查询不会自动安装或加载 Skill。"];
|
|
36
|
+
readonly examples: ["get_capabilities", "get_capabilities --payload '{\"app\":\"example/app\"}'"];
|
|
37
|
+
}, {
|
|
26
38
|
readonly name: "browser_control";
|
|
27
39
|
readonly description: "把控制会话交给用户;用户在 Mearl 浏览器管理页交还后重新观察页面";
|
|
28
40
|
readonly params: [{
|
|
@@ -76,7 +88,7 @@ export declare const COMMANDS: readonly [{
|
|
|
76
88
|
readonly examples: ["tab_checkpoint --payload '{\"tabId\":12345}'"];
|
|
77
89
|
}, {
|
|
78
90
|
readonly name: "get_requests";
|
|
79
|
-
readonly description: "
|
|
91
|
+
readonly description: "获取最近的网络请求(协议请求或普通 xhr/fetch)";
|
|
80
92
|
readonly params: [{
|
|
81
93
|
readonly name: "tabId";
|
|
82
94
|
readonly type: "number";
|
|
@@ -88,8 +100,8 @@ export declare const COMMANDS: readonly [{
|
|
|
88
100
|
readonly description: "返回条数,默认 10";
|
|
89
101
|
}, {
|
|
90
102
|
readonly name: "source";
|
|
91
|
-
readonly type: "\"
|
|
92
|
-
readonly description: "数据来源,不填时默认
|
|
103
|
+
readonly type: "\"protocol\" | \"requests\" | \"all\"";
|
|
104
|
+
readonly description: "数据来源,不填时默认 all;all 返回全部业务请求";
|
|
93
105
|
}, {
|
|
94
106
|
readonly name: "filter";
|
|
95
107
|
readonly type: "string";
|
|
@@ -123,9 +135,9 @@ export declare const COMMANDS: readonly [{
|
|
|
123
135
|
readonly type: "boolean";
|
|
124
136
|
readonly description: "只返回数据结构,不返回叶子值";
|
|
125
137
|
}];
|
|
126
|
-
readonly notes: readonly ["流式请求开始后即进入缓冲区;页面及 App 桥代发的
|
|
138
|
+
readonly notes: readonly ["流式请求开始后即进入缓冲区;页面及 App 桥代发的 协议 SSE 都归入 protocol。无法归属当前页面 target 的 Service Worker 请求不在采集范围内。"];
|
|
127
139
|
readonly result: readonly ["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。", "省略正文时不返回 postData / responseBody 字段;指定 fields 后需要同时读取全文时显式传 includeBody:true。", "isPending 标记未完成请求;SSE 的 responseBody 保存按序到达的 event/data/timestamp/duration 分片。敏感请求头返回脱敏值。"];
|
|
128
|
-
readonly examples: ["get_requests --payload '{\"tabId\":12345,\"count\":5}'", "get_requests --payload '{\"tabId\":12345,\"source\":\"
|
|
140
|
+
readonly examples: ["get_requests --payload '{\"tabId\":12345,\"count\":5}'", "get_requests --payload '{\"tabId\":12345,\"source\":\"protocol\",\"filter\":\"cart\"}'"];
|
|
129
141
|
}, {
|
|
130
142
|
readonly name: "get_logs";
|
|
131
143
|
readonly description: "获取浏览器控制台日志";
|
|
@@ -232,7 +244,7 @@ export declare const COMMANDS: readonly [{
|
|
|
232
244
|
readonly description: "请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序";
|
|
233
245
|
}];
|
|
234
246
|
readonly notes: readonly ["启用时至少提供 mockData 或非空 fields;非空 fields 优先。fields 每项 { path: string, value: any },path 支持点号和数组索引。", "相同 apiName 的多条无条件 Mock 会覆盖;conditions 子集匹配 query/body(含 data 内层),不同条件可共存;$index 从 0 起控制调用顺序,不参与字段匹配。", "大字段可用顶层 @<绝对路径> 文件引用或 --payload-file;文件展开后仍受 Native Messaging 单条消息大小限制。"];
|
|
235
|
-
readonly examples: ["set_mock --payload '{\"tabId\":12345,\"apiName\":\"
|
|
247
|
+
readonly examples: ["set_mock --payload '{\"tabId\":12345,\"apiName\":\"cart.query\",\"mockData\":{\"ret\":[\"SUCCESS::调用成功\"]}}'", "set_mock --payload-file ./mock-data.json"];
|
|
236
248
|
}, {
|
|
237
249
|
readonly name: "get_mocks";
|
|
238
250
|
readonly description: "查看当前生效的 mock 列表";
|
|
@@ -297,7 +309,7 @@ export declare const COMMANDS: readonly [{
|
|
|
297
309
|
readonly type: "string";
|
|
298
310
|
readonly description: "规则说明";
|
|
299
311
|
}];
|
|
300
|
-
readonly notes: readonly ["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。", "扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用
|
|
312
|
+
readonly notes: readonly ["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。", "扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用 request_permission。复杂 URL 表达式无法完整推断域名时会提示手动检查。"];
|
|
301
313
|
readonly examples: ["set_rule --payload '{\"actionType\":\"block\",\"filter\":\"^https://example\\\\.com/ads/.*\"}'", "set_rule --payload '{\"ruleId\":42,\"enabled\":false}'"];
|
|
302
314
|
}, {
|
|
303
315
|
readonly name: "get_rules";
|
|
@@ -357,46 +369,30 @@ export declare const COMMANDS: readonly [{
|
|
|
357
369
|
readonly result: readonly ["返回 status、statusText、headers、body、bodyType、attachedCookieCount;bodyType 为 json/text/base64,二进制 body 需解码后保存。"];
|
|
358
370
|
readonly examples: ["send_request --payload '{\"url\":\"https://api.example.com/data\",\"method\":\"GET\"}'", "send_request --payload '{\"url\":\"https://api.example.com/upload\",\"method\":\"POST\",\"formData\":{\"folder\":\"assets\"},\"files\":[{\"fieldName\":\"file\",\"filePath\":\"/absolute/path/image.png\"}]}'", "send_request --payload '{\"url\":\"https://api.example.com/upload\",\"method\":\"POST\",\"bodyFile\":{\"filePath\":\"/absolute/path/image.png\",\"contentType\":\"image/png\"}}'"];
|
|
359
371
|
}, {
|
|
360
|
-
readonly name: "
|
|
361
|
-
readonly description: "
|
|
372
|
+
readonly name: "send_protocol_request";
|
|
373
|
+
readonly description: "通过已安装的请求协议能力,使用目标浏览器 Cookie 发送请求";
|
|
362
374
|
readonly params: [{
|
|
363
|
-
readonly name: "api";
|
|
364
|
-
readonly type: "string";
|
|
365
|
-
readonly required: true;
|
|
366
|
-
readonly description: "mtop API 名称";
|
|
367
|
-
}, {
|
|
368
|
-
readonly name: "data";
|
|
369
|
-
readonly type: "object";
|
|
370
|
-
readonly description: "请求数据";
|
|
371
|
-
}, {
|
|
372
|
-
readonly name: "version";
|
|
373
|
-
readonly type: "string";
|
|
374
|
-
readonly description: "API 版本,默认 1.0";
|
|
375
|
-
}, {
|
|
376
|
-
readonly name: "method";
|
|
377
|
-
readonly type: "string";
|
|
378
|
-
readonly description: "HTTP 方法,默认 GET";
|
|
379
|
-
}, {
|
|
380
|
-
readonly name: "appKey";
|
|
381
|
-
readonly type: "string";
|
|
382
|
-
readonly description: "签名使用的 appKey,默认 12574478";
|
|
383
|
-
}, {
|
|
384
|
-
readonly name: "env";
|
|
385
|
-
readonly type: "\"prod\" | \"pre\"";
|
|
386
|
-
readonly description: "请求环境,默认 prod";
|
|
387
|
-
}, {
|
|
388
375
|
readonly name: "timeout";
|
|
389
376
|
readonly type: "number";
|
|
390
|
-
readonly description: "
|
|
377
|
+
readonly description: "宿主超时毫秒数;协议能力负责校验具体参数";
|
|
391
378
|
}];
|
|
392
|
-
readonly notes: readonly ["
|
|
393
|
-
readonly result: readonly ["返回 success、response、requestData
|
|
394
|
-
readonly examples: ["
|
|
379
|
+
readonly notes: readonly ["需要安装提供 request.protocol 的能力包;参数、签名、网关与响应协议由能力包定义。", "使用 --payload 传递协议文档声明的参数;核心不设置业务参数默认值。"];
|
|
380
|
+
readonly result: readonly ["返回 success、response、requestData;业务结果由协议定义。"];
|
|
381
|
+
readonly examples: ["send_protocol_request --payload '{\"operation\":\"example\",\"data\":{}}'"];
|
|
395
382
|
}, {
|
|
396
383
|
readonly name: "browser_list";
|
|
397
384
|
readonly description: "列出所有浏览器及其连接状态、类型和 Provider 托管实例信息";
|
|
398
385
|
readonly summary: "列出本地及远端浏览器与连接状态";
|
|
399
|
-
readonly
|
|
386
|
+
readonly params: [{
|
|
387
|
+
readonly name: "provider";
|
|
388
|
+
readonly type: "string";
|
|
389
|
+
readonly description: "配合 launchForm,仅查询一个本机已安装 Provider 的启动候选;需 --local";
|
|
390
|
+
}, {
|
|
391
|
+
readonly name: "launchForm";
|
|
392
|
+
readonly type: "object";
|
|
393
|
+
readonly description: "现有动态启动表单请求:{variant?,values:{}},不创建或接入实例";
|
|
394
|
+
}];
|
|
395
|
+
readonly examples: ["browser_list", "browser_list --local"];
|
|
400
396
|
}, {
|
|
401
397
|
readonly name: "browser_release";
|
|
402
398
|
readonly description: "释放当前浏览器的调试控制和会话级临时效果(含设备/时区模拟);不用于普通任务收尾,Provider 实例的行为以 mearl <providerId> 为准";
|
|
@@ -479,6 +475,9 @@ export declare const COMMANDS: readonly [{
|
|
|
479
475
|
readonly name: "tab_open";
|
|
480
476
|
readonly description: "打开或按 URL 规则复用 Tab,并等待新页面加载完成";
|
|
481
477
|
readonly aliases: readonly ["tab_new", "new_tab", "tab_create", "create_tab"];
|
|
478
|
+
readonly aliasExamples: {
|
|
479
|
+
readonly tab_activate: "tab_open --payload '{\"url\":\"https://example.com\",\"reuse\":\"require\",\"active\":true}'";
|
|
480
|
+
};
|
|
482
481
|
readonly params: [{
|
|
483
482
|
readonly name: "url";
|
|
484
483
|
readonly type: "string";
|
|
@@ -519,7 +518,7 @@ export declare const COMMANDS: readonly [{
|
|
|
519
518
|
}, {
|
|
520
519
|
readonly name: "appProfile";
|
|
521
520
|
readonly type: "string";
|
|
522
|
-
readonly description: "按已安装档案应用 App
|
|
521
|
+
readonly description: "按已安装档案应用 App 环境,ID 与限制见当前动态帮助。需要 iframe WebView 和系统栏时同时传 emulation.deviceShell=true";
|
|
523
522
|
}, {
|
|
524
523
|
readonly name: "os";
|
|
525
524
|
readonly type: "\"ios\" | \"android\"";
|
|
@@ -531,7 +530,7 @@ export declare const COMMANDS: readonly [{
|
|
|
531
530
|
}];
|
|
532
531
|
readonly notes: readonly ["emulation / appProfile 只应用到新建 Tab;复用 Tab 要切换状态时用对应设置 action。", "closeExisting 不能与复用或 openerTabId 组合;多匹配默认报错,match.onMultiple=first 可显式选择第一个。"];
|
|
533
532
|
readonly result: readonly ["返回 tabId、url、title、opened/reused;reused=true 的既有页面应保留。", "active=true 时 activation 包含 tabActive、windowFocused、windowState、visibilityState;emulation 返回实际生效配置。", "capture.cursor 是导航前诊断边界,可分别用于 get_logs/get_requests/get_events 的 after。"];
|
|
534
|
-
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-17-pro\"}}'", "tab_open --payload '{\"url\":\"https://example.com/app/home\",\"appProfile\":\"
|
|
533
|
+
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-17-pro\"}}'", "tab_open --payload '{\"url\":\"https://example.com/app/home\",\"appProfile\":\"reader\"}'", "tab_open --payload '{\"url\":\"https://example.com/app/home\",\"appProfile\":\"reader\",\"emulation\":{\"preset\":\"ipad-mini-a17-pro\",\"orientation\":\"landscape\",\"deviceShell\":true,\"splitScreen\":true}}'", "tab_open --payload '{\"url\":\"https://example.com\",\"appProfile\":\"reader\",\"os\":\"android\"}'", "tab_open --payload '{\"url\":\"https://example.com\",\"group\":\"验证任务\"}'"];
|
|
535
534
|
}, {
|
|
536
535
|
readonly name: "tab_close";
|
|
537
536
|
readonly description: "关闭指定标签页";
|
|
@@ -571,6 +570,9 @@ export declare const COMMANDS: readonly [{
|
|
|
571
570
|
}, {
|
|
572
571
|
readonly name: "page_click";
|
|
573
572
|
readonly description: "点击页面元素,支持 CSS/@ref、可见文本或视口坐标定位";
|
|
573
|
+
readonly aliasExamples: {
|
|
574
|
+
readonly page_select: "page_click --payload '{\"tabId\":12345,\"text\":\"选项文案\",\"role\":\"option\"}'";
|
|
575
|
+
};
|
|
574
576
|
readonly params: [{
|
|
575
577
|
readonly name: "selector";
|
|
576
578
|
readonly type: "string";
|
|
@@ -613,8 +615,8 @@ export declare const COMMANDS: readonly [{
|
|
|
613
615
|
readonly required: true;
|
|
614
616
|
readonly description: "目标标签页 ID";
|
|
615
617
|
}];
|
|
616
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
617
|
-
readonly notes: readonly ["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。", "原生 select 可按 option 文本点击;checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"];
|
|
618
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
|
|
619
|
+
readonly notes: readonly ["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。", "auto 对原生 option、checkbox/radio 使用状态感知的 DOM 路径;显式 mouse/touch 保留可信输入。", "原生 select 可按 option 文本点击;auto/dom 返回 selectionState.valueBefore/valueAfter/selectedAfter,检查选中状态是否保持。checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"];
|
|
618
620
|
readonly examples: ["page_click --payload '{\"tabId\":12345,\"text\":\"提交\"}'", "page_click --payload '{\"tabId\":12345,\"text\":\"退款明细\",\"role\":\"button\"}'", "page_click --payload '{\"tabId\":12345,\"text\":\"确定\",\"scope\":\"@e12\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\"@e3\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\".submit-btn\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\".gesture-btn\",\"clickMode\":\"touch\"}'", "page_click --payload '{\"tabId\":12345,\"point\":{\"x\":336,\"y\":117}}'", "page_click --payload '{\"tabId\":12345,\"point\":{\"x\":196,\"y\":240},\"coordinateSpace\":\"active-frame\"}'"];
|
|
619
621
|
}, {
|
|
620
622
|
readonly name: "page_drag";
|
|
@@ -643,12 +645,15 @@ export declare const COMMANDS: readonly [{
|
|
|
643
645
|
readonly required: true;
|
|
644
646
|
readonly description: "目标标签页 ID";
|
|
645
647
|
}];
|
|
646
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
648
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
|
|
647
649
|
readonly notes: readonly ["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"];
|
|
648
650
|
readonly examples: ["page_drag --payload '{\"tabId\":12345,\"from\":{\"x\":350,\"y\":80},\"to\":{\"x\":80,\"y\":80}}'", "page_drag --payload '{\"tabId\":12345,\"from\":\"@e3\",\"to\":\"#drop-zone\",\"dragMode\":\"mouse\"}'"];
|
|
649
651
|
}, {
|
|
650
652
|
readonly name: "page_type";
|
|
651
653
|
readonly description: "向输入框填写文本,兼容 React 受控组件";
|
|
654
|
+
readonly aliasExamples: {
|
|
655
|
+
readonly page_fill: "page_type --payload '{\"tabId\":12345,\"selector\":\"@e6\",\"text\":\"填写内容\",\"clearFirst\":true}'";
|
|
656
|
+
};
|
|
652
657
|
readonly params: [{
|
|
653
658
|
readonly name: "selector";
|
|
654
659
|
readonly type: "string";
|
|
@@ -669,7 +674,7 @@ export declare const COMMANDS: readonly [{
|
|
|
669
674
|
readonly required: true;
|
|
670
675
|
readonly description: "目标标签页 ID";
|
|
671
676
|
}];
|
|
672
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
677
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
|
|
673
678
|
readonly examples: ["page_type --payload '{\"tabId\":12345,\"selector\":\"@e6\",\"text\":\"搜索关键词\"}'"];
|
|
674
679
|
}, {
|
|
675
680
|
readonly name: "page_hover";
|
|
@@ -685,7 +690,7 @@ export declare const COMMANDS: readonly [{
|
|
|
685
690
|
readonly required: true;
|
|
686
691
|
readonly description: "目标标签页 ID";
|
|
687
692
|
}];
|
|
688
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
693
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
|
|
689
694
|
readonly examples: ["page_hover --payload '{\"tabId\":12345,\"selector\":\".nav-menu\"}'"];
|
|
690
695
|
}, {
|
|
691
696
|
readonly name: "page_scroll";
|
|
@@ -713,7 +718,7 @@ export declare const COMMANDS: readonly [{
|
|
|
713
718
|
readonly required: true;
|
|
714
719
|
readonly description: "目标标签页 ID";
|
|
715
720
|
}];
|
|
716
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
721
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"];
|
|
717
722
|
readonly examples: ["page_scroll --payload '{\"tabId\":12345,\"direction\":\"down\"}'", "page_scroll --payload '{\"tabId\":12345,\"direction\":\"bottom\"}'", "page_scroll --payload '{\"tabId\":12345,\"selector\":\".virtual-list\",\"direction\":\"down\",\"distance\":800}'", "page_scroll --payload '{\"tabId\":12345,\"selector\":\"@e8\",\"containerPolicy\":\"nearest\",\"direction\":\"bottom\"}'"];
|
|
718
723
|
}, {
|
|
719
724
|
readonly name: "page_runtime";
|
|
@@ -810,6 +815,14 @@ export declare const COMMANDS: readonly [{
|
|
|
810
815
|
readonly name: "modifiers";
|
|
811
816
|
readonly type: "string[]";
|
|
812
817
|
readonly description: "修饰键数组:ctrl/alt/shift/meta/cmd";
|
|
818
|
+
}, {
|
|
819
|
+
readonly name: "dialogId";
|
|
820
|
+
readonly type: "string";
|
|
821
|
+
readonly description: "原生弹窗回执或 page_snapshot 中的 dialog.id;仅配合 Enter 接受或 Escape 取消";
|
|
822
|
+
}, {
|
|
823
|
+
readonly name: "promptText";
|
|
824
|
+
readonly type: "string";
|
|
825
|
+
readonly description: "仅用于 dialogId + Enter 接受原生 prompt 时填写文本";
|
|
813
826
|
}, {
|
|
814
827
|
readonly name: "pressMode";
|
|
815
828
|
readonly type: "\"auto\" | \"dom\" | \"keyboard\"";
|
|
@@ -820,8 +833,8 @@ export declare const COMMANDS: readonly [{
|
|
|
820
833
|
readonly required: true;
|
|
821
834
|
readonly description: "目标标签页 ID";
|
|
822
835
|
}];
|
|
823
|
-
readonly notes: readonly ["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。"];
|
|
824
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
836
|
+
readonly notes: readonly ["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。", "原生 alert/confirm/prompt/beforeunload 弹窗需显式传 dialogId;普通 Enter 不处理弹窗。弹窗处理绕过 DOM 观察,不自动重放被中断的动作;处理后重新读取页面。"];
|
|
837
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"];
|
|
825
838
|
readonly examples: ["page_press --payload '{\"tabId\":12345,\"key\":\"Enter\"}'"];
|
|
826
839
|
}, {
|
|
827
840
|
readonly name: "page_wait";
|
|
@@ -864,11 +877,14 @@ export declare const COMMANDS: readonly [{
|
|
|
864
877
|
readonly required: true;
|
|
865
878
|
readonly description: "目标标签页 ID";
|
|
866
879
|
}];
|
|
867
|
-
readonly notes: readonly ["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。"];
|
|
880
|
+
readonly notes: readonly ["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。", "等待后须立即执行已知动作时,用 mearl run 在同一脚本中 await pageWait 后紧接 pageClick,避免模型往返。整体 --timeout 须覆盖等待及后续动作;等待失败不继续点击。"];
|
|
868
881
|
readonly examples: ["page_wait --payload '{\"tabId\":12345,\"time\":1000}'", "page_wait --payload '{\"tabId\":12345,\"selector\":\".dialog\",\"state\":\"visible\"}'", "page_wait --payload '{\"tabId\":12345,\"selector\":\".loading\",\"state\":\"hidden\"}'", "page_wait --payload '{\"tabId\":12345,\"text\":\"提交成功\"}'", "page_wait --payload '{\"tabId\":12345,\"condition\":\"window.appReady === true\",\"timeout\":30000}'"];
|
|
869
882
|
}, {
|
|
870
883
|
readonly name: "page_navigate";
|
|
871
884
|
readonly description: "在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进";
|
|
885
|
+
readonly aliasExamples: {
|
|
886
|
+
readonly page_reload: "page_navigate --payload '{\"tabId\":12345,\"refresh\":true}'";
|
|
887
|
+
};
|
|
872
888
|
readonly params: [{
|
|
873
889
|
readonly name: "url";
|
|
874
890
|
readonly type: "string";
|
|
@@ -911,7 +927,7 @@ export declare const COMMANDS: readonly [{
|
|
|
911
927
|
readonly required: true;
|
|
912
928
|
readonly description: "目标标签页 ID";
|
|
913
929
|
}];
|
|
914
|
-
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt
|
|
930
|
+
readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
|
|
915
931
|
readonly notes: readonly ["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"];
|
|
916
932
|
readonly examples: ["page_upload --payload '{\"tabId\":12345,\"selector\":\"#file-input\",\"filePaths\":[\"/Users/me/photo.jpg\"]}'"];
|
|
917
933
|
}, {
|
|
@@ -1055,7 +1071,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1055
1071
|
readonly examples: ["set_device_emulation --payload '{\"tabId\":12345,\"enabled\":true,\"preset\":\"iphone-17-pro\"}'", "set_device_emulation --payload '{\"tabId\":12345,\"enabled\":true,\"preset\":\"pixel-11\",\"orientation\":\"landscape\"}'", "set_device_emulation --payload '{\"tabId\":12345,\"enabled\":true,\"preset\":\"ipad-mini-a17-pro\",\"orientation\":\"landscape\",\"deviceShell\":true,\"splitScreen\":true}'", "set_device_emulation --payload '{\"tabId\":12345,\"enabled\":false}'"];
|
|
1056
1072
|
}, {
|
|
1057
1073
|
readonly name: "set_app_profile";
|
|
1058
|
-
readonly description: "设置已安装的 App 档案;完整 JSBridge
|
|
1074
|
+
readonly description: "设置已安装的 App 档案;完整 JSBridge 由能力包提供。可同时设置已安装的网络控件,传 emulation 时联动设备模拟";
|
|
1059
1075
|
readonly summary: "设置或清除目标标签页的 App 容器模拟";
|
|
1060
1076
|
readonly params: [{
|
|
1061
1077
|
readonly name: "enabled";
|
|
@@ -1065,7 +1081,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1065
1081
|
}, {
|
|
1066
1082
|
readonly name: "profile";
|
|
1067
1083
|
readonly type: "string";
|
|
1068
|
-
readonly description:
|
|
1084
|
+
readonly description: "已安装的容器档案 ID(enabled=true 时必填);当前动态帮助直接展示目标浏览器目录";
|
|
1069
1085
|
}, {
|
|
1070
1086
|
readonly name: "os";
|
|
1071
1087
|
readonly type: "\"ios\" | \"android\"";
|
|
@@ -1091,9 +1107,9 @@ export declare const COMMANDS: readonly [{
|
|
|
1091
1107
|
readonly type: "object";
|
|
1092
1108
|
readonly description: "声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}};不执行配置脚本";
|
|
1093
1109
|
}, {
|
|
1094
|
-
readonly name: "
|
|
1095
|
-
readonly type: "
|
|
1096
|
-
readonly description: "
|
|
1110
|
+
readonly name: "networkControl";
|
|
1111
|
+
readonly type: "object | null";
|
|
1112
|
+
readonly description: "可选已安装网络控件 {id,value};null 清除,省略时保持当前设置。仅作用于目标 tab";
|
|
1097
1113
|
}, {
|
|
1098
1114
|
readonly name: "emulation";
|
|
1099
1115
|
readonly type: "object";
|
|
@@ -1109,8 +1125,8 @@ export declare const COMMANDS: readonly [{
|
|
|
1109
1125
|
readonly description: "目标标签页 ID";
|
|
1110
1126
|
}];
|
|
1111
1127
|
readonly notes: readonly ["只有用户明确要求 App/客户端/容器/JSBridge 模拟时启用。移动视口或普通 H5 调试使用 set_device_emulation。", "emulation={} 使用档案推荐设备;enabled=false 时省略 emulation 只清除 App 注入,传 {} 同时清除设备模拟。", "bridgeConfig.methods 按方法声明 behavior / response / noop 三选一,可传 silent;只支持受控行为、固定 JSON 回包或成功空实现,不执行配置脚本。"];
|
|
1112
|
-
readonly result: readonly ["返回 enabled、profile、label、userAgent、os、
|
|
1113
|
-
readonly examples: ["set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"
|
|
1128
|
+
readonly result: readonly ["返回 enabled、profile、label、userAgent、os、networkControl、reloaded;联动设备时额外返回实际 emulation。"];
|
|
1129
|
+
readonly examples: ["set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"reader\"}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"reader\",\"networkControl\":{\"id\":\"environment\",\"value\":\"pre\"}}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":false,\"networkControl\":null}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"reader\",\"emulation\":{}}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"wallet\",\"emulation\":{\"preset\":\"pixel-11\",\"deviceShell\":true}}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":true,\"profile\":\"reader\",\"emulation\":{\"preset\":\"ipad-mini-a17-pro\",\"orientation\":\"landscape\",\"deviceShell\":true,\"splitScreen\":true}}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":false}'", "set_app_profile --payload '{\"tabId\":12345,\"enabled\":false,\"emulation\":{}}'"];
|
|
1114
1130
|
}, {
|
|
1115
1131
|
readonly name: "set_timezone";
|
|
1116
1132
|
readonly description: "覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区";
|
|
@@ -1153,7 +1169,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1153
1169
|
}];
|
|
1154
1170
|
readonly notes: readonly ["只读取指定非分区 Cookie,不列举全部、不回退分区 Cookie,拒绝 HttpOnly;禁止读取认证 Token。指定 url 不导航,指定 tabId 仅选择存储区时不启动采集。"];
|
|
1155
1171
|
readonly result: readonly ["找到时 found=true 并返回 value/domain/path;不存在时 found=false。"];
|
|
1156
|
-
readonly examples: ["get_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\"}'", "get_cookie --payload '{\"url\":\"https://www.
|
|
1172
|
+
readonly examples: ["get_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\"}'", "get_cookie --payload '{\"url\":\"https://www.shop.com/\",\"name\":\"account_name\"}'", "get_cookie --payload '{\"tabId\":12345,\"name\":\"feature_channel\",\"domain\":\"example.com\"}'", "get_cookie --payload '{\"tabId\":12345,\"name\":\"account_name\",\"url\":\"https://www.shop.com/\",\"domain\":\"example.com\",\"path\":\"/\"}'"];
|
|
1157
1173
|
}, {
|
|
1158
1174
|
readonly name: "set_cookie";
|
|
1159
1175
|
readonly description: "在目标浏览器设置一个指定非分区 session Cookie,可选刷新指定页面";
|
|
@@ -1190,7 +1206,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1190
1206
|
}];
|
|
1191
1207
|
readonly notes: readonly ["仅写非分区 session Cookie,不支持删除。reload=true 时校验目标域与刷新页域的授权。"];
|
|
1192
1208
|
readonly result: readonly ["返回 url/name/domain/path/reloaded,指定标签页时包含 tabId;不回显 Cookie 值。"];
|
|
1193
|
-
readonly examples: ["set_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\",\"value\":\"enabled\"}'", "set_cookie --payload '{\"url\":\"https://www.
|
|
1209
|
+
readonly examples: ["set_cookie --payload '{\"tabId\":12345,\"name\":\"feature_flag\",\"value\":\"enabled\"}'", "set_cookie --payload '{\"url\":\"https://www.shop.com/\",\"name\":\"feature_flag\",\"value\":\"enabled\"}'", "set_cookie --payload '{\"tabId\":12345,\"name\":\"feature_channel\",\"value\":\"3.6.63\",\"domain\":\"example.com\",\"reload\":true}'"];
|
|
1194
1210
|
}, {
|
|
1195
1211
|
readonly name: "page_frames";
|
|
1196
1212
|
readonly description: "获取页面主 frame 与所有 iframe 列表";
|
|
@@ -1203,7 +1219,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1203
1219
|
readonly result: readonly ["frames[] 包含 frameId、url、name 和 isMainFrame;frameId 可用于 page_eval 等支持 frame 定位的 action。"];
|
|
1204
1220
|
readonly examples: ["page_frames --payload '{\"tabId\":12345}'"];
|
|
1205
1221
|
}, {
|
|
1206
|
-
readonly name: "
|
|
1222
|
+
readonly name: "request_permission";
|
|
1207
1223
|
readonly description: "申请访问指定域名的权限(必要时弹窗让用户授权)";
|
|
1208
1224
|
readonly params: [{
|
|
1209
1225
|
readonly name: "domain";
|
|
@@ -1213,7 +1229,7 @@ export declare const COMMANDS: readonly [{
|
|
|
1213
1229
|
}];
|
|
1214
1230
|
readonly notes: readonly ["domain 使用纯主机名,不传 URL。在 send_request 或 set_rule 提示缺少浏览器域名权限时申请。", "弹窗等待用户选择,90 秒超时或关闭按拒绝处理;granted=true 后才重试原请求。"];
|
|
1215
1231
|
readonly result: readonly ["返回 granted、domain,授权成功时包含 origin。"];
|
|
1216
|
-
readonly examples: ["
|
|
1232
|
+
readonly examples: ["request_permission --payload '{\"domain\":\"example.com\"}'"];
|
|
1217
1233
|
}, {
|
|
1218
1234
|
readonly name: "run_actions";
|
|
1219
1235
|
readonly description: "批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察";
|