@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,328 @@
1
+ "use strict";
2
+ /**
3
+ * LangGraph Agent 实现
4
+ * 使用新的 langchain createAgent API
5
+ *
6
+ * 参考:https://www.npmjs.com/package/langchain
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LangGraphAgent = void 0;
10
+ const langchain_1 = require("langchain");
11
+ const anthropic_1 = require("@langchain/anthropic");
12
+ const tools_1 = require("@langchain/core/tools");
13
+ // ============================================================================
14
+ // Playwright 工具集(使用 DynamicTool 避免类型冲突)
15
+ // ============================================================================
16
+ /**
17
+ * 创建 Playwright 工具集
18
+ */
19
+ function createPlaywrightTools(page) {
20
+ return [
21
+ // Click 工具
22
+ new tools_1.DynamicTool({
23
+ name: 'click',
24
+ description: '点击页面上的元素。输入 CSS 选择器字符串,支持多个选择器(逗号分隔)。例如:button, #submit, .btn-primary',
25
+ func: async (input) => {
26
+ // 支持多个选择器(逗号分隔)
27
+ const selectors = input.split(',').map((s) => s.trim());
28
+ let lastError = null;
29
+ for (const sel of selectors) {
30
+ try {
31
+ await page.click(sel, { timeout: 5000 });
32
+ return `成功点击元素: ${sel}`;
33
+ }
34
+ catch (e) {
35
+ lastError = e;
36
+ continue;
37
+ }
38
+ }
39
+ throw lastError || new Error(`所有选择器都失败: ${input}`);
40
+ }
41
+ }),
42
+ // Fill 工具
43
+ new tools_1.DynamicTool({
44
+ name: 'fill',
45
+ description: '填写表单输入框。输入格式:selector,value(逗号分隔)。例如:#username,john',
46
+ func: async (input) => {
47
+ const parts = input.split(',');
48
+ const selector = parts[0].trim();
49
+ const value = parts.slice(1).join(',').trim();
50
+ await page.fill(selector, value);
51
+ return `成功填写 ${selector} = ${value}`;
52
+ }
53
+ }),
54
+ // WaitForSelector 工具
55
+ new tools_1.DynamicTool({
56
+ name: 'wait_for_selector',
57
+ description: '等待元素出现。输入格式:selector,timeout(默认5000ms)',
58
+ func: async (input) => {
59
+ const parts = input.split(',');
60
+ const selector = parts[0].trim();
61
+ const timeout = parseInt(parts[1]) || 5000;
62
+ await page.waitForSelector(selector, { timeout });
63
+ return `元素已出现: ${selector}`;
64
+ }
65
+ }),
66
+ // WaitForTimeout 工具
67
+ new tools_1.DynamicTool({
68
+ name: 'wait',
69
+ description: '等待指定时间(毫秒)。',
70
+ func: async (input) => {
71
+ const ms = parseInt(input) || 2000;
72
+ await page.waitForTimeout(ms);
73
+ return `等待 ${ms}ms 完成`;
74
+ }
75
+ }),
76
+ // Screenshot 工具
77
+ new tools_1.DynamicTool({
78
+ name: 'screenshot',
79
+ description: '截取当前页面截图并保存。不需要输入参数。',
80
+ func: async () => {
81
+ await page.screenshot({ path: 'heal-debug-screenshot.png' });
82
+ return '截图已保存到 heal-debug-screenshot.png';
83
+ }
84
+ }),
85
+ // Get URL 工具
86
+ new tools_1.DynamicTool({
87
+ name: 'get_url',
88
+ description: '获取当前页面的 URL。不需要输入参数。',
89
+ func: async () => {
90
+ const url = page.url();
91
+ return `当前 URL: ${url}`;
92
+ }
93
+ }),
94
+ // Get Content 工具
95
+ new tools_1.DynamicTool({
96
+ name: 'get_content',
97
+ description: '获取页面的 HTML 内容。不需要输入参数。',
98
+ func: async () => {
99
+ const content = await page.content();
100
+ return `页面内容(前500字符):\n${content.substring(0, 500)}...`;
101
+ }
102
+ }),
103
+ // Evaluate 工具
104
+ new tools_1.DynamicTool({
105
+ name: 'evaluate',
106
+ description: '在页面中执行 JavaScript 代码。',
107
+ func: async (input) => {
108
+ const result = await page.evaluate(input);
109
+ return `执行结果: ${JSON.stringify(result)}`;
110
+ }
111
+ })
112
+ ];
113
+ }
114
+ // ============================================================================
115
+ // LangGraph Agent 类
116
+ // ============================================================================
117
+ class LangGraphAgent {
118
+ constructor(modelConfig, config = {}) {
119
+ this.modelConfig = modelConfig;
120
+ this.maxSteps = config.maxSteps ?? 5;
121
+ }
122
+ /**
123
+ * 执行 ReAct 循环(使用新的 createAgent API)
124
+ */
125
+ async execute(state) {
126
+ console.log('\n========================================');
127
+ console.log('[LangGraph Agent] 开始执行(使用 langchain createAgent)');
128
+ console.log('========================================');
129
+ console.log(`[LangGraph] 模型: ${this.modelConfig.provider}/${this.modelConfig.modelName}`);
130
+ console.log(`[LangGraph] 目标: ${state.objective}`);
131
+ console.log(`[LangGraph] 错误: ${state.error}`);
132
+ const page = state.context?.page;
133
+ if (!page) {
134
+ throw new Error('缺少 page 对象');
135
+ }
136
+ try {
137
+ // 创建 LLM 实例
138
+ const llm = this.createLLM();
139
+ // 创建 Playwright 工具
140
+ const tools = createPlaywrightTools(page);
141
+ // 使用新的 createAgent API
142
+ const agent = (0, langchain_1.createAgent)({
143
+ model: llm,
144
+ tools: tools, // Cast to any to bypass duplicate @langchain/core type incompatibility
145
+ systemPrompt: this.buildSystemPrompt(state)
146
+ }); // Cast entire config to bypass type instantiation issues
147
+ console.log(`[LangGraph] 发送消息给 LLM...`);
148
+ // 调用 agent
149
+ const result = await agent.invoke({
150
+ messages: [{
151
+ role: 'user',
152
+ content: this.buildUserMessage(state)
153
+ }]
154
+ });
155
+ // 提取结果
156
+ const success = this.isSuccess(result);
157
+ const reasoning = this.extractReasoning(result);
158
+ const steps = this.countSteps(result);
159
+ console.log(`[LangGraph] 执行${success ? '成功 ✅' : '失败 ❌'}`);
160
+ console.log(`[LangGraph] 步数: ${steps}`);
161
+ console.log('========================================\n');
162
+ return {
163
+ success,
164
+ reasoning,
165
+ steps,
166
+ updatedVariables: state.variables
167
+ };
168
+ }
169
+ catch (error) {
170
+ console.error(`[LangGraph] 执行失败: ${error}`);
171
+ return {
172
+ success: false,
173
+ errorMessage: error.message,
174
+ reasoning: `LangGraph Agent 执行失败: ${error.message}`,
175
+ steps: 0,
176
+ updatedVariables: state.variables
177
+ };
178
+ }
179
+ }
180
+ /**
181
+ * 创建 LLM 实例
182
+ */
183
+ createLLM() {
184
+ switch (this.modelConfig.provider) {
185
+ case 'anthropic':
186
+ return new anthropic_1.ChatAnthropic({
187
+ apiKey: this.modelConfig.apiKey,
188
+ model: this.modelConfig.modelName,
189
+ temperature: this.modelConfig.temperature ?? 0,
190
+ maxTokens: this.modelConfig.maxTokens ?? 4096
191
+ });
192
+ case 'openai':
193
+ // 需要安装 @langchain/openai
194
+ const { ChatOpenAI } = require('@langchain/openai');
195
+ return new ChatOpenAI({
196
+ apiKey: this.modelConfig.apiKey,
197
+ modelName: this.modelConfig.modelName,
198
+ temperature: this.modelConfig.temperature ?? 0,
199
+ maxTokens: this.modelConfig.maxTokens ?? 4096,
200
+ configuration: {
201
+ baseURL: this.modelConfig.baseURL
202
+ }
203
+ });
204
+ default:
205
+ throw new Error(`不支持的模型提供商: ${this.modelConfig.provider}`);
206
+ }
207
+ }
208
+ /**
209
+ * 构建系统提示
210
+ */
211
+ buildSystemPrompt(state) {
212
+ return `
213
+ 你是 Playwright 测试自愈专家,擅长分析和修复浏览器自动化测试中的错误。
214
+
215
+ ## 可用工具
216
+ - click(selector): 点击元素(支持多个选择器,用逗号分隔)
217
+ - fill(selector,value): 填写表单
218
+ - wait_for_selector(selector,timeout): 等待元素出现
219
+ - wait(ms): 等待指定时间(毫秒)
220
+ - screenshot(): 截图
221
+ - get_url(): 获取当前 URL
222
+ - get_content(): 获取页面内容
223
+ - evaluate(script): 执行 JavaScript
224
+
225
+ ## 工作流程
226
+ 1. **分析错误**: 理解错误原因和当前状态
227
+ 2. **选择工具**: 根据错误选择合适的工具
228
+ 3. **执行操作**: 调用工具并观察结果
229
+ 4. **判断结果**: 判断是否成功,决定下一步
230
+ 5. **循环**: 直到成功或达到最大步数
231
+
232
+ ## 策略提示
233
+ - 超时错误: 先用 wait_for_selector 等待元素,再重试操作
234
+ - 元素未找到: 尝试多个选择器,或截图查看页面状态
235
+ - 选择器错误: 尝试更通用的选择器(如 button, a, input)
236
+ - 网络延迟: 使用 wait() 等待一段时间
237
+ - 不确定状态: 使用 screenshot() 或 get_url() 检查
238
+
239
+ 请使用工具完成自愈任务。
240
+ `.trim();
241
+ }
242
+ /**
243
+ * 构建用户消息
244
+ */
245
+ buildUserMessage(state) {
246
+ return `
247
+ 请帮我修复以下测试错误:
248
+
249
+ ## 当前任务
250
+ ${state.objective}
251
+
252
+ ## 错误信息
253
+ ${state.error}
254
+
255
+ ## 原始代码
256
+ \`\`\`typescript
257
+ ${state.originalCode}
258
+ \`\`\`
259
+
260
+ 请使用提供的工具分析问题并尝试修复。
261
+ `.trim();
262
+ }
263
+ /**
264
+ * 判断是否成功
265
+ */
266
+ isSuccess(result) {
267
+ if (!result || !result.messages) {
268
+ return false;
269
+ }
270
+ const lastMessage = result.messages[result.messages.length - 1];
271
+ const content = lastMessage.content?.toString() || '';
272
+ // 检查是否包含成功关键词
273
+ return content.includes('成功') ||
274
+ content.toLowerCase().includes('success') ||
275
+ !content.includes('失败') && !content.toLowerCase().includes('error');
276
+ }
277
+ /**
278
+ * 提取推理过程
279
+ */
280
+ extractReasoning(result) {
281
+ if (!result || !result.messages) {
282
+ return '无法提取推理过程';
283
+ }
284
+ // 收集所有消息内容
285
+ const messages = result.messages.map((msg) => {
286
+ if (msg.content) {
287
+ if (typeof msg.content === 'string') {
288
+ return msg.content;
289
+ }
290
+ else if (Array.isArray(msg.content)) {
291
+ return msg.content
292
+ .map((item) => {
293
+ if (item.type === 'text')
294
+ return item.text;
295
+ if (item.type === 'tool-use')
296
+ return `[调用工具: ${item.name}]`;
297
+ return JSON.stringify(item);
298
+ })
299
+ .join('\n');
300
+ }
301
+ }
302
+ return '';
303
+ });
304
+ return messages.filter(Boolean).join('\n\n---\n\n');
305
+ }
306
+ /**
307
+ * 计算步数
308
+ */
309
+ countSteps(result) {
310
+ if (!result || !result.messages) {
311
+ return 0;
312
+ }
313
+ // 计算工具调用次数
314
+ let toolCalls = 0;
315
+ for (const msg of result.messages) {
316
+ if (msg.content && Array.isArray(msg.content)) {
317
+ for (const item of msg.content) {
318
+ if (item.type === 'tool-use') {
319
+ toolCalls++;
320
+ }
321
+ }
322
+ }
323
+ }
324
+ return Math.ceil(toolCalls / 2); // 每次工具调用 + 结果算一步
325
+ }
326
+ }
327
+ exports.LangGraphAgent = LangGraphAgent;
328
+ //# sourceMappingURL=langgraph-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph-agent.js","sourceRoot":"","sources":["../../src/agents/langgraph-agent.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAwC;AACxC,oDAAqD;AACrD,iDAAoD;AAIpD,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAS;IACtC,OAAO;QACL,WAAW;QACX,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,uEAAuE;YACpF,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,gBAAgB;gBAChB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,IAAI,SAAS,GAAiB,IAAI,CAAC;gBAEnC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;wBACzC,OAAO,WAAW,GAAG,EAAE,CAAC;oBAC1B,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,SAAS,GAAG,CAAU,CAAC;wBACvB,SAAS;oBACX,CAAC;gBACH,CAAC;gBAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;YACrD,CAAC;SACF,CAAC;QAEF,UAAU;QACV,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,qDAAqD;YAClE,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO,QAAQ,QAAQ,MAAM,KAAK,EAAE,CAAC;YACvC,CAAC;SACF,CAAC;QAEF,qBAAqB;QACrB,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,wCAAwC;YACrD,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClD,OAAO,UAAU,QAAQ,EAAE,CAAC;YAC9B,CAAC;SACF,CAAC;QAEF,oBAAoB;QACpB,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;gBACnC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC9B,OAAO,MAAM,EAAE,OAAO,CAAC;YACzB,CAAC;SACF,CAAC;QAEF,gBAAgB;QAChB,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAC7D,OAAO,kCAAkC,CAAC;YAC5C,CAAC;SACF,CAAC;QAEF,aAAa;QACb,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,OAAO,WAAW,GAAG,EAAE,CAAC;YAC1B,CAAC;SACF,CAAC;QAEF,iBAAiB;QACjB,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,wBAAwB;YACrC,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,OAAO,kBAAkB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;YAC1D,CAAC;SACF,CAAC;QAEF,cAAc;QACd,IAAI,mBAAW,CAAC;YACd,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAa,cAAc;IAIzB,YAAY,WAAwB,EAAE,SAAgC,EAAE;QACtE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAAqB;QACjC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAEjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,CAAC;YACH,YAAY;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAE7B,mBAAmB;YACnB,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAE1C,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAA,uBAAW,EAAC;gBACxB,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,KAAY,EAAE,uEAAuE;gBAC5F,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;aACrC,CAAC,CAAC,CAAC,yDAAyD;YAEpE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAExC,WAAW;YACX,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBAChC,QAAQ,EAAE,CAAC;wBACT,IAAI,EAAE,MAAe;wBACrB,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;qBACtC,CAAC;aACH,CAAC,CAAC;YAEH,OAAO;YACP,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAEtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAE1D,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,KAAK;gBACL,gBAAgB,EAAE,KAAK,CAAC,SAAS;aAClC,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;YAE5C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAG,KAAe,CAAC,OAAO;gBACtC,SAAS,EAAE,yBAA0B,KAAe,CAAC,OAAO,EAAE;gBAC9D,KAAK,EAAE,CAAC;gBACR,gBAAgB,EAAE,KAAK,CAAC,SAAS;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS;QACf,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,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC;oBAC9C,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI;iBAC9C,CAAC,CAAC;YAEL,KAAK,QAAQ;gBACX,yBAAyB;gBACzB,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,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC;oBAC9C,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,IAAI;oBAC7C,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,CAAC,KAAqB;QAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BV,CAAC,IAAI,EAAE,CAAC;IACP,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAqB;QAC5C,OAAO;;;;EAIT,KAAK,CAAC,SAAS;;;EAGf,KAAK,CAAC,KAAK;;;;EAIX,KAAK,CAAC,YAAY;;;;CAInB,CAAC,IAAI,EAAE,CAAC;IACP,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,MAAW;QAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAEtD,cAAc;QACd,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YACzC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,MAAW;QAClC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,WAAW;QACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;YAChD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACpC,OAAO,GAAG,CAAC,OAAO,CAAC;gBACrB,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,OAAO,GAAG,CAAC,OAAO;yBACf,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;wBACjB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;4BAAE,OAAO,IAAI,CAAC,IAAI,CAAC;wBAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;4BAAE,OAAO,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC;wBAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,MAAW;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,WAAW;QACX,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC7B,SAAS,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;IACpD,CAAC;CACF;AA3OD,wCA2OC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ReAct Agent 实现
3
+ *
4
+ * MVP 版本:使用规则引擎模拟 ReAct 循环
5
+ * 未来版本:使用 LangGraph 的 createReactAgent
6
+ *
7
+ * 参考:docs/langgraph-integration-guide.md
8
+ */
9
+ import type { HealAgentState, HealAgentResult } from '../../src/agents/types';
10
+ export declare class ReactAgent {
11
+ private maxSteps;
12
+ constructor(config?: {
13
+ maxSteps?: number;
14
+ debugMode?: boolean;
15
+ model?: any;
16
+ });
17
+ /**
18
+ * 执行 ReAct 循环(使用 LangGraph Agent)
19
+ */
20
+ execute(state: HealAgentState): Promise<HealAgentResult>;
21
+ /**
22
+ * MVP 实现:手动模拟 ReAct 循环(未来替换为真实 LLM Agent)
23
+ */
24
+ private executeWithMVP;
25
+ /**
26
+ * 决策:基于当前状态决定下一步操作
27
+ */
28
+ private decide;
29
+ /**
30
+ * 从目标描述推断操作
31
+ */
32
+ private inferActionFromObjective;
33
+ /**
34
+ * 执行工具
35
+ */
36
+ private executeTool;
37
+ /**
38
+ * 解析动作字符串
39
+ */
40
+ private parseAction;
41
+ /**
42
+ * 判断是否应该停止循环
43
+ */
44
+ private shouldStop;
45
+ /**
46
+ * 创建 Playwright 工具(用于真实 LLM Agent)
47
+ * TODO: 实现 LangChain Tool 接口
48
+ * 参考:docs/langgraph-integration-guide.md
49
+ */
50
+ private createPlaywrightTools;
51
+ }
52
+ //# sourceMappingURL=react-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-agent.d.ts","sourceRoot":"","sources":["../../src/agents/react-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,MAAM,SAAS,CAAC;AAMhF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAA;KAAO;IAUhF;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IA4B9D;;OAEG;YACW,cAAc;IAwD5B;;OAEG;IACH,OAAO,CAAC,MAAM;IAqCd;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;OAEG;YACW,WAAW;IAiEzB;;OAEG;IACH,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;CAI9B"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ /**
3
+ * ReAct Agent 实现
4
+ *
5
+ * MVP 版本:使用规则引擎模拟 ReAct 循环
6
+ * 未来版本:使用 LangGraph 的 createReactAgent
7
+ *
8
+ * 参考:docs/langgraph-integration-guide.md
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ReactAgent = void 0;
12
+ // ============================================================================
13
+ // ReAct Agent 类
14
+ // ============================================================================
15
+ class ReactAgent {
16
+ constructor(config = {}) {
17
+ this.maxSteps = config.maxSteps ?? 3;
18
+ // TODO: 未来使用真实 LLM
19
+ // const llm = config.model || new ChatAnthropic({
20
+ // apiKey: process.env.ANTHROPIC_API_KEY,
21
+ // model: 'claude-3-5-sonnet-20241022'
22
+ // });
23
+ }
24
+ /**
25
+ * 执行 ReAct 循环(使用 LangGraph Agent)
26
+ */
27
+ async execute(state) {
28
+ console.log('\n========================================');
29
+ console.log('[ReAct Agent] 开始执行(使用 LangGraph)');
30
+ console.log('========================================');
31
+ const page = state.context?.page;
32
+ if (!page) {
33
+ throw new Error('缺少 page 对象');
34
+ }
35
+ // 创建 Playwright 工具
36
+ const tools = this.createPlaywrightTools(page);
37
+ // 使用 LangGraph 的 createReactAgent
38
+ // 注意:这需要 LLM API(如 Anthropic Claude)
39
+ // MVP 版本:由于没有真实的 LLM API key,我们使用简化的实现
40
+ const result = await this.executeWithMVP(page, state);
41
+ console.log('\n========================================');
42
+ console.log('[ReAct Agent] 执行结束');
43
+ console.log(`结果: ${result.success ? '成功 ✅' : '失败 ❌'}`);
44
+ console.log(`步数: ${result.steps}/${this.maxSteps}`);
45
+ console.log('========================================\n');
46
+ return result;
47
+ }
48
+ /**
49
+ * MVP 实现:手动模拟 ReAct 循环(未来替换为真实 LLM Agent)
50
+ */
51
+ async executeWithMVP(page, state) {
52
+ console.log('[ReAct] 使用 MVP 实现(规则引擎)');
53
+ console.log(`[ReAct] 目标: ${state.objective}`);
54
+ console.log(`[ReAct] 错误: ${state.error}`);
55
+ let currentStep = 0;
56
+ let success = false;
57
+ const thoughts = [];
58
+ const actions = [];
59
+ const observations = [];
60
+ let updatedVariables = { ...state.variables };
61
+ // ReAct 循环
62
+ while (currentStep < this.maxSteps && !success) {
63
+ console.log(`\n[ReAct] ===== 第 ${currentStep + 1} 步 =====`);
64
+ // 1. Thought: 分析并决策
65
+ const { thought, action } = this.decide(state, currentStep, observations[currentStep - 1]);
66
+ thoughts.push(thought);
67
+ actions.push(action);
68
+ console.log(`[ReAct] 🤔 思考: ${thought}`);
69
+ console.log(`[ReAct] ⚡ 行动: ${action}`);
70
+ // 2. Action: 执行工具
71
+ const { observation, success: actionSuccess, variables } = await this.executeTool(page, action, state);
72
+ observations.push(observation);
73
+ success = actionSuccess;
74
+ if (variables) {
75
+ updatedVariables = { ...updatedVariables, ...variables };
76
+ }
77
+ console.log(`[ReAct] 👁️ 观察: ${observation}`);
78
+ console.log(`[ReAct] ${actionSuccess ? '✅ 成功' : '❌ 失败'}`);
79
+ // 3. Reflection: 判断是否继续
80
+ if (this.shouldStop(success, action, currentStep)) {
81
+ console.log(`[ReAct] 🔍 反思: ${success ? '任务完成' : '达到最大步数'},结束循环`);
82
+ break;
83
+ }
84
+ currentStep++;
85
+ }
86
+ return {
87
+ success,
88
+ reasoning: `
89
+ 执行过程:
90
+ ${thoughts.map((t, i) => `步骤 ${i + 1}: ${t}\n 操作: ${actions[i]}\n 结果: ${observations[i]}`).join('\n\n')}
91
+ `.trim(),
92
+ steps: currentStep + 1,
93
+ updatedVariables
94
+ };
95
+ }
96
+ /**
97
+ * 决策:基于当前状态决定下一步操作
98
+ */
99
+ decide(state, currentStep, lastObservation) {
100
+ const error = state.error.toLowerCase();
101
+ const objective = state.objective.toLowerCase();
102
+ // MVP 规则引擎
103
+ if (currentStep === 0) {
104
+ // 第一步:等待或准备
105
+ if (error.includes('timeout') || error.includes('not found')) {
106
+ return {
107
+ thought: `检测到超时或元素未找到错误。策略:先等待元素加载完成,然后重试原始操作。`,
108
+ action: `waitForSelector('button, a, [role="button"]', 5000)`
109
+ };
110
+ }
111
+ else {
112
+ return {
113
+ thought: `遇到错误:${state.error}。策略:等待一段时间后重试。`,
114
+ action: `waitForTimeout(2000)`
115
+ };
116
+ }
117
+ }
118
+ else if (currentStep === 1) {
119
+ // 第二步:执行原始操作
120
+ return {
121
+ thought: `等待完成。现在尝试执行原始目标操作:${state.objective}`,
122
+ action: this.inferActionFromObjective(objective)
123
+ };
124
+ }
125
+ else {
126
+ // 第三步及以后:检查状态或尝试其他方法
127
+ return {
128
+ thought: `前两步未成功。策略:检查页面状态,尝试截图或获取 URL 了解当前情况。`,
129
+ action: `screenshot()`
130
+ };
131
+ }
132
+ }
133
+ /**
134
+ * 从目标描述推断操作
135
+ */
136
+ inferActionFromObjective(objective) {
137
+ if (objective.includes('点击') || objective.includes('click')) {
138
+ return `click('button, a, [role="button"]')`;
139
+ }
140
+ else if (objective.includes('输入') || objective.includes('填写') || objective.includes('fill')) {
141
+ return `fill('input, textarea', 'test-value')`;
142
+ }
143
+ else if (objective.includes('等待') || objective.includes('wait')) {
144
+ return `waitForTimeout(2000)`;
145
+ }
146
+ else {
147
+ return `waitForTimeout(2000)`;
148
+ }
149
+ }
150
+ /**
151
+ * 执行工具
152
+ */
153
+ async executeTool(page, actionStr, state) {
154
+ try {
155
+ const { tool, params } = this.parseAction(actionStr);
156
+ switch (tool) {
157
+ case 'click':
158
+ // 尝试多种选择器
159
+ const selectors = params.selector.split(',').map((s) => s.trim());
160
+ for (const selector of selectors) {
161
+ try {
162
+ await page.click(selector, { timeout: 3000 });
163
+ return { observation: `成功点击元素: ${selector}`, success: true };
164
+ }
165
+ catch (e) {
166
+ continue;
167
+ }
168
+ }
169
+ return { observation: `所有选择器都失败: ${params.selector}`, success: false };
170
+ case 'fill':
171
+ await page.fill(params.selector, params.value);
172
+ return { observation: `成功填写: ${params.selector}`, success: true };
173
+ case 'waitForSelector':
174
+ await page.waitForSelector(params.selector, { timeout: params.timeout || 5000 });
175
+ return { observation: `元素已出现: ${params.selector}`, success: true };
176
+ case 'waitForTimeout':
177
+ await page.waitForTimeout(params.ms || 2000);
178
+ return { observation: `等待 ${params.ms}ms 完成`, success: true };
179
+ case 'screenshot':
180
+ await page.screenshot({ path: 'heal-debug-screenshot.png' });
181
+ return { observation: '截图已保存', success: true };
182
+ case 'getUrl':
183
+ const url = page.url();
184
+ return {
185
+ observation: `当前 URL: ${url}`,
186
+ success: true,
187
+ variables: { currentPageUrl: url }
188
+ };
189
+ case 'getContent':
190
+ const content = await page.content();
191
+ return {
192
+ observation: `页面内容长度: ${content.length} 字符`,
193
+ success: true,
194
+ variables: { pageContent: content.substring(0, 1000) } // 前1000字符
195
+ };
196
+ default:
197
+ return { observation: `未知工具: ${tool}`, success: false };
198
+ }
199
+ }
200
+ catch (error) {
201
+ return {
202
+ observation: `执行失败: ${error.message}`,
203
+ success: false
204
+ };
205
+ }
206
+ }
207
+ /**
208
+ * 解析动作字符串
209
+ */
210
+ parseAction(actionStr) {
211
+ const match = actionStr.match(/(\w+)\((.*)\)/);
212
+ if (!match) {
213
+ throw new Error(`无效的动作格式: ${actionStr}`);
214
+ }
215
+ const tool = match[1];
216
+ const paramsStr = match[2];
217
+ let params = {};
218
+ if (tool === 'click') {
219
+ params = { selector: paramsStr };
220
+ }
221
+ else if (tool === 'fill') {
222
+ const parts = paramsStr.split(',').map((s) => s.trim().replace(/['"]/g, ''));
223
+ params = { selector: parts[0], value: parts[1] || '' };
224
+ }
225
+ else if (tool === 'waitForSelector') {
226
+ const parts = paramsStr.split(',').map((s) => s.trim());
227
+ params = { selector: parts[0].replace(/['"]/g, ''), timeout: parseInt(parts[1]) || 5000 };
228
+ }
229
+ else if (tool === 'waitForTimeout') {
230
+ params = { ms: parseInt(paramsStr) || 2000 };
231
+ }
232
+ else {
233
+ params = { raw: paramsStr };
234
+ }
235
+ return { tool, params };
236
+ }
237
+ /**
238
+ * 判断是否应该停止循环
239
+ */
240
+ shouldStop(success, action, currentStep) {
241
+ // 成功执行了目标操作
242
+ if (success && (action.includes('click') || action.includes('fill') || action.includes('waitForSelector'))) {
243
+ return true;
244
+ }
245
+ // 达到最大步数
246
+ if (currentStep >= this.maxSteps - 1) {
247
+ return true;
248
+ }
249
+ return false;
250
+ }
251
+ /**
252
+ * 创建 Playwright 工具(用于真实 LLM Agent)
253
+ * TODO: 实现 LangChain Tool 接口
254
+ * 参考:docs/langgraph-integration-guide.md
255
+ */
256
+ createPlaywrightTools(_page) {
257
+ // 当有真实 LLM API 时实现
258
+ return [];
259
+ }
260
+ }
261
+ exports.ReactAgent = ReactAgent;
262
+ //# sourceMappingURL=react-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-agent.js","sourceRoot":"","sources":["../../src/agents/react-agent.ts"],"names":[],"mappings":"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"}