@cotestdev/ai-runner 0.0.1

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 (214) hide show
  1. package/README.md +263 -0
  2. package/dist/agents/heal-agent.d.ts +30 -0
  3. package/dist/agents/heal-agent.d.ts.map +1 -0
  4. package/dist/agents/heal-agent.js +76 -0
  5. package/dist/agents/heal-agent.js.map +1 -0
  6. package/dist/agents/healer.d.ts +73 -0
  7. package/dist/agents/healer.d.ts.map +1 -0
  8. package/dist/agents/healer.js +538 -0
  9. package/dist/agents/healer.js.map +1 -0
  10. package/dist/agents/tools/form.d.ts +22 -0
  11. package/dist/agents/tools/form.d.ts.map +1 -0
  12. package/dist/agents/tools/form.js +134 -0
  13. package/dist/agents/tools/form.js.map +1 -0
  14. package/dist/agents/tools/index.d.ts +13 -0
  15. package/dist/agents/tools/index.d.ts.map +1 -0
  16. package/dist/agents/tools/index.js +33 -0
  17. package/dist/agents/tools/index.js.map +1 -0
  18. package/dist/agents/tools/navigate.d.ts +22 -0
  19. package/dist/agents/tools/navigate.d.ts.map +1 -0
  20. package/dist/agents/tools/navigate.js +74 -0
  21. package/dist/agents/tools/navigate.js.map +1 -0
  22. package/dist/agents/tools/snapshot.d.ts +22 -0
  23. package/dist/agents/tools/snapshot.d.ts.map +1 -0
  24. package/dist/agents/tools/snapshot.js +110 -0
  25. package/dist/agents/tools/snapshot.js.map +1 -0
  26. package/dist/agents/tools/verify.d.ts +34 -0
  27. package/dist/agents/tools/verify.d.ts.map +1 -0
  28. package/dist/agents/tools/verify.js +169 -0
  29. package/dist/agents/tools/verify.js.map +1 -0
  30. package/dist/agents/tools/wait.d.ts +22 -0
  31. package/dist/agents/tools/wait.d.ts.map +1 -0
  32. package/dist/agents/tools/wait.js +104 -0
  33. package/dist/agents/tools/wait.js.map +1 -0
  34. package/dist/agents/types.d.ts +51 -0
  35. package/dist/agents/types.d.ts.map +1 -0
  36. package/dist/agents/types.js +6 -0
  37. package/dist/agents/types.js.map +1 -0
  38. package/dist/ai-runner/src/agents/logger.d.ts +7 -0
  39. package/dist/ai-runner/src/agents/logger.d.ts.map +1 -0
  40. package/dist/ai-runner/src/agents/logger.js +22 -0
  41. package/dist/ai-runner/src/agents/logger.js.map +1 -0
  42. package/dist/ai-runner/src/agents/playwright-executor.d.ts +24 -0
  43. package/dist/ai-runner/src/agents/playwright-executor.d.ts.map +1 -0
  44. package/dist/ai-runner/src/agents/playwright-executor.js +226 -0
  45. package/dist/ai-runner/src/agents/playwright-executor.js.map +1 -0
  46. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.d.ts +33 -0
  47. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.d.ts.map +1 -0
  48. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.js +146 -0
  49. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.js.map +1 -0
  50. package/dist/ai-runner/src/agents/types.d.ts +55 -0
  51. package/dist/ai-runner/src/agents/types.d.ts.map +1 -0
  52. package/dist/ai-runner/src/agents/types.js +6 -0
  53. package/dist/ai-runner/src/agents/types.js.map +1 -0
  54. package/dist/ai-runner/src/examples/test-final.d.ts +6 -0
  55. package/dist/ai-runner/src/examples/test-final.d.ts.map +1 -0
  56. package/dist/ai-runner/src/examples/test-final.js +73 -0
  57. package/dist/ai-runner/src/examples/test-final.js.map +1 -0
  58. package/dist/ai-runner/src/examples/test-simple-tools.d.ts +6 -0
  59. package/dist/ai-runner/src/examples/test-simple-tools.d.ts.map +1 -0
  60. package/dist/ai-runner/src/examples/test-simple-tools.js +149 -0
  61. package/dist/ai-runner/src/examples/test-simple-tools.js.map +1 -0
  62. package/dist/ai-runner/src/examples/test-working.d.ts +5 -0
  63. package/dist/ai-runner/src/examples/test-working.d.ts.map +1 -0
  64. package/dist/ai-runner/src/examples/test-working.js +43 -0
  65. package/dist/ai-runner/src/examples/test-working.js.map +1 -0
  66. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts +15 -0
  67. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts.map +1 -0
  68. package/dist/ai-runner/src/examples/v-test-backend-adapter.js +240 -0
  69. package/dist/ai-runner/src/examples/v-test-backend-adapter.js.map +1 -0
  70. package/dist/ai-runner/src/index.d.ts +8 -0
  71. package/dist/ai-runner/src/index.d.ts.map +1 -0
  72. package/dist/ai-runner/src/index.js +11 -0
  73. package/dist/ai-runner/src/index.js.map +1 -0
  74. package/dist/ai-runner/src/runner.d.ts +28 -0
  75. package/dist/ai-runner/src/runner.d.ts.map +1 -0
  76. package/dist/ai-runner/src/runner.js +176 -0
  77. package/dist/ai-runner/src/runner.js.map +1 -0
  78. package/dist/ai-runner/src/tools/index.d.ts +16 -0
  79. package/dist/ai-runner/src/tools/index.d.ts.map +1 -0
  80. package/dist/ai-runner/src/tools/index.js +35 -0
  81. package/dist/ai-runner/src/tools/index.js.map +1 -0
  82. package/dist/ai-runner/src/tools/playwright-groups.d.ts +19 -0
  83. package/dist/ai-runner/src/tools/playwright-groups.d.ts.map +1 -0
  84. package/dist/ai-runner/src/tools/playwright-groups.js +42 -0
  85. package/dist/ai-runner/src/tools/playwright-groups.js.map +1 -0
  86. package/dist/ai-runner/src/types/external.d.ts +6 -0
  87. package/dist/ai-runner/src/types/external.d.ts.map +1 -0
  88. package/dist/ai-runner/src/types/external.js +7 -0
  89. package/dist/ai-runner/src/types/external.js.map +1 -0
  90. package/dist/ai-runner/src/types/index.d.ts +95 -0
  91. package/dist/ai-runner/src/types/index.d.ts.map +1 -0
  92. package/dist/ai-runner/src/types/index.js +7 -0
  93. package/dist/ai-runner/src/types/index.js.map +1 -0
  94. package/dist/core/runner.d.ts +194 -0
  95. package/dist/core/runner.d.ts.map +1 -0
  96. package/dist/core/runner.js +650 -0
  97. package/dist/core/runner.js.map +1 -0
  98. package/dist/core-infra/src/directory-validator.d.ts +29 -0
  99. package/dist/core-infra/src/directory-validator.d.ts.map +1 -0
  100. package/dist/core-infra/src/directory-validator.js +91 -0
  101. package/dist/core-infra/src/directory-validator.js.map +1 -0
  102. package/dist/core-infra/src/index.d.ts +14 -0
  103. package/dist/core-infra/src/index.d.ts.map +1 -0
  104. package/dist/core-infra/src/index.js +44 -0
  105. package/dist/core-infra/src/index.js.map +1 -0
  106. package/dist/core-infra/src/mcp/file-mcp-manager.d.ts +14 -0
  107. package/dist/core-infra/src/mcp/file-mcp-manager.d.ts.map +1 -0
  108. package/dist/core-infra/src/mcp/file-mcp-manager.js +46 -0
  109. package/dist/core-infra/src/mcp/file-mcp-manager.js.map +1 -0
  110. package/dist/core-infra/src/mcp/index.d.ts +21 -0
  111. package/dist/core-infra/src/mcp/index.d.ts.map +1 -0
  112. package/dist/core-infra/src/mcp/index.js +17 -0
  113. package/dist/core-infra/src/mcp/index.js.map +1 -0
  114. package/dist/core-infra/src/mcp/mcp-client.d.ts +128 -0
  115. package/dist/core-infra/src/mcp/mcp-client.d.ts.map +1 -0
  116. package/dist/core-infra/src/mcp/mcp-client.js +163 -0
  117. package/dist/core-infra/src/mcp/mcp-client.js.map +1 -0
  118. package/dist/core-infra/src/mcp/mcp-manager.d.ts +21 -0
  119. package/dist/core-infra/src/mcp/mcp-manager.d.ts.map +1 -0
  120. package/dist/core-infra/src/mcp/mcp-manager.js +99 -0
  121. package/dist/core-infra/src/mcp/mcp-manager.js.map +1 -0
  122. package/dist/core-infra/src/mcp/playwright-mcp-manager.d.ts +19 -0
  123. package/dist/core-infra/src/mcp/playwright-mcp-manager.d.ts.map +1 -0
  124. package/dist/core-infra/src/mcp/playwright-mcp-manager.js +120 -0
  125. package/dist/core-infra/src/mcp/playwright-mcp-manager.js.map +1 -0
  126. package/dist/core-infra/src/model.d.ts +11 -0
  127. package/dist/core-infra/src/model.d.ts.map +1 -0
  128. package/dist/core-infra/src/model.js +190 -0
  129. package/dist/core-infra/src/model.js.map +1 -0
  130. package/dist/core-infra/src/repositories/BaseRepository.d.ts +69 -0
  131. package/dist/core-infra/src/repositories/BaseRepository.d.ts.map +1 -0
  132. package/dist/core-infra/src/repositories/BaseRepository.js +213 -0
  133. package/dist/core-infra/src/repositories/BaseRepository.js.map +1 -0
  134. package/dist/core-infra/src/repositories/DirectoryRepository.d.ts +70 -0
  135. package/dist/core-infra/src/repositories/DirectoryRepository.d.ts.map +1 -0
  136. package/dist/core-infra/src/repositories/DirectoryRepository.js +336 -0
  137. package/dist/core-infra/src/repositories/DirectoryRepository.js.map +1 -0
  138. package/dist/core-infra/src/repositories/ExplorationRepository.d.ts +34 -0
  139. package/dist/core-infra/src/repositories/ExplorationRepository.d.ts.map +1 -0
  140. package/dist/core-infra/src/repositories/ExplorationRepository.js +54 -0
  141. package/dist/core-infra/src/repositories/ExplorationRepository.js.map +1 -0
  142. package/dist/core-infra/src/repositories/FileRepository.d.ts +56 -0
  143. package/dist/core-infra/src/repositories/FileRepository.d.ts.map +1 -0
  144. package/dist/core-infra/src/repositories/FileRepository.js +132 -0
  145. package/dist/core-infra/src/repositories/FileRepository.js.map +1 -0
  146. package/dist/core-infra/src/repositories/ModelConfigRepository.d.ts +38 -0
  147. package/dist/core-infra/src/repositories/ModelConfigRepository.d.ts.map +1 -0
  148. package/dist/core-infra/src/repositories/ModelConfigRepository.js +59 -0
  149. package/dist/core-infra/src/repositories/ModelConfigRepository.js.map +1 -0
  150. package/dist/core-infra/src/repositories/ProjectRepository.d.ts +32 -0
  151. package/dist/core-infra/src/repositories/ProjectRepository.d.ts.map +1 -0
  152. package/dist/core-infra/src/repositories/ProjectRepository.js +67 -0
  153. package/dist/core-infra/src/repositories/ProjectRepository.js.map +1 -0
  154. package/dist/core-infra/src/repositories/SettingsRepository.d.ts +19 -0
  155. package/dist/core-infra/src/repositories/SettingsRepository.d.ts.map +1 -0
  156. package/dist/core-infra/src/repositories/SettingsRepository.js +72 -0
  157. package/dist/core-infra/src/repositories/SettingsRepository.js.map +1 -0
  158. package/dist/core-infra/src/repositories/TableDataRepository.d.ts +22 -0
  159. package/dist/core-infra/src/repositories/TableDataRepository.d.ts.map +1 -0
  160. package/dist/core-infra/src/repositories/TableDataRepository.js +33 -0
  161. package/dist/core-infra/src/repositories/TableDataRepository.js.map +1 -0
  162. package/dist/core-infra/src/repositories/TestCaseRepository.d.ts +120 -0
  163. package/dist/core-infra/src/repositories/TestCaseRepository.d.ts.map +1 -0
  164. package/dist/core-infra/src/repositories/TestCaseRepository.js +463 -0
  165. package/dist/core-infra/src/repositories/TestCaseRepository.js.map +1 -0
  166. package/dist/core-infra/src/repositories/TestPlanRepository.d.ts +35 -0
  167. package/dist/core-infra/src/repositories/TestPlanRepository.d.ts.map +1 -0
  168. package/dist/core-infra/src/repositories/TestPlanRepository.js +80 -0
  169. package/dist/core-infra/src/repositories/TestPlanRepository.js.map +1 -0
  170. package/dist/core-infra/src/repositories/TestResultRepository.d.ts +30 -0
  171. package/dist/core-infra/src/repositories/TestResultRepository.d.ts.map +1 -0
  172. package/dist/core-infra/src/repositories/TestResultRepository.js +54 -0
  173. package/dist/core-infra/src/repositories/TestResultRepository.js.map +1 -0
  174. package/dist/core-infra/src/repositories/index.d.ts +17 -0
  175. package/dist/core-infra/src/repositories/index.d.ts.map +1 -0
  176. package/dist/core-infra/src/repositories/index.js +31 -0
  177. package/dist/core-infra/src/repositories/index.js.map +1 -0
  178. package/dist/core-infra/src/storageService.d.ts +131 -0
  179. package/dist/core-infra/src/storageService.d.ts.map +1 -0
  180. package/dist/core-infra/src/storageService.js +304 -0
  181. package/dist/core-infra/src/storageService.js.map +1 -0
  182. package/dist/core-infra/src/types.d.ts +218 -0
  183. package/dist/core-infra/src/types.d.ts.map +1 -0
  184. package/dist/core-infra/src/types.js +3 -0
  185. package/dist/core-infra/src/types.js.map +1 -0
  186. package/dist/index.d.ts +8 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +11 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/types/external.d.ts +6 -0
  191. package/dist/types/external.d.ts.map +1 -0
  192. package/dist/types/external.js +7 -0
  193. package/dist/types/external.js.map +1 -0
  194. package/dist/types/index.d.ts +153 -0
  195. package/dist/types/index.d.ts.map +1 -0
  196. package/dist/types/index.js +26 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/docs/PLAYWRIGHT_MCP_ADAPTER.md +132 -0
  199. package/docs/SCHEMA_EXTRACTION.md +224 -0
  200. package/package.json +43 -0
  201. package/playwright.config.ts +38 -0
  202. package/src/agents/logger.ts +20 -0
  203. package/src/agents/playwright-executor.ts +244 -0
  204. package/src/agents/tools/playwright-backend-adapter.ts +134 -0
  205. package/src/agents/tools/playwright-mcp-types.d.ts +71 -0
  206. package/src/agents/types.ts +80 -0
  207. package/src/index.ts +27 -0
  208. package/src/runner.ts +219 -0
  209. package/src/tools/index.ts +48 -0
  210. package/src/tools/playwright-groups.ts +54 -0
  211. package/src/types/external.ts +7 -0
  212. package/src/types/index.ts +118 -0
  213. package/tests/agent/test-heal-agent.spec.ts +69 -0
  214. package/tsconfig.json +26 -0
