@empiricalrun/test-gen 0.61.0 → 0.62.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 (83) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/agent/browsing/run.d.ts +2 -0
  3. package/dist/agent/browsing/run.d.ts.map +1 -1
  4. package/dist/agent/browsing/run.js +11 -8
  5. package/dist/agent/browsing/utils.d.ts.map +1 -1
  6. package/dist/agent/browsing/utils.js +1 -1
  7. package/dist/agent/chat/agent-loop.js +2 -3
  8. package/dist/agent/chat/exports.d.ts +2 -2
  9. package/dist/agent/chat/exports.d.ts.map +1 -1
  10. package/dist/agent/chat/exports.js +1 -1
  11. package/dist/agent/chat/index.d.ts.map +1 -1
  12. package/dist/agent/chat/index.js +16 -2
  13. package/dist/agent/chat/models.d.ts +1 -3
  14. package/dist/agent/chat/models.d.ts.map +1 -1
  15. package/dist/agent/chat/models.js +4 -25
  16. package/dist/agent/cua/computer.d.ts +6 -6
  17. package/dist/agent/cua/computer.d.ts.map +1 -1
  18. package/dist/agent/cua/computer.js +38 -83
  19. package/dist/agent/cua/index.d.ts +2 -1
  20. package/dist/agent/cua/index.d.ts.map +1 -1
  21. package/dist/agent/cua/index.js +26 -33
  22. package/dist/agent/cua/pw-codegen/element-from-point.d.ts +8 -0
  23. package/dist/agent/cua/pw-codegen/element-from-point.d.ts.map +1 -0
  24. package/dist/agent/cua/pw-codegen/element-from-point.js +118 -0
  25. package/dist/agent/cua/pw-codegen/pw-pause/index.d.ts +15 -0
  26. package/dist/agent/cua/pw-codegen/pw-pause/index.d.ts.map +1 -0
  27. package/dist/agent/cua/pw-codegen/pw-pause/index.js +84 -0
  28. package/dist/agent/cua/pw-codegen/pw-pause/utils.d.ts +16 -0
  29. package/dist/agent/cua/pw-codegen/pw-pause/utils.d.ts.map +1 -0
  30. package/dist/agent/cua/pw-codegen/pw-pause/utils.js +98 -0
  31. package/dist/agent/cua/pw-codegen/types.d.ts +46 -0
  32. package/dist/agent/cua/pw-codegen/types.d.ts.map +1 -0
  33. package/dist/agent/cua/pw-codegen/types.js +2 -0
  34. package/dist/agent/master/browser-tests/cua.spec.js +13 -1
  35. package/dist/artifacts/index.d.ts +43 -0
  36. package/dist/artifacts/index.d.ts.map +1 -0
  37. package/dist/artifacts/index.js +209 -0
  38. package/dist/bin/index.js +7 -11
  39. package/dist/bin/utils/index.d.ts +5 -3
  40. package/dist/bin/utils/index.d.ts.map +1 -1
  41. package/dist/bin/utils/index.js +13 -0
  42. package/dist/bin/utils/platform/web/index.d.ts +1 -1
  43. package/dist/bin/utils/platform/web/index.d.ts.map +1 -1
  44. package/dist/bin/utils/platform/web/index.js +3 -2
  45. package/dist/bin/utils/scenarios/index.d.ts +3 -3
  46. package/dist/file/client.d.ts +2 -0
  47. package/dist/file/client.d.ts.map +1 -1
  48. package/dist/file/client.js +16 -0
  49. package/dist/file/server.d.ts +3 -1
  50. package/dist/file/server.d.ts.map +1 -1
  51. package/dist/file/server.js +27 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +4 -1
  54. package/dist/test-build/index.d.ts +6 -2
  55. package/dist/test-build/index.d.ts.map +1 -1
  56. package/dist/test-build/index.js +9 -7
  57. package/dist/tool-call-service/index.d.ts +14 -7
  58. package/dist/tool-call-service/index.d.ts.map +1 -1
  59. package/dist/tool-call-service/index.js +19 -8
  60. package/dist/tools/download-build.d.ts.map +1 -1
  61. package/dist/tools/download-build.js +3 -3
  62. package/dist/tools/grep/index.d.ts.map +1 -1
  63. package/dist/tools/grep/index.js +4 -2
  64. package/dist/tools/str_replace_editor.d.ts.map +1 -1
  65. package/dist/tools/str_replace_editor.js +10 -3
  66. package/dist/tools/test-gen-browser.d.ts.map +1 -1
  67. package/dist/tools/test-gen-browser.js +21 -4
  68. package/dist/tools/test-run.d.ts.map +1 -1
  69. package/dist/tools/test-run.js +11 -8
  70. package/dist/tools/utils/index.d.ts +13 -0
  71. package/dist/tools/utils/index.d.ts.map +1 -1
  72. package/dist/tools/utils/index.js +47 -0
  73. package/dist/utils/exec.d.ts +2 -0
  74. package/dist/utils/exec.d.ts.map +1 -1
  75. package/dist/utils/exec.js +4 -1
  76. package/dist/utils/slug.d.ts +16 -0
  77. package/dist/utils/slug.d.ts.map +1 -1
  78. package/dist/utils/slug.js +27 -1
  79. package/package.json +6 -4
  80. package/tsconfig.tsbuildinfo +1 -1
  81. package/dist/utils/pw-test.d.ts +0 -2
  82. package/dist/utils/pw-test.d.ts.map +0 -1
  83. package/dist/utils/pw-test.js +0 -13
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ToolCallService = void 0;
4
4
  const chat_1 = require("@empiricalrun/llm/chat");
