agentpage 0.0.56 → 1.0.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
@@ -80,11 +80,12 @@ npm install agentpage
80
80
  - **Prompt + Tools + 路由三层解耦**:可以快速把"可执行 AI 能力"植入现有前端系统,按路由渐进式接入,支持"项目级工具 + 路由级工具"组合。
81
81
  - **增量任务消费协议(REMAINING)**:任务不是一次性执行,而是逐轮消费收敛。每轮只做当前快照可执行的动作,通过 `REMAINING` 协议跟踪进度,支持协议修复和启发式回退,确保复杂多步任务稳定收敛。
82
82
  - **原始目标锚定(Original Goal Anchor)**:Round 1+ 每轮消息注入用户原始输入作为任务对照组,防止模型在多步执行过程中偏航(如把“去 X 仓库创建 issue”误解为“创建 X 仓库”)。
83
- - **12 层保护机制**:冗余拦截、快照防抖、元素恢复、Not-found 重试对话流、导航刷新、空转检测、重复批次防自转、协议修复、快照指纹变化检测、无效点击拦截与循环检测、附近可点击元素推荐、原始目标锚定 —— 目标是**稳定收敛**,而不是偶然成功。
83
+ - **14 层保护机制**:元素恢复、Not-found 重试对话流、导航刷新、空转检测、重复批次防自转、协议修复、轮次稳定等待、快照指纹变化检测、快照变化摘要(Snapshot Diff)、无效点击拦截与循环检测、附近可点击元素推荐、原始目标锚定、断言验证(三阶段快照 + 死循环防护)、停机原因可观测(stopReason) —— 目标是**稳定收敛**,而不是偶然成功。
84
84
  - **Playwright 级别交互语义**:完整 pointer/mouse 事件链、4 种 scrollIntoView 策略轮换、actionability 五重检查(可见/稳定/可用/可编辑/遮挡)、智能重定向 retarget、隐藏控件代理点击(ElementPlus/AntD)、`select_option` value/label/index 三策略。
85
85
  - **运行时事件信号追踪**:通过 `EventTarget.prototype` 补丁全局追踪事件绑定,快照中输出 `listeners="clk,inp,chg"` 信号,帮助 AI 精准识别真实可交互元素,而非猜测。
86
86
  - **效果验证机制(Effect Check)**:每轮行动前自动检查上轮操作是否在当前快照中生效,未生效则尝试邻近元素,避免重复点击无效目标。
87
- - **结构化可观测指标**:每次 chat 输出 `AgentLoopMetrics`(轮次、成功率、恢复次数、快照体积、Token 消耗),可直接接入监控系统。
87
+ - **AI 驱动的任务断言(Assertion)**:执行 AI 主动调用 `assert` 触发独立断言 AI 判定任务完成。三阶段快照设计(初始/动作后/当前)覆盖创建、跳转、状态变更等全场景;断言死循环防护确保不会无限重试。
88
+ - **结构化可观测指标**:每次 chat 输出 `AgentLoopMetrics`(轮次、成功率、恢复次数、快照体积、Token 消耗、停机原因 `stopReason`),可直接接入监控系统。
88
89
  - **core/web 分层架构**:`core` 零 DOM 依赖,可在 Worker/Extension/Node 复用;`web` 封装浏览器能力。
89
90
 
90
91
  ## 企业落地实践
@@ -225,7 +226,6 @@ Round 3: 执行 C → REMAINING: DONE
225
226
 
226
227
  | 机制 | 触发条件 | 效果 |
227
228
  | --- | --- | --- |
228
- | 冗余 page_info 拦截 | AI 调用 `page_info.*` | 直接返回拦截结果,避免 Token 浪费 |
229
229
  | 元素未找到恢复 | `dom` 操作命中失败 | 等待 100ms → 刷新快照 → 返回恢复标记 |
230
230
  | Not-found 重试对话流 | 本轮存在未找到元素 | 注入失败上下文 + `attempt x/y`,最多 2 轮 |
231
231
  | 导航后上下文刷新 | `navigate` 成功 | 重置 RefStore + 刷新快照 |
@@ -234,16 +234,88 @@ Round 3: 执行 C → REMAINING: DONE
234
234
  | 协议修复回合 | remaining 未完成却无工具调用 | 注入强约束提示 |
235
235
  | 轮次稳定等待 | 本轮有 DOM 变化动作 | loading hidden + DOM quiet(200ms/4s) |
