agentpage 0.0.30 → 0.0.32

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
@@ -380,11 +380,11 @@ agent.clearHistory(); // 手动清空历史
380
380
 
381
381
  | 参数 | 类型 | 默认值 | 说明 |
382
382
  | --- | --- | --- | --- |
383
- | `maxDepth` | `number` | `8`(chat 首轮)/ `6`(page_info.snapshot) | DOM 最大遍历深度,超过该深度的子树不会输出 |
383
+ | `maxDepth` | `number` | `8`(chat 首轮)/ `7`(page_info.snapshot) | DOM 最大遍历深度,超过该深度的子树不会输出 |
384
384
  | `viewportOnly` | `boolean` | `false`(chat 首轮)/ `true`(page_info.snapshot) | 是否仅保留与视口相交的元素 |
385
385
  | `pruneLayout` | `boolean` | `true` | 是否折叠无意义纯布局容器(div/span/section 等) |
386
- | `maxNodes` | `number` | `500`(chat 首轮)/ `220`(page_info.snapshot) | 快照最大节点输出数量,超出后停止遍历并追加截断提示 |
387
- | `maxChildren` | `number` | `30`(chat 首轮)/ `25`(page_info.snapshot) | 每个父节点最多保留的子元素数量 |
386
+ | `maxNodes` | `number` | `500`(chat 首轮)/ `280`(page_info.snapshot) | 快照最大节点输出数量,超出后停止遍历并追加截断提示 |
387
+ | `maxChildren` | `number` | `30`(chat 首轮)/ `32`(page_info.snapshot) | 每个父节点最多保留的子元素数量 |
388
388
  | `maxTextLength` | `number` | `40` | 单节点文本截断长度(字符数) |
389
389
  | `refStore` | `RefStore` | 自动创建 | hash ID 映射表(一般无需手动传入,WebAgent 自动管理) |
390
390
 
@@ -400,7 +400,7 @@ agent.clearHistory(); // 手动清空历史
400
400
 
401
401
  - `page_info.snapshot` 会为命中事件追踪的元素输出 `listeners="click,input,..."`
402
402
  - 交互优先级识别会把运行时监听事件纳入判断(不仅依赖 `onclick/role` 等静态属性)
403
- - 智能剪枝会保留带事件绑定的容器,避免把委托交互入口错误折叠
403
+ - 智能剪枝会优先保留“自身有事件绑定”的容器,并在中浅层对子树事件做受预算探测,尽量保留可操作链路
404
404
 
405
405
  边界说明:
406
406
 
@@ -442,6 +442,10 @@ agent.clearHistory(); // 手动清空历史
442
442
 
443
443
  折叠规则:
444
444
  - 没有 `id`、没有语义标签(如 `main`/`nav`)、没有交互属性、没有直接文本的纯布局div/span
445
+ - 浅层布局主干默认保留(避免页面主结构被过早折叠)
446
+ - 自身有事件绑定(`on*` 或追踪到 listeners)的容器优先保留
447
+ - 中浅层子树出现事件绑定时,在预算范围内尽量保留相关容器
448
+ - `svg` 装饰节点与 `__SVG_SPRITE_NODE__` sprite 容器会被过滤,避免噪音吞掉节点预算
445
449
  - 子节点直接**提升**输出到父级位置
446
450
  - 当同一折叠容器提升出多个相邻节点时,用 `collapsed-group` 括号块标记它们的来源关联
447
451
 
@@ -465,7 +469,7 @@ agent.clearHistory(); // 手动清空历史
465
469
  | --- | --- | --- | --- | --- | --- |
466
470
  | `chat()` 首轮 | 8 | false | 500 | 30 | 优先完整性,提供充足的页面上下文 |
467
471
  | `page_info.snapshot`(loop 内) | 8 | false | 500 | 30 | 与首轮对齐,保证一致性 |
468
- | `page_info.snapshot`(手动调用) | 6 | true | 220 | 25 | 较小体积,适合局部更新 |
472
+ | `page_info.snapshot`(手动调用) | 7 | true | 280 | 32 | 略放宽额度,兼顾结构完整与可操作性 |
469
473
 
