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.
Files changed (56) hide show
  1. package/README.md +129 -26
  2. package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
  3. package/dist/analysis/agent-ready-audit.js +6 -1
  4. package/dist/analysis/agent-ready-audit.js.map +1 -1
  5. package/dist/browser.d.ts.map +1 -1
  6. package/dist/browser.js +2 -0
  7. package/dist/browser.js.map +1 -1
  8. package/dist/geo-proxy.d.ts +39 -0
  9. package/dist/geo-proxy.d.ts.map +1 -0
  10. package/dist/geo-proxy.js +109 -0
  11. package/dist/geo-proxy.js.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/mcp-server-remote.d.ts.map +1 -1
  17. package/dist/mcp-server-remote.js +29 -1
  18. package/dist/mcp-server-remote.js.map +1 -1
  19. package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
  20. package/dist/mcp-tools/base/audit-tools.js +519 -0
  21. package/dist/mcp-tools/base/audit-tools.js.map +1 -1
  22. package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
  23. package/dist/mcp-tools/base/persona-comparison-tools.js +66 -7
  24. package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
  25. package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
  26. package/dist/mcp-tools/base/visual-testing-tools.js +141 -50
  27. package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
  28. package/dist/mcp-tools/tool-categories.d.ts +28 -0
  29. package/dist/mcp-tools/tool-categories.d.ts.map +1 -0
  30. package/dist/mcp-tools/tool-categories.js +284 -0
  31. package/dist/mcp-tools/tool-categories.js.map +1 -0
  32. package/dist/types.d.ts +8 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/types.js +25 -0
  35. package/dist/types.js.map +1 -1
  36. package/dist/visual/attention-quality.d.ts +79 -0
  37. package/dist/visual/attention-quality.d.ts.map +1 -0
  38. package/dist/visual/attention-quality.js +199 -0
  39. package/dist/visual/attention-quality.js.map +1 -0
  40. package/dist/visual/attention-transport.d.ts.map +1 -1
  41. package/dist/visual/attention-transport.js +16 -5
  42. package/dist/visual/attention-transport.js.map +1 -1
  43. package/dist/visual/heatmap-overlay.d.ts +31 -0
  44. package/dist/visual/heatmap-overlay.d.ts.map +1 -0
  45. package/dist/visual/heatmap-overlay.js +139 -0
  46. package/dist/visual/heatmap-overlay.js.map +1 -0
  47. package/dist/visual/index.d.ts +3 -0
  48. package/dist/visual/index.d.ts.map +1 -1
  49. package/dist/visual/index.js +3 -0
  50. package/dist/visual/index.js.map +1 -1
  51. package/dist/visual/visual-overlays.d.ts +73 -0
  52. package/dist/visual/visual-overlays.d.ts.map +1 -0
  53. package/dist/visual/visual-overlays.js +348 -0
  54. package/dist/visual/visual-overlays.js.map +1 -0
  55. package/docs/Tools-Overview.md +2 -2
  56. 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, "&amp;").replace(/</g, "&lt;")}</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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"}
@@ -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** | 91 tools (72 real + 19 stubs) | Free at `demo.cbrowser.ai/mcp` | Evaluation, small projects, learning |
36
- | **Enterprise** | 91 tools (all real) | Self-hosted or authenticated | Production use, marketing intelligence, stealth testing |
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.5",
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",