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.
Files changed (91) hide show
  1. package/README.md +507 -59
  2. package/dist/browser.js +6 -0
  3. package/dist/browser.js.map +1 -1
  4. package/dist/config.js +60 -24
  5. package/dist/config.js.map +1 -1
  6. package/dist/context.js +28 -0
  7. package/dist/context.js.map +1 -1
  8. package/dist/otel/otel-controller.js +4 -0
  9. package/dist/otel/otel-controller.js.map +1 -1
  10. package/dist/server-info.js +133 -18
  11. package/dist/server-info.js.map +1 -1
  12. package/dist/tools/content/take-screenshot.js +183 -1
  13. package/dist/tools/content/take-screenshot.js.map +1 -1
  14. package/dist/tools/figma/compare/compare-image-embedding.js +159 -0
  15. package/dist/tools/figma/compare/compare-image-embedding.js.map +1 -0
  16. package/dist/tools/figma/compare/compare-mssim.js +98 -0
  17. package/dist/tools/figma/compare/compare-mssim.js.map +1 -0
  18. package/dist/tools/figma/compare/compare-text-embedding.js +291 -0
  19. package/dist/tools/figma/compare/compare-text-embedding.js.map +1 -0
  20. package/dist/tools/figma/compare/index.js +139 -0
  21. package/dist/tools/figma/compare/index.js.map +1 -0
  22. package/dist/tools/figma/compare/types.js +3 -0
  23. package/dist/tools/figma/compare/types.js.map +1 -0
  24. package/dist/tools/figma/compare/vector.js +46 -0
  25. package/dist/tools/figma/compare/vector.js.map +1 -0
  26. package/dist/tools/figma/compare-page-with-design.js +240 -0
  27. package/dist/tools/figma/compare-page-with-design.js.map +1 -0
  28. package/dist/tools/figma/figma-service.js +134 -0
  29. package/dist/tools/figma/figma-service.js.map +1 -0
  30. package/dist/tools/figma/index.js +6 -0
  31. package/dist/tools/figma/index.js.map +1 -0
  32. package/dist/tools/index.js +12 -2
  33. package/dist/tools/index.js.map +1 -1
  34. package/dist/tools/interaction/index.js +6 -2
  35. package/dist/tools/interaction/index.js.map +1 -1
  36. package/dist/tools/interaction/resize-viewport.js +110 -0
  37. package/dist/tools/interaction/resize-viewport.js.map +1 -0
  38. package/dist/tools/interaction/resize-window.js +261 -0
  39. package/dist/tools/interaction/resize-window.js.map +1 -0
  40. package/dist/tools/interaction/scroll.js +304 -0
  41. package/dist/tools/interaction/scroll.js.map +1 -0
  42. package/dist/tools/{monitoring → o11y}/get-console-messages.js +1 -1
  43. package/dist/tools/o11y/get-console-messages.js.map +1 -0
  44. package/dist/tools/{monitoring → o11y}/get-http-requests.js +1 -1
  45. package/dist/tools/o11y/get-http-requests.js.map +1 -0
  46. package/dist/tools/{monitoring → o11y}/get-trace-id.js +1 -1
  47. package/dist/tools/o11y/get-trace-id.js.map +1 -0
  48. package/dist/tools/o11y/get-web-vitals.js +595 -0
  49. package/dist/tools/o11y/get-web-vitals.js.map +1 -0
  50. package/dist/tools/{monitoring → o11y}/index.js +2 -0
  51. package/dist/tools/o11y/index.js.map +1 -0
  52. package/dist/tools/{monitoring → o11y}/new-trace-id.js +1 -1
  53. package/dist/tools/o11y/new-trace-id.js.map +1 -0
  54. package/dist/tools/{monitoring → o11y}/set-trace-id.js +1 -1
  55. package/dist/tools/o11y/set-trace-id.js.map +1 -0
  56. package/dist/tools/react/get-component-for-element.js +941 -0
  57. package/dist/tools/react/get-component-for-element.js.map +1 -0
  58. package/dist/tools/react/get-element-for-component.js +1190 -0
  59. package/dist/tools/react/get-element-for-component.js.map +1 -0
  60. package/dist/tools/react/index.js +10 -0
  61. package/dist/tools/react/index.js.map +1 -0
  62. package/dist/tools/run/index.js +7 -0
  63. package/dist/tools/run/index.js.map +1 -0
  64. package/dist/tools/{interaction/evaluate.js → run/js-in-browser.js} +24 -6
  65. package/dist/tools/run/js-in-browser.js.map +1 -0
  66. package/dist/tools/run/js-in-sandbox.js +175 -0
  67. package/dist/tools/run/js-in-sandbox.js.map +1 -0
  68. package/dist/tools/stub/clear.js +41 -0
  69. package/dist/tools/stub/clear.js.map +1 -0
  70. package/dist/tools/stub/index.js +14 -0
  71. package/dist/tools/stub/index.js.map +1 -0
  72. package/dist/tools/stub/intercept-http-request.js +112 -0
  73. package/dist/tools/stub/intercept-http-request.js.map +1 -0
  74. package/dist/tools/stub/list.js +75 -0
  75. package/dist/tools/stub/list.js.map +1 -0
  76. package/dist/tools/stub/mock-http-response.js +152 -0
  77. package/dist/tools/stub/mock-http-response.js.map +1 -0
  78. package/dist/tools/stub/stub-controller.js +284 -0
  79. package/dist/tools/stub/stub-controller.js.map +1 -0
  80. package/dist/tools/sync/index.js +6 -0
  81. package/dist/tools/sync/index.js.map +1 -0
  82. package/dist/tools/sync/wait-for-network-idle.js +152 -0
  83. package/dist/tools/sync/wait-for-network-idle.js.map +1 -0
  84. package/package.json +16 -3
  85. package/dist/tools/interaction/evaluate.js.map +0 -1
  86. package/dist/tools/monitoring/get-console-messages.js.map +0 -1
  87. package/dist/tools/monitoring/get-http-requests.js.map +0 -1
  88. package/dist/tools/monitoring/get-trace-id.js.map +0 -1
  89. package/dist/tools/monitoring/index.js.map +0 -1
  90. package/dist/tools/monitoring/new-trace-id.js.map +0 -1
  91. 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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"}