cbrowser 18.24.0 → 18.25.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.
@@ -18,7 +18,7 @@ import type { McpServer, ToolRegistrationContext } from "../types.js";
18
18
  * - Analysis: 4 (analyze_page, generate_tests, find_element_by_intent, ai_benchmark)
19
19
  * - Session: 4 (save_session, load_session, list_sessions, delete_session)
20
20
  * - Healing: 1 (heal_stats)
21
- * - Visual Testing: 6 (visual_baseline, visual_regression, cross_browser_test, cross_browser_diff, responsive_test, ab_comparison)
21
+ * - Visual Testing: 9 (visual_baseline, visual_regression, cross_browser_test, cross_browser_diff, responsive_test, ab_comparison, smart_baseline, smart_regression, transport_map)
22
22
  * - Testing: 5 (nl_test_file, nl_test_inline, repair_test, detect_flaky_tests, coverage_map)
23
23
  * - Bug Analysis: 2 (hunt_bugs, chaos_test)
24
24
  * - Persona Comparison: 3 (compare_personas, compare_personas_init, compare_personas_complete)
@@ -38,7 +38,7 @@ import { registerLlmsTxtTools } from "./llms-txt-tools.js";
38
38
  * - Analysis: 4 (analyze_page, generate_tests, find_element_by_intent, ai_benchmark)
39
39
  * - Session: 4 (save_session, load_session, list_sessions, delete_session)
40
40
  * - Healing: 1 (heal_stats)
41
- * - Visual Testing: 6 (visual_baseline, visual_regression, cross_browser_test, cross_browser_diff, responsive_test, ab_comparison)
41
+ * - Visual Testing: 9 (visual_baseline, visual_regression, cross_browser_test, cross_browser_diff, responsive_test, ab_comparison, smart_baseline, smart_regression, transport_map)
42
42
  * - Testing: 5 (nl_test_file, nl_test_inline, repair_test, detect_flaky_tests, coverage_map)
43
43
  * - Bug Analysis: 2 (hunt_bugs, chaos_test)
44
44
  * - Persona Comparison: 3 (compare_personas, compare_personas_init, compare_personas_complete)
@@ -1 +1 @@
1
- {"version":3,"file":"visual-testing-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/base/visual-testing-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAU7C;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqLlE"}
1
+ {"version":3,"file":"visual-testing-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/base/visual-testing-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAU7C;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0TlE"}
@@ -155,5 +155,117 @@ export function registerVisualTestingTools(server) {
155
155
  ],
156
156
  };
157
157
  });