package/README.md ADDED
@@ -0,0 +1,263 @@
1
+ # @ai-test/ai-heal
2
+
3
+ AI-powered self-healing SDK for Playwright test scripts.
4
+
5
+ > **版本**: v0.2.0
6
+ > **状态**: 核心设计完成,准备开发
7
+ > **重大更新**: 基于 MCP 工具限制重新设计架构,可行性提升至 ⭐⭐⭐⭐⭐
8
+
9
+ ## 概述
10
+
11
+ `ai-heal` 是一个为 Playwright 测试脚本设计的自愈 SDK,通过 AI Agent 在测试执行失败时自动修复脚本错误,提高测试稳定性和维护效率。
12
+
13
+ ## 核心特性
14
+
15
+ - 🔄 **自动自愈**: 测试步骤失败时自动触发 AI 修复流程
16
+ - 🤖 **智能 Agent**: 基于 LangGraph 的 ReAct 循环实现智能决策
17
+ - 🔧 **变量绑定**: Ref<T> 包装器支持复杂 Playwright 对象的引用传递
18
+ - 📝 **代码生成**: Agent 分析错误并生成修复代码,在用户 Browser 上下文执行
19
+ - 🎯 **类型安全**: 完整的 TypeScript 类型支持
20
+ - ⚡ **零状态隔离**: 在用户真实 Browser 中执行,状态完全一致
21
+
22
+ ## 架构亮点
23
+
24
+ ### ✅ 解决核心问题
25
+
26
+ **问题**: Playwright MCP 工具无法返回 Page、Tab、DOM 节点等复杂对象。
27
+
28
+ **方案**:
29
+ ```
30
+ Agent 使用 MCP 观察(只读)→ 生成修复代码 → SDK 在用户 Browser 执行
31
+ ```
32
+
33
+ **优势**:
34
+ - ✅ 完全绕过 MCP 返回值限制
35
+ - ✅ 支持所有 Playwright 复杂对象
36
+ - ✅ Cookie、Session、Storage 完全共享
37
+ - ✅ 原生 Playwright API 完全可用
38
+
39
+ ## 快速开始
40
+
41
+ ### 安装
42
+
43
+ ```bash
44
+ npm install @ai-test/ai-heal
45
+ ```
46
+
47
+ ### 基本使用
48
+
49
+ ```typescript
50
+ import { AIHeal, Ref } from '@ai-test/ai-heal';
51
+ import { test, expect } from '@playwright/test';
52
+
53
+ test('示例测试', async ({ page }) => {
54
+ // 初始化自愈实例
55
+ const heal = new AIHeal({
56
+ testCaseId: 'test-123',
57
+ projectId: 'project-456'
58
+ });
59
+
60
+ // 声明需要自愈的变量
61
+ const userPage = new Ref<typeof>(null);
62
+ const userData = new Ref<any>(null);
63
+
64
+ // 使用 runStep 包装测试步骤
65
+ await heal.runStep({
66
+ description: '打开登录页面并输入用户信息',
67
+ variables: {
68
+ page: userPage,
69
+ data: userData
70
+ },
71
+ context: page
72
+ }, async () => {
73
+ await page.goto('https://example.com/login');
74
+ await page.fill('#username', 'testuser');
75
+ await page.fill('#password', 'password123');
76
+ await page.click('#login-button');
77
+
78
+ // 保存变量供后续使用
79
+ userData.current = { username: 'testuser' };
80
+ });
81
+
82
+ // 继续使用自愈后的变量
83
+ await heal.runStep({
84
+ description: '验证用户登录成功',
85
+ variables: { page: userPage }
86
+ }, async () => {
87
+ await expect(userPage.current).toHaveURL(/.*dashboard/);
88
+ });
89
+
90
+ // 生成自愈报告和修复后的脚本
91
+ const summary = await heal.summary();
92
+ console.log(`总步骤数: ${summary.totalSteps}`);
93
+ console.log(`自愈成功数: ${summary.healedSteps}`);
94
+ });
95
+ ```
96
+
97
+ ## API 文档
98
+
99
+ ### AIHeal
100
+
101
+ #### 构造函数
102
+
103
+ ```typescript
104
+ new AIHeal(config: AIHealConfig)
105
+ ```
106
+
107
+ **参数:**
108
+ - `testCaseId?: string` - 测试用例 ID,用于查询原始脚本
109
+ - `projectId?: string` - 项目 ID
110
+ - `scriptContent?: string` - 手动注入的脚本内容
111
+ - `modelConfig?: ModelConfig` - AI 模型配置
112
+ - `enableAutoSave?: boolean` - 是否自动保存修复后的脚本(默认 false)
113
+ - `maxRetries?: number` - 最大自愈重试次数(默认 3)
114
+
115
+ #### runStep
116
+
117
+ ```typescript
118
+ async runStep<T>(
119
+ options: RunStepOptions,
120
+ fn: () => Promise
121
+ ): Promise<T>
122
+ ```
123
+
124
+ **参数:**
125
+ - `description: string` - 步骤描述,用于 AI 理解
126
+ - `variables?: Record<string, Ref<any>>` - 需要传递的变量绑定
127
+ - `context?: any` - Playwright 上下文对象(Page, BrowserContext 等)
128
+
129
+ **返回:**
130
+ - 泛型 `T` - 步骤执行结果
131
+
132
+ #### summary
133
+
134
+ ```typescript
135
+ async summary(): Promise<HealSummary>
136
+ ```
137
+
138
+ **返回:**
139
+ - `totalSteps: number` - 总步骤数
140
+ - `healedSteps: number` - 自愈成功的步骤数
141
+ - `modifiedScript?: string` - 修复后的脚本
142
+ - `healingDetails: HealingDetail[]` - 每次自愈的详细信息
143
+
144
+ ### Ref<T>
145
+
146
+ 用于包装需要跨步骤传递的变量,支持 AI Agent 修改外部变量。
147
+
148
+ ```typescript
149
+ const page = new Ref<Page>(null);
150
+
151
+ // 获取值
152
+ const currentPage = page.current;
153
+
154
+ // 赋值
155
+ page.current = await context.newPage();
156
+ ```
157
+
158
+ ## 架构设计
159
+
160
+ ### 核心组件
161
+
162
+ ```
163
+ ai-heal/
164
+ ├── src/
165
+ │ ├── core/ # 核心逻辑
166
+ │ │ ├── ai-heal.ts # AIHeal 主类
167
+ │ │ ├── healer.ts # 自愈执行器
168
+ │ │ └── variable-binding.ts # 变量绑定机制
169
+ │ ├── agents/ # AI Agent
170
+ │ │ ├── heal-agent.ts # 自愈 Agent
171
+ │ │ └── graph.ts # LangGraph 定义
172
+ │ ├── types/ # 类型定义
173
+ │ ├── utils/ # 工具函数
174
+ │ └── index.ts # 导出入口
175
+ ├── docs/ # 文档
176
+ ├── examples/ # 使用示例
177
+ └── tests/ # 测试
178
+ ```
179
+
180
+ ### 自愈流程
181
+
182
+ ```
183
+ 1. 执行原始代码
184
+
185
+ 2. 捕获错误
186
+
187
+ 3. 判断是否可自愈
188
+
189
+ 4. 构建 ReAct Agent
190
+
191
+ 5. Agent 使用 Playwright 工具重新执行
192
+
193
+ 6. 解析并应用变量赋值
194
+
195
+ 7. 记录自愈上下文
196
+
197
+ 8. 返回结果
198
+ ```
199
+
200
+ ## 开发计划
201
+
202
+ - [x] 核心架构设计
203
+ - [x] 技术方案文档
204
+ - [x] POC 验证 (3个)
205
+ - [ ] 基础类型定义
206
+ - [ ] 变量绑定机制实现
207
+ - [ ] AIHeal 主类实现
208
+ - [ ] LangGraph Agent 集成
209
+ - [ ] Playwright MCP 集成
210
+ - [ ] 脚本修复逻辑
211
+ - [ ] 单元测试
212
+ - [ ] 集成测试
213
+ - [ ] 文档完善
214
+
215
+ ## POC 验证
216
+
217
+ **当前状态**: ✅ 准备就绪
218
+
219
+ 我们已经创建了 3 个 POC 验证脚本,用于验证核心技术方案的可行性:
220
+
221
+ ### POC 清单
222
+
223
+ | POC | 验证内容 | 文件 | 预期时间 |
224
+ |-----|---------|------|---------|
225
+ | **POC 1** | Ref<T> 类型推断 | `src/poc/poc1-ref-type-inference.ts` | ~2s |
226
+ | **POC 2** | 上下文代码执行 | `src/poc/poc2-context-execution.ts` | ~15s |
227
+ | **POC 3** | 复杂对象序列化 | `src/poc/poc3-object-serialization.ts` | ~10s |
228
+
229
+ ### 快速运行
230
+
231
+ ```bash
232
+ # 进入项目目录
233
+ cd ai-heal
234
+
235
+ # 安装依赖
236
+ npm install
237
+ npx playwright install
238
+
239
+ # 运行所有 POC 测试
240
+ npm test
241
+
242
+ # 或使用 Playwright 直接运行
243
+ npx playwright test src/poc/
244
+
245
+ # 查看详细报告
246
+ npx playwright show-report
247
+ ```
248
+
249
+ ### 详细说明
250
+
251
+ 请查看 [POC README](src/poc/README.md) 了解完整的验证说明和验收标准。
252
+
253
+ ## 技术方案
254
+
255
+ 详见 [docs/technical-design.md](docs/technical-design.md)
256
+
257
+ ## 可行性分析
258
+
259
+ 详见 [docs/feasibility-analysis.md](docs/feasibility-analysis.md)
260
+
261
+ ## 许可证
262
+
263
+ MIT
@@ -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"}