@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.
- package/CHANGELOG.md +47 -0
- package/dist/agent/base/index.d.ts +25 -21
- package/dist/agent/base/index.d.ts.map +1 -1
- package/dist/agent/base/index.js +50 -37
- package/dist/agent/browsing/run.d.ts +1 -2
- package/dist/agent/browsing/run.d.ts.map +1 -1
- package/dist/agent/browsing/run.js +3 -9
- package/dist/agent/browsing/utils.d.ts +2 -9
- package/dist/agent/browsing/utils.d.ts.map +1 -1
- package/dist/agent/browsing/utils.js +5 -109
- package/dist/agent/chat/agent-loop.d.ts +5 -5
- package/dist/agent/chat/agent-loop.d.ts.map +1 -1
- package/dist/agent/chat/agent-loop.js +3 -8
- package/dist/agent/chat/exports.d.ts +6 -5
- package/dist/agent/chat/exports.d.ts.map +1 -1
- package/dist/agent/chat/exports.js +4 -9
- package/dist/agent/chat/index.d.ts +2 -2
- package/dist/agent/chat/index.d.ts.map +1 -1
- package/dist/agent/chat/index.js +23 -35
- package/dist/agent/chat/models.d.ts +0 -2
- package/dist/agent/chat/models.d.ts.map +1 -1
- package/dist/agent/chat/models.js +12 -26
- package/dist/agent/chat/prompt/pw-utils-docs.d.ts +1 -1
- package/dist/agent/chat/prompt/pw-utils-docs.d.ts.map +1 -1
- package/dist/agent/chat/prompt/pw-utils-docs.js +52 -0
- package/dist/agent/chat/prompt/repo.d.ts.map +1 -1
- package/dist/agent/chat/prompt/repo.js +11 -22
- package/dist/agent/chat/prompt/test-case-def.d.ts +2 -0
- package/dist/agent/chat/prompt/test-case-def.d.ts.map +1 -0
- package/dist/agent/chat/prompt/test-case-def.js +44 -0
- package/dist/agent/chat/state.d.ts +8 -14
- package/dist/agent/chat/state.d.ts.map +1 -1
- package/dist/agent/chat/state.js +15 -60
- package/dist/agent/chat/utils.d.ts +2 -2
- package/dist/agent/chat/utils.d.ts.map +1 -1
- package/dist/agent/chat/utils.js +14 -7
- package/dist/agent/cli.d.ts.map +1 -1
- package/dist/agent/cli.js +49 -58
- package/dist/agent/code-review/executor/index.d.ts +5 -0
- package/dist/agent/code-review/executor/index.d.ts.map +1 -0
- package/dist/agent/code-review/executor/index.js +13 -0
- package/dist/agent/code-review/index.d.ts +8 -3
- package/dist/agent/code-review/index.d.ts.map +1 -1
- package/dist/agent/code-review/index.js +118 -21
- package/dist/agent/code-review/parser.d.ts +5 -0
- package/dist/agent/code-review/parser.d.ts.map +1 -0
- package/dist/agent/code-review/parser.js +70 -0
- package/dist/agent/code-review/types.d.ts +36 -0
- package/dist/agent/code-review/types.d.ts.map +1 -0
- package/dist/agent/code-review/types.js +13 -0
- package/dist/agent/cua/index.d.ts.map +1 -1
- package/dist/agent/cua/index.js +18 -2
- package/dist/agent/cua/model.d.ts.map +1 -1
- package/dist/agent/cua/model.js +4 -1
- package/dist/agent/cua/pw-codegen/pw-pause/index.d.ts.map +1 -1
- package/dist/agent/triage/index.d.ts +3 -3
- package/dist/agent/triage/index.d.ts.map +1 -1
- package/dist/agent/triage/index.js +16 -20
- package/dist/agent/video-analysis/executor/index.d.ts +5 -0
- package/dist/agent/video-analysis/executor/index.d.ts.map +1 -0
- package/dist/agent/video-analysis/executor/index.js +10 -0
- package/dist/agent/video-analysis/index.d.ts +2 -2
- package/dist/agent/video-analysis/index.d.ts.map +1 -1
- package/dist/agent/video-analysis/index.js +38 -13
- package/dist/artifacts/index.d.ts +1 -1
- package/dist/artifacts/index.d.ts.map +1 -1
- package/dist/artifacts/index.js +3 -1
- package/dist/artifacts/utils.d.ts.map +1 -1
- package/dist/bin/index.js +11 -21
- package/dist/constants/index.d.ts +14 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +33 -1
- package/dist/file/server.d.ts +1 -3
- package/dist/file/server.d.ts.map +1 -1
- package/dist/file/server.js +0 -13
- package/dist/file-info/adapters/file-system/index.d.ts.map +1 -1
- package/dist/file-info/adapters/file-system/reader.d.ts.map +1 -1
- package/dist/file-info/adapters/file-system/reader.js +8 -1
- package/dist/file-info/adapters/github/index.d.ts.map +1 -1
- package/dist/file-info/adapters/github/reader.d.ts +1 -1
- package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
- package/dist/file-info/adapters/github/reader.js +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/tools/analyse-video/index.d.ts +5 -0
- package/dist/tools/analyse-video/index.d.ts.map +1 -0
- package/dist/tools/analyse-video/index.js +56 -0
- package/dist/tools/create-pull-request/index.js +4 -6
- package/dist/tools/create-pull-request/utils.d.ts +1 -1
- package/dist/tools/definitions/{fetch-video-analysis.d.ts → analyse-video.d.ts} +17 -12
- package/dist/tools/definitions/analyse-video.d.ts.map +1 -0
- package/dist/tools/definitions/analyse-video.js +60 -0
- package/dist/tools/definitions/review-pull-request.d.ts +3 -0
- package/dist/tools/definitions/review-pull-request.d.ts.map +1 -0
- package/dist/tools/definitions/review-pull-request.js +16 -0
- package/dist/tools/definitions/str_replace_editor.d.ts +1 -0
- package/dist/tools/definitions/str_replace_editor.d.ts.map +1 -1
- package/dist/tools/definitions/str_replace_editor.js +4 -1
- package/dist/tools/definitions/test-gen-browser.d.ts +0 -3
- package/dist/tools/definitions/test-gen-browser.d.ts.map +1 -1
- package/dist/tools/definitions/test-gen-browser.js +33 -8
- package/dist/tools/delete-file/index.d.ts.map +1 -1
- package/dist/tools/delete-file/index.js +1 -19
- package/dist/tools/executor/base.d.ts +32 -0
- package/dist/tools/executor/base.d.ts.map +1 -0
- package/dist/tools/executor/base.js +131 -0
- package/dist/tools/executor/index.d.ts +3 -22
- package/dist/tools/executor/index.d.ts.map +1 -1
- package/dist/tools/executor/index.js +7 -100
- package/dist/tools/executor/utils/checkpoint.d.ts +1 -1
- package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
- package/dist/tools/executor/utils/checkpoint.js +6 -2
- package/dist/tools/executor/utils/git.d.ts +2 -2
- package/dist/tools/executor/utils/git.d.ts.map +1 -1
- package/dist/tools/executor/utils/git.js +7 -3
- package/dist/tools/executor/utils/index.d.ts +5 -3
- package/dist/tools/executor/utils/index.d.ts.map +1 -1
- package/dist/tools/executor/utils/index.js +23 -2
- package/dist/tools/fetch-session-diff/index.js +2 -2
- package/dist/tools/file-operations/create.d.ts.map +1 -1
- package/dist/tools/file-operations/create.js +1 -4
- package/dist/tools/file-operations/index.d.ts +2 -1
- package/dist/tools/file-operations/index.d.ts.map +1 -1
- package/dist/tools/file-operations/index.js +4 -1
- package/dist/tools/file-operations/insert.d.ts +1 -2
- package/dist/tools/file-operations/insert.d.ts.map +1 -1
- package/dist/tools/file-operations/insert.js +1 -4
- package/dist/tools/file-operations/replace.d.ts.map +1 -1
- package/dist/tools/file-operations/replace.js +21 -25
- package/dist/tools/file-operations/shared/helpers.d.ts +3 -5
- package/dist/tools/file-operations/shared/helpers.d.ts.map +1 -1
- package/dist/tools/file-operations/shared/helpers.js +1 -5
- package/dist/tools/grep/index.d.ts.map +1 -1
- package/dist/tools/grep/index.js +18 -11
- package/dist/tools/index.d.ts +5 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +17 -16
- package/dist/tools/merge-conflicts/index.d.ts.map +1 -1
- package/dist/tools/merge-conflicts/index.js +1 -1
- package/dist/tools/rename-file/index.js +1 -1
- package/dist/tools/review-pull-request/index.d.ts.map +1 -1
- package/dist/tools/review-pull-request/index.js +44 -65
- package/dist/tools/run-test.d.ts.map +1 -1
- package/dist/tools/run-test.js +25 -3
- package/dist/tools/test-gen-browser.d.ts.map +1 -1
- package/dist/tools/test-gen-browser.js +51 -47
- package/dist/tools/upgrade-packages/index.d.ts.map +1 -1
- package/dist/tools/upgrade-packages/index.js +4 -0
- package/dist/tools/upgrade-packages/utils.d.ts +1 -0
- package/dist/tools/upgrade-packages/utils.d.ts.map +1 -1
- package/dist/tools/upgrade-packages/utils.js +1 -0
- package/dist/trace-utils/index.d.ts +1 -1
- package/dist/trace-utils/index.d.ts.map +1 -1
- package/dist/trace-utils/index.js +1 -1
- package/dist/utils/dedup/dedup-image.d.ts +22 -0
- package/dist/utils/dedup/dedup-image.d.ts.map +1 -0
- package/dist/utils/dedup/dedup-image.js +26 -0
- package/dist/utils/dedup/find-threshold.d.ts +2 -0
- package/dist/utils/dedup/find-threshold.d.ts.map +1 -0
- package/dist/utils/dedup/find-threshold.js +42 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +24 -0
- package/dist/utils/model.d.ts +1 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +7 -5
- package/dist/utils/repo-tree.d.ts +0 -1
- package/dist/utils/repo-tree.d.ts.map +1 -1
- package/dist/utils/repo-tree.js +2 -14
- package/dist/utils/slug.js +1 -1
- package/dist/video-core/agent-orchestrator.d.ts +13 -0
- package/dist/video-core/agent-orchestrator.d.ts.map +1 -0
- package/dist/video-core/agent-orchestrator.js +59 -0
- package/dist/video-core/index.d.ts +39 -0
- package/dist/video-core/index.d.ts.map +1 -0
- package/dist/video-core/index.js +134 -0
- package/dist/video-core/model-limits.d.ts +4 -0
- package/dist/video-core/model-limits.d.ts.map +1 -0
- package/dist/video-core/model-limits.js +73 -0
- package/dist/video-core/storage-manager.d.ts +5 -0
- package/dist/video-core/storage-manager.d.ts.map +1 -0
- package/dist/video-core/storage-manager.js +62 -0
- package/dist/video-core/types.d.ts +13 -0
- package/dist/video-core/types.d.ts.map +1 -0
- package/dist/video-core/types.js +2 -0
- package/dist/video-core/utils.d.ts +15 -0
- package/dist/video-core/utils.d.ts.map +1 -0
- package/dist/video-core/utils.js +194 -0
- package/dist/video-core/xml-parser.d.ts +3 -0
- package/dist/video-core/xml-parser.d.ts.map +1 -0
- package/dist/video-core/xml-parser.js +27 -0
- package/package.json +6 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/agent/chat/prompt/index.d.ts +0 -6
- package/dist/agent/chat/prompt/index.d.ts.map +0 -1
- package/dist/agent/chat/prompt/index.js +0 -200
- package/dist/agent/code-review/prompt.d.ts +0 -2
- package/dist/agent/code-review/prompt.d.ts.map +0 -1
- package/dist/agent/code-review/prompt.js +0 -55
- package/dist/agent/diagnosis-agent/index.d.ts +0 -11
- package/dist/agent/diagnosis-agent/index.d.ts.map +0 -1
- package/dist/agent/diagnosis-agent/index.js +0 -88
- package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts +0 -10
- package/dist/agent/diagnosis-agent/strict-mode-violation.d.ts.map +0 -1
- package/dist/agent/diagnosis-agent/strict-mode-violation.js +0 -30
- package/dist/tools/definitions/extract-frames-from-video.d.ts +0 -39
- package/dist/tools/definitions/extract-frames-from-video.d.ts.map +0 -1
- package/dist/tools/definitions/extract-frames-from-video.js +0 -60
- package/dist/tools/definitions/fetch-video-analysis.d.ts.map +0 -1
- package/dist/tools/definitions/fetch-video-analysis.js +0 -61
- package/dist/tools/extract-frames-from-video/index.d.ts +0 -7
- package/dist/tools/extract-frames-from-video/index.d.ts.map +0 -1
- package/dist/tools/extract-frames-from-video/index.js +0 -145
- package/dist/tools/fetch-video-analysis/index.d.ts +0 -5
- package/dist/tools/fetch-video-analysis/index.d.ts.map +0 -1
- package/dist/tools/fetch-video-analysis/index.js +0 -149
- package/dist/tools/fetch-video-analysis/open-ai.d.ts +0 -6
- package/dist/tools/fetch-video-analysis/open-ai.d.ts.map +0 -1
- package/dist/tools/fetch-video-analysis/open-ai.js +0 -37
- package/dist/tools/fetch-video-analysis/utils.d.ts +0 -16
- package/dist/tools/fetch-video-analysis/utils.d.ts.map +0 -1
- package/dist/tools/fetch-video-analysis/utils.js +0 -121
- package/dist/tools/fetch-video-analysis/video-analysis.d.ts +0 -7
- package/dist/tools/fetch-video-analysis/video-analysis.d.ts.map +0 -1
- package/dist/tools/fetch-video-analysis/video-analysis.js +0 -70
- package/dist/tools/file-operations/shared/git-helper.d.ts +0 -4
- package/dist/tools/file-operations/shared/git-helper.d.ts.map +0 -1
- package/dist/tools/file-operations/shared/git-helper.js +0 -29
- package/dist/utils/dedup-image-fs.d.ts +0 -27
- package/dist/utils/dedup-image-fs.d.ts.map +0 -1
- package/dist/utils/dedup-image-fs.js +0 -88
- package/dist/utils/dedup-image.d.ts +0 -25
- package/dist/utils/dedup-image.d.ts.map +0 -1
- package/dist/utils/dedup-image.js +0 -80
- package/dist/utils/local-ffmpeg-client.d.ts +0 -27
- package/dist/utils/local-ffmpeg-client.d.ts.map +0 -1
- package/dist/utils/local-ffmpeg-client.js +0 -299
- 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;
|
|
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,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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|
package/dist/utils/model.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/model.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
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-
|
|
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 +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;
|
|
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"}
|
package/dist/utils/repo-tree.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
8
|
+
exclude: constants_1.DEFAULT_EXCLUDE,
|
|
21
9
|
maxDepth: 10,
|
|
22
10
|
};
|
|
23
11
|
const opts = { ...defaultOptions, ...options };
|
package/dist/utils/slug.js
CHANGED
|
@@ -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"}
|