@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,169 @@
1
+ "use strict";
2
+ /**
3
+ * 验证工具 - Verify
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.verifyTools = void 0;
7
+ exports.createGetURLTool = createGetURLTool;
8
+ exports.createGetContentTool = createGetContentTool;
9
+ exports.createGetTextTool = createGetTextTool;
10
+ exports.createScreenshotTool = createScreenshotTool;
11
+ exports.createVerifyTextVisibleTool = createVerifyTextVisibleTool;
12
+ exports.createVerifyElementVisibleTool = createVerifyElementVisibleTool;
13
+ const tools_1 = require("@langchain/core/tools");
14
+ /**
15
+ * 创建获取URL工具
16
+ */
17
+ function createGetURLTool(page) {
18
+ return new tools_1.DynamicTool({
19
+ name: 'browser_get_url',
20
+ description: 'Get the current page URL. No input needed.',
21
+ func: async () => {
22
+ try {
23
+ const url = page.url();
24
+ return `Current URL: ${url}`;
25
+ }
26
+ catch (error) {
27
+ throw new Error(`Failed to get URL: ${error.message}`);
28
+ }
29
+ }
30
+ });
31
+ }
32
+ /**
33
+ * 创建获取页面内容工具
34
+ */
35
+ function createGetContentTool(page) {
36
+ return new tools_1.DynamicTool({
37
+ name: 'browser_get_content',
38
+ description: 'Get the page content (HTML). No input needed.',
39
+ func: async () => {
40
+ try {
41
+ const content = await page.content();
42
+ // 返回前1000个字符以避免过长
43
+ const preview = content.length > 1000 ? content.substring(0, 1000) + '...' : content;
44
+ return `Page content:\n${preview}`;
45
+ }
46
+ catch (error) {
47
+ throw new Error(`Failed to get content: ${error.message}`);
48
+ }
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * 创建获取文本工具
54
+ */
55
+ function createGetTextTool(page) {
56
+ return new tools_1.DynamicTool({
57
+ name: 'browser_get_text',
58
+ description: 'Get text content from an element. Input should be a CSS selector or text that identifies the element.',
59
+ func: async (input) => {
60
+ try {
61
+ // 尝试多个选择器
62
+ const selectors = input.split(',').map(s => s.trim());
63
+ for (const selector of selectors) {
64
+ try {
65
+ // 先尝试作为文本选择器
66
+ const locator = page.getByText(selector).first();
67
+ const count = await locator.count();
68
+ if (count > 0) {
69
+ const text = await locator.textContent();
70
+ return `Text from element with text "${selector}": ${text}`;
71
+ }
72
+ // 再尝试作为 CSS 选择器
73
+ const element = page.locator(selector).first();
74
+ const text = await element.textContent();
75
+ return `Text from element "${selector}": ${text}`;
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ }
81
+ throw new Error(`No element found matching: ${input}`);
82
+ }
83
+ catch (error) {
84
+ throw new Error(`Failed to get text: ${error.message}`);
85
+ }
86
+ }
87
+ });
88
+ }
89
+ /**
90
+ * 创建截图工具
91
+ */
92
+ function createScreenshotTool(page) {
93
+ return new tools_1.DynamicTool({
94
+ name: 'browser_screenshot',
95
+ description: 'Take a screenshot of the current page. No input needed.',
96
+ func: async () => {
97
+ try {
98
+ const timestamp = Date.now();
99
+ const filename = `screenshot-${timestamp}.png`;
100
+ await page.screenshot({ path: filename });
101
+ return `Screenshot saved to ${filename}`;
102
+ }
103
+ catch (error) {
104
+ throw new Error(`Failed to take screenshot: ${error.message}`);
105
+ }
106
+ }
107
+ });
108
+ }
109
+ /**
110
+ * 创建验证文本可见工具
111
+ */
112
+ function createVerifyTextVisibleTool(page) {
113
+ return new tools_1.DynamicTool({
114
+ name: 'browser_verify_text',
115
+ description: 'Verify that text is visible on the page. Input should be the text to verify.',
116
+ func: async (input) => {
117
+ try {
118
+ const locator = page.getByText(input).filter({ visible: true });
119
+ const count = await locator.count();
120
+ if (count === 0) {
121
+ throw new Error(`Text "${input}" not found on page`);
122
+ }
123
+ return `Text "${input}" is visible on the page`;
124
+ }
125
+ catch (error) {
126
+ throw new Error(`Failed to verify text: ${error.message}`);
127
+ }
128
+ }
129
+ });
130
+ }
131
+ /**
132
+ * 创建验证元素可见工具
133
+ */
134
+ function createVerifyElementVisibleTool(page) {
135
+ return new tools_1.DynamicTool({
136
+ name: 'browser_verify_element',
137
+ description: 'Verify that an element is visible on the page. Input should be a CSS selector.',
138
+ func: async (input) => {
139
+ try {
140
+ const locator = page.locator(input).first();
141
+ const count = await locator.count();
142
+ if (count === 0) {
143
+ throw new Error(`Element "${input}" not found on page`);
144
+ }
145
+ const isVisible = await locator.isVisible();
146
+ if (!isVisible) {
147
+ throw new Error(`Element "${input}" is not visible`);
148
+ }
149
+ return `Element "${input}" is visible on the page`;
150
+ }
151
+ catch (error) {
152
+ throw new Error(`Failed to verify element: ${error.message}`);
153
+ }
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * 验证工具集
159
+ */
160
+ const verifyTools = (page) => [
161
+ createGetURLTool(page),
162
+ createGetContentTool(page),
163
+ createGetTextTool(page),
164
+ createScreenshotTool(page),
165
+ createVerifyTextVisibleTool(page),
166
+ createVerifyElementVisibleTool(page),
167
+ ];
168
+ exports.verifyTools = verifyTools;
169
+ //# sourceMappingURL=verify.js.map
@@ -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,89 @@
1
+ /**
2
+ * AIHeal 核心类 (MVP + Agent)
3
+ * 实现基础的自愈框架 + 自愈 Agent
4
+ */
5
+ import type { AIHealConfig, RunStepOptions, HealContext, HealSummary } from '../../src/types';
6
+ import type { ModelConfig } from '../../src/types/external';
7
+ /**
8
+ * AIHeal 自愈实体
9
+ */
10
+ export declare class AIHeal {
11
+ private config;
12
+ private originalScript;
13
+ private healContexts;
14
+ private agent;
15
+ private modelConfig?;
16
+ private modelConfigRepo;
17
+ private testCaseRepo?;
18
+ private modelConfigReady;
19
+ constructor(config?: AIHealConfig);
20
+ /**
21
+ * 加载原始脚本(优先从数据库)- 同步方法
22
+ */
23
+ private loadOriginalScript;
24
+ /**
25
+ * 初始化 Agent(异步加载模型配置)
26
+ */
27
+ private initializeAgent;
28
+ /**
29
+ * 执行一个可能需要自愈的步骤
30
+ *
31
+ * @param options - 步骤选项
32
+ * @param fn - 要执行的函数
33
+ * @returns 函数执行结果
34
+ */
35
+ runStep<T>(options: RunStepOptions, fn: () => Promise<T>): Promise<T>;
36
+ /**
37
+ * 生成自愈摘要
38
+ *
39
+ * @returns 自愈摘要信息
40
+ */
41
+ summary(): Promise<HealSummary>;
42
+ /**
43
+ * 捕获变量当前值
44
+ */
45
+ private captureVariables;
46
+ /**
47
+ * 获取原始脚本
48
+ */
49
+ getOriginalScript(): string;
50
+ /**
51
+ * 获取所有自愈上下文
52
+ */
53
+ getHealContexts(): HealContext[];
54
+ /**
55
+ * 手动设置模型配置(替代通过 modelConfigId 加载)
56
+ *
57
+ * @param modelConfig - 模型配置对象
58
+ */
59
+ setModelConfig(modelConfig: ModelConfig): void;
60
+ /**
61
+ * 获取当前使用的模型配置
62
+ */
63
+ getModelConfig(): ModelConfig | undefined;
64
+ /**
65
+ * 使用 LLM 生成修复后的脚本
66
+ */
67
+ private generateModifiedScript;
68
+ /**
69
+ * 创建 LLM 实例
70
+ */
71
+ private createLLM;
72
+ /**
73
+ * 构建系统提示
74
+ */
75
+ private buildSystemPrompt;
76
+ /**
77
+ * 构建用户消息
78
+ */
79
+ private buildUserMessage;
80
+ /**
81
+ * 保存或打印脚本
82
+ */
83
+ private saveOrPrintScript;
84
+ /**
85
+ * 打印修复后的脚本
86
+ */
87
+ private printScript;
88
+ }
89
+ //# sourceMappingURL=ai-heal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-heal.d.ts","sourceRoot":"","sources":["../../src/core/ai-heal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EAEd,WAAW,EACX,WAAW,EAEZ,MAAM,UAAU,CAAC;AAIlB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,MAAM,GAAE,YAAiB;IA4BrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;OAEG;YACW,eAAe;IA4B7B;;;;;;OAMG;IACG,OAAO,CAAC,CAAC,EACb,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC;IA+Fb;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IA4DrC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAY9C;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,SAAS;IAIzC;;OAEG;YACW,sBAAsB;IA0BpC;;OAEG;IACH,OAAO,CAAC,SAAS;IA+BjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8DxB;;OAEG;YACW,iBAAiB;IAuB/B;;OAEG;IACH,OAAO,CAAC,WAAW;CAOpB"}