@empiricalrun/test-gen 0.75.0 → 0.77.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 (254) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/agent/base/index.d.ts +32 -21
  3. package/dist/agent/base/index.d.ts.map +1 -1
  4. package/dist/agent/base/index.js +100 -57
  5. package/dist/agent/browsing/run.d.ts +1 -2
  6. package/dist/agent/browsing/run.d.ts.map +1 -1
  7. package/dist/agent/browsing/run.js +3 -9
  8. package/dist/agent/browsing/utils.d.ts +2 -9
  9. package/dist/agent/browsing/utils.d.ts.map +1 -1
  10. package/dist/agent/browsing/utils.js +5 -109
  11. package/dist/agent/chat/agent-loop.d.ts +8 -7
  12. package/dist/agent/chat/agent-loop.d.ts.map +1 -1
  13. package/dist/agent/chat/agent-loop.js +7 -18
  14. package/dist/agent/chat/exports.d.ts +9 -6
  15. package/dist/agent/chat/exports.d.ts.map +1 -1
  16. package/dist/agent/chat/exports.js +11 -13
  17. package/dist/agent/chat/index.d.ts +6 -10
  18. package/dist/agent/chat/index.d.ts.map +1 -1
  19. package/dist/agent/chat/index.js +117 -196
  20. package/dist/agent/chat/models.d.ts +0 -2
  21. package/dist/agent/chat/models.d.ts.map +1 -1
  22. package/dist/agent/chat/models.js +12 -26
  23. package/dist/agent/chat/prompt/pw-utils-docs.d.ts +1 -1
  24. package/dist/agent/chat/prompt/pw-utils-docs.d.ts.map +1 -1
  25. package/dist/agent/chat/prompt/pw-utils-docs.js +52 -0
  26. package/dist/agent/chat/prompt/repo.d.ts.map +1 -1
  27. package/dist/agent/chat/prompt/repo.js +11 -22
  28. package/dist/agent/chat/prompt/test-case-def.d.ts +2 -0
  29. package/dist/agent/chat/prompt/test-case-def.d.ts.map +1 -0
  30. package/dist/agent/chat/prompt/test-case-def.js +44 -0
  31. package/dist/agent/chat/state.d.ts +8 -8
  32. package/dist/agent/chat/state.d.ts.map +1 -1
  33. package/dist/agent/chat/state.js +17 -47
  34. package/dist/agent/chat/utils.d.ts +4 -5
  35. package/dist/agent/chat/utils.d.ts.map +1 -1
  36. package/dist/agent/chat/utils.js +15 -9
  37. package/dist/agent/cli.d.ts +11 -0
  38. package/dist/agent/cli.d.ts.map +1 -0
  39. package/dist/agent/cli.js +213 -0
  40. package/dist/agent/code-review/executor/index.d.ts +5 -0
  41. package/dist/agent/code-review/executor/index.d.ts.map +1 -0
  42. package/dist/agent/code-review/executor/index.js +13 -0
  43. package/dist/agent/code-review/index.d.ts +12 -0
  44. package/dist/agent/code-review/index.d.ts.map +1 -0
  45. package/dist/agent/code-review/index.js +159 -0
  46. package/dist/agent/code-review/parser.d.ts +5 -0
  47. package/dist/agent/code-review/parser.d.ts.map +1 -0
  48. package/dist/agent/code-review/parser.js +70 -0
  49. package/dist/agent/code-review/types.d.ts +36 -0
  50. package/dist/agent/code-review/types.d.ts.map +1 -0
  51. package/dist/agent/code-review/types.js +13 -0
  52. package/dist/agent/cua/index.d.ts.map +1 -1
  53. package/dist/agent/cua/index.js +18 -2
  54. package/dist/agent/cua/model.d.ts.map +1 -1
  55. package/dist/agent/cua/model.js +4 -1
  56. package/dist/agent/cua/pw-codegen/pw-pause/index.d.ts.map +1 -1
  57. package/dist/agent/index.d.ts +10 -0
  58. package/dist/agent/index.d.ts.map +1 -0
  59. package/dist/agent/index.js +19 -0
  60. package/dist/agent/triage/index.d.ts +7 -0
  61. package/dist/agent/triage/index.d.ts.map +1 -0
  62. package/dist/agent/triage/index.js +103 -0
  63. package/dist/agent/video-analysis/executor/index.d.ts +5 -0
  64. package/dist/agent/video-analysis/executor/index.d.ts.map +1 -0
  65. package/dist/agent/video-analysis/executor/index.js +10 -0
  66. package/dist/agent/video-analysis/index.d.ts +7 -0
  67. package/dist/agent/video-analysis/index.d.ts.map +1 -0
  68. package/dist/agent/video-analysis/index.js +60 -0
  69. package/dist/artifacts/index.d.ts +1 -1
  70. package/dist/artifacts/index.d.ts.map +1 -1
  71. package/dist/artifacts/index.js +3 -1
  72. package/dist/artifacts/utils.d.ts.map +1 -1
  73. package/dist/bin/index.js +68 -23
  74. package/dist/constants/index.d.ts +14 -0
  75. package/dist/constants/index.d.ts.map +1 -1
  76. package/dist/constants/index.js +33 -1
  77. package/dist/file/server.d.ts +1 -3
  78. package/dist/file/server.d.ts.map +1 -1
  79. package/dist/file/server.js +0 -13
  80. package/dist/file-info/adapters/file-system/index.d.ts.map +1 -1
  81. package/dist/file-info/adapters/file-system/reader.d.ts.map +1 -1
  82. package/dist/file-info/adapters/file-system/reader.js +8 -1
  83. package/dist/file-info/adapters/github/index.d.ts.map +1 -1
  84. package/dist/file-info/adapters/github/index.js +1 -2
  85. package/dist/file-info/adapters/github/reader.d.ts +4 -9
  86. package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
  87. package/dist/file-info/adapters/github/reader.js +166 -134
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/tools/analyse-video/index.d.ts +5 -0
  90. package/dist/tools/analyse-video/index.d.ts.map +1 -0
  91. package/dist/tools/analyse-video/index.js +50 -0
  92. package/dist/tools/create-pull-request/index.d.ts.map +1 -0
  93. package/dist/tools/{definitions/commit-and-create-pr.js → create-pull-request/index.js} +28 -1
  94. package/dist/tools/create-pull-request/utils.d.ts +21 -0
  95. package/dist/tools/create-pull-request/utils.d.ts.map +1 -0
  96. package/dist/tools/create-pull-request/utils.js +83 -0
  97. package/dist/tools/definitions/{fetch-video-analysis.d.ts → analyse-video.d.ts} +17 -12
  98. package/dist/tools/definitions/analyse-video.d.ts.map +1 -0
  99. package/dist/tools/definitions/analyse-video.js +60 -0
  100. package/dist/tools/definitions/review-pull-request.d.ts +3 -0
  101. package/dist/tools/definitions/review-pull-request.d.ts.map +1 -0
  102. package/dist/tools/definitions/review-pull-request.js +16 -0
  103. package/dist/tools/definitions/str_replace_editor.d.ts +1 -0
  104. package/dist/tools/definitions/str_replace_editor.d.ts.map +1 -1
  105. package/dist/tools/definitions/str_replace_editor.js +4 -1
  106. package/dist/tools/definitions/test-gen-browser.d.ts +0 -3
  107. package/dist/tools/definitions/test-gen-browser.d.ts.map +1 -1
  108. package/dist/tools/definitions/test-gen-browser.js +33 -8
  109. package/dist/tools/delete-file/index.d.ts.map +1 -1
  110. package/dist/tools/delete-file/index.js +1 -19
  111. package/dist/tools/executor/base.d.ts +32 -0
  112. package/dist/tools/executor/base.d.ts.map +1 -0
  113. package/dist/tools/executor/base.js +114 -0
  114. package/dist/tools/executor/index.d.ts +3 -22
  115. package/dist/tools/executor/index.d.ts.map +1 -1
  116. package/dist/tools/executor/index.js +13 -92
  117. package/dist/tools/executor/utils/checkpoint.d.ts +1 -1
  118. package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
  119. package/dist/tools/executor/utils/checkpoint.js +6 -2
  120. package/dist/tools/executor/utils/git.d.ts +2 -2
  121. package/dist/tools/executor/utils/git.d.ts.map +1 -1
  122. package/dist/tools/executor/utils/git.js +7 -3
  123. package/dist/tools/executor/utils/index.d.ts.map +1 -1
  124. package/dist/tools/executor/utils/index.js +1 -1
  125. package/dist/tools/fetch-session-diff/index.d.ts +3 -0
  126. package/dist/tools/fetch-session-diff/index.d.ts.map +1 -0
  127. package/dist/tools/fetch-session-diff/index.js +46 -0
  128. package/dist/tools/file-operations/create.d.ts.map +1 -1
  129. package/dist/tools/file-operations/create.js +1 -4
  130. package/dist/tools/file-operations/index.d.ts +2 -1
  131. package/dist/tools/file-operations/index.d.ts.map +1 -1
  132. package/dist/tools/file-operations/index.js +4 -1
  133. package/dist/tools/file-operations/insert.d.ts +1 -2
  134. package/dist/tools/file-operations/insert.d.ts.map +1 -1
  135. package/dist/tools/file-operations/insert.js +1 -4
  136. package/dist/tools/file-operations/replace.d.ts.map +1 -1
  137. package/dist/tools/file-operations/replace.js +1 -4
  138. package/dist/tools/grep/index.d.ts.map +1 -1
  139. package/dist/tools/grep/index.js +18 -11
  140. package/dist/tools/index.d.ts +28 -2
  141. package/dist/tools/index.d.ts.map +1 -1
  142. package/dist/tools/index.js +52 -33
  143. package/dist/tools/merge-conflicts/index.d.ts.map +1 -1
  144. package/dist/tools/merge-conflicts/index.js +1 -1
  145. package/dist/tools/rename-file/index.js +1 -1
  146. package/dist/tools/review-pull-request/index.d.ts +3 -0
  147. package/dist/tools/review-pull-request/index.d.ts.map +1 -0
  148. package/dist/tools/review-pull-request/index.js +89 -0
  149. package/dist/tools/run-test.d.ts.map +1 -1
  150. package/dist/tools/run-test.js +25 -3
  151. package/dist/tools/test-gen-browser.d.ts.map +1 -1
  152. package/dist/tools/test-gen-browser.js +51 -47
  153. package/dist/tools/test-run-fetcher/index.d.ts.map +1 -1
  154. package/dist/tools/test-run-fetcher/index.js +4 -14
  155. package/dist/tools/utils/urls.d.ts +5 -0
  156. package/dist/tools/utils/urls.d.ts.map +1 -0
  157. package/dist/tools/utils/urls.js +19 -0
  158. package/dist/tools/view-failed-test-run-report/index.d.ts.map +1 -1
  159. package/dist/tools/view-failed-test-run-report/index.js +3 -15
  160. package/dist/utils/artifact-paths.d.ts +20 -0
  161. package/dist/utils/artifact-paths.d.ts.map +1 -0
  162. package/dist/utils/artifact-paths.js +16 -0
  163. package/dist/utils/dedup-image-fs.d.ts +2 -16
  164. package/dist/utils/dedup-image-fs.d.ts.map +1 -1
  165. package/dist/utils/dedup-image-fs.js +12 -16
  166. package/dist/utils/dedup-image.d.ts +1 -14
  167. package/dist/utils/dedup-image.d.ts.map +1 -1
  168. package/dist/utils/dedup-image.js +7 -62
  169. package/dist/{tools/fetch-video-analysis/local-ffmpeg-client.d.ts → utils/ffmpeg/index.d.ts} +9 -6
  170. package/dist/utils/ffmpeg/index.d.ts.map +1 -0
  171. package/dist/utils/ffmpeg/index.js +415 -0
  172. package/dist/utils/file.d.ts +1 -0
  173. package/dist/utils/file.d.ts.map +1 -1
  174. package/dist/utils/file.js +45 -1
  175. package/dist/utils/find-threshold.d.ts +8 -0
  176. package/dist/utils/find-threshold.d.ts.map +1 -0
  177. package/dist/utils/find-threshold.js +55 -0
  178. package/dist/utils/hash.d.ts +2 -0
  179. package/dist/utils/hash.d.ts.map +1 -0
  180. package/dist/utils/hash.js +24 -0
  181. package/dist/utils/model.d.ts +1 -1
  182. package/dist/utils/model.d.ts.map +1 -1
  183. package/dist/utils/model.js +7 -5
  184. package/dist/utils/repo-tree.d.ts +0 -1
  185. package/dist/utils/repo-tree.d.ts.map +1 -1
  186. package/dist/utils/repo-tree.js +2 -14
  187. package/dist/utils/slug.js +1 -1
  188. package/dist/video-core/agent-orchestrator.d.ts +14 -0
  189. package/dist/video-core/agent-orchestrator.d.ts.map +1 -0
  190. package/dist/video-core/agent-orchestrator.js +78 -0
  191. package/dist/video-core/analysis-server.d.ts +24 -0
  192. package/dist/video-core/analysis-server.d.ts.map +1 -0
  193. package/dist/video-core/analysis-server.js +398 -0
  194. package/dist/video-core/analysis-viewer.html +1374 -0
  195. package/dist/video-core/index.d.ts +44 -0
  196. package/dist/video-core/index.d.ts.map +1 -0
  197. package/dist/video-core/index.js +204 -0
  198. package/dist/video-core/model-limits.d.ts +4 -0
  199. package/dist/video-core/model-limits.d.ts.map +1 -0
  200. package/dist/video-core/model-limits.js +67 -0
  201. package/dist/video-core/storage-manager.d.ts +5 -0
  202. package/dist/video-core/storage-manager.d.ts.map +1 -0
  203. package/dist/video-core/storage-manager.js +55 -0
  204. package/dist/video-core/types.d.ts +13 -0
  205. package/dist/video-core/types.d.ts.map +1 -0
  206. package/dist/video-core/types.js +2 -0
  207. package/dist/video-core/utils.d.ts +25 -0
  208. package/dist/video-core/utils.d.ts.map +1 -0
  209. package/dist/video-core/utils.js +211 -0
  210. package/dist/video-core/xml-parser.d.ts +3 -0
  211. package/dist/video-core/xml-parser.d.ts.map +1 -0
  212. package/dist/video-core/xml-parser.js +27 -0
  213. package/package.json +5 -6
  214. package/tsconfig.tsbuildinfo +1 -1
  215. package/dist/agent/chat/prompt/index.d.ts +0 -5
  216. package/dist/agent/chat/prompt/index.d.ts.map +0 -1
  217. package/dist/agent/chat/prompt/index.js +0 -189
  218. package/dist/agent/chat/utils/tool-calls.d.ts +0 -21
  219. package/dist/agent/chat/utils/tool-calls.d.ts.map +0 -1
  220. package/dist/agent/chat/utils/tool-calls.js +0 -64
  221. package/dist/agent/code-review/prompt.d.ts +0 -2
  222. package/dist/agent/code-review/prompt.d.ts.map +0 -1
  223. package/dist/agent/code-review/prompt.js +0 -19
  224. package/dist/agent/diagnosis-agent/index.d.ts +0 -11
  225. package/dist/agent/diagnosis-agent/index.d.ts.map +0 -1
  226. package/dist/agent/diagnosis-agent/index.js +0 -88
  227. package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts +0 -10
  228. package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts.map +0 -1
  229. package/dist/agent/diagnosis-agent/strict-mode-violation.js +0 -30
  230. package/dist/tools/commit-and-create-pr/index.d.ts.map +0 -1
  231. package/dist/tools/commit-and-create-pr/index.js +0 -83
  232. package/dist/tools/definitions/commit-and-create-pr.d.ts +0 -3
  233. package/dist/tools/definitions/commit-and-create-pr.d.ts.map +0 -1
  234. package/dist/tools/definitions/fetch-video-analysis.d.ts.map +0 -1
  235. package/dist/tools/definitions/fetch-video-analysis.js +0 -61
  236. package/dist/tools/fetch-video-analysis/index.d.ts +0 -5
  237. package/dist/tools/fetch-video-analysis/index.d.ts.map +0 -1
  238. package/dist/tools/fetch-video-analysis/index.js +0 -138
  239. package/dist/tools/fetch-video-analysis/local-ffmpeg-client.d.ts.map +0 -1
  240. package/dist/tools/fetch-video-analysis/local-ffmpeg-client.js +0 -247
  241. package/dist/tools/fetch-video-analysis/open-ai.d.ts +0 -6
  242. package/dist/tools/fetch-video-analysis/open-ai.d.ts.map +0 -1
  243. package/dist/tools/fetch-video-analysis/open-ai.js +0 -37
  244. package/dist/tools/fetch-video-analysis/utils.d.ts +0 -13
  245. package/dist/tools/fetch-video-analysis/utils.d.ts.map +0 -1
  246. package/dist/tools/fetch-video-analysis/utils.js +0 -98
  247. package/dist/tools/fetch-video-analysis/video-analysis.d.ts +0 -7
  248. package/dist/tools/fetch-video-analysis/video-analysis.d.ts.map +0 -1
  249. package/dist/tools/fetch-video-analysis/video-analysis.js +0 -54
  250. package/dist/tools/file-operations/shared/git-helper.d.ts +0 -4
  251. package/dist/tools/file-operations/shared/git-helper.d.ts.map +0 -1
  252. package/dist/tools/file-operations/shared/git-helper.js +0 -29
  253. package/eslint.config.mjs +0 -43
  254. /package/dist/tools/{commit-and-create-pr → create-pull-request}/index.d.ts +0 -0
