@empiricalrun/test-gen 0.80.2 → 0.81.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @empiricalrun/test-gen
2
2
 
3
+ ## 0.81.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6fb8170: feat: playwright utils upgraded to use new core
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [6fb8170]
12
+ - Updated dependencies [aa78c40]
13
+ - @empiricalrun/cua@0.4.0
14
+ - @empiricalrun/reporter@0.29.0
15
+ - @empiricalrun/shared-types@0.13.0
16
+ - @empiricalrun/test-run@0.17.0
17
+ - @empiricalrun/dashboard-client@0.3.0
18
+ - @empiricalrun/llm@0.26.0
19
+ - videostil@0.3.5
20
+
21
+ ## 0.80.3
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [12b14e5]
26
+ - @empiricalrun/dashboard-client@0.3.0
27
+
3
28
  ## 0.80.2
4
29
 
5
30
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAsBpE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAOpC,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,IAAI,WAAW;IA8B3B,iBAAiB,CACrB,eAAe,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC;CA0GnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAoBpE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAOpC,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,IAAI,WAAW;IA2B3B,iBAAiB,CACrB,eAAe,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC;CA2GnB"}
@@ -2,15 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ChatAgent = void 0;
4
4
  const tools_1 = require("../../tools");
5
- const api_client_1 = require("../../tools/api-client");
6
5
  const analyse_video_1 = require("../../tools/definitions/analyse-video");
7
6
  const grep_1 = require("../../tools/definitions/grep");
8
7
  const list_tests_and_projects_1 = require("../../tools/definitions/list-tests-and-projects");
9
8
  const run_test_1 = require("../../tools/definitions/run-test");
10
- const test_gen_browser_1 = require("../../tools/definitions/test-gen-browser");
11
9
  const diagnosis_fetcher_1 = require("../../tools/diagnosis-fetcher");
12
10
  const fetch_file_1 = require("../../tools/fetch-file");
13
- const slack_message_1 = require("../../tools/slack-message");
14
11
  const base_1 = require("../base");
15
12
  const pw_utils_docs_1 = require("./prompt/pw-utils-docs");
16
13
  const repo_1 = require("./prompt/repo");
@@ -19,14 +16,11 @@ const test_case_def_1 = require("./prompt/test-case-def");
19
16
  const trace_utils_docs_1 = require("./prompt/trace-utils-docs");
