bruniai 0.1.15 → 0.1.17
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/dist/compare-image-to-url.d.ts.map +1 -1
- package/dist/compare-image-to-url.js +2 -8
- package/dist/compare-image-to-url.js.map +1 -1
- package/dist/compare-urls.d.ts.map +1 -1
- package/dist/compare-urls.js +2 -8
- package/dist/compare-urls.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/report.d.ts +23 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +57 -0
- package/dist/report.js.map +1 -0
- package/dist/runtime/utils/stagehand.d.ts +3 -0
- package/dist/runtime/utils/stagehand.d.ts.map +1 -0
- package/dist/runtime/utils/stagehand.js +102 -0
- package/dist/runtime/utils/stagehand.js.map +1 -0
- package/dist/runtime/vision/vision.d.ts.map +1 -1
- package/dist/runtime/vision/vision.js +3 -15
- package/dist/runtime/vision/vision.js.map +1 -1
- package/dist/stagehand.d.ts +4 -0
- package/dist/stagehand.d.ts.map +1 -0
- package/dist/stagehand.js +102 -0
- package/dist/stagehand.js.map +1 -0
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-image-to-url.d.ts","sourceRoot":"","sources":["../src/compare-image-to-url.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare-image-to-url.d.ts","sourceRoot":"","sources":["../src/compare-image-to-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AA+DpB;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAgElC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLocalStagehand } from "./stagehand.js";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { mkdirSync, existsSync } from "fs";
|
|
4
4
|
import { tmpdir } from "os";
|
|
@@ -69,13 +69,7 @@ export async function compareImageToUrl(input) {
|
|
|
69
69
|
if (!existsSync(imagesDir)) {
|
|
70
70
|
mkdirSync(imagesDir, { recursive: true });
|
|
71
71
|
}
|
|
72
|
-
const stagehand =
|
|
73
|
-
env: "LOCAL",
|
|
74
|
-
disablePino: true,
|
|
75
|
-
localBrowserLaunchOptions: {
|
|
76
|
-
headless: true,
|
|
77
|
-
},
|
|
78
|
-
});
|
|
72
|
+
const stagehand = await createLocalStagehand();
|
|
79
73
|
try {
|
|
80
74
|
await stagehand.init();
|
|
81
75
|
const result = await performImageToUrlComparison({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-image-to-url.js","sourceRoot":"","sources":["../src/compare-image-to-url.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare-image-to-url.js","sourceRoot":"","sources":["../src/compare-image-to-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-urls.d.ts","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare-urls.d.ts","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0BtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAkE5B"}
|
package/dist/compare-urls.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLocalStagehand } from "./stagehand.js";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { mkdirSync, existsSync } from "fs";
|
|
4
4
|
import { tmpdir } from "os";
|
|
@@ -50,13 +50,7 @@ export async function compareUrls(input) {
|
|
|
50
50
|
mkdirSync(imagesDir, { recursive: true });
|
|
51
51
|
}
|
|
52
52
|
// Initialize Stagehand.
|
|
53
|
-
const stagehand =
|
|
54
|
-
env: "LOCAL",
|
|
55
|
-
disablePino: true,
|
|
56
|
-
localBrowserLaunchOptions: {
|
|
57
|
-
headless: true,
|
|
58
|
-
},
|
|
59
|
-
});
|
|
53
|
+
const stagehand = await createLocalStagehand();
|
|
60
54
|
try {
|
|
61
55
|
await stagehand.init();
|
|
62
56
|
// Perform the core comparison.
|
package/dist/compare-urls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-urls.js","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare-urls.js","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,5 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { compareUrls } from "./compare-urls.js";
|
|
8
8
|
export { compareImageToUrl } from "./compare-image-to-url.js";
|
|
9
|
+
export { sendReport } from "./report.js";
|
|
10
|
+
export type { SendReportInput } from "./report.js";
|
|
9
11
|
export type { CompareImageToUrlInput, CompareImageToUrlOutput, CompareUrlsInput, CompareUrlsOutput, ComparisonImages, } from "./types.js";
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CompareUrlsOutput } from "./types.js";
|
|
2
|
+
/** Comparison mode matching the reporter's ComparisonMode type. */
|
|
3
|
+
type ComparisonMode = "url-to-url" | "image-to-url" | "image-to-image";
|
|
4
|
+
export interface SendReportInput {
|
|
5
|
+
result: CompareUrlsOutput;
|
|
6
|
+
page: string;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
previewUrl: string;
|
|
9
|
+
bruniToken: string;
|
|
10
|
+
bruniApiUrl?: string;
|
|
11
|
+
comparisonMode?: ComparisonMode;
|
|
12
|
+
prNumber?: string;
|
|
13
|
+
repository?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Send a comparison result to the Bruni reporting API and return the report URL.
|
|
17
|
+
*
|
|
18
|
+
* @param input - Report input containing the comparison result and metadata
|
|
19
|
+
* @returns Report URL if the report was successfully sent, null otherwise
|
|
20
|
+
*/
|
|
21
|
+
export declare function sendReport(input: SendReportInput): Promise<string | null>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,mEAAmE;AACnE,KAAK,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAsBvE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwExB"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
async function importSourceModule(relativePath) {
|
|
2
|
+
return (await import(new URL(relativePath, import.meta.url).href));
|
|
3
|
+
}
|
|
4
|
+
async function loadReporterModule() {
|
|
5
|
+
if (import.meta.url.includes("/packages/bruniai/src/")) {
|
|
6
|
+
try {
|
|
7
|
+
return await import("../../../dist/reporter/index.js");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return await importSourceModule("../../../src/reporter/index.ts");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return await import("./runtime/reporter/index.js");
|
|
14
|
+
}
|
|
15
|
+
const DEFAULT_BRUNI_API_URL = "https://bruniai-app.vercel.app/api/tests";
|
|
16
|
+
/**
|
|
17
|
+
* Send a comparison result to the Bruni reporting API and return the report URL.
|
|
18
|
+
*
|
|
19
|
+
* @param input - Report input containing the comparison result and metadata
|
|
20
|
+
* @returns Report URL if the report was successfully sent, null otherwise
|
|
21
|
+
*/
|
|
22
|
+
export async function sendReport(input) {
|
|
23
|
+
const { result, page, baseUrl, previewUrl, bruniToken, bruniApiUrl = DEFAULT_BRUNI_API_URL, comparisonMode = "url-to-url", prNumber = "", repository = "", } = input;
|
|
24
|
+
const { BruniReporter, parseMultiPageAnalysisResults, encodeImageCompressed } = await loadReporterModule();
|
|
25
|
+
const reporter = new BruniReporter(bruniToken, bruniApiUrl);
|
|
26
|
+
const imageRefs = {
|
|
27
|
+
base_screenshot: await encodeImageCompressed(result.images.base_screenshot, "WEBP", 1200, 60),
|
|
28
|
+
pr_screenshot: await encodeImageCompressed(result.images.preview_screenshot, "WEBP", 1200, 60),
|
|
29
|
+
diff_image: await encodeImageCompressed(result.images.diff_image, "WEBP", 1200, 70),
|
|
30
|
+
};
|
|
31
|
+
const multiPageReport = parseMultiPageAnalysisResults(prNumber, repository, [
|
|
32
|
+
{
|
|
33
|
+
page_path: page,
|
|
34
|
+
base_url: baseUrl,
|
|
35
|
+
pr_url: previewUrl,
|
|
36
|
+
visual_analysis: result.visual_analysis,
|
|
37
|
+
sections_analysis: result.sections_analysis,
|
|
38
|
+
image_refs: imageRefs,
|
|
39
|
+
},
|
|
40
|
+
], comparisonMode);
|
|
41
|
+
const apiResponse = await reporter.sendMultiPageReport(multiPageReport);
|
|
42
|
+
if (apiResponse && apiResponse.length > 0) {
|
|
43
|
+
const firstResponse = apiResponse[0];
|
|
44
|
+
if (firstResponse.test && typeof firstResponse.test === "object") {
|
|
45
|
+
const testObj = firstResponse.test;
|
|
46
|
+
const reportId = testObj.id;
|
|
47
|
+
if (reportId) {
|
|
48
|
+
const baseApiUrl = bruniApiUrl
|
|
49
|
+
.replace("/api/tests", "")
|
|
50
|
+
.replace(/\/$/, "");
|
|
51
|
+
return `${baseApiUrl}/test/${reportId}`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAOA,KAAK,UAAU,kBAAkB,CAAI,YAAoB;IACvD,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAM,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,kBAAkB,CAC7B,gCAAgC,CACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;AACrD,CAAC;AAcD,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAsB;IAEtB,MAAM,EACJ,MAAM,EACN,IAAI,EACJ,OAAO,EACP,UAAU,EACV,UAAU,EACV,WAAW,GAAG,qBAAqB,EACnC,cAAc,GAAG,YAAY,EAC7B,QAAQ,GAAG,EAAE,EACb,UAAU,GAAG,EAAE,GAChB,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,aAAa,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,GAC3E,MAAM,kBAAkB,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG;QAChB,eAAe,EAAE,MAAM,qBAAqB,CAC1C,MAAM,CAAC,MAAM,CAAC,eAAe,EAC7B,MAAM,EACN,IAAI,EACJ,EAAE,CACH;QACD,aAAa,EAAE,MAAM,qBAAqB,CACxC,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAChC,MAAM,EACN,IAAI,EACJ,EAAE,CACH;QACD,UAAU,EAAE,MAAM,qBAAqB,CACrC,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,MAAM,EACN,IAAI,EACJ,EAAE,CACH;KACF,CAAC;IAEF,MAAM,eAAe,GAAG,6BAA6B,CACnD,QAAQ,EACR,UAAU,EACV;QACE;YACE,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,UAAU;YAClB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,UAAU,EAAE,SAAS;SACtB;KACF,EACD,cAAc,CACf,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAExE,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,IAAI,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,aAAa,CAAC,IAA+B,CAAC;YAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,WAAW;qBAC3B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;qBACzB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtB,OAAO,GAAG,UAAU,SAAS,QAAQ,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand.d.ts","sourceRoot":"","sources":["../../src/utils/stagehand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AA4HrD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,CAM/D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { platform } from "os";
|
|
3
|
+
import { chromium } from "playwright";
|
|
4
|
+
import { Stagehand } from "@browserbasehq/stagehand";
|
|
5
|
+
const COMMON_BROWSER_PATHS = {
|
|
6
|
+
darwin: [
|
|
7
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
8
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
9
|
+
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
10
|
+
],
|
|
11
|
+
linux: [
|
|
12
|
+
"/usr/bin/google-chrome-stable",
|
|
13
|
+
"/usr/bin/google-chrome",
|
|
14
|
+
"/usr/bin/chromium-browser",
|
|
15
|
+
"/usr/bin/chromium",
|
|
16
|
+
],
|
|
17
|
+
win32: [
|
|
18
|
+
"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
|
|
19
|
+
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
|
|
20
|
+
"C:\\Program Files\\Chromium\\Application\\chrome.exe",
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
function firstExistingPath(paths) {
|
|
24
|
+
for (const candidate of paths) {
|
|
25
|
+
if (candidate && existsSync(candidate)) {
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function resolvePlaywrightExecutablePath() {
|
|
32
|
+
try {
|
|
33
|
+
const executablePath = chromium.executablePath();
|
|
34
|
+
if (executablePath && existsSync(executablePath)) {
|
|
35
|
+
return executablePath;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Fall through to system browser lookup.
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function extractServerlessChromium(module) {
|
|
44
|
+
return module.default ?? module;
|
|
45
|
+
}
|
|
46
|
+
async function resolveServerlessChromiumLaunchOptions() {
|
|
47
|
+
if (!process.env.VERCEL) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const chromiumModule = extractServerlessChromium((await import("@sparticuz/chromium")));
|
|
52
|
+
const executablePath = await chromiumModule.executablePath?.();
|
|
53
|
+
if (!executablePath) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
headless: true,
|
|
58
|
+
executablePath,
|
|
59
|
+
args: chromiumModule.args,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function resolveChromiumExecutablePath() {
|
|
67
|
+
const envPath = firstExistingPath([
|
|
68
|
+
process.env.CHROME_PATH,
|
|
69
|
+
process.env.CHROMIUM_PATH,
|
|
70
|
+
process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH,
|
|
71
|
+
]);
|
|
72
|
+
if (envPath) {
|
|
73
|
+
return envPath;
|
|
74
|
+
}
|
|
75
|
+
const playwrightPath = resolvePlaywrightExecutablePath();
|
|
76
|
+
if (playwrightPath) {
|
|
77
|
+
return playwrightPath;
|
|
78
|
+
}
|
|
79
|
+
return firstExistingPath(COMMON_BROWSER_PATHS[platform()] || []);
|
|
80
|
+
}
|
|
81
|
+
async function getLocalBrowserLaunchOptions() {
|
|
82
|
+
const serverlessOptions = await resolveServerlessChromiumLaunchOptions();
|
|
83
|
+
if (serverlessOptions) {
|
|
84
|
+
return serverlessOptions;
|
|
85
|
+
}
|
|
86
|
+
const executablePath = resolveChromiumExecutablePath();
|
|
87
|
+
if (!executablePath) {
|
|
88
|
+
throw new Error("Unable to find a Chromium/Chrome executable. Set CHROME_PATH, install Playwright Chromium locally, or provide @sparticuz/chromium in serverless environments.");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
headless: true,
|
|
92
|
+
executablePath,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function createLocalStagehand() {
|
|
96
|
+
return new Stagehand({
|
|
97
|
+
env: "LOCAL",
|
|
98
|
+
disablePino: true,
|
|
99
|
+
localBrowserLaunchOptions: await getLocalBrowserLaunchOptions(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=stagehand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand.js","sourceRoot":"","sources":["../../src/utils/stagehand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/vision/vision.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/vision/vision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AASpB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAkF/B;AAED;;;;;;GAMG;AACH,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAwF/B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Stagehand } from "@browserbasehq/stagehand";
|
|
2
1
|
import { validateAndFixEnums, generateMetadata } from "./utils.js";
|
|
2
|
+
import { createLocalStagehand } from "../utils/stagehand.js";
|
|
3
3
|
import { analyzeBaseUrlAgent, analyzePreviewUrlAgent, analyzeImagesAgent, } from "./agents.js";
|
|
4
4
|
import { combineAgentResults } from "./combiner.js";
|
|
5
5
|
/**
|
|
@@ -31,13 +31,7 @@ import { combineAgentResults } from "./combiner.js";
|
|
|
31
31
|
export async function analyzeImagesWithVision(base_screenshot, pr_screenshot, diff_image, base_url, preview_url, pr_number, repository, sections_analysis, user_id) {
|
|
32
32
|
console.log(`\n${"=".repeat(50)}\n🔍 Starting sequential agent-based analysis\n${"=".repeat(50)}`);
|
|
33
33
|
// Initialize Stagehand (shared across all agents).
|
|
34
|
-
const stagehand =
|
|
35
|
-
env: "LOCAL",
|
|
36
|
-
disablePino: true,
|
|
37
|
-
localBrowserLaunchOptions: {
|
|
38
|
-
headless: true,
|
|
39
|
-
},
|
|
40
|
-
});
|
|
34
|
+
const stagehand = await createLocalStagehand();
|
|
41
35
|
try {
|
|
42
36
|
await stagehand.init();
|
|
43
37
|
// Agent 1: Analyze base URL structure and sections.
|
|
@@ -85,13 +79,7 @@ export async function analyzeImagesWithVision(base_screenshot, pr_screenshot, di
|
|
|
85
79
|
export async function analyzeImagesWithVisionImageMode(base_screenshot, pr_screenshot, diff_image, base_url, preview_url, pr_number, repository, sections_analysis, user_id) {
|
|
86
80
|
console.log(`\n${"=".repeat(50)}\n🔍 Starting image-baseline visual analysis (image-based only)\n${"=".repeat(50)}`);
|
|
87
81
|
// Initialize Stagehand for image and preview URL analysis.
|
|
88
|
-
const stagehand =
|
|
89
|
-
env: "LOCAL",
|
|
90
|
-
disablePino: true,
|
|
91
|
-
localBrowserLaunchOptions: {
|
|
92
|
-
headless: true,
|
|
93
|
-
},
|
|
94
|
-
});
|
|
82
|
+
const stagehand = await createLocalStagehand();
|
|
95
83
|
try {
|
|
96
84
|
await stagehand.init();
|
|
97
85
|
// For image baseline mode, we create a synthetic base analysis from the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/vision/vision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/vision/vision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand.d.ts","sourceRoot":"","sources":["../src/stagehand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAqFrD,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAiBlE;AAsBD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,CAM/D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { platform } from "os";
|
|
3
|
+
import { chromium } from "playwright";
|
|
4
|
+
import { Stagehand } from "@browserbasehq/stagehand";
|
|
5
|
+
const COMMON_BROWSER_PATHS = {
|
|
6
|
+
darwin: [
|
|
7
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
8
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
9
|
+
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
10
|
+
],
|
|
11
|
+
linux: [
|
|
12
|
+
"/usr/bin/google-chrome-stable",
|
|
13
|
+
"/usr/bin/google-chrome",
|
|
14
|
+
"/usr/bin/chromium-browser",
|
|
15
|
+
"/usr/bin/chromium",
|
|
16
|
+
],
|
|
17
|
+
win32: [
|
|
18
|
+
"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
|
|
19
|
+
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
|
|
20
|
+
"C:\\Program Files\\Chromium\\Application\\chrome.exe",
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
function firstExistingPath(paths) {
|
|
24
|
+
for (const candidate of paths) {
|
|
25
|
+
if (candidate && existsSync(candidate)) {
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function resolvePlaywrightExecutablePath() {
|
|
32
|
+
try {
|
|
33
|
+
const executablePath = chromium.executablePath();
|
|
34
|
+
if (executablePath && existsSync(executablePath)) {
|
|
35
|
+
return executablePath;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Fall through to system browser lookup.
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function extractServerlessChromium(module) {
|
|
44
|
+
return module.default ?? module;
|
|
45
|
+
}
|
|
46
|
+
async function resolveServerlessChromiumLaunchOptions() {
|
|
47
|
+
if (!process.env.VERCEL) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const chromiumModule = extractServerlessChromium((await import("@sparticuz/chromium")));
|
|
52
|
+
const executablePath = await chromiumModule.executablePath?.();
|
|
53
|
+
if (!executablePath) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
headless: true,
|
|
58
|
+
executablePath,
|
|
59
|
+
args: chromiumModule.args,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function resolveChromiumExecutablePath() {
|
|
67
|
+
const envPath = firstExistingPath([
|
|
68
|
+
process.env.CHROME_PATH,
|
|
69
|
+
process.env.CHROMIUM_PATH,
|
|
70
|
+
process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH,
|
|
71
|
+
]);
|
|
72
|
+
if (envPath) {
|
|
73
|
+
return envPath;
|
|
74
|
+
}
|
|
75
|
+
const playwrightPath = resolvePlaywrightExecutablePath();
|
|
76
|
+
if (playwrightPath) {
|
|
77
|
+
return playwrightPath;
|
|
78
|
+
}
|
|
79
|
+
return firstExistingPath(COMMON_BROWSER_PATHS[platform()] || []);
|
|
80
|
+
}
|
|
81
|
+
async function getLocalBrowserLaunchOptions() {
|
|
82
|
+
const serverlessOptions = await resolveServerlessChromiumLaunchOptions();
|
|
83
|
+
if (serverlessOptions) {
|
|
84
|
+
return serverlessOptions;
|
|
85
|
+
}
|
|
86
|
+
const executablePath = resolveChromiumExecutablePath();
|
|
87
|
+
if (!executablePath) {
|
|
88
|
+
throw new Error("Unable to find a Chromium/Chrome executable. Set CHROME_PATH, install Playwright Chromium locally, or provide @sparticuz/chromium in serverless environments.");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
headless: true,
|
|
92
|
+
executablePath,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function createLocalStagehand() {
|
|
96
|
+
return new Stagehand({
|
|
97
|
+
env: "LOCAL",
|
|
98
|
+
disablePino: true,
|
|
99
|
+
localBrowserLaunchOptions: await getLocalBrowserLaunchOptions(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=stagehand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand.js","sourceRoot":"","sources":["../src/stagehand.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bruniai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI-powered visual regression testing tool - core comparison library",
|
|
6
6
|
"author": "Joao Garin",
|
|
@@ -22,14 +22,15 @@
|
|
|
22
22
|
"dev": "tsx src/index.ts"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@
|
|
25
|
+
"@sparticuz/chromium": "^138.0.2",
|
|
26
|
+
"@browserbasehq/stagehand": "^3.2.1",
|
|
26
27
|
"dotenv": "^16.0.0",
|
|
27
28
|
"pixelmatch": "^7.1.0",
|
|
28
|
-
"playwright": "^1.
|
|
29
|
+
"playwright": "^1.59.1",
|
|
29
30
|
"pngjs": "^7.0.0",
|
|
30
31
|
"sharp": "^0.34.5",
|
|
31
32
|
"uuid": "^10.0.0",
|
|
32
|
-
"zod": "^3.
|
|
33
|
+
"zod": "^3.25.76"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@types/node": "^20.11.24",
|
|
@@ -40,6 +41,6 @@
|
|
|
40
41
|
"typescript": "^5.5.4"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
43
|
-
"@browserbasehq/stagehand": "^3.
|
|
44
|
+
"@browserbasehq/stagehand": "^3.2.1"
|
|
44
45
|
}
|
|
45
46
|
}
|