@opentiny/next-sdk 0.4.0 → 0.4.2

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.
Files changed (149) hide show
  1. package/agent/AgentModelProvider.ts +78 -81
  2. package/agent/type.ts +6 -9
  3. package/agent/utils/getAISDKTools.ts +0 -1
  4. package/agent/utils/getBuiltinMcpTools.ts +7 -7
  5. package/core.ts +0 -3
  6. package/dist/SimulatorMask-BHVXyogh-CARX3Rff.js +361 -0
  7. package/dist/agent/type.d.ts +4 -12
  8. package/dist/agent/utils/getBuiltinMcpTools.d.ts +3 -3
  9. package/dist/core.d.ts +0 -1
  10. package/dist/core.js +16 -17
  11. package/dist/index-R_HIbfUX.js +6604 -0
  12. package/dist/index.d.ts +11 -3
  13. package/dist/index.js +76 -4969
  14. package/dist/{initialize-builtin-WebMCP-HgObT902.js → initialize-builtin-WebMCP-JaoKwVlm.js} +1156 -1037
  15. package/dist/page-tools/a11y/build.d.ts +10 -0
  16. package/dist/page-tools/a11y/config.d.ts +96 -0
  17. package/dist/page-tools/a11y/constants.d.ts +11 -0
  18. package/dist/page-tools/a11y/search.d.ts +17 -0
  19. package/dist/page-tools/a11y/types.d.ts +95 -0
  20. package/dist/page-tools/a11y/utils.d.ts +55 -0
  21. package/dist/page-tools/a11y/vnode.d.ts +40 -0
  22. package/dist/page-tools/a11y-tree.d.ts +9 -99
  23. package/dist/page-tools/configs/console-cloud.d.ts +6 -0
  24. package/dist/page-tools/constants.d.ts +10 -0
  25. package/dist/page-tools/context.d.ts +40 -0
  26. package/dist/page-tools/handlers/browserState.d.ts +8 -0
  27. package/dist/page-tools/handlers/click.d.ts +8 -0
  28. package/dist/page-tools/handlers/executeJavascript.d.ts +8 -0
  29. package/dist/page-tools/handlers/fill.d.ts +8 -0
  30. package/dist/page-tools/handlers/scroll.d.ts +8 -0
  31. package/dist/page-tools/handlers/searchTree.d.ts +9 -0
  32. package/dist/page-tools/handlers/select.d.ts +8 -0
  33. package/dist/page-tools/page-agent-highlight/index.d.ts +21 -0
  34. package/dist/page-tools/page-agent-mask/SimulatorMask.d.ts +16 -0
  35. package/dist/page-tools/page-agent-mask/checkDarkMode.d.ts +5 -0
  36. package/dist/page-tools/page-agent-tool-event.d.ts +26 -0
  37. package/dist/page-tools/page-agent-tool.d.ts +3 -8
  38. package/dist/page-tools/schema.d.ts +44 -0
  39. package/dist/page-tools/tool-config.d.ts +50 -0
  40. package/dist/page-tools/utils/dom.d.ts +6 -0
  41. package/dist/page-tools/utils/scroll.d.ts +15 -0
  42. package/dist/runtime.d.ts +7 -0
  43. package/dist/runtime.js +732 -0
  44. package/dist/utils/builtinProxy.d.ts +1 -1
  45. package/dist/vitest.config.d.ts +2 -0
  46. package/index.ts +35 -5
  47. package/package.json +23 -29
  48. package/page-tools/a11y/build.ts +74 -0
  49. package/page-tools/a11y/config.ts +465 -0
  50. package/page-tools/a11y/constants.ts +131 -0
  51. package/page-tools/a11y/search.ts +127 -0
  52. package/page-tools/a11y/types.ts +105 -0
  53. package/page-tools/a11y/utils.ts +239 -0
  54. package/page-tools/a11y/vnode.ts +439 -0
  55. package/page-tools/a11y-tree.ts +9 -527
  56. package/page-tools/bridge.ts +23 -3
  57. package/page-tools/configs/console-cloud.ts +172 -0
  58. package/page-tools/constants.ts +12 -0
  59. package/page-tools/context.ts +50 -0
  60. package/page-tools/handlers/browserState.ts +12 -0
  61. package/page-tools/handlers/click.ts +30 -0
  62. package/page-tools/handlers/executeJavascript.ts +22 -0
  63. package/page-tools/handlers/fill.ts +65 -0
  64. package/page-tools/handlers/scroll.ts +66 -0
  65. package/page-tools/handlers/searchTree.ts +27 -0
  66. package/page-tools/handlers/select.ts +39 -0
  67. package/page-tools/page-agent-highlight/index.ts +245 -0
  68. package/page-tools/page-agent-mask/SimulatorMask.module.css +14 -0
  69. package/page-tools/page-agent-mask/SimulatorMask.ts +299 -0
  70. package/page-tools/page-agent-mask/checkDarkMode.ts +181 -0
  71. package/page-tools/page-agent-mask/cursor-border.svg +3 -0
  72. package/page-tools/page-agent-mask/cursor-fill.svg +5 -0
  73. package/page-tools/page-agent-mask/cursor.module.css +70 -0
  74. package/page-tools/page-agent-mask/hauwei.svg +25 -0
  75. package/page-tools/page-agent-prompt.md +34 -18
  76. package/page-tools/page-agent-tool-event.ts +113 -0
  77. package/page-tools/page-agent-tool.ts +146 -162
  78. package/page-tools/schema.ts +52 -0
  79. package/page-tools/tool-config.ts +100 -0
  80. package/page-tools/utils/dom.ts +158 -0
  81. package/page-tools/utils/scroll.ts +58 -0
  82. package/runtime.ts +44 -0
  83. package/test/page-tools/a11y/build.test.ts +638 -0
  84. package/test/page-tools/a11y/config.test.ts +370 -0
  85. package/test/page-tools/configs/console-cloud.test.ts +168 -0
  86. package/test/page-tools/page-agent-highlight.test.ts +110 -0
  87. package/test/page-tools/page-agent-tool-dispatch.test.ts +208 -0
  88. package/test/page-tools/page-agent-tool.test.ts +102 -0
  89. package/test/page-tools/tool-config.test.ts +112 -0
  90. package/test/page-tools/utils/dom.test.ts +122 -0
  91. package/utils/builtinProxy.ts +45 -13
  92. package/vite.config.runtime.ts +22 -0
  93. package/vite.config.ts +52 -8
  94. package/vitest.config.ts +10 -0
  95. package/McpSdk.ts +0 -14
  96. package/WebAgent.ts +0 -5
  97. package/WebMcp.ts +0 -26
  98. package/Zod.ts +0 -1
  99. package/dist/McpSdk.d.ts +0 -14
  100. package/dist/SimulatorMask-BHVXyogh-BFEGpD5S.js +0 -1048
  101. package/dist/SimulatorMask-BHVXyogh-CCYbrb84.js +0 -801
  102. package/dist/WebAgent.d.ts +0 -5
  103. package/dist/WebMcp.d.ts +0 -23
  104. package/dist/Zod.d.ts +0 -1
  105. package/dist/index.es.dev.js +0 -59017
  106. package/dist/index.es.js +0 -46795
  107. package/dist/index.umd.dev.js +0 -60355
  108. package/dist/index.umd.js +0 -1248
  109. package/dist/mcpsdk@1.25.3.dev.js +0 -22780
  110. package/dist/mcpsdk@1.25.3.es.dev.js +0 -22778
  111. package/dist/mcpsdk@1.25.3.es.js +0 -16960
  112. package/dist/mcpsdk@1.25.3.js +0 -48
  113. package/dist/transport/ExtensionClientTransport.d.ts +0 -24
  114. package/dist/transport/ExtensionContentServerTransport.d.ts +0 -39
  115. package/dist/transport/ExtensionPageServerTransport.d.ts +0 -36
  116. package/dist/transport/messages.d.ts +0 -9
  117. package/dist/vite.config.mcpSdk.d.ts +0 -2
  118. package/dist/vite.config.webAgent.d.ts +0 -2
  119. package/dist/vite.config.webMcp.d.ts +0 -2
  120. package/dist/vite.config.webMcpFull.d.ts +0 -2
  121. package/dist/vite.config.zod.d.ts +0 -2
  122. package/dist/webagent.dev.js +0 -49360
  123. package/dist/webagent.es.dev.js +0 -49071
  124. package/dist/webagent.es.js +0 -39219
  125. package/dist/webagent.js +0 -642
  126. package/dist/webmcp-full.dev.js +0 -31336
  127. package/dist/webmcp-full.es.dev.js +0 -30283
  128. package/dist/webmcp-full.es.js +0 -22889
  129. package/dist/webmcp-full.js +0 -645
  130. package/dist/webmcp.dev.js +0 -9572
  131. package/dist/webmcp.es.dev.js +0 -8518
  132. package/dist/webmcp.es.js +0 -6727
  133. package/dist/webmcp.js +0 -602
  134. package/dist/zod@3.25.76.dev.js +0 -4037
  135. package/dist/zod@3.25.76.es.dev.js +0 -4033
  136. package/dist/zod@3.25.76.es.js +0 -2945
  137. package/dist/zod@3.25.76.js +0 -1
  138. package/transport/ExtensionClientTransport.ts +0 -100
  139. package/transport/ExtensionContentServerTransport.ts +0 -162
  140. package/transport/ExtensionPageServerTransport.ts +0 -149
  141. package/transport/messages.ts +0 -63
  142. package/vite-build-tsc.ts +0 -63
  143. package/vite-env.d.ts +0 -10
  144. package/vite.config.mcpSdk.ts +0 -28
  145. package/vite.config.webAgent.ts +0 -19
  146. package/vite.config.webMcp.ts +0 -40
  147. package/vite.config.webMcpFull.ts +0 -19
  148. package/vite.config.zod.ts +0 -23
  149. /package/dist/{vite-build-tsc.d.ts → vite.config.runtime.d.ts} +0 -0