5
+ const artifacts_1 = require("../artifacts");
5
6
  const commit_and_create_pr_1 = require("../tools/commit-and-create-pr");
6
7
  const diagnosis_fetcher_1 = require("../tools/diagnosis-fetcher");
7
8
  const download_build_1 = require("../tools/download-build");
@@ -19,10 +20,16 @@ class ToolCallService {
19
20
  chatSessionId;
20
21
  selectedModel;
21
22
  branchName;
22
- constructor(chatSessionId, selectedModel, branchName) {
23
+ repoPath;
24
+ apiKey;
25
+ trace;
26
+ constructor({ chatSessionId, selectedModel, branchName, repoPath, apiKey, trace, }) {
23
27
  this.chatSessionId = chatSessionId;
24
28
  this.selectedModel = selectedModel;
25
29
  this.branchName = branchName;
30
+ this.trace = trace;
31
+ this.repoPath = repoPath;
32
+ this.apiKey = apiKey;
26
33
  this.tools = [
27
34
  grep_1.grepTool,
28
35
  test_run_1.runTestTool,
@@ -33,8 +40,6 @@ class ToolCallService {
33
40
  environment_crud_1.getEnvironmentTool,
34
41
  download_build_1.downloadBuildTool,
35
42
  ];
36
- }
37
- async getTools() {
38
43
  if ((0, chat_1.getProviderForModel)(this.selectedModel) !== "claude") {
39
44
  this.tools.push(...str_replace_editor_1.textEditorTools);
40
45
  }
@@ -42,9 +47,13 @@ class ToolCallService {
42
47
  this.toolExecutors[tool.schema.name] = tool.execute;
43
48
  });
44
49
  if ((0, chat_1.getProviderForModel)(this.selectedModel) === "claude") {
45
- this.toolExecutors["str_replace_editor"] = str_replace_editor_1.strReplaceEditorExecutor;
50
+ this.toolExecutors = {
51
+ ...this.toolExecutors,
52
+ // Support for Claude 3x and 4: They use different tool names
53
+ str_replace_editor: str_replace_editor_1.strReplaceEditorExecutor,
54
+ str_replace_based_edit_tool: str_replace_editor_1.strReplaceEditorExecutor,
55
+ };
46
56
  }
47
- return { tools: this.tools };
48
57
  }
49
58
  async sendToQueue(toolCalls) {
50
59
  const requestId = toolCalls[0]?.id;
@@ -59,8 +68,8 @@ class ToolCallService {
59
68
  branchName: this.branchName,
60
69
  });
61
70
  }
62
- async execute(toolCalls, trace) {
63
- const executeSpan = trace?.span({
71
+ async execute(toolCalls) {
72
+ const executeSpan = this.trace?.span({
64
73
  name: "execute_tools",
65
74
  input: { toolCalls: toolCalls.map((tc) => ({ name: tc.name })) },
66
75
  });
@@ -75,13 +84,14 @@ class ToolCallService {
75
84
  const errorResult = {
76
85
  isError: true,
77
86
  result: `Invalid function/tool call: ${toolCall.name} not found`,
87
+ artifacts: null,
78
88
  };
79
89
  toolResults.push(errorResult);
80
90
  span?.end({ output: errorResult });
81
91
  continue;
82
92
  }
83
93
  try {
84
- const result = await toolExecutor(toolCall.input, trace);
94
+ const result = await toolExecutor(toolCall.input, this.repoPath, this.apiKey, this.trace, artifacts_1.collectArtifacts);
85
95
  toolResults.push(result);
86
96
  span?.end({ output: result });
87
97
  }
@@ -89,6 +99,7 @@ class ToolCallService {
89
99
  const errorResult = {
90
100
  isError: true,
91
101
  result: error instanceof Error ? error.message : String(error),
102
+ artifacts: null,
92
103
  };
93
104
  toolResults.push(errorResult);
94
105
  span?.end({ output: errorResult });
@@ -1 +1 @@
1
- {"version":3,"file":"download-build.d.ts","sourceRoot":"","sources":["../../src/tools/download-build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,uBAAuB;;;;;;EAElC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE7E,eAAO,MAAM,iBAAiB,EAAE,IA8B/B,CAAC"}
1
+ {"version":3,"file":"download-build.d.ts","sourceRoot":"","sources":["../../src/tools/download-build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,uBAAuB;;;;;;EAElC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE7E,eAAO,MAAM,iBAAiB,EAAE,IAkC/B,CAAC"}
@@ -14,8 +14,8 @@ have a build URL, you can try getting the environment details with the getEnviro
14
14
  Environment details will include the build URL.`,
15
15
  parameters: exports.downloadBuildToolSchema,
16
16
  },
17
- execute: async (input) => {
18
- if (!(await (0, test_build_1.hasDownloadScript)())) {
17
+ execute: async (input, repoPath, apiKey) => {
18
+ if (!(await (0, test_build_1.hasDownloadScript)(repoPath))) {
19
19
  return {
20
20
  isError: true,
21
21
  result: `This repo does not have a download script in package.json.
@@ -24,7 +24,7 @@ You probably don't need to worry about this, since it means this repo does not h
24
24
  }
25
25
  const { buildUrl } = input;
26
26
  try {
27
- await (0, test_build_1.downloadBuild)(buildUrl);
27
+ await (0, test_build_1.downloadBuild)({ buildUrl, repoPath, apiKey });
28
28
  return {
29
29
  isError: false,
30
30
  result: "Build downloaded successfully",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/grep/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,wBAAwB,CAAC;AAyH/D,eAAO,MAAM,QAAQ,EAAE,IAmBtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/grep/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,wBAAwB,CAAC;AA2H/D,eAAO,MAAM,QAAQ,EAAE,IAmBtB,CAAC"}
@@ -74,8 +74,10 @@ async function usingSystemGrep(input) {
74
74
  async function usingRipgrep(input) {
75
75
  try {
76
76
  const dir = path_1.default.join(process.cwd(), input.directory || "");
77
- const escapedPattern = input.pattern.replace(/\s+/g, "\\ ");
78
- const results = await (0, ripgrep_1.ripgrep)(dir, {
77
+ const escapedPattern = input.pattern
78
+ .replace(/\s+/g, "\\ ")
79
+ .replace(/([[\]()])/g, "\\$1");
80
+ const results = (0, ripgrep_1.ripgrep)(dir, {
79
81
  string: escapedPattern,
80
82
  globs: input.filePattern ? [input.filePattern] : undefined,
81
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"str_replace_editor.d.ts","sourceRoot":"","sources":["../../src/tools/str_replace_editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AA2B1D,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwC1D;AAMD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,UAAU,CAAC,CAuMrB;AAiGD,eAAO,MAAM,eAAe,EAAE,IAAI,EAKjC,CAAC"}
1
+ {"version":3,"file":"str_replace_editor.d.ts","sourceRoot":"","sources":["../../src/tools/str_replace_editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AA2B1D,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwC1D;AAMD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,UAAU,CAAC,CAiNrB;AAiGD,eAAO,MAAM,eAAe,EAAE,IAAI,EAKjC,CAAC"}
@@ -140,6 +140,7 @@ function escapeRegExp(text) {
140
140
  * https://docs.anthropic.com/en/docs/build-with-claude/tool-use/text-editor-tool
141
141
  */
142
142
  async function strReplaceEditorExecutor(input) {
143
+ const repoDir = process.cwd();
143
144
  const { path: filePath } = input;
144
145
  try {
145
146
  let content;
@@ -194,13 +195,19 @@ async function strReplaceEditorExecutor(input) {
194
195
  if (input.file_text === undefined || input.file_text === null) {
195
196
  throw new Error("file_text is required for create command");
196
197
  }
198
+ if (filePath.endsWith("test.ts")) {
199
+ throw new Error("Creating test.ts files is not allowed. Did you mean spec.ts?");
200
+ }
201
+ if (filePath.endsWith("spec.ts") && !filePath.startsWith("tests/")) {
202
+ throw new Error("Creating spec.ts files is not allowed outside tests/ directory");
203
+ }
197
204
  const parentDir = path_1.default.dirname(filePath);
198
205
  if (parentDir !== "." && !fs_1.default.existsSync(parentDir)) {
199
206
  // Ensure parent directory exists
200
207
  fs_1.default.mkdirSync(parentDir, { recursive: true });
201
208
  }
202
209
  fs_1.default.writeFileSync(filePath, input.file_text);
203
- let createTypescriptResult = await (0, web_1.runTypescriptCompiler)();
210
+ let createTypescriptResult = await (0, web_1.runTypescriptCompiler)(repoDir);
204
211
  if (!createTypescriptResult.success) {
205
212
  return {
206
213
  result: `File ${filePath} has been created. However, type checks are failing with errors:\n${createTypescriptResult.errors.join("\n")}`,
@@ -253,7 +260,7 @@ async function strReplaceEditorExecutor(input) {
253
260
  }
254
261
  newContent = normalizedContent.replace(normalizedOldStr, input.new_str);
255
262
  fs_1.default.writeFileSync(filePath, newContent);
256
- let strReplaceTypescriptResult = await (0, web_1.runTypescriptCompiler)();
263
+ let strReplaceTypescriptResult = await (0, web_1.runTypescriptCompiler)(repoDir);
257
264
  if (!strReplaceTypescriptResult.success) {
258
265
  return {
259
266
  result: `Edits to file ${filePath} have been applied. However, type checks are failing with errors:\n${strReplaceTypescriptResult.errors.join("\n")}`,
@@ -282,7 +289,7 @@ async function strReplaceEditorExecutor(input) {
282
289
  }
283
290
  lines.splice(input.insert_line - 1, 0, input.new_str);
284
291
  fs_1.default.writeFileSync(filePath, lines.join("\n"));
285
- let insertTypescriptResult = await (0, web_1.runTypescriptCompiler)();
292
+ let insertTypescriptResult = await (0, web_1.runTypescriptCompiler)(repoDir);
286
293
  if (!insertTypescriptResult.success) {
287
294
  return {
288
295
  result: `Insertion in file ${filePath} was applied. However, type checks are failing with errors:\n${insertTypescriptResult.errors.join("\n")}`,
@@ -1 +1 @@
1
- {"version":3,"file":"test-gen-browser.d.ts","sourceRoot":"","sources":["../../src/tools/test-gen-browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAsFnD,eAAO,MAAM,4BAA4B,EAAE,IAqF1C,CAAC"}
1
+ {"version":3,"file":"test-gen-browser.d.ts","sourceRoot":"","sources":["../../src/tools/test-gen-browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AA4FnD,eAAO,MAAM,4BAA4B,EAAE,IAoH1C,CAAC"}
@@ -9,8 +9,10 @@ const promises_1 = __importDefault(require("fs/promises"));
9
9
  const zod_1 = require("zod");
10
10
  const run_1 = require("../agent/browsing/run");
11
11
  const utils_1 = require("../agent/browsing/utils");
12
+ const pw_pause_1 = require("../agent/cua/pw-codegen/pw-pause");
12
13
  const web_1 = require("../bin/utils/platform/web");
13
14
  const scenarios_1 = require("../bin/utils/scenarios");
15
+ const slug_1 = require("../utils/slug");
14
16
  const BrowserAgentSchema = zod_1.z.object({
15
17
  testName: zod_1.z.string().describe("The name of the test to create or modify"),
16
18
  testSuites: zod_1.z
@@ -87,8 +89,8 @@ exports.generateTestWithBrowserAgent = {
87
89
  description: BROWSER_AGENT_DESCRIPTION,
88
90
  parameters: BrowserAgentSchema,
89
91
  },
90
- execute: async (input, trace) => {
91
- const repoDir = process.cwd();
92
+ execute: async (input, repoPath, apiKey, trace, collectArtifacts) => {
93
+ const repoDir = repoPath;
92
94
  const { testName, testSuites, fileName, changeToMake, project } = input;
93
95
  try {
94
96
  const { projects } = await (0, test_run_1.getAllPlaywrightProjects)(repoDir);
@@ -113,6 +115,7 @@ exports.generateTestWithBrowserAgent = {
113
115
  result: `Test block not found for test name: "${testName}" in file: "${fileName}" with describe blocks: "${testSuites.join(", ")}"`,
114
116
  };
115
117
  }
118
+ // Prepare the file for the browser agent
116
119
  const fileBackup = await promises_1.default.readFile(fileName, "utf-8");
117
120
  try {
118
121
  await (0, utils_1.replaceTodoWithCreateTest)(fileName);
@@ -125,6 +128,14 @@ exports.generateTestWithBrowserAgent = {
125
128
  result: `Error running tool: ${error}`,
126
129
  };
127
130
  }
131
+ try {
132
+ // Prepare playwright for codegen
133
+ console.log("[generateTestWithBrowserAgent] Preparing playwright for codegen");
134
+ await (0, pw_pause_1.preparePlaywrightForCodegen)(repoDir);
135
+ }
136
+ catch (err) {
137
+ console.warn("[generateTestWithBrowserAgent] Error preparing playwright for codegen", err);
138
+ }
128
139
  const testGenToken = (0, scenarios_1.buildTokenFromOptions)({ name: testName, file: fileName, prompt: changeToMake }, { useComputerUseAgent: true });
129
140
  console.log("[generateTestWithBrowserAgent] Validations passed, starting agent");
130
141
  const toolResult = await (0, run_1.generateTestsUsingMasterAgent)({
@@ -138,9 +149,14 @@ exports.generateTestWithBrowserAgent = {
138
149
  repoDir,
139
150
  editFileWithGeneratedCode: false,
140
151
  });
141
- // Undo the TODO -> createTest changes
152
+ // Cleanup: Undo the TODO -> createTest changes
153
+ await (0, pw_pause_1.revertToOriginalPwCode)(repoDir);
142
154
  await promises_1.default.writeFile(fileName, fileBackup, "utf-8");
143
- const { isError, error, actionsSummary } = toolResult;
155
+ const { isError, error, actionsSummary, artifacts } = toolResult;
156
+ let collectedArtifacts;
157
+ if (artifacts) {
158
+ collectedArtifacts = await collectArtifacts?.(artifacts, repoDir, (0, slug_1.slugify)(testName));
159
+ }
144
160
  if (!isError) {
145
161
  return {
146
162
  isError,
@@ -149,6 +165,7 @@ and the generated Playwright code:
149
165
 
150
166
  ${actionsSummary}
151
167
  `,
168
+ artifacts: collectedArtifacts,
152
169
  };
153
170
  }
154
171
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"test-run.d.ts","sourceRoot":"","sources":["../../src/tools/test-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAgDnD,eAAO,MAAM,WAAW,EAAE,IAiDzB,CAAC"}
1
+ {"version":3,"file":"test-run.d.ts","sourceRoot":"","sources":["../../src/tools/test-run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,wBAAwB,CAAC;AA4C/D,eAAO,MAAM,WAAW,EAAE,IAsEzB,CAAC"}
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runTestTool = void 0;
4
4
  const test_run_1 = require("@empiricalrun/test-run");
5
5
  const zod_1 = require("zod");
6
+ const artifacts_1 = require("../artifacts");
7
+ const utils_1 = require("./utils");
6
8
  const RunTestSchema = zod_1.z.object({
7
9
  testName: zod_1.z.string().describe("The name of the test to run"),
8
10
  suites: zod_1.z
@@ -13,11 +15,6 @@ const RunTestSchema = zod_1.z.object({
13
15
  .describe("The name of the file where the test is located. File name must end with .spec.ts"),
14
16
  project: zod_1.z.string().describe("The project to run the test on"),
15
17
  });
16
- function hasCloudflareCredentials() {
17
- return (process.env.R2_ACCOUNT_ID &&
18
- process.env.R2_ACCESS_KEY_ID &&
19
- process.env.R2_SECRET_ACCESS_KEY);
20
- }
21
18
  function buildReportUrl(projectName, testRunId) {
22
19
  return `https://reports.empirical.run/${projectName}/${testRunId}/index.html`;
23
20
  }
@@ -37,10 +34,10 @@ exports.runTestTool = {
37
34
  description: "Run a test",
38
35
  parameters: RunTestSchema,
39
36
  },
40
- execute: async (input) => {
37
+ execute: async (input, repoPath, apiKey, trace, collectArtifacts) => {
41
38
  let reportUrl = undefined;
42
39
  let envOverrides = undefined;
43
- if (hasCloudflareCredentials()) {
40
+ if ((0, artifacts_1.isArtifactCollectionEnabled)()) {
44
41
  const projectName = "test-gen-chat-agent";
45
42
  const testRunId = Date.now().toString();
46
43
  reportUrl = buildReportUrl(projectName, testRunId);
@@ -53,6 +50,7 @@ exports.runTestTool = {
53
50
  console.warn("R2 credentials not found: report artifacts will not be uploaded");
54
51
  }
55
52
  const { testName, suites, fileName, project } = input;
53
+ const repoDir = process.cwd();
56
54
  try {
57
55
  const result = await (0, test_run_1.runSingleTest)({
58
56
  testName,
@@ -60,20 +58,25 @@ exports.runTestTool = {
60
58
  fileName,
61
59
  projects: [project],
62
60
  envOverrides,
61
+ repoDir,
63
62
  });
63
+ const attachments = (0, utils_1.extractAttachmentsFromPlaywrightJSONReport)(result.summaryJson);
64
+ const artifacts = await collectArtifacts?.(attachments, repoDir, Date.now().toString());
64
65
  return {
66
+ isError: false,
65
67
  result: buildResult({
66
68
  hasTestPassed: result.hasTestPassed,
67
69
  summaryJson: result.summaryJson,
68
70
  reportUrl: reportUrl,
69
71
  }),
70
- isError: false,
72
+ artifacts,
71
73
  };
72
74
  }
73
75
  catch (error) {
74
76
  // Ensure we capture the full error message regardless of error type
75
77
  const errorMessage = error instanceof Error ? error.message : String(error);
76
78
  return {
79
+ artifacts: null,
77
80
  result: JSON.stringify({ error: errorMessage }),
78
81
  isError: true,
79
82
  };
@@ -1,3 +1,4 @@
1
+ import { JSONReport as PlaywrightJSONReport } from "@playwright/test/reporter";
1
2
  export declare function makeDashboardRequest<T>({ path, method, body, }: {
2
3
  path: string;
3
4
  method?: string;
@@ -8,4 +9,16 @@ export declare function callGitHubProxy({ method, url, body, }: {
8
9
  url: string;
9
10
  body?: any;
10
11
  }): Promise<unknown>;
12
+ type AttachmentInfo = {
13
+ name: string;
14
+ path: string;
15
+ contentType: string;
16
+ };
17
+ /**
18
+ * Extracts attachment information from a Playwright JSON report.
19
+ * @param report The Playwright JSON report to extract attachments from
20
+ * @returns An array of objects containing path and contentType for each attachment
21
+ */
22
+ export declare function extractAttachmentsFromPlaywrightJSONReport(report: PlaywrightJSONReport): AttachmentInfo[];
23
+ export {};
11
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/index.ts"],"names":[],"mappings":"AAAA,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,EAC5C,IAAI,EACJ,MAAc,EACd,IAAI,GACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBb;AAED,wBAAsB,eAAe,CAAC,EACpC,MAAM,EACN,GAAG,EACH,IAAI,GACL,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,oBAWA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,IAAI,oBAAoB,EAEnC,MAAM,2BAA2B,CAAC;AAEnC,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,EAC5C,IAAI,EACJ,MAAc,EACd,IAAI,GACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBb;AAED,wBAAsB,eAAe,CAAC,EACpC,MAAM,EACN,GAAG,EACH,IAAI,GACL,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,oBAWA;AAED,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,oBAAoB,GAC3B,cAAc,EAAE,CA4ClB"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeDashboardRequest = makeDashboardRequest;
4
4
  exports.callGitHubProxy = callGitHubProxy;
5
+ exports.extractAttachmentsFromPlaywrightJSONReport = extractAttachmentsFromPlaywrightJSONReport;
5
6
  async function makeDashboardRequest({ path, method = "GET", body, }) {
6
7
  const API_KEY = process.env.EMPIRICALRUN_API_KEY;
7
8
  if (!API_KEY) {
@@ -36,3 +37,49 @@ async function callGitHubProxy({ method, url, body, }) {
36
37
  },
37
38
  });
38
39
  }
40
+ /**
41
+ * Extracts attachment information from a Playwright JSON report.
42
+ * @param report The Playwright JSON report to extract attachments from
43
+ * @returns An array of objects containing path and contentType for each attachment
44
+ */
45
+ function extractAttachmentsFromPlaywrightJSONReport(report) {
46
+ const attachments = [];
47
+ if (!report) {
48
+ return attachments;
49
+ }
50
+ function processSpec(spec) {
51
+ const testTitle = spec.title;
52
+ for (const test of spec.tests) {
53
+ for (const result of test.results) {
54
+ if (!result.attachments)
55
+ continue;
56
+ for (const attachment of result.attachments) {
57
+ if (attachment.path && attachment.contentType) {
58
+ attachments.push({
59
+ name: `${testTitle} ${attachment.name}`,
60
+ path: attachment.path,
61
+ contentType: attachment.contentType,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ for (const suite of report.suites) {
69
+ // Process nested suites
70
+ if (suite.suites) {
71
+ for (const nestedSuite of suite.suites) {
72
+ for (const spec of nestedSuite.specs) {
73
+ processSpec(spec);
74
+ }
75
+ }
76
+ }
77
+ // Process specs in current suite
78
+ if (suite.specs) {
79
+ for (const spec of suite.specs) {
80
+ processSpec(spec);
81
+ }
82
+ }
83
+ }
84
+ return attachments;
85
+ }
@@ -2,11 +2,13 @@ export declare class ProcessManager {
2
2
  private childProcess;
3
3
  execute(command: string, args: string[], options: {
4
4
  env?: Record<string, string>;
5
+ cwd?: string;
5
6
  }): Promise<number>;
6
7
  terminate(): void;
7
8
  isRunning(): boolean;
8
9
  }
9
10
  export declare function cmd(command: string, args: string[], options: {
10
11
  env?: Record<string, string>;
12
+ cwd?: string;
11
13
  }): Promise<number>;
12
14
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAmBA,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA6B;IAE3C,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACxC,OAAO,CAAC,MAAM,CAAC;IAmDlB,SAAS,IAAI,IAAI;IASjB,SAAS,IAAI,OAAO;CAGrB;AAED,wBAAsB,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAmBA,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA6B;IAE3C,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EAEd,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACtD,OAAO,CAAC,MAAM,CAAC;IAoDlB,SAAS,IAAI,IAAI;IASjB,SAAS,IAAI,OAAO;CAGrB;AAED,wBAAsB,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -21,7 +21,9 @@ function isAcceptableExit(exitCode, signal) {
21
21
  }
22
22
  class ProcessManager {
23
23
  childProcess = null;
24
- async execute(command, args, options) {
24
+ async execute(command, args,
25
+ // TODO: Make these required when all tools use repoPath
26
+ options) {
25
27
  console.log(`Executing command: ${command} with args: ${args}`);
26
28
  if (this.childProcess) {
27
29
  throw new Error("Process is already running");
@@ -34,6 +36,7 @@ class ProcessManager {
34
36
  }
35
37
  const p = (0, child_process_1.spawn)(command, args, {
36
38
  env: { ...process_1.default.env, ...options.env },
39
+ cwd: options.cwd,
37
40
  detached: true, // Create process group so we can terminate all child processes
38
41
  });
39
42
  this.childProcess = p;
@@ -1,2 +1,18 @@
1
1
  export declare const asyncGenerateRandomSlug: (size: number) => Promise<string>;
2
+ /**
3
+ * Converts a string into a URL-friendly slug by:
4
+ * 1. Converting to lowercase
5
+ * 2. Replacing non-alphanumeric characters with hyphens
6
+ * 3. Collapsing multiple hyphens into single hyphens
7
+ * 4. Removing empty segments
8
+ * 5. Removing leading and trailing hyphens
9
+ *
10
+ * @param str - The input string to convert into a slug
11
+ * @returns A URL-friendly slug string
12
+ * @example
13
+ * slugify("Hello World!") // returns "hello-world"
14
+ * slugify("Test & Case") // returns "test-case"
15
+ * slugify("Multiple---Hyphens") // returns "multiple-hyphens"
16
+ */
17
+ export declare const slugify: (str: string) => string;
2
18
  //# sourceMappingURL=slug.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,oBAOzD,CAAC"}
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,oBAOzD,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,MASrC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asyncGenerateRandomSlug = void 0;
3
+ exports.slugify = exports.asyncGenerateRandomSlug = void 0;
4
4
  // @ts-ignore
5
5
  let customAlphabet;
6
6
  const loadNanoid = async () => {
@@ -16,3 +16,29 @@ const asyncGenerateRandomSlug = async (size) => {
16
16
  return nanoid();
17
17
  };
18
18
  exports.asyncGenerateRandomSlug = asyncGenerateRandomSlug;
19
+ /**
20
+ * Converts a string into a URL-friendly slug by:
21
+ * 1. Converting to lowercase
22
+ * 2. Replacing non-alphanumeric characters with hyphens
23
+ * 3. Collapsing multiple hyphens into single hyphens
24
+ * 4. Removing empty segments
25
+ * 5. Removing leading and trailing hyphens
26
+ *
27
+ * @param str - The input string to convert into a slug
28
+ * @returns A URL-friendly slug string
29
+ * @example
30
+ * slugify("Hello World!") // returns "hello-world"
31
+ * slugify("Test & Case") // returns "test-case"
32
+ * slugify("Multiple---Hyphens") // returns "multiple-hyphens"
33
+ */
34
+ const slugify = (str) => {
35
+ const join = "-";
36
+ return str
37
+ .toLowerCase()
38
+ .replace(/[^a-z0-9-]+/g, join)
39
+ .replace(/-+/g, join)
40
+ .split(join)
41
+ .filter(Boolean)
42
+ .join(join);
43
+ };
44
+ exports.slugify = slugify;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-gen",
3
- "version": "0.61.0",
3
+ "version": "0.62.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -50,6 +50,7 @@
50
50
  "inquirer": "^12.4.2",
51
51
  "istextorbinary": "^9.5.0",
52
52
  "jsdom": "^26.0.0",
53
+ "mime": "3.0.0",
53
54
  "minimatch": "^10.0.1",
54
55
  "nanoid": "^5.0.7",
55
56
  "openai": "4.87.3",
@@ -61,9 +62,9 @@
61
62
  "tsx": "^4.16.2",
62
63
  "typescript": "^5.3.3",
63
64
  "zod": "^3.23.8",
64
- "@empiricalrun/llm": "^0.16.1",
65
+ "@empiricalrun/llm": "^0.17.0",
65
66
  "@empiricalrun/r2-uploader": "^0.3.9",
66
- "@empiricalrun/test-run": "^0.9.2"
67
+ "@empiricalrun/test-run": "^0.9.3"
67
68
  },
68
69
  "devDependencies": {
69
70
  "@playwright/test": "1.47.1",
@@ -72,12 +73,13 @@
72
73
  "@types/express": "^4.17.21",
73
74
  "@types/js-levenshtein": "^1.1.3",
74
75
  "@types/jsdom": "^21.1.7",
76
+ "@types/mime": "3.0.0",
75
77
  "@types/serve-handler": "^6.1.4",
76
78
  "js-levenshtein": "^1.1.6",
77
79
  "playwright": "1.47.1",
78
80
  "serve-handler": "^6.1.6",
79
81
  "ts-patch": "^3.3.0",
80
- "@empiricalrun/shared-types": "0.2.0"
82
+ "@empiricalrun/shared-types": "0.3.0"
81
83
  },
82
84
  "scripts": {
83
85
  "dev": "tspc --build --watch",
@@ -1 +1 @@
1
- {"root":["./src/index.ts","./src/actions/assert.ts","./src/actions/click.ts","./src/actions/done.ts","./src/actions/fill.ts","./src/actions/goto.ts","./src/actions/hover.ts","./src/actions/index.ts","./src/actions/next-task.ts","./src/actions/press.ts","./src/actions/skill.ts","./src/actions/text-content.ts","./src/actions/constants/index.ts","./src/actions/utils/index.ts","./src/agent/browsing/index.ts","./src/agent/browsing/run.ts","./src/agent/browsing/utils.ts","./src/agent/chat/agent-loop.ts","./src/agent/chat/exports.ts","./src/agent/chat/index.ts","./src/agent/chat/models.ts","./src/agent/chat/prompt.ts","./src/agent/chat/repo.ts","./src/agent/chat/state.ts","./src/agent/chat/types.ts","./src/agent/chat/utils.ts","./src/agent/codegen/create-test-block.ts","./src/agent/codegen/fix-ts-errors.ts","./src/agent/codegen/generate-code-apply-changes.ts","./src/agent/codegen/lexical-scoped-vars.ts","./src/agent/codegen/repo-edit.ts","./src/agent/codegen/run.ts","./src/agent/codegen/skills-retriever.ts","./src/agent/codegen/test-update-feedback.ts","./src/agent/codegen/types.ts","./src/agent/codegen/update-flow.ts","./src/agent/codegen/use-skill.ts","./src/agent/codegen/utils.ts","./src/agent/cua/computer.ts","./src/agent/cua/index.ts","./src/agent/cua/model.ts","./src/agent/diagnosis-agent/index.ts","./src/agent/diagnosis-agent/strict-mode-violation.ts","./src/agent/enrich-prompt/index.ts","./src/agent/enrich-prompt/utils.ts","./src/agent/infer-agent/index.ts","./src/agent/master/action-tool-calls.ts","./src/agent/master/element-annotation.ts","./src/agent/master/execute-browser-action.ts","./src/agent/master/execute-skill-action.ts","./src/agent/master/next-action.ts","./src/agent/master/planner.ts","./src/agent/master/run.ts","./src/agent/master/scroller.ts","./src/agent/master/with-hints.ts","./src/agent/master/browser-tests/cua.spec.ts","./src/agent/master/browser-tests/fixtures.ts","./src/agent/master/browser-tests/index.spec.ts","./src/agent/master/browser-tests/skills.spec.ts","./src/agent/master/icon-descriptor/index.ts","./src/agent/master/icon-descriptor/normalize-svg.ts","./src/agent/planner/run-time-planner.ts","./src/agent/planner/run.ts","./src/bin/index.ts","./src/bin/logger/index.ts","./src/bin/utils/context.ts","./src/bin/utils/index.ts","./src/bin/utils/fs/index.ts","./src/bin/utils/platform/web/index.ts","./src/bin/utils/platform/web/test-files/ts-path-import-validate.ts","./src/bin/utils/scenarios/index.ts","./src/browser-injected-scripts/annotate-elements.spec.ts","./src/constants/index.ts","./src/errors/index.ts","./src/evals/add-scenario-agent.evals.ts","./src/evals/append-create-test-agent.evals.ts","./src/evals/fetch-pom-skills-agent.evals.ts","./src/evals/infer-master-or-code-agent.evals.ts","./src/evals/master-agent.evals.ts","./src/evals/type.ts","./src/evals/update-scenario-agent.evals.ts","./src/file/client.ts","./src/file/server.ts","./src/human-in-the-loop/cli.ts","./src/human-in-the-loop/index.ts","./src/human-in-the-loop/ipc.ts","./src/page/index.ts","./src/prompts/lib/ts-transformer.ts","./src/reporter/index.ts","./src/reporter/lib.ts","./src/session/index.ts","./src/test-build/index.ts","./src/tool-call-service/index.ts","./src/tool-call-service/utils.ts","./src/tools/codegen-agent.ts","./src/tools/commit-and-create-pr.ts","./src/tools/diagnosis-fetcher.ts","./src/tools/download-build.ts","./src/tools/environment-crud.ts","./src/tools/str_replace_editor.ts","./src/tools/test-gen-browser.ts","./src/tools/test-run.ts","./src/tools/grep/index.ts","./src/tools/grep/ripgrep/index.ts","./src/tools/grep/ripgrep/types.ts","./src/tools/test-run-fetcher/index.ts","./src/tools/test-run-fetcher/types.ts","./src/tools/utils/index.ts","./src/types/handlebars.d.ts","./src/types/index.ts","./src/uploader/index.ts","./src/uploader/utils.ts","./src/utils/checkpoint.ts","./src/utils/env.ts","./src/utils/exec.ts","./src/utils/file-tree.ts","./src/utils/file.ts","./src/utils/git.ts","./src/utils/html.ts","./src/utils/index.ts","./src/utils/pw-test.ts","./src/utils/repo-tree.ts","./src/utils/slug.ts","./src/utils/string.ts","./src/utils/stripAnsi.ts"],"version":"5.8.3"}
1
+ {"root":["./src/index.ts","./src/actions/assert.ts","./src/actions/click.ts","./src/actions/done.ts","./src/actions/fill.ts","./src/actions/goto.ts","./src/actions/hover.ts","./src/actions/index.ts","./src/actions/next-task.ts","./src/actions/press.ts","./src/actions/skill.ts","./src/actions/text-content.ts","./src/actions/constants/index.ts","./src/actions/utils/index.ts","./src/agent/browsing/index.ts","./src/agent/browsing/run.ts","./src/agent/browsing/utils.ts","./src/agent/chat/agent-loop.ts","./src/agent/chat/exports.ts","./src/agent/chat/index.ts","./src/agent/chat/models.ts","./src/agent/chat/prompt.ts","./src/agent/chat/repo.ts","./src/agent/chat/state.ts","./src/agent/chat/types.ts","./src/agent/chat/utils.ts","./src/agent/codegen/create-test-block.ts","./src/agent/codegen/fix-ts-errors.ts","./src/agent/codegen/generate-code-apply-changes.ts","./src/agent/codegen/lexical-scoped-vars.ts","./src/agent/codegen/repo-edit.ts","./src/agent/codegen/run.ts","./src/agent/codegen/skills-retriever.ts","./src/agent/codegen/test-update-feedback.ts","./src/agent/codegen/types.ts","./src/agent/codegen/update-flow.ts","./src/agent/codegen/use-skill.ts","./src/agent/codegen/utils.ts","./src/agent/cua/computer.ts","./src/agent/cua/index.ts","./src/agent/cua/model.ts","./src/agent/cua/pw-codegen/element-from-point.ts","./src/agent/cua/pw-codegen/types.ts","./src/agent/cua/pw-codegen/pw-pause/index.ts","./src/agent/cua/pw-codegen/pw-pause/utils.ts","./src/agent/diagnosis-agent/index.ts","./src/agent/diagnosis-agent/strict-mode-violation.ts","./src/agent/enrich-prompt/index.ts","./src/agent/enrich-prompt/utils.ts","./src/agent/infer-agent/index.ts","./src/agent/master/action-tool-calls.ts","./src/agent/master/element-annotation.ts","./src/agent/master/execute-browser-action.ts","./src/agent/master/execute-skill-action.ts","./src/agent/master/next-action.ts","./src/agent/master/planner.ts","./src/agent/master/run.ts","./src/agent/master/scroller.ts","./src/agent/master/with-hints.ts","./src/agent/master/browser-tests/cua.spec.ts","./src/agent/master/browser-tests/fixtures.ts","./src/agent/master/browser-tests/index.spec.ts","./src/agent/master/browser-tests/skills.spec.ts","./src/agent/master/icon-descriptor/index.ts","./src/agent/master/icon-descriptor/normalize-svg.ts","./src/agent/planner/run-time-planner.ts","./src/agent/planner/run.ts","./src/artifacts/index.ts","./src/bin/index.ts","./src/bin/logger/index.ts","./src/bin/utils/context.ts","./src/bin/utils/index.ts","./src/bin/utils/fs/index.ts","./src/bin/utils/platform/web/index.ts","./src/bin/utils/platform/web/test-files/ts-path-import-validate.ts","./src/bin/utils/scenarios/index.ts","./src/browser-injected-scripts/annotate-elements.spec.ts","./src/constants/index.ts","./src/errors/index.ts","./src/evals/add-scenario-agent.evals.ts","./src/evals/append-create-test-agent.evals.ts","./src/evals/fetch-pom-skills-agent.evals.ts","./src/evals/infer-master-or-code-agent.evals.ts","./src/evals/master-agent.evals.ts","./src/evals/type.ts","./src/evals/update-scenario-agent.evals.ts","./src/file/client.ts","./src/file/server.ts","./src/human-in-the-loop/cli.ts","./src/human-in-the-loop/index.ts","./src/human-in-the-loop/ipc.ts","./src/page/index.ts","./src/prompts/lib/ts-transformer.ts","./src/reporter/index.ts","./src/reporter/lib.ts","./src/session/index.ts","./src/test-build/index.ts","./src/tool-call-service/index.ts","./src/tool-call-service/utils.ts","./src/tools/codegen-agent.ts","./src/tools/commit-and-create-pr.ts","./src/tools/diagnosis-fetcher.ts","./src/tools/download-build.ts","./src/tools/environment-crud.ts","./src/tools/str_replace_editor.ts","./src/tools/test-gen-browser.ts","./src/tools/test-run.ts","./src/tools/grep/index.ts","./src/tools/grep/ripgrep/index.ts","./src/tools/grep/ripgrep/types.ts","./src/tools/test-run-fetcher/index.ts","./src/tools/test-run-fetcher/types.ts","./src/tools/utils/index.ts","./src/types/handlebars.d.ts","./src/types/index.ts","./src/uploader/index.ts","./src/uploader/utils.ts","./src/utils/checkpoint.ts","./src/utils/env.ts","./src/utils/exec.ts","./src/utils/file-tree.ts","./src/utils/file.ts","./src/utils/git.ts","./src/utils/html.ts","./src/utils/index.ts","./src/utils/repo-tree.ts","./src/utils/slug.ts","./src/utils/string.ts","./src/utils/stripAnsi.ts"],"version":"5.8.3"}
@@ -1,2 +0,0 @@
1
- export declare function getTestFixtureModuleFromRepo(repoDir: string): Promise<any>;
2
- //# sourceMappingURL=pw-test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pw-test.d.ts","sourceRoot":"","sources":["../../src/utils/pw-test.ts"],"names":[],"mappings":"AAEA,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,CAKd"}
@@ -1,13 +0,0 @@
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.getTestFixtureModuleFromRepo = getTestFixtureModuleFromRepo;
7
- const api_1 = __importDefault(require("tsx/cjs/api"));
8
- async function getTestFixtureModuleFromRepo(repoDir) {
9
- const [lastDir] = repoDir.split("/").reverse();
10
- const dir = `${repoDir}/${lastDir}`;
11
- const { test } = await api_1.default.require(`./tests/fixtures.ts`, dir);
12
- return test;
13
- }