@mearl/client 2.0.2 → 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.
package/README.md CHANGED
@@ -58,6 +58,7 @@ mearl browser_launch --payload '{"name":"account-b","query":"test_account"}'
58
58
  mearl browser_launch --payload '{"name":"cookie-copy","copyCookieDomains":["example.com"]}'
59
59
  mearl browser_launch --payload '{"name":"figma","userAgentMode":"desktop","copyCookieDomains":["figma.com"]}'
60
60
  mearl browser_list
61
+ mearl browser_release
61
62
  ```
62
63
 
63
64
  **通用选项:**
@@ -69,6 +70,7 @@ mearl browser_list
69
70
  | `--timeout <seconds>` | 请求超时时间 |
70
71
  | `--compact` | 紧凑输出 |
71
72
  | `--output <path>` | 将结果写入文件(如截图) |
73
+ | `--browser <id\|名称>` | 指定目标浏览器 |
72
74
 
73
75
  ## 支持的操作
74
76
 
@@ -80,11 +82,11 @@ mearl browser_list
80
82
  | 标签页 | `tab_open` `tab_close` `tab_list` |
81
83
  | 页面操作 | `page_click` `page_type` `page_scroll` `page_eval` `page_press` `page_wait` `page_navigate` `page_upload` |
82
84
  | 页面感知 | `page_snapshot` `page_screenshot` `page_selected_element` `page_frames` |
83
- | 环境模拟 | `set_device_emulation` `set_timezone` |
85
+ | 环境与状态 | `set_device_emulation` `set_timezone` `get_cookie` `set_cookie` |
84
86
  | 用户信息 | `get_user_info` |
85
87
  | 录制 | `record_start` `record_stop` |
86
88
  | TDBank | `tdbank_account` |
87
- | 浏览器 | `browser_list` `browser_launch` `browser_close` |
89
+ | 浏览器 | `browser_list` `browser_release` `browser_launch` `browser_close` |
88
90
 
89
91
  页面交互动作(`page_click` / `page_type` / `page_hover` / `page_scroll` / `page_press` / `page_upload`)默认内置观察:同一次调用内执行动作并等待异步稳定,返回 `{ action, observation }`;传 `observe: false` 可关闭观察仅执行裸动作。观察结果不替代完整页面理解:`mode: "delta"` 只返回主文档中的 `effects.notifications`、`effects.interactives` 和 `effects.focus` 等高置信度信号,并明确携带 `scope: "main-document"`;可交互节点会尽量携带真实 backend `node.ref`,后续动作优先使用 ref,缺少 ref 时使用 `node.selector`。`mode: "navigation"` 且 `ready: true` 时,页面已通过网络静默、骨架状态或保守的内容稳定判定,可在新页面重建快照。通常仅在 `fullSnapshotRecommended` 为 true 时根据 `snapshotReasons` 回退;滚动后若下一步需要读取新视口内容,可按需获取 viewport 快照。`page_eval` 默认裸执行,只有显式传入 `observe` 对象时才启用观察。
90
92
 
@@ -94,6 +96,8 @@ mearl browser_list
94
96
 
95
97
  `browser_list` 统一列出普通浏览器和托管浏览器。`type` 区分 `regular` / `managed`,`status` 区分 `connected` / `running_disconnected` / `stopped`;只有 `connected` 的浏览器可作为操作目标。
96
98
 
99
+ `browser_release` 仅在用户明确要求结束调试、退出接管或清理会话资源时使用,不作为普通任务收尾。它会释放当前目标浏览器的 debugger/CDP 控制和会话级临时状态(包括设备/时区模拟),保留浏览器及全部标签页;后续浏览器操作可自动重新建立控制。
100
+
97
101
  托管浏览器使用独立 Profile 和动态 CDP 端口。控制浏览器需先登录 TDBank;生成的 SSO 地址在本地内部传递,新实例可以使用 `headless: true`(默认)完成测试账号登录。`copyCookieDomains` 可把控制浏览器指定域的 Cookie 复制到新实例,Cookie 值不会出现在命令结果或日志中;`userAgentMode: "desktop"` 可让实例使用匹配本机 Chrome 版本的桌面 UA。完整设计见 [托管浏览器与 TDBank 多账号设计](../../docs/managed-browsers.md)。
98
102
 
99
103
  ## 架构
@@ -1,19 +1,11 @@
1
+ import { PAGE_ACT_ACTIONS } from './generated-browser-action-protocol.js';
1
2
  function boundedNumber(value, fallback, minimum, maximum) {
2
3
  const numeric = Number(value);
3
4
  if (!Number.isFinite(numeric))
4
5
  return fallback;
5
6
  return Math.min(Math.max(numeric, minimum), maximum);
6
7
  }
7
- // 默认内置观察的页面交互动作。client 作为零依赖包本地维护,
8
- // 需与 browser-core/pageAct.ts 的 PAGE_ACT_ACTIONS 保持一致。
9
- const OBSERVED_PAGE_ACTIONS = new Set([
10
- 'page_click',
11
- 'page_type',
12
- 'page_hover',
13
- 'page_scroll',
14
- 'page_press',
15
- 'page_upload',
16
- ]);
8
+ const OBSERVED_PAGE_ACTIONS = new Set(PAGE_ACT_ACTIONS);
17
9
  export function resolveObservedActionTimeoutSec(data) {
18
10
  const observe = data.observe ?? {};
19
11
  const observationMs = boundedNumber(observe.timeoutMs, 3000, 500, 30000);
@@ -35,12 +27,18 @@ export function resolveActionTimeoutSec(action, data, fallback = 15) {
35
27
  }
36
28
  if (action === 'tab_open')
37
29
  return Math.max(fallback, 40);
30
+ if (action === 'set_cookie' && data.reload === true)
31
+ return Math.max(fallback, 40);
38
32
  if (action === 'browser_launch')
39
33
  return Math.max(fallback, 90);
40
34
  if (action === 'browser_close' || action === 'tdbank_account')
41
35
  return Math.max(fallback, 20);
42
36
  // 页面交互动作默认内置观察,超时需覆盖观察与导航窗口;observe:false 时是裸动作,用默认超时
43
- if (OBSERVED_PAGE_ACTIONS.has(action) && data.observe !== false) {
37
+ const observedAction = OBSERVED_PAGE_ACTIONS.has(action);
38
+ const observationEnabled = action === 'page_eval'
39
+ ? data.observe !== null && typeof data.observe === 'object' && !Array.isArray(data.observe)
40
+ : data.observe !== false;
41
+ if (observedAction && observationEnabled) {
44
42
  return Math.max(fallback, resolveObservedActionTimeoutSec(data));
45
43
  }
46
44
  if (action === 'run_actions') {
package/dist/cli.js CHANGED
@@ -41,13 +41,16 @@ const CATEGORIES = [
41
41
  title: '页面感知',
42
42
  names: ['page_snapshot', 'page_screenshot', 'page_selected_element', 'page_frames'],
43
43
  },
44
- { title: '环境模拟', names: ['set_device_emulation', 'set_timezone'] },
44
+ {
45
+ title: '环境与 Cookie',
46
+ names: ['set_device_emulation', 'set_timezone', 'get_cookie', 'set_cookie'],
47
+ },
45
48
  { title: '用户信息', names: ['get_user_info'] },
46
49
  { title: '录制', names: ['record_start', 'record_stop'] },
47
50
  { title: 'TDBank', names: ['tdbank_account'] },
48
51
  {
49
52
  title: '浏览器',
50
- names: ['browser_list', 'browser_launch', 'browser_close'],
53
+ names: ['browser_list', 'browser_release', 'browser_launch', 'browser_close'],
51
54
  },
52
55
  ];
53
56
  function printUsage() {