browser-devtools-mcp 0.0.3 → 0.1.1
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 +507 -59
- package/dist/browser.js +6 -0
- package/dist/browser.js.map +1 -1
- package/dist/config.js +60 -24
- package/dist/config.js.map +1 -1
- package/dist/context.js +28 -0
- package/dist/context.js.map +1 -1
- package/dist/otel/otel-controller.js +4 -0
- package/dist/otel/otel-controller.js.map +1 -1
- package/dist/server-info.js +133 -18
- package/dist/server-info.js.map +1 -1
- package/dist/tools/content/take-screenshot.js +183 -1
- package/dist/tools/content/take-screenshot.js.map +1 -1
- package/dist/tools/figma/compare/compare-image-embedding.js +159 -0
- package/dist/tools/figma/compare/compare-image-embedding.js.map +1 -0
- package/dist/tools/figma/compare/compare-mssim.js +98 -0
- package/dist/tools/figma/compare/compare-mssim.js.map +1 -0
- package/dist/tools/figma/compare/compare-text-embedding.js +291 -0
- package/dist/tools/figma/compare/compare-text-embedding.js.map +1 -0
- package/dist/tools/figma/compare/index.js +139 -0
- package/dist/tools/figma/compare/index.js.map +1 -0
- package/dist/tools/figma/compare/types.js +3 -0
- package/dist/tools/figma/compare/types.js.map +1 -0
- package/dist/tools/figma/compare/vector.js +46 -0
- package/dist/tools/figma/compare/vector.js.map +1 -0
- package/dist/tools/figma/compare-page-with-design.js +240 -0
- package/dist/tools/figma/compare-page-with-design.js.map +1 -0
- package/dist/tools/figma/figma-service.js +134 -0
- package/dist/tools/figma/figma-service.js.map +1 -0
- package/dist/tools/figma/index.js +6 -0
- package/dist/tools/figma/index.js.map +1 -0
- package/dist/tools/index.js +12 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interaction/index.js +6 -2
- package/dist/tools/interaction/index.js.map +1 -1
- package/dist/tools/interaction/resize-viewport.js +110 -0
- package/dist/tools/interaction/resize-viewport.js.map +1 -0
- package/dist/tools/interaction/resize-window.js +261 -0
- package/dist/tools/interaction/resize-window.js.map +1 -0
- package/dist/tools/interaction/scroll.js +304 -0
- package/dist/tools/interaction/scroll.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/get-console-messages.js +1 -1
- package/dist/tools/o11y/get-console-messages.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/get-http-requests.js +1 -1
- package/dist/tools/o11y/get-http-requests.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/get-trace-id.js +1 -1
- package/dist/tools/o11y/get-trace-id.js.map +1 -0
- package/dist/tools/o11y/get-web-vitals.js +595 -0
- package/dist/tools/o11y/get-web-vitals.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/index.js +2 -0
- package/dist/tools/o11y/index.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/new-trace-id.js +1 -1
- package/dist/tools/o11y/new-trace-id.js.map +1 -0
- package/dist/tools/{monitoring → o11y}/set-trace-id.js +1 -1
- package/dist/tools/o11y/set-trace-id.js.map +1 -0
- package/dist/tools/react/get-component-for-element.js +941 -0
- package/dist/tools/react/get-component-for-element.js.map +1 -0
- package/dist/tools/react/get-element-for-component.js +1190 -0
- package/dist/tools/react/get-element-for-component.js.map +1 -0
- package/dist/tools/react/index.js +10 -0
- package/dist/tools/react/index.js.map +1 -0
- package/dist/tools/run/index.js +7 -0
- package/dist/tools/run/index.js.map +1 -0
- package/dist/tools/{interaction/evaluate.js → run/js-in-browser.js} +24 -6
- package/dist/tools/run/js-in-browser.js.map +1 -0
- package/dist/tools/run/js-in-sandbox.js +175 -0
- package/dist/tools/run/js-in-sandbox.js.map +1 -0
- package/dist/tools/stub/clear.js +41 -0
- package/dist/tools/stub/clear.js.map +1 -0
- package/dist/tools/stub/index.js +14 -0
- package/dist/tools/stub/index.js.map +1 -0
- package/dist/tools/stub/intercept-http-request.js +112 -0
- package/dist/tools/stub/intercept-http-request.js.map +1 -0
- package/dist/tools/stub/list.js +75 -0
- package/dist/tools/stub/list.js.map +1 -0
- package/dist/tools/stub/mock-http-response.js +152 -0
- package/dist/tools/stub/mock-http-response.js.map +1 -0
- package/dist/tools/stub/stub-controller.js +284 -0
- package/dist/tools/stub/stub-controller.js.map +1 -0
- package/dist/tools/sync/index.js +6 -0
- package/dist/tools/sync/index.js.map +1 -0
- package/dist/tools/sync/wait-for-network-idle.js +152 -0
- package/dist/tools/sync/wait-for-network-idle.js.map +1 -0
- package/package.json +16 -3
- package/dist/tools/interaction/evaluate.js.map +0 -1
- package/dist/tools/monitoring/get-console-messages.js.map +0 -1
- package/dist/tools/monitoring/get-http-requests.js.map +0 -1
- package/dist/tools/monitoring/get-trace-id.js.map +0 -1
- package/dist/tools/monitoring/index.js.map +0 -1
- package/dist/tools/monitoring/new-trace-id.js.map +0 -1
- package/dist/tools/monitoring/set-trace-id.js.map +0 -1
|
@@ -7,6 +7,8 @@ exports.TakeScreenshot = exports.ScreenshotType = void 0;
|
|
|
7
7
|
const utils_1 = require("../../utils");
|
|
8
8
|
const os_1 = __importDefault(require("os"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const jpeg_js_1 = __importDefault(require("jpeg-js"));
|
|
11
|
+
const pngjs_1 = require("pngjs");
|
|
10
12
|
const zod_1 = require("zod");
|
|
11
13
|
var ScreenshotType;
|
|
12
14
|
(function (ScreenshotType) {
|
|
@@ -15,6 +17,7 @@ var ScreenshotType;
|
|
|
15
17
|
})(ScreenshotType || (exports.ScreenshotType = ScreenshotType = {}));
|
|
16
18
|
const DEFAULT_SCREENSHOT_NAME = 'screenshot';
|
|
17
19
|
const DEFAULT_SCREENSHOT_TYPE = ScreenshotType.PNG;
|
|
20
|
+
const DEFAULT_SCREENSHOT_QUALITY = 100;
|
|
18
21
|
class TakeScreenshot {
|
|
19
22
|
name() {
|
|
20
23
|
return 'content_take-screenshot';
|
|
@@ -51,6 +54,13 @@ class TakeScreenshot {
|
|
|
51
54
|
.describe(`Page format. Valid values are: ${(0, utils_1.getEnumKeyTuples)(ScreenshotType)}`)
|
|
52
55
|
.optional()
|
|
53
56
|
.default(DEFAULT_SCREENSHOT_TYPE),
|
|
57
|
+
quality: zod_1.z
|
|
58
|
+
.number()
|
|
59
|
+
.int()
|
|
60
|
+
.min(0)
|
|
61
|
+
.max(DEFAULT_SCREENSHOT_QUALITY)
|
|
62
|
+
.describe('The quality of the image, between 0-100. Not applicable to png images.')
|
|
63
|
+
.optional(),
|
|
54
64
|
};
|
|
55
65
|
}
|
|
56
66
|
outputSchema() {
|
|
@@ -60,14 +70,186 @@ class TakeScreenshot {
|
|
|
60
70
|
.describe('Full path of the saved screenshot file.'),
|
|
61
71
|
};
|
|
62
72
|
}
|
|
73
|
+
// Imported and adapter from Playwright:
|
|
74
|
+
// https://github.com/microsoft/playwright/blob/342d6aa843f0c4470d71ba1671dacfdedc57ef79/packages/playwright-core/src/server/utils/imageUtils.ts#L43
|
|
75
|
+
_scaleImageToSize(image, size) {
|
|
76
|
+
const { data: src, width: w1, height: h1 } = image;
|
|
77
|
+
const w2 = Math.max(1, Math.floor(size.width));
|
|
78
|
+
const h2 = Math.max(1, Math.floor(size.height));
|
|
79
|
+
if (w1 === w2 && h1 === h2) {
|
|
80
|
+
return image;
|
|
81
|
+
}
|
|
82
|
+
if (w1 <= 0 || h1 <= 0) {
|
|
83
|
+
throw new Error('Invalid input image');
|
|
84
|
+
}
|
|
85
|
+
if (size.width <= 0 ||
|
|
86
|
+
size.height <= 0 ||
|
|
87
|
+
!isFinite(size.width) ||
|
|
88
|
+
!isFinite(size.height)) {
|
|
89
|
+
throw new Error('Invalid output dimensions');
|
|
90
|
+
}
|
|
91
|
+
const clamp = (v, lo, hi) => v < lo ? lo : v > hi ? hi : v;
|
|
92
|
+
// Catmull–Rom weights
|
|
93
|
+
const weights = (t, o) => {
|
|
94
|
+
const t2 = t * t, t3 = t2 * t;
|
|
95
|
+
o[0] = -0.5 * t + 1.0 * t2 - 0.5 * t3;
|
|
96
|
+
o[1] = 1.0 - 2.5 * t2 + 1.5 * t3;
|
|
97
|
+
o[2] = 0.5 * t + 2.0 * t2 - 1.5 * t3;
|
|
98
|
+
o[3] = -0.5 * t2 + 0.5 * t3;
|
|
99
|
+
};
|
|
100
|
+
const srcRowStride = w1 * 4;
|
|
101
|
+
const dstRowStride = w2 * 4;
|
|
102
|
+
// Precompute X: indices, weights, and byte offsets (idx*4)
|
|
103
|
+
const xOff = new Int32Array(w2 * 4); // byte offsets = xIdx*4
|
|
104
|
+
const xW = new Float32Array(w2 * 4);
|
|
105
|
+
const wx = new Float32Array(4);
|
|
106
|
+
const xScale = w1 / w2;
|
|
107
|
+
for (let x = 0; x < w2; x++) {
|
|
108
|
+
const sx = (x + 0.5) * xScale - 0.5;
|
|
109
|
+
const sxi = Math.floor(sx);
|
|
110
|
+
const t = sx - sxi;
|
|
111
|
+
weights(t, wx);
|
|
112
|
+
const b = x * 4;
|
|
113
|
+
const i0 = clamp(sxi - 1, 0, w1 - 1);
|
|
114
|
+
const i1 = clamp(sxi + 0, 0, w1 - 1);
|
|
115
|
+
const i2 = clamp(sxi + 1, 0, w1 - 1);
|
|
116
|
+
const i3 = clamp(sxi + 2, 0, w1 - 1);
|
|
117
|
+
xOff[b + 0] = i0 << 2;
|
|
118
|
+
xOff[b + 1] = i1 << 2;
|
|
119
|
+
xOff[b + 2] = i2 << 2;
|
|
120
|
+
xOff[b + 3] = i3 << 2;
|
|
121
|
+
xW[b + 0] = wx[0];
|
|
122
|
+
xW[b + 1] = wx[1];
|
|
123
|
+
xW[b + 2] = wx[2];
|
|
124
|
+
xW[b + 3] = wx[3];
|
|
125
|
+
}
|
|
126
|
+
// Precompute Y: indices, weights, and row-base byte offsets (y*rowStride)
|
|
127
|
+
const yRow = new Int32Array(h2 * 4); // row base in bytes
|
|
128
|
+
const yW = new Float32Array(h2 * 4);
|
|
129
|
+
const wy = new Float32Array(4);
|
|
130
|
+
const yScale = h1 / h2;
|
|
131
|
+
for (let y = 0; y < h2; y++) {
|
|
132
|
+
const sy = (y + 0.5) * yScale - 0.5;
|
|
133
|
+
const syi = Math.floor(sy);
|
|
134
|
+
const t = sy - syi;
|
|
135
|
+
weights(t, wy);
|
|
136
|
+
const b = y * 4;
|
|
137
|
+
const j0 = clamp(syi - 1, 0, h1 - 1);
|
|
138
|
+
const j1 = clamp(syi + 0, 0, h1 - 1);
|
|
139
|
+
const j2 = clamp(syi + 1, 0, h1 - 1);
|
|
140
|
+
const j3 = clamp(syi + 2, 0, h1 - 1);
|
|
141
|
+
yRow[b + 0] = j0 * srcRowStride;
|
|
142
|
+
yRow[b + 1] = j1 * srcRowStride;
|
|
143
|
+
yRow[b + 2] = j2 * srcRowStride;
|
|
144
|
+
yRow[b + 3] = j3 * srcRowStride;
|
|
145
|
+
yW[b + 0] = wy[0];
|
|
146
|
+
yW[b + 1] = wy[1];
|
|
147
|
+
yW[b + 2] = wy[2];
|
|
148
|
+
yW[b + 3] = wy[3];
|
|
149
|
+
}
|
|
150
|
+
const dst = new Uint8Array(w2 * h2 * 4);
|
|
151
|
+
for (let y = 0; y < h2; y++) {
|
|
152
|
+
const yb = y * 4;
|
|
153
|
+
const rb0 = yRow[yb + 0], rb1 = yRow[yb + 1], rb2 = yRow[yb + 2], rb3 = yRow[yb + 3];
|
|
154
|
+
const wy0 = yW[yb + 0], wy1 = yW[yb + 1], wy2 = yW[yb + 2], wy3 = yW[yb + 3];
|
|
155
|
+
const dstBase = y * dstRowStride;
|
|
156
|
+
for (let x = 0; x < w2; x++) {
|
|
157
|
+
const xb = x * 4;
|
|
158
|
+
const xo0 = xOff[xb + 0], xo1 = xOff[xb + 1], xo2 = xOff[xb + 2], xo3 = xOff[xb + 3];
|
|
159
|
+
const wx0 = xW[xb + 0], wx1 = xW[xb + 1], wx2 = xW[xb + 2], wx3 = xW[xb + 3];
|
|
160
|
+
const di = dstBase + (x << 2);
|
|
161
|
+
// unrolled RGBA
|
|
162
|
+
for (let c = 0; c < 4; c++) {
|
|
163
|
+
const r0 = src[rb0 + xo0 + c] * wx0 +
|
|
164
|
+
src[rb0 + xo1 + c] * wx1 +
|
|
165
|
+
src[rb0 + xo2 + c] * wx2 +
|
|
166
|
+
src[rb0 + xo3 + c] * wx3;
|
|
167
|
+
const r1 = src[rb1 + xo0 + c] * wx0 +
|
|
168
|
+
src[rb1 + xo1 + c] * wx1 +
|
|
169
|
+
src[rb1 + xo2 + c] * wx2 +
|
|
170
|
+
src[rb1 + xo3 + c] * wx3;
|
|
171
|
+
const r2 = src[rb2 + xo0 + c] * wx0 +
|
|
172
|
+
src[rb2 + xo1 + c] * wx1 +
|
|
173
|
+
src[rb2 + xo2 + c] * wx2 +
|
|
174
|
+
src[rb2 + xo3 + c] * wx3;
|
|
175
|
+
const r3 = src[rb3 + xo0 + c] * wx0 +
|
|
176
|
+
src[rb3 + xo1 + c] * wx1 +
|
|
177
|
+
src[rb3 + xo2 + c] * wx2 +
|
|
178
|
+
src[rb3 + xo3 + c] * wx3;
|
|
179
|
+
const v = r0 * wy0 + r1 * wy1 + r2 * wy2 + r3 * wy3;
|
|
180
|
+
dst[di + c] = v < 0 ? 0 : v > 255 ? 255 : v | 0;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { data: Buffer.from(dst.buffer), width: w2, height: h2 };
|
|
185
|
+
}
|
|
186
|
+
// Imported and adapter from Playwright:
|
|
187
|
+
// https://github.com/microsoft/playwright/blob/391081ed1dac7ee1ebb1ccb88c31e7e3c3dd32ba/packages/playwright/src/mcp/browser/tools/screenshot.ts#L86
|
|
188
|
+
_scaleImageToFitMessage(buffer, screenshotType) {
|
|
189
|
+
// https://docs.claude.com/en/docs/build-with-claude/vision#evaluate-image-size
|
|
190
|
+
// Not more than 1.15 megapixel, linear size not more than 1568.
|
|
191
|
+
// Additionally, we aim for max ~800KB buffer size to stay well under 1MB limit.
|
|
192
|
+
const MAX_BUFFER_SIZE = 800 * 1024; // 800KB target
|
|
193
|
+
const MAX_PIXELS = 1.15 * 1024 * 1024; // 1.15 megapixel
|
|
194
|
+
const MAX_LINEAR_SIZE = 1568;
|
|
195
|
+
const image = screenshotType === ScreenshotType.PNG
|
|
196
|
+
? pngjs_1.PNG.sync.read(buffer)
|
|
197
|
+
: jpeg_js_1.default.decode(buffer, { maxMemoryUsageInMB: 512 });
|
|
198
|
+
const pixels = image.width * image.height;
|
|
199
|
+
// Initial shrink based on Claude's limits
|
|
200
|
+
let shrink = Math.min(MAX_LINEAR_SIZE / image.width, MAX_LINEAR_SIZE / image.height, Math.sqrt(MAX_PIXELS / pixels));
|
|
201
|
+
// If already within limits, check buffer size
|
|
202
|
+
if (shrink > 1) {
|
|
203
|
+
shrink = 1;
|
|
204
|
+
}
|
|
205
|
+
let width = (image.width * shrink) | 0;
|
|
206
|
+
let height = (image.height * shrink) | 0;
|
|
207
|
+
let scaledImage = this._scaleImageToSize(image, {
|
|
208
|
+
width,
|
|
209
|
+
height,
|
|
210
|
+
});
|
|
211
|
+
// Convert PNG to JPEG for better compression, or use lower quality JPEG
|
|
212
|
+
let result;
|
|
213
|
+
let currentType = screenshotType;
|
|
214
|
+
let quality = screenshotType === ScreenshotType.PNG ? 75 : 70;
|
|
215
|
+
if (screenshotType === ScreenshotType.PNG) {
|
|
216
|
+
// Convert PNG to JPEG for better compression (smaller file size)
|
|
217
|
+
result = jpeg_js_1.default.encode(scaledImage, quality).data;
|
|
218
|
+
currentType = ScreenshotType.JPEG;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
result = jpeg_js_1.default.encode(scaledImage, quality).data;
|
|
222
|
+
}
|
|
223
|
+
// Buffer size check - if still too large, apply more aggressive scaling
|
|
224
|
+
let iterations = 0;
|
|
225
|
+
const MAX_ITERATIONS = 5;
|
|
226
|
+
while (result.length > MAX_BUFFER_SIZE && iterations < MAX_ITERATIONS) {
|
|
227
|
+
// Reduce quality
|
|
228
|
+
quality = Math.max(50, quality - 10);
|
|
229
|
+
// If reducing quality is not enough, increase scaling
|
|
230
|
+
if (quality <= 50 && result.length > MAX_BUFFER_SIZE) {
|
|
231
|
+
shrink *= 0.85; // Scale down by 15%
|
|
232
|
+
width = Math.max(200, (image.width * shrink) | 0);
|
|
233
|
+
height = Math.max(200, (image.height * shrink) | 0);
|
|
234
|
+
scaledImage = this._scaleImageToSize(image, { width, height });
|
|
235
|
+
}
|
|
236
|
+
result = jpeg_js_1.default.encode(scaledImage, quality).data;
|
|
237
|
+
iterations++;
|
|
238
|
+
}
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
63
241
|
async handle(context, args) {
|
|
64
242
|
const screenshotType = args.type || DEFAULT_SCREENSHOT_TYPE;
|
|
65
243
|
const filename = `${args.name || DEFAULT_SCREENSHOT_NAME}-${(0, utils_1.formattedTimeForFilename)()}.${screenshotType}`;
|
|
66
244
|
const filePath = path_1.default.resolve(args.outputPath, filename);
|
|
245
|
+
const quality = screenshotType === ScreenshotType.PNG
|
|
246
|
+
? undefined
|
|
247
|
+
: (args.quality ?? DEFAULT_SCREENSHOT_QUALITY);
|
|
67
248
|
const options = {
|
|
68
249
|
path: filePath,
|
|
69
250
|
type: screenshotType,
|
|
70
251
|
fullPage: !!args.fullPage,
|
|
252
|
+
quality,
|
|
71
253
|
};
|
|
72
254
|
if (args.selector) {
|
|
73
255
|
const element = await context.page.$(args.selector);
|
|
@@ -80,7 +262,7 @@ class TakeScreenshot {
|
|
|
80
262
|
return {
|
|
81
263
|
filePath,
|
|
82
264
|
image: {
|
|
83
|
-
data: screenshot,
|
|
265
|
+
data: this._scaleImageToFitMessage(screenshot, screenshotType),
|
|
84
266
|
mimeType: `image/${screenshotType}`,
|
|
85
267
|
},
|
|
86
268
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"take-screenshot.js","sourceRoot":"","sources":["../../../src/tools/content/take-screenshot.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"take-screenshot.js","sourceRoot":"","sources":["../../../src/tools/content/take-screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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.compare = compare;
|
|
7
|
+
const config_1 = require("../../../config");
|
|
8
|
+
const vector_1 = require("./vector");
|
|
9
|
+
const client_bedrock_runtime_1 = require("@aws-sdk/client-bedrock-runtime");
|
|
10
|
+
const credential_providers_1 = require("@aws-sdk/credential-providers");
|
|
11
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
12
|
+
/**
|
|
13
|
+
* -----------------------------------------------------------------------------
|
|
14
|
+
* Constants
|
|
15
|
+
* -----------------------------------------------------------------------------
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_MAX_DIMENSION = 1024;
|
|
18
|
+
const DEFAULT_JPEG_QUALITY = 90;
|
|
19
|
+
const DEFAULT_AMAZON_BEDROCK_TITAN_OUTPUT_EMBEDDING_LENGTH = 1024;
|
|
20
|
+
/**
|
|
21
|
+
* -----------------------------------------------------------------------------
|
|
22
|
+
* Helpers
|
|
23
|
+
* -----------------------------------------------------------------------------
|
|
24
|
+
*/
|
|
25
|
+
async function _prepareImage(buf, imageType, opt) {
|
|
26
|
+
let img = (0, sharp_1.default)(buf);
|
|
27
|
+
const maxDim = opt?.maxDim || DEFAULT_MAX_DIMENSION;
|
|
28
|
+
img = img.resize({
|
|
29
|
+
width: maxDim,
|
|
30
|
+
height: maxDim,
|
|
31
|
+
fit: 'inside',
|
|
32
|
+
withoutEnlargement: true,
|
|
33
|
+
});
|
|
34
|
+
if (imageType === 'png') {
|
|
35
|
+
return await img.png().toBuffer();
|
|
36
|
+
}
|
|
37
|
+
const jpegQuality = opt?.jpegQuality || DEFAULT_JPEG_QUALITY;
|
|
38
|
+
return await img.jpeg({ quality: jpegQuality }).toBuffer();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* -----------------------------------------------------------------------------
|
|
42
|
+
* Amazon Bedrock specific embedding implementations
|
|
43
|
+
* -----------------------------------------------------------------------------
|
|
44
|
+
*/
|
|
45
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
46
|
+
const SUPPORTED_AMAZON_BEDROCK_IMAGE_EMBED_MODEL_IDS = new Set([
|
|
47
|
+
'amazon.titan-embed-image-v1',
|
|
48
|
+
]);
|
|
49
|
+
const DEFAULT_AMAZON_BEDROCK_IMAGE_EMBED_MODEL_ID = 'amazon.titan-embed-image-v1';
|
|
50
|
+
// Cache Bedrock client so we don't re-create it for every compare call.
|
|
51
|
+
let _bedrockClient = undefined;
|
|
52
|
+
function _isAwsBedrockActive() {
|
|
53
|
+
// Minimal "is Bedrock usable?" check:
|
|
54
|
+
// - Amazon Bedrock must be enabled
|
|
55
|
+
// - Region must exist
|
|
56
|
+
// - Credentials are resolved by AWS SDK default chain or AWS_PROFILE
|
|
57
|
+
return config_1.AMAZON_BEDROCK_ENABLE && Boolean(config_1.AWS_REGION);
|
|
58
|
+
}
|
|
59
|
+
function _getOrCreateBedrockClient() {
|
|
60
|
+
if (_bedrockClient) {
|
|
61
|
+
return _bedrockClient;
|
|
62
|
+
}
|
|
63
|
+
const region = config_1.AWS_REGION;
|
|
64
|
+
if (!region) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
const profile = config_1.AWS_PROFILE;
|
|
68
|
+
if (profile) {
|
|
69
|
+
_bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({
|
|
70
|
+
region,
|
|
71
|
+
credentials: (0, credential_providers_1.fromIni)({ profile }),
|
|
72
|
+
});
|
|
73
|
+
return _bedrockClient;
|
|
74
|
+
}
|
|
75
|
+
_bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({ region });
|
|
76
|
+
return _bedrockClient;
|
|
77
|
+
}
|
|
78
|
+
async function _embedImageWithAmazonBedrockTitan(ss, client, opt, modelId) {
|
|
79
|
+
const image = await _prepareImage(ss.image, ss.type, opt);
|
|
80
|
+
const bodyObj = {
|
|
81
|
+
inputImage: image.toString('base64'),
|
|
82
|
+
// Optional but recommended: control embedding length
|
|
83
|
+
embeddingConfig: {
|
|
84
|
+
outputEmbeddingLength: DEFAULT_AMAZON_BEDROCK_TITAN_OUTPUT_EMBEDDING_LENGTH,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const cmd = new client_bedrock_runtime_1.InvokeModelCommand({
|
|
88
|
+
modelId, // should be 'amazon.titan-embed-image-v1' (or with :0 if your account uses that)
|
|
89
|
+
contentType: 'application/json',
|
|
90
|
+
accept: 'application/json',
|
|
91
|
+
body: Buffer.from(JSON.stringify(bodyObj), 'utf-8'),
|
|
92
|
+
});
|
|
93
|
+
const resp = await client.send(cmd);
|
|
94
|
+
const raw = resp?.body instanceof Uint8Array
|
|
95
|
+
? resp.body
|
|
96
|
+
: new Uint8Array(resp?.body ?? []);
|
|
97
|
+
const text = Buffer.from(raw).toString('utf-8');
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = text ? JSON.parse(text) : {};
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
throw new Error(`Amazon Bedrock Titan returned non-JSON response for embeddings: ${text.slice(0, 300)}`);
|
|
104
|
+
}
|
|
105
|
+
const emb = parsed?.embedding ??
|
|
106
|
+
parsed?.embeddings?.[0] ??
|
|
107
|
+
parsed?.outputEmbedding ??
|
|
108
|
+
parsed?.vector;
|
|
109
|
+
if (!Array.isArray(emb) || emb.length === 0 || typeof emb[0] !== 'number') {
|
|
110
|
+
throw new Error(`Unexpected Amazon Bedrock Titan image embedding response format: ${text.slice(0, 500)}`);
|
|
111
|
+
}
|
|
112
|
+
return emb;
|
|
113
|
+
}
|
|
114
|
+
async function _embedImageWithAmazonBedrock(ss, opt, client) {
|
|
115
|
+
const modelId = opt?.modelId ??
|
|
116
|
+
config_1.AMAZON_BEDROCK_IMAGE_EMBED_MODEL_ID ??
|
|
117
|
+
DEFAULT_AMAZON_BEDROCK_IMAGE_EMBED_MODEL_ID;
|
|
118
|
+
if (!SUPPORTED_AMAZON_BEDROCK_IMAGE_EMBED_MODEL_IDS.has(modelId)) {
|
|
119
|
+
throw new Error(`Unsupported Amazon Bedrock image embedding model id: ${modelId}`);
|
|
120
|
+
}
|
|
121
|
+
return await _embedImageWithAmazonBedrockTitan(ss, client, opt, modelId);
|
|
122
|
+
}
|
|
123
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
124
|
+
/**
|
|
125
|
+
* -----------------------------------------------------------------------------
|
|
126
|
+
* Routing (LLM-agnostic)
|
|
127
|
+
* -----------------------------------------------------------------------------
|
|
128
|
+
*/
|
|
129
|
+
async function _embedImage(ss, opt) {
|
|
130
|
+
// Provider A: Amazon Bedrock
|
|
131
|
+
if (_isAwsBedrockActive()) {
|
|
132
|
+
const client = _getOrCreateBedrockClient();
|
|
133
|
+
if (!client) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
return _embedImageWithAmazonBedrock(ss, opt, client);
|
|
137
|
+
}
|
|
138
|
+
// No providers active
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* -----------------------------------------------------------------------------
|
|
143
|
+
* Public API
|
|
144
|
+
* -----------------------------------------------------------------------------
|
|
145
|
+
*/
|
|
146
|
+
async function compare(page, figma, options) {
|
|
147
|
+
const normalize = typeof options?.normalize === 'boolean' ? options.normalize : true;
|
|
148
|
+
const figmaVec = await _embedImage(figma, options);
|
|
149
|
+
if (!figmaVec) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const pageVec = await _embedImage(page, options);
|
|
153
|
+
if (!pageVec) {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
const score = (0, vector_1.cosineSimilarity)(figmaVec, pageVec, normalize);
|
|
157
|
+
return { score };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=compare-image-embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-image-embedding.js","sourceRoot":"","sources":["../../../../src/tools/figma/compare/compare-image-embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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.compare = compare;
|
|
7
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
8
|
+
const ssim_js_1 = __importDefault(require("ssim.js"));
|
|
9
|
+
const DEFAULT_GRAYSCALE = false;
|
|
10
|
+
const DEFAULT_BLUR = 10;
|
|
11
|
+
function _clamp01(v) {
|
|
12
|
+
if (!Number.isFinite(v)) {
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
return Math.max(0, Math.min(1, v));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Loads an image buffer and normalizes it into the SAME CANVAS SIZE using fit='contain'
|
|
19
|
+
* (no stretching). This matters a lot for UI screenshots:
|
|
20
|
+
* stretching (fit='fill') can destroy SSIM even when layouts are similar.
|
|
21
|
+
*
|
|
22
|
+
* Modes:
|
|
23
|
+
* - raw: normalize only (contain + padding), then raw RGBA
|
|
24
|
+
* - semantic: normalize + downscale + grayscale + blur(1) to suppress data/text noise
|
|
25
|
+
*/
|
|
26
|
+
async function _loadNormalized(input, canvasWidth, canvasHeight, mode) {
|
|
27
|
+
let img;
|
|
28
|
+
if (mode === 'semantic') {
|
|
29
|
+
img = (0, sharp_1.default)(input).resize(canvasWidth, canvasHeight, {
|
|
30
|
+
fit: 'cover',
|
|
31
|
+
position: 'centre',
|
|
32
|
+
});
|
|
33
|
+
const w = Math.max(1, Math.floor(canvasWidth / 2));
|
|
34
|
+
const h = Math.max(1, Math.floor(canvasHeight / 2));
|
|
35
|
+
img = img
|
|
36
|
+
.resize(w, h, {
|
|
37
|
+
fit: 'cover',
|
|
38
|
+
position: 'centre',
|
|
39
|
+
})
|
|
40
|
+
// Enabling grayscale increases false positives
|
|
41
|
+
.grayscale(DEFAULT_GRAYSCALE)
|
|
42
|
+
.blur(DEFAULT_BLUR);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
img = (0, sharp_1.default)(input).resize(canvasWidth, canvasHeight, {
|
|
46
|
+
fit: 'cover',
|
|
47
|
+
position: 'centre',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const out = await img
|
|
51
|
+
.ensureAlpha()
|
|
52
|
+
.raw()
|
|
53
|
+
.toBuffer({ resolveWithObject: true });
|
|
54
|
+
const clamped = new Uint8ClampedArray(out.data.buffer, out.data.byteOffset, out.data.byteLength);
|
|
55
|
+
return {
|
|
56
|
+
data: clamped,
|
|
57
|
+
width: out.info.width,
|
|
58
|
+
height: out.info.height,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function _computeSsim(a, b) {
|
|
62
|
+
const details = (0, ssim_js_1.default)({ data: a.data, width: a.width, height: a.height }, { data: b.data, width: b.width, height: b.height });
|
|
63
|
+
// Some builds expose `mssim`, some `ssim`.
|
|
64
|
+
const rawScore = Number(details.mssim ?? details.ssim ?? 0);
|
|
65
|
+
return _clamp01(rawScore);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compares a page screenshot against a Figma design screenshot using MSSIM.
|
|
69
|
+
*
|
|
70
|
+
* Notes:
|
|
71
|
+
* - Uses Figma dimensions as the reference canvas by default (unless overridden).
|
|
72
|
+
* - Normalizes both images into the same canvas using contain+padding (no stretching).
|
|
73
|
+
* - 'semantic' mode suppresses data/text noise and focuses more on layout structure.
|
|
74
|
+
*/
|
|
75
|
+
async function compare(page, figma, options) {
|
|
76
|
+
const mode = options?.mode ?? 'semantic';
|
|
77
|
+
let canvasWidth = options?.canvasWidth;
|
|
78
|
+
let canvasHeight = options?.canvasHeight;
|
|
79
|
+
if (typeof canvasWidth !== 'number' ||
|
|
80
|
+
!Number.isFinite(canvasWidth) ||
|
|
81
|
+
canvasWidth <= 0 ||
|
|
82
|
+
typeof canvasHeight !== 'number' ||
|
|
83
|
+
!Number.isFinite(canvasHeight) ||
|
|
84
|
+
canvasHeight <= 0) {
|
|
85
|
+
// Use the Figma image dimensions as the reference canvas.
|
|
86
|
+
const figmaMeta = await (0, sharp_1.default)(figma.image).metadata();
|
|
87
|
+
canvasWidth = figmaMeta.width ?? 0;
|
|
88
|
+
canvasHeight = figmaMeta.height ?? 0;
|
|
89
|
+
if (canvasWidth <= 0 || canvasHeight <= 0) {
|
|
90
|
+
throw new Error('Failed to read Figma image dimensions.');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const figmaImg = await _loadNormalized(figma.image, canvasWidth, canvasHeight, mode);
|
|
94
|
+
const pageImg = await _loadNormalized(page.image, canvasWidth, canvasHeight, mode);
|
|
95
|
+
const score = _computeSsim(figmaImg, pageImg);
|
|
96
|
+
return { score };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=compare-mssim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-mssim.js","sourceRoot":"","sources":["../../../../src/tools/figma/compare/compare-mssim.ts"],"names":[],"mappings":"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"}
|