@chen-rmag/ai-runner 0.1.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.
Files changed (102) hide show
  1. package/README.md +263 -0
  2. package/SUMMARY_USAGE.md +359 -0
  3. package/TOOLS_INTEGRATION_SUMMARY.md +206 -0
  4. package/dist/agents/error-analyzer.d.ts +62 -0
  5. package/dist/agents/error-analyzer.d.ts.map +1 -0
  6. package/dist/agents/error-analyzer.js +168 -0
  7. package/dist/agents/error-analyzer.js.map +1 -0
  8. package/dist/agents/heal-agent.d.ts +30 -0
  9. package/dist/agents/heal-agent.d.ts.map +1 -0
  10. package/dist/agents/heal-agent.js +76 -0
  11. package/dist/agents/heal-agent.js.map +1 -0
  12. package/dist/agents/healer.d.ts +73 -0
  13. package/dist/agents/healer.d.ts.map +1 -0
  14. package/dist/agents/healer.js +538 -0
  15. package/dist/agents/healer.js.map +1 -0
  16. package/dist/agents/langgraph-agent.d.ts +44 -0
  17. package/dist/agents/langgraph-agent.d.ts.map +1 -0
  18. package/dist/agents/langgraph-agent.js +328 -0
  19. package/dist/agents/langgraph-agent.js.map +1 -0
  20. package/dist/agents/react-agent.d.ts +52 -0
  21. package/dist/agents/react-agent.d.ts.map +1 -0
  22. package/dist/agents/react-agent.js +262 -0
  23. package/dist/agents/react-agent.js.map +1 -0
  24. package/dist/agents/tools/form.d.ts +22 -0
  25. package/dist/agents/tools/form.d.ts.map +1 -0
  26. package/dist/agents/tools/form.js +134 -0
  27. package/dist/agents/tools/form.js.map +1 -0
  28. package/dist/agents/tools/index.d.ts +13 -0
  29. package/dist/agents/tools/index.d.ts.map +1 -0
  30. package/dist/agents/tools/index.js +33 -0
  31. package/dist/agents/tools/index.js.map +1 -0
  32. package/dist/agents/tools/navigate.d.ts +22 -0
  33. package/dist/agents/tools/navigate.d.ts.map +1 -0
  34. package/dist/agents/tools/navigate.js +74 -0
  35. package/dist/agents/tools/navigate.js.map +1 -0
  36. package/dist/agents/tools/snapshot.d.ts +22 -0
  37. package/dist/agents/tools/snapshot.d.ts.map +1 -0
  38. package/dist/agents/tools/snapshot.js +110 -0
  39. package/dist/agents/tools/snapshot.js.map +1 -0
  40. package/dist/agents/tools/verify.d.ts +34 -0
  41. package/dist/agents/tools/verify.d.ts.map +1 -0
  42. package/dist/agents/tools/verify.js +169 -0
  43. package/dist/agents/tools/verify.js.map +1 -0
  44. package/dist/agents/tools/wait.d.ts +22 -0
  45. package/dist/agents/tools/wait.d.ts.map +1 -0
  46. package/dist/agents/tools/wait.js +104 -0
  47. package/dist/agents/tools/wait.js.map +1 -0
  48. package/dist/agents/types.d.ts +51 -0
  49. package/dist/agents/types.d.ts.map +1 -0
  50. package/dist/agents/types.js +6 -0
  51. package/dist/agents/types.js.map +1 -0
  52. package/dist/core/ai-heal.d.ts +89 -0
  53. package/dist/core/ai-heal.d.ts.map +1 -0
  54. package/dist/core/ai-heal.js +468 -0
  55. package/dist/core/ai-heal.js.map +1 -0
  56. package/dist/core/execution-engine.d.ts +16 -0
  57. package/dist/core/execution-engine.d.ts.map +1 -0
  58. package/dist/core/execution-engine.js +44 -0
  59. package/dist/core/execution-engine.js.map +1 -0
  60. package/dist/core/runner.d.ts +195 -0
  61. package/dist/core/runner.d.ts.map +1 -0
  62. package/dist/core/runner.js +658 -0
  63. package/dist/core/runner.js.map +1 -0
  64. package/dist/index.d.ts +8 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +11 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/types/external.d.ts +6 -0
  69. package/dist/types/external.d.ts.map +1 -0
  70. package/dist/types/external.js +7 -0
  71. package/dist/types/external.js.map +1 -0
  72. package/dist/types/index.d.ts +153 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +26 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/object-registry.d.ts +48 -0
  77. package/dist/utils/object-registry.d.ts.map +1 -0
  78. package/dist/utils/object-registry.js +133 -0
  79. package/dist/utils/object-registry.js.map +1 -0
  80. package/package.json +37 -0
  81. package/playwright.config.ts +38 -0
  82. package/src/agents/heal-agent.ts +85 -0
  83. package/src/agents/healer.ts +619 -0
  84. package/src/agents/tools/EXAMPLES.md +347 -0
  85. package/src/agents/tools/README.md +207 -0
  86. package/src/agents/tools/form.ts +138 -0
  87. package/src/agents/tools/index.ts +29 -0
  88. package/src/agents/tools/navigate.ts +69 -0
  89. package/src/agents/tools/snapshot.ts +109 -0
  90. package/src/agents/tools/verify.ts +168 -0
  91. package/src/agents/tools/wait.ts +103 -0
  92. package/src/agents/types.ts +79 -0
  93. package/src/core/runner.ts +756 -0
  94. package/src/index.ts +29 -0
  95. package/src/types/external.ts +7 -0
  96. package/src/types/index.ts +200 -0
  97. package/tests/agent/test-heal-agent.spec.ts +81 -0
  98. package/tests/tools/README.md +227 -0
  99. package/tests/tools/TEST_SUMMARY.md +214 -0
  100. package/tests/tools/quick-test.ts +88 -0
  101. package/tests/tools/tools.test.ts +491 -0
  102. package/tsconfig.json +22 -0
