@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,468 @@
1
+ "use strict";
2
+ /**
3
+ * AIHeal 核心类 (MVP + Agent)
4
+ * 实现基础的自愈框架 + 自愈 Agent
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AIHeal = void 0;
8
+ const heal_agent_1 = require("../agents/heal-agent");
9
+ const ModelConfigRepository_1 = require("../../../core-infra/dist/repositories/ModelConfigRepository");
10
+ const TestCaseRepository_1 = require("../../../core-infra/dist/repositories/TestCaseRepository");
11
+ const anthropic_1 = require("@langchain/anthropic");
12
+ const messages_1 = require("@langchain/core/messages");
13
+ /**
14
+ * AIHeal 自愈实体
15
+ */
16
+ class AIHeal {
17
+ constructor(config = {}) {
18
+ this.healContexts = [];
19
+ this.config = {
20
+ maxRetries: 3,
21
+ enableAutoSave: true,
22
+ debugMode: false,
23
+ agentMaxSteps: 5,
24
+ ...config
25
+ };
26
+ this.modelConfigRepo = new ModelConfigRepository_1.ModelConfigRepository();
27
+ // 同步加载原始脚本(优先从数据库)
28
+ this.originalScript = this.loadOriginalScript(config);
29
+ // 如果提供了 projectId 和 testCaseId,初始化 TestCaseRepository(用于后续保存)
30
+ if (config.projectId && config.testCaseId) {
31
+ this.testCaseRepo = new TestCaseRepository_1.TestCaseRepository(config.projectId);
32
+ }
33
+ // 异步初始化 Agent(需要异步加载模型配置)
34
+ // 保存 Promise 以便后续可以等待
35
+ this.modelConfigReady = this.initializeAgent(config.modelConfigId);
36
+ // 延迟初始化 agent(使用默认配置,如果后续加载到模型配置会重新创建)
37
+ this.agent = new heal_agent_1.HealAgent({
38
+ debugMode: this.config.debugMode ?? false
39
+ });
40
+ }
41
+ /**
42
+ * 加载原始脚本(优先从数据库)- 同步方法
43
+ */
44
+ loadOriginalScript(config) {
45
+ // 优先级:
46
+ // 1. 从 TestCaseRepository 加载(如果有 projectId 和 testCaseId)
47
+ // 2. 使用传入的 scriptContent
48
+ // 临时创建 repo 用于加载
49
+ const tempRepo = config.projectId && config.testCaseId
50
+ ? new TestCaseRepository_1.TestCaseRepository(config.projectId)
51
+ : null;
52
+ if (tempRepo && config.testCaseId) {
53
+ try {
54
+ console.log(`[AIHeal] 尝试从数据库加载脚本: ${config.projectId}/${config.testCaseId}`);
55
+ const script = tempRepo.loadTestScript(config.testCaseId);
56
+ if (script) {
57
+ console.log(`[AIHeal] ✅ 从数据库加载脚本成功 (${script.length} 字符)`);
58
+ return script;
59
+ }
60
+ else {
61
+ console.log(`[AIHeal] ⚠️ 数据库中未找到脚本,使用传入的 scriptContent`);
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.error(`[AIHeal] ❌ 从数据库加载脚本失败:`, error);
66
+ console.log(`[AIHeal] 回退到使用传入的 scriptContent`);
67
+ }
68
+ }
69
+ // 使用传入的 scriptContent
70
+ if (config.scriptContent) {
71
+ console.log(`[AIHeal] 使用传入的脚本内容 (${config.scriptContent.length} 字符)`);
72
+ return config.scriptContent;
73
+ }
74
+ else {
75
+ console.log(`[AIHeal] ⚠️ 未提供脚本内容`);
76
+ return '';
77
+ }
78
+ }
79
+ /**
80
+ * 初始化 Agent(异步加载模型配置)
81
+ */
82
+ async initializeAgent(modelConfigId) {
83
+ if (!modelConfigId) {
84
+ return;
85
+ }
86
+ try {
87
+ console.log(`[AIHeal] 加载模型配置: ${modelConfigId}`);
88
+ const config = await this.modelConfigRepo.loadModelConfig(modelConfigId);
89
+ if (!config) {
90
+ console.warn(`[AIHeal] 未找到模型配置: ${modelConfigId}`);
91
+ return;
92
+ }
93
+ this.modelConfig = config;
94
+ console.log(`[AIHeal] 模型配置加载成功: ${this.modelConfig.name} (${this.modelConfig.provider}/${this.modelConfig.modelName})`);
95
+ // 重新创建带有模型配置的 Agent
96
+ this.agent = new heal_agent_1.HealAgent({
97
+ model: this.modelConfig,
98
+ maxSteps: this.config.agentMaxSteps ?? 5,
99
+ debugMode: this.config.debugMode ?? false
100
+ });
101
+ }
102
+ catch (error) {
103
+ console.error(`[AIHeal] 加载模型配置失败: ${error}`);
104
+ }
105
+ }
106
+ /**
107
+ * 执行一个可能需要自愈的步骤
108
+ *
109
+ * @param options - 步骤选项
110
+ * @param fn - 要执行的函数
111
+ * @returns 函数执行结果
112
+ */
113
+ async runStep(options, fn) {
114
+ const startTime = Date.now();
115
+ // 创建自愈上下文
116
+ const context = {
117
+ timestamp: startTime,
118
+ stepDescription: options.description,
119
+ originalCode: fn.toString(),
120
+ variablesBefore: this.captureVariables(options.variables),
121
+ variablesAfter: {}, // 初始化为空,在 finally 块中填充
122
+ recoveryAttempts: 0,
123
+ success: false
124
+ };
125
+ try {
126
+ // 尝试执行原始函数
127
+ const result = await fn();
128
+ context.success = true;
129
+ return result;
130
+ }
131
+ catch (error) {
132
+ // 记录错误
133
+ context.error = error;
134
+ context.stackTrace = error.stack;
135
+ console.log(`[AIHeal] 步骤失败: ${options.description}`);
136
+ console.log(`[AIHeal] 错误: ${error.message}`);
137
+ // 尝试自愈(只尝试一次,让 Agent 通过 ReAct 循环处理)
138
+ console.log(`[AIHeal] 调用 Agent 接管执行`);
139
+ context.recoveryAttempts = 1;
140
+ // 调用 Agent 通过 ReAct 循环执行
141
+ // Agent 会通过 Playwright MCP 工具直接操作浏览器
142
+ const agentResult = await this.agent.heal({
143
+ objective: options.description,
144
+ error: error.message,
145
+ stackTrace: error.stack,
146
+ originalCode: context.originalCode,
147
+ context: {
148
+ page: options.context?.page,
149
+ context: options.context?.context
150
+ },
151
+ variables: options.variables ? Object.fromEntries(Object.entries(options.variables).map(([k, v]) => [k, v.value])) : {},
152
+ maxSteps: this.config.agentMaxSteps ?? 5,
153
+ debugMode: this.config.debugMode ?? false
154
+ });
155
+ if (agentResult.success) {
156
+ console.log(`[AIHeal] Agent 执行成功!`);
157
+ console.log(`[AIHeal] 执行过程: ${agentResult.reasoning}`);
158
+ // 保存 ReAct 步骤记录
159
+ if (agentResult.reactSteps) {
160
+ context.reactSteps = agentResult.reactSteps;
161
+ context.agentSteps = agentResult.steps;
162
+ context.reasoning = agentResult.reasoning;
163
+ }
164
+ // 应用 Agent 更新的变量值
165
+ if (agentResult.updatedVariables && options.variables) {
166
+ for (const [key, value] of Object.entries(agentResult.updatedVariables)) {
167
+ if (options.variables[key]) {
168
+ options.variables[key].value = value;
169
+ console.log(`[AIHeal] 更新变量: ${key}`);
170
+ }
171
+ }
172
+ }
173
+ context.success = true;
174
+ return undefined; // Agent 执行不返回值
175
+ }
176
+ else {
177
+ console.log(`[AIHeal] Agent 执行失败: ${agentResult.errorMessage}`);
178
+ // 即使失败也保存 ReAct 步骤
179
+ if (agentResult.reactSteps) {
180
+ context.reactSteps = agentResult.reactSteps;
181
+ context.agentSteps = agentResult.steps;
182
+ context.reasoning = agentResult.reasoning;
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+ finally {
188
+ // 记录执行后的变量状态
189
+ context.variablesAfter = this.captureVariables(options.variables);
190
+ context.healingTime = Date.now() - startTime;
191
+ // 保存上下文
192
+ this.healContexts.push(context);
193
+ }
194
+ }
195
+ /**
196
+ * 生成自愈摘要
197
+ *
198
+ * @returns 自愈摘要信息
199
+ */
200
+ async summary() {
201
+ // 等待模型配置加载完成
202
+ await this.modelConfigReady;
203
+ console.log('\n[AIHeal] ========== 开始生成摘要 ==========');
204
+ console.log(`[AIHeal] 模型配置状态: ${this.modelConfig ? '已加载' : '未加载'}`);
205
+ console.log(`[AIHeal] enableAutoSave: ${this.config.enableAutoSave}`);
206
+ const healedContexts = this.healContexts.filter(ctx => ctx.recoveryAttempts > 0 || !ctx.success);
207
+ console.log(`[AIHeal] 总步骤数: ${this.healContexts.length}`);
208
+ console.log(`[AIHeal] 自愈步骤数: ${healedContexts.length}`);
209
+ const basicSummary = {
210
+ totalSteps: this.healContexts.length,
211
+ healedSteps: healedContexts.length,
212
+ healingDetails: healedContexts.map(ctx => ({
213
+ step: ctx.stepDescription,
214
+ error: ctx.error?.message || 'Unknown error',
215
+ recoveryTime: ctx.healingTime || 0,
216
+ llmInteractions: 0 // MVP 暂未实现
217
+ }))
218
+ };
219
+ // 如果有自愈发生且配置了 enableAutoSave,生成修复后的脚本
220
+ if (healedContexts.length > 0 && this.config.enableAutoSave && this.modelConfig) {
221
+ console.log('[AIHeal] ✅ 满足生成脚本条件,开始生成...');
222
+ try {
223
+ console.log('\n========================================');
224
+ console.log('[AIHeal] 生成修复后的脚本...');
225
+ console.log('========================================');
226
+ const modifiedScript = await this.generateModifiedScript(healedContexts);
227
+ basicSummary.modifiedScript = modifiedScript;
228
+ // 保存或打印修复后的脚本
229
+ await this.saveOrPrintScript(modifiedScript);
230
+ console.log('[AIHeal] 脚本处理完成');
231
+ console.log('========================================\n');
232
+ }
233
+ catch (error) {
234
+ console.error('[AIHeal] 生成修复脚本失败:', error);
235
+ }
236
+ }
237
+ else {
238
+ // 记录为什么不生成脚本
239
+ if (healedContexts.length === 0) {
240
+ console.log('[AIHeal] ⚠️ 没有自愈发生,跳过脚本生成');
241
+ }
242
+ else if (!this.config.enableAutoSave) {
243
+ console.log('[AIHeal] ⚠️ enableAutoSave 为 false,跳过脚本生成');
244
+ }
245
+ else if (!this.modelConfig) {
246
+ console.log('[AIHeal] ⚠️ 模型配置未加载,跳过脚本生成');
247
+ }
248
+ console.log('[AIHeal] ========== 摘要生成完成 ==========\n');
249
+ }
250
+ return basicSummary;
251
+ }
252
+ /**
253
+ * 捕获变量当前值
254
+ */
255
+ captureVariables(variables) {
256
+ if (!variables)
257
+ return {};
258
+ const captured = {};
259
+ for (const [key, ref] of Object.entries(variables)) {
260
+ captured[key] = ref.value;
261
+ }
262
+ return captured;
263
+ }
264
+ /**
265
+ * 获取原始脚本
266
+ */
267
+ getOriginalScript() {
268
+ return this.originalScript;
269
+ }
270
+ /**
271
+ * 获取所有自愈上下文
272
+ */
273
+ getHealContexts() {
274
+ return [...this.healContexts];
275
+ }
276
+ /**
277
+ * 手动设置模型配置(替代通过 modelConfigId 加载)
278
+ *
279
+ * @param modelConfig - 模型配置对象
280
+ */
281
+ setModelConfig(modelConfig) {
282
+ this.modelConfig = modelConfig;
283
+ console.log(`[AIHeal] 设置模型配置: ${modelConfig.name} (${modelConfig.provider}/${modelConfig.modelName})`);
284
+ // 重新创建带有模型配置的 Agent
285
+ this.agent = new heal_agent_1.HealAgent({
286
+ model: this.modelConfig,
287
+ maxSteps: this.config.agentMaxSteps ?? 5,
288
+ debugMode: this.config.debugMode ?? false
289
+ });
290
+ }
291
+ /**
292
+ * 获取当前使用的模型配置
293
+ */
294
+ getModelConfig() {
295
+ return this.modelConfig;
296
+ }
297
+ /**
298
+ * 使用 LLM 生成修复后的脚本
299
+ */
300
+ async generateModifiedScript(healedContexts) {
301
+ if (!this.modelConfig) {
302
+ throw new Error('模型配置未设置');
303
+ }
304
+ // 创建 LLM 实例
305
+ const llm = this.createLLM();
306
+ // 构建提示词
307
+ const systemPrompt = this.buildSystemPrompt();
308
+ const userMessage = this.buildUserMessage(healedContexts);
309
+ console.log('[AIHeal] 调用 LLM 生成修复脚本...');
310
+ // 调用 LLM
311
+ const response = await llm.invoke([
312
+ new messages_1.SystemMessage(systemPrompt),
313
+ new messages_1.HumanMessage(userMessage)
314
+ ]);
315
+ const modifiedScript = response.content.toString();
316
+ console.log('[AIHeal] 修复脚本生成完成');
317
+ return modifiedScript;
318
+ }
319
+ /**
320
+ * 创建 LLM 实例
321
+ */
322
+ createLLM() {
323
+ if (!this.modelConfig) {
324
+ throw new Error('模型配置未设置');
325
+ }
326
+ switch (this.modelConfig.provider) {
327
+ case 'anthropic':
328
+ return new anthropic_1.ChatAnthropic({
329
+ apiKey: this.modelConfig.apiKey,
330
+ model: this.modelConfig.modelName,
331
+ temperature: 0.2, // 较低温度以保持代码一致性
332
+ maxTokens: 8192
333
+ });
334
+ case 'openai':
335
+ const { ChatOpenAI } = require('@langchain/openai');
336
+ return new ChatOpenAI({
337
+ apiKey: this.modelConfig.apiKey,
338
+ modelName: this.modelConfig.modelName,
339
+ temperature: 0.2,
340
+ maxTokens: 8192,
341
+ configuration: {
342
+ baseURL: this.modelConfig.baseURL
343
+ }
344
+ });
345
+ default:
346
+ throw new Error(`不支持的模型提供商: ${this.modelConfig.provider}`);
347
+ }
348
+ }
349
+ /**
350
+ * 构建系统提示
351
+ */
352
+ buildSystemPrompt() {
353
+ return `
354
+ 你是一位专业的 Playwright 测试工程师,擅长修复失败的自动化测试脚本。
355
+
356
+ ## 你的任务
357
+ 根据提供的原始测试脚本和自愈历史记录,生成修复后的完整测试脚本。
358
+
359
+ ## 修复原则
360
+ 1. **保持逻辑完整**: 修复后的脚本必须能够完成原始测试的目标
361
+ 2. **使用自愈经验**: 参考自愈过程中成功的操作,应用到脚本中
362
+ 3. **保持代码清晰**: 添加必要的注释说明修复原因
363
+ 4. **保留变量处理**: 如果原始代码有变量赋值,确保修复后的代码也能正确获取和赋值
364
+ 5. **使用稳定选择器**: 优先使用稳定的元素定位方式(如 data-testid、aria-label 等)
365
+
366
+ ## 输出格式
367
+ 直接输出完整的 TypeScript 代码,不要使用代码块标记(\`\`\`),不要添加额外说明。
368
+
369
+ ## 注意事项
370
+ - 如果某个步骤被自愈修复,在代码中添加注释:// 修复:[原因]
371
+ - 保持原始代码的结构和风格
372
+ - 确保所有必要的 import 语句都存在
373
+ `.trim();
374
+ }
375
+ /**
376
+ * 构建用户消息
377
+ */
378
+ buildUserMessage(healedContexts) {
379
+ let message = '请修复以下测试脚本:\n\n';
380
+ message += '## 原始测试脚本\n';
381
+ message += '```typescript\n';
382
+ message += this.originalScript || '// (未提供原始脚本)\n';
383
+ message += '\n```\n\n';
384
+ message += '## 自愈历史记录\n\n';
385
+ healedContexts.forEach((ctx, index) => {
386
+ message += `### 步骤 ${index + 1}: ${ctx.stepDescription}\n`;
387
+ if (ctx.error) {
388
+ message += `**错误**: ${ctx.error.message}\n\n`;
389
+ }
390
+ if (ctx.success && ctx.recoveryAttempts > 0) {
391
+ message += `**状态**: ✅ 自愈成功\n`;
392
+ message += `**恢复时间**: ${ctx.healingTime}ms\n`;
393
+ message += `**尝试次数**: ${ctx.recoveryAttempts}\n`;
394
+ message += `**Agent 步数**: ${ctx.agentSteps || 0}\n\n`;
395
+ // 如果有 ReAct 步骤记录,详细展示
396
+ if (ctx.reactSteps && ctx.reactSteps.length > 0) {
397
+ message += `**ReAct 循环详情**:\n\n`;
398
+ ctx.reactSteps.forEach((step, stepIdx) => {
399
+ const stepNum = Math.floor(stepIdx / 3) + 1; // thought-action-observation 算一轮
400
+ switch (step.stepType) {
401
+ case 'thought':
402
+ message += `${stepNum}. 💭 思考: ${step.thought}\n`;
403
+ break;
404
+ case 'action':
405
+ message += `${stepNum}. 🔧 行动: 调用工具 \`${step.toolCall?.name}\`\n`;
406
+ message += ` 参数: \`${JSON.stringify(step.toolCall?.input)}\`\n`;
407
+ break;
408
+ case 'observation':
409
+ message += `${stepNum}. ✅ 观察: ${step.toolResult?.output}\n\n`;
410
+ break;
411
+ }
412
+ });
413
+ message += '\n';
414
+ }
415
+ }
416
+ else if (!ctx.success) {
417
+ message += `**状态**: ❌ 自愈失败\n\n`;
418
+ }
419
+ // 显示原始代码
420
+ message += '**原始代码**:\n';
421
+ message += '```typescript\n';
422
+ message += ctx.originalCode.split('\n').slice(0, 20).join('\n'); // 限制行数
423
+ if (ctx.originalCode.split('\n').length > 20) {
424
+ message += '\n// ... (代码过长,已截断)';
425
+ }
426
+ message += '\n```\n\n';
427
+ });
428
+ message += '\n请根据以上信息(特别是成功的 ReAct 循环步骤)生成修复后的完整测试脚本。';
429
+ return message;
430
+ }
431
+ /**
432
+ * 保存或打印脚本
433
+ */
434
+ async saveOrPrintScript(modifiedScript) {
435
+ const projectId = this.config.projectId;
436
+ const testCaseId = this.config.testCaseId;
437
+ if (projectId && testCaseId) {
438
+ // 保存到 TestCaseRepository
439
+ console.log(`[AIHeal] 保存脚本到项目 ${projectId} 的用例 ${testCaseId}`);
440
+ try {
441
+ const testCaseRepo = new TestCaseRepository_1.TestCaseRepository(projectId);
442
+ testCaseRepo.saveTestScript(testCaseId, modifiedScript);
443
+ console.log('[AIHeal] ✅ 脚本保存成功');
444
+ }
445
+ catch (error) {
446
+ console.error('[AIHeal] ❌ 脚本保存失败:', error);
447
+ // 如果保存失败,回退到打印
448
+ this.printScript(modifiedScript);
449
+ }
450
+ }
451
+ else {
452
+ // 打印脚本
453
+ this.printScript(modifiedScript);
454
+ }
455
+ }
456
+ /**
457
+ * 打印修复后的脚本
458
+ */
459
+ printScript(script) {
460
+ console.log('\n========================================');
461
+ console.log('[AIHeal] 修复后的测试脚本');
462
+ console.log('========================================\n');
463
+ console.log(script);
464
+ console.log('\n========================================\n');
465
+ }
466
+ }
467
+ exports.AIHeal = AIHeal;
468
+ //# sourceMappingURL=ai-heal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-heal.js","sourceRoot":"","sources":["../../src/core/ai-heal.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH,qDAAiD;AACjD,uGAAoG;AACpG,iGAA8F;AAE9F,oDAAqD;AACrD,uDAAuE;AAEvE;;GAEG;AACH,MAAa,MAAM;IAUjB,YAAY,SAAuB,EAAE;QAP7B,iBAAY,GAAkB,EAAE,CAAC;QAQvC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,CAAC;YAChB,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,6CAAqB,EAAE,CAAC;QAEnD,mBAAmB;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEtD,8DAA8D;QAC9D,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,uCAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;QAED,0BAA0B;QAC1B,sBAAsB;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEnE,uCAAuC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAS,CAAC;YACzB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAoB;QAC7C,OAAO;QACP,yDAAyD;QACzD,yBAAyB;QAEzB,iBAAiB;QACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU;YACpD,CAAC,CAAC,IAAI,uCAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAE1D,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;oBAC3D,OAAO,MAAM,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,aAAa,CAAC,MAAM,MAAM,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,aAAsB;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YAEzE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC;YAExH,oBAAoB;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAS,CAAC;gBACzB,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC;gBACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK;aAC1C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CACX,OAAuB,EACvB,EAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,UAAU;QACV,MAAM,OAAO,GAAgB;YAC3B,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,OAAO,CAAC,WAAW;YACpC,YAAY,EAAE,EAAE,CAAC,QAAQ,EAAE;YAC3B,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;YACzD,cAAc,EAAE,EAAE,EAAE,uBAAuB;YAC3C,gBAAgB,EAAE,CAAC;YACnB,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC;YACH,WAAW;YACX,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;YACP,OAAO,CAAC,KAAK,GAAG,KAAc,CAAC;YAC/B,OAAO,CAAC,UAAU,GAAI,KAAe,CAAC,KAAK,CAAC;YAE5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,gBAAiB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAExD,oCAAoC;YACpC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAEtC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAE7B,yBAAyB;YACzB,qCAAqC;YACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACxC,SAAS,EAAE,OAAO,CAAC,WAAW;gBAC9B,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,UAAU,EAAG,KAAe,CAAC,KAAK;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI;oBAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO;iBAClC;gBACD,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAChE,CAAC,CAAC,CAAC,EAAE;gBACN,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC;gBACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK;aAC1C,CAAC,CAAC;YAEH,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;gBAEvD,gBAAgB;gBAChB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC3B,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;oBAC5C,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC;oBACvC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;gBAC5C,CAAC;gBAED,kBAAkB;gBAClB,IAAI,WAAW,CAAC,gBAAgB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACxE,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC3B,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;4BACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,OAAO,SAAc,CAAC,CAAC,eAAe;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;gBAEhE,mBAAmB;gBACnB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC3B,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;oBAC5C,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC;oBACvC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;gBAC5C,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,aAAa;YACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE7C,QAAQ;YACR,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACX,aAAa;QACb,MAAM,IAAI,CAAC,gBAAgB,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAChD,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAExD,MAAM,YAAY,GAAgB;YAChC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YACpC,WAAW,EAAE,cAAc,CAAC,MAAM;YAClC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,EAAE,GAAG,CAAC,eAAe;gBACzB,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe;gBAC5C,YAAY,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;gBAClC,eAAe,EAAE,CAAC,CAAC,WAAW;aAC/B,CAAC,CAAC;SACJ,CAAC;QAEF,sCAAsC;QACtC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;gBAExD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBACzE,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC;gBAE7C,cAAc;gBACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBAE7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;YACb,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,SAA4B;QACnD,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAwB,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,WAAwB;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC;QAEvG,oBAAoB;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAS,CAAC;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,cAA6B;QAChE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,YAAY;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAE7B,QAAQ;QACR,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,SAAS;QACT,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;YAChC,IAAI,wBAAa,CAAC,YAAY,CAAC;YAC/B,IAAI,uBAAY,CAAC,WAAW,CAAC;SAC9B,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,WAAW;gBACd,OAAO,IAAI,yBAAa,CAAC;oBACvB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;oBAC/B,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;oBACjC,WAAW,EAAE,GAAG,EAAE,eAAe;oBACjC,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YAEL,KAAK,QAAQ;gBACX,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBACpD,OAAO,IAAI,UAAU,CAAC;oBACpB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;oBAC/B,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;oBACrC,WAAW,EAAE,GAAG;oBAChB,SAAS,EAAE,IAAI;oBACf,aAAa,EAAE;wBACb,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO;qBAClC;iBACF,CAAC,CAAC;YAEL;gBACE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,OAAO;;;;;;;;;;;;;;;;;;;;CAoBV,CAAC,IAAI,EAAE,CAAC;IACP,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,cAA6B;QACpD,IAAI,OAAO,GAAG,gBAAgB,CAAC;QAC/B,OAAO,IAAI,aAAa,CAAC;QACzB,OAAO,IAAI,iBAAiB,CAAC;QAC7B,OAAO,IAAI,IAAI,CAAC,cAAc,IAAI,gBAAgB,CAAC;QACnD,OAAO,IAAI,WAAW,CAAC;QAEvB,OAAO,IAAI,eAAe,CAAC;QAE3B,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACpC,OAAO,IAAI,UAAU,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,eAAe,IAAI,CAAC;YAE3D,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,IAAI,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC;YAChD,CAAC;YAED,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,kBAAkB,CAAC;gBAC9B,OAAO,IAAI,aAAa,GAAG,CAAC,WAAW,MAAM,CAAC;gBAC9C,OAAO,IAAI,aAAa,GAAG,CAAC,gBAAgB,IAAI,CAAC;gBACjD,OAAO,IAAI,iBAAiB,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC;gBAEtD,sBAAsB;gBACtB,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,OAAO,IAAI,qBAAqB,CAAC;oBACjC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;wBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;wBAE9E,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACtB,KAAK,SAAS;gCACZ,OAAO,IAAI,GAAG,OAAO,YAAY,IAAI,CAAC,OAAO,IAAI,CAAC;gCAClD,MAAM;4BACR,KAAK,QAAQ;gCACX,OAAO,IAAI,GAAG,OAAO,mBAAmB,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,CAAC;gCAClE,OAAO,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;gCAClE,MAAM;4BACR,KAAK,aAAa;gCAChB,OAAO,IAAI,GAAG,OAAO,WAAW,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC;gCAC9D,MAAM;wBACV,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,OAAO,IAAI,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,IAAI,oBAAoB,CAAC;YAClC,CAAC;YAED,SAAS;YACT,OAAO,IAAI,aAAa,CAAC;YACzB,OAAO,IAAI,iBAAiB,CAAC;YAC7B,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;YACxE,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC7C,OAAO,IAAI,qBAAqB,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,WAAW,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,2CAA2C,CAAC;QAEvD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,cAAsB;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAE1C,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC5B,yBAAyB;YACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,SAAS,CAAC,CAAC;gBACvD,YAAY,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBAC3C,eAAe;gBACf,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO;YACP,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,MAAc;QAChC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;CACF;AAzgBD,wBAygBC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 代码执行引擎
3
+ * 在用户的 Browser 上下文中执行代码
4
+ */
5
+ import type { ExecutionResult, ExecutionContext } from '../../src/types';
6
+ /**
7
+ * 在用户的 Browser 上下文中执行代码
8
+ *
9
+ * 核心原理:
10
+ * 1. 创建一个 AsyncFunction
11
+ * 2. 在用户的 context、page 等对象环境中执行
12
+ * 3. 代码中创建的变量都在用户的真实 Browser 中
13
+ * 4. 返回执行结果和局部变量
14
+ */
15
+ export declare function executeInUserContext(code: string, userContext: ExecutionContext): Promise<ExecutionResult>;
16
+ //# sourceMappingURL=execution-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.d.ts","sourceRoot":"","sources":["../../src/core/execution-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElE;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAmC1B"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * 代码执行引擎
4
+ * 在用户的 Browser 上下文中执行代码
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.executeInUserContext = executeInUserContext;
8
+ /**
9
+ * 在用户的 Browser 上下文中执行代码
10
+ *
11
+ * 核心原理:
12
+ * 1. 创建一个 AsyncFunction
13
+ * 2. 在用户的 context、page 等对象环境中执行
14
+ * 3. 代码中创建的变量都在用户的真实 Browser 中
15
+ * 4. 返回执行结果和局部变量
16
+ */
17
+ async function executeInUserContext(code, userContext) {
18
+ // 创建异步函数构造器
19
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
20
+ try {
21
+ // 创建函数,接收用户的 context、page
22
+ // 代码需要返回 { returnValue, variables }
23
+ const fn = new AsyncFunction('context', 'page', code);
24
+ // 在用户的上下文中执行
25
+ const result = await fn.call({}, // this context
26
+ userContext.context, userContext.page);
27
+ // 预期 result 格式: { returnValue: any, variables: { ... } }
28
+ return {
29
+ success: true,
30
+ returnValue: result?.returnValue,
31
+ locals: result?.variables || {},
32
+ error: undefined
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ success: false,
38
+ returnValue: null,
39
+ locals: {},
40
+ error: error
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=execution-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.js","sourceRoot":"","sources":["../../src/core/execution-engine.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAaH,oDAsCC;AA/CD;;;;;;;;GAQG;AACI,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,WAA6B;IAE7B,YAAY;IACZ,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,eAAc,CAAC,CAAC,CAAC,WAAW,CAAC;IAE9E,IAAI,CAAC;QACH,0BAA0B;QAC1B,oCAAoC;QACpC,MAAM,EAAE,GAAG,IAAI,aAAa,CAC1B,SAAS,EACT,MAAM,EACN,IAAI,CACL,CAAC;QAEF,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAC1B,EAAE,EAAE,eAAe;QACnB,WAAW,CAAC,OAAO,EACnB,WAAW,CAAC,IAAI,CACjB,CAAC;QAEF,yDAAyD;QACzD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,MAAM,EAAE,WAAW;YAChC,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE;YAC/B,KAAK,EAAE,SAAS;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,KAAc;SACtB,CAAC;IACJ,CAAC;AACH,CAAC"}