@empiricalrun/test-gen 0.31.12 → 0.31.14

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @empiricalrun/test-gen
2
2
 
3
+ ## 0.31.14
4
+
5
+ ### Patch Changes
6
+
7
+ - 89226da: fix: xpath leading to root element
8
+
9
+ ## 0.31.13
10
+
11
+ ### Patch Changes
12
+
13
+ - 759bfc0: fix: accuracy of element selector
14
+
3
15
  ## 0.31.12
4
16
 
5
17
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"next-task.d.ts","sourceRoot":"","sources":["../../src/actions/next-task.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;CA0B1B,CAAC"}
1
+ {"version":3,"file":"next-task.d.ts","sourceRoot":"","sources":["../../src/actions/next-task.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;CA2B1B,CAAC"}
@@ -15,7 +15,8 @@ exports.NextTaskAction = {
15
15
  action: {
16
16
  type: "string",
17
17
  description: `explain the next action in natural language.
18
- The next action should be as atomic as possible. E.g. each click, key press, input should be a separate action.
18
+ The next action should be as atomic as possible, precise and should contain enough details about the action to be performed.
19
+ E.g. each click, key press, input, assert should be a separate action.
19
20
  Each action should take the task to completion, if not the action is invalid.`,
20
21
  },
21
22
  reason: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,GAAG,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC;KACb;CACF;AAED,wBAAsB,oCAAoC,CACxD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,gBA6CX;AAED,wBAAgB,cAAc,WAG7B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,GAAG,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC;KACb;CACF;AAED,wBAAsB,oCAAoC,CACxD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,gBAmEX;AAED,wBAAgB,cAAc,WAG7B"}
@@ -8,16 +8,38 @@ async function getPlaywrightLocatorUsingCssSelector(cssSelector, xpath, page) {
8
8
  .replaceAll(":has-text", ":contains")
9
9
  .replaceAll(":text", ":contains");
10
10
  return await page.evaluate((locator) => {
11
- // @ts-ignore
12
- function getElementByXpath(path) {
13
- return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
14
- }
15
11
  let selectedElem;
16
- try {
17
- selectedElem = getElementByXpath(locator.xpath);
18
- }
19
- catch (e) {
20
- // ignore error
12
+ if (locator.xpath) {
13
+ try {
14
+ const xpath = locator.xpath.replaceAll("text()", "normalize-space()");
15
+ const result = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
16
+ let node = result.iterateNext();
17
+ const elements = [];
18
+ // Store all matched elements
19
+ while (node) {
20
+ elements.push(node);
21
+ node = result.iterateNext();
22
+ }
23
+ // Find the least deep nesting (i.e., with the fewest child elements)
24
+ let minChildCount = Infinity;
25
+ const leastNestedElements = [];
26
+ elements.forEach((el) => {
27
+ //@ts-ignore
28
+ const childCount = el.children.length; // Count direct child elements
29
+ if (childCount < minChildCount) {
30
+ minChildCount = childCount;
31
+ leastNestedElements.length = 0;
32
+ leastNestedElements.push(el);
33
+ }
34
+ else if (childCount === minChildCount) {
35
+ leastNestedElements.push(el);
36
+ }
37
+ });
38
+ selectedElem = leastNestedElements[0];
39
+ }
40
+ catch (e) {
41
+ // ignore error
42
+ }
21
43
  }
22
44
  if (!selectedElem) {
23
45
  const elements = window.jQuery(locator.cssForJq);
@@ -31,7 +53,7 @@ async function getPlaywrightLocatorUsingCssSelector(cssSelector, xpath, page) {
31
53
  selectedElem = elements[elIdx];
32
54
  }
33
55
  else {
34
- console.log("using xpath for locator");
56
+ console.log("using xpath locator");
35
57
  }
36
58
  if (!selectedElem) {
37
59
  throw Error(`Unable to find element, css: ${locator.css}`);
@@ -1 +1 @@
1
- {"version":3,"file":"o1-completion.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/o1-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAKpC,wBAAsB,eAAe,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAyD7C"}
1
+ {"version":3,"file":"o1-completion.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/o1-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAKpC,wBAAsB,eAAe,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA0D7C"}
@@ -31,6 +31,7 @@ async function getO1Completion({ messages, tools, trace, }) {
31
31
  Before responding, ensure the following:
32
32
  - Do not respond with markdown, respond only with the JSON object.
33
33
  - Do not respond with any backticks.
34
+ - The reason for action should also include what was been executed in the action.
34
35
  `;
35
36
  const response = (await llm.createChatCompletion({
36
37
  messages: [userInstruction],
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,GAAG,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AASlC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1D,wBAAsB,aAAa,CAAC,EAClC,IAAI,EACJ,eAAe,EACf,IAAI,EACJ,KAAK,EACL,GAAG,EACH,OAAO,EACP,cAAc,GACf,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,oBAAoB,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,2FA+CA;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,gBAsC9B"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,GAAG,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQlC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1D,wBAAsB,aAAa,CAAC,EAClC,IAAI,EACJ,eAAe,EACf,IAAI,EACJ,KAAK,EACL,GAAG,EACH,OAAO,EACP,cAAc,GACf,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,oBAAoB,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,2FA+CA;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,gBAsC9B"}
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.masterAgent = exports.getNextAction = void 0;
4
4
  const llm_1 = require("@empiricalrun/llm");
5
5
  const vision_1 = require("@empiricalrun/llm/vision");
6
- const done_1 = require("../../actions/done");
7
6
  const next_task_1 = require("../../actions/next-task");
8
7
  const constants_1 = require("../../constants");
9
8
  const reporter_1 = require("../../reporter");
@@ -33,7 +32,7 @@ async function getNextAction({ task, executedActions, page, trace, llm, options,
33
32
  systemMessage,
34
33
  userMessage,
35
34
  ];
36
- const tools = [next_task_1.NextTaskAction.schema, (0, done_1.doneActionGenerator)(page).schema];
35
+ const tools = [next_task_1.NextTaskAction.schema];
37
36
  promptSpan?.end({ output: { messages } });
38
37
  const completion = await llm.createChatCompletion({
39
38
  messages,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-gen",
3
- "version": "0.31.12",
3
+ "version": "0.31.14",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -45,8 +45,8 @@
45
45
  "tsx": "^4.16.2",
46
46
  "typescript": "^5.3.3",
47
47
  "@empiricalrun/llm": "^0.9.3",
48
- "@empiricalrun/r2-uploader": "^0.3.3",
49
- "@empiricalrun/reporter": "^0.20.2"
48
+ "@empiricalrun/reporter": "^0.20.2",
49
+ "@empiricalrun/r2-uploader": "^0.3.3"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/detect-port": "^1.3.5",