@@ -18,8 +18,8 @@ async function getAllMarkdownFiles(directory) {
18
18
  .filter((file) => file.type === "file" && file.path.endsWith(".md"))
19
19
  .map(async (file) => {
20
20
  return {
21
- // TODO: Give full path
22
21
  name: path_1.default.basename(file.path),
22
+ path: file.path,
23
23
  content: file.type === "file" ? await file.getContent() : "",
24
24
  };
25
25
  }));
@@ -35,13 +35,14 @@ async function knowledgeContext(repoInfo) {
35
35
  const mdFiles = await getAllMarkdownFiles(knowledgeDir);
36
36
  const knowledge = mdFiles.map((file) => {
37
37
  return `
38
- <knowledge_file>
39
- <file_name>${file.name}</file_name>
40
- <file_content>
41
- ${file.content}
42
- </file_content>
43
- </knowledge_file>
44
- `;
38
+ <knowledge_file>
39
+ <file_name>${file.name}</file_name>
40
+ <file_path>${file.path}</file_path>
41
+ <file_content>
42
+ ${file.content}
43
+ </file_content>
44
+ </knowledge_file>
45
+ `;
45
46
  });
46
47
  return knowledge.join("\n");
47
48
  }
@@ -59,25 +60,13 @@ While specifying paths to files, use relative paths from the current working dir
59
60
  - Correct path: "tests/lesson.spec.ts"
60
61
  - Incorrect path: "/repo/tests/lesson.spec.ts" or "${repoInfo.name}/tests/lesson.spec.ts"
61
62
  `;
62
- // try {
63
- // const playwrightConfig = await readPlaywrightConfig(process.cwd());
64
- // const validProjectNames = await getValidProjectNames(playwrightConfig);
65
- // if (validProjectNames.length > 0) {
66
- // REPO_CONTEXT_PROMPT += `
67
- // ## Playwright configuration
68
- // This repo is configured with these Playwright projects (in the playwright.config.ts file):
69
- // ${validProjectNames.map((name) => `- ${name}`).join("\n")}
70
- // `;
71
- // }
72
- // } catch (error) {
73
- // console.warn("Failed to read playwright config", error);
74
- // }
75
63
  const knowledge = await knowledgeContext(repoInfo);
76
64
  if (knowledge.length > 0) {
77
65
  REPO_CONTEXT_PROMPT += `
78
66
  ## Repo-specific knowledge
79
67
 
80
- You can use the following knowledge with your tasks.
68
+ This repo knowledge files that will help you understand the repo and application better.
69
+
81
70
  <knowledge>
82
71
  ${knowledge}
83
72
  </knowledge>
@@ -0,0 +1,2 @@
1
+ export declare const testCasesDefinitionPrompt = "\n# Specifying test cases for tools/functions\n\nMany tools and functions that you use require specifying a test case with the following properties: \n- Test case name: Name of the test (specified to the \"test(...)\" method)\n- Suites: Refers to describe blocks where this test is located, specified as an array of strings\n- File path: Path to the file - must be relative to the repo directory\n\n<example_1>\n// Contents of tests/example.spec.ts\nimport { test, expect } from \"./fixtures\";\n\ntest(\"has title\", async ({ page }) => {\n await page.goto(\"https://playwright.dev/\");\n await expect(page).toHaveTitle(/Playwright/);\n});\n\n// Specifying this test case\n- Test case name: \"has title\"\n- Suites: [] (since this test has no describe blocks)\n- File path: \"tests/example.spec.ts\"\n</example_1>\n\n<example_2>\n// Contents of tests/sidebar/nav.spec.ts\nimport { test, expect } from \"./fixtures\";\n\ntest.describe(\"Sidebar Navigation\", () => {\n test(\"collapse sidebar and expand it by clicking settings gear icon\", async ({ page }) => {\n await page.goto(\"/\");\n await page.getByRole('button', { name: 'Collapse sidebar' }).click();\n await page.getByRole('navigation').getByRole('button').click();\n });\n});\n\n// Specifying this test case\n- Test case name: \"collapse sidebar and expand it by clicking settings gear icon\"\n- Suites: [\"Sidebar Navigation\"]\n- File path: \"tests/sidebar/nav.spec.ts\"\n</example_2>\n";
2
+ //# sourceMappingURL=test-case-def.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-case-def.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/test-case-def.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,47CAwCrC,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testCasesDefinitionPrompt = void 0;
4
+ exports.testCasesDefinitionPrompt = `
5
+ # Specifying test cases for tools/functions
6
+
7
+ Many tools and functions that you use require specifying a test case with the following properties:
8
+ - Test case name: Name of the test (specified to the "test(...)" method)
9
+ - Suites: Refers to describe blocks where this test is located, specified as an array of strings
10
+ - File path: Path to the file - must be relative to the repo directory
11
+
12
+ <example_1>
13
+ // Contents of tests/example.spec.ts
14
+ import { test, expect } from "./fixtures";
15
+
16
+ test("has title", async ({ page }) => {
17
+ await page.goto("https://playwright.dev/");
18
+ await expect(page).toHaveTitle(/Playwright/);
19
+ });
20
+
21
+ // Specifying this test case
22
+ - Test case name: "has title"
23
+ - Suites: [] (since this test has no describe blocks)
24
+ - File path: "tests/example.spec.ts"
25
+ </example_1>
26
+
27
+ <example_2>
28
+ // Contents of tests/sidebar/nav.spec.ts
29
+ import { test, expect } from "./fixtures";
30
+
31
+ test.describe("Sidebar Navigation", () => {
32
+ test("collapse sidebar and expand it by clicking settings gear icon", async ({ page }) => {
33
+ await page.goto("/");
34
+ await page.getByRole('button', { name: 'Collapse sidebar' }).click();
35
+ await page.getByRole('navigation').getByRole('button').click();
36
+ });
37
+ });
38
+
39
+ // Specifying this test case
40
+ - Test case name: "collapse sidebar and expand it by clicking settings gear icon"
41
+ - Suites: ["Sidebar Navigation"]
42
+ - File path: "tests/sidebar/nav.spec.ts"
43
+ </example_2>
44
+ `;
@@ -1,9 +1,8 @@
1
- import { IChatModel } from "@empiricalrun/llm/chat";
1
+ import { IChatCanonicalModel, IChatModel } from "@empiricalrun/llm/chat";
2
2
  import { Attachment, CanonicalMessage, ChatState, ChatStateError, PendingToolCall, SupportedChatModels, ToolResult } from "@empiricalrun/shared-types";
3
3
  export declare const CHAT_STATE_VERSIONS_MIGRATIONS_MAP: Record<string, (state: any) => any>;
4
4
  export declare const LATEST_CHAT_STATE_VERSION = "0.1";
5
5
  export declare const CHAT_STATE_PATH: string;
6
- export declare function clearChatState(): void;
7
6
  export declare function createChatState({ userPrompt, attachments, existingState, selectedModel, error, }: {
8
7
  userPrompt: string | undefined;
9
8
  attachments: Attachment[];
@@ -17,19 +16,20 @@ export declare function createChatStateForMessages({ messages, selectedModel, as
17
16
  askUserForInput: boolean;
18
17
  error: ChatStateError | null;
19
18
  }): ChatState;
20
- export declare function chatStateFromModel<T>({ chatModel, selectedModel, error, }: {
21
- chatModel: IChatModel<T>;
22
- selectedModel: SupportedChatModels;
19
+ export declare function chatStateFromModel<T>({ chatModel, error, }: {
20
+ chatModel: IChatModel<T> | IChatCanonicalModel;
23
21
  error: ChatStateError | null;
24
22
  }): ChatState;
25
- export declare function getUsageSummary(chatModel: IChatModel<CanonicalMessage>): string;
26
- export declare function loadChatState(): ChatState | undefined;
23
+ export declare function getUsageSummary(chatState: ChatState): string;
24
+ export declare function loadChatState({ resetChat, }: {
25
+ resetChat: boolean;
26
+ }): ChatState | undefined;
27
27
  /**
28
28
  * Migrates a chat state object from an old version to the latest version.
29
29
  * Add migration logic for each version as needed.
30
30
  */
31
31
  export declare function migrateChatState(oldState: any): ChatState;
32
- export declare function saveToDisk(messages: Array<CanonicalMessage>, selectedModel: SupportedChatModels, askUserForInput: boolean, error: ChatStateError | null): void;
32
+ export declare function saveToDisk(chatState: ChatState): void;
33
33
  export declare function getLatestDownloadBuildUrl(messages: CanonicalMessage[]): string | null;
34
34
  export declare function fetchToolCallFromId(toolCallId: String, messages: CanonicalMessage[]): {
35
35
  toolCallQueuedAt: Date | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,EAEnB,UAAU,EACX,MAAM,4BAA4B,CAAC;AA+BpC,eAAO,MAAM,kCAAkC,EAAE,MAAM,CACrD,MAAM,EACN,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAIpB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C,eAAO,MAAM,eAAe,QAI3B,CAAC;AAEF,wBAAgB,cAAc,SAQ7B;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE,mBAAmB,CAAC;IACnC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,aAYA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,aAAa,EACb,eAAe,EACf,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,GAAG,SAAS,CASZ;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EACpC,SAAS,EACT,aAAa,EACb,KAAK,GACN,EAAE;IACD,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,aAAa,EAAE,mBAAmB,CAAC;IACnC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,aAOA;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,UAAU,CAAC,gBAAgB,CAAC,GACtC,MAAM,CA0BR;AAED,wBAAgB,aAAa,IAAI,SAAS,GAAG,SAAS,CAarD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,SAAS,CAqBzD;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,EACjC,aAAa,EAAE,mBAAmB,EAClC,eAAe,EAAE,OAAO,EACxB,KAAK,EAAE,cAAc,GAAG,IAAI,QAgB7B;AA2BD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,MAAM,GAAG,IAAI,CAef;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,gBAAgB,EAAE,GAC3B;IACD,gBAAgB,EAAE,IAAI,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;CACpC,CA0BA"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,UAAU,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,EAEnB,UAAU,EACX,MAAM,4BAA4B,CAAC;AAMpC,eAAO,MAAM,kCAAkC,EAAE,MAAM,CACrD,MAAM,EACN,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAGpB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C,eAAO,MAAM,eAAe,QAI3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE,mBAAmB,CAAC;IACnC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,aAYA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,aAAa,EACb,eAAe,EACf,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,GAAG,SAAS,CASZ;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EACpC,SAAS,EACT,KAAK,GACN,EAAE;IACD,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;IAC/C,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B,aAOA;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CA0B5D;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,GACV,EAAE;IACD,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,SAAS,GAAG,SAAS,CAsBxB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,SAAS,CAqBzD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,QAQ9C;AA2BD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,MAAM,GAAG,IAAI,CAef;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,gBAAgB,EAAE,GAC3B;IACD,gBAAgB,EAAE,IAAI,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;CACpC,CA0BA"}
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CHAT_STATE_PATH = exports.LATEST_CHAT_STATE_VERSION = exports.CHAT_STATE_VERSIONS_MIGRATIONS_MAP = void 0;
7
- exports.clearChatState = clearChatState;
8
7
  exports.createChatState = createChatState;
9
8
  exports.createChatStateForMessages = createChatStateForMessages;
10
9
  exports.chatStateFromModel = chatStateFromModel;
@@ -17,43 +16,11 @@ exports.fetchToolCallFromId = fetchToolCallFromId;
17
16
  const chat_1 = require("@empiricalrun/llm/chat");
18
17
  const fs_1 = __importDefault(require("fs"));
19
18
  const path_1 = __importDefault(require("path"));
20
- // Migration wrapper for v20250327.1 -> v0.1 chat state versions
21
- // v20250327.1 was model-specific, but v0.1 is canonical
22
- function migrateToV01(oldState) {
23
- if (oldState.model &&
24
- typeof oldState.model === "string" &&
25
- Array.isArray(oldState.messages)) {
26
- const provider = (0, chat_1.getProviderForModel)(oldState.model);
27
- if (provider === "google") {
28
- return {
29
- ...oldState,
30
- version: "0.1",
31
- messages: oldState.messages.map(chat_1.geminiToCanonical),
32
- };
33
- }
34
- else {
35
- throw new Error(`Unsupported state for migration with model: ${oldState.model} and version: ${oldState.version}`);
36
- }
37
- }
38
- // If not Gemini or not matching, return the old state
39
- return oldState;
40
- }
41
19
  exports.CHAT_STATE_VERSIONS_MIGRATIONS_MAP = {
42
- "20250327.1": migrateToV01,
43
20
  "0.1": (state) => state,
44
21
  };
45
22
  exports.LATEST_CHAT_STATE_VERSION = "0.1";
46
23
  exports.CHAT_STATE_PATH = path_1.default.join(process.cwd(), ".empiricalrun", "last-chat.json");
47
- function clearChatState() {
48
- try {
49
- if (fs_1.default.existsSync(exports.CHAT_STATE_PATH)) {
50
- fs_1.default.unlinkSync(exports.CHAT_STATE_PATH);
51
- }
52
- }
53
- catch {
54
- // Swallow errors to avoid blocking the CLI; deletion is best-effort
55
- }
56
- }
57
24
  function createChatState({ userPrompt, attachments, existingState, selectedModel, error, }) {
58
25
  const messages = existingState?.messages || [];
59
26
  const chatModel = (0, chat_1.createChatModel)(messages, selectedModel);
@@ -77,16 +44,16 @@ function createChatStateForMessages({ messages, selectedModel, askUserForInput,
77
44
  error: error,
78
45
  };
79
46
  }
80
- function chatStateFromModel({ chatModel, selectedModel, error, }) {
47
+ function chatStateFromModel({ chatModel, error, }) {
81
48
  return createChatStateForMessages({
82
49
  messages: chatModel.messages,
83
- selectedModel,
50
+ selectedModel: chatModel.selectedModel,
84
51
  askUserForInput: chatModel.askUserForInput,
85
52
  error,
86
53
  });
87
54
  }
88
- function getUsageSummary(chatModel) {
89
- const messages = chatModel.messages;
55
+ function getUsageSummary(chatState) {
56
+ const messages = chatState.messages;
90
57
  const messageUsages = messages.map((msg) => msg.usage).filter(Boolean);
91
58
  const inputTokens = messageUsages.reduce((sum, usage) => sum + (usage?.tokens?.input || 0), 0);
92
59
  const outputTokens = messageUsages.reduce((sum, usage) => sum + (usage?.tokens?.output || 0), 0);
@@ -103,7 +70,17 @@ function getUsageSummary(chatModel) {
103
70
  Input: ${inputTokens.toLocaleString()} tokens / Output: ${outputTokens.toLocaleString()} tokens`;
104
71
  return msgsSummary;
105
72
  }
106
- function loadChatState() {
73
+ function loadChatState({ resetChat, }) {
74
+ if (resetChat) {
75
+ try {
76
+ if (fs_1.default.existsSync(exports.CHAT_STATE_PATH)) {
77
+ fs_1.default.unlinkSync(exports.CHAT_STATE_PATH);
78
+ }
79
+ }
80
+ catch {
81
+ // Swallow errors to avoid blocking the CLI; deletion is best-effort
82
+ }
83
+ }
107
84
  if (!fs_1.default.existsSync(exports.CHAT_STATE_PATH)) {
108
85
  return undefined;
109
86
  }
@@ -141,21 +118,14 @@ function migrateChatState(oldState) {
141
118
  ...migrated,
142
119
  };
143
120
  }
144
- function saveToDisk(messages, selectedModel, askUserForInput, error) {
121
+ function saveToDisk(chatState) {
145
122
  const statePath = exports.CHAT_STATE_PATH;
146
123
  // Ensure directory exists before trying to read/write
147
124
  const dirname = path_1.default.dirname(statePath);
148
125
  if (!fs_1.default.existsSync(dirname)) {
149
126
  fs_1.default.mkdirSync(dirname, { recursive: true });
150
127
  }
151
- // Use the helper to build the new state
152
- const newState = createChatStateForMessages({
153
- messages,
154
- selectedModel,
155
- askUserForInput,
156
- error,
157
- });
158
- fs_1.default.writeFileSync(statePath, JSON.stringify(newState, null, 2));
128
+ fs_1.default.writeFileSync(statePath, JSON.stringify(chatState, null, 2));
159
129
  }
160
130
  function findLatestToolCall(messages, toolName) {
161
131
  return messages
@@ -1,12 +1,11 @@
1
1
  import { TraceClient } from "@empiricalrun/llm";
2
- import { IChatModel } from "@empiricalrun/llm/chat";
3
- import { Attachment, ReporterFunction, SupportedChatModels } from "@empiricalrun/shared-types";
2
+ import { IChatCanonicalModel, IChatModel } from "@empiricalrun/llm/chat";
3
+ import { Attachment, ReporterFunction } from "@empiricalrun/shared-types";
4
4
  export declare const log: (...args: any[]) => void;
5
5
  export declare function getModelName(model: string): string;
6
- export declare function handleAgentError({ error, chatModel, selectedModel, reporter, trace, }: {
6
+ export declare function handleAgentError({ error, chatModel, reporter, trace, }: {
7
7
  error: unknown;
8
- chatModel: IChatModel<any>;
9
- selectedModel: SupportedChatModels;
8
+ chatModel: IChatModel<any> | IChatCanonicalModel;
10
9
  reporter: ReporterFunction;
11
10
  trace?: TraceClient;
12
11
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAuB,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,UAAU,EAEV,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAKpC,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,GAAG,EAAE,SAEjC,CAAC;AAcF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,gBAAgB,CAAC,EACrC,KAAK,EACL,SAAS,EACT,aAAa,EACb,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAC3B,aAAa,EAAE,mBAAmB,CAAC;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,iBAgBA;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CAsBA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAGL,mBAAmB,EACnB,UAAU,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EAEV,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAKpC,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,GAAG,EAAE,SAEjC,CAAC;AAcF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,gBAAgB,CAAC,EACrC,KAAK,EACL,SAAS,EACT,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC;IACjD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,iBAaA;AASD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CA4BA"}
@@ -29,31 +29,37 @@ function getModelName(model) {
29
29
  return model;
30
30
  return model;
31
31
  }
32
- async function handleAgentError({ error, chatModel, selectedModel, reporter, trace, }) {
32
+ async function handleAgentError({ error, chatModel, reporter, trace, }) {
33
33
  const errorObject = {
34
34
  message: error.message,
35
35
  stack: error.stack || "Stack trace not available",
36
36
  timestamp: new Date().toISOString(),
37
+ type: error instanceof chat_1.CanonicalError ? error.type : null,
37
38
  };
38
- await reporter((0, state_1.chatStateFromModel)({
39
- chatModel,
40
- selectedModel,
41
- error: errorObject,
42
- }), chatModel.getHumanReadableLatestMessage());
39
+ await reporter((0, state_1.chatStateFromModel)({ chatModel, error: errorObject }), chatModel.getHumanReadableLatestMessage());
43
40
  trace?.update({ output: { error: errorObject } });
44
41
  logError(error, trace);
45
42
  }
43
+ const VALID_ATTACHMENTS = [".webm", ".png"];
44
+ const MIME_MAP = {
45
+ ".webm": "video/webm",
46
+ ".png": "image/png",
47
+ };
46
48
  function extractAttachments(userPrompt) {
47
49
  const attachments = [];
48
50
  const urlPattern = /\[\[(https?:\/\/[^\]]+)\]\]/g;
49
51
  let match;
50
52
  while ((match = urlPattern.exec(userPrompt)) !== null) {
51
53
  const name = match[1].split("/").pop();
52
- if (!name || !name.endsWith(".webm")) {
53
- throw new Error(`Invalid attachment name: ${name}. Only .webm files are supported.`);
54
+ const ext = name ? name.substring(name.lastIndexOf(".")) : null;
55
+ if (!ext) {
56
+ throw new Error(`Attachment URL does not have a valid file extension: ${match[1]}`);
57
+ }
58
+ if (!name || !VALID_ATTACHMENTS.some((validExt) => ext === validExt)) {
59
+ throw new Error(`Invalid attachment name: ${name}. Only ${VALID_ATTACHMENTS.join(", ")} files are supported.`);
54
60
  }
55
61
  attachments.push({
56
- contentType: "video/webm",
62
+ contentType: MIME_MAP[ext],
57
63
  name,
58
64
  url: match[1],
59
65
  });
@@ -0,0 +1,11 @@
1
+ import { AgentModeEnum, SupportedChatModels } from "@empiricalrun/shared-types";
2
+ export declare function fetchEnvironmentVariables(): Promise<Record<string, string>>;
3
+ export declare function runChatAgentForCLI({ useDiskForChatState, selectedModel, initialPromptContent, agentMode, resetChat, useFSCache, }: {
4
+ selectedModel: SupportedChatModels;
5
+ useDiskForChatState: boolean;
6
+ initialPromptContent: string | undefined;
7
+ agentMode: AgentModeEnum;
8
+ useFSCache: boolean;
9
+ resetChat: boolean;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/agent/cli.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAKb,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AA+BpC,wBAAsB,yBAAyB,IAAI,OAAO,CACxD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,CAkCA;AAED,wBAAsB,kBAAkB,CAAC,EACvC,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,SAAS,EACT,UAAU,GACX,EAAE;IACD,aAAa,EAAE,mBAAmB,CAAC;IACnC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB,iBA2KA"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchEnvironmentVariables = fetchEnvironmentVariables;
4
+ exports.runChatAgentForCLI = runChatAgentForCLI;
5
+ const llm_1 = require("@empiricalrun/llm");
6
+ const picocolors_1 = require("picocolors");
7
+ const client_1 = require("../dashboard/client");
8
+ const reader_1 = require("../file-info/adapters/file-system/reader");
9
+ const human_in_the_loop_1 = require("../human-in-the-loop");
10
+ const validation_1 = require("../recorder/validation");
11
+ const executor_1 = require("../tools/executor");
12
+ const git_1 = require("../tools/executor/utils/git");
13
+ const state_1 = require("./chat/state");
14
+ const utils_1 = require("./chat/utils");
15
+ const index_1 = require("./index");
16
+ function stopCriteria(userPrompt) {
17
+ return userPrompt?.toLowerCase() === "stop";
18
+ }
19
+ function concludeAgent(agent, useDiskForChatState) {
20
+ const chatState = agent.chatState;
21
+ console.log(`\n${(0, picocolors_1.gray)("Usage summary -> " + (0, state_1.getUsageSummary)(chatState))}`);
22
+ if (useDiskForChatState) {
23
+ (0, state_1.saveToDisk)(chatState);
24
+ }
25
+ }
26
+ async function fetchEnvironmentVariables() {
27
+ const projectApiKey = process.env.EMPIRICALRUN_API_KEY;
28
+ let apiClient;
29
+ let queryParams = {};
30
+ if (projectApiKey) {
31
+ apiClient = new client_1.DashboardAPIClient({
32
+ authType: "project-api-key",
33
+ projectApiKey: process.env.EMPIRICALRUN_API_KEY,
34
+ });
35
+ }
36
+ else {
37
+ apiClient = new client_1.DashboardAPIClient({
38
+ authType: "user-access-token",
39
+ });
40
+ const repoName = await (0, validation_1.validatePackageJson)(process.cwd());
41
+ queryParams = { project_repo_name: repoName };
42
+ }
43
+ const data = await apiClient.request("/api/environment-variables", { method: "GET", params: queryParams });
44
+ if (!data.data || !data.data.environment_variables) {
45
+ console.error("Failed to fetch environment variables:", data);
46
+ throw new Error("Failed to fetch environment variables");
47
+ }
48
+ const envVars = data.data.environment_variables.reduce((acc, envVar) => {
49
+ acc[envVar.name] = envVar.value;
50
+ return acc;
51
+ }, {});
52
+ return envVars;
53
+ }
54
+ async function runChatAgentForCLI({ useDiskForChatState, selectedModel, initialPromptContent, agentMode, resetChat, useFSCache, }) {
55
+ const enableStreaming = !useFSCache;
56
+ // TODO: Implement cache support in BaseAgent
57
+ // const cache = useFSCache ? new FilesystemLLMCache() : undefined;
58
+ // TODO: Store branch name in chat state so that we don't recreate it every time
59
+ const randomId = crypto.randomUUID().substring(0, 8);
60
+ const branchName = `branch-${randomId}`;
61
+ await (0, git_1.checkoutBranch)(branchName, process.cwd());
62
+ let chatState;
63
+ if (useDiskForChatState) {
64
+ chatState = (0, state_1.loadChatState)({ resetChat });
65
+ }
66
+ if (chatState && chatState.error) {
67
+ // Reset error state as we are attempting a retry
68
+ chatState.error = null;
69
+ }
70
+ if (initialPromptContent) {
71
+ if (!chatState) {
72
+ const { text, attachments } = (0, utils_1.extractAttachments)(initialPromptContent);
73
+ chatState = (0, state_1.createChatState)({
74
+ userPrompt: text,
75
+ attachments: attachments,
76
+ existingState: undefined,
77
+ selectedModel,
78
+ error: null,
79
+ });
80
+ }
81
+ else {
82
+ console.warn(`Ignoring initial prompt because we have existing chat state.`);
83
+ }
84
+ }
85
+ if (!chatState) {
86
+ chatState = (0, state_1.createChatState)({
87
+ userPrompt: undefined,
88
+ attachments: [],
89
+ selectedModel,
90
+ existingState: undefined,
91
+ error: null,
92
+ });
93
+ }
94
+ const handleSigInt = () => {
95
+ concludeAgent(agent, useDiskForChatState);
96
+ process.exit(0);
97
+ };
98
+ process.once("SIGINT", handleSigInt);
99
+ process.once("SIGTERM", handleSigInt);
100
+ let userPrompt;
101
+ let reporterFunc = async (chatState, latest) => {
102
+ if (useDiskForChatState) {
103
+ (0, state_1.saveToDisk)(chatState);
104
+ }
105
+ if (latest) {
106
+ if (!enableStreaming) {
107
+ console.log(`${(0, picocolors_1.blue)(latest.role)}: ${latest.textMessage}`);
108
+ }
109
+ else {
110
+ process.stdout.write(`\n`);
111
+ }
112
+ }
113
+ };
114
+ const trace = (0, llm_1.createLangfuseTrace)({
115
+ name: "chat_agent",
116
+ input: initialPromptContent || "",
117
+ tags: [selectedModel, "chat_agent"],
118
+ });
119
+ if (trace) {
120
+ const traceUrl = trace.getTraceUrl();
121
+ console.log(`Starting ${selectedModel}: ${traceUrl}`);
122
+ }
123
+ let authType = "user-access-token";
124
+ if (process.env.EMPIRICALRUN_API_KEY) {
125
+ authType = "project-api-key";
126
+ }
127
+ const apiClient = new client_1.DashboardAPIClient({
128
+ authType,
129
+ });
130
+ const toolExecutor = new executor_1.ToolExecutor({
131
+ chatSession: { branchName },
132
+ repoPath: process.cwd(),
133
+ apiClient,
134
+ trace,
135
+ featureFlags: [],
136
+ environmentOverrides: await fetchEnvironmentVariables(),
137
+ });
138
+ const fileInfoBuilder = () => (0, reader_1.getFileInfoFromFS)(process.cwd());
139
+ const agentParams = {
140
+ selectedModel,
141
+ featureFlags: [],
142
+ chatState,
143
+ toolExecutor,
144
+ };
145
+ const agent = index_1.MODE_TO_AGENT_MAP[agentMode]({ ...agentParams });
146
+ if (agent.askUserForInput) {
147
+ // Show last message to the user for context when we loaded from disk
148
+ const latest = agent.getHumanReadableLatestMessage();
149
+ if (latest) {
150
+ console.log(`${(0, picocolors_1.blue)(latest.role)}: ${latest.textMessage}`);
151
+ }
152
+ }
153
+ while (!stopCriteria(userPrompt)) {
154
+ if (agent.askUserForInput) {
155
+ try {
156
+ userPrompt = await human_in_the_loop_1.humanLoop.getFeedback({
157
+ message: "User:",
158
+ });
159
+ }
160
+ catch (e) {
161
+ // https://github.com/SBoudrias/Inquirer.js/issues/1502#issuecomment-2275991680
162
+ if (e instanceof Error && e.name === "ExitPromptError") {
163
+ concludeAgent(agent, useDiskForChatState);
164
+ process.exit(0);
165
+ }
166
+ concludeAgent(agent, useDiskForChatState);
167
+ throw e;
168
+ }
169
+ if (!stopCriteria(userPrompt)) {
170
+ const { text, attachments } = (0, utils_1.extractAttachments)(userPrompt);
171
+ agent.pushUserMessage(text, attachments);
172
+ }
173
+ }
174
+ else {
175
+ await agent.runLoop({
176
+ reporter: reporterFunc,
177
+ streamingMessageReporter: (() => {
178
+ if (!enableStreaming) {
179
+ return;
180
+ }
181
+ let hasStarted = false;
182
+ let startedRole = undefined;
183
+ return async (delta, snapshot, thinking) => {
184
+ if (delta) {
185
+ const role = thinking ? "Thinking" : "Assistant";
186
+ if (!hasStarted) {
187
+ process.stdout.write(`${(0, picocolors_1.blue)(role)}: `);
188
+ hasStarted = true;
189
+ startedRole = role;
190
+ }
191
+ else if (hasStarted && role !== startedRole) {
192
+ // Changing from thinking -> text block
193
+ process.stdout.write("\n");
194
+ process.stdout.write(`${(0, picocolors_1.blue)(role)}: `);
195
+ startedRole = role;
196
+ }
197
+ process.stdout.write(delta);
198
+ }
199
+ };
200
+ })(),
201
+ trace,
202
+ repoInfoBuilder: fileInfoBuilder,
203
+ onPendingToolCall: async (toolCalls) => {
204
+ const { toolResults, checkpoint } = await toolExecutor.execute(toolCalls);
205
+ agent.processToolResults(toolCalls, toolResults, checkpoint);
206
+ },
207
+ });
208
+ }
209
+ }
210
+ trace?.update({ output: { messages: agent.messages } });
211
+ await llm_1.langfuseInstance?.flushAsync();
212
+ console.log(`\n${(0, picocolors_1.gray)("Usage summary -> " + (0, state_1.getUsageSummary)(agent.chatState))}`);
213
+ }
@@ -0,0 +1,5 @@
1
+ import { BaseToolExecutor, BaseToolExecutorProps } from "../../../tools/executor/base";
2
+ export declare class CodeReviewToolExecutor extends BaseToolExecutor {
3
+ constructor(params: Omit<BaseToolExecutorProps, "tools">);
4
+ }
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/agent/code-review/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,8BAA8B,CAAC;AAItC,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC9C,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;CAIzD"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeReviewToolExecutor = void 0;
4
+ const base_1 = require("../../../tools/executor/base");
5
+ const fetch_session_diff_1 = require("../../../tools/fetch-session-diff");
6
+ const file_operations_1 = require("../../../tools/file-operations");
7
+ class CodeReviewToolExecutor extends base_1.BaseToolExecutor {
8
+ constructor(params) {
9
+ const tools = [fetch_session_diff_1.fetchSessionDiffTool, ...file_operations_1.viewOnlyTools];
10
+ super({ ...params, tools });
11
+ }
12
+ }
13
+ exports.CodeReviewToolExecutor = CodeReviewToolExecutor;
@@ -0,0 +1,12 @@
1
+ import type { ToolsForLLM } from "@empiricalrun/shared-types";
2
+ import { BaseAgent } from "../base";
3
+ import { type CodeReviewResultV0, type CodeReviewResultV1, type CodeReviewResultV2, CodeReviewSeverity, CodeReviewVerdict } from "./types";
4
+ export type { CodeReviewResultV1, CodeReviewResultV0, CodeReviewResultV2 };
5
+ export { CodeReviewVerdict, CodeReviewSeverity };
6
+ export type CodeReviewVersionedResult = CodeReviewResultV1 | CodeReviewResultV0 | CodeReviewResultV2;
7
+ export declare class CodeReviewAgent extends BaseAgent {
8
+ protected getTools(): ToolsForLLM;
9
+ getResult(): CodeReviewVersionedResult | undefined;
10
+ protected buildSystemPrompt(repoContext: string): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/code-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG/E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AACjD,MAAM,MAAM,yBAAyB,GACjC,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,SAAS,CAAC,QAAQ,IAAI,WAAW;IAWjC,SAAS,IAAI,yBAAyB,GAAG,SAAS;cAmBlC,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuHxE"}