@cotestdev/ai-runner 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +263 -0
  2. package/dist/agents/heal-agent.d.ts +30 -0
  3. package/dist/agents/heal-agent.d.ts.map +1 -0
  4. package/dist/agents/heal-agent.js +76 -0
  5. package/dist/agents/heal-agent.js.map +1 -0
  6. package/dist/agents/healer.d.ts +73 -0
  7. package/dist/agents/healer.d.ts.map +1 -0
  8. package/dist/agents/healer.js +538 -0
  9. package/dist/agents/healer.js.map +1 -0
  10. package/dist/agents/tools/form.d.ts +22 -0
  11. package/dist/agents/tools/form.d.ts.map +1 -0
  12. package/dist/agents/tools/form.js +134 -0
  13. package/dist/agents/tools/form.js.map +1 -0
  14. package/dist/agents/tools/index.d.ts +13 -0
  15. package/dist/agents/tools/index.d.ts.map +1 -0
  16. package/dist/agents/tools/index.js +33 -0
  17. package/dist/agents/tools/index.js.map +1 -0
  18. package/dist/agents/tools/navigate.d.ts +22 -0
  19. package/dist/agents/tools/navigate.d.ts.map +1 -0
  20. package/dist/agents/tools/navigate.js +74 -0
  21. package/dist/agents/tools/navigate.js.map +1 -0
  22. package/dist/agents/tools/snapshot.d.ts +22 -0
  23. package/dist/agents/tools/snapshot.d.ts.map +1 -0
  24. package/dist/agents/tools/snapshot.js +110 -0
  25. package/dist/agents/tools/snapshot.js.map +1 -0
  26. package/dist/agents/tools/verify.d.ts +34 -0
  27. package/dist/agents/tools/verify.d.ts.map +1 -0
  28. package/dist/agents/tools/verify.js +169 -0
  29. package/dist/agents/tools/verify.js.map +1 -0
  30. package/dist/agents/tools/wait.d.ts +22 -0
  31. package/dist/agents/tools/wait.d.ts.map +1 -0
  32. package/dist/agents/tools/wait.js +104 -0
  33. package/dist/agents/tools/wait.js.map +1 -0
  34. package/dist/agents/types.d.ts +51 -0
  35. package/dist/agents/types.d.ts.map +1 -0
  36. package/dist/agents/types.js +6 -0
  37. package/dist/agents/types.js.map +1 -0
  38. package/dist/ai-runner/src/agents/logger.d.ts +7 -0
  39. package/dist/ai-runner/src/agents/logger.d.ts.map +1 -0
  40. package/dist/ai-runner/src/agents/logger.js +22 -0
  41. package/dist/ai-runner/src/agents/logger.js.map +1 -0
  42. package/dist/ai-runner/src/agents/playwright-executor.d.ts +24 -0
  43. package/dist/ai-runner/src/agents/playwright-executor.d.ts.map +1 -0
  44. package/dist/ai-runner/src/agents/playwright-executor.js +226 -0
  45. package/dist/ai-runner/src/agents/playwright-executor.js.map +1 -0
  46. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.d.ts +33 -0
  47. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.d.ts.map +1 -0
  48. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.js +146 -0
  49. package/dist/ai-runner/src/agents/tools/playwright-backend-adapter.js.map +1 -0
  50. package/dist/ai-runner/src/agents/types.d.ts +55 -0
  51. package/dist/ai-runner/src/agents/types.d.ts.map +1 -0
  52. package/dist/ai-runner/src/agents/types.js +6 -0
  53. package/dist/ai-runner/src/agents/types.js.map +1 -0
  54. package/dist/ai-runner/src/examples/test-final.d.ts +6 -0
  55. package/dist/ai-runner/src/examples/test-final.d.ts.map +1 -0
  56. package/dist/ai-runner/src/examples/test-final.js +73 -0
  57. package/dist/ai-runner/src/examples/test-final.js.map +1 -0
  58. package/dist/ai-runner/src/examples/test-simple-tools.d.ts +6 -0
  59. package/dist/ai-runner/src/examples/test-simple-tools.d.ts.map +1 -0
  60. package/dist/ai-runner/src/examples/test-simple-tools.js +149 -0
  61. package/dist/ai-runner/src/examples/test-simple-tools.js.map +1 -0
  62. package/dist/ai-runner/src/examples/test-working.d.ts +5 -0
  63. package/dist/ai-runner/src/examples/test-working.d.ts.map +1 -0
  64. package/dist/ai-runner/src/examples/test-working.js +43 -0
  65. package/dist/ai-runner/src/examples/test-working.js.map +1 -0
  66. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts +15 -0
  67. package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts.map +1 -0
  68. package/dist/ai-runner/src/examples/v-test-backend-adapter.js +240 -0
  69. package/dist/ai-runner/src/examples/v-test-backend-adapter.js.map +1 -0
  70. package/dist/ai-runner/src/index.d.ts +8 -0
  71. package/dist/ai-runner/src/index.d.ts.map +1 -0
  72. package/dist/ai-runner/src/index.js +11 -0
  73. package/dist/ai-runner/src/index.js.map +1 -0
  74. package/dist/ai-runner/src/runner.d.ts +28 -0
  75. package/dist/ai-runner/src/runner.d.ts.map +1 -0
  76. package/dist/ai-runner/src/runner.js +176 -0
  77. package/dist/ai-runner/src/runner.js.map +1 -0
  78. package/dist/ai-runner/src/tools/index.d.ts +16 -0
  79. package/dist/ai-runner/src/tools/index.d.ts.map +1 -0
  80. package/dist/ai-runner/src/tools/index.js +35 -0
  81. package/dist/ai-runner/src/tools/index.js.map +1 -0
  82. package/dist/ai-runner/src/tools/playwright-groups.d.ts +19 -0
  83. package/dist/ai-runner/src/tools/playwright-groups.d.ts.map +1 -0
  84. package/dist/ai-runner/src/tools/playwright-groups.js +42 -0
  85. package/dist/ai-runner/src/tools/playwright-groups.js.map +1 -0
  86. package/dist/ai-runner/src/types/external.d.ts +6 -0
  87. package/dist/ai-runner/src/types/external.d.ts.map +1 -0
  88. package/dist/ai-runner/src/types/external.js +7 -0
  89. package/dist/ai-runner/src/types/external.js.map +1 -0
  90. package/dist/ai-runner/src/types/index.d.ts +95 -0
  91. package/dist/ai-runner/src/types/index.d.ts.map +1 -0
  92. package/dist/ai-runner/src/types/index.js +7 -0
  93. package/dist/ai-runner/src/types/index.js.map +1 -0
  94. package/dist/core/runner.d.ts +194 -0
  95. package/dist/core/runner.d.ts.map +1 -0
  96. package/dist/core/runner.js +650 -0
  97. package/dist/core/runner.js.map +1 -0
  98. package/dist/core-infra/src/directory-validator.d.ts +29 -0
  99. package/dist/core-infra/src/directory-validator.d.ts.map +1 -0
  100. package/dist/core-infra/src/directory-validator.js +91 -0
  101. package/dist/core-infra/src/directory-validator.js.map +1 -0
  102. package/dist/core-infra/src/index.d.ts +14 -0
  103. package/dist/core-infra/src/index.d.ts.map +1 -0
  104. package/dist/core-infra/src/index.js +44 -0
  105. package/dist/core-infra/src/index.js.map +1 -0
  106. package/dist/core-infra/src/mcp/file-mcp-manager.d.ts +14 -0
  107. package/dist/core-infra/src/mcp/file-mcp-manager.d.ts.map +1 -0
  108. package/dist/core-infra/src/mcp/file-mcp-manager.js +46 -0
  109. package/dist/core-infra/src/mcp/file-mcp-manager.js.map +1 -0
  110. package/dist/core-infra/src/mcp/index.d.ts +21 -0
  111. package/dist/core-infra/src/mcp/index.d.ts.map +1 -0
  112. package/dist/core-infra/src/mcp/index.js +17 -0
  113. package/dist/core-infra/src/mcp/index.js.map +1 -0
  114. package/dist/core-infra/src/mcp/mcp-client.d.ts +128 -0
  115. package/dist/core-infra/src/mcp/mcp-client.d.ts.map +1 -0
  116. package/dist/core-infra/src/mcp/mcp-client.js +163 -0
  117. package/dist/core-infra/src/mcp/mcp-client.js.map +1 -0
  118. package/dist/core-infra/src/mcp/mcp-manager.d.ts +21 -0
  119. package/dist/core-infra/src/mcp/mcp-manager.d.ts.map +1 -0
  120. package/dist/core-infra/src/mcp/mcp-manager.js +99 -0
  121. package/dist/core-infra/src/mcp/mcp-manager.js.map +1 -0
  122. package/dist/core-infra/src/mcp/playwright-mcp-manager.d.ts +19 -0
  123. package/dist/core-infra/src/mcp/playwright-mcp-manager.d.ts.map +1 -0
  124. package/dist/core-infra/src/mcp/playwright-mcp-manager.js +120 -0
  125. package/dist/core-infra/src/mcp/playwright-mcp-manager.js.map +1 -0
  126. package/dist/core-infra/src/model.d.ts +11 -0
  127. package/dist/core-infra/src/model.d.ts.map +1 -0
  128. package/dist/core-infra/src/model.js +190 -0
  129. package/dist/core-infra/src/model.js.map +1 -0
  130. package/dist/core-infra/src/repositories/BaseRepository.d.ts +69 -0
  131. package/dist/core-infra/src/repositories/BaseRepository.d.ts.map +1 -0
  132. package/dist/core-infra/src/repositories/BaseRepository.js +213 -0
  133. package/dist/core-infra/src/repositories/BaseRepository.js.map +1 -0
  134. package/dist/core-infra/src/repositories/DirectoryRepository.d.ts +70 -0
  135. package/dist/core-infra/src/repositories/DirectoryRepository.d.ts.map +1 -0
  136. package/dist/core-infra/src/repositories/DirectoryRepository.js +336 -0
  137. package/dist/core-infra/src/repositories/DirectoryRepository.js.map +1 -0
  138. package/dist/core-infra/src/repositories/ExplorationRepository.d.ts +34 -0
  139. package/dist/core-infra/src/repositories/ExplorationRepository.d.ts.map +1 -0
  140. package/dist/core-infra/src/repositories/ExplorationRepository.js +54 -0
  141. package/dist/core-infra/src/repositories/ExplorationRepository.js.map +1 -0
  142. package/dist/core-infra/src/repositories/FileRepository.d.ts +56 -0
  143. package/dist/core-infra/src/repositories/FileRepository.d.ts.map +1 -0
  144. package/dist/core-infra/src/repositories/FileRepository.js +132 -0
  145. package/dist/core-infra/src/repositories/FileRepository.js.map +1 -0
  146. package/dist/core-infra/src/repositories/ModelConfigRepository.d.ts +38 -0
  147. package/dist/core-infra/src/repositories/ModelConfigRepository.d.ts.map +1 -0
  148. package/dist/core-infra/src/repositories/ModelConfigRepository.js +59 -0
  149. package/dist/core-infra/src/repositories/ModelConfigRepository.js.map +1 -0
  150. package/dist/core-infra/src/repositories/ProjectRepository.d.ts +32 -0
  151. package/dist/core-infra/src/repositories/ProjectRepository.d.ts.map +1 -0
  152. package/dist/core-infra/src/repositories/ProjectRepository.js +67 -0
  153. package/dist/core-infra/src/repositories/ProjectRepository.js.map +1 -0
  154. package/dist/core-infra/src/repositories/SettingsRepository.d.ts +19 -0
  155. package/dist/core-infra/src/repositories/SettingsRepository.d.ts.map +1 -0
  156. package/dist/core-infra/src/repositories/SettingsRepository.js +72 -0
  157. package/dist/core-infra/src/repositories/SettingsRepository.js.map +1 -0
  158. package/dist/core-infra/src/repositories/TableDataRepository.d.ts +22 -0
  159. package/dist/core-infra/src/repositories/TableDataRepository.d.ts.map +1 -0
  160. package/dist/core-infra/src/repositories/TableDataRepository.js +33 -0
  161. package/dist/core-infra/src/repositories/TableDataRepository.js.map +1 -0
  162. package/dist/core-infra/src/repositories/TestCaseRepository.d.ts +120 -0
  163. package/dist/core-infra/src/repositories/TestCaseRepository.d.ts.map +1 -0
  164. package/dist/core-infra/src/repositories/TestCaseRepository.js +463 -0
  165. package/dist/core-infra/src/repositories/TestCaseRepository.js.map +1 -0
  166. package/dist/core-infra/src/repositories/TestPlanRepository.d.ts +35 -0
  167. package/dist/core-infra/src/repositories/TestPlanRepository.d.ts.map +1 -0
  168. package/dist/core-infra/src/repositories/TestPlanRepository.js +80 -0
  169. package/dist/core-infra/src/repositories/TestPlanRepository.js.map +1 -0
  170. package/dist/core-infra/src/repositories/TestResultRepository.d.ts +30 -0
  171. package/dist/core-infra/src/repositories/TestResultRepository.d.ts.map +1 -0
  172. package/dist/core-infra/src/repositories/TestResultRepository.js +54 -0
  173. package/dist/core-infra/src/repositories/TestResultRepository.js.map +1 -0
  174. package/dist/core-infra/src/repositories/index.d.ts +17 -0
  175. package/dist/core-infra/src/repositories/index.d.ts.map +1 -0
  176. package/dist/core-infra/src/repositories/index.js +31 -0
  177. package/dist/core-infra/src/repositories/index.js.map +1 -0
  178. package/dist/core-infra/src/storageService.d.ts +131 -0
  179. package/dist/core-infra/src/storageService.d.ts.map +1 -0
  180. package/dist/core-infra/src/storageService.js +304 -0
  181. package/dist/core-infra/src/storageService.js.map +1 -0
  182. package/dist/core-infra/src/types.d.ts +218 -0
  183. package/dist/core-infra/src/types.d.ts.map +1 -0
  184. package/dist/core-infra/src/types.js +3 -0
  185. package/dist/core-infra/src/types.js.map +1 -0
  186. package/dist/index.d.ts +8 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +11 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/types/external.d.ts +6 -0
  191. package/dist/types/external.d.ts.map +1 -0
  192. package/dist/types/external.js +7 -0
  193. package/dist/types/external.js.map +1 -0
  194. package/dist/types/index.d.ts +153 -0
  195. package/dist/types/index.d.ts.map +1 -0
  196. package/dist/types/index.js +26 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/docs/PLAYWRIGHT_MCP_ADAPTER.md +132 -0
  199. package/docs/SCHEMA_EXTRACTION.md +224 -0
  200. package/package.json +43 -0
  201. package/playwright.config.ts +38 -0
  202. package/src/agents/logger.ts +20 -0
  203. package/src/agents/playwright-executor.ts +244 -0
  204. package/src/agents/tools/playwright-backend-adapter.ts +134 -0
  205. package/src/agents/tools/playwright-mcp-types.d.ts +71 -0
  206. package/src/agents/types.ts +80 -0
  207. package/src/index.ts +27 -0
  208. package/src/runner.ts +219 -0
  209. package/src/tools/index.ts +48 -0
  210. package/src/tools/playwright-groups.ts +54 -0
  211. package/src/types/external.ts +7 -0
  212. package/src/types/index.ts +118 -0
  213. package/tests/agent/test-heal-agent.spec.ts +69 -0
  214. package/tsconfig.json +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/agents/tools/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 等待工具 - Wait
