pageqa 0.7.0 → 0.8.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
@@ -72,7 +72,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
72
72
 
73
73
  ### 4. Jev 语义断言(可选增强)
74
74
 
75
- > **什么是 Jev?** Jev 是 TypeSafe AI 推出的 [System One 模型](https://docs.typesafe.ai),专为结构化决策设计。它不做文本生成,而是直接返回校准后的概率值(如匹配度 0.93)。适合替代原有的字符串包含匹配,做更精准的语义级断言。
75
+ > **什么是 Jev?** Jev 是 TypeSafe AI 推出的 [System One 模型](https://docs.typesafe.ai),专为结构化决策设计。它不做文本生成,而是直接返回校准后的概率值(如匹配度 0.93)。pageqa 用它做**字面匹配失败后的语义复核**,把「同义词 / 近义表达 / 格式差异」造成的误报 FAIL 纠正过来。
76
76
 
77
77
  **启用方式**:在 `~/.pageqa/config.json` 中添加 `jev` 字段,或设置环境变量:
78
78
 
@@ -109,7 +109,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
109
109
  1. 访问 [console.typesafe.ai/settings/keys](https://console.typesafe.ai/settings/keys)(需等待早期访问权限)
110
110
  2. 或通过 Vercel AI Gateway 获取
111
111
 
112
- **工作原理**:启用后,`assert_text` 工具会将页面快照文本发送给 Jev,由 Jev 判断页面内容是否语义匹配断言期望。相比原有的字符串 `includes` 匹配,Jev 能处理同义词、近义表达、大小写变体等情况,大幅降低误判。
112
+ **工作原理(按需调用)**:`assert_text` 先做字符串包含匹配——**字面命中即成立,不调用 Jev**(省掉一次远端往返,也避免把肉眼可见的文本判成不成立);只有**字面未命中**时才把页面快照文本发给 Jev 做一次语义复核,由 Jev 判断页面内容是否语义匹配断言期望(匹配概率 ≥ `threshold` 即成立)。所以 Jev 只用在真正需要它的地方:同义词、近义表达、格式差异导致的误报 FAIL。每条断言最多一次 Jev 调用,长流程不会被逐条断言拖慢。
113
113
 
114
114
  **降级机制**:若 Jev API 调用失败(网络/超时/鉴权错误),会自动回退到原有的字符串包含匹配,确保测试不因 Jev 服务中断而失败。
115
115
 
@@ -120,7 +120,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
120
120
  └─> pi-agent-core Agent(LLM → 可配置 OpenAI 兼容端点)
121
121
  └─> bsk 工具:navigate / snapshot / click / fill / hover / scroll / wait
122
122
  └─> 真实浏览器(bsk 连接)
123
- └─> assert_text ──→ Jev Noul API(可选,语义匹配)
123
+ └─> assert_text ──→ 字面命中即成立;未命中才问 Jev Noul API(可选,语义复核)
124
124
  └─> 结论与证据 → 报告(文本/JSON)+ 退出码
125
125
  ```
126
126
 
@@ -201,6 +201,27 @@ Token 消耗: 输入 446 / 输出 136 / 缓存读 6720 / 缓存写 0 / 合计 73
201
201
  - JSON 报告(`--json`)中为 `usage` 字段:`{ input, output, cacheRead, cacheWrite, reasoning, total, calls }`。
202
202
  - 若 LLM 端点未返回 usage(合计为 0),会在同一行标注「端点未返回 usage」,避免把 0 误读成真实消耗。
203
203
 
204
+ ### 快照瘦身与复用(省 token 与时间)
205
+
206
+ 长页面的一次快照几千至上万字符,而它在长流程里要被读几十次——既吃上下文,也吃推理时间。为此 pageqa 对快照做了两件事:
207
+
208
+ **1)瘦身**:只有原文超过 8000 字符才启用,规则保守且不改变定位:
209
+
210
+ - **带 `@eN` 的行永不截断、永不丢弃**(模型靠它点击,录制/回放的语义定位符也靠它解析 role/name);
211
+ - `@eN` 行的**祖先链永不丢弃**(祖先路径是同名元素消歧的依据,见「回放脚本」一节);
212
+ - 元信息行(`@vom`/`@view`/`@layers`/`L1 page`)保留;空行省略;
213
+ - 其余文本行:超过 160 字符才截断(保留开头);瘦身后仍超 20000 字符时,再从最长的非关键行开始整行省略,短文本(标题/标签/状态提示)优先保留;
214
+ - 结尾附一行说明(`[pageqa] 快照已瘦身:a → b 字符…`),让模型知道有些内容没看到,而不是以为页面就这么点内容。
215
+
216
+ 因此**模型看到的文本与定位解析用的文本是同一份**,role/name/祖先路径都不变;`--debug` 会打印每次瘦身的字符数变化。
217
+
218
+ **2)复用**:所有会改动页面的动作(`navigate`/`click`/`fill`/`upload`/`hover`/`scroll`/`wait`)都会让上一份快照失效,因此复用只发生在**纯读取之后**:
219
+
220
+ - 模型「刚 `snapshot` 完就 `assert_text`」→ 断言直接复用那份快照,省掉一次 bsk 往返(断言窗口 5s,`snapshot` 自身去重窗口 1s);注意断言的字面匹配用**瘦身前**的完整快照——瘦身只影响喂给模型的上下文,不影响断言所依据的页面全文;
221
+ - 回放中「上一步是断言、下一步要定位元素」同理;而重试前会 `wait`,等待必然置为失效,所以「每次重试重新取快照」的既有行为保持不变。
222
+
223
+ 页面自身异步更新带来的偏差,靠短窗口兜住:窗口外一律重新抓取。
224
+
204
225
  ### 脚本占位符(运行时变量)
205
226
 
206
227
  脚本里可以写 `${timestamp}` 之类的占位符,CLI 在读取脚本时按本机当前时间展开。同一次运行内所有占位符共用同一时刻,所以「名称 + 时间戳」这类用例既不会重名,也不必每次手工改时间戳:
@@ -250,7 +271,7 @@ pageqa --replay examples/smoke.replay.json --semantic # 断言改用 Jev 语
250
271
  - **其它失败**(元素找到了但操作报错、断言不成立)→ 记为失败并**继续跑完**,一次拿到整条用例的完整健康报告;报告指出「回放第 n 步(kind)/对应用例第 k 步:<用例原文>」。退出码仍为非零,失败不会被吞掉。
251
272
  - **navigate 失败** → 后续步骤没有意义,直接中止。
252
273
  - 想回到「一失败就停」的旧行为:加 `--fail-fast`。
253
- - **断言默认是字符串包含**:零模型回放不碰任何远端服务。若录制时启用了 Jev,模型可能给出语义化断言(如「检出成功」「标题包含 Example」),脚本会把这类断言标记为语义断言:回放**开始前**就提示脚本里有几条这类断言(字符串匹配可能误报),失败时再提示「可加 `--semantic` 重试」。
274
+ - **断言默认是字符串包含**:零模型回放不碰任何远端服务。录制时**靠 Jev 语义复核才成立**的断言(如「检出成功」「标题包含 Example」这类字面不出现在页面上的措辞)会逐条标记为语义断言:回放**开始前**就提示脚本里有几条这类断言(字面匹配必然不成立),失败时再提示「可加 `--semantic` 重试」。字面命中的断言不标记——回放用字符串匹配同样能通过。
254
275
  - **多场景**:一个脚本文件包含全部场景,逐个回放(各自独立 session 与浏览器窗口),任一场景失败则整体失败、退出码 `1`。
255
276
  - **源用例变更**:脚本记录源用例内容哈希,回放时若源文件已改动会在 stderr 提示(只警告、不失败),提示你重新生成脚本。
256
277
  - **PASS/FAIL 都会生成**:失败轨迹同样能导出,便于排查「模型这次到底做了什么」;但模型一步都没成功执行时脚本为空,回放会直接拒绝执行,不会伪装成「0 步全通过」。
@@ -283,7 +304,7 @@ pageqa --replay examples/smoke.replay.json --semantic # 断言改用 Jev 语
283
304
  ```
284
305
 
285
306
  - 覆盖的关键节点:脚本读取、LLM 就绪、bsk daemon 启动/就绪耗时、浏览器连接数、session、每一步工具调用(编号 + 名称 + 耗时 + 成败)、自动续跑、最终结论与总耗时。
286
- - 加 `--debug` 可看到更细的明细:每条 `bsk` 命令原文与耗时、快照字符数、上下文裁剪、Jev 请求详情。
307
+ - 加 `--debug` 可看到更细的明细:每条 `bsk` 命令原文与耗时、快照体积与瘦身统计、快照复用、上下文裁剪、Jev 请求详情。
287
308
  - 需要把日志与报告分开处理时:报告在 stdout(`--json` 也走 stdout),日志始终在 stderr,`pageqa --json … > report.json` 即可不受日志干扰。
288
309
 
289
310
  ### CLI 选项
@@ -355,7 +376,7 @@ pageqa examples/element-plus-upload.md
355
376
  可用工具(`src/bsk/tools.ts`):
356
377
 
357
378
  - `navigate(url)` 打开网页
358
- - `snapshot()` 读取页面 aria 树与可见文本(标题、段落、链接、按钮等)
379
+ - `snapshot()` 读取页面 aria 树与可见文本(标题、段落、链接、按钮等);返回前会做瘦身(见「快照瘦身与复用」),短期内无页面改动时直接复用上一份
359
380
  - `click(target)` / `fill(target, value)` / `hover(target)` 元素交互(target 用 `@eN` 引用或 CSS 选择器)
360
381
  - `upload(target, file)` 上传本地文件(target 为触发文件选择器的元素,省略则由 bsk 自动查找文件输入框)
361
382
  - `scroll(target)` / `wait(ms)` 滚动与等待
@@ -363,11 +384,13 @@ pageqa examples/element-plus-upload.md
363
384
 
364
385
  **长流程保护(自动续跑)**:一轮对话结束后,如果 agent 自报的进度没跑满(`步骤完成:k/n` 且 `k < n`),或者用例里写了断言但报告只解析到一部分,pageqa 会自动补一次「继续执行剩余步骤」的提示并继续跑,最多 5 轮;续跑后进度与断言数都没有推进就停止。这样可以避免模型做完一两步就自行收尾、却让报告看起来正常的情况。
365
386
 
387
+ 断言的准源是 `assert_text` 工具返回的结构化结果(期望值 + 成立/不成立 + 证据),而不是模型自述的措辞:模型常写成「…,断言成立。」,从文本反推既不可靠,也会把一条**全部通过**的用例报成「用例中的断言全部执行(实际 0/N)」的假失败。只有在拿不到工具结果时(回放、纯文本输入)才退回解析结论文本。
388
+
366
389
  ## 验证
367
390
 
368
391
  ```bash
369
392
  pnpm test # 端到端冒烟:需 bsk daemon 已连接浏览器 + LLM 端点可用
370
- pnpm run test:unit # 仅单元测试:不依赖浏览器与 LLM(报告解析 + 定位符/录制/回放脚本)
393
+ pnpm run test:unit # 仅单元测试:不依赖浏览器与 LLM(报告解析 + 定位符/录制/回放脚本 + 快照瘦身)
371
394
  ```
372
395
 
373
396
  冒烟测试覆盖:A1 打开+标题断言、A2 元素交互与断言、A3 失败可读原因与退出码、A4 文本/JSON 报告。需 bsk daemon 连接浏览器且 LLM 端点可用。
@@ -404,6 +427,7 @@ src/
404
427
  bsk/tools.ts browserskill 操作层与工具层(含 upload 文件上传、录制上报)
405
428
  record.ts 录制层(把成功操作与断言记成可回放步骤)
406
429
  locator.ts 语义定位符(快照解析 + 回放时按 role/name/序号重定位)
430
+ snapshot.ts 快照瘦身(保留可交互节点与祖先链,截断长文本;降低上下文压力)
407
431
  replay.ts 回放脚本(格式、读写校验 + 零模型回放引擎)
408
432
  report.ts 报告解析、渲染与套件汇总(LLM 运行与回放共用)
409
433
  examples/
@@ -412,5 +436,5 @@ examples/
412
436
  element-plus-upload.md 文件上传用例(点击 Click to upload 上传本地图片)
413
437
  plm-product-bom.md PLM 长流程用例(建产品→目录→物料→检出→待办同意→BOM 插入)
414
438
  tests/smoke.test.mjs 端到端验证
415
- tests/report.test.mjs / tests/replay.test.mjs 单元测试(无浏览器/LLM 依赖)
439
+ tests/report.test.mjs / tests/replay.test.mjs / tests/snapshot.test.mjs 单元测试(无浏览器/LLM 依赖)
416
440
  ```
package/dist/agent.d.ts CHANGED
@@ -28,7 +28,7 @@ interface Scenario {
28
28
  /**
29
29
  * 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
30
30
  * 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
31
- * 断言环节会使用 Jev 语义判断替代字符串包含匹配。
31
+ * 断言在**字面包含未命中**时会请 Jev 做一次语义复核(命中则不调用,省一次远端往返)。
32
32
  *
33
33
  * 无论用例通过、失败还是中途抛错,结束后都会关闭本次的 bsk session,
34
34
  * 从而关掉自动化操作的那个浏览器窗口(Agent Window)。
package/dist/agent.js CHANGED
@@ -38,6 +38,9 @@ const DEFAULT_SYSTEM_PROMPT = [
38
38
  "- 很多组件库(如 element-plus 的 el-dropdown)的下拉菜单是**悬停触发**的:必须先用 hover 悬停在触发按钮上、等菜单展开,再 click 菜单项。直接 click 触发按钮常常点不开菜单。",
39
39
  "- 判断菜单是否已展开:snapshot 里出现了对应的菜单项(如 menuitem「上传文档」)。若 click 触发按钮后 snapshot 里没有菜单项,改为 hover 再点,不要继续在同一个位置重复 click。",
40
40
  "- 页面上可能有多个同名下拉(例如页面级的「操作」与当前区域级的「操作」)。选错会展开完全不同的菜单,后续步骤连锁失败:请按当前操作的区域选择那一个,并在它展开后确认菜单项与用例要求一致。",
41
+ "- `@eN` 编号只在**最近一次 snapshot 的页面状态下**有效:展开/收起下拉菜单、切换路由、提交表单等任何页面变化都会重新编号。若在你上次 snapshot 之后页面又变化过,必须先重新 snapshot 再取用 `@eN`,不得沿用旧编号——沿用会点到编号相同的另一个元素,而且工具不会报错。",
42
+ "- 若快照里找不到目标元素(例如展开的下拉菜单把下方控件遮住了),不要凭编号猜:先重新 snapshot(必要时先收起菜单),等目标元素出现在快照里再操作。",
43
+ "- 声称某一步完成前必须有依据:快照或工具结果里能看到该操作的效果(选中态、填入值、成功提示)。看不到就说明没生效,要重新定位后重做,不要照抄用例描述交差。",
41
44
  "",
42
45
  "表单提交失败处理(关键,不得跳过):",
43
46
  "- 点击「提交 / 确定 / 保存 / 确认」类按钮后,必须先确认动作是否真的成功:弹窗是否关闭、是否出现成功提示、列表数据是否刷新。",
@@ -143,7 +146,7 @@ function trimOldToolResults(messages, keepRecent, maxChars) {
143
146
  /**
144
147
  * 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
145
148
  * 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
146
- * 断言环节会使用 Jev 语义判断替代字符串包含匹配。
149
+ * 断言在**字面包含未命中**时会请 Jev 做一次语义复核(命中则不调用,省一次远端往返)。
147
150
  *
148
151
  * 无论用例通过、失败还是中途抛错,结束后都会关闭本次的 bsk session,
149
152
  * 从而关掉自动化操作的那个浏览器窗口(Agent Window)。
@@ -186,14 +189,24 @@ async function initializeAgent(input, opts, holder) {
186
189
  log("[runAgent] Jev enabled=" + jevClient.enabled);
187
190
  info(`[pageqa] 语义断言(Jev)${jevClient.enabled ? "已启用" : "未启用"}`);
188
191
  // 录制器:始终收集本次运行的操作序列,是否落盘由 CLI 的 --emit-script 决定。
189
- // 记录是否启用了 Jev:语义录制的断言在回放的字符串匹配下可能误报,需要标记。
190
- const recorder = new Recorder(opts.vars ?? [], {
191
- semantic: jevClient.enabled,
192
- });
192
+ // 「哪条断言靠 Jev 语义复核才成立」由工具层逐条上报(见 bsk/tools.ts),
193
+ // 不再按「整场是否启用 Jev」一刀切——字面命中的断言回放同样能通过,不必标记。
194
+ const recorder = new Recorder(opts.vars ?? []);
195
+ // 断言结果由工具层逐条上报(见 bsk/tools.ts 的 onExec),报告不再依赖模型措辞。
196
+ const assertions = [];
193
197
  const tools = createBskTools({
194
198
  session,
195
199
  jevClient,
196
- onExec: (event) => recorder.noteTool(event),
200
+ onExec: (event) => {
201
+ recorder.noteTool(event);
202
+ if (event.assert) {
203
+ assertions.push({
204
+ expectation: event.assert.expectation,
205
+ verdict: event.assert.pass ? "pass" : "fail",
206
+ evidence: event.assert.evidence,
207
+ });
208
+ }
209
+ },
197
210
  });
198
211
  log("[runAgent] 工具数=" +
199
212
  tools.length +
@@ -225,7 +238,7 @@ async function initializeAgent(input, opts, holder) {
225
238
  },
226
239
  });
227
240
  subscribeProgress(agent, events, recorder);
228
- return { agent, events, numbered, steps, recorder, startedAt };
241
+ return { agent, events, numbered, steps, recorder, assertions, startedAt };
229
242
  }
230
243
  /**
231
244
  * 订阅 agent 事件,把工具调用与模型输出记入 events,并把进度回显到 stderr。
@@ -286,7 +299,12 @@ async function executeWithContinuations(session, input) {
286
299
  break;
287
300
  const transcriptSoFar = events.join("");
288
301
  const progress = parseProgress(transcriptSoFar);
289
- const parsed = parseAssertions(transcriptSoFar).length;
302
+ // 断言进度以工具结果为准(模型自述的措辞时好时坏,可能一条都解析不出来);
303
+ // 只有在拿不到工具结果时才退回按结论文本解析(与 buildReport 同一条规则,
304
+ // 不能用两者较大值——结论文本解析计数一高就会压过可靠的工具结果)。
305
+ const parsed = session.assertions.length > 0
306
+ ? session.assertions.length
307
+ : parseAssertions(transcriptSoFar).length;
290
308
  const incomplete = progress
291
309
  ? progress.done < progress.total
292
310
  : expectedAssertions > 0 && parsed < expectedAssertions;
@@ -333,7 +351,7 @@ function finalizeResult(session, input, opts) {
333
351
  if (agentError)
334
352
  events.push("\n[agent-error] " + agentError + "\n");
335
353
  const transcript = events.join("");
336
- const report = buildReport(input, transcript);
354
+ const report = buildReport(input, transcript, session.assertions);
337
355
  // 报告里标注回放脚本的落盘位置(真正写文件由 CLI 在运行结束后完成)
338
356
  if (opts.scriptPath)
339
357
  report.script = opts.scriptPath;
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ export interface BskOps {
16
16
  /** 最近一次快照文本(每次 snapshot / assert_text 都会刷新)。 */
17
17
  lastSnapshot(): string;
18
18
  navigate(url: string): string;
19
+ /** 读取页面快照(已瘦身);期间无页面改动且间隔很短时复用上一份,不重新抓取。 */
19
20
  snapshot(): string;
20
21
  click(target: string): string;
21
22
  fill(target: string, value: string): string;
@@ -23,8 +24,29 @@ export interface BskOps {
23
24
  hover(target: string): string;
24
25
  scroll(target: string): string;
25
26
  wait(ms: number): string;
26
- /** 断言页面是否包含期望文本;Jev 可用时走语义判断,否则字符串包含。 */
27
+ /**
28
+ * 断言页面是否包含期望文本:字面包含优先,字面未命中时(Jev 可用)才做语义复核。
29
+ */
27
30
  assertText(expectation: string): Promise<string>;
31
+ /** 最近一次 assertText 是否**靠 Jev 语义判断才成立**(供录制标记语义断言)。 */
32
+ lastAssertSemantic(): boolean;
33
+ /**
34
+ * 最近一次 assertText 的**结构化结果**(期望值、成立与否、证据)。
35
+ *
36
+ * 报告用它做断言的准源:工具返回的「成立/不成立」是确定性的,而模型自述的措辞
37
+ * 千变万化(「…,断言成立。」这类写法既没有期望值也没法可靠解析),据此解析
38
+ * 会造成「实际已全部通过却报 0/N」的假失败。
39
+ */
40
+ lastAssert(): AssertOutcome | null;
41
+ }
42
+ /** 一次 assert_text 的结构化结果。 */
43
+ export interface AssertOutcome {
44
+ /** 断言期望(模型传给 assert_text 的 expectation)。 */
45
+ expectation: string;
46
+ /** 是否成立。 */
47
+ pass: boolean;
48
+ /** 证据(页面里看到/没看到什么,或 Jev 语义匹配度)。 */
49
+ evidence: string;
28
50
  }
29
51
  export declare function createBskOps(session: string, jevClient?: JevClient): BskOps;
30
52
  /** 工具层上报的一次执行(供录制回放脚本)。 */
@@ -37,6 +59,10 @@ export interface BskToolExec {
37
59
  ok: boolean;
38
60
  /** 本次操作**之前**页面最后一次快照文本。 */
39
61
  lastSnapshot: string;
62
+ /** 断言是否靠 Jev 语义判断才成立(仅 assert_text 会上报该字段)。 */
63
+ semantic?: boolean;
64
+ /** 断言的结构化结果(仅 assert_text 成功时上报);报告据此判定,而非解析模型措辞。 */
65
+ assert?: AssertOutcome;
40
66
  }
41
67
  export interface BskToolOptions {
42
68
  session: string;
package/dist/bsk/tools.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { execFile, execFileSync, spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { debugLog, info, timer } from "../log.js";
4
+ import { slimSnapshot } from "../snapshot.js";
4
5
  /**
5
6
  * browserskill(`bsk`)工具层:把 bsk CLI 命令包装成 pi-agent-core 的 AgentTool。
6
7
  *
@@ -164,13 +165,89 @@ function paramsOf(properties, required = []) {
164
165
  required,
165
166
  };
166
167
  }
168
+ /**
169
+ * 连续重复抓取的去重窗口:模型(或回放)在没有任何改页面动作的情况下又要素一份快照时,
170
+ * 直接给上一份,省掉一次 bsk 往返。窗口给得短——它要覆盖的只是「刚看过又要素」这种重复。
171
+ */
172
+ const SNAPSHOT_DEDUP_MS = 1_000;
173
+ /**
174
+ * 断言可复用快照的窗口。
175
+ *
176
+ * 断言的「当下」比定位更敏感(页面可能已被异步更新),因此只在自上次快照以来
177
+ * 没有任何改页面动作、且间隔很短的条件下复用;窗口外的实情是「模型思考了足够久」,
178
+ * 此时宁可按原行为重新抓取。
179
+ */
180
+ const SNAPSHOT_ASSERT_MS = 5_000;
167
181
  export function createBskOps(session, jevClient) {
168
182
  const quiet = ["--session", session, "--quiet"];
169
183
  let snapshotText = "";
184
+ /** 同一份快照瘦身前的完整原文(assert_text 的字面匹配必须用它,见 ensureRawSnapshot)。 */
185
+ let snapshotRawText = "";
186
+ let assertSemantic = false;
187
+ let assertOutcome = null;
188
+ /** 最近一次快照的时刻与新鲜度(见 ensureSnapshot)。 */
189
+ let snapshotAt = 0;
190
+ let snapshotFresh = false;
191
+ /** 页面被本工具改动过(或刚刚等待过),之前的快照不再可信。 */
192
+ const markStale = () => {
193
+ snapshotFresh = false;
194
+ };
195
+ /** 真正抓一次快照:瘦身后交给模型,并按需记录瘦身统计。 */
196
+ const takeSnapshot = () => {
197
+ const raw = bsk(["snapshot", ...quiet]);
198
+ const slim = slimSnapshot(raw);
199
+ if (slim.applied) {
200
+ debugLog(`[bsk] snapshot 瘦身:${slim.before} -> ${slim.after} 字符` +
201
+ `(截断 ${slim.truncatedLines} 行、省略 ${slim.droppedLines} 行)`);
202
+ }
203
+ else {
204
+ // 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
205
+ debugLog("[bsk] snapshot 字符数=" + raw.length);
206
+ }
207
+ snapshotRawText = raw;
208
+ snapshotText = slim.text;
209
+ snapshotAt = Date.now();
210
+ snapshotFresh = true;
211
+ return snapshotText;
212
+ };
213
+ /**
214
+ * 取快照:自上次快照后页面**没有被本工具改动**、且间隔在 maxAgeMs 内时复用上一份。
215
+ *
216
+ * 所有会改动页面的操作(navigate/click/fill/upload/hover/scroll/wait)都会把快照置为
217
+ * 不新鲜,因此复用只可能发生在「纯读取之后」——最典型的是「刚 snapshot 完就断言」
218
+ * 或回放里「上一步是断言、下一步要定位」。页面自身异步更新导致的偏差由窗口兜住。
219
+ */
220
+ const ensureSnapshot = (maxAgeMs, label) => {
221
+ const age = Date.now() - snapshotAt;
222
+ if (snapshotFresh && age <= maxAgeMs) {
223
+ debugLog(`[bsk] ${label} 复用 ${age}ms 前的快照(期间页面未被改动)`);
224
+ return snapshotText;
225
+ }
226
+ return takeSnapshot();
227
+ };
228
+ /**
229
+ * 同 ensureSnapshot,但返回**瘦身前**的完整原文。
230
+ *
231
+ * 断言的字面匹配必须基于完整快照:瘦身会截断长文本行、整行省略非关键文本,
232
+ * 拿瘦身文本做 includes,针对长页面文本的断言会假未命中,且证据不会说明漏看。
233
+ * 模型上下文仍吃瘦身文本,省 token 的收益不受影响。
234
+ */
235
+ const ensureRawSnapshot = (maxAgeMs, label) => {
236
+ const age = Date.now() - snapshotAt;
237
+ if (snapshotFresh && age <= maxAgeMs) {
238
+ debugLog(`[bsk] ${label} 复用 ${age}ms 前的完整快照(期间页面未被改动)`);
239
+ return snapshotRawText;
240
+ }
241
+ takeSnapshot();
242
+ return snapshotRawText;
243
+ };
170
244
  return {
171
245
  session,
172
246
  lastSnapshot: () => snapshotText,
247
+ lastAssertSemantic: () => assertSemantic,
248
+ lastAssert: () => assertOutcome,
173
249
  navigate(url) {
250
+ markStale();
174
251
  const out = bsk([
175
252
  "navigate",
176
253
  url,
@@ -181,17 +258,15 @@ export function createBskOps(session, jevClient) {
181
258
  return `已导航到 ${url}\n${out}`;
182
259
  },
183
260
  snapshot() {
184
- const out = bsk(["snapshot", ...quiet]);
185
- snapshotText = out;
186
- // 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
187
- debugLog("[bsk] snapshot 字符数=" + out.length);
188
- return out;
261
+ return ensureSnapshot(SNAPSHOT_DEDUP_MS, "snapshot");
189
262
  },
190
263
  click(target) {
264
+ markStale();
191
265
  const out = bsk(["click", target, ...quiet]);
192
266
  return `已点击 ${target}\n${out}`;
193
267
  },
194
268
  fill(target, value) {
269
+ markStale();
195
270
  const out = bsk(["fill", target, "--value", value, ...quiet]);
196
271
  return `已在 ${target} 填入文本\n${out}`;
197
272
  },
@@ -199,6 +274,7 @@ export function createBskOps(session, jevClient) {
199
274
  if (!existsSync(file)) {
200
275
  throw new Error(`待上传文件不存在:${file}`);
201
276
  }
277
+ markStale();
202
278
  const args = ["upload"];
203
279
  if (target)
204
280
  args.push(target);
@@ -207,42 +283,66 @@ export function createBskOps(session, jevClient) {
207
283
  return `已上传文件 ${file}\n${out}`;
208
284
  },
209
285
  hover(target) {
286
+ markStale();
210
287
  const out = bsk(["hover", target, ...quiet]);
211
288
  return `已悬停 ${target}\n${out}`;
212
289
  },
213
290
  scroll(target) {
214
291
  // scroll-to 同时支持 @eN 引用与 CSS 选择器。
215
292
  // (早期实现用 evaluate + querySelector,遇到 @eN 会静默返回 element-not-found。)
293
+ markStale();
216
294
  const out = bsk(["scroll-to", target, ...quiet]);
217
295
  return `已滚动到 ${target}\n${out}`;
218
296
  },
219
297
  wait(ms) {
220
- // wait-ms 是 daemon 端 sleep,不接受 --session
298
+ // wait-ms 是 daemon 端 sleep,不接受 --session
299
+ // 等待本身就是为了让页面变化(异步渲染/动画/弹窗),因此必须置为不新鲜:
300
+ // 回放的「每步重试前重新取快照」正是靠它生效的。
301
+ markStale();
221
302
  bsk(["wait-ms", String(ms)]);
222
303
  return `已等待 ${ms}ms`;
223
304
  },
224
305
  async assertText(expectation) {
225
- const snap = bsk(["snapshot", ...quiet]);
226
- snapshotText = snap;
227
- const evidence = (verdict, why) => `断言「${expectation}」:${verdict}。${why}`;
306
+ // 断言要的是「当下」+「完整」:只有在期间没有任何改页面动作、且间隔很短时才复用,
307
+ // 并且字面匹配基于瘦身前的完整快照(ensureRawSnapshot 里有原因说明)。
308
+ const snap = ensureRawSnapshot(SNAPSHOT_ASSERT_MS, "assert_text");
309
+ // 本次断言是否「靠语义判断才成立」,每次调用先重置:
310
+ // 只有字面未命中、由 Jev 复核判定成立的断言才为 true。
311
+ assertSemantic = false;
312
+ // 字面包含匹配即默认路径,也是 Jev 不可用时的回退;
313
+ // 结论与证据同时写进 assertOutcome,供报告直接取用(不依赖模型自述措辞)。
314
+ const literalHit = snap.includes(expectation);
315
+ const verdict = (pass, why) => {
316
+ assertOutcome = { expectation, pass, evidence: why };
317
+ return `断言「${expectation}」:${pass ? "成立" : "不成立"}。${why}`;
318
+ };
319
+ const literalWhy = literalHit
320
+ ? `页面中包含「${expectation}」`
321
+ : `页面中未找到「${expectation}」`;
228
322
  // 防御:快照为空或明显不是已加载页面 → 断言不成立。
229
323
  // 浏览器页面还没打开时,bsk 返回的是空串/about:blank/错误信息,
230
324
  // 此时不应信任 Jev 或直接判定「成立」(空页面不可能包含断言文本)。
231
325
  const snapLen = snap.trim().length;
232
326
  const SNAP_MIN_LEN = 30;
233
327
  if (snapLen < SNAP_MIN_LEN) {
234
- return evidence("不成立", `证据:页面快照为空或过短(${snapLen} 字符),页面可能尚未打开或未导航`);
328
+ return verdict(false, `证据:页面快照为空或过短(${snapLen} 字符),页面可能尚未打开或未导航`);
235
329
  }
236
- // Jev 客户端可用时,使用语义判断替代字符串包含匹配
330
+ // 1) 字面包含命中即成立:这是默认路径,也是绝大多数断言的真实情况。
331
+ // 命中时不再调用 Jev —— 省掉一次远端往返(超时上限 15s),
332
+ // 也避免引入「肉眼可见的文本被判成不成立」这类新的失败来源。
333
+ if (literalHit)
334
+ return verdict(true, literalWhy);
335
+ // 2) 字面未命中才请 Jev 复核:这正是语义判断有价值的场景
336
+ // (同义词/近义表达/格式差异导致的误报 FAIL)。
237
337
  if (jevClient?.enabled) {
238
338
  try {
239
339
  const prob = await jevClient.assertText(snap, expectation);
240
340
  const pass = prob >= jevClient.threshold;
241
- const verdict = pass ? "成立" : "不成立";
242
- const why = pass
243
- ? `语义匹配度 ${(prob * 100).toFixed(1)}%,超过阈值 ${(jevClient.threshold * 100).toFixed(0)}%`
244
- : `语义匹配度 ${(prob * 100).toFixed(1)}%,未达到阈值 ${(jevClient.threshold * 100).toFixed(0)}%`;
245
- return evidence(verdict, why);
341
+ // 靠语义复核才成立的断言,回放时字符串匹配必然不成立,需要标记
342
+ assertSemantic = pass;
343
+ const pct = (prob * 100).toFixed(1);
344
+ const threshold = (jevClient.threshold * 100).toFixed(0);
345
+ return verdict(pass, `字面未命中,语义匹配度 ${pct}%,${pass ? "超过" : "未达到"}阈值 ${threshold}%`);
246
346
  }
247
347
  catch (err) {
248
348
  // Jev 调用失败:回退到原有的字符串包含逻辑。
@@ -250,19 +350,14 @@ export function createBskOps(session, jevClient) {
250
350
  // 却无法从 --debug 日志判断到底是哪一类故障。
251
351
  debugLog("[bsk] Jev 断言失败,回退到字符串匹配:" +
252
352
  (err instanceof Error ? err.message : String(err)));
253
- return stringAssert(snap, expectation) + "(Jev 不可用,已回退)";
353
+ return verdict(literalHit, `${literalWhy}(Jev 不可用,已回退)`);
254
354
  }
255
355
  }
256
356
  // 默认:字符串包含匹配
257
- return stringAssert(snap, expectation);
357
+ return verdict(false, literalWhy);
258
358
  },
259
359
  };
260
360
  }
261
- /** 字符串包含匹配(默认断言路径,也是 Jev 不可用时的回退)。 */
262
- function stringAssert(snapshotText, expectation) {
263
- const hit = snapshotText.includes(expectation);
264
- return `断言「${expectation}」:${hit ? "成立" : "不成立"}。${hit ? `页面中包含「${expectation}」` : `页面中未找到「${expectation}」`}`;
265
- }
266
361
  /** 构造一组浏览器操作工具,供 page-test agent 调用。 */
267
362
  export function createBskTools(opts) {
268
363
  const ops = createBskOps(opts.session, opts.jevClient);
@@ -274,7 +369,21 @@ export function createBskTools(opts) {
274
369
  const before = ops.lastSnapshot();
275
370
  try {
276
371
  const text = await fn();
277
- opts.onExec?.({ name, params, ok: true, lastSnapshot: before });
372
+ const assertion = name === "assert_text" ? ops.lastAssert() : null;
373
+ opts.onExec?.({
374
+ name,
375
+ params,
376
+ ok: true,
377
+ lastSnapshot: before,
378
+ // 逐条上报「这条断言是否靠语义判断才成立」:录制层据此精确标记,
379
+ // 而不是按「整场是否启用 Jev」一刀切(字面命中的断言回放同样能通过)。
380
+ ...(name === "assert_text"
381
+ ? { semantic: ops.lastAssertSemantic() }
382
+ : {}),
383
+ // 结构化断言结果(期望值 + 成立与否 + 证据):报告直接取用,
384
+ // 不再从模型自述里反推(见 report.ts 的 buildReport)。
385
+ ...(assertion ? { assert: assertion } : {}),
386
+ });
278
387
  return ok(text);
279
388
  }
280
389
  catch (err) {