@@ -0,0 +1,10 @@
1
+ import { A11yTreeOptions, A11yTreeResult } from './types';
2
+ import { A11yConfig } from './config';
3
+
4
+ /**
5
+ * 生成当前页面的语义化 ARIA YAML 树
6
+ *
7
+ * @param root 遍历起点,默认 document.body
8
+ * @param config 统一无障碍配置(角色/状态规则、白/黑名单、自定义属性等)+ 树形状选项(pruneUnnamed/preserveRoles)
9
+ */
10
+ export declare function buildA11yTree(root?: Element, config?: A11yConfig & A11yTreeOptions): A11yTreeResult;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * a11y/config.ts
3
+ *
4
+ * 统一无障碍配置(A11yConfig):把角色推断、状态推断、白/黑名单、自定义属性、
5
+ * 弹窗选择器等配置项收敛为一个对象,并提供:
6
+ * 1. 声明式规则(roles/states)的合并与匹配逻辑
7
+ * 2. 底层的逐元素解析函数(resolveA11yRole/resolveA11yStates/resolveA11yInfo)
8
+ *
9
+ * 运行期读写 API 统一由 ../tool-config.ts 的 getPageAgentToolConfig/setPageAgentToolConfig 提供
10
+ * (a11yConfig 是其中一个字段),这里不再单独维护一套 get/set。
11
+ */
12
+ export interface A11yMatcher {
13
+ /**
14
+ * 标准 CSS 选择器。优先使用 selector,仅当选择器表达不了时再写 match。
15
+ * - **states**:用 `closest` 判断自身或祖先是否命中(适合 error/selected 等挂在容器上的状态)
16
+ * - **roles**:用 `matches` 仅判断自身是否命中(避免角色传染给子孙节点)
17
+ * 支持标签/属性/id/组合选择器,也支持字符串数组(任意一个命中即可)。
18
+ */
19
+ selector?: string | string[];
20
+ /** 自定义判断函数,优先级高于 selector,用于读取计算样式、组合条件等选择器表达不了的场景 */
21
+ match?: (el: Element) => boolean;
22
+ }
23
+ export type A11yStateName = 'checked' | 'selected' | 'pressed' | 'current' | 'expanded' | 'hasPopup' | 'disabled' | 'readonly' | 'required' | 'invalid' | 'busy' | 'error' | 'warning' | (string & {});
24
+ export interface A11yRoleRule extends A11yMatcher {
25
+ /** 命中后赋予的 ARIA 角色,如 'tab' | 'tabpanel' | 'switch' | 'treeitem' */
26
+ role: string;
27
+ /** 为 true 时覆盖元素已有的显式 role 属性,默认 false(不覆盖开发者显式设置) */
28
+ force?: boolean;
29
+ }
30
+ export interface A11yConfig {
31
+ /** 角色推断规则:用于弥补页面缺失的语义 role(如自定义 Tab 组件没有 role=tab) */
32
+ roles?: A11yRoleRule[];
33
+ /** 状态推断规则:key 为状态名,value 为一条或多条规则(命中任意一条即成立),与标准 aria-* 检测结果取"或" */
34
+ states?: Partial<Record<A11yStateName, A11yMatcher | A11yMatcher[]>>;
35
+ /** 白名单:强制识别为可交互元素并纳入无障碍树。支持 Element 引用或 CSS 选择器字符串(字符串每次动态解析,适配 SPA 重渲染) */
36
+ whitelist?: Array<Element | string>;
37
+ /** 黑名单:强制从无障碍树中排除,规则同上 */
38
+ blacklist?: Array<Element | string>;
39
+ /** 额外暴露的自定义 DOM 属性(作为 token 输出,如 [data-testid="xxx"]) */
40
+ exposedAttributes?: string[];
41
+ /** 模态弹窗 CSS 选择器(用于 detectPageDialog 检测阻塞交互的弹窗) */
42
+ dialogSelectors?: string[];
43
+ }
44
+ /** 单个元素解析出的完整无障碍信息 */
45
+ export interface A11yInfo {
46
+ role: string;
47
+ tokens: string[];
48
+ }
49
+ /** 标记已与默认值合并并规整过的配置,避免热路径上二次 merge 导致默认规则翻倍 */
50
+ declare const RESOLVED_A11Y_BRAND: unique symbol;
51
+ /**
52
+ * 合并/规整后的完整无障碍配置:与用户书写的 {@link A11yConfig} 的唯一区别是
53
+ * states 的每个状态名都统一规范化为数组(不再是 `A11yMatcher | A11yMatcher[]`)。
54
+ * resolveA11yInfo 内部与 getPageAgentToolConfig().a11yConfig 读取到的都是这个类型。
55
+ */
56
+ export interface ResolvedA11yConfig {
57
+ roles: A11yRoleRule[];
58
+ states: Partial<Record<A11yStateName, A11yMatcher[]>>;
59
+ whitelist: Array<Element | string>;
60
+ blacklist: Array<Element | string>;
61
+ exposedAttributes: string[];
62
+ dialogSelectors: string[];
63
+ readonly [RESOLVED_A11Y_BRAND]?: true;
64
+ }
65
+ /** 是否为 {@link mergeA11yConfig}/{@link mergeA11yConfigs} 产出的已规整配置 */
66
+ export declare function isResolvedA11yConfig(config?: A11yConfig | ResolvedA11yConfig | null): config is ResolvedA11yConfig;
67
+ /** 默认生效的无障碍配置:零配置即可覆盖 ARIA 标准 + 主流 UI 框架的常见错误/警告/选中态检测 */
68
+ export declare const DEFAULT_A11Y_CONFIG: ResolvedA11yConfig;
69
+ /** 从状态规则中提取纯 CSS 选择器列表(忽略只有 match 函数、没有 selector 的规则;数组 selector 会被展开),供页面级选择器扫描场景复用 */
70
+ export declare function extractSelectors(rules?: A11yMatcher | A11yMatcher[]): string[];
71
+ /** 合并两份 A11yConfig:数组类字段拼接(additive,不丢失 base 中已有的规则),states 按 key 独立合并 */
72
+ export declare function mergeA11yConfigs(base: A11yConfig, patch: A11yConfig): ResolvedA11yConfig;
73
+ /**
74
+ * 将用户配置与默认配置合并(additive),得到最终生效的完整配置。
75
+ * 若入参已是 {@link ResolvedA11yConfig},直接返回(幂等,避免默认规则被再次拼接)。
76
+ */
77
+ export declare function mergeA11yConfig(user?: A11yConfig | ResolvedA11yConfig): ResolvedA11yConfig;
78
+ /**
79
+ * 保证拿到已与默认值合并的配置:已规整则原样返回(同引用,零开销),否则与默认配置合并。
80
+ * buildA11yTree / resolveA11yInfo 热路径应优先走此函数,避免对运行期配置反复 merge。
81
+ */
82
+ export declare function ensureResolvedA11yConfig(config?: A11yConfig | ResolvedA11yConfig): ResolvedA11yConfig;
83
+ /** 恒等函数,仅用于书写配置时获得 TS 类型提示/校验(风格对齐 defineConfig) */
84
+ export declare function defineA11yConfig(config: A11yConfig): A11yConfig;
85
+ export declare function resolveA11yRole(el: Element, config?: A11yConfig | ResolvedA11yConfig): string;
86
+ export declare function resolveA11yStates(el: Element, config?: A11yConfig | ResolvedA11yConfig): string[];
87
+ /**
88
+ * 统一入口(供用户直接调用的底层函数):读取配置 -> 依据 roles/states 规则计算出该元素的
89
+ * 完整无障碍信息(角色 + 状态 token)。buildA11yTree 内部对每个 DOM 节点也是调用这一个函数,
90
+ * 是声明式规则与树生成结果之间唯一的桥接点;用户也可以直接调用它来调试/复用同一套解析逻辑。
91
+ *
92
+ * 若传入已是 {@link ResolvedA11yConfig}(如 getPageAgentToolConfig().a11yConfig),则跳过合并,
93
+ * 避免在整树遍历时对每个节点重复 array spread / 默认规则翻倍。
94
+ */
95
+ export declare function resolveA11yInfo(el: Element, config?: A11yConfig | ResolvedA11yConfig): A11yInfo;
96
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * a11y/constants.ts
3
+ *
4
+ * 存放无障碍树依赖的静态常量配置、默认选择器及角色映射表。
5
+ */
6
+ export declare const DEFAULT_ERROR_SELECTORS: string[];
7
+ export declare const DEFAULT_WARNING_SELECTORS: string[];
8
+ /** 模态弹窗默认选择器:ARIA 标准 + 主流 UI 框架(唯一来源,顶层 constants.ts 从此处重新导出) */
9
+ export declare const DEFAULT_DIALOG_SELECTORS: string[];
10
+ export declare const TAG_ROLE_MAP: Record<string, string>;
11
+ export declare const INPUT_TYPE_ROLE: Record<string, string>;
@@ -0,0 +1,17 @@
1
+ import { SearchA11yTreeOptions, SearchA11yTreeResult } from './types';
2
+
3
+ /**
4
+ * 在无障碍树中按关键词搜索,返回带行号的匹配结果和上下文
5
+ *
6
+ * 支持的搜索维度(均对同一个 query 字符串做包含匹配):
7
+ * - role:如 `button`、`link`、`heading`
8
+ * - accessible name:节点的语义化名称(引号内文本)
9
+ * - state token:如 `checked`、`disabled`、`expanded`
10
+ * - ref 索引:如 `#5`
11
+ *
12
+ * @example
13
+ * searchA11yTree('button') // 找全部按钮
14
+ * searchA11yTree('提交') // 找名称含"提交"的节点
15
+ * searchA11yTree('#3') // 找 ref #3
16
+ */
17
+ export declare function searchA11yTree(query: string, root?: Element, options?: SearchA11yTreeOptions): SearchA11yTreeResult;
@@ -0,0 +1,95 @@
1
+ import { A11yConfig } from './config';
2
+
3
+ /** ref 索引 → HTMLElement 映射,供 click/fill/select 操作使用 */
4
+ export type RefMap = Map<number, HTMLElement>;
5
+ /** 内部中间态节点,与 DOM 解耦,便于剪枝和序列化 */
6
+ export interface VNode {
7
+ /** 节点的 ARIA 角色 (如 'button', 'link', 'textbox') */
8
+ role: string;
9
+ /** W3C AccName 算法计算出的语义化名称 */
10
+ name: string;
11
+ /** 元素相关的状态和属性标记 (如 'checked', 'disabled', 'value="xxx"') */
12
+ tokens: string[];
13
+ /** 只有交互节点才有 ref (内部索引,用于标识可在其上执行交互动作的元素) */
14
+ ref?: number;
15
+ /** 关联的 DOM 元素实例 */
16
+ el: HTMLElement;
17
+ /** 包含的子节点列表 */
18
+ children: VNode[];
19
+ }
20
+ /**
21
+ * 构建无障碍树时的配置选项。
22
+ * 继承统一的 A11yConfig(角色/状态规则、白/黑名单、自定义暴露属性、弹窗选择器),
23
+ * 并额外提供两个控制树"形状"(而非无障碍语义)的选项。
24
+ */
25
+ export interface A11yTreeOptions extends A11yConfig {
26
+ /**
27
+ * 是否启用剪枝:无 ref 且无 accessible name 的节点透明穿透
28
+ * 默认 true(推荐)
29
+ */
30
+ pruneUnnamed?: boolean;
31
+ /**
32
+ * 强制保留的角色列表,即使无 name 也不穿透(优先级最高)
33
+ * 例如:['table', 'row'] 用于保留表格结构
34
+ */
35
+ preserveRoles?: string[];
36
+ }
37
+ /** 序列化 YAML 树时实际用到的形状选项(与无障碍语义解析无关,独立于 A11yConfig) */
38
+ export interface A11yTreeShapeOptions {
39
+ pruneUnnamed: boolean;
40
+ preserveRoles: string[];
41
+ }
42
+ /** 构建无障碍树的返回结果 */
43
+ export interface A11yTreeResult {
44
+ /** 语义化 YAML 文本(供 AI 阅读和 Diff 计算) */
45
+ yaml: string;
46
+ /** ref 索引 → HTMLElement 映射(供后续操作使用) */
47
+ refMap: RefMap;
48
+ /** 可交互元素总数 */
49
+ interactiveCount: number;
50
+ /** 原始行数组(不含 yaml 代码块包裹),供搜索使用 */
51
+ lines: string[];
52
+ }
53
+ /** 关键词搜索选项 */
54
+ export interface SearchA11yTreeOptions extends A11yTreeOptions {
55
+ /**
56
+ * 每个匹配行前后保留的上下文行数(类似 grep -C N)
57
+ * 默认 2
58
+ */
59
+ contextLines?: number;
60
+ /**
61
+ * 是否大小写不敏感,默认 true
62
+ */
63
+ caseInsensitive?: boolean;
64
+ /**
65
+ * 最大返回匹配分组数(防止命中过多撑爆上下文),默认 20
66
+ */
67
+ maxMatches?: number;
68
+ }
69
+ /** 单个搜索匹配的分组结构 */
70
+ export interface A11ySearchMatch {
71
+ /** 主命中行行号(1-based) */
72
+ lineNumber: number;
73
+ /** 主命中行内容 */
74
+ line: string;
75
+ /** 含上下文的行列表(带行号) */
76
+ context: Array<{
77
+ lineNumber: number;
78
+ line: string;
79
+ }>;
80
+ }
81
+ /** searchA11yTree 函数的返回结果 */
82
+ export interface SearchA11yTreeResult {
83
+ /** 格式化后可直接发给 LLM 的文本 */
84
+ text: string;
85
+ /** 结构化匹配列表 */
86
+ matches: A11ySearchMatch[];
87
+ /** 无障碍树总行数 */
88
+ totalLines: number;
89
+ /** 原始命中行数(去重前) */
90
+ matchCount: number;
91
+ /** 返回搜索时的 ref 映射 */
92
+ refMap: RefMap;
93
+ /** 返回搜索时的 yaml 状态,用于更新缓存 */
94
+ yaml: string;
95
+ }
@@ -0,0 +1,55 @@
1
+ import { ResolvedA11yConfig } from './config';
2
+
3
+ export declare function isNonContentElement(el: Element): boolean;
4
+ /**
5
+ * 判断元素是否"自身"呈现 cursor:pointer(而非从祖先继承而来)。
6
+ *
7
+ * 背景:CSS 的 `cursor` 属性会向子孙继承。可点击容器(如 <a>、自定义卡片 .card-wrapper)
8
+ * 一旦设置 cursor:pointer,其内部所有子孙的 computed cursor 都会变成 pointer。
9
+ * 若仅凭「computed cursor === pointer」判定交互性,会让容器的可点击性"传染"给全部子孙,
10
+ * 产生大量误报 ref(父容器 cursor:pointer 泛滥到每个子节点)。
11
+ *
12
+ * 业界主流 DOM 提取器(如 browser-use 的 doesElementHaveInteractivePointer)同样以
13
+ * cursor:pointer 作为可点击性的核心兜底信号,并通过与父元素对比来定位真正的可点击"边界元素"。
14
+ * 因此这里的判定为:元素自身 computed cursor 为 pointer,且其父元素不是 pointer —— 说明
15
+ * 该元素(或命中它的 CSS 规则)主动声明了指针手势,是真正意义上的可点击目标。
16
+ *
17
+ * 无父元素(如 shadow host 边界、游离节点)时,没有可继承来源,视为自身声明。
18
+ */
19
+ export declare function hasOwnPointerCursor(el: Element): boolean;
20
+ /**
21
+ * 收集页面中"仅在 :hover/:focus/:active 等交互态下声明 cursor:pointer"的元素集合。
22
+ *
23
+ * 背景(华为云控制台实测):大量可点击卡片(如 `.container-wrapper .shadow:hover{cursor:pointer}`)
24
+ * 只在鼠标悬停时才显示手势,静止态 `getComputedStyle(el).cursor` 读到的是 `auto`,
25
+ * 因此仅凭 computed cursor 的判定(含业界 getComputedStyle 方案)会漏判这类元素。
26
+ * 这里通过扫描样式表把这类"交互态手势"补齐,作为可点击性的兜底信号。
27
+ *
28
+ * 每次构建树只调用一次(O(规则数) 扫描 + 一次合并查询),避免逐元素扫描样式表。
29
+ */
30
+ export declare function collectHoverPointerElements(root: Element): Set<Element>;
31
+ /** 判断元素是否应被跳过(不可见、非内容或在黑名单中) */
32
+ export declare function isHidden(el: Element): boolean;
33
+ /**
34
+ * 收集元素自身或子孙节点的 title,用作图标按钮等无文本节点的名字兜底。
35
+ * 云控制台常见模式:可点击容器无 aria-label,title 挂在内部 span 上。
36
+ */
37
+ export declare function collectTitleLabel(el: Element): string;
38
+ /**
39
+ * 收集子孙节点的文本内容,用作无障碍名字的兜底。
40
+ * 当普通计算无法提取文本时,遍历后代并拼接可见文本。
41
+ * @param config 已规整的无障碍配置;传入后角色判断会尊重页面自定义 roles 规则
42
+ */
43
+ export declare function collectDescendantText(el: Element, config?: ResolvedA11yConfig): string;
44
+ /**
45
+ * 获取元素在 composed tree(组合树)中的有效子元素
46
+ *
47
+ * Shadow DOM 场景下,简单拼接 el.children + el.shadowRoot.children 不符合浏览器
48
+ * 实际渲染和无障碍树使用的组合树语义:slotted 节点应出现在 <slot> 的位置而非
49
+ * host 下,<slot> 本身不应作为噪音节点出现,未被任何 slot 接收的 light children
50
+ * 在组合树中不可见。
51
+ *
52
+ * 因此:有 shadowRoot 时遍历 shadow tree,遇到 <slot> 用 assignedElements 替换;
53
+ * 无 shadowRoot 时直接遍历 light DOM children。
54
+ */
55
+ export declare function getComposedChildren(el: Element): Element[];
@@ -0,0 +1,40 @@
1
+ import { VNode, RefMap, A11yTreeShapeOptions } from './types';
2
+ import { ResolvedA11yConfig } from './config';
3
+
4
+ /**
5
+ * 递归将 DOM 元素转换为 VNode 中间表示
6
+ * @param el 当前 DOM 元素
7
+ * @param refCounter 引用计数器(使用对象引用避免全局可变状态)
8
+ * @param refMap ref 索引 → 元素映射
9
+ * @param blacklistSet 已解析的黑名单元素集合
10
+ * @param whitelistSet 已解析的白名单元素集合
11
+ * @param config 已与默认值合并的统一无障碍配置
12
+ * @param hoverPointerSet 只在 :hover/:focus/:active 下声明 cursor:pointer 的元素集合(静止态读不到手势,靠样式表扫描兜底)
13
+ */
14
+ export declare function buildVNode(el: Element, refCounter: {
15
+ value: number;
16
+ }, refMap: RefMap, blacklistSet: Set<Element>, whitelistSet: Set<Element>, config: ResolvedA11yConfig, hoverPointerSet?: Set<Element>): VNode | null;
17
+ /**
18
+ * 判断 VNode 子树是否包含任何有价值的节点(有 ref 或有 accessible name)
19
+ * 用于过滤空容器子树,避免输出无内容的嵌套层级
20
+ */
21
+ export declare function hasValue(vnode: VNode): boolean;
22
+ /**
23
+ * 判断节点是否需要透明穿透(跳过本节点但保留子节点)
24
+ *
25
+ * 统一规则:无 ref(非交互)且无 accessible name → 穿透
26
+ * 这样可以同时:
27
+ * - 去掉 generic/list/listitem 等纯布局噪音(无 name 时穿透)
28
+ * - 保留有 name 的 listitem(有 name 时保留,兼顾内容理解场景)
29
+ */
30
+ export declare function shouldPassThrough(vnode: VNode, opts: A11yTreeShapeOptions): boolean;
31
+ /**
32
+ * 将 VNode 序列化为 YAML 行数组
33
+ * 穿透节点时,子节点在当前 depth 平铺输出(不增加缩进层级)
34
+ *
35
+ * 文本折叠规则(Static-Lift + Interactive-Keep,保字优先):
36
+ * 1. 子树全静态 → 省略子节点,文字保留在父节点
37
+ * 2. 混合子树 → 静态文案上提到父 name(成功才省略静态子节点);交互分支递归保留;
38
+ * 禁止把交互文案并入父 name;上提失败则静态子节点独立输出,绝不丢字
39
+ */
40
+ export declare function serializeVNode(vnode: VNode, depth: number, opts: A11yTreeShapeOptions): string[];
@@ -1,103 +1,13 @@
1
1
  /**
2
2
  * a11y-tree.ts
3
3
  *
4
- * 浏览器内语义化 ARIA 树生成器(重构版)
5
- *
6
- * 核心改进:
7
- * 1. 两阶段处理:buildVNode(构建中间树)→ serializeVNode(剪枝序列化)
8
- * 2. 统一剪枝规则:无 ref 且无 accessible name → 透明穿透(跳过本节点,保留子节点)
9
- * - 兼顾操作场景(去掉 generic/list/listitem 噪音)
10
- * - 兼顾内容理解场景(有 name 的 listitem 等节点保留)
11
- * 3. 修复全局可变状态:refCounter 改为局部对象,消除并发调用隐患
12
- *
13
- * 依赖:
14
- * - dom-accessibility-api: W3C AccName 规范 JS 实现(计算 accessible name)
15
- * - tabbable: 可交互/可聚焦元素检测(工业级,处理所有边界情况)
16
- */
17
- /** ref 索引 → HTMLElement 映射,供 click/fill/select 操作使用 */
18
- export type RefMap = Map<number, HTMLElement>;
19
- export interface A11yTreeOptions {
20
- /**
21
- * 是否启用剪枝:无 ref 且无 accessible name 的节点透明穿透
22
- * 默认 true(推荐)
23
- */
24
- pruneUnnamed?: boolean;
25
- /**
26
- * 强制保留的角色列表,即使无 name 也不穿透(优先级最高)
27
- * 例如:['table', 'row'] 用于保留表格结构
28
- */
29
- preserveRoles?: string[];
30
- }
31
- export interface A11yTreeResult {
32
- /** 语义化 YAML 文本(供 AI 阅读和 Diff 计算) */
33
- yaml: string;
34
- /** ref 索引 → HTMLElement 映射(供后续操作使用) */
35
- refMap: RefMap;
36
- /** 可交互元素总数 */
37
- interactiveCount: number;
38
- /** 原始行数组(不含 yaml 代码块包裹),供搜索使用 */
39
- lines: string[];
40
- }
41
- /** 关键词搜索选项 */
42
- export interface SearchA11yTreeOptions extends A11yTreeOptions {
43
- /**
44
- * 每个匹配行前后保留的上下文行数(类似 grep -C N)
45
- * 默认 2
46
- */
47
- contextLines?: number;
48
- /**
49
- * 是否大小写不敏感,默认 true
50
- */
51
- caseInsensitive?: boolean;
52
- /**
53
- * 最大返回匹配分组数(防止命中过多撑爆上下文),默认 20
54
- */
55
- maxMatches?: number;
56
- }
57
- /** 单个匹配分组 */
58
- export interface A11ySearchMatch {
59
- /** 主命中行行号(1-based) */
60
- lineNumber: number;
61
- /** 主命中行内容 */
62
- line: string;
63
- /** 含上下文的行列表(带行号) */
64
- context: Array<{
65
- lineNumber: number;
66
- line: string;
67
- }>;
68
- }
69
- /** searchA11yTree 返回值 */
70
- export interface SearchA11yTreeResult {
71
- /** 格式化后可直接发给 LLM 的文本 */
72
- text: string;
73
- /** 结构化匹配列表 */
74
- matches: A11ySearchMatch[];
75
- /** 无障碍树总行数 */
76
- totalLines: number;
77
- /** 原始命中行数(去重前) */
78
- matchCount: number;
79
- }
80
- /**
81
- * 生成当前页面的语义化 ARIA YAML 树
82
- *
83
- * @param root 遍历起点,默认 document.body
84
- * @param blacklist 需要跳过的元素(用户自定义黑名单)
85
- * @param whitelist 需要识别为可交互的白名单元素列表
86
- * @param options 过滤选项
87
- */
88
- export declare function buildA11yTree(root?: Element, blacklist?: Element[], whitelist?: Element[], options?: A11yTreeOptions): A11yTreeResult;
89
- /**
90
- * 在无障碍树中按关键词搜索,返回带行号的匹配结果和上下文
91
- *
92
- * 支持的搜索维度(均对同一个 query 字符串做包含匹配):
93
- * - role:如 `button`、`link`、`heading`
94
- * - accessible name:节点的语义化名称(引号内文本)
95
- * - state token:如 `checked`、`disabled`、`expanded`
96
- * - ref 索引:如 `#5`
97
- *
98
- * @example
99
- * searchA11yTree('button') // 找全部按钮
100
- * searchA11yTree('提交') // 找名称含"提交"的节点
101
- * searchA11yTree('#3') // 找 ref #3
4
+ * 此文件为 A11y Tree 模块的汇总出口,
5
+ * 方便外部直接从 './a11y-tree' 引入相关类型及方法,而无需调整现有的引用路径。
102
6
  */