470
474
  ---
471
475
 
package/dist/index.d.mts CHANGED
@@ -192,7 +192,7 @@ declare class RefStore {
192
192
  //#region src/web/tools/page-info-tool.d.ts
193
193
  /** 快照配置选项 */
194
194
  type SnapshotOptions = {
195
- /** 最大遍历深度(默认 6) */maxDepth?: number;
195
+ /** 最大遍历深度(默认 7) */maxDepth?: number;
196
196
  /**
197
197
  * 视口裁剪:只保留与视口相交的元素(默认 true)。
198
198
  * 开启后,完全在视口外的元素会被跳过,大幅减少 token 消耗。
@@ -210,8 +210,8 @@ type SnapshotOptions = {
210
210
  * 传入 RefStore 实例后,每个元素使用确定性 hash ID 替代完整 XPath,
211
211
  * 大幅减少 token 消耗。dom-tool 通过 RefStore.get(id) 解析回 DOM 元素。
212
212
  */
213
- refStore?: RefStore; /** 最大输出节点数(默认 220),超过后停止继续遍历。 */
214
- maxNodes?: number; /** 每个父节点最多输出的子元素数(默认 25),超出部分会折叠。 */
213
+ refStore?: RefStore; /** 最大输出节点数(默认 280),超过后停止继续遍历。 */
214
+ maxNodes?: number; /** 每个父节点最多输出的子元素数(默认 32),超出部分会折叠。 */
215
215
  maxChildren?: number; /** 文本截断长度(默认 40)。 */
216
216
  maxTextLength?: number;
217
217
  /**
@@ -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/tools/dom-tool/index.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/types.ts","../src/web/ref-store.ts","../src/web/tools/page-info-tool.ts","../src/web/tools/dom-tool/index.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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"}
package/dist/index.mjs CHANGED
@@ -308,6 +308,12 @@ function hasToolError(result) {
308
308
  * - `pruneLayout=true` 时:无 id/无语义/无交互/无直接文本的布局容器会被“折叠”,
309
309
  * 子节点直接提升输出,减少无意义层级;当同一折叠容器提升出多个相邻节点时,
310
310
  * 快照会用括号分组块标记其关联来源(collapsed-group)。
311
+ * - 布局主干保留:浅层结构优先保留(避免页面主骨架被过早折叠导致业务区域缺失)。
312
+ * - 事件信号保留:节点自身存在事件绑定(inline/on* 或 addEventListener 追踪)时优先保留;
313
+ * 中浅层会做受预算约束的子树事件探测,尽量保留潜在可操作链路。
314
+ * - 语义文本保留:包含语义文本的容器优先保留,避免“有意义但非控件”信息被误删。
315
+ * - 噪音过滤:跳过 `svg` 等装饰节点及 `__SVG_SPRITE_NODE__` sprite 容器,
316
+ * 避免图标定义树挤占节点预算。
311
317
  * - `maxNodes`:全局节点预算,超限后停止继续遍历并追加 truncation 提示。
312
318
  * - `maxChildren`:每个父节点只保留前 N 个子元素,其余用 `... (n children omitted)` 汇总。
313
319
  * - `maxTextLength`:节点文本按长度截断,避免长段文案占满上下文。
@@ -3030,11 +3036,11 @@ function sanitizeSnapshotAttrValue(value) {
3030
3036
  */
3031
3037
  function generateSnapshot(root = document.body, options = {}) {
3032
3038
  const opts = typeof options === "number" ? { maxDepth: options } : options;
3033
- const maxDepth = opts.maxDepth ?? 6;
3039
+ const maxDepth = opts.maxDepth ?? 7;
3034
3040
  const viewportOnly = opts.viewportOnly ?? true;
3035
3041
  const pruneLayout = opts.pruneLayout ?? true;
3036
- const maxNodes = opts.maxNodes ?? 220;
3037
- const maxChildren = opts.maxChildren ?? 25;
3042
+ const maxNodes = opts.maxNodes ?? 280;
3043
+ const maxChildren = opts.maxChildren ?? 32;
3038
3044
  const maxTextLength = opts.maxTextLength ?? 40;
3039
3045
  const expandOptionLists = opts.expandOptionLists ?? false;
3040
3046
  const expandedChildrenLimit = Math.min(MAX_EXPANDED_CHILDREN_LIMIT, Math.max(1, opts.expandedChildrenLimit ?? MAX_EXPANDED_LIST_CHILDREN));
@@ -3163,21 +3169,54 @@ function generateSnapshot(root = document.body, options = {}) {
3163
3169
  return false;
3164
3170
  }
3165
3171
  /**
3166
- * 判断子树内是否存在绑定事件元素。
3167
- *
3168
- * 说明:
3169
- * - 该判定只用于“是否允许剪枝布局容器”。
3170
- * - 命中扫描预算上限时保守返回 true,避免误剪导致交互目标丢失。
3172
+ * 轻量检测:当前容器浅层子树里是否出现事件绑定节点。
3173
+ * 仅用于是否保留布局容器,预算受控避免再次吞掉整页层级。
3171
3174
  */
3172
- function hasBoundEventsInSubtree(el, scanBudget = 180) {
3175
+ function hasBoundEventsInShallowSubtree(el, scanBudget = 48, maxTreeDepth = 2) {
3176
+ const queue = Array.from(el.children).map((node) => ({
3177
+ node,
3178
+ depth: 1
3179
+ }));
3180
+ let scanned = 0;
3181
+ while (queue.length > 0) {
3182
+ const current = queue.shift();
3183
+ if (!current) continue;
3184
+ if (hasBoundEvents(current.node)) return true;
3185
+ scanned += 1;
3186
+ if (scanned >= scanBudget) return false;
3187
+ if (current.depth >= maxTreeDepth) continue;
3188
+ for (const child of Array.from(current.node.children)) queue.push({
3189
+ node: child,
3190
+ depth: current.depth + 1
3191
+ });
3192
+ }
3193
+ return false;
3194
+ }
3195
+ /** 判断文本是否具有语义信息(过滤纯符号/超短噪音)。 */
3196
+ function isSemanticText(text) {
3197
+ const normalized = text.replace(/\s+/g, "").trim();
3198
+ if (!normalized) return false;
3199
+ if (normalized.length < 2) return false;
3200
+ return /[\p{Script=Han}A-Za-z0-9]/u.test(normalized);
3201
+ }
3202
+ /** 在子树内查找语义文本(浅层限流,避免额外大开销)。 */
3203
+ function hasSemanticTextInSubtree(el, scanBudget = 180) {
3173
3204
  const stack = Array.from(el.children);
3174
3205
  let scanned = 0;
3175
3206
  while (stack.length > 0) {
3176
3207
  const current = stack.pop();
3177
3208
  if (!current) continue;
3178
- if (hasBoundEvents(current)) return true;
3209
+ let directText = "";
3210
+ for (let i = 0; i < current.childNodes.length; i++) {
3211
+ const node = current.childNodes[i];
3212
+ if (node.nodeType === Node.TEXT_NODE) {
3213
+ const t = node.textContent?.trim();
3214
+ if (t) directText += t + " ";
3215
+ }
3216
+ }
3217
+ if (isSemanticText(directText.trim())) return true;
3179
3218
  scanned += 1;
3180
- if (scanned >= scanBudget) return true;
3219
+ if (scanned >= scanBudget) return false;
3181
3220
  const children = Array.from(current.children);
3182
3221
  for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);
3183
3222
  }
@@ -3191,14 +3230,16 @@ function generateSnapshot(root = document.body, options = {}) {
3191
3230
  * 3. 没有交互属性(href/role/aria-label/onclick 等)
3192
3231
  * 4. 没有直接文本内容
3193
3232
  */
3194
- function isEmptyLayoutContainer(el, directText) {
3233
+ function isEmptyLayoutContainer(el, directText, depth) {
3195
3234
  if (!pruneLayout) return false;
3235
+ if (depth <= 2) return false;
3196
3236
  if (!LAYOUT_TAGS.has(getTagKey(el))) return false;
3197
3237
  if (el.getAttribute("id")) return false;
3198
3238
  if (el.getAttribute("role") || el.getAttribute("aria-label")) return false;
3199
3239
  if (hasBoundEvents(el)) return false;
3240
+ if (depth <= 4 && hasBoundEventsInShallowSubtree(el)) return false;
3241
+ if (isSemanticText(directText) || hasSemanticTextInSubtree(el)) return false;
3200
3242
  if (directText) return false;
3201
- if (hasBoundEventsInSubtree(el)) return false;
3202
3243
  return true;
3203
3244
  }
3204
3245
  function hasInteractiveTrackedEvents(el) {
@@ -3306,7 +3347,7 @@ function generateSnapshot(root = document.body, options = {}) {
3306
3347
  }
3307
3348
  }
3308
3349
  directText = directText.trim();
3309
- if (isEmptyLayoutContainer(el, directText)) {
3350
+ if (isEmptyLayoutContainer(el, directText, depth)) {
3310
3351
  const allChildren = Array.from(el.children);
3311
3352
  const interactiveChildren = allChildren.filter(isInteractiveElement);
3312
3353
  const nonInteractiveChildren = allChildren.filter((child) => !isInteractiveElement(child));
@@ -3396,11 +3437,11 @@ function createPageInfoTool() {
3396
3437
  schema: Type.Object({
3397
3438
  action: Type.String({ description: "Info action: get_url | get_title | get_selection | get_viewport | snapshot | query_all" }),
3398
3439
  selector: Type.Optional(Type.String({ description: "CSS selector for query_all action" })),
3399
- maxDepth: Type.Optional(Type.Number({ description: "Max depth for snapshot (default: 6)" })),
3440
+ maxDepth: Type.Optional(Type.Number({ description: "Max depth for snapshot (default: 7)" })),
3400
3441
  viewportOnly: Type.Optional(Type.Boolean({ description: "Only snapshot elements visible in viewport (default: true)" })),
3401
3442
  pruneLayout: Type.Optional(Type.Boolean({ description: "Collapse empty layout containers like div/span (default: true)" })),
3402
- maxNodes: Type.Optional(Type.Number({ description: "Maximum nodes to include in snapshot (default: 220)" })),
3403
- maxChildren: Type.Optional(Type.Number({ description: "Maximum children per element (default: 25)" })),
3443
+ maxNodes: Type.Optional(Type.Number({ description: "Maximum nodes to include in snapshot (default: 280)" })),
3444
+ maxChildren: Type.Optional(Type.Number({ description: "Maximum children per element (default: 32)" })),
3404
3445
  maxTextLength: Type.Optional(Type.Number({ description: "Maximum text length per node (default: 40)" })),
3405
3446
  expandOptionLists: Type.Optional(Type.Boolean({ description: "Expand option-list containers to avoid child truncation (default: false)" })),
3406
3447
  expandChildrenRefs: Type.Optional(Type.Array(Type.String({ description: "Hash refs to expand child truncation for (e.g. #abc123)" }))),
@@ -3425,11 +3466,11 @@ function createPageInfoTool() {
3425
3466
  return { content: JSON.stringify(info, null, 2) };
3426
3467
  }
3427
3468
  case "snapshot": {
3428
- const maxDepth = params.maxDepth ?? 6;
3469
+ const maxDepth = params.maxDepth ?? 7;
3429
3470
  const viewportOnly = params.viewportOnly ?? true;
3430
3471
  const pruneLayout = params.pruneLayout ?? true;
3431
- const maxNodes = params.maxNodes ?? 220;
3432
- const maxChildren = params.maxChildren ?? 25;
3472
+ const maxNodes = params.maxNodes ?? 280;
3473
+ const maxChildren = params.maxChildren ?? 32;
3433
3474
  const maxTextLength = params.maxTextLength ?? 40;
3434
3475
  const expandOptionLists = params.expandOptionLists ?? false;
3435
3476
  const expandChildrenRefs = Array.isArray(params.expandChildrenRefs) ? params.expandChildrenRefs.filter((ref) => typeof ref === "string") : void 0;