@cotestdev/ai-runner 0.0.3 → 0.0.5

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 (115) hide show
  1. package/dist/ai-runner/src/runner.d.ts +1 -0
  2. package/dist/ai-runner/src/runner.d.ts.map +1 -1
  3. package/dist/ai-runner/src/runner.js +9 -1
  4. package/dist/ai-runner/src/runner.js.map +1 -1
  5. package/package.json +6 -1
  6. package/dist/agents/heal-agent.d.ts +0 -30
  7. package/dist/agents/heal-agent.d.ts.map +0 -1
  8. package/dist/agents/heal-agent.js +0 -76
  9. package/dist/agents/heal-agent.js.map +0 -1
  10. package/dist/agents/healer.d.ts +0 -73
  11. package/dist/agents/healer.d.ts.map +0 -1
  12. package/dist/agents/healer.js +0 -538
  13. package/dist/agents/healer.js.map +0 -1
  14. package/dist/agents/tools/form.d.ts +0 -22
  15. package/dist/agents/tools/form.d.ts.map +0 -1
  16. package/dist/agents/tools/form.js +0 -134
  17. package/dist/agents/tools/form.js.map +0 -1
  18. package/dist/agents/tools/index.d.ts +0 -13
  19. package/dist/agents/tools/index.d.ts.map +0 -1
  20. package/dist/agents/tools/index.js +0 -33
  21. package/dist/agents/tools/index.js.map +0 -1
  22. package/dist/agents/tools/navigate.d.ts +0 -22
  23. package/dist/agents/tools/navigate.d.ts.map +0 -1
  24. package/dist/agents/tools/navigate.js +0 -74
  25. package/dist/agents/tools/navigate.js.map +0 -1
  26. package/dist/agents/tools/snapshot.d.ts +0 -22
  27. package/dist/agents/tools/snapshot.d.ts.map +0 -1
  28. package/dist/agents/tools/snapshot.js +0 -110
  29. package/dist/agents/tools/snapshot.js.map +0 -1
  30. package/dist/agents/tools/verify.d.ts +0 -34
  31. package/dist/agents/tools/verify.d.ts.map +0 -1
  32. package/dist/agents/tools/verify.js +0 -169
  33. package/dist/agents/tools/verify.js.map +0 -1
  34. package/dist/agents/tools/wait.d.ts +0 -22
  35. package/dist/agents/tools/wait.d.ts.map +0 -1
  36. package/dist/agents/tools/wait.js +0 -104
  37. package/dist/agents/tools/wait.js.map +0 -1
  38. package/dist/agents/types.d.ts +0 -51
  39. package/dist/agents/types.d.ts.map +0 -1
  40. package/dist/agents/types.js +0 -6
  41. package/dist/agents/types.js.map +0 -1
  42. package/dist/ai-runner/src/examples/test-final.d.ts +0 -6
  43. package/dist/ai-runner/src/examples/test-final.d.ts.map +0 -1
  44. package/dist/ai-runner/src/examples/test-final.js +0 -73
  45. package/dist/ai-runner/src/examples/test-final.js.map +0 -1
  46. package/dist/ai-runner/src/examples/test-simple-tools.d.ts +0 -6
  47. package/dist/ai-runner/src/examples/test-simple-tools.d.ts.map +0 -1
  48. package/dist/ai-runner/src/examples/test-simple-tools.js +0 -149
  49. package/dist/ai-runner/src/examples/test-simple-tools.js.map +0 -1
  50. package/dist/ai-runner/src/examples/test-working.d.ts +0 -5
  51. package/dist/ai-runner/src/examples/test-working.d.ts.map +0 -1
  52. package/dist/ai-runner/src/examples/test-working.js +0 -43
  53. package/dist/ai-runner/src/examples/test-working.js.map +0 -1
  54. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts +0 -15
  55. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts.map +0 -1
  56. package/dist/ai-runner/src/examples/v-test-backend-adapter.js +0 -240
  57. package/dist/ai-runner/src/examples/v-test-backend-adapter.js.map +0 -1
  58. package/dist/core/runner.d.ts +0 -194
  59. package/dist/core/runner.d.ts.map +0 -1
  60. package/dist/core/runner.js +0 -650
  61. package/dist/core/runner.js.map +0 -1
  62. package/dist/index.d.ts +0 -8
  63. package/dist/index.d.ts.map +0 -1
  64. package/dist/index.js +0 -11
  65. package/dist/index.js.map +0 -1
  66. package/dist/types/external.d.ts +0 -6
  67. package/dist/types/external.d.ts.map +0 -1
  68. package/dist/types/external.js +0 -7
  69. package/dist/types/external.js.map +0 -1
  70. package/dist/types/index.d.ts +0 -153
  71. package/dist/types/index.d.ts.map +0 -1
  72. package/dist/types/index.js +0 -26
  73. package/dist/types/index.js.map +0 -1
  74. package/docs/PLAYWRIGHT_MCP_ADAPTER.md +0 -132
  75. package/docs/SCHEMA_EXTRACTION.md +0 -224
  76. package/playwright-report/data/26c3117906b682c9086892b9834f119fdef0ca60.webm +0 -0
  77. package/playwright-report/data/534e0d700217810c792ffbaf34b2d4160992d0ec.md +0 -210
  78. package/playwright-report/data/56a09464231ba6c36c441f95019b40b9238c9da5.zip +0 -0
  79. package/playwright-report/data/9c6ffeb3926521c8a7b610e82e1b29d49e859932.png +0 -0
  80. package/playwright-report/index.html +0 -85
  81. package/playwright-report/trace/assets/codeMirrorModule-Bucv2d7q.js +0 -25
  82. package/playwright-report/trace/assets/defaultSettingsView-BEpdCv1S.js +0 -266
  83. package/playwright-report/trace/codeMirrorModule.C3UTv-Ge.css +0 -1
  84. package/playwright-report/trace/codicon.DCmgc-ay.ttf +0 -0
  85. package/playwright-report/trace/defaultSettingsView.ConWv5KN.css +0 -1
  86. package/playwright-report/trace/index.BxQ34UMZ.js +0 -2
  87. package/playwright-report/trace/index.C4Y3Aw8n.css +0 -1
  88. package/playwright-report/trace/index.html +0 -43
  89. package/playwright-report/trace/manifest.webmanifest +0 -16
  90. package/playwright-report/trace/playwright-logo.svg +0 -9
  91. package/playwright-report/trace/snapshot.html +0 -21
  92. package/playwright-report/trace/sw.bundle.js +0 -3
  93. package/playwright-report/trace/uiMode.BWTwXl41.js +0 -5
  94. package/playwright-report/trace/uiMode.Btcz36p_.css +0 -1
  95. package/playwright-report/trace/uiMode.html +0 -17
  96. package/playwright-report/trace/xtermModule.DYP7pi_n.css +0 -32
  97. package/playwright.config.ts +0 -38
  98. package/src/agents/logger.ts +0 -20
  99. package/src/agents/playwright-executor.ts +0 -252
  100. package/src/agents/tools/playwright-backend-adapter.ts +0 -134
  101. package/src/agents/tools/playwright-mcp-types.d.ts +0 -71
  102. package/src/agents/types.ts +0 -80
  103. package/src/index.ts +0 -27
  104. package/src/runner.ts +0 -214
  105. package/src/tools/index.ts +0 -48
  106. package/src/tools/playwright-groups.ts +0 -54
  107. package/src/types/external.ts +0 -7
  108. package/src/types/index.ts +0 -118
  109. package/test-results/.last-run.json +0 -6
  110. package/test-results/tests-agent-test-heal-agent-Register-user-1-chromium/error-context.md +0 -210
  111. package/test-results/tests-agent-test-heal-agent-Register-user-1-chromium/test-failed-1.png +0 -0
  112. package/test-results/tests-agent-test-heal-agent-Register-user-1-chromium/trace.zip +0 -0
  113. package/test-results/tests-agent-test-heal-agent-Register-user-1-chromium/video.webm +0 -0
  114. package/tests/agent/test-heal-agent.spec.ts +0 -54
  115. package/tsconfig.json +0 -26
@@ -1,650 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}