158
+ // ── Smart Baseline (v18.0.0) ──
159
+ server.tool("smart_baseline", "Capture a smart consensus baseline using Wasserstein barycenter. Takes N screenshots, rejects outliers, computes optimal reference. Robust to dynamic content and timing variations.", {
160
+ url: z.string().describe("URL to capture"),
161
+ name: z.string().describe("Baseline name"),
162
+ captures: z.number().optional().describe("Number of screenshots (default: 5)"),
163
+ delay: z.number().optional().describe("Delay between captures in ms (default: 1500)"),
164
+ selector: z.string().optional().describe("CSS selector to capture"),
165
+ device: z.string().optional().describe("Device emulation"),
166
+ }, async ({ url, name, captures, delay, selector, device }) => {
167
+ const { captureSmartBaseline } = await import("../../visual/index.js");
168
+ const result = await captureSmartBaseline(url, name, {
169
+ numCaptures: captures,
170
+ captureDelay: delay,
171
+ selector,
172
+ device,
173
+ });
174
+ return {
175
+ content: [
176
+ {
177
+ type: "text",
178
+ text: JSON.stringify({
179
+ name: result.name,
180
+ captures: result.numCaptures,
181
+ outliers: result.numOutliers,
182
+ meanDistance: result.meanDistance,
183
+ stdDev: result.stdDevDistance,
184
+ adaptiveThreshold: result.adaptiveThreshold,
185
+ reference: result.referencePath,
186
+ computeTime: `${result.computeTimeMs.toFixed(0)}ms`,
187
+ }, null, 2),
188
+ },
189
+ ],
190
+ };
191
+ });
192
+ server.tool("smart_regression", "Run visual regression against a smart baseline. Uses Wasserstein distance with adaptive threshold based on observed render variance.", {
193
+ url: z.string().describe("URL to test"),
194
+ baseline: z.string().describe("Smart baseline name"),
195
+ threshold: z.number().optional().describe("Override adaptive threshold (0-1)"),
196
+ transportMap: z.boolean().optional().describe("Also generate visual transport map"),
197
+ }, async ({ url, baseline, threshold, transportMap: wantMap }) => {
198
+ if (wantMap) {
199
+ const { runRegressionWithTransportMap } = await import("../../visual/index.js");
200
+ const result = await runRegressionWithTransportMap(url, baseline, { threshold });
201
+ return {
202
+ content: [
203
+ {
204
+ type: "text",
205
+ text: JSON.stringify({
206
+ passed: result.passed,
207
+ similarity: result.analysis.similarityScore,
208
+ status: result.analysis.overallStatus,
209
+ summary: result.analysis.summary,
210
+ hotspots: result.transportMap?.hotspots,
211
+ flows: result.transportMap?.flows.length,
212
+ svgPath: result.transportMapSvgPath,
213
+ }, null, 2),
214
+ },
215
+ ],
216
+ };
217
+ }
218
+ const { runSmartRegression } = await import("../../visual/index.js");
219
+ const result = await runSmartRegression(url, baseline, { threshold });
220
+ return {
221
+ content: [
222
+ {
223
+ type: "text",
224
+ text: JSON.stringify({
225
+ passed: result.passed,
226
+ similarity: result.analysis.similarityScore,
227
+ status: result.analysis.overallStatus,
228
+ summary: result.analysis.summary,
229
+ rawAnalysis: result.analysis.rawAnalysis,
230
+ }, null, 2),
231
+ },
232
+ ],
233
+ };
234
+ });
235
+ server.tool("transport_map", "Generate a Visual Transport Map showing WHERE visual content moved between two screenshots. Produces heatmap, flow arrows, hotspots, and SVG visualization.", {
236
+ baselinePath: z.string().describe("Path to baseline screenshot"),
237
+ currentPath: z.string().describe("Path to current screenshot"),
238
+ cellSize: z.number().optional().describe("Grid cell size in pixels (default: 32)"),
239
+ hotspots: z.number().optional().describe("Number of hotspots to identify (default: 5)"),
240
+ }, async ({ baselinePath, currentPath, cellSize, hotspots: numHotspots }) => {
241
+ const { computeTransportMap } = await import("../../visual/distance-metrics.js");
242
+ const result = await computeTransportMap(baselinePath, currentPath, { cellSize, numHotspots });
243
+ // Save SVG
244
+ const { writeFileSync, mkdirSync, existsSync } = await import("fs");
245
+ const { join } = await import("path");
246
+ const { homedir } = await import("os");
247
+ const baseDir = process.env.CBROWSER_DATA_DIR || join(homedir(), ".cbrowser");
248
+ const mapsDir = join(baseDir, "transport-maps");
249
+ if (!existsSync(mapsDir))
250
+ mkdirSync(mapsDir, { recursive: true });
251
+ const svgPath = join(mapsDir, `transport-map-${Date.now()}.svg`);
252
+ writeFileSync(svgPath, result.svg);
253
+ return {
254
+ content: [
255
+ {
256
+ type: "text",
257
+ text: JSON.stringify({
258
+ grid: result.gridSize,
259
+ flows: result.flows.length,
260
+ totalCost: result.totalCost,
261
+ hotspots: result.hotspots,
262
+ svgPath,
263
+ dimensions: result.dimensions,
264
+ computeTime: `${result.computeTimeMs.toFixed(0)}ms`,
265
+ }, null, 2),
266
+ },
267
+ ],
268
+ };
269
+ });
158
270
  }
159
271
  //# sourceMappingURL=visual-testing-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"visual-testing-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/base/visual-testing-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visual-testing-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/base/visual-testing-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Distance metrics for visual comparison