236
236
  | 快照指纹变化检测 | 本轮有 DOM 变更动作且行动后指纹不变 | 注入 `Snapshot unchanged` 提示,强制模型换目标 |
237
+ | 快照变化摘要 | Round 1+ 且前后快照 diff 非空 | 在快照前注入 `## Snapshot Changes` 变化行摘要,让 AI 直接看到什么变了 |
237
238
  | 无效点击拦截与循环检测 | 快照未变时记录无效 click;近 4 轮在 ≤2 个目标间循环 | 拦截重复无效点击;循环检测后将所有循环目标加入拦截集 |
238
239
  | 附近可点击元素推荐 | 点击被拦截或证实无效 | 从快照中查找目标附近 15 行内有点击信号的元素,按距离推荐 |
239
240
  | 原始目标锚定 | Round 1+ 每轮 | 注入用户原始任务作为对照组,防止多步执行中偏航 |
241
+ | 断言验证(Assertion) | AI 主动调用 `assert({})` 工具 | 独立 AI 判定任务完成(三阶段快照对比);全通过则停机,未通过注入进度继续循环 |
242
+ | 断言死循环防护 | 连续 2 轮仅调 assert(无其他工具)且都失败 | 自动停机 `stopReason = "assertion_loop"`,避免无限重试 |
243
+ | 停机原因可观测 | 每次停机时 | `metrics.stopReason` 输出枚举值(`converged` / `assertion_passed` / `assertion_loop` / `repeated_batch` / `idle_loop` / `no_protocol` / `max_rounds` 等) |
240
244
 
241
- ### 5. 停机条件
245
+ ### 5. 停机条件与 stopReason
242
246
 
243
- - 模型返回 `REMAINING: DONE` 并输出总结
244
- - 无工具调用且 remaining 已收敛
245
- - 重复批次防自转 / 协议修复后仍无推进
246
- - 达到 `maxRounds` 上限
247
+ 每次停机时,`metrics.stopReason` 会输出精确的停机原因枚举值:
248
+
249
+ | stopReason | 停机场景 |
250
+ | --- | --- |
251
+ | `converged` | 模型返回 `REMAINING: DONE` 或 remaining 收敛为空 |
252
+ | `assertion_passed` | AI 调用 `assert` 工具且所有任务断言均通过 |
253
+ | `assertion_loop` | 连续 2 轮仅调 assert 且都失败(断言死循环防护) |
254
+ | `repeated_batch` | 连续相同工具调用批次 ≥ 3 轮(防自转) |
255
+ | `idle_loop` | 连续只读轮次触发空转检测 |
256
+ | `no_protocol` | 连续多轮有工具调用但无 REMAINING 协议且无有效推进 |
257
+ | `protocol_fix_failed` | 协议修复轮失败(无工具调用 + remaining 未收敛) |
258
+ | `max_rounds` | 达到 maxRounds 上限 |
259
+ | `dry_run` | dry-run 模式,仅展示不执行 |
260
+
261
+ ### 6. 断言能力(Assertion)
262
+
263
+ `assert` 是内置工具,AI 认为任务完成时主动调用 `assert({})` 触发验证:
264
+
265
+ ```
266
+ AI 执行动作 → 认为完成 → 调用 assert({})
267
+
268
+ 拍取动作后快照(捕获瞬态反馈)
269
+
270
+ 等待页面稳定 → 清除 hover → 刷新快照
271
+
272
+ 独立断言 AI(专用 Prompt,无 tools)基于三阶段快照判定
273
+
274
+ 全部通过 → stopReason: "assertion_passed"
275
+ 部分失败 → 注入 Assertion Progress → 继续循环
276
+ ```
277
+
278
+ #### 三阶段快照设计
279
+
280
+ 断言 AI 同时接收三份快照,覆盖不同阶段的页面状态:
281
+
282
+ | 快照 | 拍取时机 | 用途 |
283
+ | --- | --- | --- |
284
+ | **Initial** | 任务开始前 | 基线对比:判断创建/修改/删除等长任务是否完成 |
285
+ | **Post-Action** | 工具执行完成后、稳定等待前 | 捕获瞬态反馈:成功提示、确认弹窗等跳转后消失的信息 |
286
+ | **Current** | 稳定等待 + hover 清除后 | 最终状态:确认页面实际结果 |
287
+
288
+ 这个设计解决了真实 B 端场景中的关键问题:
289
+
290
+ - **创建类任务**:Initial 快照显示 2 个实例,Current 显示 3 个 → 断言 AI 通过 before/after 对比判定创建成功
291
+ - **提交后跳转**:点击“确认开通”后出现成功提示,然后自动跳转回列表页 → Post-Action 捕获到“实例已提交开通”,即使 Current 已是列表页也能判定通过
292
+ - **状态变更**:Current 快照直接看到开关状态、勾选状态、评分等 UI 变化
293
+ - **无跳转场景**:Post-Action 与 Current 相同时自动去重,不浪费 token
294
+
295
+ #### 断言死循环防护
296
+
297
+ 连续 2 轮执行 AI 仅调用 `assert`(无其他工具)且都失败时,自动停机 `stopReason = "assertion_loop"`,避免无限重试。
298
+
299
+ #### 默认行为
300
+
301
+ 无自定义断言时,以用户原始消息作为整体断言依据。
302
+
303
+ #### 自定义断言
304
+
305
+ ```ts
306
+ const result = await agent.chat("关闭开关,满意度五星,标签选灰度", {
307
+ assertionConfig: {
308
+ taskAssertions: [
309
+ { task: "关闭开关", description: "开关组件不应有 is-checked class" },
310
+ { task: "满意度五星", description: "满意度 slider 的 5 个 star 均应有 is-active class" },
311
+ { task: "标签选灰度", description: "灰度 checkbox 应有 checked 状态" },
312
+ ],
313
+ },
314
+ });
315
+
316
+ console.log(result.assertionResult);
317
+ // { allPassed: true, total: 3, passed: 3, failed: 0, details: [...] }
318
+ ```
247
319
 