103
- export declare function searchA11yTree(query: string, root?: Element, blacklist?: Element[], whitelist?: Element[], options?: SearchA11yTreeOptions): SearchA11yTreeResult;
7
+ export * from './a11y/types';
8
+ export * from './a11y/constants';
9
+ export * from './a11y/config';
10
+ export * from './a11y/utils';
11
+ export * from './a11y/vnode';
12
+ export * from './a11y/build';
13
+ export * from './a11y/search';
@@ -0,0 +1,6 @@
1
+ import { PageAgentToolOptions } from '../tool-config';
2
+
3
+ /** 云控制台 page-agent-tool 预设配置 */
4
+ export declare const consoleCloudPageAgentToolOptions: PageAgentToolOptions;
5
+ /** 判断当前页面是否应使用云控制台(consoleCloud)预设 */
6
+ export declare function isConsoleCloudHost(hostname?: string): boolean;
@@ -0,0 +1,10 @@
1
+ /** 校验错误默认选择器:ARIA 标准 + 主流 UI 框架(唯一来源为 a11y/constants.ts,此处重新导出保持旧路径可用) */
2
+ export { DEFAULT_ERROR_SELECTORS, DEFAULT_DIALOG_SELECTORS } from './a11y/constants';
3
+ /** registerPageAgentTool(options) 的入参类型,定义见 tool-config.ts(与运行期 setPageAgentToolConfig 的补丁类型一致) */
4
+ export type { PageAgentToolOptions } from './tool-config';
5
+ declare global {
6
+ interface Window {
7
+ /** 指定网站可覆盖该函数,在每次 getBrowserState 之前调用,常用于配合 setPageAgentToolConfig 动态调整当前页面的配置 */
8
+ __webmcpcli_beforeGetBrowserState?: (() => void) | null;
9
+ }
10
+ }
@@ -0,0 +1,40 @@
1
+ import { PageController } from '@page-agent/page-controller';
2
+ import { PageStateCache } from './page-state-cache';
3
+ import { RefMap } from './a11y-tree';
4
+
5
+ export type PageAgentToolContentResult = {
6
+ content: Array<{
7
+ type: 'text';
8
+ text: string;
9
+ }>;
10
+ };
11
+ export type PageAgentToolErrorResult = PageAgentToolContentResult & {
12
+ isError: true;
13
+ error: string;
14
+ };
15
+ export declare function createActionErrorResult(message: string, buildBrowserStateResponse: ActionContext['buildBrowserStateResponse']): Promise<PageAgentToolErrorResult>;
16
+ export interface ActionContext {
17
+ pageController: PageController;
18
+ stateCache: PageStateCache;
19
+ getRefMap: () => RefMap;
20
+ setRefMap: (map: RefMap) => void;
21
+ buildBrowserStateResponse: (mode?: 'full' | 'diff' | 'both') => Promise<{
22
+ content: Array<{
23
+ type: 'text';
24
+ text: string;
25
+ }>;
26
+ }>;
27
+ refreshOnStaleRef: (action: string, index: number) => Promise<{
28
+ content: Array<{
29
+ type: 'text';
30
+ text: string;
31
+ }>;
32
+ }>;
33
+ errContent: (msg: string) => Promise<{
34
+ content: Array<{
35
+ type: 'text';
36
+ text: string;
37
+ }>;
38
+ }>;
39
+ actionError: (msg: string) => Promise<PageAgentToolErrorResult>;
40
+ }
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleBrowserState(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleClick(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleExecuteJavascript(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleFill(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleScroll(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,9 @@
1
+ import { ActionContext } from '../context';
2
+ import { PageAgentToolInput } from '../schema';
3
+
4
+ export declare function handleSearchTree(args: PageAgentToolInput, ctx: ActionContext): Promise<{
5
+ content: Array<{
6
+ type: "text";
7
+ text: string;
8
+ }>;
9
+ }>;
@@ -0,0 +1,8 @@
1
+ import { ActionContext } from '../context';
2
+
3
+ export declare function handleSelect(args: any, ctx: ActionContext): Promise<{
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ }>;
@@ -0,0 +1,21 @@
1
+ import { RefMap } from '../a11y-tree';
2
+
3
+ export declare const HIGHLIGHT_CONTAINER_ID = "webmcpcli-highlight-container";
4
+ export declare const HIGHLIGHT_CONTAINER_STYLE_ID = "webmcpcli-highlight-container-style";
5
+ export type HighlightRect = {
6
+ top: number;
7
+ left: number;
8
+ width: number;
9
+ height: number;
10
+ };
11
+ /**
12
+ * 解析高亮矩形。
13
+ * Tiny3 `ti-icon` / `tp-icon` 字形常画在 ::before 上,宿主 getBoundingClientRect 宽或高为 0,
14
+ * 旧逻辑直接跳过导致帮助中心关闭/全屏等图标有 ref 却不高亮。
15
+ */
16
+ export declare function resolveHighlightRect(el: HTMLElement): HighlightRect | null;
17
+ export declare const highlight: (refMap: RefMap, parentIframe?: HTMLIFrameElement | null) => void;
18
+ /** 移除高亮, 可反复调用 */
19
+ export declare const unhighlight: () => void;
20
+ /** 全局监听变化,随时准备移除高亮, 可反复调用 */
21
+ export declare const globalRemoveListener: () => void;
@@ -0,0 +1,16 @@
1
+ import { Motion } from 'ai-motion';
2
+
3
+ export declare class SimulatorMask extends EventTarget {
4
+ #private;
5
+ shown: boolean;
6
+ wrapper: HTMLDivElement;
7
+ motion: Motion | null;
8
+ constructor();
9
+ setCursorPosition(x: number, y: number): void;
10
+ triggerClickAnimation(): void;
11
+ show(): void;
12
+ hide(): void;
13
+ dispose(): void;
14
+ borderElement(targetElement: HTMLElement): void;
15
+ removeBorderElement(): void;
16
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * A comprehensive function to determine if the page is currently in a dark theme.
3
+ * Heuristic check. Only work for common patterns. Return false by default.
4
+ */
5
+ export declare function isPageDark(): boolean;
@@ -0,0 +1,26 @@
1
+ import { PageAgentToolInput, PageAgentToolRawInput } from './schema';
2
+ import { PageController } from '@page-agent/page-controller';
3
+
4
+ export declare const PAGE_AGENT_TOOL_CALL_EVENT = "page-agent-tool-call";
5
+ export declare const PAGE_AGENT_TOOL_RESULT_EVENT = "page-agent-tool-result";
6
+ export declare const PAGE_AGENT_CHAT_END_EVENT = "page-agent-chat-end";
7
+ export type PageAgentToolCallEventDetail = {
8
+ data?: PageAgentToolRawInput;
9
+ requestId: string;
10
+ };
11
+ export type PageAgentToolResultEventDetail = {
12
+ data: {
13
+ success: boolean;
14
+ result?: unknown;
15
+ error?: string;
16
+ };
17
+ requestId: string;
18
+ };
19
+ type ExecutePageAgentTool = (data: PageAgentToolInput) => Promise<unknown>;
20
+ declare global {
21
+ interface Window {
22
+ __nextSdkPageAgentToolEventCleanup?: () => void;
23
+ }
24
+ }
25
+ export declare function setupPageAgentToolEventBridge(executePageAgentTool: ExecutePageAgentTool, pageController: PageController): void;
26
+ export {};