3
+ *
4
+ * Implements Sliced Wasserstein Distance (SWD) for robust image comparison.
5
+ * Based on optimal transport theory — measures minimum cost to transform
6
+ * one image distribution into another.
7
+ *
8
+ * Key advantages over byte-diff / SSIM:
9
+ * - Robust to sub-pixel shifts, anti-aliasing, font rendering differences
10
+ * - Cross-resolution capable (compares distributions, not pixel grids)
11
+ * - Decomposable (can show WHERE visual mass moved)
12
+ * - Supports barycenter computation (consensus baselines from N captures)
13
+ *
14
+ * @version 1.0.0
15
+ * @see https://github.com/alexandriashai/cbrowser/issues/158
16
+ */
17
+ export interface DistanceMetricResult {
18
+ metric: 'byte-diff' | 'wasserstein' | 'sliced-wasserstein' | 'combined';
19
+ distance: number;
20
+ normalizedScore: number;
21
+ details: {
22
+ computeTimeMs: number;
23
+ dimensions?: {
24
+ width: number;
25
+ height: number;
26
+ };
27
+ numProjections?: number;
28
+ channelDistances?: {
29
+ r: number;
30
+ g: number;
31
+ b: number;
32
+ spatial: number;
33
+ };
34
+ transportCost?: number;
35
+ };
36
+ }
37
+ export interface WassersteinConfig {
38
+ /** Number of random 1D projections for sliced approximation (default: 64) */
39
+ numProjections?: number;
40
+ /** Compare mode: 'color' for color histogram, 'spatial' for spatial distribution, 'combined' for both */
41
+ compareMode?: 'color' | 'spatial' | 'combined';
42
+ /** Downscale factor for performance (0.0-1.0, default: 0.5 for 2x downscale) */
43
+ downscale?: number;
44
+ /** Regions to ignore (e.g. dynamic content areas) */
45
+ ignoreRegions?: Array<{
46
+ x: number;
47
+ y: number;
48
+ width: number;
49
+ height: number;
50
+ }>;
51
+ }
52
+ export interface BarycenterConfig {
53
+ /** Number of Sinkhorn iterations (default: 50) */
54
+ iterations?: number;
55
+ /** Entropy regularization parameter (default: 0.01) */
56
+ epsilon?: number;
57
+ /** Downscale for performance */
58
+ downscale?: number;
59
+ }
60
+ /**
61
+ * Compute Sliced Wasserstein Distance between two images.
62
+ *
63
+ * @param baselinePath - Path to baseline PNG/JPEG
64
+ * @param currentPath - Path to current PNG/JPEG
65
+ * @param config - Configuration options
66
+ * @returns DistanceMetricResult with similarity score (0-1)
67
+ */
68
+ export declare function computeWassersteinDistance(baselinePath: string, currentPath: string, config?: WassersteinConfig): Promise<DistanceMetricResult>;
69
+ /**
70
+ * Compute the existing byte-diff metric (for comparison / fallback).
71
+ */
72
+ export declare function computeByteDiff(baselinePath: string, currentPath: string): DistanceMetricResult;
73
+ /**
74
+ * Compute combined distance using multiple metrics.
75
+ * Runs byte-diff (fast) and Wasserstein (robust), combines scores.
76
+ */
77
+ export declare function computeCombinedDistance(baselinePath: string, currentPath: string, weights?: {
78
+ byteDiff?: number;
79
+ wasserstein?: number;
80
+ }, wassersteinConfig?: WassersteinConfig): Promise<DistanceMetricResult>;
81
+ /**
82
+ * Compute color histogram barycenter of multiple images.
83
+ * Returns the "average" color distribution — useful for creating
84
+ * consensus baselines from multiple captures.
85
+ *
86
+ * For Phase 2: full Wasserstein barycenter via Sinkhorn/IBP.
87
+ * This simpler version averages histograms, which approximates
88
+ * the Wasserstein barycenter for 1D marginals.
89
+ */
90
+ export declare function computeHistogramBarycenter(imagePaths: string[], config?: BarycenterConfig): Promise<{
91
+ histogram: {
92
+ r: Float64Array;
93
+ g: Float64Array;
94
+ b: Float64Array;
95
+ };
96
+ meanDistance: number;
97
+ }>;
98
+ export interface SmartBaselineConfig {
99
+ /** Number of captures to take (default: 5) */
100
+ numCaptures?: number;
101
+ /** Delay between captures in ms (default: 1000) */
102
+ captureDelay?: number;
103
+ /** Downscale for barycenter computation (default: 0.5) */
104
+ downscale?: number;
105
+ /** Directory to store baseline data */
106
+ outputDir?: string;
107
+ /** Outlier rejection threshold — captures with distance > threshold * stddev are excluded (default: 2.0) */
108
+ outlierThreshold?: number;
109
+ }
110
+ export interface SmartBaseline {
111
+ id: string;
112
+ name: string;
113
+ url: string;
114
+ /** Path to the median reference screenshot (closest to barycenter) */
115
+ referencePath: string;
116
+ /** Paths to all individual captures */
117
+ capturePaths: string[];
118
+ /** Barycenter histogram (consensus color distribution) */
119
+ barycenter: {
120
+ r: Float64Array;
121
+ g: Float64Array;
122
+ b: Float64Array;
123
+ };
124
+ /** Distance of each capture from the barycenter */
125
+ captureDistances: number[];
126
+ /** Mean distance — lower = more consistent renders */
127
+ meanDistance: number;
128
+ /** Standard deviation of distances — measures render stability */
129
+ stdDevDistance: number;
130
+ /** Number of captures used (after outlier rejection) */
131
+ numCaptures: number;
132
+ /** Number of captures rejected as outliers */
133
+ numOutliers: number;
134
+ /** Adaptive threshold: suggested comparison threshold based on observed variance */
135
+ adaptiveThreshold: number;
136
+ timestamp: string;
137
+ computeTimeMs: number;
138
+ }
139
+ /**
140
+ * Compute a Smart Barycenter Baseline from multiple screenshot paths.
141
+ *
142
+ * Algorithm:
143
+ * 1. Compute per-image color histograms
144
+ * 2. Compute Wasserstein barycenter (optimal consensus distribution)
145
+ * 3. Measure each capture's distance to the barycenter
146
+ * 4. Reject outliers (captures too far from consensus)
147
+ * 5. Recompute barycenter without outliers
148
+ * 6. Select the median capture (closest to barycenter) as reference image
149
+ * 7. Compute adaptive threshold based on observed variance
150
+ *
151
+ * The result: a baseline that represents the "typical" rendering,
152
+ * robust to timing variations, dynamic content, and animation states.
153
+ *
154
+ * @param screenshotPaths - Array of PNG paths (pre-captured)
155
+ * @param name - Baseline name
156
+ * @param url - Source URL
157
+ * @param config - Configuration
158
+ */
159
+ export declare function computeSmartBaseline(screenshotPaths: string[], name: string, url: string, config?: SmartBaselineConfig): Promise<SmartBaseline>;
160
+ /**
161
+ * Compare a new screenshot against a Smart Baseline.
162
+ *
163
+ * Uses the barycenter's color distribution as the reference rather than
164
+ * a single screenshot — this makes the comparison robust to the natural
165
+ * variance observed during baseline creation.
166
+ *
167
+ * @param screenshotPath - Path to the new screenshot
168
+ * @param baseline - Smart baseline to compare against
169
+ * @param config - Wasserstein configuration
170
+ */
171
+ export declare function compareAgainstSmartBaseline(screenshotPath: string, baseline: SmartBaseline, config?: WassersteinConfig): Promise<DistanceMetricResult & {
172
+ withinVariance: boolean;
173
+ varianceRatio: number;
174
+ }>;
175
+ export interface TransportFlow {
176
+ /** Source grid cell */
177
+ from: {
178
+ x: number;
179
+ y: number;
180
+ row: number;
181
+ col: number;
182
+ };
183
+ /** Destination grid cell */
184
+ to: {
185
+ x: number;
186
+ y: number;
187
+ row: number;
188
+ col: number;
189
+ };
190
+ /** Amount of visual mass transported (0-1) */
191
+ mass: number;
192
+ /** Euclidean distance of the flow */
193
+ distance: number;
194
+ /** Dominant color at source (hex) */
195
+ colorFrom: string;
196
+ /** Dominant color at destination (hex) */
197
+ colorTo: string;
198
+ }
199
+ export interface TransportMapResult {
200
+ /** Grid dimensions used */
201
+ gridSize: {
202
+ rows: number;
203
+ cols: number;
204
+ };
205
+ /** All transport flows (filtered to significant ones) */
206
+ flows: TransportFlow[];
207
+ /** Per-cell change magnitude (heatmap data) */
208
+ heatmap: Float64Array;
209
+ /** Total transport cost */
210
+ totalCost: number;
211
+ /** Regions with highest change */
212
+ hotspots: Array<{
213
+ region: {
214
+ x: number;
215
+ y: number;
216
+ width: number;
217
+ height: number;
218
+ };
219
+ magnitude: number;
220
+ description: string;
221
+ }>;
222
+ /** SVG visualization */
223
+ svg: string;
224
+ /** Image dimensions */
225
+ dimensions: {
226
+ width: number;
227
+ height: number;
228
+ };
229
+ computeTimeMs: number;
230
+ }
231
+ export interface TransportMapConfig {
232
+ /** Grid cell size in pixels (default: 32) */
233
+ cellSize?: number;
234
+ /** Minimum flow mass to include (default: 0.01) */
235
+ minFlowMass?: number;
236
+ /** Maximum number of flows to return (default: 100) */
237
+ maxFlows?: number;
238
+ /** Downscale factor (default: 0.5) */
239
+ downscale?: number;
240
+ /** Number of hotspots to identify (default: 5) */
241
+ numHotspots?: number;
242
+ }
243
+ /**
244
+ * Compute a Visual Transport Map between two images.
245
+ *
246
+ * Divides both images into a grid, computes the color distribution
247
+ * per cell, then solves a transport problem to determine how
248
+ * visual mass flows from the baseline to the current state.
249
+ *
250
+ * The result shows:
251
+ * - WHERE changes happened (heatmap)
252
+ * - HOW visual content moved (flow arrows)
253
+ * - WHAT changed most (hotspots)
254
+ * - A rendered SVG overlay visualization
255
+ *
256
+ * @since v18.0.0 (Phase 3)
257
+ * @see https://github.com/alexandriashai/cbrowser/issues/158
258
+ */
259
+ export declare function computeTransportMap(baselinePath: string, currentPath: string, config?: TransportMapConfig): Promise<TransportMapResult>;
260
+ //# sourceMappingURL=distance-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distance-metrics.d.ts","sourceRoot":"","sources":["../../src/visual/distance-metrics.ts"],"names":[],"mappings":"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"}