@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
@@ -0,0 +1,650 @@
1
+ "use strict";
2
+ /**
3
+ * Runner 核心类 (MVP + Agent)
4
+ * 实现 AI 驱动的测试运行逻辑,包括自愈和其他 AI 能力
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Runner = void 0;
8
+ const heal_agent_1 = require("../agents/heal-agent");
9
+ const anthropic_1 = require("@langchain/anthropic");
10
+ const openai_1 = require("@langchain/openai");
11
+ const messages_1 = require("@langchain/core/messages");
12
+ const core_infra_1 = require("@chen-rmag/core-infra");
13
+ /**
14
+ * Runner - AI 驱动的测试运行器
15
+ * 支持自愈、变量管理和其他 AI 增强功能
16
+ */
17
+ class Runner {
18
+ constructor(config) {
19
+ this.healContexts = [];
20
+ // 变量存储 - Agent 可以通过 set/get 方法访问这些变量
21
+ this.vars = new Map();
22
+ this.config = {
23
+ enableAutoSave: true,
24
+ debugMode: false,
25
+ agentMaxSteps: 20,
26
+ ...config
27
+ };
28
+ // 同步加载原始脚本(优先从数据库)
29
+ this.originalScript = this.loadOriginalScript(config);
30
+ // 异步初始化 Agent(需要异步加载模型配置)
31
+ // 保存 Promise 以便后续可以等待
32
+ this.modelConfigReady = this.initializeAgent(config.modelConfigId);
33
+ this.storageService = core_infra_1.StorageService.getInstance(config.projectId);
34
+ // 延迟初始化 agent(使用默认配置,如果后续加载到模型配置会重新创建)
35
+ this.agent = new heal_agent_1.HealAgent({
36
+ debugMode: this.config.debugMode ?? false
37
+ });
38
+ }
39
+ // ============================================================================
40
+ // 静态工厂方法
41
+ // ============================================================================
42
+ /**
43
+ * 创建 Runner 实例(主要工厂方法)
44
+ *
45
+ * @param config - Runner 配置
46
+ * @returns Runner 实例
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const runner = Runner.to({
51
+ * modelConfigId: 'your-model-config-id',
52
+ * projectId: 'project-123',
53
+ * testCaseId: 'test-456'
54
+ * });
55
+ * ```
56
+ */
57
+ static to(config) {
58
+ return new Runner(config);
59
+ }
60
+ /**
61
+ * 从脚本内容创建 Runner 实例
62
+ *
63
+ * @param scriptContent - 测试脚本内容
64
+ * @param config - 其他配置选项
65
+ * @returns Runner 实例
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const runner = Runner.fromScript(`
70
+ * test('example', async ({ page }) => {
71
+ * await page.goto('https://example.com');
72
+ * });
73
+ * `, {
74
+ * modelConfigId: 'your-model-config-id'
75
+ * });
76
+ * ```
77
+ */
78
+ static fromScript(scriptContent, config) {
79
+ return new Runner({
80
+ ...config,
81
+ scriptContent
82
+ });
83
+ }
84
+ /**
85
+ * 从数据库中的测试用例创建 Runner 实例
86
+ *
87
+ * @param projectId - 项目 ID
88
+ * @param testCaseId - 测试用例 ID
89
+ * @param config - 其他配置选项
90
+ * @returns Runner 实例
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const runner = Runner.fromTestCase('project-123', 'test-456', {
95
+ * modelConfigId: 'your-model-config-id'
96
+ * });
97
+ * ```
98
+ */
99
+ static NewInstance(projectId, testCaseId, config) {
100
+ return new Runner({
101
+ ...config,
102
+ projectId,
103
+ testCaseId
104
+ });
105
+ }
106
+ /**
107
+ * 创建带调试模式的 Runner 实例
108
+ *
109
+ * @param config - Runner 配置
110
+ * @returns Runner 实例
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const runner = Runner.debug({
115
+ * modelConfigId: 'your-model-config-id'
116
+ * });
117
+ * ```
118
+ */
119
+ static debug(config) {
120
+ return new Runner({
121
+ ...config,
122
+ debugMode: true
123
+ });
124
+ }
125
+ // ============================================================================
126
+ // 实例方法
127
+ // ============================================================================
128
+ /**
129
+ * 加载原始脚本(优先从数据库)- 同步方法
130
+ */
131
+ loadOriginalScript(config) {
132
+ // 优先级:
133
+ // 1. 从 TestCaseRepository 加载(如果有 projectId 和 testCaseId)
134
+ // 2. 使用传入的 scriptContent
135
+ // 临时创建 repo 用于加载
136
+ const tempRepo = core_infra_1.StorageService.getInstance(config.projectId);
137
+ if (tempRepo && config.testCaseId) {
138
+ try {
139
+ console.log(`[Runner] 尝试从数据库加载脚本: ${config.projectId}/${config.testCaseId}`);
140
+ const script = tempRepo.loadTestScript(config.testCaseId);
141
+ if (script) {
142
+ console.log(`[Runner] ✅ 从数据库加载脚本成功 (${script.length} 字符)`);
143
+ return script;
144
+ }
145
+ else {
146
+ console.log(`[Runner] ⚠️ 数据库中未找到脚本,使用传入的 scriptContent`);
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.error(`[Runner] ❌ 从数据库加载脚本失败:`, error);
151
+ console.log(`[Runner] 回退到使用传入的 scriptContent`);
152
+ }
153
+ }
154
+ // 使用传入的 scriptContent
155
+ if (config.scriptContent) {
156
+ console.log(`[Runner] 使用传入的脚本内容 (${config.scriptContent.length} 字符)`);
157
+ return config.scriptContent;
158
+ }
159
+ else {
160
+ console.log(`[Runner] ⚠️ 未提供脚本内容`);
161
+ return '';
162
+ }
163
+ }
164
+ /**
165
+ * 初始化 Agent(异步加载模型配置)
166
+ * 优先级:1. 传入的 modelConfigId 2. 加载 isDefault=true 的配置 3. 加载第一个可用配置
167
+ */
168
+ async initializeAgent(modelConfigId) {
169
+ try {
170
+ let config = null;
171
+ // 1. 如果提供了 modelConfigId,直接加载
172
+ if (modelConfigId) {
173
+ console.log(`[Runner] 📋 加载指定的模型配置: ${modelConfigId}`);
174
+ config = await this.storageService.loadModelConfig(modelConfigId);
175
+ if (config) {
176
+ this.modelConfig = config;
177
+ console.log(`[Runner] ✅ 模型配置加载成功: ${this.modelConfig.name} (${this.modelConfig.provider}/${this.modelConfig.modelName})`);
178
+ // 重新创建带有模型配置的 Agent
179
+ this.agent = new heal_agent_1.HealAgent({
180
+ model: this.modelConfig,
181
+ maxSteps: this.config.agentMaxSteps ?? 20,
182
+ debugMode: this.config.debugMode ?? false,
183
+ setVariable: this.set.bind(this),
184
+ getAllVariables: this.getAll.bind(this)
185
+ });
186
+ return;
187
+ }
188
+ console.log(`[Runner] ⚠️ 未找到指定的模型配置: ${modelConfigId},尝试查找默认配置`);
189
+ }
190
+ // 2. 尝试查找 isDefault=true 的配置
191
+ console.log(`[Runner] 📋 获取所有模型配置,查找默认配置...`);
192
+ const allConfigs = await this.storageService.listModelConfigs();
193
+ if (allConfigs && allConfigs.length > 0) {
194
+ // 查找 isDefault=true 的配置
195
+ const defaultConfig = allConfigs.find(c => c.isDefault === true);
196
+ if (defaultConfig) {
197
+ this.modelConfig = defaultConfig;
198
+ console.log(`[Runner] ✅ 默认模型配置加载成功: ${this.modelConfig.name} (${this.modelConfig.provider}/${this.modelConfig.modelName})`);
199
+ // 重新创建带有模型配置的 Agent
200
+ this.agent = new heal_agent_1.HealAgent({
201
+ model: this.modelConfig,
202
+ maxSteps: this.config.agentMaxSteps ?? 20,
203
+ debugMode: this.config.debugMode ?? false,
204
+ setVariable: this.set.bind(this),
205
+ getAllVariables: this.getAll.bind(this)
206
+ });
207
+ return;
208
+ }
209
+ // 3. 如果没有默认配置,使用第一个可用配置
210
+ const firstConfig = allConfigs[0];
211
+ this.modelConfig = firstConfig;
212
+ console.log(`[Runner] ✅ 使用第一个可用模型配置: ${this.modelConfig.name} (${this.modelConfig.provider}/${this.modelConfig.modelName})`);
213
+ // 重新创建带有模型配置的 Agent
214
+ this.agent = new heal_agent_1.HealAgent({
215
+ model: this.modelConfig,
216
+ maxSteps: this.config.agentMaxSteps ?? 20,
217
+ debugMode: this.config.debugMode ?? false,
218
+ setVariable: this.set.bind(this),
219
+ getAllVariables: this.getAll.bind(this)
220
+ });
221
+ return;
222
+ }
223
+ console.warn(`[Runner] ⚠️ 未找到任何模型配置,Runner 将在没有 AI 功能的情况下运行`);
224
+ }
225
+ catch (error) {
226
+ console.error(`[Runner] ❌ 加载模型配置失败: ${error}`);
227
+ }
228
+ }
229
+ /**
230
+ * 执行一个可能需要自愈的步骤
231
+ *
232
+ * @param options - 步骤选项
233
+ * @param fn - 要执行的函数
234
+ * @returns 函数执行结果
235
+ */
236
+ async runStep(options, fn) {
237
+ const startTime = Date.now();
238
+ // 创建自愈上下文
239
+ const context = {
240
+ timestamp: startTime,
241
+ stepDescription: options.description,
242
+ originalCode: fn.toString(),
243
+ variablesBefore: this.captureVariables(options.variables),
244
+ variablesAfter: {}, // 初始化为空,在 finally 块中填充
245
+ recoveryAttempts: 0,
246
+ success: false
247
+ };
248
+ try {
249
+ // 尝试执行原始函数
250
+ const result = await fn();
251
+ context.success = true;
252
+ return result;
253
+ }
254
+ catch (error) {
255
+ // 记录错误
256
+ context.error = error;
257
+ context.stackTrace = error.stack;
258
+ console.log(`[Runner] 步骤失败: ${options.description}`);
259
+ console.log(`[Runner] 错误: ${error.message}`);
260
+ // 尝试自愈(只尝试一次,让 Agent 通过 ReAct 循环处理)
261
+ console.log(`[Runner] 调用 Agent 接管执行`);
262
+ context.recoveryAttempts = 1;
263
+ // 调用 Agent 通过 ReAct 循环执行
264
+ // Agent 会通过 Playwright MCP 工具直接操作浏览器
265
+ const agentResult = await this.agent.heal({
266
+ objective: options.description,
267
+ error: error.message,
268
+ stackTrace: error.stack,
269
+ originalCode: context.originalCode,
270
+ context: {
271
+ page: options.context?.page,
272
+ context: options.context?.context
273
+ },
274
+ variables: options.variables ? Object.fromEntries(Object.entries(options.variables).map(([k, v]) => [k, v.value])) : {},
275
+ maxSteps: this.config.agentMaxSteps ?? 5,
276
+ debugMode: this.config.debugMode ?? false
277
+ });
278
+ if (agentResult.success) {
279
+ console.log(`[Runner] Agent 执行成功!`);
280
+ console.log(`[Runner] 执行过程: ${agentResult.reasoning}`);
281
+ // 保存 ReAct 步骤记录
282
+ if (agentResult.reactSteps) {
283
+ context.reactSteps = agentResult.reactSteps;
284
+ context.agentSteps = agentResult.steps;
285
+ context.reasoning = agentResult.reasoning;
286
+ }
287
+ // 注意:Agent 已经通过 setVariable 回调直接设置了变量到 this.vars
288
+ // 不再需要通过 updatedVariables 传递
289
+ context.success = true;
290
+ return undefined; // Agent 执行不返回值
291
+ }
292
+ else {
293
+ console.log(`[Runner] Agent 执行失败: ${agentResult.errorMessage}`);
294
+ // 即使失败也保存 ReAct 步骤
295
+ if (agentResult.reactSteps) {
296
+ context.reactSteps = agentResult.reactSteps;
297
+ context.agentSteps = agentResult.steps;
298
+ context.reasoning = agentResult.reasoning;
299
+ }
300
+ throw error;
301
+ }
302
+ }
303
+ finally {
304
+ // 记录执行后的变量状态
305
+ context.variablesAfter = this.captureVariables(options.variables);
306
+ context.healingTime = Date.now() - startTime;
307
+ // 保存上下文
308
+ this.healContexts.push(context);
309
+ }
310
+ }
311
+ /**
312
+ * 结束清理自愈过程内容
313
+ *
314
+ * @returns 自愈摘要信息
315
+ */
316
+ async stop() {
317
+ // 等待模型配置加载完成
318
+ await this.modelConfigReady;
319
+ console.log('\n[Runner] ========== 开始生成摘要 ==========');
320
+ console.log(`[Runner] 模型配置状态: ${this.modelConfig ? '已加载' : '未加载'}`);
321
+ console.log(`[Runner] enableAutoSave: ${this.config.enableAutoSave}`);
322
+ const healedContexts = this.healContexts.filter(ctx => ctx.recoveryAttempts > 0 || !ctx.success);
323
+ console.log(`[Runner] 总步骤数: ${this.healContexts.length}`);
324
+ console.log(`[Runner] 自愈步骤数: ${healedContexts.length}`);
325
+ const basicSummary = {
326
+ totalSteps: this.healContexts.length,
327
+ healedSteps: healedContexts.length,
328
+ healingDetails: healedContexts.map(ctx => ({
329
+ step: ctx.stepDescription,
330
+ error: ctx.error?.message || 'Unknown error',
331
+ recoveryTime: ctx.healingTime || 0,
332
+ llmInteractions: 0 // MVP 暂未实现
333
+ }))
334
+ };
335
+ // 如果有自愈发生且配置了 enableAutoSave,生成修复后的脚本
336
+ if (healedContexts.length > 0 && this.config.enableAutoSave && this.modelConfig) {
337
+ console.log('[Runner] ✅ 满足生成脚本条件,开始生成...');
338
+ try {
339
+ console.log('\n========================================');
340
+ console.log('[Runner] 生成修复后的脚本...');
341
+ console.log('========================================');
342
+ const modifiedScript = await this.generateModifiedScript(healedContexts);
343
+ basicSummary.modifiedScript = modifiedScript;
344
+ // 保存或打印修复后的脚本
345
+ await this.saveOrPrintScript(modifiedScript);
346
+ console.log('[Runner] 脚本处理完成');
347
+ console.log('========================================\n');
348
+ }
349
+ catch (error) {
350
+ console.error('[Runner] 生成修复脚本失败:', error);
351
+ }
352
+ }
353
+ else {
354
+ // 记录为什么不生成脚本
355
+ if (healedContexts.length === 0) {
356
+ console.log('[Runner] ⚠️ 没有自愈发生,跳过脚本生成');
357
+ }
358
+ else if (!this.config.enableAutoSave) {
359
+ console.log('[Runner] ⚠️ enableAutoSave 为 false,跳过脚本生成');
360
+ }
361
+ else if (!this.modelConfig) {
362
+ console.log('[Runner] ⚠️ 模型配置未加载,跳过脚本生成');
363
+ }
364
+ console.log('[Runner] ========== 摘要生成完成 ==========\n');
365
+ }
366
+ return basicSummary;
367
+ }
368
+ /**
369
+ * 捕获变量当前值
370
+ */
371
+ captureVariables(variables) {
372
+ if (!variables)
373
+ return {};
374
+ const captured = {};
375
+ for (const [key, ref] of Object.entries(variables)) {
376
+ captured[key] = ref.value;
377
+ }
378
+ return captured;
379
+ }
380
+ /**
381
+ * 获取原始脚本
382
+ */
383
+ getOriginalScript() {
384
+ return this.originalScript;
385
+ }
386
+ /**
387
+ * 获取所有自愈上下文
388
+ */
389
+ getHealContexts() {
390
+ return [...this.healContexts];
391
+ }
392
+ /**
393
+ * 手动设置模型配置(替代通过 modelConfigId 加载)
394
+ *
395
+ * @param modelConfig - 模型配置对象
396
+ */
397
+ setModelConfig(modelConfig) {
398
+ this.modelConfig = modelConfig;
399
+ console.log(`[Runner] 设置模型配置: ${modelConfig.name} (${modelConfig.provider}/${modelConfig.modelName})`);
400
+ // 重新创建带有模型配置的 Agent,传递 setVariable 和 getAllVariables 回调
401
+ this.agent = new heal_agent_1.HealAgent({
402
+ model: this.modelConfig,
403
+ maxSteps: this.config.agentMaxSteps ?? 20,
404
+ debugMode: this.config.debugMode ?? false,
405
+ setVariable: this.set.bind(this), // 传递 set 方法作为回调
406
+ getAllVariables: this.getAll.bind(this) // 传递 getAll 方法作为回调
407
+ });
408
+ }
409
+ /**
410
+ * 获取当前使用的模型配置
411
+ */
412
+ getModelConfig() {
413
+ return this.modelConfig;
414
+ }
415
+ /**
416
+ * 使用 LLM 生成修复后的脚本
417
+ */
418
+ async generateModifiedScript(healedContexts) {
419
+ if (!this.modelConfig) {
420
+ throw new Error('模型配置未设置');
421
+ }
422
+ // 创建 LLM 实例
423
+ const llm = this.createLLM();
424
+ // 构建提示词
425
+ const systemPrompt = this.buildSystemPrompt();
426
+ const userMessage = this.buildUserMessage(healedContexts);
427
+ console.log('[Runner] 调用 LLM 生成修复脚本...');
428
+ // 调用 LLM
429
+ const response = await llm.invoke([
430
+ new messages_1.SystemMessage(systemPrompt),
431
+ new messages_1.HumanMessage(userMessage)
432
+ ]);
433
+ const modifiedScript = response.content.toString();
434
+ console.log('[Runner] 修复脚本生成完成');
435
+ return modifiedScript;
436
+ }
437
+ /**
438
+ * 创建 LLM 实例
439
+ */
440
+ createLLM() {
441
+ if (!this.modelConfig) {
442
+ throw new Error('模型配置未设置');
443
+ }
444
+ switch (this.modelConfig.provider) {
445
+ case 'anthropic':
446
+ return new anthropic_1.ChatAnthropic({
447
+ apiKey: this.modelConfig.apiKey,
448
+ model: this.modelConfig.modelName,
449
+ temperature: 0.2, // 较低温度以保持代码一致性
450
+ maxTokens: 8192
451
+ });
452
+ case 'openai':
453
+ return new openai_1.ChatOpenAI({
454
+ apiKey: this.modelConfig.apiKey,
455
+ modelName: this.modelConfig.modelName,
456
+ temperature: 0.2,
457
+ maxTokens: 8192,
458
+ configuration: {
459
+ baseURL: this.modelConfig.baseURL
460
+ }
461
+ });
462
+ default:
463
+ throw new Error(`不支持的模型提供商: ${this.modelConfig.provider}`);
464
+ }
465
+ }
466
+ /**
467
+ * 构建系统提示
468
+ */
469
+ buildSystemPrompt() {
470
+ return `
471
+ 你是一位专业的 Playwright 测试工程师,擅长修复失败的自动化测试脚本。
472
+
473
+ ## 你的任务
474
+ 根据提供的原始测试脚本和自愈历史记录,生成修复后的完整测试脚本。
475
+
476
+ ## 修复原则
477
+ 1. **保持逻辑完整**: 修复后的脚本必须能够完成原始测试的目标
478
+ 2. **使用自愈经验**: 参考自愈过程中成功的操作,应用到脚本中
479
+ 3. **保持代码清晰**: 添加必要的注释说明修复原因
480
+ 4. **保留变量处理**: 如果原始代码有变量赋值,确保修复后的代码也能正确获取和赋值
481
+ 5. **使用稳定选择器**: 优先使用稳定的元素定位方式(如 data-testid、aria-label 等)
482
+
483
+ ## 输出格式
484
+ 直接输出完整的 TypeScript 代码,不要使用代码块标记(\`\`\`),不要添加额外说明。
485
+
486
+ ## 注意事项
487
+ - 如果某个步骤被自愈修复,在代码中添加注释:// 修复:[原因]
488
+ - 保持原始代码的结构和风格
489
+ - 确保所有必要的 import 语句都存在
490
+ `.trim();
491
+ }
492
+ /**
493
+ * 构建用户消息
494
+ */
495
+ buildUserMessage(healedContexts) {
496
+ let message = '请修复以下测试脚本:\n\n';
497
+ message += '## 原始测试脚本\n';
498
+ message += '```typescript\n';
499
+ message += this.originalScript || '// (未提供原始脚本)\n';
500
+ message += '\n```\n\n';
501
+ message += '## 自愈历史记录\n\n';
502
+ healedContexts.forEach((ctx, index) => {
503
+ message += `### 步骤 ${index + 1}: ${ctx.stepDescription}\n`;
504
+ if (ctx.error) {
505
+ message += `**错误**: ${ctx.error.message}\n\n`;
506
+ }
507
+ if (ctx.success && ctx.recoveryAttempts > 0) {
508
+ message += `**状态**: ✅ 自愈成功\n`;
509
+ message += `**恢复时间**: ${ctx.healingTime}ms\n`;
510
+ message += `**尝试次数**: ${ctx.recoveryAttempts}\n`;
511
+ message += `**Agent 步数**: ${ctx.agentSteps || 0}\n\n`;
512
+ // 如果有 ReAct 步骤记录,详细展示
513
+ if (ctx.reactSteps && ctx.reactSteps.length > 0) {
514
+ message += `**ReAct 循环详情**:\n\n`;
515
+ ctx.reactSteps.forEach((step, stepIdx) => {
516
+ const stepNum = Math.floor(stepIdx / 3) + 1; // thought-action-observation 算一轮
517
+ switch (step.stepType) {
518
+ case 'thought':
519
+ message += `${stepNum}. 💭 思考: ${step.thought}\n`;
520
+ break;
521
+ case 'action':
522
+ message += `${stepNum}. 🔧 行动: 调用工具 \`${step.toolCall?.name}\`\n`;
523
+ message += ` 参数: \`${JSON.stringify(step.toolCall?.input)}\`\n`;
524
+ break;
525
+ case 'observation':
526
+ message += `${stepNum}. ✅ 观察: ${step.toolResult?.output}\n\n`;
527
+ break;
528
+ }
529
+ });
530
+ message += '\n';
531
+ }
532
+ }
533
+ else if (!ctx.success) {
534
+ message += `**状态**: ❌ 自愈失败\n\n`;
535
+ }
536
+ // 显示原始代码
537
+ message += '**原始代码**:\n';
538
+ message += '```typescript\n';
539
+ message += ctx.originalCode.split('\n').slice(0, 20).join('\n'); // 限制行数
540
+ if (ctx.originalCode.split('\n').length > 20) {
541
+ message += '\n// ... (代码过长,已截断)';
542
+ }
543
+ message += '\n```\n\n';
544
+ });
545
+ message += '\n请根据以上信息(特别是成功的 ReAct 循环步骤)生成修复后的完整测试脚本。';
546
+ return message;
547
+ }
548
+ /**
549
+ * 保存或打印脚本
550
+ */
551
+ async saveOrPrintScript(modifiedScript) {
552
+ const projectId = this.config.projectId;
553
+ const testCaseId = this.config.testCaseId;
554
+ if (projectId && testCaseId) {
555
+ // 保存到 TestCaseRepository
556
+ console.log(`[Runner] 保存脚本到项目 ${projectId} 的用例 ${testCaseId}`);
557
+ try {
558
+ this.storageService.saveTestScript(testCaseId, modifiedScript);
559
+ console.log('[Runner] ✅ 脚本保存成功');
560
+ }
561
+ catch (error) {
562
+ console.error('[Runner] ❌ 脚本保存失败:', error);
563
+ // 如果保存失败,回退到打印
564
+ this.printScript(modifiedScript);
565
+ }
566
+ }
567
+ else {
568
+ // 打印脚本
569
+ this.printScript(modifiedScript);
570
+ }
571
+ }
572
+ /**
573
+ * 打印修复后的脚本
574
+ */
575
+ printScript(script) {
576
+ console.log('\n========================================');
577
+ console.log('[Runner] 修复后的测试脚本');
578
+ console.log('========================================\n');
579
+ console.log(script);
580
+ console.log('\n========================================\n');
581
+ }
582
+ /**
583
+ * 设置变量值
584
+ * @param key 变量名
585
+ * @param value 变量值
586
+ */
587
+ set(key, value) {
588
+ this.vars.set(key, value);
589
+ if (this.config.debugMode) {
590
+ console.log(`[Runner] 💾 设置变量: ${key} = ${JSON.stringify(value).substring(0, 100)}`);
591
+ }
592
+ }
593
+ /**
594
+ * 获取变量值
595
+ * @param key 变量名
596
+ * @returns 变量值,如果不存在则返回 undefined
597
+ */
598
+ get(key) {
599
+ const value = this.vars.get(key);
600
+ if (this.config.debugMode && value !== undefined) {
601
+ console.log(`[Runner] 📖 获取变量: ${key} = ${JSON.stringify(value).substring(0, 100)}`);
602
+ }
603
+ return value;
604
+ }
605
+ /**
606
+ * 检查变量是否存在
607
+ * @param key 变量名
608
+ * @returns 是否存在
609
+ */
610
+ has(key) {
611
+ return this.vars.has(key);
612
+ }
613
+ /**
614
+ * 删除变量
615
+ * @param key 变量名
616
+ * @returns 是否删除成功
617
+ */
618
+ delete(key) {
619
+ const deleted = this.vars.delete(key);
620
+ if (this.config.debugMode && deleted) {
621
+ console.log(`[Runner] 🗑️ 删除变量: ${key}`);
622
+ }
623
+ return deleted;
624
+ }
625
+ /**
626
+ * 清空所有变量
627
+ */
628
+ clear() {
629
+ this.vars.clear();
630
+ if (this.config.debugMode) {
631
+ console.log(`[Runner] 🧹 清空所有变量`);
632
+ }
633
+ }
634
+ /**
635
+ * 获取所有变量名
636
+ * @returns 所有变量的键数组
637
+ */
638
+ keys() {
639
+ return Array.from(this.vars.keys());
640
+ }
641
+ /**
642
+ * 获取所有变量
643
+ * @returns 包含所有键值对的对象
644
+ */
645
+ getAll() {
646
+ return Object.fromEntries(this.vars);
647
+ }
648
+ }
649
+ exports.Runner = Runner;
650
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}