@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
@@ -6,181 +6,213 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GitHubFileReader = void 0;
7
7
  exports.getFileInfoFromGitHub = getFileInfoFromGitHub;
8
8
  const path_1 = __importDefault(require("path"));
9
- const dashboard_1 = require("../../../dashboard");
10
- const REPO_OWNER = "empirical-run";
11
9
  class GitHubFileReader {
12
10
  repoName;
13
11
  apiClient;
14
- repoOwner;
15
- constructor(repoName, apiClient, repoOwner) {
12
+ constructor(repoName, apiClient) {
16
13
  this.repoName = repoName;
17
14
  this.apiClient = apiClient;
18
- this.repoOwner = repoOwner;
19
- }
20
- async fetchFileFromGitHub(filePath, branch) {
21
- return (await this.apiClient.callGitHubProxy({
22
- method: "GET",
23
- url: `/repos/${this.repoOwner}/${this.repoName}/contents/${filePath}?ref=${branch}`,
24
- }));
25
- }
26
- async fetchTreeFromGitHub(branch) {
27
- return (await this.apiClient.callGitHubProxy({
28
- method: "GET",
29
- url: `/repos/${this.repoOwner}/${this.repoName}/git/trees/${branch}?recursive=1`,
30
- }));
31
15
  }
32
16
  async resolveBranchName(branchName, baseBranch) {
33
17
  if (!branchName || branchName === baseBranch) {
34
18
  return baseBranch;
35
19
  }
36
20
  try {
37
- // Try to fetch the branch to see if it exists
38
21
  await this.apiClient.callGitHubProxy({
39
22
  method: "GET",
40
- url: `/repos/${this.repoOwner}/${this.repoName}/branches/${branchName}`,
23
+ url: `/repos/empirical-run/${this.repoName}/branches/${branchName}`,
41
24
  });
25
+ console.log(`[GitHubFileReader] Branch ${branchName} exists`);
42
26
  return branchName;
43
27
  }
44
28
  catch {
45
- // Branch doesn't exist, fallback to base branch
29
+ console.log(`[GitHubFileReader] Branch ${branchName} not found, falling back to ${baseBranch}`);
46
30
  return baseBranch;
47
31
  }
48
32
  }
49
33
  async readFile(filePath, branchName, baseBranch) {
50
- const branch = await this.resolveBranchName(branchName, baseBranch);
51
- const normalizedPath = filePath === "" ? "." : filePath;
34
+ const resolvedBranch = await this.resolveBranchName(branchName, baseBranch);
35
+ // Check if path has file extension - if not, treat as directory
36
+ const hasFileExtension = path_1.default.extname(filePath) !== "";
37
+ if (!hasFileExtension) {
38
+ console.log(`[GitHubFileReader] Reading as directory: ${filePath}`);
39
+ return this.readDirectory(filePath, resolvedBranch);
40
+ }
52
41
  try {
53
- const response = await this.fetchFileFromGitHub(normalizedPath, branch);
54
- const isDirectory = Array.isArray(response);
55
- if (!isDirectory) {
56
- if (response.type === "file" && response.content) {
57
- const content = Buffer.from(response.content, "base64").toString("utf-8");
58
- return {
59
- content,
60
- isDirectory: false,
61
- };
62
- }
63
- }
64
- else {
42
+ console.log(`[GitHubFileReader] Reading as file: ${filePath}, resolved branch: ${resolvedBranch}`);
43
+ const params = {
44
+ repo: this.repoName,
45
+ path: filePath,
46
+ ref: resolvedBranch,
47
+ };
48
+ const response = await this.apiClient.request(`/api/github/files`, {
49
+ method: "GET",
50
+ params,
51
+ });
52
+ if (response.data?.fileContents.available) {
65
53
  return {
66
- content: response.map((item) => item.name).join("\n"),
67
- isDirectory: true,
54
+ content: response.data.fileContents.content,
55
+ isDirectory: false,
68
56
  };
69
57
  }
58
+ console.log(`[GitHubFileReader] File not available: ${filePath}`);
59
+ // For file paths (with extensions), don't fall back to directory reading
60
+ return null;
70
61
  }
71
62
  catch (error) {
72
- if (error instanceof dashboard_1.NonRetryableHTTPError && error.status === 404) {
73
- return null; // File or directory not found
74
- }
75
- throw error; // Re-throw other errors
63
+ console.log(`[GitHubFileReader] Error reading file ${filePath}:`, error);
64
+ // For file paths, return null (file not found)
65
+ return null;
76
66
  }
77
- return null;
78
67
  }
79
- async getFileContent(path, branchName, baseBranch) {
80
- const branch = await this.resolveBranchName(branchName, baseBranch);
81
- const response = await this.fetchFileFromGitHub(path, branch);
82
- const isDirectory = Array.isArray(response);
83
- if (isDirectory) {
84
- throw new Error(`${path} is a directory, not a file`);
68
+ async readDirectory(filePath, resolvedBranch) {
69
+ try {
70
+ console.log(`[GitHubFileReader] Reading directory: ${filePath}, resolved branch: ${resolvedBranch}`);
71
+ const params = {
72
+ repo: this.repoName,
73
+ path: filePath || ".", // Handle empty path
74
+ ref: resolvedBranch,
75
+ };
76
+ const treeResponse = await this.apiClient.request(`/api/github/tree`, {
77
+ method: "GET",
78
+ params,
79
+ });
80
+ if (treeResponse.data?.tree) {
81
+ const targetPath = filePath === "." || filePath === "" ? "" : filePath;
82
+ const files = treeResponse.data.tree.tree
83
+ .map((item) => item.path)
84
+ .filter((itemPath) => {
85
+ if (!itemPath)
86
+ return false;
87
+ // Check if item is a direct child of the target directory
88
+ const itemDir = path_1.default.dirname(itemPath);
89
+ // Normalize "." to "" for root directory comparison
90
+ const normalizedItemDir = itemDir === "." ? "" : itemDir;
91
+ return normalizedItemDir === targetPath;
92
+ })
93
+ .map((itemPath) => path_1.default.basename(itemPath))
94
+ .sort()
95
+ .join("\n");
96
+ if (files.length === 0) {
97
+ // No files means directory is invalid
98
+ return null;
99
+ }
100
+ else {
101
+ return { content: files, isDirectory: true };
102
+ }
103
+ }
85
104
  }
86
- if (response.type === "file" && response.content) {
87
- return Buffer.from(response.content, "base64").toString("utf-8");
105
+ catch (error) {
106
+ console.log(`[GitHubFileReader] Error reading directory ${filePath}:`, error);
88
107
  }
89
- throw new Error(`Unable to fetch file content for ${path}`);
108
+ return null;
90
109
  }
91
- async getContentsForDirectory(path, branchName, baseBranch) {
92
- const branch = await this.resolveBranchName(branchName, baseBranch);
93
- const response = await this.fetchTreeFromGitHub(branch);
94
- if (response.tree) {
95
- // Convert to expected RepoTree format
96
- return {
97
- sha: response.sha,
98
- truncated: false,
99
- tree: response.tree.map((item) => ({
100
- path: item.path || "",
101
- mode: item.mode || "",
102
- type: item.type === "blob" ? "blob" : "tree",
103
- sha: item.sha,
104
- })),
105
- };
106
- }
107
- throw new Error(`Unable to fetch directory contents for ${path}`);
110
+ }
111
+ exports.GitHubFileReader = GitHubFileReader;
112
+ async function getFileContent(repoName, path, apiClient, branchName) {
113
+ const params = {
114
+ repo: repoName,
115
+ path: path,
116
+ };
117
+ if (branchName) {
118
+ params.ref = branchName;
119
+ }
120
+ const response = await apiClient.request(`/api/github/files`, {
121
+ method: "GET",
122
+ params,
123
+ });
124
+ if (!response.data) {
125
+ throw new Error(`Unable to fetch file for FileInfo`);
108
126
  }
109
- async getFileInfo(branchName, baseBranch) {
110
- const rootPath = "";
111
- const files = await this.getContentsForDirectory(rootPath, branchName, baseBranch);
112
- const root = [];
113
- const nodeMap = {};
114
- if (!files) {
115
- return {
127
+ return response.data.fileContents.content;
128
+ }
129
+ async function getContentsForDirectory({ repo, path, }, apiClient, branchName) {
130
+ const params = {
131
+ repo: repo,
132
+ path: path,
133
+ };
134
+ if (branchName) {
135
+ params.ref = branchName;
136
+ }
137
+ const response = await apiClient.request(`/api/github/tree`, {
138
+ method: "GET",
139
+ params,
140
+ });
141
+ if (!response.data) {
142
+ throw new Error(`Unable to fetch file for FileInfo`);
143
+ }
144
+ return response.data.tree;
145
+ }
146
+ async function getFileInfoFromGitHub(repoName, apiClient, branchName, baseBranchName) {
147
+ const fileReader = new GitHubFileReader(repoName, apiClient);
148
+ const resolvedBranch = await fileReader.resolveBranchName(branchName, baseBranchName);
149
+ const files = await getContentsForDirectory({ repo: repoName, path: "" }, apiClient, resolvedBranch);
150
+ const root = [];
151
+ const nodeMap = {};
152
+ if (!files) {
153
+ return {
154
+ type: "directory",
155
+ path: repoName,
156
+ name: repoName,
157
+ children: [],
158
+ };
159
+ }
160
+ files.tree.forEach((file) => {
161
+ if (!file.path) {
162
+ return;
163
+ }
164
+ const pathParts = file.path.split("/");
165
+ const fileName = path_1.default.basename(file.path);
166
+ const isFile = file.type === "blob";
167
+ const currentPath = file.path;
168
+ const currentNode = isFile
169
+ ? {
170
+ type: "file",
171
+ path: currentPath,
172
+ name: fileName,
173
+ getContent: async () => getFileContent(repoName, currentPath, apiClient, resolvedBranch),
174
+ }
175
+ : {
116
176
  type: "directory",
117
- path: this.repoName,
118
- name: this.repoName,
177
+ path: currentPath,
178
+ name: fileName,
119
179
  children: [],
120
180
  };
181
+ nodeMap[currentPath] = currentNode;
182
+ if (pathParts.length === 1) {
183
+ root.push(currentNode);
121
184
  }
122
- files.tree.forEach((file) => {
123
- if (!file.path) {
124
- return;
125
- }
126
- const pathParts = file.path.split("/");
127
- const fileName = path_1.default.basename(file.path);
128
- const isFile = file.type === "blob";
129
- const currentPath = file.path;
130
- const currentNode = isFile
131
- ? {
132
- type: "file",
133
- path: currentPath,
134
- name: fileName,
135
- getContent: async () => this.getFileContent(currentPath, branchName, baseBranch),
136
- }
137
- : {
185
+ else {
186
+ const parentPath = path_1.default.dirname(currentPath);
187
+ if (!nodeMap[parentPath]) {
188
+ const parentNode = {
138
189
  type: "directory",
139
- path: currentPath,
140
- name: fileName,
190
+ path: parentPath,
191
+ name: parentPath.split("/").pop() || "",
141
192
  children: [],
142
193
  };
143
- nodeMap[currentPath] = currentNode;
144
- if (pathParts.length === 1) {
145
- root.push(currentNode);
146
- }
147
- else {
148
- const parentPath = path_1.default.dirname(currentPath);
149
- if (!nodeMap[parentPath]) {
150
- const parentNode = {
151
- type: "directory",
152
- path: parentPath,
153
- name: parentPath.split("/").pop() || "",
154
- children: [],
155
- };
156
- nodeMap[parentPath] = parentNode;
157
- const parentPathParts = parentPath.split("/");
158
- if (parentPathParts.length === 1) {
159
- root.push(parentNode);
160
- }
161
- else {
162
- const grandparentPath = path_1.default.dirname(parentPath);
163
- if (nodeMap[grandparentPath] &&
164
- nodeMap[grandparentPath].type === "directory") {
165
- nodeMap[grandparentPath].children.push(parentNode);
166
- }
167
- }
194
+ nodeMap[parentPath] = parentNode;
195
+ const parentPathParts = parentPath.split("/");
196
+ if (parentPathParts.length === 1) {
197
+ root.push(parentNode);
168
198
  }
169
- if (nodeMap[parentPath].type === "directory") {
170
- nodeMap[parentPath].children.push(currentNode);
199
+ else {
200
+ const grandparentPath = path_1.default.dirname(parentPath);
201
+ if (nodeMap[grandparentPath] &&
202
+ nodeMap[grandparentPath].type === "directory") {
203
+ nodeMap[grandparentPath].children.push(parentNode);
204
+ }
171
205
  }
172
206
  }
173
- });
174
- return {
175
- type: "directory",
176
- path: this.repoName,
177
- name: this.repoName,
178
- children: root,
179
- };
180
- }
181
- }
182
- exports.GitHubFileReader = GitHubFileReader;
183
- async function getFileInfoFromGitHub(repoName, apiClient, branchName, baseBranch) {
184
- const fileReader = new GitHubFileReader(repoName, apiClient, REPO_OWNER);
185
- return fileReader.getFileInfo(branchName, baseBranch);
207
+ if (nodeMap[parentPath].type === "directory") {
208
+ nodeMap[parentPath].children.push(currentNode);
209
+ }
210
+ }
211
+ });
212
+ return {
213
+ type: "directory",
214
+ path: repoName,
215
+ name: repoName,
216
+ children: root,
217
+ };
186
218
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYhD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAsBjF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,GAAG,YAAY,EAC5B,KAAK,CAAC,EAAE,SAAS,iBA0DlB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,IAAI,iBAY7C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYhD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAsBjF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,GAAG,YAAY,EAC5B,KAAK,CAAC,EAAE,SAAS,iBA0DlB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,IAAI,iBAY7C"}
@@ -0,0 +1,5 @@
1
+ import type { Tool } from "@empiricalrun/shared-types";
2
+ import type { z } from "zod";
3
+ import { analyseVideoSchema } from "../definitions/analyse-video";
4
+ export declare const analyseVideo: Tool<z.infer<typeof analyseVideoSchema>>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/analyse-video/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,IAAI,EAGL,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAK7B,OAAO,EACL,kBAAkB,EAEnB,MAAM,8BAA8B,CAAC;AAiBtC,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAsCjE,CAAC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyseVideo = void 0;
4
+ const constants_1 = require("../../constants");
5
+ const hash_1 = require("../../utils/hash");
6
+ const video_core_1 = require("../../video-core");
7
+ const utils_1 = require("../../video-core/utils");
8
+ const analyse_video_1 = require("../definitions/analyse-video");
9
+ function getVideoAnalysisParams(params) {
10
+ return {
11
+ model: params?.model || constants_1.VIDEO_ANALYSIS.DEFAULT_MODEL,
12
+ fps: params?.fps ?? constants_1.VIDEO_ANALYSIS.DEFAULT_FPS,
13
+ threshold: params?.threshold ?? constants_1.VIDEO_ANALYSIS.DEFAULT_THRESHOLD,
14
+ startTime: params?.startTime,
15
+ duration: params?.duration,
16
+ };
17
+ }
18
+ exports.analyseVideo = {
19
+ ...analyse_video_1.analyseVideo,
20
+ execute: async ({ input, featureFlags, repoPath }) => {
21
+ const { videoUrl } = input;
22
+ const params = getVideoAnalysisParams(input.params);
23
+ const videoUrlHash = (0, hash_1.createHashBasedOnParams)(videoUrl, params);
24
+ const validationResult = await (0, utils_1.validateVideoAccess)(videoUrl);
25
+ if (!validationResult.isValid) {
26
+ return {
27
+ result: validationResult.error,
28
+ isError: true,
29
+ };
30
+ }
31
+ const { result, isError, interleaved_tool_result } = await (0, video_core_1.runVideoAnalysis)({
32
+ videoUrl,
33
+ videoUrlHash,
34
+ params,
35
+ featureFlags,
36
+ workingDirectory: repoPath,
37
+ });
38
+ const finalResult = [
39
+ {
40
+ type: "text",
41
+ text: JSON.stringify(result),
42
+ },
43
+ ...interleaved_tool_result,
44
+ ];
45
+ return {
46
+ isError: isError,
47
+ result: finalResult,
48
+ };
49
+ },
50
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/create-pull-request/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AA6BvD,eAAO,MAAM,qBAAqB,EAAE,IAwDnC,CAAC"}
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createPullRequestTool = void 0;
4
4
  const zod_1 = require("zod");
5
+ const utils_1 = require("../executor/utils");
6
+ const utils_2 = require("./utils");
7
+ const REPO_OWNER = "empirical-run";
5
8
  const createPullRequestSchema = zod_1.z.object({
6
9
  pullRequestTitle: zod_1.z
7
10
  .string()
@@ -27,5 +30,29 @@ Don't ask the user for this information, just come up with it yourself.
27
30
  parameters: createPullRequestSchema,
28
31
  },
29
32
  needsBrowser: false,
30
- isInlineTool: false,
33
+ isInlineTool: true,
34
+ execute: async ({ input, apiClient, chatSession }) => {
35
+ const owner = REPO_OWNER;
36
+ try {
37
+ const valids = await (0, utils_2.validateInputs)({ input, apiClient, chatSession });
38
+ const { pullRequestTitle, pullRequestDescription, branchName } = valids;
39
+ const repo = await (0, utils_2.getRepoName)(chatSession, apiClient);
40
+ const existingPR = await (0, utils_1.getExistingPR)({
41
+ owner,
42
+ repo,
43
+ branchName,
44
+ apiClient: apiClient,
45
+ });
46
+ const toolResponse = existingPR
47
+ ? await (0, utils_2.handleExistingPullRequest)(existingPR, owner, repo, pullRequestDescription, chatSession, apiClient)
48
+ : await (0, utils_2.handleNewPullRequest)(owner, repo, pullRequestTitle, branchName, chatSession, pullRequestDescription, apiClient);
49
+ return toolResponse;
50
+ }
51
+ catch (error) {
52
+ return {
53
+ isError: true,
54
+ result: `Failed to commit and push changes: ${error instanceof Error ? error.message : String(error)}`,
55
+ };
56
+ }
57
+ },
31
58
  };
@@ -0,0 +1,21 @@
1
+ import { ChatSessionInfo, IDashboardAPIClient } from "@empiricalrun/shared-types";
2
+ export interface ValidatedInputs {
3
+ pullRequestTitle: string;
4
+ pullRequestDescription: string;
5
+ branchName: string;
6
+ }
7
+ export declare function validateInputs({ input, apiClient, chatSession, }: any): Promise<ValidatedInputs>;
8
+ export declare function getRepoName(chatSession: ChatSessionInfo | null | undefined, apiClient: IDashboardAPIClient): Promise<string>;
9
+ export declare function getMergeableStateInfo(owner: string, repo: string, pullRequest: any, apiClient: any): Promise<{
10
+ mergeableState: "unknown" | "dirty" | "clean" | "unstable";
11
+ stateDescription: string;
12
+ }>;
13
+ export declare function handleExistingPullRequest(pullRequest: any, owner: string, repo: string, pullRequestDescription: string, chatSession: any, apiClient: any): Promise<{
14
+ isError: boolean;
15
+ result: string;
16
+ }>;
17
+ export declare function handleNewPullRequest(owner: string, repo: string, pullRequestTitle: string, branchName: string, chatSession: any, pullRequestDescription: string, apiClient: any): Promise<{
18
+ isError: boolean;
19
+ result: string;
20
+ }>;
21
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/create-pull-request/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAUpC,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,EACnC,KAAK,EACL,SAAS,EACT,WAAW,GACZ,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAehC;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC/C,SAAS,EAAE,mBAAmB,GAC7B,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,GAAG;;;GAUf;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,GAAG,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,sBAAsB,EAAE,MAAM,EAC9B,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,GAAG;;;GAqBf;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,GAAG,EAChB,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,GAAG;;;GAuBf"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateInputs = validateInputs;
4
+ exports.getRepoName = getRepoName;
5
+ exports.getMergeableStateInfo = getMergeableStateInfo;
6
+ exports.handleExistingPullRequest = handleExistingPullRequest;
7
+ exports.handleNewPullRequest = handleNewPullRequest;
8
+ const utils_1 = require("../executor/utils");
9
+ const pr_description_1 = require("../executor/utils/pr-description");
10
+ async function validateInputs({ input, apiClient, chatSession, }) {
11
+ const { pullRequestTitle, pullRequestDescription } = input;
12
+ const branchName = chatSession?.branchName;
13
+ if (!apiClient) {
14
+ throw new Error("Dashboard API client is not available.");
15
+ }
16
+ if (!branchName) {
17
+ throw new Error("Branch name is not available in the chat session.");
18
+ }
19
+ return {
20
+ pullRequestTitle,
21
+ pullRequestDescription,
22
+ branchName,
23
+ };
24
+ }
25
+ async function getRepoName(chatSession, apiClient) {
26
+ if (!chatSession?.id) {
27
+ throw new Error("Cannot create pull request without repo name or chat session ID.");
28
+ }
29
+ try {
30
+ const url = `/api/chat-sessions/${chatSession.id}/details`;
31
+ const sessionDetails = await apiClient.request(url, { method: "GET" });
32
+ if ("error" in sessionDetails) {
33
+ throw new Error(`Failed to fetch session details: ${sessionDetails.error}`);
34
+ }
35
+ if (!sessionDetails.gitPayload?.repoName) {
36
+ throw new Error("Repository name not found in session details.");
37
+ }
38
+ return sessionDetails.gitPayload.repoName;
39
+ }
40
+ catch (error) {
41
+ throw new Error(`Failed to fetch repository name: ${error instanceof Error ? error.message : String(error)}`);
42
+ }
43
+ }
44
+ async function getMergeableStateInfo(owner, repo, pullRequest, apiClient) {
45
+ const mergeableState = await (0, utils_1.getMergeableState)({
46
+ owner,
47
+ repo,
48
+ pullRequest,
49
+ apiClient,
50
+ });
51
+ const stateDescription = (0, utils_1.getMergeableStateDescription)(mergeableState);
52
+ return { mergeableState, stateDescription };
53
+ }
54
+ async function handleExistingPullRequest(pullRequest, owner, repo, pullRequestDescription, chatSession, apiClient) {
55
+ const updatedPR = await (0, utils_1.updatePullRequest)({
56
+ owner,
57
+ repo,
58
+ prNumber: pullRequest.number,
59
+ body: (0, pr_description_1.addMetadataToPRDescription)(pullRequestDescription, chatSession),
60
+ apiClient,
61
+ });
62
+ const { mergeableState, stateDescription } = await getMergeableStateInfo(owner, repo, updatedPR, apiClient);
63
+ return {
64
+ isError: false,
65
+ result: `Updated existing PR: ${updatedPR.html_url}\n\nMergeable state: ${mergeableState} - ${stateDescription}`,
66
+ };
67
+ }
68
+ async function handleNewPullRequest(owner, repo, pullRequestTitle, branchName, chatSession, pullRequestDescription, apiClient) {
69
+ const newPR = await (0, utils_1.createPullRequest)({
70
+ owner,
71
+ repo,
72
+ title: pullRequestTitle,
73
+ head: branchName,
74
+ base: chatSession?.baseBranchName || "main",
75
+ body: (0, pr_description_1.addMetadataToPRDescription)(pullRequestDescription, chatSession),
76
+ apiClient,
77
+ });
78
+ const { mergeableState, stateDescription } = await getMergeableStateInfo(owner, repo, newPR, apiClient);
79
+ return {
80
+ isError: false,
81
+ result: `Created a new PR: ${newPR.html_url}\n\nMergeable state: ${mergeableState} - ${stateDescription}`,
82
+ };
83
+ }
@@ -1,39 +1,44 @@
1
1
  import { ToolDefinition } from "@empiricalrun/shared-types";
2
2
  import z from "zod";
3
- export declare const videoAnalysisSchema: z.ZodObject<{
3
+ export declare const analyseVideoSchema: z.ZodObject<{
4
4
  videoUrl: z.ZodString;
5
5
  params: z.ZodOptional<z.ZodObject<{
6
6
  fps: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
7
7
  threshold: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
8
+ startTime: z.ZodOptional<z.ZodNumber>;
9
+ duration: z.ZodOptional<z.ZodNumber>;
8
10
  model: z.ZodOptional<z.ZodDefault<z.ZodString>>;
9
- featureFlag: z.ZodOptional<z.ZodDefault<z.ZodEnum<["none", "send-all-frames", "separate-threshold", "ai-based-frames"]>>>;
10
11
  }, "strip", z.ZodTypeAny, {
11
12
  model?: string | undefined;
12
- fps?: number | undefined;
13
+ startTime?: number | undefined;
13
14
  threshold?: number | undefined;
14
- featureFlag?: "none" | "send-all-frames" | "separate-threshold" | "ai-based-frames" | undefined;
15
+ fps?: number | undefined;
16
+ duration?: number | undefined;
15
17
  }, {
16
18
  model?: string | undefined;
17
- fps?: number | undefined;
19
+ startTime?: number | undefined;
18
20
  threshold?: number | undefined;
19
- featureFlag?: "none" | "send-all-frames" | "separate-threshold" | "ai-based-frames" | undefined;
21
+ fps?: number | undefined;
22
+ duration?: number | undefined;
20
23
  }>>;
21
24
  }, "strip", z.ZodTypeAny, {
22
25
  videoUrl: string;
23
26
  params?: {
24
27
  model?: string | undefined;
25
- fps?: number | undefined;
28
+ startTime?: number | undefined;
26
29
  threshold?: number | undefined;
27
- featureFlag?: "none" | "send-all-frames" | "separate-threshold" | "ai-based-frames" | undefined;
30
+ fps?: number | undefined;
31
+ duration?: number | undefined;
28
32
  } | undefined;
29
33
  }, {
30
34
  videoUrl: string;
31
35
  params?: {
32
36
  model?: string | undefined;
33
- fps?: number | undefined;
37
+ startTime?: number | undefined;
34
38
  threshold?: number | undefined;
35
- featureFlag?: "none" | "send-all-frames" | "separate-threshold" | "ai-based-frames" | undefined;
39
+ fps?: number | undefined;
40
+ duration?: number | undefined;
36
41
  } | undefined;
37
42
  }>;
38
- export declare const fetchVideoAnalysis: ToolDefinition<z.infer<typeof videoAnalysisSchema>>;
39
- //# sourceMappingURL=fetch-video-analysis.d.ts.map
43
+ export declare const analyseVideo: ToolDefinition<z.infer<typeof analyseVideoSchema>>;
44
+ //# sourceMappingURL=analyse-video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyse-video.d.ts","sourceRoot":"","sources":["../../../src/tools/definitions/analyse-video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2C7B,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAczE,CAAC"}