bruniai 0.1.13 ā 0.1.15
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/README.md +13 -9
- package/dist/compare-image-to-url.d.ts +16 -0
- package/dist/compare-image-to-url.d.ts.map +1 -0
- package/dist/compare-image-to-url.js +115 -0
- package/dist/compare-image-to-url.js.map +1 -0
- package/dist/compare-urls.d.ts.map +1 -1
- package/dist/compare-urls.js +18 -5
- package/dist/compare-urls.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/comparison/core.d.ts +6 -0
- package/dist/runtime/comparison/core.d.ts.map +1 -1
- package/dist/runtime/comparison/core.js.map +1 -1
- package/dist/runtime/comparison/image-core.d.ts +6 -4
- package/dist/runtime/comparison/image-core.d.ts.map +1 -1
- package/dist/runtime/comparison/image-core.js +37 -31
- package/dist/runtime/comparison/image-core.js.map +1 -1
- package/dist/runtime/comparison/image-image-core.d.ts +2 -0
- package/dist/runtime/comparison/image-image-core.d.ts.map +1 -1
- package/dist/runtime/comparison/image-image-core.js +34 -28
- package/dist/runtime/comparison/image-image-core.js.map +1 -1
- package/dist/runtime/comparison/section-explanation-mode.d.ts +3 -0
- package/dist/runtime/comparison/section-explanation-mode.d.ts.map +1 -0
- package/dist/runtime/comparison/section-explanation-mode.js +10 -0
- package/dist/runtime/comparison/section-explanation-mode.js.map +1 -0
- package/dist/runtime/image/report.d.ts +1 -1
- package/dist/runtime/image/report.d.ts.map +1 -1
- package/dist/runtime/image/report.js +2 -2
- package/dist/runtime/image/report.js.map +1 -1
- package/dist/runtime/vision/agents.d.ts.map +1 -1
- package/dist/runtime/vision/agents.js +129 -86
- package/dist/runtime/vision/agents.js.map +1 -1
- package/dist/runtime/vision/vision.d.ts.map +1 -1
- package/dist/runtime/vision/vision.js +2 -0
- package/dist/runtime/vision/vision.js.map +1 -1
- package/dist/types.d.ts +29 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/compare-images.d.ts +0 -16
- package/dist/compare-images.d.ts.map +0 -1
- package/dist/compare-images.js +0 -74
- package/dist/compare-images.js.map +0 -1
- package/dist/runtime/comparison/figma-core.d.ts +0 -66
- package/dist/runtime/comparison/figma-core.d.ts.map +0 -1
- package/dist/runtime/comparison/figma-core.js +0 -116
- package/dist/runtime/comparison/figma-core.js.map +0 -1
- package/dist/runtime/vision/comparison-html.d.ts +0 -16
- package/dist/runtime/vision/comparison-html.d.ts.map +0 -1
- package/dist/runtime/vision/comparison-html.js +0 -116
- package/dist/runtime/vision/comparison-html.js.map +0 -1
- package/dist/runtime/vision/section-judge.d.ts +0 -8
- package/dist/runtime/vision/section-judge.d.ts.map +0 -1
- package/dist/runtime/vision/section-judge.js +0 -87
- package/dist/runtime/vision/section-judge.js.map +0 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ npm install bruniai
|
|
|
13
13
|
## Usage
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import {
|
|
16
|
+
import { compareImageToUrl, compareUrls } from "bruniai";
|
|
17
17
|
|
|
18
18
|
const result = await compareUrls({
|
|
19
19
|
baseUrl: "https://example.com",
|
|
@@ -25,9 +25,10 @@ console.log(result.status); // "pass" | "fail" | "warning"
|
|
|
25
25
|
console.log(result.visual_analysis);
|
|
26
26
|
console.log(result.images.base_screenshot);
|
|
27
27
|
|
|
28
|
-
const imageResult = await
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const imageResult = await compareImageToUrl({
|
|
29
|
+
baseImageSource: "https://example.com/design.png",
|
|
30
|
+
previewUrl: "https://preview.example.com",
|
|
31
|
+
page: "/contact",
|
|
31
32
|
});
|
|
32
33
|
|
|
33
34
|
console.log(imageResult.status);
|
|
@@ -54,21 +55,24 @@ Performs a visual comparison between two URLs.
|
|
|
54
55
|
- `sections_analysis`: Formatted sections analysis text
|
|
55
56
|
- `images`: Object containing paths to generated screenshots and diff images
|
|
56
57
|
|
|
57
|
-
### `
|
|
58
|
+
### `compareImageToUrl(input: CompareImageToUrlInput): Promise<CompareImageToUrlOutput>`
|
|
58
59
|
|
|
59
|
-
Performs a visual comparison between
|
|
60
|
+
Performs a visual comparison between a base image source and a preview URL.
|
|
60
61
|
|
|
61
62
|
**Parameters:**
|
|
62
63
|
|
|
63
|
-
- `
|
|
64
|
-
- `
|
|
64
|
+
- `baseImageSource` (string): Base/reference image source as an HTTP(S) image URL or `data:image/...`
|
|
65
|
+
- `previewUrl` (string): Preview/changed webpage URL to analyze
|
|
66
|
+
- `page` (string, optional): Page path to compare on the preview URL (default: "/")
|
|
67
|
+
- `prNumber` (string, optional): PR number for metadata
|
|
68
|
+
- `repository` (string, optional): Repository name for metadata
|
|
65
69
|
|
|
66
70
|
**Returns:**
|
|
67
71
|
|
|
68
72
|
- `status`: Overall comparison status ("pass" | "fail" | "warning" | "none")
|
|
69
73
|
- `visual_analysis`: Detailed visual analysis result from AI
|
|
70
74
|
- `sections_analysis`: Formatted sections analysis text
|
|
71
|
-
- `images`: Object containing paths to normalized
|
|
75
|
+
- `images`: Object containing paths to normalized screenshots and diff images
|
|
72
76
|
|
|
73
77
|
## Requirements
|
|
74
78
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompareImageToUrlInput, CompareImageToUrlOutput } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compare a base image source against a preview URL and return analysis results.
|
|
4
|
+
*
|
|
5
|
+
* This function performs a complete image-to-URL comparison workflow:
|
|
6
|
+
* - Creates a temporary directory for images
|
|
7
|
+
* - Captures the preview webpage with Stagehand
|
|
8
|
+
* - Normalizes the design image and preview screenshot into comparable PNGs
|
|
9
|
+
* - Generates diff images and matched section crops
|
|
10
|
+
* - Produces structured analysis output
|
|
11
|
+
*
|
|
12
|
+
* @param input - Comparison input parameters
|
|
13
|
+
* @returns Complete analysis results with image paths
|
|
14
|
+
*/
|
|
15
|
+
export declare function compareImageToUrl(input: CompareImageToUrlInput): Promise<CompareImageToUrlOutput>;
|
|
16
|
+
//# sourceMappingURL=compare-image-to-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-image-to-url.d.ts","sourceRoot":"","sources":["../src/compare-image-to-url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AA8DpB;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAsElC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Stagehand } from "@browserbasehq/stagehand";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { mkdirSync, existsSync } from "fs";
|
|
4
|
+
import { tmpdir } from "os";
|
|
5
|
+
async function importSourceModule(relativePath) {
|
|
6
|
+
return (await import(new URL(relativePath, import.meta.url).href));
|
|
7
|
+
}
|
|
8
|
+
async function loadImageToUrlComparisonModule() {
|
|
9
|
+
if (import.meta.url.includes("/packages/bruniai/src/")) {
|
|
10
|
+
try {
|
|
11
|
+
return await import("../../../dist/comparison/image-core.js");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return await importSourceModule("../../../src/comparison/image-core.ts");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return await import("./runtime/comparison/image-core.js");
|
|
18
|
+
}
|
|
19
|
+
function isSupportedImageSource(input) {
|
|
20
|
+
if (!input) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (input.startsWith("data:image/")) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(input);
|
|
28
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function assertSupportedImageSource(input, fieldName) {
|
|
35
|
+
if (!isSupportedImageSource(input)) {
|
|
36
|
+
throw new Error(`${fieldName} must be an HTTP(S) image URL or data:image/... string`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function assertSupportedPreviewUrl(input, fieldName) {
|
|
40
|
+
try {
|
|
41
|
+
const parsed = new URL(input);
|
|
42
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
43
|
+
throw new Error("unsupported protocol");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new Error(`${fieldName} must be an HTTP(S) URL`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compare a base image source against a preview URL and return analysis results.
|
|
52
|
+
*
|
|
53
|
+
* This function performs a complete image-to-URL comparison workflow:
|
|
54
|
+
* - Creates a temporary directory for images
|
|
55
|
+
* - Captures the preview webpage with Stagehand
|
|
56
|
+
* - Normalizes the design image and preview screenshot into comparable PNGs
|
|
57
|
+
* - Generates diff images and matched section crops
|
|
58
|
+
* - Produces structured analysis output
|
|
59
|
+
*
|
|
60
|
+
* @param input - Comparison input parameters
|
|
61
|
+
* @returns Complete analysis results with image paths
|
|
62
|
+
*/
|
|
63
|
+
export async function compareImageToUrl(input) {
|
|
64
|
+
const { baseImageSource, previewUrl, page = "/", sectionExplanationMode = "fast", prNumber, repository, } = input;
|
|
65
|
+
assertSupportedImageSource(baseImageSource, "baseImageSource");
|
|
66
|
+
assertSupportedPreviewUrl(previewUrl, "previewUrl");
|
|
67
|
+
const { performImageToUrlComparison } = await loadImageToUrlComparisonModule();
|
|
68
|
+
const imagesDir = join(tmpdir(), `bruniai-${Date.now()}`);
|
|
69
|
+
if (!existsSync(imagesDir)) {
|
|
70
|
+
mkdirSync(imagesDir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
const stagehand = new Stagehand({
|
|
73
|
+
env: "LOCAL",
|
|
74
|
+
disablePino: true,
|
|
75
|
+
localBrowserLaunchOptions: {
|
|
76
|
+
headless: true,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
await stagehand.init();
|
|
81
|
+
const result = await performImageToUrlComparison({
|
|
82
|
+
stagehand,
|
|
83
|
+
baseImageSource,
|
|
84
|
+
previewUrl,
|
|
85
|
+
page,
|
|
86
|
+
sectionExplanationMode,
|
|
87
|
+
imagesDir,
|
|
88
|
+
prNumber,
|
|
89
|
+
repository,
|
|
90
|
+
});
|
|
91
|
+
const status = result.visual_analysis.status === "none"
|
|
92
|
+
? "pass"
|
|
93
|
+
: result.visual_analysis.status;
|
|
94
|
+
return {
|
|
95
|
+
status,
|
|
96
|
+
visual_analysis: result.visual_analysis,
|
|
97
|
+
sections_analysis: result.sections_analysis,
|
|
98
|
+
images: {
|
|
99
|
+
base_screenshot: result.base_screenshot,
|
|
100
|
+
preview_screenshot: result.preview_screenshot,
|
|
101
|
+
diff_image: result.diff_image,
|
|
102
|
+
section_screenshots: Object.keys(result.section_screenshots).length > 0
|
|
103
|
+
? Object.fromEntries(Object.entries(result.section_screenshots).map(([key, value]) => [
|
|
104
|
+
key,
|
|
105
|
+
{ base: value.base, preview: value.preview },
|
|
106
|
+
]))
|
|
107
|
+
: undefined,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
await stagehand.close();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=compare-image-to-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"compare-urls.d.ts","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAyBtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAwE5B"}
|
package/dist/compare-urls.js
CHANGED
|
@@ -2,9 +2,20 @@ import { Stagehand } from "@browserbasehq/stagehand";
|
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { mkdirSync, existsSync } from "fs";
|
|
4
4
|
import { tmpdir } from "os";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
async function importSourceModule(relativePath) {
|
|
6
|
+
return (await import(new URL(relativePath, import.meta.url).href));
|
|
7
|
+
}
|
|
8
|
+
async function loadComparisonCoreModule() {
|
|
9
|
+
if (import.meta.url.includes("/packages/bruniai/src/")) {
|
|
10
|
+
try {
|
|
11
|
+
return await import("../../../dist/comparison/core.js");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return await importSourceModule("../../../src/comparison/core.ts");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return await import("./runtime/comparison/core.js");
|
|
18
|
+
}
|
|
8
19
|
/**
|
|
9
20
|
* Compare two URLs visually and return analysis results.
|
|
10
21
|
*
|
|
@@ -31,8 +42,8 @@ const comparisonCoreModulePromise = import.meta.url.includes("/packages/bruniai/
|
|
|
31
42
|
* ```
|
|
32
43
|
*/
|
|
33
44
|
export async function compareUrls(input) {
|
|
34
|
-
const { baseUrl, previewUrl, page = "/" } = input;
|
|
35
|
-
const { performComparison } = await
|
|
45
|
+
const { baseUrl, previewUrl, page = "/", sectionExplanationMode = "fast", } = input;
|
|
46
|
+
const { performComparison } = await loadComparisonCoreModule();
|
|
36
47
|
// Create temporary directory for images.
|
|
37
48
|
const imagesDir = join(tmpdir(), `bruniai-${Date.now()}`);
|
|
38
49
|
if (!existsSync(imagesDir)) {
|
|
@@ -41,6 +52,7 @@ export async function compareUrls(input) {
|
|
|
41
52
|
// Initialize Stagehand.
|
|
42
53
|
const stagehand = new Stagehand({
|
|
43
54
|
env: "LOCAL",
|
|
55
|
+
disablePino: true,
|
|
44
56
|
localBrowserLaunchOptions: {
|
|
45
57
|
headless: true,
|
|
46
58
|
},
|
|
@@ -53,6 +65,7 @@ export async function compareUrls(input) {
|
|
|
53
65
|
baseUrl,
|
|
54
66
|
previewUrl,
|
|
55
67
|
page,
|
|
68
|
+
sectionExplanationMode,
|
|
56
69
|
imagesDir,
|
|
57
70
|
prNumber: input.prNumber,
|
|
58
71
|
repository: input.repository,
|
package/dist/compare-urls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-urls.js","sourceRoot":"","sources":["../src/compare-urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,MAAM,
|
|
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
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* Provides a simple API to compare two URLs and analyze visual differences.
|
|
6
6
|
*/
|
|
7
7
|
export { compareUrls } from "./compare-urls.js";
|
|
8
|
-
export {
|
|
9
|
-
export type {
|
|
8
|
+
export { compareImageToUrl } from "./compare-image-to-url.js";
|
|
9
|
+
export type { CompareImageToUrlInput, CompareImageToUrlOutput, CompareUrlsInput, CompareUrlsOutput, ComparisonImages, } from "./types.js";
|
|
10
10
|
//# 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,
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* Provides a simple API to compare two URLs and analyze visual differences.
|
|
6
6
|
*/
|
|
7
7
|
export { compareUrls } from "./compare-urls.js";
|
|
8
|
-
export {
|
|
8
|
+
export { compareImageToUrl } from "./compare-image-to-url.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
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,
|
|
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"}
|
|
@@ -13,6 +13,12 @@ export interface ComparisonOptions {
|
|
|
13
13
|
previewUrl: string;
|
|
14
14
|
/** Page path to compare (e.g., "/" or "/about"). */
|
|
15
15
|
page: string;
|
|
16
|
+
/**
|
|
17
|
+
* Reserved for deterministic section explanation flows.
|
|
18
|
+
* The current URL-to-URL path does not use it directly yet, but the option
|
|
19
|
+
* is threaded through for API consistency.
|
|
20
|
+
*/
|
|
21
|
+
sectionExplanationMode?: "fast" | "detailed" | "off";
|
|
16
22
|
/** Directory where images should be saved. */
|
|
17
23
|
imagesDir: string;
|
|
18
24
|
/** Optional PR number for metadata. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/comparison/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAS1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,SAAS,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,eAAe,EAAE,oBAAoB,CAAC;IACtC,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,sDAAsD;IACtD,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAqI3B"}
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/comparison/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAS1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,SAAS,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IACrD,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,eAAe,EAAE,oBAAoB,CAAC;IACtC,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,sDAAsD;IACtD,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAqI3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/comparison/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAGjF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/comparison/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,16 +7,18 @@
|
|
|
7
7
|
import type { Stagehand } from "@browserbasehq/stagehand";
|
|
8
8
|
import type { VisualAnalysisResult } from "../vision/types.js";
|
|
9
9
|
import type { SectionVisualResult } from "../reporter/types.js";
|
|
10
|
-
|
|
10
|
+
import { type SectionExplanationMode } from "./section-explanation-mode.js";
|
|
11
|
+
export interface ImageToUrlComparisonOptions {
|
|
11
12
|
stagehand: Stagehand;
|
|
12
|
-
|
|
13
|
+
baseImageSource: string;
|
|
13
14
|
previewUrl: string;
|
|
14
15
|
page: string;
|
|
16
|
+
sectionExplanationMode?: SectionExplanationMode;
|
|
15
17
|
imagesDir: string;
|
|
16
18
|
prNumber?: string;
|
|
17
19
|
repository?: string;
|
|
18
20
|
}
|
|
19
|
-
export interface
|
|
21
|
+
export interface ImageToUrlComparisonResult {
|
|
20
22
|
visual_analysis: VisualAnalysisResult;
|
|
21
23
|
sections_analysis: string;
|
|
22
24
|
base_screenshot: string;
|
|
@@ -29,5 +31,5 @@ export interface ImageComparisonResult {
|
|
|
29
31
|
section_results: SectionVisualResult[];
|
|
30
32
|
mode: "image-to-url";
|
|
31
33
|
}
|
|
32
|
-
export declare function
|
|
34
|
+
export declare function performImageToUrlComparison(options: ImageToUrlComparisonOptions): Promise<ImageToUrlComparisonResult>;
|
|
33
35
|
//# sourceMappingURL=image-core.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-core.d.ts","sourceRoot":"","sources":["../../src/comparison/image-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAe1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"image-core.d.ts","sourceRoot":"","sources":["../../src/comparison/image-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAe1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,oBAAoB,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,IAAI,EAAE,cAAc,CAAC;CACtB;AAiDD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAkSrC"}
|
|
@@ -11,6 +11,7 @@ import { analyzeSectionDiffExplanationsAgent } from "../vision/index.js";
|
|
|
11
11
|
import { join } from "path";
|
|
12
12
|
import { writeFileSync } from "fs";
|
|
13
13
|
import sharp from "sharp";
|
|
14
|
+
import { shouldExplainSection, } from "./section-explanation-mode.js";
|
|
14
15
|
function buildLlmUnavailableExplanation(reason) {
|
|
15
16
|
return `${reason} Review the matched section crop and diff image directly for the exact visual change.`;
|
|
16
17
|
}
|
|
@@ -38,8 +39,8 @@ async function resizeImageToWidth(inputPath, outputPath, width) {
|
|
|
38
39
|
height: metadata.height || 1,
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
|
-
export async function
|
|
42
|
-
const { stagehand,
|
|
42
|
+
export async function performImageToUrlComparison(options) {
|
|
43
|
+
const { stagehand, baseImageSource, previewUrl, page, sectionExplanationMode = "fast", imagesDir, prNumber = "", repository = "", } = options;
|
|
43
44
|
let pageSuffix = page.replace(/\//g, "_");
|
|
44
45
|
pageSuffix = pageSuffix === "_" ? "home" : pageSuffix;
|
|
45
46
|
const baseOriginalPath = join(imagesDir, `base_original_${pageSuffix}.png`);
|
|
@@ -49,7 +50,7 @@ export async function performImageComparison(options) {
|
|
|
49
50
|
const diffImagePath = join(imagesDir, `diff_${pageSuffix}.png`);
|
|
50
51
|
console.log(`\n${"=".repeat(50)}\nš¼ļø Starting deterministic image-to-URL comparison\n${"=".repeat(50)}`);
|
|
51
52
|
console.log("\nš„ Step 1: Downloading design image...");
|
|
52
|
-
await downloadImageToPng(
|
|
53
|
+
await downloadImageToPng(baseImageSource, baseOriginalPath);
|
|
53
54
|
console.log("\nāļø Step 2: Trimming design image margins...");
|
|
54
55
|
const trimResult = await trimImageToContent(baseOriginalPath, baseScreenshotPath);
|
|
55
56
|
const baseWidth = trimResult.trimmedDimensions.width;
|
|
@@ -110,31 +111,34 @@ export async function performImageComparison(options) {
|
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
console.log("\nš§ Step 9: Explaining matched sections with vision...");
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
114
|
+
const explainableSections = sectionMatches
|
|
115
|
+
.filter((match) => shouldExplainSection(match.status, sectionExplanationMode))
|
|
116
|
+
.map((match) => {
|
|
117
|
+
const artifacts = sectionArtifacts.get(match.sectionId);
|
|
118
|
+
if (!artifacts) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
section_id: match.sectionId,
|
|
123
|
+
name: match.name,
|
|
124
|
+
base_screenshot: artifacts.base,
|
|
125
|
+
preview_screenshot: artifacts.preview,
|
|
126
|
+
diff_image: artifacts.diff,
|
|
127
|
+
match_score: match.matchScore,
|
|
128
|
+
final_similarity_score: match.signals.finalSimilarityScore,
|
|
129
|
+
pixel_difference: match.signals.pixelDifference,
|
|
130
|
+
edge_difference: match.signals.edgeDifference,
|
|
131
|
+
structural_similarity: match.signals.structuralSimilarity,
|
|
132
|
+
};
|
|
133
|
+
})
|
|
134
|
+
.filter((section) => section !== null);
|
|
135
|
+
if (sectionExplanationMode === "off") {
|
|
136
|
+
console.log("Skipping section explanation agent because sectionExplanationMode is off.");
|
|
137
|
+
}
|
|
138
|
+
else if (process.env.OPENAI_API_KEY) {
|
|
135
139
|
if (explainableSections.length > 0) {
|
|
136
140
|
try {
|
|
137
|
-
const explanations = await analyzeSectionDiffExplanationsAgent(explainableSections,
|
|
141
|
+
const explanations = await analyzeSectionDiffExplanationsAgent(explainableSections, baseImageSource, previewUrl);
|
|
138
142
|
const explanationsById = new Map(explanations.map((explanation) => [explanation.section_id, explanation]));
|
|
139
143
|
let acceptedCount = 0;
|
|
140
144
|
for (const match of sectionMatches) {
|
|
@@ -165,8 +169,9 @@ export async function performImageComparison(options) {
|
|
|
165
169
|
}
|
|
166
170
|
catch (error) {
|
|
167
171
|
console.warn(`Section explanation agent failed: ${error}`);
|
|
168
|
-
for (const
|
|
169
|
-
|
|
172
|
+
for (const section of explainableSections) {
|
|
173
|
+
const match = sectionMatches.find((candidate) => candidate.sectionId === section.section_id);
|
|
174
|
+
if (!match) {
|
|
170
175
|
continue;
|
|
171
176
|
}
|
|
172
177
|
match.humanDescription = buildLlmUnavailableExplanation("The section was compared with the vision model, but the LLM explanation step failed.");
|
|
@@ -178,8 +183,9 @@ export async function performImageComparison(options) {
|
|
|
178
183
|
}
|
|
179
184
|
else {
|
|
180
185
|
console.log("Skipping section explanation agent because OPENAI_API_KEY is not set.");
|
|
181
|
-
for (const
|
|
182
|
-
|
|
186
|
+
for (const section of explainableSections) {
|
|
187
|
+
const match = sectionMatches.find((candidate) => candidate.sectionId === section.section_id);
|
|
188
|
+
if (!match) {
|
|
183
189
|
continue;
|
|
184
190
|
}
|
|
185
191
|
match.humanDescription = buildLlmUnavailableExplanation("The section was compared with the vision model, but OPENAI_API_KEY is not set so no LLM explanation was generated.");
|
|
@@ -226,7 +232,7 @@ export async function performImageComparison(options) {
|
|
|
226
232
|
});
|
|
227
233
|
console.log("\nš§ Step 10: Building deterministic report...");
|
|
228
234
|
const visualAnalysis = buildImageModeVisualAnalysis({
|
|
229
|
-
|
|
235
|
+
baseImageSource,
|
|
230
236
|
previewUrl,
|
|
231
237
|
prNumber,
|
|
232
238
|
repository,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-core.js","sourceRoot":"","sources":["../../src/comparison/image-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"image-core.js","sourceRoot":"","sources":["../../src/comparison/image-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { VisualAnalysisResult } from "../vision/types.js";
|
|
8
8
|
import type { SectionVisualResult } from "../reporter/types.js";
|
|
9
|
+
import { type SectionExplanationMode } from "./section-explanation-mode.js";
|
|
9
10
|
export interface ImageToImageComparisonOptions {
|
|
10
11
|
baseImageUrl: string;
|
|
11
12
|
previewImageUrl: string;
|
|
13
|
+
sectionExplanationMode?: SectionExplanationMode;
|
|
12
14
|
imagesDir: string;
|
|
13
15
|
prNumber?: string;
|
|
14
16
|
repository?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-image-core.d.ts","sourceRoot":"","sources":["../../src/comparison/image-image-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"image-image-core.d.ts","sourceRoot":"","sources":["../../src/comparison/image-image-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,oBAAoB,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAiDD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,4BAA4B,CAAC,CA4RvC"}
|