@empiricalrun/test-gen 0.76.0 → 0.78.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 (237) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/agent/base/index.d.ts +25 -21
  3. package/dist/agent/base/index.d.ts.map +1 -1
  4. package/dist/agent/base/index.js +50 -37
  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 +5 -5
  12. package/dist/agent/chat/agent-loop.d.ts.map +1 -1
  13. package/dist/agent/chat/agent-loop.js +3 -8
  14. package/dist/agent/chat/exports.d.ts +6 -5
  15. package/dist/agent/chat/exports.d.ts.map +1 -1
  16. package/dist/agent/chat/exports.js +4 -9
  17. package/dist/agent/chat/index.d.ts +2 -2
  18. package/dist/agent/chat/index.d.ts.map +1 -1
  19. package/dist/agent/chat/index.js +23 -35
  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 -14
  32. package/dist/agent/chat/state.d.ts.map +1 -1
  33. package/dist/agent/chat/state.js +15 -60
  34. package/dist/agent/chat/utils.d.ts +2 -2
  35. package/dist/agent/chat/utils.d.ts.map +1 -1
  36. package/dist/agent/chat/utils.js +14 -7
  37. package/dist/agent/cli.d.ts.map +1 -1
  38. package/dist/agent/cli.js +49 -58
  39. package/dist/agent/code-review/executor/index.d.ts +5 -0
  40. package/dist/agent/code-review/executor/index.d.ts.map +1 -0
  41. package/dist/agent/code-review/executor/index.js +13 -0
  42. package/dist/agent/code-review/index.d.ts +8 -3
  43. package/dist/agent/code-review/index.d.ts.map +1 -1
  44. package/dist/agent/code-review/index.js +118 -21
  45. package/dist/agent/code-review/parser.d.ts +5 -0
  46. package/dist/agent/code-review/parser.d.ts.map +1 -0
  47. package/dist/agent/code-review/parser.js +70 -0
  48. package/dist/agent/code-review/types.d.ts +36 -0
  49. package/dist/agent/code-review/types.d.ts.map +1 -0
  50. package/dist/agent/code-review/types.js +13 -0
  51. package/dist/agent/cua/index.d.ts.map +1 -1
  52. package/dist/agent/cua/index.js +18 -2
  53. package/dist/agent/cua/model.d.ts.map +1 -1
  54. package/dist/agent/cua/model.js +4 -1
  55. package/dist/agent/cua/pw-codegen/pw-pause/index.d.ts.map +1 -1
  56. package/dist/agent/triage/index.d.ts +3 -3
  57. package/dist/agent/triage/index.d.ts.map +1 -1
  58. package/dist/agent/triage/index.js +16 -20
  59. package/dist/agent/video-analysis/executor/index.d.ts +5 -0
  60. package/dist/agent/video-analysis/executor/index.d.ts.map +1 -0
  61. package/dist/agent/video-analysis/executor/index.js +10 -0
  62. package/dist/agent/video-analysis/index.d.ts +2 -2
  63. package/dist/agent/video-analysis/index.d.ts.map +1 -1
  64. package/dist/agent/video-analysis/index.js +38 -13
  65. package/dist/artifacts/index.d.ts +1 -1
  66. package/dist/artifacts/index.d.ts.map +1 -1
  67. package/dist/artifacts/index.js +3 -1
  68. package/dist/artifacts/utils.d.ts.map +1 -1
  69. package/dist/bin/index.js +11 -21
  70. package/dist/constants/index.d.ts +14 -0
  71. package/dist/constants/index.d.ts.map +1 -1
  72. package/dist/constants/index.js +33 -1
  73. package/dist/file/server.d.ts +1 -3
  74. package/dist/file/server.d.ts.map +1 -1
  75. package/dist/file/server.js +0 -13
  76. package/dist/file-info/adapters/file-system/index.d.ts.map +1 -1
  77. package/dist/file-info/adapters/file-system/reader.d.ts.map +1 -1
  78. package/dist/file-info/adapters/file-system/reader.js +8 -1
  79. package/dist/file-info/adapters/github/index.d.ts.map +1 -1
  80. package/dist/file-info/adapters/github/reader.d.ts +1 -1
  81. package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
  82. package/dist/file-info/adapters/github/reader.js +8 -5
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/tools/analyse-video/index.d.ts +5 -0
  85. package/dist/tools/analyse-video/index.d.ts.map +1 -0
  86. package/dist/tools/analyse-video/index.js +56 -0
  87. package/dist/tools/create-pull-request/index.js +4 -6
  88. package/dist/tools/create-pull-request/utils.d.ts +1 -1
  89. package/dist/tools/definitions/{fetch-video-analysis.d.ts → analyse-video.d.ts} +17 -12
  90. package/dist/tools/definitions/analyse-video.d.ts.map +1 -0
  91. package/dist/tools/definitions/analyse-video.js +60 -0
  92. package/dist/tools/definitions/review-pull-request.d.ts +3 -0
  93. package/dist/tools/definitions/review-pull-request.d.ts.map +1 -0
  94. package/dist/tools/definitions/review-pull-request.js +16 -0
  95. package/dist/tools/definitions/str_replace_editor.d.ts +1 -0
  96. package/dist/tools/definitions/str_replace_editor.d.ts.map +1 -1
  97. package/dist/tools/definitions/str_replace_editor.js +4 -1
  98. package/dist/tools/definitions/test-gen-browser.d.ts +0 -3
  99. package/dist/tools/definitions/test-gen-browser.d.ts.map +1 -1
  100. package/dist/tools/definitions/test-gen-browser.js +33 -8
  101. package/dist/tools/delete-file/index.d.ts.map +1 -1
  102. package/dist/tools/delete-file/index.js +1 -19
  103. package/dist/tools/executor/base.d.ts +32 -0
  104. package/dist/tools/executor/base.d.ts.map +1 -0
  105. package/dist/tools/executor/base.js +131 -0
  106. package/dist/tools/executor/index.d.ts +3 -22
  107. package/dist/tools/executor/index.d.ts.map +1 -1
  108. package/dist/tools/executor/index.js +7 -100
  109. package/dist/tools/executor/utils/checkpoint.d.ts +1 -1
  110. package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
  111. package/dist/tools/executor/utils/checkpoint.js +6 -2
  112. package/dist/tools/executor/utils/git.d.ts +2 -2
  113. package/dist/tools/executor/utils/git.d.ts.map +1 -1
  114. package/dist/tools/executor/utils/git.js +7 -3
  115. package/dist/tools/executor/utils/index.d.ts +5 -3
  116. package/dist/tools/executor/utils/index.d.ts.map +1 -1
  117. package/dist/tools/executor/utils/index.js +23 -2
  118. package/dist/tools/fetch-session-diff/index.js +2 -2
  119. package/dist/tools/file-operations/create.d.ts.map +1 -1
  120. package/dist/tools/file-operations/create.js +1 -4
  121. package/dist/tools/file-operations/index.d.ts +2 -1
  122. package/dist/tools/file-operations/index.d.ts.map +1 -1
  123. package/dist/tools/file-operations/index.js +4 -1
  124. package/dist/tools/file-operations/insert.d.ts +1 -2
  125. package/dist/tools/file-operations/insert.d.ts.map +1 -1
  126. package/dist/tools/file-operations/insert.js +1 -4
  127. package/dist/tools/file-operations/replace.d.ts.map +1 -1
  128. package/dist/tools/file-operations/replace.js +21 -25
  129. package/dist/tools/file-operations/shared/helpers.d.ts +3 -5
  130. package/dist/tools/file-operations/shared/helpers.d.ts.map +1 -1
  131. package/dist/tools/file-operations/shared/helpers.js +1 -5
  132. package/dist/tools/grep/index.d.ts.map +1 -1
  133. package/dist/tools/grep/index.js +18 -11
  134. package/dist/tools/index.d.ts +5 -5
  135. package/dist/tools/index.d.ts.map +1 -1
  136. package/dist/tools/index.js +17 -16
  137. package/dist/tools/merge-conflicts/index.d.ts.map +1 -1
  138. package/dist/tools/merge-conflicts/index.js +1 -1
  139. package/dist/tools/rename-file/index.js +1 -1
  140. package/dist/tools/review-pull-request/index.d.ts.map +1 -1
  141. package/dist/tools/review-pull-request/index.js +44 -65
  142. package/dist/tools/run-test.d.ts.map +1 -1
  143. package/dist/tools/run-test.js +25 -3
  144. package/dist/tools/test-gen-browser.d.ts.map +1 -1
  145. package/dist/tools/test-gen-browser.js +51 -47
  146. package/dist/tools/upgrade-packages/index.d.ts.map +1 -1
  147. package/dist/tools/upgrade-packages/index.js +4 -0
  148. package/dist/tools/upgrade-packages/utils.d.ts +1 -0
  149. package/dist/tools/upgrade-packages/utils.d.ts.map +1 -1
  150. package/dist/tools/upgrade-packages/utils.js +1 -0
  151. package/dist/trace-utils/index.d.ts +1 -1
  152. package/dist/trace-utils/index.d.ts.map +1 -1
  153. package/dist/trace-utils/index.js +1 -1
  154. package/dist/utils/dedup/dedup-image.d.ts +22 -0
  155. package/dist/utils/dedup/dedup-image.d.ts.map +1 -0
  156. package/dist/utils/dedup/dedup-image.js +26 -0
  157. package/dist/utils/dedup/find-threshold.d.ts +2 -0
  158. package/dist/utils/dedup/find-threshold.d.ts.map +1 -0
  159. package/dist/utils/dedup/find-threshold.js +42 -0
  160. package/dist/utils/hash.d.ts +2 -0
  161. package/dist/utils/hash.d.ts.map +1 -0
  162. package/dist/utils/hash.js +24 -0
  163. package/dist/utils/model.d.ts +1 -1
  164. package/dist/utils/model.d.ts.map +1 -1
  165. package/dist/utils/model.js +7 -5
  166. package/dist/utils/repo-tree.d.ts +0 -1
  167. package/dist/utils/repo-tree.d.ts.map +1 -1
  168. package/dist/utils/repo-tree.js +2 -14
  169. package/dist/utils/slug.js +1 -1
  170. package/dist/video-core/agent-orchestrator.d.ts +13 -0
  171. package/dist/video-core/agent-orchestrator.d.ts.map +1 -0
  172. package/dist/video-core/agent-orchestrator.js +59 -0
  173. package/dist/video-core/index.d.ts +39 -0
  174. package/dist/video-core/index.d.ts.map +1 -0
  175. package/dist/video-core/index.js +134 -0
  176. package/dist/video-core/model-limits.d.ts +4 -0
  177. package/dist/video-core/model-limits.d.ts.map +1 -0
  178. package/dist/video-core/model-limits.js +73 -0
  179. package/dist/video-core/storage-manager.d.ts +5 -0
  180. package/dist/video-core/storage-manager.d.ts.map +1 -0
  181. package/dist/video-core/storage-manager.js +62 -0
  182. package/dist/video-core/types.d.ts +13 -0
  183. package/dist/video-core/types.d.ts.map +1 -0
  184. package/dist/video-core/types.js +2 -0
  185. package/dist/video-core/utils.d.ts +15 -0
  186. package/dist/video-core/utils.d.ts.map +1 -0
  187. package/dist/video-core/utils.js +194 -0
  188. package/dist/video-core/xml-parser.d.ts +3 -0
  189. package/dist/video-core/xml-parser.d.ts.map +1 -0
  190. package/dist/video-core/xml-parser.js +27 -0
  191. package/package.json +6 -6
  192. package/tsconfig.tsbuildinfo +1 -1
  193. package/dist/agent/chat/prompt/index.d.ts +0 -6
  194. package/dist/agent/chat/prompt/index.d.ts.map +0 -1
  195. package/dist/agent/chat/prompt/index.js +0 -200
  196. package/dist/agent/code-review/prompt.d.ts +0 -2
  197. package/dist/agent/code-review/prompt.d.ts.map +0 -1
  198. package/dist/agent/code-review/prompt.js +0 -55
  199. package/dist/agent/diagnosis-agent/index.d.ts +0 -11
  200. package/dist/agent/diagnosis-agent/index.d.ts.map +0 -1
  201. package/dist/agent/diagnosis-agent/index.js +0 -88
  202. package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts +0 -10
  203. package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts.map +0 -1
  204. package/dist/agent/diagnosis-agent/strict-mode-violation.js +0 -30
  205. package/dist/tools/definitions/extract-frames-from-video.d.ts +0 -39
  206. package/dist/tools/definitions/extract-frames-from-video.d.ts.map +0 -1
  207. package/dist/tools/definitions/extract-frames-from-video.js +0 -60
  208. package/dist/tools/definitions/fetch-video-analysis.d.ts.map +0 -1
  209. package/dist/tools/definitions/fetch-video-analysis.js +0 -61
  210. package/dist/tools/extract-frames-from-video/index.d.ts +0 -7
  211. package/dist/tools/extract-frames-from-video/index.d.ts.map +0 -1
  212. package/dist/tools/extract-frames-from-video/index.js +0 -145
  213. package/dist/tools/fetch-video-analysis/index.d.ts +0 -5
  214. package/dist/tools/fetch-video-analysis/index.d.ts.map +0 -1
  215. package/dist/tools/fetch-video-analysis/index.js +0 -149
  216. package/dist/tools/fetch-video-analysis/open-ai.d.ts +0 -6
  217. package/dist/tools/fetch-video-analysis/open-ai.d.ts.map +0 -1
  218. package/dist/tools/fetch-video-analysis/open-ai.js +0 -37
  219. package/dist/tools/fetch-video-analysis/utils.d.ts +0 -16
  220. package/dist/tools/fetch-video-analysis/utils.d.ts.map +0 -1
  221. package/dist/tools/fetch-video-analysis/utils.js +0 -121
  222. package/dist/tools/fetch-video-analysis/video-analysis.d.ts +0 -7
  223. package/dist/tools/fetch-video-analysis/video-analysis.d.ts.map +0 -1
  224. package/dist/tools/fetch-video-analysis/video-analysis.js +0 -70
  225. package/dist/tools/file-operations/shared/git-helper.d.ts +0 -4
  226. package/dist/tools/file-operations/shared/git-helper.d.ts.map +0 -1
  227. package/dist/tools/file-operations/shared/git-helper.js +0 -29
  228. package/dist/utils/dedup-image-fs.d.ts +0 -27
  229. package/dist/utils/dedup-image-fs.d.ts.map +0 -1
  230. package/dist/utils/dedup-image-fs.js +0 -88
  231. package/dist/utils/dedup-image.d.ts +0 -25
  232. package/dist/utils/dedup-image.d.ts.map +0 -1
  233. package/dist/utils/dedup-image.js +0 -80
  234. package/dist/utils/local-ffmpeg-client.d.ts +0 -27
  235. package/dist/utils/local-ffmpeg-client.d.ts.map +0 -1
  236. package/dist/utils/local-ffmpeg-client.js +0 -299
  237. package/eslint.config.mjs +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/upgrade-packages/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAmBjE,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,gBAkBzD;AA4BD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBjD;AAED,wBAAsB,aAAa,CAAC,EAClC,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;CAChC,oBA8BA;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;;;GAcA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/upgrade-packages/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,wBAAgB,aAAa,CAC3B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAWT;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,gBAkBzD;AA4BD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBjD;AAED,wBAAsB,aAAa,CAAC,EAClC,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;CAChC,oBA8BA;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;;;GAcA"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPatchUpdate = isPatchUpdate;