3
+ */
4
+ import { DynamicTool } from '@langchain/core/tools';
5
+ import type { Page } from 'playwright';
6
+ /**
7
+ * 创建等待时间工具
8
+ */
9
+ export declare function createWaitForTimeTool(page: Page): DynamicTool;
10
+ /**
11
+ * 创建等待元素工具
12
+ */
13
+ export declare function createWaitForSelectorTool(page: Page): DynamicTool;
14
+ /**
15
+ * 创建等待URL工具
16
+ */
17
+ export declare function createWaitForURLTool(page: Page): DynamicTool;
18
+ /**
19
+ * 等待工具集
20
+ */
21
+ export declare const waitTools: (page: Page) => DynamicTool[];
22
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/wait.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAiB7D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CA2CjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAa5D;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI,KAAG,WAAW,EAIjD,CAAC"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * 等待工具 - Wait
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.waitTools = void 0;
7
+ exports.createWaitForTimeTool = createWaitForTimeTool;
8
+ exports.createWaitForSelectorTool = createWaitForSelectorTool;
9
+ exports.createWaitForURLTool = createWaitForURLTool;
10
+ const tools_1 = require("@langchain/core/tools");
11
+ /**
12
+ * 创建等待时间工具
13
+ */
14
+ function createWaitForTimeTool(page) {
15
+ return new tools_1.DynamicTool({
16
+ name: 'browser_wait_for_time',
17
+ description: 'Wait for a specified amount of time. Input should be the time in milliseconds as a number.',
18
+ func: async (input) => {
19
+ try {
20
+ const time = parseInt(input, 10);
21
+ if (isNaN(time)) {
22
+ throw new Error('Input must be a number representing milliseconds');
23
+ }
24
+ await page.waitForTimeout(time);
25
+ return `Waited for ${time}ms`;
26
+ }
27
+ catch (error) {
28
+ throw new Error(`Failed to wait: ${error.message}`);
29
+ }
30
+ }
31
+ });
32
+ }
33
+ /**
34
+ * 创建等待元素工具
35
+ */
36
+ function createWaitForSelectorTool(page) {
37
+ return new tools_1.DynamicTool({
38
+ name: 'browser_wait_for_selector',
39
+ description: 'Wait for an element to appear. Input should be a CSS selector or text that identifies the element. You can optionally specify timeout in milliseconds like: "selector, timeout=5000".',
40
+ func: async (input) => {
41
+ try {
42
+ // 解析输入(支持可选的 timeout 参数)
43
+ let selector = input;
44
+ let timeout = 30000;
45
+ const timeoutMatch = input.match(/timeout=(\d+)/);
46
+ if (timeoutMatch) {
47
+ timeout = parseInt(timeoutMatch[1], 10);
48
+ selector = input.replace(/,?\s*timeout=\d+/, '').trim();
49
+ }
50
+ // 尝试多个选择器
51
+ const selectors = selector.split(',').map(s => s.trim());
52
+ for (const sel of selectors) {
53
+ try {
54
+ // 先尝试作为文本选择器
55
+ const locator = page.getByText(sel);
56
+ const count = await locator.count();
57
+ if (count > 0) {
58
+ await locator.waitFor({ state: 'visible', timeout });
59
+ return `Element with text "${sel}" became visible`;
60
+ }
61
+ // 再尝试作为 CSS 选择器
62
+ await page.waitForSelector(sel, { state: 'visible', timeout });
63
+ return `Element "${sel}" became visible`;
64
+ }
65
+ catch {
66
+ continue;
67
+ }
68
+ }
69
+ throw new Error(`No element found matching: ${selector}`);
70
+ }
71
+ catch (error) {
72
+ throw new Error(`Failed to wait for selector: ${error.message}`);
73
+ }
74
+ }
75
+ });
76
+ }
77
+ /**
78
+ * 创建等待URL工具
79
+ */
80
+ function createWaitForURLTool(page) {
81
+ return new tools_1.DynamicTool({
82
+ name: 'browser_wait_for_url',
83
+ description: 'Wait for the URL to match a pattern. Input should be a URL pattern (string, glob, or regex).',
84
+ func: async (input) => {
85
+ try {
86
+ await page.waitForURL(input, { timeout: 30000 });
87
+ return `URL matched: ${input}`;
88
+ }
89
+ catch (error) {
90
+ throw new Error(`Failed to wait for URL: ${error.message}`);
91
+ }
92
+ }
93
+ });
94
+ }
95
+ /**
96
+ * 等待工具集
97
+ */
98
+ const waitTools = (page) => [
99
+ createWaitForTimeTool(page),
100
+ createWaitForSelectorTool(page),
101
+ createWaitForURLTool(page),
102
+ ];
103
+ exports.waitTools = waitTools;
104
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/agents/tools/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 自愈 Agent 类型定义
3
+ */
4
+ import type { ModelConfig } from '../types/external';
5
+ import type { ReActStep } from '../types';
6
+ /**
7
+ * 自愈 Agent 状态
8
+ */
9
+ export interface HealAgentState {
10
+ objective: string;
11
+ error: string;
12
+ stackTrace?: string;
13
+ originalCode: string;
14
+ context: {
15
+ page: any;
16
+ context?: any;
17
+ };
18
+ variables?: Record<string, any>;
19
+ maxSteps?: number;
20
+ debugMode?: boolean;
21
+ }
22
+ /**
23
+ * Agent 配置
24
+ */
25
+ export interface HealAgentConfig {
26
+ model?: ModelConfig;
27
+ maxSteps?: number;
28
+ debugMode?: boolean;
29
+ setVariable?: (name: string, value: any) => void;
30
+ getAllVariables?: () => Record<string, any>;
31
+ }
32
+ /**
33
+ * Agent 执行结果
34
+ */
35
+ export interface HealAgentResult {
36
+ success: boolean;
37
+ reasoning?: string;
38
+ errorMessage?: string;
39
+ steps?: number;
40
+ updatedVariables?: Record<string, any>;
41
+ reactSteps?: ReActStep[];
42
+ }
43
+ /**
44
+ * MCP 工具定义
45
+ */
46
+ export interface MCPTool {
47
+ name: string;
48
+ description: string;
49
+ inputSchema: Record<string, unknown>;
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAM1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE;QACP,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAGF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAGhC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7C;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AAMD;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * 自愈 Agent 类型定义
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,7 @@
1
+ export declare class Logger {
2
+ private prefix;
3
+ log(message: string, ...optionalParams: any[]): void;
4
+ warn(message: string, ...optionalParams: any[]): void;
5
+ error(message: string, ...optionalParams: any[]): void;
6
+ }
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../src/agents/logger.ts"],"names":[],"mappings":"AACA,qBAAa,MAAM;IAEf,OAAO,CAAC,MAAM,CAAa;IAG3B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE;IAK7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE;IAK9C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE;CAGlD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = void 0;
4
+ class Logger {
5
+ constructor() {
6
+ this.prefix = '[Agent]';
7
+ }
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ log(message, ...optionalParams) {
10
+ console.log(`${this.prefix} ${message}`, ...optionalParams);
11
+ }
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ warn(message, ...optionalParams) {
14
+ console.warn(`${this.prefix} ${message}`, ...optionalParams);
15
+ }
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ error(message, ...optionalParams) {
18
+ console.error(`${this.prefix} ${message}`, ...optionalParams);
19
+ }
20
+ }
21
+ exports.Logger = Logger;
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/agents/logger.ts"],"names":[],"mappings":";;;AACA,MAAa,MAAM;IAAnB;QAEY,WAAM,GAAG,SAAS,CAAC;IAgB/B,CAAC;IAdG,8DAA8D;IAC9D,GAAG,CAAC,OAAe,EAAE,GAAG,cAAqB;QACzC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,OAAe,EAAE,GAAG,cAAqB;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;IACjE,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAe,EAAE,GAAG,cAAqB;QAC3C,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;IAClE,CAAC;CACJ;AAlBD,wBAkBC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Playwright Executor - Uses LangChain's createAgent API to implement ReAct loop
3
+ */
4
+ import type { HealContext } from '../types';
5
+ import { PlaywrightAgentState } from './types';
6
+ export declare class PlaywrightExecutor {
7
+ private state;
8
+ constructor(state: PlaywrightAgentState);
9
+ private createPlaywrightTools;
10
+ /**
11
+ * Update original script and save to database (heal mode)
12
+ */
13
+ private updateOriginalScript;
14
+ execute(context: HealContext): Promise<void>;
15
+ private buildSystemPrompt;
16
+ private buildUserMessage;
17
+ /**
18
+ * Extract and normalize content from model response
19
+ * Handles string, array (ContentBlock[]), and other types
20
+ * Following LangChain.js best practices
21
+ */
22
+ private extractContent;
23
+ }
24
+ //# sourceMappingURL=playwright-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-executor.d.ts","sourceRoot":"","sources":["../../../../src/agents/playwright-executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAuB;gBAExB,KAAK,EAAE,oBAAoB;YAIzB,qBAAqB;IAmFnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAKtB,OAAO,CAAC,OAAO,EAAE,WAAW;IA6ClC,OAAO,CAAC,iBAAiB;YAiBX,gBAAgB;IAyB9B;;;;SAIK;IACL,OAAO,CAAC,cAAc;CAwCvB"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ /**
3
+ * Playwright Executor - Uses LangChain's createAgent API to implement ReAct loop
4
+ */
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PlaywrightExecutor = void 0;
11
+ const langchain_1 = require("langchain");
12
+ const tools_1 = require("@langchain/core/tools");
13
+ const zod_1 = __importDefault(require("zod"));
14
+ class PlaywrightExecutor {
15
+ constructor(state) {
16
+ this.state = state;
17
+ }
18
+ async createPlaywrightTools(healContext) {
19
+ const standardTools = this.state.playwrightGroup.getDefaultTools();
20
+ const playwrightToolGroups = this.state.playwrightGroup.getNonDefaultGroupInfo();
21
+ const getToolGroupsTool = {
22
+ name: "get_tools",
23
+ description: "Get available tools in a group.",
24
+ schema: zod_1.default.object({
25
+ group_name: zod_1.default.string().describe("The name of the tool group."),
26
+ }),
27
+ func: async (param) => {
28
+ if (!param.group_name)
29
+ throw new Error('Missing group_name parameter');
30
+ return JSON.stringify(playwrightToolGroups[param.group_name]);
31
+ },
32
+ };
33
+ const callToolTool = {
34
+ name: "call_tool",
35
+ description: "Call a tool in a group by name.",
36
+ schema: zod_1.default.object({
37
+ group_name: zod_1.default.string().describe("Tool group name."),
38
+ tool_name: zod_1.default.string().describe("Tool name."),
39
+ args: zod_1.default.object().describe("Tool parameters."),
40
+ }),
41
+ func: async (param) => {
42
+ const { group_name, tool_name, args } = param;
43
+ if (!group_name || !tool_name)
44
+ throw new Error('Missing group_name or tool_name parameter');
45
+ return await this.state.playwrightGroup.callTool(tool_name, args);
46
+ },
47
+ };
48
+ const finishTool = {
49
+ name: "finish_test",
50
+ description: "Call this tool ONLY when the step goal has been fully achieved or failed. After calling this, no more tools should be called.",
51
+ schema: zod_1.default.object({
52
+ isSuccess: zod_1.default.boolean().describe("Whether the step goal was successfully achieved."),
53
+ error: zod_1.default.string().optional().describe("Reason if the step goal fails to fully achieve, otherwise leave empty."),
54
+ variables: zod_1.default.object().describe(`
55
+ Key-value variables to assign in the test context.
56
+ - The variable names should be consistent with those in the original test script
57
+ - Avoid conflicts with existing variable names, unless the same variable is being updated
58
+ - Only include variables that have been changed or newly assigned in the fix
59
+ - The value should be NON-OBJECT types (string, number, boolean, etc.)
60
+ `),
61
+ repairedScript: zod_1.default.string().optional().describe(`
62
+ The complete fixed test script, leave empty if the step fails:
63
+ - Keep original runner.set, runner.get, runner.reuseTest calls for the steps fixed if possible and ensure no semantic changes
64
+ - MUST return The COMPLETE fixed test script
65
+ - ONLY apply fixes relevant to the current step and any necessary previous steps
66
+ - Do NOT wrap in closures or test body - write direct code using runner API
67
+ - Add a 'FIXED' comment for the step code being fixed
68
+ - Example:
69
+ \`\`\`typescript
70
+ // FIXED
71
+ await runner.runStep('Click button', async () => {
72
+ await page.click('#button');
73
+ });
74
+ \`\`\`
75
+ `),
76
+ }),
77
+ func: async (params) => {
78
+ healContext.success = params.isSuccess;
79
+ healContext.healError = params.error;
80
+ if (healContext.success) {
81
+ for (const [key, value] of Object.entries(params.variables)) {
82
+ this.state.variables.set(key, value);
83
+ }
84
+ this.state.originalScript = params.repairedScript;
85
+ this.updateOriginalScript(params.repairedScript);
86
+ }
87
+ return 'Test step finished.';
88
+ },
89
+ };
90
+ return [
91
+ ...standardTools,
92
+ new tools_1.DynamicStructuredTool(getToolGroupsTool),
93
+ new tools_1.DynamicStructuredTool(callToolTool),
94
+ new tools_1.DynamicStructuredTool(finishTool)
95
+ ];
96
+ }
97
+ /**
98
+ * Update original script and save to database (heal mode)
99
+ */
100
+ updateOriginalScript(script) {
101
+ this.state.storageService.saveTestScript(this.state.testCaseId, script);
102
+ this.state.logger.log('Script fixed');
103
+ }
104
+ async execute(context) {
105
+ const page = this.state.page;
106
+ if (!page)
107
+ throw new Error('Missing page object');
108
+ const tools = await this.createPlaywrightTools(context);
109
+ const agent = (0, langchain_1.createAgent)({
110
+ model: this.state.model,
111
+ tools: tools,
112
+ systemPrompt: this.buildSystemPrompt()
113
+ });
114
+ const inputStream = {
115
+ messages: [{
116
+ role: 'user',
117
+ content: await this.buildUserMessage(context)
118
+ }]
119
+ };
120
+ const stream = await agent.stream(inputStream, {
121
+ recursionLimit: 25,
122
+ streamMode: 'updates',
123
+ });
124
+ for await (const event of stream) {
125
+ // Process AI messages (thoughts and tool calls)
126
+ const messages = event.model_request?.messages || event.messages;
127
+ if (messages?.[0]?.type === 'ai') {
128
+ const aiMsg = messages[0];
129
+ const content = this.extractContent(aiMsg.content);
130
+ // Record thought
131
+ if (content) {
132
+ this.state.logger.log(`${content}`);
133
+ }
134
+ }
135
+ // Process tool results
136
+ const toolMsg = event.tools?.messages?.[0];
137
+ if (toolMsg?.type === 'tool') {
138
+ const output = this.extractContent(toolMsg.content);
139
+ this.state.logger.log(`✅ Result [${toolMsg.name}]:`, output.length > 300 ? output.substring(0, 100) + '...' : output);
140
+ }
141
+ }
142
+ }
143
+ buildSystemPrompt() {
144
+ return `
145
+ You are a Playwright test expert, skilled at analyzing and fixing errors in browser automation tests.
146
+
147
+ ## ** Critial Rules **
148
+ - You MUST run the step using tools first before fixing the script
149
+ - When you step finishes or fails, you MUST call 'finish_test' tool and set the 'isSuccess' parameter correctly.
150
+ - Use tools squentially
151
+ - Analyze the current step code, errors and page context and what variables are being set
152
+ - Make sure the fixed code is concise and consistent with the original code in logic and style
153
+
154
+ ## ** Constraints **
155
+ - NEVER set 'isSuccess' to true if the step goal is not fully achieved
156
+ - Fail the step fast and DON'T do unnecessary or unreansonable retries
157
+ `.trim();
158
+ }
159
+ async buildUserMessage(context) {
160
+ const variableList = Object.keys(this.state.variables).length > 0
161
+ ? Object.keys(this.state.variables).map(v => ` - ${v}: ${JSON.stringify(this.state.variables.get(v))}`).join('\n')
162
+ : undefined;
163
+ const snapshot = await this.state.adapter.callTool('browser_snapshot', {});
164
+ const pageState = snapshot.isError ? '' : this.extractContent(snapshot);
165
+ return `
166
+ ## Step Description: ${context.stepDescription}
167
+
168
+ ${variableList ? `## Variables in Context\n${variableList}` : ''}
169
+
170
+ ## Stacktrace
171
+ ${context.stackTrace}
172
+
173
+ ## Full Test Script
174
+ \`\`\`typescript
175
+ ${this.state.originalScript}
176
+ \`\`\`
177
+
178
+ ${pageState}
179
+ }
180
+ `.trim();
181
+ }
182
+ /**
183
+ * Extract and normalize content from model response
184
+ * Handles string, array (ContentBlock[]), and other types
185
+ * Following LangChain.js best practices
186
+ */
187
+ extractContent(content) {
188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
+ const asAny = content;
190
+ if (asAny.content) {
191
+ content = asAny.content;
192
+ }
193
+ // If string, return as-is
194
+ if (typeof content === 'string') {
195
+ return content;
196
+ }
197
+ // If array (ContentBlock[]), extract text content
198
+ if (Array.isArray(content)) {
199
+ const content0 = content[0];
200
+ if (typeof content0 === 'string') {
201
+ return content0;
202
+ }
203
+ if (typeof content0 === 'object' && content0 !== null) {
204
+ // Handle text blocks
205
+ if ('text' in content0) {
206
+ return content0.text;
207
+ }
208
+ // Handle other block types by converting to string
209
+ return JSON.stringify(content0);
210
+ }
211
+ return String(content0);
212
+ }
213
+ // If object, try to extract text field or convert to string
214
+ if (typeof content === 'object' && content !== null) {
215
+ ``;
216
+ if ('text' in content) {
217
+ return content;
218
+ }
219
+ return content;
220
+ }
221
+ // Fallback: convert to string
222
+ return String(content);
223
+ }
224
+ }
225
+ exports.PlaywrightExecutor = PlaywrightExecutor;
226
+ //# sourceMappingURL=playwright-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-executor.js","sourceRoot":"","sources":["../../../../src/agents/playwright-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Playwright Backend 工具适配器 - 新方案
3
+ *
4
+ * 基于 BrowserServerBackend 的伪实例实现
5
+ * 参考:playwright/lib/mcp/test/browserBackend.js
6
+ *
7
+ * 这个方案的优势:
8
+ * 1. 直接使用 Playwright 官方的 BrowserServerBackend 类
9
+ * 2. 直接导入官方的 identityFactory,完全复用
10
+ * 3. 获得完整的官方工具功能,包括 Response、Context 等
11
+ * 4. 无需手动适配 Context 和 Response
12
+ * 5. 自动跟随 Playwright 更新
13
+ */
14
+ import { DynamicStructuredTool } from '@langchain/core/tools';
15
+ import type { BrowserContext } from 'playwright';
16
+ export declare class PlaywrightBackendAdapter {
17
+ private backend;
18
+ private tools;
19
+ static create(browserContext: BrowserContext): Promise<PlaywrightBackendAdapter>;
20
+ getTools(): DynamicStructuredTool[];
21
+ callTool(name: string, params: any): Promise<any>;
22
+ /**
23
+ * 官方的 identityFactory 函数
24
+ * 参考:playwright/lib/mcp/test/browserBackend.js 第 94-104 行
25
+ *
26
+ * 注意:官方文件中定义了这个函数但没有导出,所以我们在这里复制一份
27
+ */
28
+ private identityFactory;
29
+ private loadPlaywrightMCPModules;
30
+ private getBackend;
31
+ private getPlaywrightBackendToolsFromContext;
32
+ }
33
+ //# sourceMappingURL=playwright-backend-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-backend-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/agents/tools/playwright-backend-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,qBAAa,wBAAwB;IAEnC,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,KAAK,CAA+B;WAE/B,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAOtF,QAAQ,IAAI,qBAAqB,EAAE;IAK7B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAQxC;;;;;OAKG;IAEH,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,wBAAwB;YAelB,UAAU;YA2BV,oCAAoC;CAsBnD"}