248
320
  ---
249
321
 
@@ -321,7 +393,7 @@ Round 3: 执行 C → REMAINING: DONE
321
393
 
322
394
  ## 内置工具
323
395
 
324
- 5 个内置工具通过 `agent.registerTools()` 一次注册。
396
+ 6 个内置工具通过 `agent.registerTools()` 一次注册。
325
397
 
326
398
  ### dom — DOM 交互
327
399
 
@@ -370,12 +442,24 @@ Round 3: 执行 C → REMAINING: DONE
370
442
 
371
443
  `get_url` / `get_title` / `get_selection` / `get_viewport` / `snapshot` / `query_all`
372
444
 
373
- > Agent Loop 中 `page_info` 大多被拦截为冗余,框架每轮自动提供最新快照。
445
+ > `page_info.snapshot` 是框架内部动作;快照每轮自动刷新并注入给模型,模型无需主动调用。
374
446
 
375
447
  ### evaluate — JS 执行
376
448
 
377
449
  执行页面上下文 JavaScript 表达式或语句块。兜底工具,适用于其他工具无法覆盖的场景。
378
450
 
451
+ ### assert — 任务断言
452
+
453
+ AI 认为任务完成时主动调用 `assert({})`,框架发起独立 AI 判定(专用 Prompt、无 tools、不继承 system prompt),基于三阶段快照对比验证任务是否真正完成。
454
+
455
+ - **三阶段快照**:初始快照(before)+ 动作后快照(捕获瞬态成功提示)+ 当前快照(最终状态)
456
+ - **默认行为**:无自定义断言时,以用户原始消息作为整体断言依据
457
+ - **自定义断言**:通过 `ChatOptions.assertionConfig.taskAssertions` 传入细粒度子任务断言
458
+ - **断言全通过**:`stopReason = "assertion_passed"`,循环终止
459
+ - **部分失败**:失败原因注入下一轮 `## Assertion Progress` 区块,AI 聚焦修复后再次触发断言
460
+ - **死循环防护**:连续 2 轮仅调 assert 且都失败时自动停机
461
+ - **hover 清除**:断言前自动派发 `pointerleave`/`mouseleave` 清除瞬态视觉状态,确保快照反映持久状态
462
+
379
463
  ---
380
464
 
381
465
  ## 自定义 Prompt