3
4
  exports.getLatestVersion = getLatestVersion;
4
5
  exports.parsePackageJsonDiff = parsePackageJsonDiff;
5
6
  exports.shouldMergePR = shouldMergePR;
@@ -1,4 +1,4 @@
1
1
  export { extractFileFromZipFromUrl, getFilenamesInZip, } from "../tools/trace-dot-zip/utils/extract-zip";
2
2
  export { generateNetworkTrace } from "../tools/trace-dot-zip/utils/network-trace";
3
- export { deduplicateImages } from "../utils/dedup-image";
3
+ export { deduplicateImages } from "../utils/dedup/dedup-image";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trace-utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trace-utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -6,5 +6,5 @@ Object.defineProperty(exports, "extractFileFromZipFromUrl", { enumerable: true,
6
6
  Object.defineProperty(exports, "getFilenamesInZip", { enumerable: true, get: function () { return extract_zip_1.getFilenamesInZip; } });
7
7
  var network_trace_1 = require("../tools/trace-dot-zip/utils/network-trace");
8
8
  Object.defineProperty(exports, "generateNetworkTrace", { enumerable: true, get: function () { return network_trace_1.generateNetworkTrace; } });
9
- var dedup_image_1 = require("../utils/dedup-image");
9
+ var dedup_image_1 = require("../utils/dedup/dedup-image");
10
10
  Object.defineProperty(exports, "deduplicateImages", { enumerable: true, get: function () { return dedup_image_1.deduplicateImages; } });
@@ -0,0 +1,22 @@
1
+ type ImageMetadata = {
2
+ base64: string;
3
+ type: string;
4
+ pageId: string;
5
+ sha1: string;
6
+ width: number;
7
+ height: number;
8
+ timestamp: number;
9
+ };
10
+ export declare function deduplicateImages({ base64Images, threshold, logPrefix, }: {
11
+ base64Images: {
12
+ metadata: ImageMetadata;
13
+ image: string;
14
+ }[];
15
+ threshold: number;
16
+ logPrefix?: string;
17
+ }): Promise<{
18
+ metadata: ImageMetadata;
19
+ image: string;
20
+ }[]>;
21
+ export {};
22
+ //# sourceMappingURL=dedup-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-image.d.ts","sourceRoot":"","sources":["../../../src/utils/dedup/dedup-image.ts"],"names":[],"mappings":"AAEA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EACtC,YAAY,EACZ,SAAS,EACT,SAAyB,GAC1B,EAAE;IACD,YAAY,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAkCxD"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deduplicateImages = deduplicateImages;
4
+ const find_threshold_1 = require("./find-threshold");
5
+ async function deduplicateImages({ base64Images, threshold, logPrefix = "dedup-image", }) {
6
+ console.log(`[${logPrefix}] Starting deduplication with sequential comparison`);
7
+ console.log(`[${logPrefix}] Input: ${base64Images.length} images, Threshold: ${threshold}`);
8
+ if (base64Images.length === 0) {
9
+ return [];
10
+ }
11
+ const uniqueImages = [];
12
+ let previousImage = null;
13
+ for (const currentImage of base64Images) {
14
+ if (previousImage === null) {
15
+ uniqueImages.push(currentImage);
16
+ previousImage = currentImage.image;
17
+ continue;
18
+ }
19
+ const similarity = await (0, find_threshold_1.findSimilarityPercentage)(previousImage, currentImage.image);
20
+ if (similarity < threshold) {
21
+ uniqueImages.push(currentImage);
22
+ previousImage = currentImage.image;
23
+ }
24
+ }
25
+ return uniqueImages;
26
+ }
@@ -0,0 +1,2 @@
1
+ export declare function findSimilarityPercentage(base64Image1: string, base64Image2: string): Promise<number>;
2
+ //# sourceMappingURL=find-threshold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-threshold.d.ts","sourceRoot":"","sources":["../../../src/utils/dedup/find-threshold.ts"],"names":[],"mappings":"AAsCA,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findSimilarityPercentage = findSimilarityPercentage;
7
+ const pixelmatch_1 = __importDefault(require("pixelmatch"));
8
+ const sharp_1 = __importDefault(require("sharp"));
9
+ async function compareImageBuffers(buffer1, buffer2, pixelmatchThreshold) {
10
+ const metadata1 = await (0, sharp_1.default)(buffer1).metadata();
11
+ const metadata2 = await (0, sharp_1.default)(buffer2).metadata();
12
+ const width = metadata1.width || 0;
13
+ const height = metadata1.height || 0;
14
+ if (width !== (metadata2.width || 0) || height !== (metadata2.height || 0)) {
15
+ throw new Error("Images must have the same dimensions for comparison");
16
+ }
17
+ const { data: data1 } = await (0, sharp_1.default)(buffer1)
18
+ .ensureAlpha()
19
+ .raw()
20
+ .toBuffer({ resolveWithObject: true });
21
+ const { data: data2 } = await (0, sharp_1.default)(buffer2)
22
+ .ensureAlpha()
23
+ .raw()
24
+ .toBuffer({ resolveWithObject: true });
25
+ const diffPixels = (0, pixelmatch_1.default)(data1, data2, null, width, height, {
26
+ threshold: pixelmatchThreshold,
27
+ });
28
+ const totalPixels = width * height;
29
+ const diffFraction = diffPixels / totalPixels;
30
+ return { diffPixels, totalPixels, diffFraction };
31
+ }
32
+ async function findSimilarityPercentage(base64Image1, base64Image2) {
33
+ try {
34
+ const buffer1 = Buffer.from(base64Image1, "base64");
35
+ const buffer2 = Buffer.from(base64Image2, "base64");
36
+ const { diffFraction } = await compareImageBuffers(buffer1, buffer2, 0.1);
37
+ return diffFraction;
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Error calculating similarity: ${error}`);
41
+ }
42
+ }
@@ -0,0 +1,2 @@
1
+ export declare function createHashBasedOnParams(mainStringToHash: string, additionalParams: Record<string, any>): string;
2
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACpC,MAAM,CAmBR"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createHashBasedOnParams = createHashBasedOnParams;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ function createHashBasedOnParams(mainStringToHash, additionalParams) {
9
+ const sortedParams = Object.keys(additionalParams)
10
+ .sort()
11
+ .reduce((acc, key) => {
12
+ acc[key] = additionalParams[key];
13
+ return acc;
14
+ }, {});
15
+ const json = JSON.stringify({
16
+ mainStringTohash: mainStringToHash,
17
+ ...sortedParams,
18
+ });
19
+ return node_crypto_1.default
20
+ .createHash("sha256")
21
+ .update(json)
22
+ .digest("hex")
23
+ .substring(0, 16);
24
+ }
@@ -1,3 +1,3 @@
1
1
  import { SupportedChatModels } from "@empiricalrun/shared-types";
2
- export declare const ARGS_TO_MODEL_MAP: Record<string, SupportedChatModels>;
2
+ export declare const CLI_ARGS_TO_MODEL_MAP: Record<string, SupportedChatModels>;
3
3
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAkBjE,CAAC"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAoBrE,CAAC"}
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ARGS_TO_MODEL_MAP = void 0;
4
- exports.ARGS_TO_MODEL_MAP = {
5
- "claude-3-5": "claude-3-5-sonnet-20241022",
6
- "claude-3-7": "claude-3-7-sonnet-20250219",
3
+ exports.CLI_ARGS_TO_MODEL_MAP = void 0;
4
+ exports.CLI_ARGS_TO_MODEL_MAP = {
7
5
  "claude-4": "claude-sonnet-4-20250514",
8
- "claude-sonnet-4": "claude-sonnet-4-20250514",
6
+ "claude-4-5": "claude-sonnet-4-5-20250929",
9
7
  "claude-opus-4": "claude-opus-4-20250514",
8
+ "claude-sonnet-4": "claude-sonnet-4-20250514",
9
+ "claude-sonnet-4-5": "claude-sonnet-4-5-20250929",
10
+ "claude-haiku": "claude-3-5-haiku-20241022",
11
+ "claude-haiku-3-5": "claude-3-5-haiku-20241022",
10
12
  gemini: "gemini-2.5-pro",
11
13
  "gemini-2.5": "gemini-2.5-pro",
12
14
  "gemini-2.5-pro": "gemini-2.5-pro",
@@ -1,4 +1,3 @@
1
1
  import { FileInfo } from "@empiricalrun/shared-types";
2
- export declare const DEFAULT_EXCLUDE: (string | RegExp)[];
3
2
  export declare function generateAsciiTree(root: FileInfo, options?: {}): string;
4
3
  //# sourceMappingURL=repo-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/utils/repo-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,eAAO,MAAM,eAAe,qBAW3B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,KAAK,UAqF7D"}
1
+ {"version":3,"file":"repo-tree.d.ts","sourceRoot":"","sources":["../../src/utils/repo-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAGtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,KAAK,UAqF7D"}
@@ -1,23 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_EXCLUDE = void 0;
4
3
  exports.generateAsciiTree = generateAsciiTree;
5
- exports.DEFAULT_EXCLUDE = [
6
- "node_modules",
7
- "dist",
8
- "build",
9
- /\.git/,
10
- ".DS_Store",
11
- "playwright-report",
12
- "test-results",
13
- ".empiricalrun",
14
- "auth",
15
- "package-lock.json",
16
- ];
4
+ const constants_1 = require("../constants");
17
5
  function generateAsciiTree(root, options = {}) {
18
6
  const defaultOptions = {
19
7
  showHidden: false,
20
- exclude: exports.DEFAULT_EXCLUDE,
8
+ exclude: constants_1.DEFAULT_EXCLUDE,
21
9
  maxDepth: 10,
22
10
  };
23
11
  const opts = { ...defaultOptions, ...options };
@@ -44,7 +44,7 @@ const slugify = (str) => {
44
44
  exports.slugify = slugify;
45
45
  const extractSlugFromDiagnosisUrl = (diagnosisUrl) => {
46
46
  const slug = diagnosisUrl.split("--").pop();
47
- if (!slug) {
47
+ if (!diagnosisUrl.includes("--") || !slug) {
48
48
  throw new Error("Invalid diagnosis URL - could not extract slug");
49
49
  }
50
50
  return slug;
@@ -0,0 +1,13 @@
1
+ import type { Attachment, CanonicalMessage, SupportedChatModels } from "@empiricalrun/shared-types";
2
+ import { ProcessedAnalysis } from "./types";
3
+ export declare function extractTextPartFromLastMessage(messages: CanonicalMessage[]): string | null;
4
+ export declare function orchestrateVideoAnalysis({ selectedModel, featureFlags, workingDirectory, frameBatch, }: {
5
+ selectedModel: SupportedChatModels;
6
+ featureFlags: string[];
7
+ workingDirectory: string;
8
+ frameBatch: Attachment[];
9
+ }): Promise<{
10
+ analysis: string;
11
+ allMessages: CanonicalMessage[];
12
+ } & ProcessedAnalysis>;
13
+ //# sourceMappingURL=agent-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-orchestrator.d.ts","sourceRoot":"","sources":["../../src/video-core/agent-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,MAAM,GAAG,IAAI,CAgBf;AAED,wBAAsB,wBAAwB,CAAC,EAC7C,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,aAAa,EAAE,mBAAmB,CAAC;IACnC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B,GAAG,OAAO,CACT;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAAE,GAAG,iBAAiB,CAC1E,CAgDA"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractTextPartFromLastMessage = extractTextPartFromLastMessage;
4
+ exports.orchestrateVideoAnalysis = orchestrateVideoAnalysis;
5
+ const agent_1 = require("../agent");
6
+ const executor_1 = require("../agent/video-analysis/executor");
7
+ const xml_parser_1 = require("./xml-parser");
8
+ function extractTextPartFromLastMessage(messages) {
9
+ const lastMessage = messages.length
10
+ ? messages[messages.length - 1]
11
+ : undefined;
12
+ if (!lastMessage) {
13
+ return null;
14
+ }
15
+ return lastMessage.parts
16
+ .filter((p) => "text" in p && !("thinking" in p && p.thinking))
17
+ .map((p) => p.text)
18
+ .join("\\n");
19
+ }
20
+ async function orchestrateVideoAnalysis({ selectedModel, featureFlags, workingDirectory, frameBatch, }) {
21
+ const allMessages = [];
22
+ const toolExecutor = new executor_1.VideoAnalysisToolExecutor({
23
+ chatSession: null,
24
+ repoPath: workingDirectory,
25
+ featureFlags,
26
+ environmentOverrides: {},
27
+ });
28
+ const agent = new agent_1.VideoAnalysisAgent({
29
+ featureFlags: featureFlags,
30
+ selectedModel,
31
+ chatState: undefined,
32
+ toolExecutor,
33
+ });
34
+ const attachmentsWithLabels = frameBatch.map((attachment) => ({
35
+ text: `Frame ID: ${attachment.name.split(".")[0]}`,
36
+ attachments: [attachment],
37
+ }));
38
+ agent.pushUserMessage([
39
+ {
40
+ text: "Analyse the frames and give me a summary at the end.",
41
+ },
42
+ ...attachmentsWithLabels,
43
+ ]);
44
+ while (!agent.askUserForInput) {
45
+ await agent.runLoop({
46
+ reporter: async () => { },
47
+ });
48
+ }
49
+ allMessages.push(...agent.messages);
50
+ const rawAnalysis = extractTextPartFromLastMessage(allMessages);
51
+ if (!rawAnalysis) {
52
+ throw new Error("Could not extract text response from accumulated messages");
53
+ }
54
+ const { parsedXml, keyFrameImagesMap } = await (0, xml_parser_1.processAnalysisAndLoadFrames)({
55
+ rawAnalysis,
56
+ artifactsPath: workingDirectory,
57
+ });
58
+ return { analysis: rawAnalysis, allMessages, parsedXml, keyFrameImagesMap };
59
+ }
@@ -0,0 +1,39 @@
1
+ import { CanonicalMessage, ToolResultPart, UniqueFrameInfos, VideoAnalysisParams } from "@empiricalrun/shared-types";
2
+ export declare function runVideoAnalysis({ videoUrl, videoUrlHash, params, featureFlags, workingDirectory, skipUpload, algo, }: {
3
+ videoUrl: string;
4
+ videoUrlHash: string;
5
+ params: VideoAnalysisParams;
6
+ featureFlags: string[];
7
+ workingDirectory: string;
8
+ skipUpload?: boolean;
9
+ algo?: string;
10
+ }): Promise<{
11
+ result: {
12
+ total_extracted_frames: number;
13
+ video_duration: number;
14
+ unique_frames_count: number;
15
+ video_url: string;
16
+ analysis: string;
17
+ analysis_id: string;
18
+ params: VideoAnalysisParams;
19
+ };
20
+ unique_frames: UniqueFrameInfos[];
21
+ interleaved_tool_result: ToolResultPart[];
22
+ chat_messages: CanonicalMessage[];
23
+ error: null;
24
+ } | {
25
+ result: {
26
+ total_extracted_frames: number;
27
+ video_duration: number;
28
+ unique_frames_count: number;
29
+ video_url: string;
30
+ analysis: string;
31
+ analysis_id: string;
32
+ params: VideoAnalysisParams;
33
+ };
34
+ unique_frames: UniqueFrameInfos[];
35
+ interleaved_tool_result: ToolResultPart[];
36
+ chat_messages: CanonicalMessage[];
37
+ error: string;
38
+ }>;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/video-core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAWpC,wBAAsB,gBAAgB,CAAC,EACrC,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,IAAI,GACL,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkKA"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runVideoAnalysis = runVideoAnalysis;
4
+ const videostil_1 = require("videostil");
5
+ const agent_orchestrator_1 = require("./agent-orchestrator");
6
+ const model_limits_1 = require("./model-limits");
7
+ const storage_manager_1 = require("./storage-manager");
8
+ const utils_1 = require("./utils");
9
+ async function runVideoAnalysis({ videoUrl, videoUrlHash, params, featureFlags, workingDirectory, skipUpload, algo, }) {
10
+ const result = {
11
+ total_extracted_frames: 0,
12
+ video_duration: 0,
13
+ unique_frames_count: 0,
14
+ video_url: videoUrl,
15
+ analysis: "",
16
+ analysis_id: videoUrlHash,
17
+ params,
18
+ };
19
+ let uniqueFrameInfos = [];
20
+ let interleavedResults = [];
21
+ let allMessages = [];
22
+ let currentStep = "initialization";
23
+ let finalError = null;
24
+ try {
25
+ currentStep = "frame_extraction";
26
+ let extractionResult;
27
+ try {
28
+ extractionResult = await (0, videostil_1.extractUniqueFrames)({
29
+ videoUrl,
30
+ fps: params.fps,
31
+ threshold: params.threshold,
32
+ startTime: params.startTime,
33
+ duration: params.duration,
34
+ algo: algo,
35
+ workingDir: workingDirectory,
36
+ });
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Frame extraction failed: ${error instanceof Error ? error.message : String(error)}`);
40
+ }
41
+ const { totalFramesCount, uniqueFrames: extractedFrames, videoDurationSeconds, } = extractionResult;
42
+ // Map videostil FrameInfo to test-gen UniqueFrameInfos
43
+ uniqueFrameInfos = extractedFrames.map((frame) => ({
44
+ index: frame.index,
45
+ path: frame.path,
46
+ fileName: frame.fileName,
47
+ url: frame.url || `${(0, utils_1.getR2BaseUrlByHash)(videoUrlHash)}${frame.fileName}`,
48
+ base64: frame.base64 || "",
49
+ timestamp: frame.timestamp || "",
50
+ }));
51
+ result.total_extracted_frames = totalFramesCount;
52
+ result.video_duration = videoDurationSeconds;
53
+ result.unique_frames_count = uniqueFrameInfos.length;
54
+ currentStep = "batch_size_calculation";
55
+ let batchSize;
56
+ try {
57
+ batchSize = await (0, model_limits_1.calculateOptimalBatchSize)(params.model, uniqueFrameInfos);
58
+ }
59
+ catch (error) {
60
+ throw new Error(`Batch size calculation failed: ${error instanceof Error ? error.message : String(error)}`);
61
+ }
62
+ const uniqueFramesBatch = uniqueFrameInfos.slice(0, batchSize);
63
+ const frameBatch = uniqueFramesBatch.map((f) => ({
64
+ name: f.fileName,
65
+ contentType: "image/png",
66
+ base64Data: f.base64,
67
+ }));
68
+ currentStep = "video_analysis";
69
+ let analysis, parsedXml;
70
+ try {
71
+ const orchestrationResult = await (0, agent_orchestrator_1.orchestrateVideoAnalysis)({
72
+ selectedModel: params.model,
73
+ featureFlags,
74
+ workingDirectory,
75
+ frameBatch,
76
+ });
77
+ analysis = orchestrationResult.analysis;
78
+ allMessages = orchestrationResult.allMessages;
79
+ parsedXml = orchestrationResult.parsedXml;
80
+ }
81
+ catch (error) {
82
+ throw new Error(`Video analysis orchestration failed: ${error instanceof Error ? error.message : String(error)}`);
83
+ }
84
+ const allFramesLength = uniqueFrameInfos.length;
85
+ const isTruncated = allFramesLength !== batchSize;
86
+ const finalFrameTimestamp = uniqueFramesBatch[uniqueFramesBatch.length - 1]?.timestamp;
87
+ result.analysis = isTruncated
88
+ ? `NOTE: the unique frames to be processed were truncated to ${batchSize} due to limitations on the number of frames that can be processed in a single batch. The last frame processed was at timestamp ${finalFrameTimestamp}. ${analysis}`
89
+ : analysis;
90
+ currentStep = "interleaved_results";
91
+ try {
92
+ interleavedResults = (0, utils_1.createInterleavedResults)(parsedXml, uniqueFrameInfos);
93
+ }
94
+ catch (error) {
95
+ throw new Error(`Interleaved results creation failed: ${error instanceof Error ? error.message : String(error)}`);
96
+ }
97
+ if (!skipUpload) {
98
+ currentStep = "upload_all";
99
+ const uploadPromises = [
100
+ (0, storage_manager_1.uploadFramesToR2)(videoUrlHash, uniqueFrameInfos).catch((error) => {
101
+ throw new Error(`Frame upload failed: ${error instanceof Error ? error.message : String(error)}`);
102
+ }),
103
+ (0, storage_manager_1.uploadSummaryToR2)({
104
+ ...result,
105
+ interleaved_tool_result: interleavedResults,
106
+ }).catch((error) => {
107
+ throw new Error(`Summary upload failed: ${error instanceof Error ? error.message : String(error)}`);
108
+ }),
109
+ (0, storage_manager_1.uploadChatStateToR2)(allMessages, videoUrlHash).catch((error) => {
110
+ throw new Error(`Chat state upload failed: ${error instanceof Error ? error.message : String(error)}`);
111
+ }),
112
+ ];
113
+ await Promise.all(uploadPromises);
114
+ }
115
+ return {
116
+ result,
117
+ unique_frames: uniqueFrameInfos,
118
+ interleaved_tool_result: interleavedResults,
119
+ chat_messages: allMessages,
120
+ error: finalError,
121
+ };
122
+ }
123
+ catch (error) {
124
+ const errorMessage = error instanceof Error ? error.message : String(error);
125
+ finalError = `Error at step [${currentStep}]: ${errorMessage}`;
126
+ return {
127
+ result,
128
+ unique_frames: uniqueFrameInfos,
129
+ interleaved_tool_result: interleavedResults,
130
+ chat_messages: allMessages,
131
+ error: finalError,
132
+ };
133
+ }
134
+ }
@@ -0,0 +1,4 @@
1
+ import { SupportedChatModels, UniqueFrameInfos } from "@empiricalrun/shared-types";
2
+ export declare function calculateActualBatchSize(uniqueFrameInfos: UniqueFrameInfos[]): Promise<number>;
3
+ export declare function calculateOptimalBatchSize(model: SupportedChatModels, uniqueFrameInfos: UniqueFrameInfos[]): Promise<number>;
4
+ //# sourceMappingURL=model-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-limits.d.ts","sourceRoot":"","sources":["../../src/video-core/model-limits.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAgCpC,wBAAsB,wBAAwB,CAC5C,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,EAC1B,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.calculateActualBatchSize = calculateActualBatchSize;
7
+ exports.calculateOptimalBatchSize = calculateOptimalBatchSize;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const constants_1 = require("../constants");
10
+ function isClaudeModel(model) {
11
+ return model.includes("claude") || model.includes("sonnet");
12
+ }
13
+ function isOpenAIModel(model) {
14
+ return model.includes("gpt") || model.includes("openai");
15
+ }
16
+ function getModelLimits(model) {
17
+ if (isClaudeModel(model)) {
18
+ return {
19
+ maxImages: constants_1.VIDEO_ANALYSIS.CLAUDE_MAX_IMAGES_PER_BATCH,
20
+ maxSizeMB: constants_1.VIDEO_ANALYSIS.CLAUDE_MAX_REQUEST_SIZE_MB,
21
+ };
22
+ }
23
+ if (isOpenAIModel(model)) {
24
+ return {
25
+ maxImages: constants_1.VIDEO_ANALYSIS.OPENAI_MAX_IMAGES_PER_BATCH,
26
+ maxSizeMB: constants_1.VIDEO_ANALYSIS.OPENAI_MAX_REQUEST_SIZE_MB,
27
+ };
28
+ }
29
+ return {
30
+ maxImages: 20,
31
+ maxSizeMB: 10,
32
+ };
33
+ }
34
+ async function calculateActualBatchSize(uniqueFrameInfos) {
35
+ try {
36
+ const sizes = await Promise.all(uniqueFrameInfos.map(async (frame, index) => {
37
+ const pathToUse = frame.path;
38
+ if (!pathToUse) {
39
+ throw new Error(`Frame ${index} has no path: ${JSON.stringify(frame)}`);
40
+ }
41
+ const stats = await node_fs_1.default.promises.stat(pathToUse);
42
+ return stats.size;
43
+ }));
44
+ const totalBytes = sizes.reduce((sum, size) => sum + size, 0);
45
+ // Base64 encoding inflates size by ~33% (4/3 ratio)
46
+ const base64InflatedBytes = totalBytes * (4 / 3);
47
+ const totalMB = base64InflatedBytes / (1024 * 1024);
48
+ return totalMB;
49
+ }
50
+ catch (error) {
51
+ // Apply same base64 inflation to default calculation
52
+ return (uniqueFrameInfos.length * constants_1.VIDEO_ANALYSIS.DEFAULT_FRAME_SIZE_MB * (4 / 3));
53
+ }
54
+ }
55
+ async function calculateOptimalBatchSize(model, uniqueFrameInfos) {
56
+ if (!uniqueFrameInfos || uniqueFrameInfos.length === 0) {
57
+ throw new Error("framePaths are required to calculate the optimal batch size");
58
+ }
59
+ const limits = getModelLimits(model);
60
+ let batchSize = Math.min(limits.maxImages, uniqueFrameInfos.length);
61
+ while (batchSize > 0) {
62
+ const frameBatch = uniqueFrameInfos.slice(0, batchSize);
63
+ console.log("Batch size:", frameBatch.length);
64
+ const actualBatchSizeMB = await calculateActualBatchSize(frameBatch);
65
+ console.log("Actual batch size in MB:", actualBatchSizeMB);
66
+ if (actualBatchSizeMB <= limits.maxSizeMB) {
67
+ return batchSize;
68
+ }
69
+ batchSize = Math.floor(batchSize * constants_1.VIDEO_ANALYSIS.BATCH_SIZE_REDUCTION_FACTOR);
70
+ console.log("Reduced batch size:", batchSize);
71
+ }
72
+ return 1;
73
+ }
@@ -0,0 +1,5 @@
1
+ import type { CanonicalMessage, UniqueFrameInfos, VideoAnalysisSummary } from "@empiricalrun/shared-types";
2
+ export declare const uploadFramesToR2: (videoUrlHash: string, frames: UniqueFrameInfos[]) => Promise<void>;
3
+ export declare const uploadSummaryToR2: (videoInfo: VideoAnalysisSummary) => Promise<void>;
4
+ export declare function uploadChatStateToR2(allMessages: CanonicalMessage[], videoUrlHash: string): Promise<void>;
5
+ //# sourceMappingURL=storage-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-manager.d.ts","sourceRoot":"","sources":["../../src/video-core/storage-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAoCpC,eAAO,MAAM,gBAAgB,GAC3B,cAAc,MAAM,EACpB,QAAQ,gBAAgB,EAAE,KACzB,OAAO,CAAC,IAAI,CAiBd,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,oBAAoB,KAC9B,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAWf"}