@@ -0,0 +1,206 @@
1
+ # Healer 工具集成完成总结
2
+
3
+ ## 概述
4
+ 成功将标准化的 Playwright MCP 工具集成到 Healer 类中,替换了原有的自定义工具实现。
5
+
6
+ ## 主要改动
7
+
8
+ ### 1. Healer.ts 更新
9
+ **文件**: [src/agents/healer.ts](src/agents/healer.ts)
10
+
11
+ #### 导入新工具模块
12
+ ```typescript
13
+ import { getAllTools } from './tools';
14
+ ```
15
+
16
+ #### 替换 `createPlaywrightTools` 函数
17
+ - **旧实现**: 包含 10 个自定义工具(click, fill, wait_for_selector 等)
18
+ - **新实现**:
19
+ - 使用 `getAllTools(page)` 获取 18 个标准化工具
20
+ - 保留 Healer 特有的 `set_variable` 工具
21
+ - 总计 19 个工具(18 个标准工具 + 1 个自定义工具)
22
+
23
+ #### 工具对比
24
+
25
+ | 旧工具名称 | 新工具名称 | 说明 |
26
+ |-----------|-----------|------|
27
+ | click | browser_click | ✅ 功能增强 |
28
+ | fill | browser_fill | ✅ 支持 JSON 格式 |
29
+ | wait_for_selector | browser_wait_for_selector | ✅ 功能增强 |
30
+ | wait | browser_wait_for_time | ✅ 重命名 |
31
+ | screenshot | browser_screenshot | ✅ 保持一致 |
32
+ | get_url | browser_get_url | ✅ 保持一致 |
33
+ | get_content | browser_get_content | ✅ 保持一致 |
34
+ | evaluate | ❌ 移除 | 使用 browser_snapshot 替代 |
35
+ | get_text | browser_get_text | ✅ 保持一致 |
36
+ | set_variable | set_variable | ✅ 保留 |
37
+
38
+ #### 新增工具
39
+ - `browser_navigate` - 导航到 URL
40
+ - `browser_navigate_back` - 后退
41
+ - `browser_navigate_forward` - 前进
42
+ - `browser_hover` - 鼠标悬停
43
+ - `browser_select_option` - 选择下拉选项
44
+ - `browser_set_checked` - 勾选/取消复选框
45
+ - `browser_wait_for_url` - 等待 URL 匹配
46
+ - `browser_verify_text` - 验证文本可见性
47
+ - `browser_verify_element` - 验证元素存在
48
+ - `browser_snapshot` - 获取页面可访问性快照
49
+
50
+ ### 2. 系统提示词更新
51
+ - 从中文改为英文(与工具名称保持一致)
52
+ - 更新工具列表,反映新的工具名称和用法
53
+ - 添加工具分类(导航、交互、等待、验证、变量管理)
54
+ - 更新策略提示,使用新的工具名称
55
+
56
+ ### 3. 用户消息更新
57
+ - 从中文改为英文
58
+ - 保持结构一致
59
+
60
+ ## 测试验证
61
+
62
+ ### 单元测试
63
+ ✅ **21/21 tests passing** (50.2s)
64
+ - [tests/tools/unit.test.ts](tests/tools/unit.test.ts)
65
+ - 覆盖所有 18 个标准工具的功能
66
+
67
+ ### 集成测试
68
+ ✅ **3/3 tests passing** (3.1s)
69
+ - [tests/healer-tool-integration.spec.ts](tests/healer-tool-integration.spec.ts)
70
+ - 验证 Healer 类正确使用新工具
71
+ - 验证工具数量和命名
72
+
73
+ ### 快速验证
74
+ ✅ 所有工具功能正常
75
+ - 18 个标准工具
76
+ - 1 个自定义 set_variable 工具
77
+
78
+ ## 工具特性增强
79
+
80
+ ### 1. 多选择器支持
81
+ 所有交互工具现在支持逗号分隔的多个选择器:
82
+ ```typescript
83
+ browser_click("button, #submit, .btn-primary")
84
+ ```
85
+
86
+ ### 2. 智能元素匹配
87
+ 工具会自动尝试多种选择器策略:
88
+ - 文本选择器(`getByText()`)
89
+ - 标签选择器(`getByLabel()`)
90
+ - 占位符选择器(`getByPlaceholder()`)
91
+ - CSS 选择器
92
+
93
+ ### 3. JSON 输入格式
94
+ 复杂参数使用 JSON 格式:
95
+ ```typescript
96
+ browser_fill('{"selector": "#username", "value": "john"}')
97
+ browser_set_checked('{"selector": "#remember", "checked": true}')
98
+ ```
99
+
100
+ ### 4. 更好的错误处理
101
+ - 每个工具都有详细的错误消息
102
+ - 支持多选择器自动降级
103
+ - 超时控制和重试机制
104
+
105
+ ## 向后兼容性
106
+
107
+ ### 保留功能
108
+ ✅ `set_variable` 工具完全保留
109
+ ✅ Healer 类的公共接口不变
110
+ ✅ 状态管理和 ReAct 步骤记录功能不变
111
+
112
+ ### 移除功能
113
+ ❌ `evaluate` 工具(使用 `browser_snapshot` 替代)
114
+
115
+ ### 需要注意
116
+ - 工具名称从简短名称改为带 `browser_` 前缀的描述性名称
117
+ - 系统提示词从中文改为英文
118
+ - 某些工具的输入格式改变(如 `browser_fill` 使用 JSON)
119
+
120
+ ## 使用示例
121
+
122
+ ### 在 Healer 中使用
123
+ ```typescript
124
+ import { Healer } from './agents/healer';
125
+
126
+ const healer = new Healer({
127
+ provider: 'anthropic',
128
+ modelName: 'claude-3-5-sonnet-20241022',
129
+ apiKey: process.env.ANTHROPIC_API_KEY!,
130
+ temperature: 0,
131
+ maxTokens: 4096
132
+ }, {
133
+ maxSteps: 20,
134
+ debugMode: true
135
+ });
136
+
137
+ const result = await healer.execute({
138
+ objective: 'Click the submit button',
139
+ error: 'Element not found: #submit-btn',
140
+ originalCode: 'await page.click("#submit-btn");',
141
+ variables: {},
142
+ context: { page }
143
+ });
144
+ ```
145
+
146
+ ### 直接使用工具
147
+ ```typescript
148
+ import { getAllTools } from './agents/tools';
149
+
150
+ const tools = getAllTools(page);
151
+
152
+ // 使用导航工具
153
+ const navigateTool = tools.find(t => t.name === 'browser_navigate');
154
+ await navigateTool!.invoke('https://example.com');
155
+
156
+ // 使用点击工具
157
+ const clickTool = tools.find(t => t.name === 'browser_click');
158
+ await clickTool!.invoke('button, #submit, .btn-primary');
159
+
160
+ // 使用表单填写
161
+ const fillTool = tools.find(t => t.name === 'browser_fill');
162
+ await fillTool!.invoke('{"selector": "#username", "value": "john"}');
163
+ ```
164
+
165
+ ## 文件结构
166
+
167
+ ```
168
+ ai-heal/
169
+ ├── src/
170
+ │ └── agents/
171
+ │ ├── healer.ts # ✅ 更新:使用新工具
172
+ │ └── tools/
173
+ │ ├── index.ts # 工具导出
174
+ │ ├── navigate.ts # 导航工具
175
+ │ ├── snapshot.ts # 快照和交互工具
176
+ │ ├── form.ts # 表单工具
177
+ │ ├── wait.ts # 等待工具
178
+ │ ├── verify.ts # 验证工具
179
+ │ ├── README.md # 工具文档
180
+ │ └── EXAMPLES.md # 使用示例
181
+ └── tests/
182
+ ├── tools/
183
+ │ ├── unit.test.ts # ✅ 单元测试(21 passed)
184
+ │ ├── quick-test.ts # 快速验证脚本
185
+ │ └── TEST_SUMMARY.md # 测试总结
186
+ └── healer-tool-integration.spec.ts # ✅ 集成测试(3 passed)
187
+ ```
188
+
189
+ ## 下一步
190
+
191
+ 工具集成已完成,Healer 类现在使用标准化的 Playwright MCP 工具。可以考虑:
192
+
193
+ 1. 在实际的自愈场景中测试新工具
194
+ 2. 根据使用反馈调整工具描述和行为
195
+ 3. 添加更多测试用例覆盖边界情况
196
+ 4. 优化工具性能和错误处理
197
+
198
+ ## 总结
199
+
200
+ ✅ **工具集成成功完成**
201
+ - 18 个标准化工具已集成到 Healer 类
202
+ - 保留了 Healer 特有的 `set_variable` 工具
203
+ - 所有测试通过(24/24)
204
+ - TypeScript 编译无错误
205
+ - 工具功能增强(多选择器、智能匹配、JSON 格式)
206
+ - 代码结构更清晰、更易维护
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 错误分析器
3
+ * 判断错误是否可自愈
4
+ */
5
+ export declare enum ErrorType {
6
+ Timeout = "TimeoutError",
7
+ Selector = "SelectorError",
8
+ ElementNotFound = "ElementNotFoundError",
9
+ StaleElement = "StaleElementError",
10
+ Navigation = "NavigationError",
11
+ Assertion = "AssertionError",
12
+ Network = "NetworkError",
13
+ Script = "ScriptError",
14
+ Unknown = "UnknownError"
15
+ }
16
+ /**
17
+ * 错误分析结果
18
+ */
19
+ export interface ErrorAnalysis {
20
+ type: ErrorType;
21
+ isHealable: boolean;
22
+ reason: string;
23
+ confidence: number;
24
+ }
25
+ /**
26
+ * 错误分析器
27
+ */
28
+ export declare class ErrorAnalyzer {
29
+ /**
30
+ * 分析错误是否可自愈
31
+ */
32
+ static analyze(error: Error): ErrorAnalysis;
33
+ /**
34
+ * 判断是否是超时错误
35
+ */
36
+ private static isTimeoutError;
37
+ /**
38
+ * 判断是否是选择器错误
39
+ */
40
+ private static isSelectorError;
41
+ /**
42
+ * 判断是否是元素未找到错误
43
+ */
44
+ private static isElementNotFoundError;
45
+ /**
46
+ * 判断是否是过时元素错误
47
+ */
48
+ private static isStaleElementError;
49
+ /**
50
+ * 判断是否是断言错误
51
+ */
52
+ private static isAssertionError;
53
+ /**
54
+ * 判断是否是网络错误
55
+ */
56
+ private static isNetworkError;
57
+ /**
58
+ * 判断是否是脚本错误
59
+ */
60
+ private static isScriptError;
61
+ }
62
+ //# sourceMappingURL=error-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-analyzer.d.ts","sourceRoot":"","sources":["../../src/agents/error-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,SAAS;IAEnB,OAAO,iBAAiB;IACxB,QAAQ,kBAAkB;IAC1B,eAAe,yBAAyB;IACxC,YAAY,sBAAsB;IAClC,UAAU,oBAAoB;IAG9B,SAAS,mBAAmB;IAC5B,OAAO,iBAAiB;IACxB,MAAM,gBAAgB;IACtB,OAAO,iBAAiB;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa;IAmF3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAS9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAQrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAQlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAS/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;CAS7B"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * 错误分析器
4
+ * 判断错误是否可自愈
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ErrorAnalyzer = exports.ErrorType = void 0;
8
+ var ErrorType;
9
+ (function (ErrorType) {
10
+ // 可自愈的错误
11
+ ErrorType["Timeout"] = "TimeoutError";
12
+ ErrorType["Selector"] = "SelectorError";
13
+ ErrorType["ElementNotFound"] = "ElementNotFoundError";
14
+ ErrorType["StaleElement"] = "StaleElementError";
15
+ ErrorType["Navigation"] = "NavigationError";
16
+ // 不可自愈的错误
17
+ ErrorType["Assertion"] = "AssertionError";
18
+ ErrorType["Network"] = "NetworkError";
19
+ ErrorType["Script"] = "ScriptError";
20
+ ErrorType["Unknown"] = "UnknownError";
21
+ })(ErrorType || (exports.ErrorType = ErrorType = {}));
22
+ /**
23
+ * 错误分析器
24
+ */
25
+ class ErrorAnalyzer {
26
+ /**
27
+ * 分析错误是否可自愈
28
+ */
29
+ static analyze(error) {
30
+ const message = error.message.toLowerCase();
31
+ const stack = error.stack?.toLowerCase() || '';
32
+ // 检查是否是超时错误
33
+ if (this.isTimeoutError(message, stack)) {
34
+ return {
35
+ type: ErrorType.Timeout,
36
+ isHealable: true,
37
+ reason: '元素加载超时,可以通过等待或重试修复',
38
+ confidence: 0.9
39
+ };
40
+ }
41
+ // 检查是否是选择器错误
42
+ if (this.isSelectorError(message, stack)) {
43
+ return {
44
+ type: ErrorType.Selector,
45
+ isHealable: true,
46
+ reason: '选择器找不到元素,可以通过更新选择器修复',
47
+ confidence: 0.95
48
+ };
49
+ }
50
+ // 检查是否是元素未找到错误
51
+ if (this.isElementNotFoundError(message, stack)) {
52
+ return {
53
+ type: ErrorType.ElementNotFound,
54
+ isHealable: true,
55
+ reason: '元素未找到,可以通过等待或更新定位器修复',
56
+ confidence: 0.9
57
+ };
58
+ }
59
+ // 检查是否是过时元素错误
60
+ if (this.isStaleElementError(message, stack)) {
61
+ return {
62
+ type: ErrorType.StaleElement,
63
+ isHealable: true,
64
+ reason: '元素已过时,可以通过重新获取元素修复',
65
+ confidence: 0.95
66
+ };
67
+ }
68
+ // 检查是否是断言错误(不可自愈)
69
+ if (this.isAssertionError(message, stack)) {
70
+ return {
71
+ type: ErrorType.Assertion,
72
+ isHealable: false,
73
+ reason: '断言失败,这可能是业务逻辑问题,不建议自愈',
74
+ confidence: 0.95
75
+ };
76
+ }
77
+ // 检查是否是网络错误(不可自愈)
78
+ if (this.isNetworkError(message, stack)) {
79
+ return {
80
+ type: ErrorType.Network,
81
+ isHealable: false,
82
+ reason: '网络错误,通常是环境问题,不建议自愈',
83
+ confidence: 0.8
84
+ };
85
+ }
86
+ // 检查是否是脚本错误(不可自愈)
87
+ if (this.isScriptError(message, stack)) {
88
+ return {
89
+ type: ErrorType.Script,
90
+ isHealable: false,
91
+ reason: '脚本语法错误,需要人工修复',
92
+ confidence: 0.95
93
+ };
94
+ }
95
+ // 未知错误
96
+ return {
97
+ type: ErrorType.Unknown,
98
+ isHealable: false,
99
+ reason: '未知错误类型,建议人工检查',
100
+ confidence: 0.5
101
+ };
102
+ }
103
+ /**
104
+ * 判断是否是超时错误
105
+ */
106
+ static isTimeoutError(message, stack) {
107
+ return (message.includes('timeout') ||
108
+ message.includes('timed out') ||
109
+ message.includes('waiting failed') ||
110
+ stack.includes('timeout'));
111
+ }
112
+ /**
113
+ * 判断是否是选择器错误
114
+ */
115
+ static isSelectorError(message, stack) {
116
+ return (message.includes('selector') ||
117
+ message.includes('not found') ||
118
+ message.includes('no element matching') ||
119
+ message.includes('failed to find element'));
120
+ }
121
+ /**
122
+ * 判断是否是元素未找到错误
123
+ */
124
+ static isElementNotFoundError(message, stack) {
125
+ return (message.includes('element not found') ||
126
+ message.includes('cannot find element') ||
127
+ message.includes('visible check failed'));
128
+ }
129
+ /**
130
+ * 判断是否是过时元素错误
131
+ */
132
+ static isStaleElementError(message, stack) {
133
+ return (message.includes('stale') ||
134
+ message.includes('detached') ||
135
+ message.includes('not attached to the DOM'));
136
+ }
137
+ /**
138
+ * 判断是否是断言错误
139
+ */
140
+ static isAssertionError(message, stack) {
141
+ return (message.includes('assert') ||
142
+ message.includes('expect') ||
143
+ stack.includes('assert') ||
144
+ stack.includes('expect'));
145
+ }
146
+ /**
147
+ * 判断是否是网络错误
148
+ */
149
+ static isNetworkError(message, stack) {
150
+ return (message.includes('network') ||
151
+ message.includes('connection') ||
152
+ message.includes('fetch failed') ||
153
+ message.includes('net::'));
154
+ }
155
+ /**
156
+ * 判断是否是脚本错误
157
+ */
158
+ static isScriptError(message, stack) {
159
+ return (message.includes('syntaxerror') ||
160
+ message.includes('referenceerror') ||
161
+ message.includes('typeerror') &&
162
+ !message.includes('timeout') && // 排除超时错误
163
+ !message.includes('stale') // 排除过时元素错误
164
+ );
165
+ }
166
+ }
167
+ exports.ErrorAnalyzer = ErrorAnalyzer;
168
+ //# sourceMappingURL=error-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-analyzer.js","sourceRoot":"","sources":["../../src/agents/error-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 自愈 Agent
3
+ * 使用 LangChain 的 Healer 执行 ReAct 循环
4
+ */
5
+ import type { HealAgentState, HealAgentResult, HealAgentConfig } from './types';
6
+ /**
7
+ * 自愈 Agent
8
+ * 使用 LLM + ReAct 循环实现智能自愈
9
+ */
10
+ export declare class HealAgent {
11
+ private config;
12
+ private healer?;
13
+ constructor(config?: HealAgentConfig);
14
+ /**
15
+ * 执行自愈
16
+ *
17
+ * 使用 Healer 通过 ReAct 循环执行自愈任务
18
+ * - Thought: 分析错误和目标
19
+ * - Action: 调用 Playwright 工具执行操作
20
+ * - Observation: 观察工具执行结果
21
+ * - Reflection: 判断是否继续或结束
22
+ * - 循环直到成功或达到最大步数
23
+ */
24
+ heal(state: HealAgentState): Promise<HealAgentResult>;
25
+ /**
26
+ * 日志输出
27
+ */
28
+ private log;
29
+ }
30
+ //# sourceMappingURL=heal-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heal-agent.d.ts","sourceRoot":"","sources":["../../src/agents/heal-agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGhF;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,GAAE,eAAoB;IAoBxC;;;;;;;;;OASG;IACG,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IA8B3D;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * 自愈 Agent
4
+ * 使用 LangChain 的 Healer 执行 ReAct 循环
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.HealAgent = void 0;
8
+ const healer_1 = require("./healer");
9
+ /**
10
+ * 自愈 Agent
11
+ * 使用 LLM + ReAct 循环实现智能自愈
12
+ */
13
+ class HealAgent {
14
+ constructor(config = {}) {
15
+ this.config = {
16
+ maxSteps: config.maxSteps ?? 20,
17
+ debugMode: config.debugMode ?? false,
18
+ model: config.model,
19
+ setVariable: config.setVariable,
20
+ getAllVariables: config.getAllVariables
21
+ };
22
+ // 如果提供了模型配置,初始化 Healer
23
+ if (this.config.model) {
24
+ this.healer = new healer_1.Healer(this.config.model, {
25
+ maxSteps: this.config.maxSteps,
26
+ debugMode: this.config.debugMode,
27
+ setVariable: this.config.setVariable,
28
+ getAllVariables: this.config.getAllVariables
29
+ });
30
+ }
31
+ }
32
+ /**
33
+ * 执行自愈
34
+ *
35
+ * 使用 Healer 通过 ReAct 循环执行自愈任务
36
+ * - Thought: 分析错误和目标
37
+ * - Action: 调用 Playwright 工具执行操作
38
+ * - Observation: 观察工具执行结果
39
+ * - Reflection: 判断是否继续或结束
40
+ * - 循环直到成功或达到最大步数
41
+ */
42
+ async heal(state) {
43
+ this.log('[HealAgent] ========== 开始自愈流程 ==========');
44
+ this.log(`[HealAgent] 目标: ${state.objective}`);
45
+ this.log(`[HealAgent] 错误: ${state.error}`);
46
+ this.log(`[HealAgent] 最大步数: ${state.maxSteps || this.config.maxSteps}`);
47
+ this.log(`[HealAgent] 模式: ${this.healer ? 'LLM Healer' : '未配置'}`);
48
+ if (!this.healer) {
49
+ const errorMsg = 'Healer 未初始化,请提供 model 配置';
50
+ this.log(`[HealAgent] ❌ ${errorMsg}`);
51
+ return {
52
+ success: false,
53
+ errorMessage: errorMsg,
54
+ reasoning: '未配置模型,无法执行自愈',
55
+ steps: 0,
56
+ updatedVariables: {}
57
+ };
58
+ }
59
+ this.log('[HealAgent] 使用 Healer(LLM Agent)');
60
+ const result = await this.healer.execute(state);
61
+ this.log(`[HealAgent] 执行结果: ${result.success ? '成功 ✅' : '失败 ❌'}`);
62
+ this.log(`[HealAgent] 执行步数: ${result.steps}`);
63
+ this.log('[HealAgent] ========== 自愈流程结束 ==========\n');
64
+ return result;
65
+ }
66
+ /**
67
+ * 日志输出
68
+ */
69
+ log(message) {
70
+ if (this.config.debugMode) {
71
+ console.log(message);
72
+ }
73
+ }
74
+ }
75
+ exports.HealAgent = HealAgent;
76
+ //# sourceMappingURL=heal-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heal-agent.js","sourceRoot":"","sources":["../../src/agents/heal-agent.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAAkC;AAElC;;;GAGG;AACH,MAAa,SAAS;IAIpB,YAAY,SAA0B,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC,CAAC;QAEF,uBAAuB;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CAAC,KAAqB;QAC9B,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAElE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,0BAA0B,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YAEtC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,QAAQ;gBACtB,SAAS,EAAE,cAAc;gBACzB,KAAK,EAAE,CAAC;gBACR,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAEvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,GAAG,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAxED,8BAwEC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Healer - 测试自愈代理
3
+ * 使用 LangChain 的 createAgent API 实现 ReAct 循环
4
+ *
5
+ * 参考:https://www.npmjs.com/package/langchain
6
+ */
7
+ import type { HealAgentState, HealAgentResult } from './types';
8
+ import type { ModelConfig } from '../types/external';
9
+ export declare class Healer {
10
+ private modelConfig;
11
+ private maxSteps;
12
+ private debugMode;
13
+ private reactSteps;
14
+ private setVariableCallback?;
15
+ private getAllVariablesCallback?;
16
+ constructor(modelConfig: ModelConfig, config?: {
17
+ maxSteps?: number;
18
+ debugMode?: boolean;
19
+ setVariable?: (name: string, value: any) => void;
20
+ getAllVariables?: () => Record<string, any>;
21
+ });
22
+ /**
23
+ * 默认的 setVariable 方法(当没有提供回调时使用)
24
+ */
25
+ private defaultSetVariable;
26
+ /**
27
+ * 默认的 getAllVariables 方法(当没有提供回调时使用)
28
+ */
29
+ private defaultGetAllVariables;
30
+ /**
31
+ * 执行自愈(使用 LangChain createAgent API)
32
+ */
33
+ execute(state: HealAgentState): Promise<HealAgentResult>;
34
+ /**
35
+ * 记录 Thought 步骤
36
+ */
37
+ private recordThoughtStep;
38
+ /**
39
+ * 记录 Action 步骤
40
+ */
41
+ private recordActionStep;
42
+ /**
43
+ * 记录 Observation 步骤
44
+ */
45
+ private recordObservationStep;
46
+ /**
47
+ * 创建带日志输出的 Playwright 工具
48
+ */
49
+ private createPlaywrightToolsWithLogging;
50
+ /**
51
+ * 创建 LLM 实例
52
+ */
53
+ private createLLM;
54
+ /**
55
+ * 构建系统提示
56
+ */
57
+ private buildSystemPrompt;
58
+ /**
59
+ * 构建用户消息
60
+ */
61
+ private buildUserMessage;
62
+ /**
63
+ * 判断是否成功
64
+ * TODO: 后续优化成功判断逻辑,支持更多场景
65
+ */
66
+ private isSuccess;
67
+ /**
68
+ * 提取推理过程
69
+ * TODO: 后续优化推理过程提取,支持更详细的分析
70
+ */
71
+ private extractReasoning;
72
+ }
73
+ //# sourceMappingURL=healer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healer.d.ts","sourceRoot":"","sources":["../../src/agents/healer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyDrD,qBAAa,MAAM;IACjB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,mBAAmB,CAAC,CAAqC;IACjE,OAAO,CAAC,uBAAuB,CAAC,CAA4B;gBAEhD,WAAW,EAAE,WAAW,EAAE,MAAM,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAO;IAQ5L;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAoK9D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA8CxC;;OAEG;IACH,OAAO,CAAC,SAAS;IA4BjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkFzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;OAGG;IACH,OAAO,CAAC,SAAS;IA6BjB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAmEzB"}