@cotestdev/ai-runner 0.0.2 → 0.0.4
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.
- package/dist/ai-runner/src/runner.d.ts +1 -1
- package/dist/ai-runner/src/runner.d.ts.map +1 -1
- package/dist/ai-runner/src/runner.js +6 -1
- package/dist/ai-runner/src/runner.js.map +1 -1
- package/package.json +1 -1
- package/src/runner.ts +6 -1
- package/tests/agent/test-heal-agent.spec.ts +40 -57
- package/dist/agents/heal-agent.d.ts +0 -30
- package/dist/agents/heal-agent.d.ts.map +0 -1
- package/dist/agents/heal-agent.js +0 -76
- package/dist/agents/heal-agent.js.map +0 -1
- package/dist/agents/healer.d.ts +0 -73
- package/dist/agents/healer.d.ts.map +0 -1
- package/dist/agents/healer.js +0 -538
- package/dist/agents/healer.js.map +0 -1
- package/dist/agents/tools/form.d.ts +0 -22
- package/dist/agents/tools/form.d.ts.map +0 -1
- package/dist/agents/tools/form.js +0 -134
- package/dist/agents/tools/form.js.map +0 -1
- package/dist/agents/tools/index.d.ts +0 -13
- package/dist/agents/tools/index.d.ts.map +0 -1
- package/dist/agents/tools/index.js +0 -33
- package/dist/agents/tools/index.js.map +0 -1
- package/dist/agents/tools/navigate.d.ts +0 -22
- package/dist/agents/tools/navigate.d.ts.map +0 -1
- package/dist/agents/tools/navigate.js +0 -74
- package/dist/agents/tools/navigate.js.map +0 -1
- package/dist/agents/tools/snapshot.d.ts +0 -22
- package/dist/agents/tools/snapshot.d.ts.map +0 -1
- package/dist/agents/tools/snapshot.js +0 -110
- package/dist/agents/tools/snapshot.js.map +0 -1
- package/dist/agents/tools/verify.d.ts +0 -34
- package/dist/agents/tools/verify.d.ts.map +0 -1
- package/dist/agents/tools/verify.js +0 -169
- package/dist/agents/tools/verify.js.map +0 -1
- package/dist/agents/tools/wait.d.ts +0 -22
- package/dist/agents/tools/wait.d.ts.map +0 -1
- package/dist/agents/tools/wait.js +0 -104
- package/dist/agents/tools/wait.js.map +0 -1
- package/dist/agents/types.d.ts +0 -51
- package/dist/agents/types.d.ts.map +0 -1
- package/dist/agents/types.js +0 -6
- package/dist/agents/types.js.map +0 -1
- package/dist/ai-runner/src/examples/test-final.d.ts +0 -6
- package/dist/ai-runner/src/examples/test-final.d.ts.map +0 -1
- package/dist/ai-runner/src/examples/test-final.js +0 -73
- package/dist/ai-runner/src/examples/test-final.js.map +0 -1
- package/dist/ai-runner/src/examples/test-simple-tools.d.ts +0 -6
- package/dist/ai-runner/src/examples/test-simple-tools.d.ts.map +0 -1
- package/dist/ai-runner/src/examples/test-simple-tools.js +0 -149
- package/dist/ai-runner/src/examples/test-simple-tools.js.map +0 -1
- package/dist/ai-runner/src/examples/test-working.d.ts +0 -5
- package/dist/ai-runner/src/examples/test-working.d.ts.map +0 -1
- package/dist/ai-runner/src/examples/test-working.js +0 -43
- package/dist/ai-runner/src/examples/test-working.js.map +0 -1
- package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts +0 -15
- package/dist/ai-runner/src/examples/v-test-backend-adapter.d.ts.map +0 -1
- package/dist/ai-runner/src/examples/v-test-backend-adapter.js +0 -240
- package/dist/ai-runner/src/examples/v-test-backend-adapter.js.map +0 -1
- package/dist/core/runner.d.ts +0 -194
- package/dist/core/runner.d.ts.map +0 -1
- package/dist/core/runner.js +0 -650
- package/dist/core/runner.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/index.js.map +0 -1
- package/dist/types/external.d.ts +0 -6
- package/dist/types/external.d.ts.map +0 -1
- package/dist/types/external.js +0 -7
- package/dist/types/external.js.map +0 -1
- package/dist/types/index.d.ts +0 -153
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -26
- package/dist/types/index.js.map +0 -1
- package/docs/PLAYWRIGHT_MCP_ADAPTER.md +0 -132
- package/docs/SCHEMA_EXTRACTION.md +0 -224
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* 表单工具 - Form
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.formTools = void 0;
|
|
7
|
-
exports.createFillFormTool = createFillFormTool;
|
|
8
|
-
exports.createSelectOptionTool = createSelectOptionTool;
|
|
9
|
-
exports.createSetCheckedTool = createSetCheckedTool;
|
|
10
|
-
const tools_1 = require("@langchain/core/tools");
|
|
11
|
-
/**
|
|
12
|
-
* 创建填写表单工具
|
|
13
|
-
*/
|
|
14
|
-
function createFillFormTool(page) {
|
|
15
|
-
return new tools_1.DynamicTool({
|
|
16
|
-
name: 'browser_fill',
|
|
17
|
-
description: 'Fill in a form field. Input should be in JSON format: {"selector": "css-selector-or-text", "value": "value-to-fill"}. For checkboxes, use "true" or "false" as the value.',
|
|
18
|
-
func: async (input) => {
|
|
19
|
-
try {
|
|
20
|
-
const params = JSON.parse(input);
|
|
21
|
-
const { selector, value } = params;
|
|
22
|
-
// 尝试多个选择器
|
|
23
|
-
const selectors = selector.split(',').map((s) => s.trim());
|
|
24
|
-
for (const sel of selectors) {
|
|
25
|
-
try {
|
|
26
|
-
// 尝试作为文本选择器
|
|
27
|
-
const locator = page.getByLabel(sel).or(page.getByPlaceholder(sel));
|
|
28
|
-
const count = await locator.count();
|
|
29
|
-
if (count > 0) {
|
|
30
|
-
await locator.fill(value);
|
|
31
|
-
return `Filled field with label: "${sel}" with value: "${value}"`;
|
|
32
|
-
}
|
|
33
|
-
// 尝试作为 CSS 选择器
|
|
34
|
-
await page.fill(sel, value);
|
|
35
|
-
return `Filled field: "${sel}" with value: "${value}"`;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
throw new Error(`No field found matching: ${selector}`);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
throw new Error(`Failed to fill form: ${error.message}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 创建选择选项工具
|
|
51
|
-
*/
|
|
52
|
-
function createSelectOptionTool(page) {
|
|
53
|
-
return new tools_1.DynamicTool({
|
|
54
|
-
name: 'browser_select_option',
|
|
55
|
-
description: 'Select an option in a dropdown. Input should be in JSON format: {"selector": "css-selector-or-text", "value": "option-value"}.',
|
|
56
|
-
func: async (input) => {
|
|
57
|
-
try {
|
|
58
|
-
const params = JSON.parse(input);
|
|
59
|
-
const { selector, value } = params;
|
|
60
|
-
// 尝试多个选择器
|
|
61
|
-
const selectors = selector.split(',').map((s) => s.trim());
|
|
62
|
-
for (const sel of selectors) {
|
|
63
|
-
try {
|
|
64
|
-
// 尝试作为文本选择器
|
|
65
|
-
const locator = page.getByLabel(sel);
|
|
66
|
-
const count = await locator.count();
|
|
67
|
-
if (count > 0) {
|
|
68
|
-
await locator.selectOption(value);
|
|
69
|
-
return `Selected option "${value}" in dropdown with label: "${sel}"`;
|
|
70
|
-
}
|
|
71
|
-
// 尝试作为 CSS 选择器
|
|
72
|
-
await page.selectOption(sel, value);
|
|
73
|
-
return `Selected option "${value}" in dropdown: "${sel}"`;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
throw new Error(`No dropdown found matching: ${selector}`);
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
throw new Error(`Failed to select option: ${error.message}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 创建复选框工具
|
|
89
|
-
*/
|
|
90
|
-
function createSetCheckedTool(page) {
|
|
91
|
-
return new tools_1.DynamicTool({
|
|
92
|
-
name: 'browser_set_checked',
|
|
93
|
-
description: 'Check or uncheck a checkbox. Input should be in JSON format: {"selector": "css-selector-or-text", "checked": true|false}.',
|
|
94
|
-
func: async (input) => {
|
|
95
|
-
try {
|
|
96
|
-
const params = JSON.parse(input);
|
|
97
|
-
const { selector, checked } = params;
|
|
98
|
-
// 尝试多个选择器
|
|
99
|
-
const selectors = selector.split(',').map((s) => s.trim());
|
|
100
|
-
for (const sel of selectors) {
|
|
101
|
-
try {
|
|
102
|
-
// 尝试作为文本选择器
|
|
103
|
-
const locator = page.getByLabel(sel);
|
|
104
|
-
const count = await locator.count();
|
|
105
|
-
if (count > 0) {
|
|
106
|
-
await locator.setChecked(checked);
|
|
107
|
-
return `${checked ? 'Checked' : 'Unchecked'} checkbox with label: "${sel}"`;
|
|
108
|
-
}
|
|
109
|
-
// 尝试作为 CSS 选择器
|
|
110
|
-
await page.setChecked(sel, checked);
|
|
111
|
-
return `${checked ? 'Checked' : 'Unchecked'} checkbox: "${sel}"`;
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
throw new Error(`No checkbox found matching: ${selector}`);
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
throw new Error(`Failed to set checked: ${error.message}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 表单工具集
|
|
127
|
-
*/
|
|
128
|
-
const formTools = (page) => [
|
|
129
|
-
createFillFormTool(page),
|
|
130
|
-
createSelectOptionTool(page),
|
|
131
|
-
createSetCheckedTool(page),
|
|
132
|
-
];
|
|
133
|
-
exports.formTools = formTools;
|
|
134
|
-
//# sourceMappingURL=form.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../../src/agents/tools/form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LangChain 兼容的 Playwright 工具集
|
|
3
|
-
* 从 Playwright MCP 工具转换而来,用于自愈 Agent
|
|
4
|
-
*/
|
|
5
|
-
import { DynamicTool } from '@langchain/core/tools';
|
|
6
|
-
import type { Page } from 'playwright';
|
|
7
|
-
export { navigateTools } from './navigate';
|
|
8
|
-
export { snapshotTools } from './snapshot';
|
|
9
|
-
export { formTools } from './form';
|
|
10
|
-
export { waitTools } from './wait';
|
|
11
|
-
export { verifyTools } from './verify';
|
|
12
|
-
export declare const getAllTools: (page: Page) => DynamicTool[];
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,eAAO,MAAM,WAAW,GAAI,MAAM,IAAI,KAAG,WAAW,EAMnD,CAAC"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* LangChain 兼容的 Playwright 工具集
|
|
4
|
-
* 从 Playwright MCP 工具转换而来,用于自愈 Agent
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.getAllTools = exports.verifyTools = exports.waitTools = exports.formTools = exports.snapshotTools = exports.navigateTools = void 0;
|
|
8
|
-
const navigate_1 = require("./navigate");
|
|
9
|
-
const snapshot_1 = require("./snapshot");
|
|
10
|
-
const form_1 = require("./form");
|
|
11
|
-
const wait_1 = require("./wait");
|
|
12
|
-
const verify_1 = require("./verify");
|
|
13
|
-
// 重新导出工具工厂函数
|
|
14
|
-
var navigate_2 = require("./navigate");
|
|
15
|
-
Object.defineProperty(exports, "navigateTools", { enumerable: true, get: function () { return navigate_2.navigateTools; } });
|
|
16
|
-
var snapshot_2 = require("./snapshot");
|
|
17
|
-
Object.defineProperty(exports, "snapshotTools", { enumerable: true, get: function () { return snapshot_2.snapshotTools; } });
|
|
18
|
-
var form_2 = require("./form");
|
|
19
|
-
Object.defineProperty(exports, "formTools", { enumerable: true, get: function () { return form_2.formTools; } });
|
|
20
|
-
var wait_2 = require("./wait");
|
|
21
|
-
Object.defineProperty(exports, "waitTools", { enumerable: true, get: function () { return wait_2.waitTools; } });
|
|
22
|
-
var verify_2 = require("./verify");
|
|
23
|
-
Object.defineProperty(exports, "verifyTools", { enumerable: true, get: function () { return verify_2.verifyTools; } });
|
|
24
|
-
// 获取所有工具的工厂函数
|
|
25
|
-
const getAllTools = (page) => [
|
|
26
|
-
...(0, navigate_1.navigateTools)(page),
|
|
27
|
-
...(0, snapshot_1.snapshotTools)(page),
|
|
28
|
-
...(0, form_1.formTools)(page),
|
|
29
|
-
...(0, wait_1.waitTools)(page),
|
|
30
|
-
...(0, verify_1.verifyTools)(page),
|
|
31
|
-
];
|
|
32
|
-
exports.getAllTools = getAllTools;
|
|
33
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/tools/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,yCAA2C;AAC3C,yCAA2C;AAC3C,iCAAmC;AACnC,iCAAmC;AACnC,qCAAuC;AAEvC,aAAa;AACb,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AACtB,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AACtB,+BAAmC;AAA1B,iGAAA,SAAS,OAAA;AAClB,+BAAmC;AAA1B,iGAAA,SAAS,OAAA;AAClB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AAEpB,cAAc;AACP,MAAM,WAAW,GAAG,CAAC,IAAU,EAAiB,EAAE,CAAC;IACxD,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC;IACtB,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC;IACtB,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC;IAClB,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC;IAClB,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC;CACrB,CAAC;AANW,QAAA,WAAW,eAMtB"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 导航工具 - Navigate
|
|
3
|
-
*/
|
|
4
|
-
import { DynamicTool } from '@langchain/core/tools';
|
|
5
|
-
import type { Page } from 'playwright';
|
|
6
|
-
/**
|
|
7
|
-
* 创建导航工具
|
|
8
|
-
*/
|
|
9
|
-
export declare function createNavigateTool(page: Page): DynamicTool;
|
|
10
|
-
/**
|
|
11
|
-
* 创建后退工具
|
|
12
|
-
*/
|
|
13
|
-
export declare function createGoBackTool(page: Page): DynamicTool;
|
|
14
|
-
/**
|
|
15
|
-
* 创建前进工具
|
|
16
|
-
*/
|
|
17
|
-
export declare function createGoForwardTool(page: Page): DynamicTool;
|
|
18
|
-
/**
|
|
19
|
-
* 导航工具集
|
|
20
|
-
*/
|
|
21
|
-
export declare const navigateTools: (page: Page) => DynamicTool[];
|
|
22
|
-
//# sourceMappingURL=navigate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/navigate.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,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAa1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAaxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAa3D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,KAAG,WAAW,EAIrD,CAAC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* 导航工具 - Navigate
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.navigateTools = void 0;
|
|
7
|
-
exports.createNavigateTool = createNavigateTool;
|
|
8
|
-
exports.createGoBackTool = createGoBackTool;
|
|
9
|
-
exports.createGoForwardTool = createGoForwardTool;
|
|
10
|
-
const tools_1 = require("@langchain/core/tools");
|
|
11
|
-
/**
|
|
12
|
-
* 创建导航工具
|
|
13
|
-
*/
|
|
14
|
-
function createNavigateTool(page) {
|
|
15
|
-
return new tools_1.DynamicTool({
|
|
16
|
-
name: 'browser_navigate',
|
|
17
|
-
description: 'Navigate to a URL. Input should be the URL as a string.',
|
|
18
|
-
func: async (input) => {
|
|
19
|
-
try {
|
|
20
|
-
await page.goto(input, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
|
21
|
-
return `Navigated to ${input}`;
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
throw new Error(`Failed to navigate to ${input}: ${error.message}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 创建后退工具
|
|
31
|
-
*/
|
|
32
|
-
function createGoBackTool(page) {
|
|
33
|
-
return new tools_1.DynamicTool({
|
|
34
|
-
name: 'browser_navigate_back',
|
|
35
|
-
description: 'Go back to the previous page. No input needed.',
|
|
36
|
-
func: async () => {
|
|
37
|
-
try {
|
|
38
|
-
await page.goBack();
|
|
39
|
-
return 'Navigated back';
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
throw new Error(`Failed to go back: ${error.message}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* 创建前进工具
|
|
49
|
-
*/
|
|
50
|
-
function createGoForwardTool(page) {
|
|
51
|
-
return new tools_1.DynamicTool({
|
|
52
|
-
name: 'browser_navigate_forward',
|
|
53
|
-
description: 'Go forward to the next page. No input needed.',
|
|
54
|
-
func: async () => {
|
|
55
|
-
try {
|
|
56
|
-
await page.goForward();
|
|
57
|
-
return 'Navigated forward';
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
throw new Error(`Failed to go forward: ${error.message}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 导航工具集
|
|
67
|
-
*/
|
|
68
|
-
const navigateTools = (page) => [
|
|
69
|
-
createNavigateTool(page),
|
|
70
|
-
createGoBackTool(page),
|
|
71
|
-
createGoForwardTool(page),
|
|
72
|
-
];
|
|
73
|
-
exports.navigateTools = navigateTools;
|
|
74
|
-
//# sourceMappingURL=navigate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../../src/agents/tools/navigate.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAQH,gDAaC;AAKD,4CAaC;AAKD,kDAaC;AAvDD,iDAAoD;AAGpD;;GAEG;AACH,SAAgB,kBAAkB,CAAC,IAAU;IAC3C,OAAO,IAAI,mBAAW,CAAC;QACrB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,yDAAyD;QACtE,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1E,OAAO,gBAAgB,KAAK,EAAE,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAU;IACzC,OAAO,IAAI,mBAAW,CAAC;QACrB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,gDAAgD;QAC7D,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,IAAU;IAC5C,OAAO,IAAI,mBAAW,CAAC;QACrB,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,OAAO,mBAAmB,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,IAAU,EAAiB,EAAE,CAAC;IAC1D,kBAAkB,CAAC,IAAI,CAAC;IACxB,gBAAgB,CAAC,IAAI,CAAC;IACtB,mBAAmB,CAAC,IAAI,CAAC;CAC1B,CAAC;AAJW,QAAA,aAAa,iBAIxB"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 快照和交互工具 - Snapshot & Click
|
|
3
|
-
*/
|
|
4
|
-
import { DynamicTool } from '@langchain/core/tools';
|
|
5
|
-
import type { Page } from 'playwright';
|
|
6
|
-
/**
|
|
7
|
-
* 创建页面快照工具
|
|
8
|
-
*/
|
|
9
|
-
export declare function createSnapshotTool(page: Page): DynamicTool;
|
|
10
|
-
/**
|
|
11
|
-
* 创建点击工具
|
|
12
|
-
*/
|
|
13
|
-
export declare function createClickTool(page: Page): DynamicTool;
|
|
14
|
-
/**
|
|
15
|
-
* 创建悬停工具
|
|
16
|
-
*/
|
|
17
|
-
export declare function createHoverTool(page: Page): DynamicTool;
|
|
18
|
-
/**
|
|
19
|
-
* 快照和交互工具集
|
|
20
|
-
*/
|
|
21
|
-
export declare const snapshotTools: (page: Page) => DynamicTool[];
|
|
22
|
-
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/snapshot.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,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAc1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAkCvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CA+BvD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,KAAG,WAAW,EAIrD,CAAC"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* 快照和交互工具 - Snapshot & Click
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.snapshotTools = void 0;
|
|
7
|
-
exports.createSnapshotTool = createSnapshotTool;
|
|
8
|
-
exports.createClickTool = createClickTool;
|
|
9
|
-
exports.createHoverTool = createHoverTool;
|
|
10
|
-
const tools_1 = require("@langchain/core/tools");
|
|
11
|
-
/**
|
|
12
|
-
* 创建页面快照工具
|
|
13
|
-
*/
|
|
14
|
-
function createSnapshotTool(page) {
|
|
15
|
-
return new tools_1.DynamicTool({
|
|
16
|
-
name: 'browser_snapshot',
|
|
17
|
-
description: 'Get an accessibility snapshot of the current page. This is better than a screenshot for understanding page structure. No input needed.',
|
|
18
|
-
func: async () => {
|
|
19
|
-
try {
|
|
20
|
-
// 使用 aria 快照作为替代
|
|
21
|
-
const snapshot = await page.locator('body').ariaSnapshot();
|
|
22
|
-
return `Page accessibility snapshot:\n${snapshot}`;
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
throw new Error(`Failed to get snapshot: ${error.message}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 创建点击工具
|
|
32
|
-
*/
|
|
33
|
-
function createClickTool(page) {
|
|
34
|
-
return new tools_1.DynamicTool({
|
|
35
|
-
name: 'browser_click',
|
|
36
|
-
description: 'Click on an element. Input should be a CSS selector or text that identifies the element. You can also use multiple selectors separated by commas.',
|
|
37
|
-
func: async (input) => {
|
|
38
|
-
try {
|
|
39
|
-
// 尝试多个选择器
|
|
40
|
-
const selectors = input.split(',').map(s => s.trim());
|
|
41
|
-
for (const selector of selectors) {
|
|
42
|
-
try {
|
|
43
|
-
// 先尝试作为文本选择器
|
|
44
|
-
const locator = page.getByText(selector).first();
|
|
45
|
-
const count = await locator.count();
|
|
46
|
-
if (count > 0) {
|
|
47
|
-
await locator.click({ timeout: 5000 });
|
|
48
|
-
return `Clicked on element with text: "${selector}"`;
|
|
49
|
-
}
|
|
50
|
-
// 再尝试作为 CSS 选择器
|
|
51
|
-
await page.click(selector, { timeout: 5000 });
|
|
52
|
-
return `Clicked on element: "${selector}"`;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// 继续尝试下一个选择器
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
throw new Error(`No element found matching: ${input}`);
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
throw new Error(`Failed to click on "${input}": ${error.message}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 创建悬停工具
|
|
69
|
-
*/
|
|
70
|
-
function createHoverTool(page) {
|
|
71
|
-
return new tools_1.DynamicTool({
|
|
72
|
-
name: 'browser_hover',
|
|
73
|
-
description: 'Hover over an element. Input should be a CSS selector or text that identifies the element.',
|
|
74
|
-
func: async (input) => {
|
|
75
|
-
try {
|
|
76
|
-
// 尝试多个选择器
|
|
77
|
-
const selectors = input.split(',').map(s => s.trim());
|
|
78
|
-
for (const selector of selectors) {
|
|
79
|
-
try {
|
|
80
|
-
const locator = page.getByText(selector).first();
|
|
81
|
-
const count = await locator.count();
|
|
82
|
-
if (count > 0) {
|
|
83
|
-
await locator.hover({ timeout: 5000 });
|
|
84
|
-
return `Hovered over element with text: "${selector}"`;
|
|
85
|
-
}
|
|
86
|
-
await page.hover(selector, { timeout: 5000 });
|
|
87
|
-
return `Hovered over element: "${selector}"`;
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
throw new Error(`No element found matching: ${input}`);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
throw new Error(`Failed to hover over "${input}": ${error.message}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 快照和交互工具集
|
|
103
|
-
*/
|
|
104
|
-
const snapshotTools = (page) => [
|
|
105
|
-
createSnapshotTool(page),
|
|
106
|
-
createClickTool(page),
|
|
107
|
-
createHoverTool(page),
|
|
108
|
-
];
|
|
109
|
-
exports.snapshotTools = snapshotTools;
|
|
110
|
-
//# sourceMappingURL=snapshot.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/agents/tools/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 验证工具 - Verify
|
|
3
|
-
*/
|
|
4
|
-
import { DynamicTool } from '@langchain/core/tools';
|
|
5
|
-
import type { Page } from 'playwright';
|
|
6
|
-
/**
|
|
7
|
-
* 创建获取URL工具
|
|
8
|
-
*/
|
|
9
|
-
export declare function createGetURLTool(page: Page): DynamicTool;
|
|
10
|
-
/**
|
|
11
|
-
* 创建获取页面内容工具
|
|
12
|
-
*/
|
|
13
|
-
export declare function createGetContentTool(page: Page): DynamicTool;
|
|
14
|
-
/**
|
|
15
|
-
* 创建获取文本工具
|
|
16
|
-
*/
|
|
17
|
-
export declare function createGetTextTool(page: Page): DynamicTool;
|
|
18
|
-
/**
|
|
19
|
-
* 创建截图工具
|
|
20
|
-
*/
|
|
21
|
-
export declare function createScreenshotTool(page: Page): DynamicTool;
|
|
22
|
-
/**
|
|
23
|
-
* 创建验证文本可见工具
|
|
24
|
-
*/
|
|
25
|
-
export declare function createVerifyTextVisibleTool(page: Page): DynamicTool;
|
|
26
|
-
/**
|
|
27
|
-
* 创建验证元素可见工具
|
|
28
|
-
*/
|
|
29
|
-
export declare function createVerifyElementVisibleTool(page: Page): DynamicTool;
|
|
30
|
-
/**
|
|
31
|
-
* 验证工具集
|
|
32
|
-
*/
|
|
33
|
-
export declare const verifyTools: (page: Page) => DynamicTool[];
|
|
34
|
-
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/verify.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,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAaxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAe5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAkCzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAe5D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAmBnE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAwBtE;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,IAAI,KAAG,WAAW,EAOnD,CAAC"}
|
|
@@ -1,169 +0,0 @@
|
|
|
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
|