20
17
  class ChatAgent extends base_1.BaseAgent {
21
18
  getTools() {
22
- const hasSlackTool = this.featureFlags.includes("has_slack_tool");
23
- const hasSkills = this.featureFlags.includes("useSkills");
24
19
  const hasAnalyseVideoTool = this.featureFlags.includes("has_analyse_video_tool");
25
20
  const custom = [
26
21
  ...(hasAnalyseVideoTool ? [analyse_video_1.analyseVideo] : []),
27
22
  run_test_1.runTestTool,
28
23
  grep_1.grepTool,
29
- ...(hasSlackTool ? [slack_message_1.slackMessageTool] : []),
30
24
  fetch_file_1.fetchFileTool,
31
25
  list_tests_and_projects_1.listProjectsTool,
32
26
  list_tests_and_projects_1.listTestsForProjectTool,
@@ -35,7 +29,6 @@ class ChatAgent extends base_1.BaseAgent {
35
29
  tools_1.safeBashTool,
36
30
  ...(!(0, tools_1.hasBuiltInWebFetch)(this.selectedModel) ? [tools_1.scrapeHtmlTool] : []),
37
31
  ...tools_1.testGenerationToolsWithoutBrowserAgent,
38
- ...(!hasSkills ? [api_client_1.apiClientTool, test_gen_browser_1.generateTestWithBrowserAgent] : []),
39
32
  ];
40
33
  return {
41
34
  custom,
@@ -48,8 +41,7 @@ class ChatAgent extends base_1.BaseAgent {
48
41
  async buildSystemPrompt(repoInfoBuilder) {
49
42
  const repoInfo = await repoInfoBuilder();
50
43
  const repoContext = await (0, repo_1.getRepoContextPrompt)(repoInfo);
51
- const hasSkills = this.featureFlags.includes("useSkills");
52
- const skillsInToolsPrompt = hasSkills ? skills_1.skillsToolsPrompt : "";
44
+ const skillsInToolsPrompt = await (0, skills_1.getSkillsToolsPrompt)(this.workerEnv?.HIVE_API_KEY);
53
45
  const preamble = `
54
46
  You are a helpful assistant that can answer questions and help with tasks related to writing and maintaining Playwright tests.
55
47
 
@@ -1,2 +1,2 @@
1
- export declare const playwrightUtilsDocs = "\nYou can refer to the following recipes to learn how to write or diagnose tests for different scenarios.\n\n<email-automation>\n\n# Email automation\n\n## Example usage\n\n### Dynamic email\n\nThis dynamically generates a random email address that can \nbe used for the test (e.g. invite a new user).\n\n```ts\nimport { EmailClient } from \"@empiricalrun/playwright-utils\";\nimport { expect } from \"@playwright/test\";\n\nconst client = new EmailClient();\nconst address = client.getAddress();\n\n// Input the `address` in the application\n// that sends the email.\n\n// Get email received on the `address`\nconst email = await client.waitForEmail();\nexpect(\n email.links.find((l) => l.text === \"Join your team\")\n).toBeTruthy();\n```\n\n### Static email\n\nThis uses a known (static) email that can be used to login\ninto an application.\n\nThis needs an email id (e.g. `test-login-user`). The email id\nis appended with the domain (managed internally) to get the full\nemail address.\n\n```ts\nimport { EmailClient } from \"@empiricalrun/playwright-utils\";\n\nconst emailId = `test-login-user`;\n\nconst client = new EmailClient({ emailId });\nconst address = client.getAddress(); // Returns full address with domain\n\n// Get email received on the `address`\nconst email = await client.waitForEmail();\n\n// Get login OTP\nconst loginCode = email.codes[0];\n```\n\n</email-automation>\n\n<fixtures>\n\nThe playwright-utils package provides fixtures that wrap around Playwright's built-in\n`page`, `context` fixtures to provide a mouse highlighter (which makes it easier to\nsee actions taken in a video).\n\nTo use this, you can use the `baseTestFixture` and `extendExpect` imports\nin your fixtures file.\n\n```ts\nimport { test as base, expect as baseExpect } from \"@playwright/test\";\nimport { baseTestFixture, extendExpect } from \"@empiricalrun/playwright-utils/test\";\n\nexport const test = baseTestFixture(base);\nexport const expect = extendExpect(baseExpect);\n```\n\n### Get a new browser context\n\nThis package provides a fixture `customContextPageProvider` which is a good way to create\na fresh, new browser context, and a page inside it.\n\nThere are two benefits of using this to create contexts or pages:\n1. Videos get recorded and attached to the test report\n2. Mouse highlights are available\n\n```ts\nimport { test, expect } from \"./fixtures\";\n\ntest(\"Example test\", async ({ page: builtInPage, customContextPageProvider }) => {\n // builtInPage is from default browser context\n const { page: newPage, context } = await customContextPageProvider();\n // newPage is from this other browser context\n});\n```\n\ncustomContextPageProvider can accept options to customize the browser context.\n\n```\n customContextPageProvider: (\n options?: BrowserContextOptions,\n ) => Promise<{ context: BrowserContext; page: Page }>;\n```\n\nFor example, pass { storageState: undefined } to create a new browser context without\nthe auth state of the current browser context. This is useful for multi-user scenarios.\n\n</fixtures>\n\n<video-labels>\n\n# Video Labels\n\nPages generate video recordings after test execution, with 1 page generating 1 video file (webm). \n\nIf your test case relies on multiple pages (e.g. for multi-user or multi-app flows), it can get difficult to\nknow which page does \"video-1.webm\" belong to.\n\nTo solve this, you should set video labels for pages. This will enable you to identify videos faster.\n\n## Usage\n\n```typescript\nimport { setVideoLabel } from '@empiricalrun/playwright-utils/test';\n\ntest('my test', async ({ page }) => {\n setVideoLabel(page, 'checkout-flow');\n // Video will be saved as 'checkout-flow.webm'\n});\n```\n\n## Multiple Contexts\n\n```typescript\ntest('multi-user scenario', async ({ page, customContextPageProvider }) => {\n setVideoLabel(page, 'host-page');\n\n const { page: guestPage } = await customContextPageProvider({ storageState: undefined });\n setVideoLabel(guestPage, 'guest-page');\n // Videos saved as 'guest-page.webm' and 'host-page.webm'\n});\n```\n\n## Notes\n\n- The default behavior is to label videos for multiple pages as: `video-0.webm`, `video-1.webm`, etc.\n- If setVideoLabel is called twice for the same page, the last label will be set\n\n</video-labels>\n\n";
1
+ export declare const playwrightUtilsDocs = "\nYou can refer to the following recipes to learn how to write or diagnose tests for different scenarios.\n\n<fixtures>\n\nThe playwright-utils package provides fixtures that wrap around Playwright's built-in\n`page`, `context` fixtures to provide a mouse highlighter (which makes it easier to\nsee actions taken in a video).\n\nTo use this, you can use the `baseTestFixture` and `extendExpect` imports\nin your fixtures file.\n\n```ts\nimport { test as base, expect as baseExpect } from \"@playwright/test\";\nimport { baseTestFixture, extendExpect } from \"@empiricalrun/playwright-utils/test\";\n\nexport const test = baseTestFixture(base);\nexport const expect = extendExpect(baseExpect);\n```\n\n### Get a new browser context\n\nThis package provides a fixture `customContextPageProvider` which is a good way to create\na fresh, new browser context, and a page inside it.\n\nThere are two benefits of using this to create contexts or pages:\n1. Videos get recorded and attached to the test report\n2. Mouse highlights are available\n\n```ts\nimport { test, expect } from \"./fixtures\";\n\ntest(\"Example test\", async ({ page: builtInPage, customContextPageProvider }) => {\n // builtInPage is from default browser context\n const { page: newPage, context } = await customContextPageProvider();\n // newPage is from this other browser context\n});\n```\n\ncustomContextPageProvider can accept options to customize the browser context.\n\n```\n customContextPageProvider: (\n options?: BrowserContextOptions,\n ) => Promise<{ context: BrowserContext; page: Page }>;\n```\n\nFor example, pass { storageState: undefined } to create a new browser context without\nthe auth state of the current browser context. This is useful for multi-user scenarios.\n\n</fixtures>\n\n<video-labels>\n\n# Video Labels\n\nPages generate video recordings after test execution, with 1 page generating 1 video file (webm). \n\nIf your test case relies on multiple pages (e.g. for multi-user or multi-app flows), it can get difficult to\nknow which page does \"video-1.webm\" belong to.\n\nTo solve this, you should set video labels for pages. This will enable you to identify videos faster.\n\n## Usage\n\n```typescript\nimport { setVideoLabel } from '@empiricalrun/playwright-utils/test';\n\ntest('my test', async ({ page }) => {\n setVideoLabel(page, 'checkout-flow');\n // Video will be saved as 'checkout-flow.webm'\n});\n```\n\n## Multiple Contexts\n\n```typescript\ntest('multi-user scenario', async ({ page, customContextPageProvider }) => {\n setVideoLabel(page, 'host-page');\n\n const { page: guestPage } = await customContextPageProvider({ storageState: undefined });\n setVideoLabel(guestPage, 'guest-page');\n // Videos saved as 'guest-page.webm' and 'host-page.webm'\n});\n```\n\n## Notes\n\n- The default behavior is to label videos for multiple pages as: `video-0.webm`, `video-1.webm`, etc.\n- If setVideoLabel is called twice for the same page, the last label will be set\n\n</video-labels>\n\n";
2
2
  //# sourceMappingURL=pw-utils-docs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pw-utils-docs.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/pw-utils-docs.ts"],"names":[],"mappings":"AA4IA,eAAO,MAAM,mBAAmB,itIAe/B,CAAC"}
1
+ {"version":3,"file":"pw-utils-docs.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/pw-utils-docs.ts"],"names":[],"mappings":"AAuFA,eAAO,MAAM,mBAAmB,s8FAW/B,CAAC"}
@@ -1,58 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.playwrightUtilsDocs = void 0;
4
- // Ref: packages/playwright-utils/docs/email.md
5
- const emailRecipe = `
6
- # Email automation
7
-
8
- ## Example usage
9
-
10
- ### Dynamic email
11
-
12
- This dynamically generates a random email address that can
13
- be used for the test (e.g. invite a new user).
14
-
15
- \`\`\`ts
16
- import { EmailClient } from "@empiricalrun/playwright-utils";
17
- import { expect } from "@playwright/test";
18
-
19
- const client = new EmailClient();
20
- const address = client.getAddress();
21
-
22
- // Input the \`address\` in the application
23
- // that sends the email.
24
-
25
- // Get email received on the \`address\`
26
- const email = await client.waitForEmail();
27
- expect(
28
- email.links.find((l) => l.text === "Join your team")
29
- ).toBeTruthy();
30
- \`\`\`
31
-
32
- ### Static email
33
-
34
- This uses a known (static) email that can be used to login
35
- into an application.
36
-
37
- This needs an email id (e.g. \`test-login-user\`). The email id
38
- is appended with the domain (managed internally) to get the full
39
- email address.
40
-
41
- \`\`\`ts
42
- import { EmailClient } from "@empiricalrun/playwright-utils";
43
-
44
- const emailId = \`test-login-user\`;
45
-
46
- const client = new EmailClient({ emailId });
47
- const address = client.getAddress(); // Returns full address with domain
48
-
49
- // Get email received on the \`address\`
50
- const email = await client.waitForEmail();
51
-
52
- // Get login OTP
53
- const loginCode = email.codes[0];
54
- \`\`\`
55
- `;
56
4
  // Ref: packages/playwright-utils/docs/fixtures.md
57
5
  const fixturesRecipe = `
58
6
  The playwright-utils package provides fixtures that wrap around Playwright's built-in
@@ -141,10 +89,6 @@ test('multi-user scenario', async ({ page, customContextPageProvider }) => {
141
89
  exports.playwrightUtilsDocs = `
142
90
  You can refer to the following recipes to learn how to write or diagnose tests for different scenarios.
143
91
 
144
- <email-automation>
145
- ${emailRecipe}
146
- </email-automation>
147
-
148
92
  <fixtures>
149
93
  ${fixturesRecipe}
150
94
  </fixtures>
@@ -1,3 +1,2 @@
1
- export declare const skillsToolsPrompt: string;
2
- export declare const skillsProactivenessPrompt = "\nIf your listed tools don't seem sufficient for a task, load a relevant skill file using the bash tool to learn how to accomplish the task with your existing tools.\n";
1
+ export declare function getSkillsToolsPrompt(hiveApiKey?: string): Promise<string>;
3
2
  //# sourceMappingURL=skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/skills.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,iBAAiB,QAO7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,4KAErC,CAAC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/skills.ts"],"names":[],"mappings":"AAiEA,wBAAsB,oBAAoB,CACxC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -1,18 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.skillsProactivenessPrompt = exports.skillsToolsPrompt = void 0;
4
- const availableSkills = [
5
- {
6
- name: "empirical-api",
7
- description: "Interact with the Empirical dashboard via API. Load this skill whenever you need to access dashboard data such as test runs, resources, or any project-level information.",
8
- location: "/opt/skills/empirical-api/SKILL.md",
9
- },
10
- {
11
- name: "playwright-cli",
12
- description: "Interact with browsers via playwright-cli for test generation, debugging, and exploration. Use when asked to generate, modify, or fix Playwright tests, explore a website or debug test failures.",
13
- location: "/opt/skills/playwright-cli/SKILL.md",
14
- },
15
- ];
3
+ exports.getSkillsToolsPrompt = getSkillsToolsPrompt;
4
+ const HIVE_URL = process.env.HIVE_URL || "https://hive.empirical.run";
5
+ async function fetchSkillCatalog(hiveApiKey) {
6
+ const apiKey = hiveApiKey || process.env.HIVE_API_KEY;
7
+ if (!apiKey) {
8
+ console.warn("[skills] HIVE_API_KEY not set, no skills available");
9
+ return [];
10
+ }
11
+ const res = await fetch(`${HIVE_URL}/api/skills`, {
12
+ headers: { Authorization: `Bearer ${apiKey}` },
13
+ });
14
+ if (!res.ok) {
15
+ console.error(`[skills] Failed to fetch skill catalog: ${res.status} ${res.statusText}`);
16
+ return [];
17
+ }
18
+ const { data } = (await res.json());
19
+ return data.map((s) => ({
20
+ name: s.name,
21
+ description: s.description || "",
22
+ location: `/opt/skills/${s.name}/SKILL.md`,
23
+ }));
24
+ }
16
25
  const skillToXml = (s) => {
17
26
  return `<skill>
18
27
  <name>${s.name}</name>
@@ -20,17 +29,22 @@ const skillToXml = (s) => {
20
29
  <location>${s.location}</location>
21
30
  </skill>`;
22
31
  };
23
- const skillCatalogXml = `<available_skills>
24
- ${availableSkills.map(skillToXml).join("\n")}
32
+ function buildSkillsPrompt(skills) {
33
+ if (skills.length === 0)
34
+ return "";
35
+ const catalogXml = `<available_skills>
36
+ ${skills.map(skillToXml).join("\n")}
25
37
  </available_skills>`;
26
- exports.skillsToolsPrompt = `
38
+ return `
27
39
  You have access to **skill files** — documentation that teaches you how to accomplish tasks using your existing safeBash tool.
28
40
  Skills are NOT callable functions. To use a skill, read its file with bash, then follow the instructions inside.
29
41
 
30
- ${skillCatalogXml}
42
+ ${catalogXml}
31
43
 
32
44
  To use a skill: run \`cat <location>\` using the bash tool, then follow the instructions in the output.
33
45
  `;
34
- exports.skillsProactivenessPrompt = `
35
- If your listed tools don't seem sufficient for a task, load a relevant skill file using the bash tool to learn how to accomplish the task with your existing tools.
36
- `;
46
+ }
47
+ async function getSkillsToolsPrompt(hiveApiKey) {
48
+ const skills = await fetchSkillCatalog(hiveApiKey);
49
+ return buildSkillsPrompt(skills);
50
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recorder/index.ts"],"names":[],"mappings":"AAsEA,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AA4TD,wBAAsB,WAAW,CAAC,EAChC,QAAQ,EACR,OAAO,EACP,GAAG,GACJ,EAAE,kBAAkB,iBAGpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recorder/index.ts"],"names":[],"mappings":"AAuEA,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAiUD,wBAAsB,WAAW,CAAC,EAChC,QAAQ,EACR,OAAO,EACP,GAAG,GACJ,EAAE,kBAAkB,iBAGpB"}
@@ -99,9 +99,9 @@ async function collectTestInfo({ testName, project, repoDir, }) {
99
99
  }
100
100
  async function collectTestInfoFromDiagnosis(url) {
101
101
  const slug = (0, slug_1.extractSlugFromDiagnosisUrl)(url);
102
- const data = (await client_1.apiClient.request(`/api/diagnosis/${slug}/detailed`, {
102
+ const data = await client_1.apiClient.request(`/api/diagnosis/${slug}/detailed`, {
103
103
  method: "GET",
104
- }));
104
+ });
105
105
  if (!data.data ||
106
106
  !data.data.error_stack?.file_info ||
107
107
  data.data.error_stack.file_info.length === 0) {
@@ -111,7 +111,9 @@ async function collectTestInfoFromDiagnosis(url) {
111
111
  ? data.data.test_case.file_path
112
112
  : `tests/${data.data.test_case.file_path}`;
113
113
  const testName = data.data.test_case.name;
114
- const selectedProjects = [data.data.diagnosis.test_project];
114
+ const selectedProjects = data.data.diagnosis.test_project
115
+ ? [data.data.diagnosis.test_project]
116
+ : [];
115
117
  const fileInfo = data.data.error_stack.file_info.map((file) => ({
116
118
  fileName: file.file_name,
117
119
  filePath: file.file_path,
@@ -1,8 +1,12 @@
1
- import type { TestCaseTestRunMetadataEntry, TestCaseWithSuitesAsArray } from "@empiricalrun/shared-types/api/test-cases";
1
+ import type { TestCaseTestRunMetadataEntry } from "@empiricalrun/shared-types/api/test-cases";
2
2
  import type { Tool } from "@empiricalrun/shared-types/chat-agent";
3
+ import { getDiagnosisDetailedContract, type InferResponse } from "@empiricalrun/shared-types/external-api";
3
4
  import type { PlaywrightMatchingTest } from "@empiricalrun/shared-types/playwright-utils";
5
+ type DiagnosisData = InferResponse<typeof getDiagnosisDetailedContract>;
6
+ type DiagnosisDetailedTestCase = DiagnosisData["test_case"];
4
7
  export declare const fetchDiagnosisReportTool: Tool;
5
- export declare function getDataForLastSuccessfulRuns(testCase: TestCaseWithSuitesAsArray): Promise<never[] | Record<string, TestCaseTestRunMetadataEntry & {
8
+ export declare function getDataForLastSuccessfulRuns(testCase: DiagnosisDetailedTestCase): Promise<never[] | Record<string, TestCaseTestRunMetadataEntry & {
6
9
  test_case: PlaywrightMatchingTest;
7
10
  }>>;
11
+ export {};
8
12
  //# sourceMappingURL=diagnosis-fetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diagnosis-fetcher.d.ts","sourceRoot":"","sources":["../../src/tools/diagnosis-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAiB1F,eAAO,MAAM,wBAAwB,EAAE,IAwItC,CAAC;AAEF,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,yBAAyB;eAKW,sBAAsB;IAkDrE"}
1
+ {"version":3,"file":"diagnosis-fetcher.d.ts","sourceRoot":"","sources":["../../src/tools/diagnosis-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAE9F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EACL,4BAA4B,EAC5B,KAAK,aAAa,EACnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAG1F,KAAK,aAAa,GAAG,aAAa,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACxE,KAAK,yBAAyB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAgB5D,eAAO,MAAM,wBAAwB,EAAE,IAwItC,CAAC;AAEF,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,yBAAyB;eAKW,sBAAsB;IAkDrE"}
@@ -104,7 +104,7 @@ In the above, the diagnosis id is after the double hyphen, which is "ULRHHNwiGZ2
104
104
  # Test Case Information
105
105
  - **Name**: ${test_case.name}
106
106
  - **Test suite** (Describe blocks): ${test_case.suites}
107
- - **File path**: tests/${test_case.file_path}
107
+ - **File path**: ${test_case.file_path}
108
108
  - **Playwright project**: ${project}
109
109
 
110
110
  # Test Run #${test_run.id}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/executor/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAEjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;CAiCzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/executor/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAEjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;CAgCzD"}
@@ -22,7 +22,6 @@ const publish_markdown_report_1 = require("../publish-markdown-report");
22
22
  const rename_file_1 = require("../rename-file");
23
23
  const run_test_1 = require("../run-test");
24
24
  const safe_bash_1 = require("../safe-bash");
25
- const slack_message_1 = require("../slack-message");
26
25
  const test_gen_browser_1 = require("../test-gen-browser");
27
26
  const test_run_fetcher_1 = require("../test-run-fetcher");
28
27
  const trace_dot_zip_1 = require("../trace-dot-zip");
@@ -61,7 +60,6 @@ class ToolExecutor extends base_1.BaseToolExecutor {
61
60
  set_issue_description_1.setIssueDescriptionTool,
62
61
  update_issue_1.updateIssueTool,
63
62
  firecrawl_scrape_1.scrapeHtmlTool,
64
- slack_message_1.slackMessageTool,
65
63
  ...file_operations_1.textEditorTools,
66
64
  ];
67
65
  super({ ...params, tools });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACf,MAAM,uCAAuC,CAAC;AA+B/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,KAAK,oBAAoB,GAAG,IAAI,GAAG,cAAc,CAAC;AAclD,eAAO,MAAM,sCAAsC,EAAE,oBAAoB,EAKxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,oBAAoB,EAGrD,CAAC;AAkBF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,WAE9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,WAE5D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,EAAE,CAExB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,EAAE,CAExB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,WAM5D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAQlE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACf,MAAM,uCAAuC,CAAC;AA+B/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,KAAK,oBAAoB,GAAG,IAAI,GAAG,cAAc,CAAC;AAclD,eAAO,MAAM,sCAAsC,EAAE,oBAAoB,EAKxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,oBAAoB,EAGrD,CAAC;AAkBF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,WAE9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,WAM5D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,EAAE,CAExB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,EAAE,CAExB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,WAM5D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAQlE"}
@@ -74,7 +74,9 @@ function hasBuiltInTextEditor(model) {
74
74
  return model.includes("claude");
75
75
  }
76
76
  function hasBuiltInWebFetch(model) {
77
- return model.includes("claude");
77
+ return (model.includes("claude") &&
78
+ !model.includes(":vertex") &&
79
+ !model.includes(":bedrock"));
78
80
  }
79
81
  function textEditorToolsForModel(model) {
80
82
  return !hasBuiltInTextEditor(model) ? Object.values(str_replace_editor_1.textEditorTools) : [];
@@ -12,8 +12,8 @@ const utils_1 = require("../artifacts/utils");
12
12
  const json_1 = require("../utils/json");
13
13
  const run_test_1 = require("./definitions/run-test");
14
14
  const helpers_1 = require("./file-operations/shared/helpers");
15
- function buildReportUrl(projectName, testRunId) {
16
- return `https://reports-r2.empirical.run/${projectName}/${testRunId}/index.html`;
15
+ function buildReportUrl(projectSlug, testRunId) {
16
+ return `https://reports-r2.empirical.run/${projectSlug}/${testRunId}/index.html`;
17
17
  }
18
18
  function buildResult({ hasTestPassed, summaryJson, reportUrl, }) {
19
19
  const summaryWithoutConfig = { ...summaryJson, config: undefined };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAYlE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,eAAO,MAAM,uBAAuB,EAAE,IAgHrC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAUlE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,eAAO,MAAM,uBAAuB,EAAE,IAgHrC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-gen",
3
- "version": "0.80.2",
3
+ "version": "0.81.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -89,18 +89,18 @@
89
89
  "typescript": "^5.3.3",
90
90
  "zod": "^4.0.1",
91
91
  "@empiricalrun/ast-parser": "^0.0.10",
92
- "@empiricalrun/cua": "^0.3.0",
93
- "@empiricalrun/dashboard-client": "^0.2.1",
94
- "@empiricalrun/shared-types": "0.12.1",
92
+ "@empiricalrun/cua": "^0.4.0",
93
+ "@empiricalrun/dashboard-client": "^0.3.0",
94
+ "@empiricalrun/shared-types": "0.13.0",
95
95
  "@empiricalrun/llm": "^0.26.0",
96
96
  "@empiricalrun/r2-uploader": "^0.9.1",
97
97
  "@empiricalrun/trace-utils": "^0.1.0",
98
- "@empiricalrun/reporter": "^0.28.1",
99
- "@empiricalrun/test-run": "^0.16.1",
98
+ "@empiricalrun/reporter": "^0.29.0",
99
+ "@empiricalrun/test-run": "^0.17.0",
100
100
  "videostil": "0.3.5"
101
101
  },
102
102
  "devDependencies": {
103
- "@playwright/test": "1.58.2",
103
+ "@playwright/test": "1.60.0",
104
104
  "@types/async-retry": "^1.4.8",
105
105
  "@types/console-log-level": "^1.4.5",
106
106
  "@types/detect-port": "^1.3.5",
@@ -113,7 +113,7 @@
113
113
  "@types/pixelmatch": "^5.2.6",
114
114
  "@types/serve-handler": "^6.1.4",
115
115
  "js-levenshtein": "^1.1.6",
116
- "playwright": "1.58.2",
116
+ "playwright": "1.60.0",
117
117
  "serve-handler": "^6.1.6",
118
118
  "ts-patch": "^3.3.0"
119
119
  },
@@ -1 +1 @@
1
- {"root":["./src/index.ts","./src/logger.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/text-content.ts","./src/actions/constants/index.ts","./src/actions/utils/index.ts","./src/agent/cli.ts","./src/agent/index.ts","./src/agent/base/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/state.ts","./src/agent/chat/types.ts","./src/agent/chat/utils.ts","./src/agent/chat/prompt/pw-utils-docs.ts","./src/agent/chat/prompt/repo.ts","./src/agent/chat/prompt/skills.ts","./src/agent/chat/prompt/test-case-def.ts","./src/agent/chat/prompt/trace-utils-docs.ts","./src/agent/code-review/index.ts","./src/agent/code-review/types.ts","./src/agent/code-review/xml-parser.ts","./src/agent/code-review/executor/index.ts","./src/agent/fast-triage/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/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/planner/run-time-planner.ts","./src/agent/planner/run.ts","./src/agent/triage/index.ts","./src/artifacts/index.ts","./src/artifacts/utils.ts","./src/auth/cli-auth.ts","./src/auth/index.ts","./src/auth/token-store.ts","./src/bin/index.ts","./src/bin/setup.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/dashboard/client.ts","./src/dashboard/index.ts","./src/dashboard/tool-response-from-sandbox.ts","./src/dashboard/tool-response.ts","./src/dashboard/totp.ts","./src/dashboard/types.ts","./src/errors/index.ts","./src/file/client.ts","./src/file/server.ts","./src/file-info/index.ts","./src/file-info/adapters/file-system/index.ts","./src/file-info/adapters/file-system/reader.ts","./src/file-info/adapters/github/reader.ts","./src/generate-summary/frame-sampling.ts","./src/generate-summary/generate-error-stack-summary.ts","./src/generate-summary/generate-failed-step-screenshot-diff-summary.ts","./src/generate-summary/generate-grouped-summary.ts","./src/generate-summary/merge-summary.ts","./src/generate-summary/pick-videos-for-comparison.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/recorder/env-variables.ts","./src/recorder/index.ts","./src/recorder/request.ts","./src/recorder/temp-files.ts","./src/recorder/upload.ts","./src/recorder/validation.ts","./src/telemetry/index.ts","./src/test-build/index.ts","./src/tools/diagnosis-fetcher.ts","./src/tools/index.ts","./src/tools/list-environments.ts","./src/tools/run-test.ts","./src/tools/test-gen-browser.ts","./src/tools/analyse-video/index.ts","./src/tools/api-client/index.ts","./src/tools/create-pull-request/index.ts","./src/tools/create-pull-request/utils.ts","./src/tools/definitions/analyse-video.ts","./src/tools/definitions/delete-file.ts","./src/tools/definitions/download-build.ts","./src/tools/definitions/grep.ts","./src/tools/definitions/list-tests-and-projects.ts","./src/tools/definitions/merge-conflicts.ts","./src/tools/definitions/publish-markdown-report.ts","./src/tools/definitions/rename-file.ts","./src/tools/definitions/run-test.ts","./src/tools/definitions/safe-bash.ts","./src/tools/definitions/str_replace_editor.ts","./src/tools/definitions/test-gen-browser.ts","./src/tools/definitions/trace-dot-zip.ts","./src/tools/definitions/utils.ts","./src/tools/delete-file/index.ts","./src/tools/download-build/index.ts","./src/tools/executor/base.ts","./src/tools/executor/index.ts","./src/tools/executor/types.ts","./src/tools/executor/utils/checkpoint.ts","./src/tools/executor/utils/git.ts","./src/tools/executor/utils/index.ts","./src/tools/executor/utils/pr-description.ts","./src/tools/fetch-file/index.ts","./src/tools/fetch-file/utils.ts","./src/tools/fetch-session-diff/index.ts","./src/tools/file-operations/create.ts","./src/tools/file-operations/index.ts","./src/tools/file-operations/insert.ts","./src/tools/file-operations/replace.ts","./src/tools/file-operations/shared/helpers.ts","./src/tools/file-operations/view/index.ts","./src/tools/firecrawl-scrape/index.ts","./src/tools/grep/index.ts","./src/tools/grep/types.ts","./src/tools/grep/ripgrep/index.ts","./src/tools/issues-v1/index.ts","./src/tools/issues-v1/list-issues.ts","./src/tools/issues-v1/utils.ts","./src/tools/issues-v2/create-issue.ts","./src/tools/issues-v2/set-issue-description.ts","./src/tools/issues-v2/update-issue.ts","./src/tools/list-tests-and-projects/index.ts","./src/tools/merge-conflicts/index.ts","./src/tools/publish-markdown-report/index.ts","./src/tools/rename-file/index.ts","./src/tools/safe-bash/index.ts","./src/tools/slack-message/index.ts","./src/tools/test-run-fetcher/index.ts","./src/tools/test-run-fetcher/types.ts","./src/tools/trace-dot-zip/index.ts","./src/tools/trace-dot-zip/types.ts","./src/tools/trace-dot-zip/utils/console-trace.ts","./src/tools/trace-dot-zip/utils/extract-screenshots.ts","./src/tools/trace-dot-zip/utils/extract-steps.ts","./src/tools/trace-dot-zip/utils/extract-zip.ts","./src/tools/trace-dot-zip/utils/network-trace.ts","./src/tools/triage-summary/index.ts","./src/tools/triage-summary/types.ts","./src/tools/triage-summary/utils.ts","./src/tools/utils/apply-line-limit.ts","./src/tools/utils/validate-schema.ts","./src/tools/utils/validators.ts","./src/types/handlebars.d.ts","./src/types/index.ts","./src/utils/env.ts","./src/utils/exec.ts","./src/utils/file.ts","./src/utils/hash.ts","./src/utils/html.ts","./src/utils/index.ts","./src/utils/json.ts","./src/utils/model.ts","./src/utils/playwright-test-id.ts","./src/utils/repo-tree.ts","./src/utils/slug.ts","./src/utils/string.ts","./src/utils/stripAnsi.ts","./src/utils/url-validation.ts","./src/utils/dedup/dedup-image.ts","./src/utils/dedup/find-threshold.ts","./src/video-core/index.ts","./src/video-core/model-limits.ts","./src/video-core/storage-manager.ts","./src/video-core/types.ts","./src/video-core/utils.ts"],"version":"5.8.3"}
1
+ {"root":["./src/index.ts","./src/logger.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/text-content.ts","./src/actions/constants/index.ts","./src/actions/utils/index.ts","./src/agent/cli.ts","./src/agent/index.ts","./src/agent/base/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/state.ts","./src/agent/chat/types.ts","./src/agent/chat/utils.ts","./src/agent/chat/prompt/pw-utils-docs.ts","./src/agent/chat/prompt/repo.ts","./src/agent/chat/prompt/skills.ts","./src/agent/chat/prompt/test-case-def.ts","./src/agent/chat/prompt/trace-utils-docs.ts","./src/agent/code-review/index.ts","./src/agent/code-review/types.ts","./src/agent/code-review/xml-parser.ts","./src/agent/code-review/executor/index.ts","./src/agent/fast-triage/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/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/planner/run-time-planner.ts","./src/agent/planner/run.ts","./src/agent/triage/index.ts","./src/artifacts/index.ts","./src/artifacts/utils.ts","./src/auth/cli-auth.ts","./src/auth/index.ts","./src/auth/token-store.ts","./src/bin/index.ts","./src/bin/setup.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/dashboard/client.ts","./src/dashboard/index.ts","./src/dashboard/tool-response-from-sandbox.ts","./src/dashboard/tool-response.ts","./src/dashboard/totp.ts","./src/dashboard/types.ts","./src/errors/index.ts","./src/file/client.ts","./src/file/server.ts","./src/file-info/index.ts","./src/file-info/adapters/file-system/index.ts","./src/file-info/adapters/file-system/reader.ts","./src/file-info/adapters/github/reader.ts","./src/generate-summary/frame-sampling.ts","./src/generate-summary/generate-error-stack-summary.ts","./src/generate-summary/generate-failed-step-screenshot-diff-summary.ts","./src/generate-summary/generate-grouped-summary.ts","./src/generate-summary/merge-summary.ts","./src/generate-summary/pick-videos-for-comparison.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/recorder/env-variables.ts","./src/recorder/index.ts","./src/recorder/request.ts","./src/recorder/temp-files.ts","./src/recorder/upload.ts","./src/recorder/validation.ts","./src/telemetry/index.ts","./src/test-build/index.ts","./src/tools/diagnosis-fetcher.ts","./src/tools/index.ts","./src/tools/list-environments.ts","./src/tools/run-test.ts","./src/tools/test-gen-browser.ts","./src/tools/analyse-video/index.ts","./src/tools/api-client/index.ts","./src/tools/create-pull-request/index.ts","./src/tools/create-pull-request/utils.ts","./src/tools/definitions/analyse-video.ts","./src/tools/definitions/delete-file.ts","./src/tools/definitions/download-build.ts","./src/tools/definitions/grep.ts","./src/tools/definitions/list-tests-and-projects.ts","./src/tools/definitions/merge-conflicts.ts","./src/tools/definitions/publish-markdown-report.ts","./src/tools/definitions/rename-file.ts","./src/tools/definitions/run-test.ts","./src/tools/definitions/safe-bash.ts","./src/tools/definitions/str_replace_editor.ts","./src/tools/definitions/test-gen-browser.ts","./src/tools/definitions/trace-dot-zip.ts","./src/tools/definitions/utils.ts","./src/tools/delete-file/index.ts","./src/tools/download-build/index.ts","./src/tools/executor/base.ts","./src/tools/executor/index.ts","./src/tools/executor/types.ts","./src/tools/executor/utils/checkpoint.ts","./src/tools/executor/utils/git.ts","./src/tools/executor/utils/index.ts","./src/tools/executor/utils/pr-description.ts","./src/tools/fetch-file/index.ts","./src/tools/fetch-file/utils.ts","./src/tools/fetch-session-diff/index.ts","./src/tools/file-operations/create.ts","./src/tools/file-operations/index.ts","./src/tools/file-operations/insert.ts","./src/tools/file-operations/replace.ts","./src/tools/file-operations/shared/helpers.ts","./src/tools/file-operations/view/index.ts","./src/tools/firecrawl-scrape/index.ts","./src/tools/grep/index.ts","./src/tools/grep/types.ts","./src/tools/grep/ripgrep/index.ts","./src/tools/issues-v1/index.ts","./src/tools/issues-v1/list-issues.ts","./src/tools/issues-v1/utils.ts","./src/tools/issues-v2/create-issue.ts","./src/tools/issues-v2/set-issue-description.ts","./src/tools/issues-v2/update-issue.ts","./src/tools/list-tests-and-projects/index.ts","./src/tools/merge-conflicts/index.ts","./src/tools/publish-markdown-report/index.ts","./src/tools/rename-file/index.ts","./src/tools/safe-bash/index.ts","./src/tools/test-run-fetcher/index.ts","./src/tools/trace-dot-zip/index.ts","./src/tools/trace-dot-zip/types.ts","./src/tools/trace-dot-zip/utils/console-trace.ts","./src/tools/trace-dot-zip/utils/extract-screenshots.ts","./src/tools/trace-dot-zip/utils/extract-steps.ts","./src/tools/trace-dot-zip/utils/extract-zip.ts","./src/tools/trace-dot-zip/utils/network-trace.ts","./src/tools/triage-summary/index.ts","./src/tools/triage-summary/types.ts","./src/tools/triage-summary/utils.ts","./src/tools/utils/apply-line-limit.ts","./src/tools/utils/validate-schema.ts","./src/tools/utils/validators.ts","./src/types/handlebars.d.ts","./src/types/index.ts","./src/utils/env.ts","./src/utils/exec.ts","./src/utils/file.ts","./src/utils/hash.ts","./src/utils/html.ts","./src/utils/index.ts","./src/utils/json.ts","./src/utils/model.ts","./src/utils/playwright-test-id.ts","./src/utils/repo-tree.ts","./src/utils/slug.ts","./src/utils/string.ts","./src/utils/stripAnsi.ts","./src/utils/url-validation.ts","./src/utils/dedup/dedup-image.ts","./src/utils/dedup/find-threshold.ts","./src/video-core/index.ts","./src/video-core/model-limits.ts","./src/video-core/storage-manager.ts","./src/video-core/types.ts","./src/video-core/utils.ts"],"version":"5.8.3"}
@@ -1,3 +0,0 @@
1
- import type { Tool } from "@empiricalrun/shared-types/chat-agent";
2
- export declare const slackMessageTool: Tool;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/slack-message/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAuBlE,eAAO,MAAM,gBAAgB,EAAE,IAiD9B,CAAC"}
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.slackMessageTool = void 0;
4
- const zod_1 = require("zod");
5
- const SlackActionSchema = zod_1.z.object({
6
- label: zod_1.z.string().describe("Button label text"),
7
- url: zod_1.z.string().describe("URL to open when clicked"),
8
- style: zod_1.z
9
- .enum(["primary", "danger"])
10
- .optional()
11
- .describe("Optional button style: primary (green) or danger (red)"),
12
- });
13
- const SlackMessageSchema = zod_1.z.object({
14
- channel_id: zod_1.z.string().describe("Slack channel ID to post the message to"),
15
- message: zod_1.z.string().describe("Message text to post"),
16
- actions: zod_1.z
17
- .array(SlackActionSchema)
18
- .optional()
19
- .describe("Optional list of action buttons to include below the message. Each button opens a URL when clicked."),
20
- });
21
- exports.slackMessageTool = {
22
- schema: {
23
- name: "slackMessage",
24
- description: `Post a message to a Slack channel.
25
-
26
- Use this tool to send messages to Slack channels that are linked to the project.
27
-
28
- ## Known channels
29
-
30
- - \`C07AQ97P37D\` - #notifications-customer
31
- - \`C08P2JDA3AR\` - #agent-sessions
32
- - \`C09DP3HBGEB\` - #agent-sessions-preprod
33
- - \`C08UZP9TT3K\` - #agent-errors-prod
34
- - \`C09AR2WQPDX\` - #issues-alerts
35
- - \`C09SFF6TKAQ\` - #requests-alerts
36
- - \`C0A6S4VUYKX\` - #customer-summaries
37
- - \`C07CJT50B45\` - #alerts
38
- - \`C0AFJ20FHTP\` - #alerts-staging
39
- `,
40
- parameters: SlackMessageSchema,
41
- },
42
- needsBrowser: false,
43
- isInlineTool: true,
44
- execute: async ({ input, apiClient }) => {
45
- if (!apiClient) {
46
- throw new Error("Dashboard API client is not available.");
47
- }
48
- try {
49
- const response = await apiClient.request("/api/slack/message", {
50
- method: "POST",
51
- body: {
52
- channel_id: input.channel_id,
53
- message: input.message,
54
- actions: input.actions,
55
- },
56
- });
57
- return {
58
- isError: false,
59
- result: JSON.stringify(response, null, 2),
60
- };
61
- }
62
- catch (error) {
63
- return {
64
- isError: true,
65
- result: `Slack message failed: ${error instanceof Error ? error.message : String(error)}`,
66
- };
67
- }
68
- },
69
- };
@@ -1,79 +0,0 @@
1
- type Project = {
2
- id: number;
3
- org_id: number;
4
- name: string;
5
- repo_name: string;
6
- };
7
- type TestRun = {
8
- id: number;
9
- run_id: number;
10
- project_id: number;
11
- total_count: number;
12
- unique_count: number;
13
- success_count: number;
14
- failed_count: number;
15
- skipped_count: number;
16
- flaky_count: number;
17
- run_ended_at: string;
18
- run_started_at: string;
19
- created_at: string;
20
- duration: number;
21
- test_run_branch: string;
22
- summary_url: string;
23
- send_notifications: boolean;
24
- state: string;
25
- build_id: number;
26
- environment_id: number;
27
- metadata: Record<string, any>;
28
- test_run_head_sha: string;
29
- };
30
- type TestRunEnriched = TestRun & {
31
- environment_name: string | null;
32
- environment_slug: string | null;
33
- commit: string | null;
34
- commit_url: string | null;
35
- build_branch: string | null;
36
- build_url: string | null;
37
- };
38
- type FailedRunMetadata = {
39
- stack: string;
40
- trace: string;
41
- videos: string[];
42
- nesting: string[];
43
- location: {
44
- file: string;
45
- line: number;
46
- column: number;
47
- };
48
- start_time: string;
49
- pw_test_id: string;
50
- varying_retries: boolean;
51
- };
52
- type TestCaseSummaryDetail = {
53
- id: number;
54
- test_case_id: number;
55
- test_run_id: number;
56
- status: string;
57
- test_project: string;
58
- failure_type: string;
59
- failure_type_description: string;
60
- last_commit_before_run_started_at: string;
61
- failed_run_metadata: FailedRunMetadata;
62
- created_at: string;
63
- slug: string;
64
- failing_line: string;
65
- };
66
- export type GetTestRunApiResponse = {
67
- data: {
68
- test_run: {
69
- project: Project;
70
- testRun: TestRunEnriched;
71
- flattenedSummaryDetails: TestCaseSummaryDetail[];
72
- };
73
- } | null;
74
- error?: {
75
- message: string;
76
- };
77
- };
78
- export {};
79
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/types.ts"],"names":[],"mappings":"AACA,KAAK,OAAO,GAAG;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,KAAK,eAAe,GAAG,OAAO,GAAG;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,iCAAiC,EAAE,MAAM,CAAC;IAC1C,mBAAmB,EAAE,iBAAiB,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,eAAe,CAAC;YACzB,uBAAuB,EAAE,qBAAqB,EAAE,CAAC;SAClD,CAAC;KACH,GAAG,IAAI,CAAC;IACT,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC"}
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });