@qing3a/flow-rpa-engine 0.3.0 → 0.4.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/dist/cdp/page.js CHANGED
@@ -34,15 +34,48 @@ window.__rpaDom = (function() {
34
34
  if (exact.length > 0) return exact;
35
35
  return leaf.filter(el => (el.textContent || '').includes(needle));
36
36
  }
37
- function getBySels(selector) {
38
- const sel = String(selector);
39
- if (sel.startsWith('text:')) return byText(sel.slice(5));
37
+ function safeQuery(sel) {
40
38
  try {
41
39
  return Array.from(document.querySelectorAll(sel)).filter(isVisible);
42
40
  } catch (e) {
43
41
  return [];
44
42
  }
45
43
  }
44
+ function getBySels(selector) {
45
+ // A3 数组链(#17 修复):依次尝试,第一个命中的返回
46
+ if (Array.isArray(selector)) {
47
+ for (const s of selector) {
48
+ const nodes = getBySels(s);
49
+ if (nodes.length > 0) return nodes;
50
+ }
51
+ return [];
52
+ }
53
+ const sel = String(selector);
54
+ if (sel.startsWith('text:')) return byText(sel.slice(5));
55
+ // #16-B 编号寻址(虚拟空间视觉):#N = numberedElements 列表第 N 个可见交互元素(1 起)。
56
+ // 快照编号与寻址共用同一枚举 → Agent/日志可「看编号直接点」;编号随 DOM 变化,操作时现取。
57
+ const numMatch = sel.match(/^#(\d+)$/);
58
+ if (numMatch) {
59
+ const idx = Number(numMatch[1]) - 1;
60
+ const tags = 'a,button,input,select,textarea,[role="button"],[role="link"],[contenteditable="true"]';
61
+ const nodes = Array.from(document.querySelectorAll(tags)).filter(isVisible);
62
+ return idx >= 0 && idx < nodes.length ? [nodes[idx]] : [];
63
+ }
64
+ // 混合串(CSS 与 text: 逗号分隔,如 "a.search-btn, text:搜索"):逐段尝试合并去重
65
+ // (#17 修复:text: 段不能再混进 querySelectorAll——整体会 SyntaxError 失效)
66
+ const parts = sel.split(',').map((p) => p.trim()).filter(Boolean);
67
+ if (parts.length > 1 || parts.some((p) => p.startsWith('text:'))) {
68
+ const out = [];
69
+ for (const p of parts) {
70
+ const nodes = p.startsWith('text:') ? byText(p.slice(5)) : safeQuery(p);
71
+ for (const n of nodes) {
72
+ if (isVisible(n) && !out.includes(n)) out.push(n);
73
+ }
74
+ }
75
+ return out;
76
+ }
77
+ return safeQuery(sel);
78
+ }
46
79
  function pick(selector, index) {
47
80
  const nodes = getBySels(selector);
48
81
  return nodes[index] || nodes[0] || null;
@@ -82,7 +115,204 @@ window.__rpaDom = (function() {
82
115
  text: (el.innerText || el.value || el.textContent || '').trim().slice(0, 40)
83
116
  }));
84
117
  }
85
- return { getBySels, scrollIntoView, textOf, focusInput, pageText, numberedElements };
118
+ // #16-A 虚拟空间视觉:元素语义描述(遮挡检测/日志用)
119
+ function describeEl(el) {
120
+ if (!el || el.nodeType !== 1) return null;
121
+ const t = (el.innerText || el.value || el.textContent || '').trim();
122
+ return {
123
+ tag: el.tagName.toLowerCase(),
124
+ cls: (el.className || '').toString().slice(0, 60),
125
+ text: t.slice(0, 30),
126
+ role: el.getAttribute && el.getAttribute('role'),
127
+ };
128
+ }
129
+ // #16-B/P2 区域识别:目标元素向上遍历祖先(≤5 层),用行为规则匹配出区域标签。
130
+ // 规则(behavior.rules.json 随流程包分发,引擎零业务逻辑):全部 match 条件满足才命中。
131
+ // 返回 { label, ruleId, ancestry }——ancestry 为祖先链摘要(抗改版重定位用)。
132
+ function identifyRegion(selector, index, rulesJson) {
133
+ const target = pick(selector, index);
134
+ if (!target) return null;
135
+ let rules = [];
136
+ try { rules = JSON.parse(rulesJson || '[]'); } catch (e) { rules = []; }
137
+ const ancestry = [];
138
+ let el = target;
139
+ for (let d = 0; d < 5 && el; d++) {
140
+ if (el !== target && el.nodeType === 1) {
141
+ const cls = (el.className || '').toString().slice(0, 40);
142
+ ancestry.push(el.tagName.toLowerCase() + (cls ? '.' + cls : ''));
143
+ }
144
+ // 用规则匹配当前祖先
145
+ for (const r of rules) {
146
+ const m = r.match || {};
147
+ let hit = true;
148
+ if (m.textContains && !((el.innerText || '').includes(m.textContains))) hit = false;
149
+ if (m.textContainsAll && Array.isArray(m.textContainsAll)) {
150
+ const txt = el.innerText || '';
151
+ for (const kw of m.textContainsAll) {
152
+ if (!txt.includes(kw)) { hit = false; break; }
153
+ }
154
+ }
155
+ if (m.hasInput && !el.querySelector('input, textarea')) hit = false;
156
+ if (m.hasButton && !el.querySelector('button, a[role="button"], [role="button"]')) hit = false;
157
+ if (m.ancestorTag && !(el.tagName || '').toLowerCase().includes(m.ancestorTag)) hit = false;
158
+ if (m.ancestorClass && !((el.className || '').toString().includes(m.ancestorClass))) hit = false;
159
+ if (hit) {
160
+ return { label: r.label, ruleId: r.id, ancestry: ancestry.slice(0, 3) };
161
+ }
162
+ }
163
+ el = el.parentElement;
164
+ }
165
+ return { label: undefined, ruleId: undefined, ancestry: ancestry.slice(0, 3) };
166
+ }
167
+ // #16-A 点击前遮挡检测:返回 (x,y) 处最顶层元素 + 该元素是否属于目标(目标或其后代)
168
+ function hitTestAt(selector, index, x, y) {
169
+ const target = pick(selector, index);
170
+ if (!target) return { found: false };
171
+ const top = document.elementFromPoint(x, y);
172
+ if (!top) return { found: true, hit: false, top: null };
173
+ const hit = top === target || target.contains(top);
174
+ return {
175
+ found: true,
176
+ hit,
177
+ top: describeEl(top),
178
+ target: describeEl(target),
179
+ };
180
+ }
181
+ // #16-A 对话框关闭:遮挡者(dialog-layer 等遮罩)内的关闭按钮坐标(供引擎点击关闭后重试)
182
+ function findDialogClose(selector, index) {
183
+ const target = pick(selector, index);
184
+ if (!target) return null;
185
+ const cx = Math.round(target.getBoundingClientRect().left + target.getBoundingClientRect().width / 2);
186
+ const cy = Math.round(target.getBoundingClientRect().top + target.getBoundingClientRect().height / 2);
187
+ const top = document.elementFromPoint(cx, cy);
188
+ if (!top) return null;
189
+ // 找最顶层元素作为遮挡者(dialog-layer/遮罩),在其内找关闭按钮
190
+ let blocker = top;
191
+ while (blocker && blocker !== document.body) {
192
+ const s = getComputedStyle(blocker);
193
+ if ((s.position === 'fixed' || s.position === 'absolute') && parseFloat(s.zIndex) >= 100) break;
194
+ blocker = blocker.parentElement;
195
+ }
196
+ if (!blocker || blocker === document.body) return null;
197
+ // 关闭按钮候选:class 含 close / 图标按钮 / 文本 ×
198
+ const closeBtns = [...blocker.querySelectorAll('a,button,[role="button"],i,span,div')].filter((el) => {
199
+ const cls = (el.className || '').toString();
200
+ const txt = (el.innerText || '').trim();
201
+ const r = el.getBoundingClientRect();
202
+ return r.width > 8 && r.height > 8 &&
203
+ (/close|close-btn|icon-close|dialog-close|del|btn-close/i.test(cls) || txt === '×' || txt === '✕' || txt === 'X' || txt === '关闭');
204
+ });
205
+ const btn = closeBtns[0];
206
+ if (!btn) return null;
207
+ const r = btn.getBoundingClientRect();
208
+ return { x: Math.round(r.left + r.width / 2), y: Math.round(r.top + r.height / 2), cls: (btn.className || '').toString().slice(0, 40) };
209
+ }
210
+ // #16-A 原子化遮挡检测:与 rect 采集同一次求值(消除「采集-检测」两次求值间的 DOM 竞态)。
211
+ // 返回每个可见目标的 rect + 中心点命中信息 + 安全点击点:
212
+ // hit=true 中心点命中目标或其非交互后代(安全点击点)
213
+ // hit=false 中心点被真实遮挡(浮动层/弹层/其它元素覆盖)
214
+ // danger=true 中心点落在目标内的【可交互子元素】(链接/按钮等)上——点击会触发子元素而非目标
215
+ // safe 矩形内扫描到的第一个「属于目标且非交互子元素」的点(中心被盖/危险时换点用);
216
+ // 无安全点则 null(整个目标被盖 → 引擎侧 ESC 关闭浮动层重试)
217
+ // top=null(elementFromPoint 无结果,如元素部分在视口外/渲染边缘)→ 不视为遮挡,hit=true。
218
+ function clickableRects(selector) {
219
+ const d = window.__rpaDom;
220
+ const nodes = d && d.getBySels ? d.getBySels(selector) : [];
221
+ const vw = innerWidth || document.documentElement.clientWidth;
222
+ const vh = innerHeight || document.documentElement.clientHeight;
223
+ const out = [];
224
+ const INTERACTIVE = 'a,button,[role="button"],[role="link"],input,select,textarea,[onclick],label';
225
+ const isSafeHit = (el, top) => {
226
+ if (!top) return false;
227
+ if (top === el) return true;
228
+ if (el.contains(top)) {
229
+ return !(top.closest && top.closest(INTERACTIVE) === top);
230
+ }
231
+ return false;
232
+ };
233
+ for (let i = 0; i < nodes.length; i++) {
234
+ const el = nodes[i];
235
+ const t = el.getBoundingClientRect();
236
+ const fullW = Math.max(1, t.width);
237
+ const fullH = Math.max(1, t.height);
238
+ const x = Math.max(t.left, 0);
239
+ const y = Math.max(t.top, 0);
240
+ const w = Math.max(0, Math.min(t.right, vw) - x);
241
+ const h = Math.max(0, Math.min(t.bottom, vh) - y);
242
+ if (w <= 0 || h <= 0) continue;
243
+ // #16-A 可见比例:视口内面积 / 总面积。窄视口下大部分在视口外的元素
244
+ // (如顶部导航右侧的搜索按钮)点击坐标会落在视口外/边缘 → CDP input 挂起或点空。
245
+ // 可见比例 < 50% → 标记 partiallyVisible,引擎侧报「目标大部分在视口外」而非尝试点击。
246
+ const visibleRatio = (w * h) / (fullW * fullH);
247
+ const partiallyVisible = visibleRatio < 0.5;
248
+ if (partiallyVisible) {
249
+ out.push({
250
+ x: Math.round(x), y: Math.round(y), w: Math.round(w), h: Math.round(h),
251
+ hit: false, danger: false, safe: null, partiallyVisible: true, top: null, target: describeEl(el),
252
+ });
253
+ continue;
254
+ }
255
+ const cx = Math.round(x + w / 2);
256
+ const cy = Math.round(y + h / 2);
257
+ const top = document.elementFromPoint(cx, cy);
258
+ if (!top) {
259
+ // elementFromPoint 无结果:可见比例足够(≥50%)但取不到顶层元素 → 渲染边界容忍,不阻塞
260
+ out.push({
261
+ x: Math.round(x), y: Math.round(y), w: Math.round(w), h: Math.round(h),
262
+ hit: true, danger: false, safe: null, partiallyVisible: false, top: null, target: describeEl(el),
263
+ });
264
+ continue;
265
+ }
266
+ const belongs = top === el || el.contains(top);
267
+ const isInteractiveChild = top !== el && el.contains(top) && top.closest && top.closest(INTERACTIVE) === top;
268
+ // 中心被盖/危险 → 扫描矩形内部找安全点(5×5 网格,避开交互子元素与遮挡)
269
+ let safe = null;
270
+ if (!(belongs && !isInteractiveChild)) {
271
+ for (let gy = 1; gy <= 4 && !safe; gy++) {
272
+ for (let gx = 1; gx <= 4 && !safe; gx++) {
273
+ const sx = Math.round(x + (w * gx) / 5);
274
+ const sy = Math.round(y + (h * gy) / 5);
275
+ const st = document.elementFromPoint(sx, sy);
276
+ if (st && isSafeHit(el, st)) safe = { x: sx, y: sy };
277
+ }
278
+ }
279
+ }
280
+ out.push({
281
+ x: Math.round(x), y: Math.round(y), w: Math.round(w), h: Math.round(h),
282
+ hit: belongs && !isInteractiveChild,
283
+ danger: isInteractiveChild,
284
+ safe,
285
+ partiallyVisible: false,
286
+ top: describeEl(top),
287
+ target: describeEl(el),
288
+ });
289
+ }
290
+ return out;
291
+ }
292
+ // #16-A 目标矩形内找安全点击点:网格采样(5×5),返回第一个「属于目标且不在可交互子元素上」的点。
293
+ // 大容器卡片(如 job-card-wrap)中心常落在公司链接/职位详情链接上,直接点会误跳转;
294
+ // 安全点避开交互子元素(a/button/[onclick]),只落在文本/空白区域(点击仍由父级事件冒泡处理)。
295
+ function safePointIn(selector, index) {
296
+ const el = pick(selector, index);
297
+ if (!el) return null;
298
+ const t = el.getBoundingClientRect();
299
+ const INTERACTIVE = 'a,button,[role="button"],[role="link"],input,select,textarea,[onclick],label';
300
+ for (let gy = 2; gy <= 3; gy++) {
301
+ for (let gx = 2; gx <= 3; gx++) {
302
+ const cx = Math.round(t.left + (t.width * gx) / 5);
303
+ const cy = Math.round(t.top + (t.height * gy) / 5);
304
+ const top = document.elementFromPoint(cx, cy);
305
+ if (!top) continue;
306
+ if (top === el || el.contains(top)) {
307
+ const bad = top !== el && top.closest && top.closest(INTERACTIVE) === top;
308
+ if (!bad) return { x: cx, y: cy };
309
+ }
310
+ }
311
+ }
312
+ // 兜底:中心点(可能危险,由引擎侧再判断)
313
+ return { x: Math.round(t.left + t.width / 2), y: Math.round(t.top + t.height / 2) };
314
+ }
315
+ return { getBySels, scrollIntoView, textOf, focusInput, pageText, numberedElements, describeEl, hitTestAt, clickableRects, safePointIn, identifyRegion, findDialogClose };
86
316
  })();
87
317
  true
88
318
  `;
@@ -166,10 +396,37 @@ export class CdpPage {
166
396
  }
167
397
  throw ExecErr.page('浏览器拉起后调试端口未就绪');
168
398
  }
169
- /** 打开新标签页并导航到 url(绑定拟人层;等待页面就绪) */
399
+ /**
400
+ * 打开/复用标签页并导航到 url(绑定拟人层;等待页面就绪)。
401
+ * 风控友好改进(2026-08-26,Hunter 思路对照):优先复用 9222 上已加载的同站标签
402
+ * (避免每次 run 新开标签的冷导航挂起 + 建销模式);finalize 只关本次新建的标签,
403
+ * 复用标签保留 → 持久标签模式(对齐扩展/自带 Chrome 方案的行为)。
404
+ */
170
405
  async open(url) {
171
- const t = await openTarget(url, this.port);
406
+ const host = this.hostOfUrl(url);
407
+ const targets = await listTargets(this.port).catch(() => []);
408
+ const reuse = targets.find((t) => {
409
+ const tHost = this.hostOfUrl(t.url);
410
+ return tHost !== '' && tHost === host;
411
+ }) ?? undefined;
412
+ const t = reuse ?? (await openTarget(url, this.port));
172
413
  const client = await CdpClient.connect(t.wsUrl);
414
+ if (reuse) {
415
+ // 复用标签:host+path 相同则跳过导航(忽略 query——zhipin 会带 _security_check 等参数,
416
+ // 精确比较会触发重新导航 → 安全校验重定向 → 页面刷新丢失状态)
417
+ const cur = String(await client.evaluate('location.href').catch(() => ''));
418
+ const sameRoute = (() => {
419
+ try {
420
+ return new URL(cur).hostname === new URL(url).hostname && new URL(cur).pathname === new URL(url).pathname;
421
+ }
422
+ catch {
423
+ return false;
424
+ }
425
+ })();
426
+ if (!sameRoute) {
427
+ await client.send('Page.navigate', { url });
428
+ }
429
+ }
173
430
  // 等待页面 readyState=complete(不强制成功,verify/wait_selector 兜底)
174
431
  const deadline = Date.now() + OPEN_READY_TIMEOUT_MS;
175
432
  for (;;) {
@@ -179,7 +436,74 @@ export class CdpPage {
179
436
  await sleep(200);
180
437
  }
181
438
  this.targetId = t.id;
439
+ this.openedThisRun = !reuse;
182
440
  this.human = new Human(new CdpInputSink(client), this.sim);
441
+ // #16-A 窄视口自动最大化:检测视口宽度,< MIN_VIEWPORT_WIDTH 则最大化窗口
442
+ // (真实窗口操作 Browser.setWindowBounds,非设备模拟——反检测安全,用户确认方案)
443
+ await this.ensureViewportWidth(client);
444
+ }
445
+ /** 视口最小宽度阈值:保证顶部导航元素(搜索按钮等)完整可见(zhipin 搜索按钮右缘 ~1132px) */
446
+ static MIN_VIEWPORT_WIDTH = 1280;
447
+ /**
448
+ * 窄视口自动最大化:视口宽度 < 1280 → 用 CDP 最大化窗口(真实窗口操作)。
449
+ * 最大化是异步的(窗口管理器动画),等待视口变宽;失败静默(partiallyVisible 兜底报错)。
450
+ */
451
+ async ensureViewportWidth(client) {
452
+ try {
453
+ const vp = (await client.evaluate('({w: innerWidth, h: innerHeight})').catch(() => null));
454
+ if (!vp || typeof vp.w !== 'number') {
455
+ console.log(`[flow-rpa] 视口检测失败: ${JSON.stringify(vp)}`);
456
+ return;
457
+ }
458
+ if (vp.w >= CdpPage.MIN_VIEWPORT_WIDTH)
459
+ return;
460
+ console.log(`[flow-rpa] 视口过窄(${vp.w}px < ${CdpPage.MIN_VIEWPORT_WIDTH}px),尝试最大化窗口`);
461
+ // 视口太窄 → 获取窗口并最大化(真实窗口操作,不改变 device metrics)
462
+ const win = (await client.send('Browser.getWindowForTarget', { targetId: this.targetId }));
463
+ if (!win || typeof win.windowId !== 'number') {
464
+ console.log('[flow-rpa] 获取窗口失败(无 windowId)');
465
+ return;
466
+ }
467
+ const setRes = await (async () => {
468
+ // CDP 约束:从 minimized/fullscreen 状态不能直接 maximized,须先 restore 到 normal
469
+ await client.send('Browser.setWindowBounds', {
470
+ windowId: win.windowId,
471
+ bounds: { windowState: 'normal' },
472
+ }).catch(() => undefined);
473
+ await sleep(200);
474
+ return client.send('Browser.setWindowBounds', {
475
+ windowId: win.windowId,
476
+ bounds: { windowState: 'maximized' },
477
+ }).catch((e) => ({ __err: e instanceof Error ? e.message : String(e) }));
478
+ })();
479
+ if (setRes && typeof setRes === 'object' && '__err' in setRes) {
480
+ console.log(`[flow-rpa] 最大化失败: ${setRes.__err}`);
481
+ return;
482
+ }
483
+ console.log(`[flow-rpa] 已请求最大化(windowId=${win.windowId})`);
484
+ // 等待窗口最大化生效(视口变宽;最多 3s)
485
+ const deadline = Date.now() + 3000;
486
+ for (;;) {
487
+ const now = (await client.evaluate('innerWidth').catch(() => 0));
488
+ if (now >= CdpPage.MIN_VIEWPORT_WIDTH || Date.now() >= deadline)
489
+ break;
490
+ await sleep(200);
491
+ }
492
+ }
493
+ catch (e) {
494
+ console.log(`[flow-rpa] 视口最大化异常: ${e instanceof Error ? e.message : String(e)}`);
495
+ }
496
+ }
497
+ /** 本次 run 是否新建标签(finalize 只关新建的;复用标签保留 → 持久标签) */
498
+ openedThisRun = true;
499
+ /** 提取 URL 的 host(不含端口;空 = 解析失败) */
500
+ hostOfUrl(u) {
501
+ try {
502
+ return new URL(u).hostname;
503
+ }
504
+ catch {
505
+ return '';
506
+ }
183
507
  }
184
508
  /** 当前标签页的 CDP 客户端(human 持有的 sink 中的 client) */
185
509
  currentClient() {
@@ -191,7 +515,9 @@ export class CdpPage {
191
515
  /** 注入 DOM 辅助(幂等:页面已有 __rpaDom 则跳过) */
192
516
  async ensureDom() {
193
517
  const client = this.currentClient();
194
- const has = await client.evaluate('!!window.__rpaDom').catch(() => false);
518
+ // 版本感知:#16-A 引入 clickableRects;持久 tab 可能残留旧版 __rpaDom(引擎升级后复用),
519
+ // 仅查存在性会漏注入 → clickableRects 调用失败。检查关键 API,缺失则重新注入。
520
+ const has = await client.evaluate('!!(window.__rpaDom && window.__rpaDom.clickableRects && window.__rpaDom.getBySels && window.__rpaDom.identifyRegion)').catch(() => false);
195
521
  if (has)
196
522
  return;
197
523
  await client.evaluate(DOM_SOURCE);
@@ -247,6 +573,10 @@ export class CdpPage {
247
573
  await this.ensureDom();
248
574
  await this.checkEnv();
249
575
  const client = this.currentClient();
576
+ // #16-B 点击后突变复核:记录点击前路由(host+path),点击后若发生页面级跳转(误点公司链接/
577
+ // 详情链接/付费入口等),回退并抛语义化错误——防「点了卡片却跳到别处」的静默漂移。
578
+ const beforeUrl = String(await client.evaluate('location.href').catch(() => ''));
579
+ const beforeRoute = this.routeKey(beforeUrl);
250
580
  // 滚动到目标可见(index 指定的第 i 个)
251
581
  await client.evaluate(`window.__rpaDom.scrollIntoView(${this.jsStr(selector)}, ${index})`);
252
582
  // 拟人点击:index 语义(D-L2)——点第 i 个元素;越界 = 列表耗尽 → category=index_out_of_range
@@ -264,6 +594,53 @@ export class CdpPage {
264
594
  if (clicked === 0) {
265
595
  throw ExecErr.page(`点击目标不存在: ${selector}`);
266
596
  }
597
+ // 点击后复核:等 SPA 路由跳转(≤2s),若 host+path 突变 → 回退 + 报错
598
+ const deadline = Date.now() + 2000;
599
+ for (;;) {
600
+ const afterUrl = String(await client.evaluate('location.href').catch(() => ''));
601
+ const afterRoute = this.routeKey(afterUrl);
602
+ if (afterRoute !== beforeRoute) {
603
+ // 页面级跳转(误点)→ 回退恢复原页面(Page.goBack 在 CDP 不存在,
604
+ // 用 navigate 回点击前 URL 最稳妥),fail-loud
605
+ await client.send('Page.navigate', { url: beforeUrl }).catch(() => undefined);
606
+ throw ExecErr.page(`点击 ${selector} 后页面跳转(${this.hostLabel(beforeUrl)} → ${this.hostLabel(afterUrl)}),疑似误点链接,已回退`);
607
+ }
608
+ if (Date.now() >= deadline)
609
+ break;
610
+ await sleep(200);
611
+ }
612
+ }
613
+ /** P2 区域识别:目标元素所在区域的语义描述(DOM_SOURCE.identifyRegion;旁路,失败返回 null) */
614
+ async identifyRegion(selector, index, rulesJson) {
615
+ try {
616
+ await this.ensureDom();
617
+ const client = this.currentClient();
618
+ const v = (await client.evaluate(`window.__rpaDom.identifyRegion(${this.jsStr(selector)}, ${index}, ${this.jsStr(rulesJson)})`).catch(() => null));
619
+ return v && typeof v === 'object' ? v : null;
620
+ }
621
+ catch {
622
+ return null; // 旁路失败静默(不参与执行决策)
623
+ }
624
+ }
625
+ /** 路由键:hostname + pathname(忽略 query/hash——SPA query 变化不算跳转) */
626
+ routeKey(u) {
627
+ try {
628
+ const x = new URL(u);
629
+ return x.hostname + x.pathname;
630
+ }
631
+ catch {
632
+ return u;
633
+ }
634
+ }
635
+ /** URL 显示标签(host+path,截断) */
636
+ hostLabel(u) {
637
+ try {
638
+ const x = new URL(u);
639
+ return x.hostname + x.pathname.slice(0, 40);
640
+ }
641
+ catch {
642
+ return u.slice(0, 60);
643
+ }
267
644
  }
268
645
  async input(selector, value) {
269
646
  const human = this.human;
@@ -392,8 +769,23 @@ export class CdpPage {
392
769
  if (!tid)
393
770
  return;
394
771
  this.targetId = undefined;
772
+ // 审计修复(3.4):显式关闭 CDP 连接,不依赖 GC(WebSocket 防泄漏)
773
+ // 需在 human 置空前取 client(currentClient 走 human.sink)
774
+ let client;
775
+ try {
776
+ const h = this.human;
777
+ client = h?.sink?.client;
778
+ }
779
+ catch {
780
+ client = undefined;
781
+ }
395
782
  this.human = undefined;
396
- await closeTarget(tid, this.port).catch(() => undefined);
783
+ // 只关本次新建的标签;复用的标签保留(持久标签模式,避免建销模式)
784
+ if (this.openedThisRun) {
785
+ await closeTarget(tid, this.port).catch(() => undefined);
786
+ }
787
+ // 断开 WS(无论复用/新建都断开本 run 的连接;调试端口与页面不受影响)
788
+ await client?.close().catch(() => undefined);
397
789
  }
398
790
  }
399
791
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/cdp/page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/cdp/page.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Flow } from './schema.js';
2
+ import { type BehaviorEntry } from './behavior.js';
2
3
  export type { Flow } from './schema.js';
3
4
  /**
4
5
  * 执行器 —— 解释执行流程定义(移植自 Rust `executor.rs`,按 EXECUTION-SPEC M4 扩展)。
@@ -65,6 +66,15 @@ export interface PageOps {
65
66
  waitSelector(selector: string, timeoutMs: number): Promise<void>;
66
67
  waitMs(ms: number): Promise<void>;
67
68
  finalize(): Promise<void>;
69
+ /**
70
+ * P2 区域识别(可选):返回动作目标所在区域的语义描述(label/ancestry)。
71
+ * 无实现(mock/老驱动)→ 返回 null,行为档案 region 缺省。纯观察旁路,不参与执行决策。
72
+ */
73
+ identifyRegion?(selector: string, index: number, rulesJson: string): Promise<{
74
+ label?: string;
75
+ ruleId?: string;
76
+ ancestry?: string[];
77
+ } | null>;
68
78
  }
69
79
  /** 提取明细落盘(D-E2):save:true 的 extract 内容写入本地,由 storage 层实现(M5) */
70
80
  export interface ExtractSink {
@@ -120,6 +130,21 @@ export interface RunFlowOptions {
120
130
  runId?: string;
121
131
  /** D6 步骤事件回调(append-only 事件流;每步 done/failed 各一次,含失败类别) */
122
132
  onStepEvent?: (ev: StepEvent) => void;
133
+ /** 行为档案观察回调(记忆层:click/input 动作前后页面状态 → BehaviorEntry;旁路,不阻断执行) */
134
+ onBehavior?: (entry: BehaviorEntry) => void;
135
+ /**
136
+ * 增强层·预测性超时(docs/BEHAVIOR-SPACE-V2.md P0):
137
+ * 执行 click/input 步骤前,用行为档案历史耗时建议该步骤 verify 超时。
138
+ * 建议级(铁律1):返回 >0 才生效(档案数据不足返回 0 → 用默认);缺失返回 undefined → 不增强。
139
+ * 主流程不依赖此查询器(铁律2/3):不注入或返回 undefined 都走默认超时,不阻塞。
140
+ * 异步可(P1 后查 profile 走互斥锁)。
141
+ */
142
+ predictTimeout?: (stepId: string, actionType: string, defaultMs: number) => number | undefined | Promise<number | undefined>;
143
+ /**
144
+ * P2 区域识别规则(behavior.rules.json 的 regionRules 数组,app 层随流程包读取注入)。
145
+ * 引擎零业务逻辑:识别规则由流程包定义,引擎只执行匹配框架。空 → 不识别区域。
146
+ */
147
+ behaviorRules?: string;
123
148
  }
124
149
  /**
125
150
  * 执行整个流程(失败即中止)。等价 Rust `run_flow`(全 async)。