cbrowser 18.42.5 → 18.42.6
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 +129 -26
- package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
- package/dist/analysis/agent-ready-audit.js +6 -1
- package/dist/analysis/agent-ready-audit.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -1
- package/dist/geo-proxy.d.ts +39 -0
- package/dist/geo-proxy.d.ts.map +1 -0
- package/dist/geo-proxy.js +109 -0
- package/dist/geo-proxy.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js +29 -1
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +519 -0
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.js +66 -7
- package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +141 -50
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/tool-categories.d.ts +28 -0
- package/dist/mcp-tools/tool-categories.d.ts.map +1 -0
- package/dist/mcp-tools/tool-categories.js +284 -0
- package/dist/mcp-tools/tool-categories.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -1
- package/dist/visual/attention-quality.d.ts +79 -0
- package/dist/visual/attention-quality.d.ts.map +1 -0
- package/dist/visual/attention-quality.js +199 -0
- package/dist/visual/attention-quality.js.map +1 -0
- package/dist/visual/attention-transport.d.ts.map +1 -1
- package/dist/visual/attention-transport.js +16 -5
- package/dist/visual/attention-transport.js.map +1 -1
- package/dist/visual/heatmap-overlay.d.ts +31 -0
- package/dist/visual/heatmap-overlay.d.ts.map +1 -0
- package/dist/visual/heatmap-overlay.js +139 -0
- package/dist/visual/heatmap-overlay.js.map +1 -0
- package/dist/visual/index.d.ts +3 -0
- package/dist/visual/index.d.ts.map +1 -1
- package/dist/visual/index.js +3 -0
- package/dist/visual/index.js.map +1 -1
- package/dist/visual/visual-overlays.d.ts +73 -0
- package/dist/visual/visual-overlays.d.ts.map +1 -0
- package/dist/visual/visual-overlays.js +348 -0
- package/dist/visual/visual-overlays.js.map +1 -0
- package/docs/Tools-Overview.md +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual Overlays — generate diagnostic overlay images for MCP tool responses.
|
|
3
|
+
*
|
|
4
|
+
* Each overlay takes a screenshot + analysis data and produces a
|
|
5
|
+
* base64 PNG with colored annotations overlaid on the page.
|
|
6
|
+
*
|
|
7
|
+
* @since v18.39.0
|
|
8
|
+
*/
|
|
9
|
+
import sharp from "sharp";
|
|
10
|
+
// ── Color helpers ──
|
|
11
|
+
function rgba(r, g, b, a) {
|
|
12
|
+
return `rgba(${r},${g},${b},${(a / 255).toFixed(2)})`;
|
|
13
|
+
}
|
|
14
|
+
function scoreToColor(score) {
|
|
15
|
+
// 0 = red (bad), 0.5 = yellow, 1 = green (good)
|
|
16
|
+
const s = Math.max(0, Math.min(1, score));
|
|
17
|
+
if (s < 0.5) {
|
|
18
|
+
const t = s * 2;
|
|
19
|
+
return rgba(255, Math.round(255 * t), 0, 160);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const t = (s - 0.5) * 2;
|
|
23
|
+
return rgba(Math.round(255 * (1 - t)), 255, 0, 160);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function diffToColor(value) {
|
|
27
|
+
// -1 = blue (persona A stronger), 0 = transparent, +1 = red (persona B stronger)
|
|
28
|
+
const v = Math.max(-1, Math.min(1, value));
|
|
29
|
+
const a = Math.round(Math.abs(v) * 180);
|
|
30
|
+
if (v < 0)
|
|
31
|
+
return rgba(0, 100, 255, a);
|
|
32
|
+
if (v > 0)
|
|
33
|
+
return rgba(255, 50, 0, a);
|
|
34
|
+
return rgba(0, 0, 0, 0);
|
|
35
|
+
}
|
|
36
|
+
function buildSvgOverlay(width, height, rects, title) {
|
|
37
|
+
let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}">`;
|
|
38
|
+
for (const rect of rects) {
|
|
39
|
+
svg += `<rect x="${rect.x}" y="${rect.y}" width="${rect.width}" height="${rect.height}" fill="${rect.color}" rx="4"`;
|
|
40
|
+
if (rect.borderColor)
|
|
41
|
+
svg += ` stroke="${rect.borderColor}" stroke-width="2"`;
|
|
42
|
+
svg += `/>`;
|
|
43
|
+
if (rect.label) {
|
|
44
|
+
const fontSize = Math.min(14, Math.max(9, rect.height * 0.4));
|
|
45
|
+
svg += `<text x="${rect.x + 4}" y="${rect.y + fontSize + 2}" font-family="sans-serif" font-size="${fontSize}" fill="white" font-weight="bold" opacity="0.9">${rect.label.replace(/&/g, "&").replace(/</g, "<")}</text>`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (title) {
|
|
49
|
+
const titleW = title.length * 10 + 24;
|
|
50
|
+
svg += `<rect x="10" y="10" width="${titleW}" height="32" rx="6" fill="rgba(0,0,0,0.8)"/>`;
|
|
51
|
+
svg += `<text x="22" y="32" font-family="sans-serif" font-size="16" fill="white" font-weight="bold">${title}</text>`;
|
|
52
|
+
}
|
|
53
|
+
svg += `</svg>`;
|
|
54
|
+
return svg;
|
|
55
|
+
}
|
|
56
|
+
async function compositeOverlay(screenshotPath, svgContent) {
|
|
57
|
+
const outputBuffer = await sharp(screenshotPath)
|
|
58
|
+
.grayscale()
|
|
59
|
+
.modulate({ brightness: 0.75 })
|
|
60
|
+
.composite([{ input: Buffer.from(svgContent), blend: "over" }])
|
|
61
|
+
.png()
|
|
62
|
+
.toBuffer();
|
|
63
|
+
return outputBuffer.toString("base64");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Overlay showing hit probability per interactive element.
|
|
67
|
+
* Green = easy to click, Yellow = moderate, Red = motor barrier.
|
|
68
|
+
*/
|
|
69
|
+
export async function generateMotorOverlay(screenshotPath, elements, personaName, cssViewportWidth) {
|
|
70
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
71
|
+
const width = metadata.width || 1920;
|
|
72
|
+
const height = metadata.height || 1080;
|
|
73
|
+
// Scale factor: CSS pixels → image pixels
|
|
74
|
+
// getBoundingClientRect returns CSS px, but screenshot is device px
|
|
75
|
+
const scale = cssViewportWidth ? width / cssViewportWidth : 1;
|
|
76
|
+
const rects = elements.map(el => ({
|
|
77
|
+
x: Math.round(el.x * scale),
|
|
78
|
+
y: Math.round(el.y * scale),
|
|
79
|
+
width: Math.round(el.width * scale),
|
|
80
|
+
height: Math.round(el.height * scale),
|
|
81
|
+
color: scoreToColor(el.hitProbability),
|
|
82
|
+
borderColor: el.isBarrier ? "rgba(255,0,0,0.8)" : undefined,
|
|
83
|
+
label: `${Math.round(el.hitProbability * 100)}%`,
|
|
84
|
+
}));
|
|
85
|
+
const svg = buildSvgOverlay(width, height, rects, `${personaName} Motor Accessibility`);
|
|
86
|
+
return compositeOverlay(screenshotPath, svg);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Overlay showing what type of element each saliency hotspot lands on.
|
|
90
|
+
* Green = CTA/heading (good), Yellow = content, Red = decorative/distractor.
|
|
91
|
+
*/
|
|
92
|
+
export async function generateAttentionQualityOverlay(screenshotPath, targets, personaName, cssViewportWidth) {
|
|
93
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
94
|
+
const width = metadata.width || 1920;
|
|
95
|
+
const height = metadata.height || 1080;
|
|
96
|
+
const scale = cssViewportWidth ? width / cssViewportWidth : 1;
|
|
97
|
+
const typeColors = {
|
|
98
|
+
cta: rgba(0, 220, 0, 200),
|
|
99
|
+
heading: rgba(0, 150, 255, 180),
|
|
100
|
+
navigation: rgba(255, 200, 0, 160),
|
|
101
|
+
content: rgba(200, 200, 200, 80),
|
|
102
|
+
decorative: rgba(255, 50, 0, 180),
|
|
103
|
+
unknown: rgba(128, 128, 128, 120),
|
|
104
|
+
};
|
|
105
|
+
const rects = targets.map(t => ({
|
|
106
|
+
x: Math.round(t.x * scale),
|
|
107
|
+
y: Math.round(t.y * scale),
|
|
108
|
+
width: Math.round(t.width * scale),
|
|
109
|
+
height: Math.round(t.height * scale),
|
|
110
|
+
color: typeColors[t.type] || typeColors.unknown,
|
|
111
|
+
borderColor: t.type === "cta" ? "rgba(0,255,0,1)" : t.type === "decorative" ? "rgba(255,0,0,1)" : t.type === "heading" ? "rgba(0,150,255,0.9)" : "rgba(200,200,200,0.5)",
|
|
112
|
+
label: `${t.type}: ${t.label.slice(0, 25)}`,
|
|
113
|
+
}));
|
|
114
|
+
const svg = buildSvgOverlay(width, height, rects, `${personaName} Attention Quality`);
|
|
115
|
+
return compositeOverlay(screenshotPath, svg);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Overlay showing reading difficulty per text block.
|
|
119
|
+
* Green = easy to read, Yellow = moderate, Red = very difficult for this persona.
|
|
120
|
+
*/
|
|
121
|
+
export async function generateReadabilityOverlay(screenshotPath, blocks, personaName) {
|
|
122
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
123
|
+
const width = metadata.width || 1920;
|
|
124
|
+
const height = metadata.height || 1080;
|
|
125
|
+
const rects = blocks.map(b => ({
|
|
126
|
+
x: b.x,
|
|
127
|
+
y: b.y,
|
|
128
|
+
width: b.width,
|
|
129
|
+
height: b.height,
|
|
130
|
+
color: scoreToColor(1 - b.difficulty), // invert: high difficulty = red
|
|
131
|
+
label: `${b.wpm} WPM`,
|
|
132
|
+
}));
|
|
133
|
+
const svg = buildSvgOverlay(width, height, rects, `${personaName} Readability`);
|
|
134
|
+
return compositeOverlay(screenshotPath, svg);
|
|
135
|
+
}
|
|
136
|
+
// ── 4. Persona Comparison (Difference Map) ──
|
|
137
|
+
/**
|
|
138
|
+
* Generate a difference heatmap between two persona saliency maps.
|
|
139
|
+
* Blue = persona A looks here more, Red = persona B looks here more.
|
|
140
|
+
*/
|
|
141
|
+
export async function generateComparisonHeatmap(screenshotPath, cellsA, cellsB, gridRows, gridCols, personaA, personaB) {
|
|
142
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
143
|
+
const width = metadata.width || 1920;
|
|
144
|
+
const height = metadata.height || 1080;
|
|
145
|
+
// Normalize both
|
|
146
|
+
let maxA = 0, maxB = 0;
|
|
147
|
+
for (let i = 0; i < cellsA.length; i++) {
|
|
148
|
+
if (cellsA[i] > maxA)
|
|
149
|
+
maxA = cellsA[i];
|
|
150
|
+
if (cellsB[i] > maxB)
|
|
151
|
+
maxB = cellsB[i];
|
|
152
|
+
}
|
|
153
|
+
maxA = maxA || 1;
|
|
154
|
+
maxB = maxB || 1;
|
|
155
|
+
// Build difference buffer
|
|
156
|
+
const buf = Buffer.alloc(width * height * 4);
|
|
157
|
+
const cellW = width / gridCols;
|
|
158
|
+
const cellH = height / gridRows;
|
|
159
|
+
for (let y = 0; y < height; y++) {
|
|
160
|
+
for (let x = 0; x < width; x++) {
|
|
161
|
+
const gr = Math.min(Math.floor(y / cellH), gridRows - 1);
|
|
162
|
+
const gc = Math.min(Math.floor(x / cellW), gridCols - 1);
|
|
163
|
+
const idx = gr * gridCols + gc;
|
|
164
|
+
const normA = cellsA[idx] / maxA;
|
|
165
|
+
const normB = cellsB[idx] / maxB;
|
|
166
|
+
const diff = normB - normA; // positive = B stronger, negative = A stronger
|
|
167
|
+
const intensity = Math.abs(diff);
|
|
168
|
+
const alpha = Math.round(intensity * 200);
|
|
169
|
+
const px = (y * width + x) * 4;
|
|
170
|
+
if (diff > 0.02) {
|
|
171
|
+
// Red: persona B looks here more
|
|
172
|
+
buf[px] = 255;
|
|
173
|
+
buf[px + 1] = 50;
|
|
174
|
+
buf[px + 2] = 0;
|
|
175
|
+
buf[px + 3] = alpha;
|
|
176
|
+
}
|
|
177
|
+
else if (diff < -0.02) {
|
|
178
|
+
// Blue: persona A looks here more
|
|
179
|
+
buf[px] = 0;
|
|
180
|
+
buf[px + 1] = 100;
|
|
181
|
+
buf[px + 2] = 255;
|
|
182
|
+
buf[px + 3] = alpha;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
buf[px + 3] = 0; // transparent — similar attention
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Blur for smoothness
|
|
190
|
+
const blurSigma = Math.max(1, Math.round(cellW * 0.6));
|
|
191
|
+
const diffPng = await sharp(buf, { raw: { width, height, channels: 4 } })
|
|
192
|
+
.blur(blurSigma)
|
|
193
|
+
.png()
|
|
194
|
+
.toBuffer();
|
|
195
|
+
// Label
|
|
196
|
+
const labelW = (personaA.length + personaB.length) * 8 + 80;
|
|
197
|
+
const labelSvg = Buffer.from(`<svg width="${labelW}" height="36">
|
|
198
|
+
<rect x="0" y="0" width="${labelW}" height="36" rx="6" fill="rgba(0,0,0,0.8)"/>
|
|
199
|
+
<circle cx="14" cy="18" r="6" fill="rgb(0,100,255)"/>
|
|
200
|
+
<text x="24" y="24" font-family="sans-serif" font-size="12" fill="white">${personaA}</text>
|
|
201
|
+
<circle cx="${personaA.length * 8 + 44}" cy="18" r="6" fill="rgb(255,50,0)"/>
|
|
202
|
+
<text x="${personaA.length * 8 + 54}" y="24" font-family="sans-serif" font-size="12" fill="white">${personaB}</text>
|
|
203
|
+
</svg>`);
|
|
204
|
+
const output = await sharp(screenshotPath)
|
|
205
|
+
.composite([
|
|
206
|
+
{ input: diffPng, blend: "over" },
|
|
207
|
+
{ input: labelSvg, top: 10, left: 10, blend: "over" },
|
|
208
|
+
])
|
|
209
|
+
.png()
|
|
210
|
+
.toBuffer();
|
|
211
|
+
return output.toString("base64");
|
|
212
|
+
}
|
|
213
|
+
// ── 5. Combined Story Overlay — all layers on one image ──
|
|
214
|
+
/**
|
|
215
|
+
* Generate a single composite overlay with attention heatmap + motor annotations + quality labels.
|
|
216
|
+
*/
|
|
217
|
+
export async function generateCombinedStoryOverlay(screenshotPath, heatmapCells, heatmapRows, heatmapCols, motorElements, qualityTargets, personaName, cssViewportWidth) {
|
|
218
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
219
|
+
const width = metadata.width || 1920;
|
|
220
|
+
const height = metadata.height || 1080;
|
|
221
|
+
const scale = cssViewportWidth ? width / cssViewportWidth : 1;
|
|
222
|
+
const layers = [];
|
|
223
|
+
// Layer 1: Attention heatmap (semi-transparent underneath)
|
|
224
|
+
if (heatmapCells && heatmapCells.length > 0) {
|
|
225
|
+
// Import heatmap buffer generator
|
|
226
|
+
const { default: sharpMod } = await import("sharp");
|
|
227
|
+
// Build heatmap RGBA buffer
|
|
228
|
+
let maxVal = 0;
|
|
229
|
+
for (let i = 0; i < heatmapCells.length; i++) {
|
|
230
|
+
if (heatmapCells[i] > maxVal)
|
|
231
|
+
maxVal = heatmapCells[i];
|
|
232
|
+
}
|
|
233
|
+
maxVal = maxVal || 1;
|
|
234
|
+
const buf = Buffer.alloc(width * height * 4);
|
|
235
|
+
const cellW = width / heatmapCols;
|
|
236
|
+
const cellH = height / heatmapRows;
|
|
237
|
+
for (let y = 0; y < height; y++) {
|
|
238
|
+
for (let x = 0; x < width; x++) {
|
|
239
|
+
const gr = Math.min(Math.floor(y / cellH), heatmapRows - 1);
|
|
240
|
+
const gc = Math.min(Math.floor(x / cellW), heatmapCols - 1);
|
|
241
|
+
const idx = gr * heatmapCols + gc;
|
|
242
|
+
const value = heatmapCells[idx] / maxVal;
|
|
243
|
+
// Reduced opacity for combined view (don't overwhelm other layers)
|
|
244
|
+
const alpha = Math.round(value * 120); // max 120/255 opacity
|
|
245
|
+
const r = Math.round(value * 255);
|
|
246
|
+
const g = Math.round((1 - Math.abs(value - 0.5) * 2) * 200);
|
|
247
|
+
const b = Math.round((1 - value) * 255);
|
|
248
|
+
const px = (y * width + x) * 4;
|
|
249
|
+
buf[px] = r;
|
|
250
|
+
buf[px + 1] = g;
|
|
251
|
+
buf[px + 2] = b;
|
|
252
|
+
buf[px + 3] = alpha;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const blurSigma = Math.max(1, Math.round(cellW * 0.6));
|
|
256
|
+
const heatPng = await sharp(buf, { raw: { width, height, channels: 4 } })
|
|
257
|
+
.blur(blurSigma).png().toBuffer();
|
|
258
|
+
layers.push({ input: heatPng, blend: "over" });
|
|
259
|
+
}
|
|
260
|
+
// Layer 2: Motor + Quality annotations as SVG
|
|
261
|
+
const rects = [];
|
|
262
|
+
// Motor barriers (red borders on hard-to-click elements)
|
|
263
|
+
for (const el of motorElements) {
|
|
264
|
+
if (el.isBarrier) {
|
|
265
|
+
rects.push({
|
|
266
|
+
x: Math.round(el.x * scale), y: Math.round(el.y * scale),
|
|
267
|
+
width: Math.round(el.width * scale), height: Math.round(el.height * scale),
|
|
268
|
+
color: "rgba(255,0,0,0.15)",
|
|
269
|
+
borderColor: "rgba(255,50,0,0.9)",
|
|
270
|
+
label: `${Math.round(el.hitProbability * 100)}% hit`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Quality targets (CTA = green border, decorative = red border)
|
|
275
|
+
for (const t of qualityTargets) {
|
|
276
|
+
if (t.type === "cta") {
|
|
277
|
+
rects.push({
|
|
278
|
+
x: Math.round(t.x * scale), y: Math.round(t.y * scale),
|
|
279
|
+
width: Math.round(t.width * scale), height: Math.round(t.height * scale),
|
|
280
|
+
color: "rgba(0,200,0,0.12)",
|
|
281
|
+
borderColor: "rgba(0,220,0,0.9)",
|
|
282
|
+
label: `CTA: ${t.label.slice(0, 20)}`,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else if (t.type === "decorative") {
|
|
286
|
+
rects.push({
|
|
287
|
+
x: Math.round(t.x * scale), y: Math.round(t.y * scale),
|
|
288
|
+
width: Math.round(t.width * scale), height: Math.round(t.height * scale),
|
|
289
|
+
color: "rgba(255,0,0,0.08)",
|
|
290
|
+
borderColor: "rgba(255,100,0,0.7)",
|
|
291
|
+
label: "distractor",
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
else if (t.type === "heading") {
|
|
295
|
+
rects.push({
|
|
296
|
+
x: Math.round(t.x * scale), y: Math.round(t.y * scale),
|
|
297
|
+
width: Math.round(t.width * scale), height: Math.round(t.height * scale),
|
|
298
|
+
color: "rgba(0,100,255,0.08)",
|
|
299
|
+
borderColor: "rgba(0,120,255,0.7)",
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (rects.length > 0) {
|
|
304
|
+
const svg = buildSvgOverlay(width, height, rects, `${personaName} — Combined Analysis`);
|
|
305
|
+
layers.push({ input: Buffer.from(svg), blend: "over" });
|
|
306
|
+
}
|
|
307
|
+
// Legend
|
|
308
|
+
const legendSvg = Buffer.from(`<svg width="280" height="100">
|
|
309
|
+
<rect x="0" y="0" width="280" height="100" rx="8" fill="rgba(0,0,0,0.8)"/>
|
|
310
|
+
<circle cx="16" cy="20" r="6" fill="rgb(255,50,0)"/>
|
|
311
|
+
<text x="28" y="24" font-family="sans-serif" font-size="11" fill="white">High attention</text>
|
|
312
|
+
<circle cx="16" cy="40" r="6" fill="rgb(0,100,255)"/>
|
|
313
|
+
<text x="28" y="44" font-family="sans-serif" font-size="11" fill="white">Low attention</text>
|
|
314
|
+
<rect x="10" y="54" width="12" height="12" rx="2" stroke="rgb(0,220,0)" stroke-width="2" fill="none"/>
|
|
315
|
+
<text x="28" y="64" font-family="sans-serif" font-size="11" fill="white">CTA (conversion target)</text>
|
|
316
|
+
<rect x="10" y="74" width="12" height="12" rx="2" stroke="rgb(255,50,0)" stroke-width="2" fill="none"/>
|
|
317
|
+
<text x="28" y="84" font-family="sans-serif" font-size="11" fill="white">Motor barrier / distractor</text>
|
|
318
|
+
</svg>`);
|
|
319
|
+
layers.push({ input: legendSvg, top: height - 110, left: 10, blend: "over" });
|
|
320
|
+
// Desaturate base image so overlays pop (grayscale + slight darken)
|
|
321
|
+
const output = await sharp(screenshotPath)
|
|
322
|
+
.grayscale()
|
|
323
|
+
.modulate({ brightness: 0.7 })
|
|
324
|
+
.composite(layers)
|
|
325
|
+
.png()
|
|
326
|
+
.toBuffer();
|
|
327
|
+
return output.toString("base64");
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Overlay showing cognitive load per page region.
|
|
331
|
+
* Green = low load, Red = high load for this persona.
|
|
332
|
+
*/
|
|
333
|
+
export async function generateCognitiveLoadOverlay(screenshotPath, regions, personaName) {
|
|
334
|
+
const metadata = await sharp(screenshotPath).metadata();
|
|
335
|
+
const width = metadata.width || 1920;
|
|
336
|
+
const height = metadata.height || 1080;
|
|
337
|
+
const rects = regions.map(r => ({
|
|
338
|
+
x: r.x,
|
|
339
|
+
y: r.y,
|
|
340
|
+
width: r.width,
|
|
341
|
+
height: r.height,
|
|
342
|
+
color: scoreToColor(1 - r.load),
|
|
343
|
+
label: `${r.dimension}: ${Math.round(r.load * 100)}%`,
|
|
344
|
+
}));
|
|
345
|
+
const svg = buildSvgOverlay(width, height, rects, `${personaName} Cognitive Load`);
|
|
346
|
+
return compositeOverlay(screenshotPath, svg);
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=visual-overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-overlays.js","sourceRoot":"","sources":["../../src/visual/visual-overlays.ts"],"names":[],"mappings":"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"}
|
package/docs/Tools-Overview.md
CHANGED
|
@@ -32,8 +32,8 @@ CBrowser fixes this with AI-powered automation that:
|
|
|
32
32
|
|
|
33
33
|
| Tier | Tools | Access | Best For |
|
|
34
34
|
|------|-------|--------|----------|
|
|
35
|
-
| **Demo** |
|
|
36
|
-
| **Enterprise** |
|
|
35
|
+
| **Demo** | 108 tools (rate-limited) | Free at `demo.cbrowser.ai/mcp` | Evaluation, small projects, learning |
|
|
36
|
+
| **Enterprise** | 108 tools (all real, unlimited) | Self-hosted or authenticated | Production use, marketing intelligence, stealth testing |
|
|
37
37
|
|
|
38
38
|
The Demo tier gives you everything you need to automate browsers, run tests, and simulate users. Enterprise adds autonomous AI execution, marketing campaign analysis, and bot detection bypass for authorized testing.
|
|
39
39
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cbrowser",
|
|
3
|
-
"version": "18.42.
|
|
3
|
+
"version": "18.42.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Cognitive browser automation that thinks like your users—and helps AI agents navigate too. Simulate real user cognition with abandonment detection, constitutional safety, chaos engineering, and UX friction discovery. Sites that pass CBrowser's cognitive tests are easier for both humans and AI agents to navigate.",
|
|
6
6
|
"main": "dist/index.js",
|