@@ -426,7 +510,7 @@ agent.registerTool({
426
510
 
427
511
  工具管理:`registerTool()` / `removeTool()` / `hasTool()` / `getToolNames()` / `clearCustomTools()` / `getTools()`
428
512
 
429
- 内置工具(`dom/navigate/page_info/wait/evaluate`)受保护,不允许删除。
513
+ 内置工具(`dom/navigate/page_info/wait/evaluate/assert`)受保护,不允许删除。
430
514
 
431
515
  ---
432
516
 
@@ -483,6 +567,7 @@ agent.callbacks = {
483
567
  | `redundantInterceptCount` | 冗余拦截次数 |
484
568
  | `snapshotReadCount` / `latestSnapshotSize` / `avgSnapshotSize` / `maxSnapshotSize` | 快照统计 |
485
569
  | `inputTokens` / `outputTokens` | Token 消耗 |
570
+ | `stopReason` | 停机原因枚举(`converged` / `assertion_passed` / `assertion_loop` / `repeated_batch` / `idle_loop` / `no_protocol` / `protocol_fix_failed` / `max_rounds` / `dry_run`) |
486
571
 
487
572
  ### AgentLoopResult
488
573
 
@@ -492,6 +577,7 @@ agent.callbacks = {
492
577
  | `toolCalls` | `Array<{ name, input, result }>` | 完整工具调用轨迹 |
493
578
  | `messages` | `AIMessage[]` | 完整对话消息(可用于 memory) |
494
579
  | `metrics` | `AgentLoopMetrics` | 运行指标 |
580
+ | `assertionResult` | `AssertionResult` | 断言结果(仅在 AI 触发 assert 时存在) |
495
581
 
496
582
  ---
497
583
 
@@ -527,11 +613,25 @@ src/
527
613
  │ ├── system-prompt.ts # 系统提示词构建
528
614
  │ ├── tool-registry.ts # 工具注册表
529
615
  │ ├── tool-params.ts # 参数辅助
616
+ │ ├── snapshot.ts # 快照聚合出口(兼容)
617
+ │ ├── snapshot-engine.ts # 兼容转发层(-> agent-loop/snapshot/engine)
618
+ │ ├── messaging.ts # 消息桥接实现
619
+ │ ├── event-listener-tracker.ts # 事件追踪实现
530
620
  │ ├── agent-loop/ # Agent 循环
531
621
  │ │ ├── index.ts # 主流程编排
532
622
  │ │ ├── messages.ts # 紧凑消息构建
533
- │ │ ├── snapshot.ts # 快照读取/包裹/去重
534
- │ │ ├── recovery.ts # 恢复与拦截
623
+ │ │ ├── snapshot.ts # 兼容转发层(-> snapshot/lifecycle)
624
+ │ │ ├── snapshot/ # 快照子模块
625
+ │ │ │ ├── index.ts
626
+ │ │ │ ├── lifecycle.ts # 快照读取/包裹/去重
627
+ │ │ │ └── engine.ts # DOM 快照序列化引擎
628
+ │ │ ├── recovery.ts # 兼容转发层(-> recovery/index)
629
+ │ │ ├── recovery/ # 恢复与拦截子模块
630
+ │ │ │ └── index.ts
631
+ │ │ ├── assertion/ # 断言子模块
632
+ │ │ │ ├── types.ts # 断言类型定义
633
+ │ │ │ ├── prompt.ts # 断言专用 Prompt
634
+ │ │ │ └── index.ts # 断言引擎
535
635
  │ │ ├── helpers.ts # 纯函数工具
536
636
  │ │ ├── constants.ts # 默认常量
537
637
  │ │ ├── types.ts # 循环类型
@@ -549,8 +649,10 @@ src/
549
649
  └── web/ # 浏览器实现
550
650
  ├── index.ts # WebAgent 入口
551
651
  ├── ref-store.ts # #hashID → Element 映射
552
- ├── event-listener-tracker.ts # 全局事件追踪
553
- ├── messaging.ts # Extension 消息桥
652
+ ├── event-listener-tracker.ts # 兼容转发层(-> core)
653
+ ├── messaging.ts # 兼容转发层(-> core)
654
+ ├── snapshot.ts # 兼容转发层(-> core)
655
+ ├── snapshot-engine.ts # 兼容转发层(-> core)
554
656
  ├── ui/ # 内置 UI 面板
555
657
  └── tools/ # 工具实现
556
658
  ├── dom-tool.ts
package/dist/index.d.mts CHANGED
@@ -61,7 +61,81 @@ type AIClient = {
61
61
  }): Promise<AIChatResponse>;
62
62
  };
63
63
  //#endregion
64
+ //#region src/core/agent-loop/assertion/types.d.ts
65
+ /**
66
+ * 断言系统类型定义。
67
+ *
68
+ * 断言是 AI 驱动的任务完成验证机制:
69
+ * - 执行 AI(主循环)主动调用 assert 工具触发断言
70
+ * - 断言 AI(独立调用,专用 prompt,不带 tools)判定任务是否完成
71
+ * - 判定依据:当前快照 + 已执行操作 + 断言描述
72
+ *
73
+ * 两层断言:
74
+ * 1. 任务断言(TaskAssertion):针对单个子任务的完成条件描述
75
+ * 2. 总断言:所有任务断言都通过 = 整体任务完成
76
+ *
77
+ * 触发时机:
78
+ * - AI 通过 assert 工具主动触发(可与其他工具调用一起返回)
79
+ * - 若 assert 与其他工具一起返回,先执行其他工具、等待稳定后再发起断言
80
+ *
81
+ * Design: AI-driven assertion — the execution AI actively calls assert tool,
82
+ * which triggers an independent AI judge (dedicated prompt, no tools) to verify
83
+ * task completion based on snapshot + actions + assertion descriptions.
84
+ */
85
+ /**
86
+ * 单条任务断言 —— 描述一个子任务的完成条件。
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * { task: "满意度选五星", description: "满意度评分组件应显示 5 个激活状态的星星(is-active)" }
91
+ * { task: "填写用户名", description: "用户名输入框的值应为 'admin'" }
92
+ * ```
93
+ */
94
+ type TaskAssertion = {
95
+ /** 子任务名称(对应用户指令中的某个步骤) */task: string; /** 完成条件的自然语言描述(发给断言 AI 判定) */
96
+ description: string;
97
+ };
98
+ /**
99
+ * 断言配置 —— 传入 chat() 或 executeAgentLoop() 的断言参数。
100
+ */
101
+ type AssertionConfig = {
102
+ /** 任务断言列表(每个子任务的完成条件) */taskAssertions: TaskAssertion[];
103
+ };
104
+ /**
105
+ * 单条任务断言的判定结果。
106
+ */
107
+ type TaskAssertionResult = {
108
+ /** 对应的任务名称 */task: string; /** 是否通过 */
109
+ passed: boolean; /** 断言 AI 的判定理由 */
110
+ reason: string;
111
+ };
112
+ /**
113
+ * 一次断言评估的完整结果。
114
+ */
115
+ type AssertionResult = {
116
+ /** 是否所有任务断言都通过(总断言) */allPassed: boolean; /** 任务断言总数 */
117
+ total: number; /** 通过数 */
118
+ passed: number; /** 失败数 */
119
+ failed: number; /** 每条任务断言的详细结果 */
120
+ details: TaskAssertionResult[];
121
+ };
122
+ //#endregion
64
123
  //#region src/core/agent-loop/types.d.ts
124
+ /**
125
+ * 停机原因枚举 — 标识 Agent Loop 因何原因结束。
126
+ *
127
+ * - `converged`:任务完成(REMAINING: DONE 或 remaining 收敛为空)
128
+ * - `assertion_passed`:所有任务断言均通过(AI 驱动的任务完成验证)
129
+ * - `assertion_loop`:连续断言失败且执行 AI 仅调 assert 无其他动作(断言死循环)
130
+ * - `repeated_batch`:连续相同工具调用批次 ≥ 3 轮(防自转)
131
+ * - `idle_loop`:连续只读轮次触发空转检测
132
+ * - `no_protocol`:连续多轮有工具调用但无 REMAINING 协议且无有效推进
133
+ * - `protocol_fix_failed`:协议修复轮失败(无工具调用 + remaining 未收敛)
134
+ * - `stale_remaining`:remaining 连续多轮不推进且无确认性进展(滞止收敛)
135
+ * - `max_rounds`:达到最大轮次上限
136
+ * - `dry_run`:dry-run 模式,仅展示不执行
137
+ */
138
+ type StopReason = "converged" | "assertion_passed" | "assertion_loop" | "repeated_batch" | "idle_loop" | "no_protocol" | "protocol_fix_failed" | "stale_remaining" | "max_rounds" | "dry_run";
65
139
  /** 轮次后稳定等待配置(加载态 + DOM 静默) */
66
140
  type RoundStabilityWaitOptions = {
67
141
  /** 是否启用轮次后稳定等待(默认 true) */enabled?: boolean; /** 双重等待总超时(毫秒,默认 4000) */
@@ -82,7 +156,8 @@ type AgentLoopMetrics = {
82
156
  avgSnapshotSize: number;
83
157
  maxSnapshotSize: number;
84
158
  inputTokens: number;
85
- outputTokens: number;
159
+ outputTokens: number; /** 停机原因(标识 Agent Loop 因何原因结束) */
160
+ stopReason: StopReason;
86
161
  };
87
162
  /** 工具调用事件回调 — 用于 UI 层实时展示 Agent 进度 */
88
163
  type AgentLoopCallbacks = {
@@ -98,7 +173,14 @@ type AgentLoopCallbacks = {
98
173
  *
99
174
  * @param newUrl 当前页面 URL(URL 变化时传入;元素定位失败时为 undefined)
100
175
  */
101
- onBeforeRecoverySnapshot?: (newUrl?: string) => void; /** 一次 chat 结束后输出结构化运行指标 */
176
+ onBeforeRecoverySnapshot?: (newUrl?: string) => void;
177
+ /**
178
+ * 断言快照刷新前触发。
179
+ *
180
+ * 用于清除页面瞬态视觉状态(如 hover、focus 高亮),
181
+ * 确保断言 AI 看到的快照反映真实持久状态而非鼠标悬停态。
182
+ */
183
+ onBeforeAssertionSnapshot?: () => void | Promise<void>; /** 一次 chat 结束后输出结构化运行指标 */
102
184
  onMetrics?: (metrics: AgentLoopMetrics) => void;
103
185
  };
104
186
  type AgentLoopResult = {
@@ -110,76 +192,18 @@ type AgentLoopResult = {
110
192
  }>; /** 本轮完整对话消息(含历史 + 本轮,用于多轮记忆累积) */
111
193
  messages: AIMessage[]; /** 本次运行统计指标 */
112
194
  metrics: AgentLoopMetrics;
113
- };
114
- //#endregion
115
- //#region src/web/ref-store.d.ts
116
- /**
117
- * RefStore — 快照 hash ID 与 DOM 元素的映射表。
118
- *
119
- * 快照生成时,根据元素的 DOM 路径 + 页面 URL 生成确定性 hash ID,
120
- * 同时保存 ID → Element 的映射。AI 使用 hash ID 作为 selector 定位元素,
121
- * 免去超长 XPath 路径,大幅减少 token 消耗。
122
- *
123
- * 优势:
124
- * - **确定性**:同一元素无论快照顺序,始终得到相同 ID
125
- * - **并发安全**:多次快照不会产生 ID 冲突
126
- * - **跨页面隔离**:URL hash 作为命名空间,不同页面元素 ID 互不碰撞
127
- *
128
- * 生命周期:每次 WebAgent.chat() 调用时创建,对话结束后清空。
129
- *
130
- * 使用方:
131
- * page-info-tool.ts — generateSnapshot() 写入映射
132
- * dom-tool.ts — queryElement() 读取映射
133
- * index.ts — WebAgent 持有实例,管理生命周期
134
- */
135
- /**
136
- * hash ID → DOM 元素的映射存储。
137
- *
138
- * - `set(el, path)` 由快照生成时调用,返回确定性 hash ID
139
- * - `get(id)` 由 dom-tool 查询时调用,根据 hash ID 取回元素
140
- * - `has(id)` 检查 ID 是否存在(用于 selector 类型判断)
141
- * - `clear()` 每次对话结束后清空
142
- */
143
- declare class RefStore {
144
- private map;
145
- /** 页面 URL 的 hash 前缀,用于跨页面命名空间隔离 */
146
- private urlKey;
147
- /**
148
- * @param url 当前页面 URL(可选)。传入后作为 hash 命名空间,
149
- * 使不同页面的相同 DOM 路径产生不同 ID。
150
- */
151
- constructor(url?: string);
152
- /**
153
- * 注册一个元素,返回确定性 hash ID。
154
- * 相同 URL + path 始终产生相同 ID(并发安全)。
155
- *
156
- * @param el DOM 元素引用
157
- * @param path 元素的 XPath-like 路径(如 "/body/div[1]/main/button")
158
- */
159
- set(el: Element, path: string): string;
160
- /**
161
- * 根据 hash ID 获取 DOM 元素。
162
- * 返回 Element 或 undefined(ID 不存在或元素已被移除)。
163
- */
164
- get(id: string): Element | undefined;
165
- /** 检查 hash ID 是否存在 */
166
- has(id: string): boolean;
167
- /** 清空所有映射 */
168
- clear(): void;
169
195
  /**
170
- * 重置映射表:清空所有映射,并可选更新 URL 命名空间。
171
- *
172
- * 用于页面导航后刷新 RefStore:旧的 hash ID → Element 映射已失效,
173
- * 需要用新 URL 重新生成确定性 hash。
196
+ * 断言评估结果(仅在配置了 assertionConfig 且 AI 触发了 assert 时存在)。
174
197
  *
175
- * @param url 新的页面 URL(不传则保持原 URL 命名空间)
198
+ * stopReason = 'assertion_passed',则 assertionResult.allPassed = true。
176
199
  */
177
- reset(url?: string): void;
178
- /** 当前映射数量 */
179
- get size(): number;
180
- }
200
+ assertionResult?: AssertionResult;
201
+ };
181
202
  //#endregion
182
- //#region src/web/tools/page-info-tool.d.ts
203
+ //#region src/core/agent-loop/snapshot/engine.d.ts
204
+ type SnapshotRefStore = {
205
+ set(el: Element, path: string): string;
206
+ };
183
207
  /** 快照配置选项 */
184
208
  type SnapshotOptions = {
185
209
  /** 最大遍历深度(默认 12) */maxDepth?: number;
@@ -200,7 +224,7 @@ type SnapshotOptions = {
200
224
  * 传入 RefStore 实例后,每个元素使用确定性 hash ID 替代完整 XPath,
201
225
  * 大幅减少 token 消耗。dom-tool 通过 RefStore.get(id) 解析回 DOM 元素。
202
226
  */
203
- refStore?: RefStore; /** 最大输出节点数(默认 220),超过后停止继续遍历。 */
227
+ refStore?: SnapshotRefStore; /** 最大输出节点数(默认 220),超过后停止继续遍历。 */
204
228
  maxNodes?: number; /** 每个父节点最多输出的子元素数(默认 25),超出部分会折叠。 */
205
229
  maxChildren?: number; /** 文本截断长度(默认 40)。 */
206
230
  maxTextLength?: number;
@@ -251,7 +275,22 @@ type SnapshotOptions = {
251
275
  * @param options - 快照选项对象,或传入数字作为 maxDepth(向后兼容)
252
276
  */
253
277
  declare function generateSnapshot(root?: Element, options?: SnapshotOptions | number): string;
254
- declare function createPageInfoTool(): ToolDefinition;
278
+ //#endregion
279
+ //#region src/core/agent-loop/assertion/index.d.ts
280
+ /**
281
+ * 执行断言评估。
282
+ *
283
+ * 发起独立的 AI 调用,让断言 AI 基于快照和操作记录判定任务完成情况。
284
+ *
285
+ * @param client - AI 客户端(复用主循环同一个客户端实例)
286
+ * @param snapshot - 当前页面快照文本
287
+ * @param executedActions - 已执行操作摘要列表(如 "dom click #abc123")
288
+ * @param taskAssertions - 待验证的任务断言
289
+ * @param initialSnapshot - 任务开始前的初始快照(可选,用于 before/after 对比)
290
+ * @param postActionSnapshot - 动作执行后、稳定等待前的快照(可选,捕获成功提示等瞬态反馈)
291
+ * @returns 结构化断言结果
292
+ */
293
+ declare function evaluateAssertions(client: AIClient, snapshot: string, executedActions: string[], taskAssertions: TaskAssertion[], initialSnapshot?: string, postActionSnapshot?: string): Promise<AssertionResult>;
255
294
  //#endregion
256
295
  //#region src/web/ui/panel.d.ts
257
296
  /** 面板配置选项 */
@@ -376,13 +415,16 @@ declare function createDomTool(): ToolDefinition;
376
415
  //#region src/web/tools/navigate-tool.d.ts
377
416
  declare function createNavigateTool(): ToolDefinition;
378
417
  //#endregion
418
+ //#region src/web/tools/page-info-tool.d.ts
419
+ declare function createPageInfoTool(): ToolDefinition;
420
+ //#endregion
379
421
  //#region src/web/tools/wait-tool.d.ts
380
422
  declare function createWaitTool(): ToolDefinition;
381
423
  //#endregion
382
424
  //#region src/web/tools/evaluate-tool.d.ts
383
425
  declare function createEvaluateTool(): ToolDefinition;
384
426
  //#endregion
385
- //#region src/web/messaging.d.ts
427
+ //#region src/core/messaging.d.ts
386
428
  /**
387
429
  * Web Tools 消息通信桥接层。
388
430
  *
@@ -496,6 +538,33 @@ type WebAgentOptions = {
496
538
  */
497
539
  panel?: boolean | PanelOptions;
498
540
  };
541
+ /**
542
+ * chat() 方法的可选配置。
543
+ *
544
+ * 支持配置断言,用于 AI 驱动的任务完成验证。
545
+ */
546
+ type ChatOptions = {
547
+ /**
548
+ * 断言配置。
549
+ *
550
+ * 配置后,AI 可在合适时机调用 assert 工具触发断言验证。
551
+ * 由独立的断言 AI(专用 prompt,不带 tools)根据快照 + 操作记录判定任务完成情况。
552
+ * 所有任务断言通过时立即收敛(stopReason = 'assertion_passed')。
553
+ *
554
+ * @example
555
+ * ```ts
556
+ * await agent.chat("满意度选五星,然后填写用户名为 admin", {
557
+ * assertionConfig: {
558
+ * taskAssertions: [
559
+ * { task: "满意度选五星", description: "满意度评分组件应显示 5 个激活状态的星星" },
560
+ * { task: "填写用户名", description: "用户名输入框的值应为 admin" },
561
+ * ]
562
+ * }
563
+ * });
564
+ * ```
565
+ */
566
+ assertionConfig?: AssertionConfig;
567
+ };
499
568
  declare class WebAgent {
500
569
  /** 默认系统提示词 key(兼容旧版 setSystemPrompt(prompt))。 */
501
570
  private static readonly DEFAULT_SYSTEM_PROMPT_KEY;
@@ -628,11 +697,14 @@ declare class WebAgent {
628
697
  *
629
698
  * 内部流程(全部复用 core):
630
699
  * 1. createAIClient() → 创建 fetch AI 客户端
631
- * 2. buildSystemPrompt() → 构建系统提示词
700
+ * 2. buildSystemPrompt() → 构建系统提示词(含断言能力说明)
632
701
  * 3. executeAgentLoop() → 执行决策循环
633
702
  * 4. callbacks → 实时通知 UI
703
+ *
704
+ * @param message - 用户任务消息
705
+ * @param options - 可选配置(断言配置等)
634
706
  */
635
- chat(message: string): Promise<AgentLoopResult>;
707
+ chat(message: string, options?: ChatOptions): Promise<AgentLoopResult>;
636
708
  /**
637
709
  * 创建内置 AI 客户端(基于 token / provider / model 配置)。
638
710
  *
@@ -641,5 +713,5 @@ declare class WebAgent {
641
713
  private createBuiltinClient;
642
714
  }
643
715
  //#endregion
644
- export { Panel, type PanelOptions, type SnapshotOptions, type ToolCallMessage, type ToolCallResponse, type ToolExecutorMap, WebAgent, WebAgentCallbacks, WebAgentOptions, createDomTool, createEvaluateTool, createNavigateTool, createPageInfoTool, createProxyExecutor, createWaitTool, generateSnapshot, registerToolHandler };
716
+ export { type AssertionConfig, type AssertionResult, ChatOptions, Panel, type PanelOptions, type SnapshotOptions, type TaskAssertion, type TaskAssertionResult, type ToolCallMessage, type ToolCallResponse, type ToolExecutorMap, WebAgent, WebAgentCallbacks, WebAgentOptions, createDomTool, createEvaluateTool, createNavigateTool, createPageInfoTool, createProxyExecutor, createWaitTool, evaluateAssertions, generateSnapshot, registerToolHandler };
645
717
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/tool-registry.ts","../src/core/types.ts","../src/core/agent-loop/types.ts","../src/web/ref-store.ts","../src/web/tools/page-info-tool.ts","../src/web/ui/panel.ts","../src/web/tools/dom-tool.ts","../src/web/tools/navigate-tool.ts","../src/web/tools/wait-tool.ts","../src/web/tools/evaluate-tool.ts","../src/web/messaging.ts","../src/web/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/tool-registry.ts","../src/core/types.ts","../src/core/agent-loop/assertion/types.ts","../src/core/agent-loop/types.ts","../src/core/agent-loop/snapshot/engine.ts","../src/core/agent-loop/assertion/index.ts","../src/web/ui/panel.ts","../src/web/tools/dom-tool.ts","../src/web/tools/navigate-tool.ts","../src/web/tools/page-info-tool.ts","../src/web/tools/wait-tool.ts","../src/web/tools/evaluate-tool.ts","../src/core/messaging.ts","../src/web/index.ts"],"mappings":"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"}