@empiricalrun/test-gen 0.31.19 → 0.31.21
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/CHANGELOG.md +15 -0
- package/dist/actions/assert.d.ts.map +1 -1
- package/dist/actions/assert.js +6 -4
- package/dist/actions/click.d.ts.map +1 -1
- package/dist/actions/click.js +5 -3
- package/dist/actions/done.js +1 -1
- package/dist/actions/fill.d.ts.map +1 -1
- package/dist/actions/fill.js +4 -2
- package/dist/actions/goto.d.ts.map +1 -1
- package/dist/actions/goto.js +5 -3
- package/dist/actions/hover.js +2 -2
- package/dist/actions/index.d.ts +8 -3
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +56 -9
- package/dist/actions/reload-page.d.ts.map +1 -1
- package/dist/actions/reload-page.js +4 -2
- package/dist/actions/skill.d.ts +18 -0
- package/dist/actions/skill.d.ts.map +1 -0
- package/dist/actions/skill.js +94 -0
- package/dist/actions/text-content.d.ts.map +1 -1
- package/dist/actions/text-content.js +4 -2
- package/dist/agent/browsing/index.d.ts +13 -3
- package/dist/agent/browsing/index.d.ts.map +1 -1
- package/dist/agent/browsing/index.js +119 -207
- package/dist/agent/codegen/create-test-block.js +1 -1
- package/dist/agent/codegen/skills-retriever.d.ts +13 -0
- package/dist/agent/codegen/skills-retriever.d.ts.map +1 -0
- package/dist/agent/codegen/skills-retriever.js +61 -0
- package/dist/agent/codegen/use-skill.d.ts +9 -0
- package/dist/agent/codegen/use-skill.d.ts.map +1 -0
- package/dist/agent/codegen/use-skill.js +49 -0
- package/dist/agent/codegen/utils.d.ts +9 -0
- package/dist/agent/codegen/utils.d.ts.map +1 -1
- package/dist/agent/codegen/utils.js +20 -1
- package/dist/agent/master/run.d.ts +16 -5
- package/dist/agent/master/run.d.ts.map +1 -1
- package/dist/agent/master/run.js +178 -38
- package/dist/agent/verification/index.d.ts.map +1 -1
- package/dist/agent/verification/index.js +2 -0
- package/dist/bin/utils/context.d.ts +1 -0
- package/dist/bin/utils/context.d.ts.map +1 -1
- package/dist/bin/utils/context.js +7 -2
- package/dist/bin/utils/platform/web/index.d.ts +1 -0
- package/dist/bin/utils/platform/web/index.d.ts.map +1 -1
- package/dist/bin/utils/platform/web/index.js +28 -1
- package/dist/file/client.d.ts +2 -1
- package/dist/file/client.d.ts.map +1 -1
- package/dist/file/client.js +2 -2
- package/dist/file/server.d.ts.map +1 -1
- package/dist/file/server.js +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -5
- package/dist/types/index.d.ts +10 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @empiricalrun/test-gen
|
|
2
2
|
|
|
3
|
+
## 0.31.21
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [21190fa]
|
|
8
|
+
- @empiricalrun/reporter@0.20.3
|
|
9
|
+
|
|
10
|
+
## 0.31.20
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- fcacf06: feat: add support for poms in master agent
|
|
15
|
+
- Updated dependencies [fcacf06]
|
|
16
|
+
- @empiricalrun/llm@0.9.4
|
|
17
|
+
|
|
3
18
|
## 0.31.19
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/actions/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,6CAA6C,2BAChC,CAAC;AAE3B,eAAO,MAAM,mCAAmC,EAAE,
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/actions/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,6CAA6C,2BAChC,CAAC;AAE3B,eAAO,MAAM,mCAAmC,EAAE,yBAsDjD,CAAC"}
|
package/dist/actions/assert.js
CHANGED
|
@@ -6,7 +6,7 @@ const utils_1 = require("./utils");
|
|
|
6
6
|
exports.PLAYWRIGHT_ASSERT_TEXT_VISIBILITY_ACTION_NAME = "assert_text_visibility";
|
|
7
7
|
const assertTextVisibilityActionGenerator = (page) => {
|
|
8
8
|
return {
|
|
9
|
-
execute: async (args) => {
|
|
9
|
+
execute: async ({ args }) => {
|
|
10
10
|
const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(args.css_selector, args.xpath, page);
|
|
11
11
|
const exec = new Function("page", `return page.${locator}.isVisible({ timeout: 3000 })`);
|
|
12
12
|
await exec(page);
|
|
@@ -15,8 +15,10 @@ const assertTextVisibilityActionGenerator = (page) => {
|
|
|
15
15
|
};
|
|
16
16
|
},
|
|
17
17
|
// TODO: args transformer to be kept at a single place
|
|
18
|
-
template: (
|
|
19
|
-
return
|
|
18
|
+
template: (_, options) => {
|
|
19
|
+
return {
|
|
20
|
+
code: `await expect(${(0, utils_1.getPageVarName)()}.${options.locator}).toBeVisible();`,
|
|
21
|
+
};
|
|
20
22
|
},
|
|
21
23
|
name: exports.PLAYWRIGHT_ASSERT_TEXT_VISIBILITY_ACTION_NAME,
|
|
22
24
|
schema: {
|
|
@@ -40,7 +42,7 @@ const assertTextVisibilityActionGenerator = (page) => {
|
|
|
40
42
|
description: constants_1.DEFAULT_ACTION_REASON_PROMPT,
|
|
41
43
|
},
|
|
42
44
|
},
|
|
43
|
-
required: ["css_selector", "
|
|
45
|
+
required: ["css_selector", "reason", "xpath"],
|
|
44
46
|
},
|
|
45
47
|
},
|
|
46
48
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/actions/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/actions/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAE,yBAsDlC,CAAC"}
|
package/dist/actions/click.js
CHANGED
|
@@ -6,7 +6,7 @@ const utils_1 = require("./utils");
|
|
|
6
6
|
exports.PLAYWRIGHT_CLICK_ACTION_NAME = "click_element";
|
|
7
7
|
const clickActionGenerator = (page) => {
|
|
8
8
|
return {
|
|
9
|
-
execute: async (args) => {
|
|
9
|
+
execute: async ({ args }) => {
|
|
10
10
|
const selector = args.css_selector;
|
|
11
11
|
const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(selector, args.xpath, page);
|
|
12
12
|
const exec = new Function("page", `return page.${locator}.click({ timeout: 3000 })`);
|
|
@@ -17,8 +17,10 @@ const clickActionGenerator = (page) => {
|
|
|
17
17
|
};
|
|
18
18
|
},
|
|
19
19
|
// TODO: args transformer to be kept at a single place
|
|
20
|
-
template: (
|
|
21
|
-
return
|
|
20
|
+
template: (_, options) => {
|
|
21
|
+
return {
|
|
22
|
+
code: `await ${(0, utils_1.getPageVarName)()}.${options.locator}.click();`,
|
|
23
|
+
};
|
|
22
24
|
},
|
|
23
25
|
name: exports.PLAYWRIGHT_CLICK_ACTION_NAME,
|
|
24
26
|
schema: {
|
package/dist/actions/done.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/actions/fill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAGhE,eAAO,MAAM,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/actions/fill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAGhE,eAAO,MAAM,mBAAmB,EAAE,yBAiFjC,CAAC"}
|
package/dist/actions/fill.js
CHANGED
|
@@ -9,7 +9,7 @@ const fillActionGenerator = (page, options) => {
|
|
|
9
9
|
const stateVariableNames = Object.keys(options?.stateVariables || {});
|
|
10
10
|
stateVariableNames.push(NO_STATE_VARIABLE);
|
|
11
11
|
return {
|
|
12
|
-
execute: async (args) => {
|
|
12
|
+
execute: async ({ args }) => {
|
|
13
13
|
const css = args.css_selector;
|
|
14
14
|
const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(css, args.xpath, page);
|
|
15
15
|
const textToFill = options?.stateVariables[args.variable_name] || args.text;
|
|
@@ -21,7 +21,9 @@ const fillActionGenerator = (page, options) => {
|
|
|
21
21
|
},
|
|
22
22
|
// TODO: args transformer to be kept at a single place
|
|
23
23
|
template: (args, options) => {
|
|
24
|
-
return
|
|
24
|
+
return {
|
|
25
|
+
code: `await ${(0, utils_1.getPageVarName)()}.${options.locator}.fill("${args.text}");`,
|
|
26
|
+
};
|
|
25
27
|
},
|
|
26
28
|
name: exports.PLAYWRIGHT_FILL_ACTION_NAME,
|
|
27
29
|
schema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../src/actions/goto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../src/actions/goto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,cAAc,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,yBAuCjC,CAAC"}
|
package/dist/actions/goto.js
CHANGED
|
@@ -7,7 +7,7 @@ const utils_2 = require("./utils");
|
|
|
7
7
|
exports.PLAYWRIGHT_GOTO_ACTION_NAME = "page_goto";
|
|
8
8
|
const gotoActionGenerator = (page) => {
|
|
9
9
|
return {
|
|
10
|
-
execute: async (args) => {
|
|
10
|
+
execute: async ({ args }) => {
|
|
11
11
|
const url = args.url;
|
|
12
12
|
await page.goto(url);
|
|
13
13
|
await page.waitForTimeout(3000);
|
|
@@ -16,8 +16,10 @@ const gotoActionGenerator = (page) => {
|
|
|
16
16
|
// TODO: args transformer to be kept at a single place
|
|
17
17
|
template: (args) => {
|
|
18
18
|
const url = args.url;
|
|
19
|
-
const
|
|
20
|
-
return
|
|
19
|
+
const code = `await ${(0, utils_2.getPageVarName)()}.goto("${url}");`;
|
|
20
|
+
return {
|
|
21
|
+
code,
|
|
22
|
+
};
|
|
21
23
|
},
|
|
22
24
|
name: exports.PLAYWRIGHT_GOTO_ACTION_NAME,
|
|
23
25
|
schema: {
|
package/dist/actions/hover.js
CHANGED
|
@@ -6,7 +6,7 @@ const utils_1 = require("./utils");
|
|
|
6
6
|
exports.PLAYWRIGHT_HOVER_ACTION_NAME = "hover_element";
|
|
7
7
|
const hoverActionGenerator = (page) => {
|
|
8
8
|
return {
|
|
9
|
-
execute: async (args) => {
|
|
9
|
+
execute: async ({ args }) => {
|
|
10
10
|
const selector = args.css_selector;
|
|
11
11
|
const locator = await (0, utils_1.getPlaywrightLocatorUsingCssSelector)(selector, args.xpath, page);
|
|
12
12
|
const exec = new Function("page", `return page.${locator}.hover({ timeout: 3000 })`);
|
|
@@ -18,7 +18,7 @@ const hoverActionGenerator = (page) => {
|
|
|
18
18
|
},
|
|
19
19
|
// TODO: args transformer to be kept at a single place
|
|
20
20
|
template: (args, options) => {
|
|
21
|
-
return `await ${(0, utils_1.getPageVarName)()}.${options.locator}.hover()
|
|
21
|
+
return { code: `await ${(0, utils_1.getPageVarName)()}.${options.locator}.hover();` };
|
|
22
22
|
},
|
|
23
23
|
name: exports.PLAYWRIGHT_HOVER_ACTION_NAME,
|
|
24
24
|
schema: {
|
package/dist/actions/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TraceClient } from "@empiricalrun/llm";
|
|
1
2
|
import { Page } from "playwright";
|
|
2
3
|
import { ActionSchema } from "../types";
|
|
3
4
|
export declare class PlaywrightActions {
|
|
@@ -6,9 +7,13 @@ export declare class PlaywrightActions {
|
|
|
6
7
|
private recordedActions;
|
|
7
8
|
private stateVariables;
|
|
8
9
|
constructor(page: Page);
|
|
9
|
-
executeAction(name: string | undefined, args: Record<string, any
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
executeAction(name: string | undefined, args: Record<string, any>, trace?: TraceClient): Promise<void>;
|
|
11
|
+
getBrowsingActionSchemas(): ActionSchema[];
|
|
12
|
+
getMasterActionSchemas(): ActionSchema[];
|
|
13
|
+
generateCode(): {
|
|
14
|
+
code: string;
|
|
15
|
+
importPaths: string[];
|
|
16
|
+
};
|
|
12
17
|
getLastCodeLines(count: number): string[];
|
|
13
18
|
isComplete(): boolean;
|
|
14
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIlC,OAAO,EAAE,YAAY,EAA6B,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIlC,OAAO,EAAE,YAAY,EAA6B,MAAM,UAAU,CAAC;AAWnE,qBAAa,iBAAiB;IAShB,OAAO,CAAC,IAAI;IARxB,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,eAAe,CAInB;IACJ,OAAO,CAAC,cAAc,CAA2B;gBAE7B,IAAI,EAAE,IAAI;IAexB,aAAa,CACjB,IAAI,oBAAa,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,CAAC,EAAE,WAAW;IAgDrB,wBAAwB,IAAI,YAAY,EAAE;IAmB1C,sBAAsB,IAAI,YAAY,EAAE;IAUxC,YAAY,IAAI;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IAUD,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAO9B,UAAU;CAUX"}
|
package/dist/actions/index.js
CHANGED
|
@@ -10,10 +10,10 @@ const fill_1 = require("./fill");
|
|
|
10
10
|
const goto_1 = require("./goto");
|
|
11
11
|
const hover_1 = require("./hover");
|
|
12
12
|
const reload_page_1 = require("./reload-page");
|
|
13
|
+
const skill_1 = require("./skill");
|
|
13
14
|
const text_content_1 = require("./text-content");
|
|
14
15
|
class PlaywrightActions {
|
|
15
16
|
page;
|
|
16
|
-
// private actions: Action[];
|
|
17
17
|
actionGenerators;
|
|
18
18
|
recordedActions;
|
|
19
19
|
stateVariables = {};
|
|
@@ -28,10 +28,11 @@ class PlaywrightActions {
|
|
|
28
28
|
assert_1.assertTextVisibilityActionGenerator,
|
|
29
29
|
reload_page_1.reloadActionGenerator,
|
|
30
30
|
text_content_1.textContentActionGenerator,
|
|
31
|
+
skill_1.skillActionGenerator,
|
|
31
32
|
];
|
|
32
33
|
this.recordedActions = [];
|
|
33
34
|
}
|
|
34
|
-
async executeAction(name = "", args) {
|
|
35
|
+
async executeAction(name = "", args, trace) {
|
|
35
36
|
const [action] = this.actionGenerators
|
|
36
37
|
.map((a) => a(this.page, { stateVariables: this.stateVariables }))
|
|
37
38
|
.filter((a) => a.name === name);
|
|
@@ -41,28 +42,74 @@ class PlaywrightActions {
|
|
|
41
42
|
const logger = new logger_1.CustomLogger({ useReporter: false });
|
|
42
43
|
const testgenUpdatesReporter = new reporter_1.TestGenUpdatesReporter();
|
|
43
44
|
logger.logEmptyLine();
|
|
45
|
+
const actionSpan = trace?.span({
|
|
46
|
+
name: "execute-action",
|
|
47
|
+
input: {
|
|
48
|
+
name,
|
|
49
|
+
args,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
44
52
|
try {
|
|
45
|
-
const templateOptions = (await action.execute(
|
|
53
|
+
const templateOptions = (await action.execute({
|
|
54
|
+
args,
|
|
55
|
+
trace: actionSpan,
|
|
56
|
+
})) || {
|
|
57
|
+
locator: "",
|
|
58
|
+
};
|
|
46
59
|
// record successful actions
|
|
47
|
-
const code = action.template(args, templateOptions);
|
|
48
|
-
|
|
60
|
+
const { code, importPath } = action.template(args, templateOptions);
|
|
61
|
+
actionSpan?.end({
|
|
62
|
+
output: {
|
|
63
|
+
code,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
this.recordedActions.push({ name, code, importPath });
|
|
49
67
|
if (code) {
|
|
50
68
|
logger.log(`action: ${name} \ncode: ${code} \nreason: ${args.reason}`);
|
|
51
69
|
void testgenUpdatesReporter.sendMessage("```ts\n" + code + "\n```");
|
|
52
70
|
}
|
|
53
71
|
}
|
|
54
72
|
catch (e) {
|
|
73
|
+
actionSpan?.end({
|
|
74
|
+
output: {
|
|
75
|
+
error: e.message,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
55
78
|
logger.log(`action: ${name} \nreason: ${args.reason}`);
|
|
56
79
|
throw Error(`Error executing ${name} action: ${e.message}`);
|
|
57
80
|
}
|
|
58
81
|
}
|
|
59
|
-
|
|
60
|
-
return
|
|
61
|
-
.
|
|
82
|
+
getBrowsingActionSchemas() {
|
|
83
|
+
return [
|
|
84
|
+
fill_1.fillActionGenerator,
|
|
85
|
+
goto_1.gotoActionGenerator,
|
|
86
|
+
click_1.clickActionGenerator,
|
|
87
|
+
done_1.doneActionGenerator,
|
|
88
|
+
assert_1.assertTextVisibilityActionGenerator,
|
|
89
|
+
reload_page_1.reloadActionGenerator,
|
|
90
|
+
text_content_1.textContentActionGenerator,
|
|
91
|
+
skill_1.skillActionGenerator,
|
|
92
|
+
]
|
|
93
|
+
.map((a) => a(this.page, {
|
|
94
|
+
stateVariables: this.stateVariables,
|
|
95
|
+
}))
|
|
96
|
+
.map((a) => a.schema);
|
|
97
|
+
}
|
|
98
|
+
getMasterActionSchemas() {
|
|
99
|
+
return [skill_1.skillActionGenerator]
|
|
100
|
+
.map((a) => a(this.page, {
|
|
101
|
+
stateVariables: this.stateVariables,
|
|
102
|
+
}))
|
|
62
103
|
.map((a) => a.schema);
|
|
63
104
|
}
|
|
64
105
|
generateCode() {
|
|
65
|
-
|
|
106
|
+
const importPaths = this.recordedActions
|
|
107
|
+
.map((a) => a.importPath || "")
|
|
108
|
+
.filter((a) => !!a);
|
|
109
|
+
return {
|
|
110
|
+
code: this.recordedActions.map((a) => a.code).join("\n"),
|
|
111
|
+
importPaths,
|
|
112
|
+
};
|
|
66
113
|
}
|
|
67
114
|
getLastCodeLines(count) {
|
|
68
115
|
const actions = this.recordedActions.filter((a) => a.name !== done_1.PLAYWRIGHT_DONE_ACTION_NAME);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reload-page.d.ts","sourceRoot":"","sources":["../../src/actions/reload-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAE3D,eAAO,MAAM,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"reload-page.d.ts","sourceRoot":"","sources":["../../src/actions/reload-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAE3D,eAAO,MAAM,qBAAqB,EAAE,yBAiCnC,CAAC"}
|
|
@@ -13,8 +13,10 @@ const reloadActionGenerator = (page) => {
|
|
|
13
13
|
await (0, utils_1.injectPwLocatorGenerator)(page);
|
|
14
14
|
},
|
|
15
15
|
template: () => {
|
|
16
|
-
const
|
|
17
|
-
return
|
|
16
|
+
const code = `await ${(0, utils_2.getPageVarName)()}.reload();`;
|
|
17
|
+
return {
|
|
18
|
+
code,
|
|
19
|
+
};
|
|
18
20
|
},
|
|
19
21
|
name: exports.PLAYWRIGHT_RELOAD_ACTION_NAME,
|
|
20
22
|
schema: {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PlaywrightActionGenerator } from "../types";
|
|
2
|
+
export declare const SKILL_USAGE = "skill_usage";
|
|
3
|
+
type Skill = {
|
|
4
|
+
testStep: string;
|
|
5
|
+
filePath: string;
|
|
6
|
+
usageExample: string;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
declare class TestCaseSkills {
|
|
10
|
+
private skills;
|
|
11
|
+
constructor(skills: Skill[]);
|
|
12
|
+
getAvailableSkills(): Skill[];
|
|
13
|
+
updateSkills(skills: Skill[]): void;
|
|
14
|
+
}
|
|
15
|
+
export declare const testCaseSkills: TestCaseSkills;
|
|
16
|
+
export declare const skillActionGenerator: PlaywrightActionGenerator;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/actions/skill.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAGrD,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,cAAM,cAAc;IACN,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,KAAK,EAAE;IAEnC,kBAAkB;IAIlB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE;CAG7B;AAED,eAAO,MAAM,cAAc,gBAAyB,CAAC;AAErD,eAAO,MAAM,oBAAoB,EAAE,yBAiFlC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.skillActionGenerator = exports.testCaseSkills = exports.SKILL_USAGE = void 0;
|
|
7
|
+
const api_1 = __importDefault(require("tsx/cjs/api"));
|
|
8
|
+
const use_skill_1 = require("../agent/codegen/use-skill");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
exports.SKILL_USAGE = "skill_usage";
|
|
11
|
+
class TestCaseSkills {
|
|
12
|
+
skills;
|
|
13
|
+
constructor(skills) {
|
|
14
|
+
this.skills = skills;
|
|
15
|
+
}
|
|
16
|
+
getAvailableSkills() {
|
|
17
|
+
return this.skills;
|
|
18
|
+
}
|
|
19
|
+
updateSkills(skills) {
|
|
20
|
+
this.skills = skills;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.testCaseSkills = new TestCaseSkills([]);
|
|
24
|
+
const skillActionGenerator = (page, options) => {
|
|
25
|
+
const availableSkills = exports.testCaseSkills.getAvailableSkills();
|
|
26
|
+
return {
|
|
27
|
+
execute: async ({ args, trace }) => {
|
|
28
|
+
const skill = args.skill;
|
|
29
|
+
const [skillDetails] = availableSkills.filter((skillDetails) => skillDetails.testStep === skill);
|
|
30
|
+
if (!skillDetails) {
|
|
31
|
+
throw new Error(`No skill found for skill: ${skill}`);
|
|
32
|
+
}
|
|
33
|
+
const skillFilePath = skillDetails.filePath;
|
|
34
|
+
const [lastDir] = process.cwd().split("/").reverse();
|
|
35
|
+
const dir = `${process.cwd()}/${lastDir}`;
|
|
36
|
+
const module = await api_1.default.require(`./${skillFilePath}`, dir);
|
|
37
|
+
const imports = Object.keys(module);
|
|
38
|
+
const code = await (0, use_skill_1.generateSkillUsageCode)({
|
|
39
|
+
task: skillDetails.testStep,
|
|
40
|
+
sampleUsageMethod: skillDetails.usageExample,
|
|
41
|
+
scopeVariablesMapStr: JSON.stringify(options.stateVariables || {}),
|
|
42
|
+
pageVariableName: (0, utils_1.getPageVarName)(),
|
|
43
|
+
trace,
|
|
44
|
+
});
|
|
45
|
+
console.log("Usage code generated", code);
|
|
46
|
+
const exec = new Function((0, utils_1.getPageVarName)(), ...imports,
|
|
47
|
+
// assuming all POMs are async methods
|
|
48
|
+
`
|
|
49
|
+
return (async () => {
|
|
50
|
+
return ${code}
|
|
51
|
+
})()`);
|
|
52
|
+
await exec(page, ...imports.map((i) => module[i]));
|
|
53
|
+
return {
|
|
54
|
+
locator: code,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
template: (args, options) => {
|
|
58
|
+
// TODO: support for import statement
|
|
59
|
+
const code = `${options.locator}`;
|
|
60
|
+
const skill = args.skill;
|
|
61
|
+
const [skillDetails] = availableSkills.filter((skillDetails) => skillDetails.testStep === skill);
|
|
62
|
+
return {
|
|
63
|
+
code,
|
|
64
|
+
importPath: skillDetails?.filePath,
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
name: exports.SKILL_USAGE,
|
|
68
|
+
schema: {
|
|
69
|
+
type: "function",
|
|
70
|
+
function: {
|
|
71
|
+
name: exports.SKILL_USAGE,
|
|
72
|
+
description: "Ability to use already defined skills in the form of page object models to execute a particular task.",
|
|
73
|
+
parameters: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
skill: {
|
|
77
|
+
type: "string",
|
|
78
|
+
enum: availableSkills.map((skill) => skill.testStep),
|
|
79
|
+
description: `skill to use. Choose one of the available skills: ${availableSkills
|
|
80
|
+
.map((skill) => skill.testStep)
|
|
81
|
+
.join(", ")}`,
|
|
82
|
+
},
|
|
83
|
+
reason: {
|
|
84
|
+
type: "string",
|
|
85
|
+
description: "explain how this action will help to complete the task. the reason should align with the task provided",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
required: ["skill", "reason"],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
exports.skillActionGenerator = skillActionGenerator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-content.d.ts","sourceRoot":"","sources":["../../src/actions/text-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,eAAO,MAAM,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"text-content.d.ts","sourceRoot":"","sources":["../../src/actions/text-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAIrD,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,eAAO,MAAM,0BAA0B,EAAE,yBA6DxC,CAAC"}
|
|
@@ -19,8 +19,10 @@ const textContentActionGenerator = (page, options) => {
|
|
|
19
19
|
};
|
|
20
20
|
},
|
|
21
21
|
template: (args, options) => {
|
|
22
|
-
const
|
|
23
|
-
return
|
|
22
|
+
const code = `const ${args.variable_name} = await ${(0, utils_1.getPageVarName)()}.${options.locator}.textContent();`;
|
|
23
|
+
return {
|
|
24
|
+
code,
|
|
25
|
+
};
|
|
24
26
|
},
|
|
25
27
|
name: exports.PLAYWRIGHT_GOTO_ACTION_NAME,
|
|
26
28
|
schema: {
|
|
@@ -1,10 +1,20 @@
|
|
|
1
|
+
import { LLM, TraceClient } from "@empiricalrun/llm";
|
|
1
2
|
import { Page } from "playwright";
|
|
3
|
+
import { PlaywrightActions } from "../../actions";
|
|
4
|
+
import { CustomLogger } from "../../bin/logger";
|
|
2
5
|
import { TestGenConfigOptions } from "../../types";
|
|
3
|
-
type BrowsingAgentOptions = Partial<TestGenConfigOptions> & {
|
|
6
|
+
export type BrowsingAgentOptions = Partial<TestGenConfigOptions> & {
|
|
4
7
|
htmlSanitize?: {
|
|
5
8
|
disallowedStrings?: string[];
|
|
6
9
|
};
|
|
7
10
|
};
|
|
8
|
-
export declare function
|
|
9
|
-
|
|
11
|
+
export declare function executeTaskUsingBrowsingAgent({ trace, action, logger, page, options, llm, actions, }: {
|
|
12
|
+
action: string;
|
|
13
|
+
trace: TraceClient;
|
|
14
|
+
logger: CustomLogger;
|
|
15
|
+
page: Page;
|
|
16
|
+
options: BrowsingAgentOptions;
|
|
17
|
+
llm: LLM;
|
|
18
|
+
actions: PlaywrightActions;
|
|
19
|
+
}): Promise<void>;
|
|
10
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG;IACjE,YAAY,CAAC,EAAE;QACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,EAClD,KAAK,EACL,MAAM,EACN,MAAM,EACN,IAAI,EACJ,OAAO,EACP,GAAG,EACH,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,oBAAoB,CAAC;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,iBAAiB,CAAC;CAC5B,iBA2IA"}
|