cbrowser 18.29.0 → 18.31.0

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.
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Attention Transport — Saliency modeling via optimal transport
3
+ *
4
+ * Generates persona-specific saliency maps showing WHERE each persona's
5
+ * attention goes on a page, using W₂ distance on CIE-Lab color distributions
6
+ * for center-surround contrast detection.
7
+ *
8
+ * Based on:
9
+ * - Klein & Frintrop (DAGM 2012): W₂ saliency on multivariate normals
10
+ * - Bylinskii et al. (IEEE TPAMI 2019): EMD for saliency evaluation
11
+ * - Mialon et al. (ICLR 2021): attention as optimal transport plan
12
+ * - Sun & Li (JEI 2018): multi-scale aggregated Wasserstein saliency
13
+ *
14
+ * The transport plan between persona's attention prior and page's
15
+ * saliency map reveals WHERE attention flows — richer than saliency
16
+ * alone because it shows the mapping, not just the destination.
17
+ *
18
+ * @version 1.0.0
19
+ * @since v18.28.0
20
+ * @see https://github.com/alexandriashai/cbrowser/issues/159
21
+ */
22
+ export interface SaliencyMap {
23
+ /** Saliency values per grid cell (0-1, higher = more salient) */
24
+ cells: Float64Array;
25
+ /** Grid dimensions */
26
+ rows: number;
27
+ cols: number;
28
+ /** Image dimensions */
29
+ width: number;
30
+ height: number;
31
+ /** Cell size in pixels */
32
+ cellSize: number;
33
+ /** Top N most salient regions */
34
+ hotspots: Array<{
35
+ row: number;
36
+ col: number;
37
+ x: number;
38
+ y: number;
39
+ saliency: number;
40
+ }>;
41
+ }
42
+ export interface AttentionAnalysis {
43
+ /** Persona name */
44
+ persona: string;
45
+ /** Persona-specific saliency map */
46
+ saliencyMap: SaliencyMap;
47
+ /** Attention alignment: how well persona's attention matches the page's intended hierarchy */
48
+ alignmentScore: number;
49
+ /** Attention entropy: how dispersed the persona's attention is (0=focused, 1=scattered) */
50
+ entropy: number;
51
+ /** Attention concentration: what fraction of attention goes to top 20% of regions */
52
+ concentration: number;
53
+ /** Top elements competing for attention */
54
+ attentionCompetitors: Array<{
55
+ region: string;
56
+ saliency: number;
57
+ }>;
58
+ /** Transport cost from persona's attention prior to actual saliency */
59
+ transportCost: number;
60
+ computeTimeMs: number;
61
+ }
62
+ export interface AttentionComparisonResult {
63
+ /** Persona A's attention analysis */
64
+ personaA: AttentionAnalysis;
65
+ /** Persona B's attention analysis */
66
+ personaB: AttentionAnalysis;
67
+ /** Wasserstein distance between the two saliency maps */
68
+ attentionDivergence: number;
69
+ /** Regions where attention differs most */
70
+ divergentRegions: Array<{
71
+ row: number;
72
+ col: number;
73
+ x: number;
74
+ y: number;
75
+ saliencyA: number;
76
+ saliencyB: number;
77
+ divergence: number;
78
+ }>;
79
+ }
80
+ /**
81
+ * Compute persona-specific attention analysis for a screenshot.
82
+ *
83
+ * Generates a saliency map using W₂ on CIE-Lab distributions,
84
+ * applies the persona's perceptual filter, and computes attention metrics.
85
+ */
86
+ export declare function analyzeAttention(screenshotPath: string, personaName: string, cellSize?: number): Promise<AttentionAnalysis>;
87
+ /**
88
+ * Compare attention patterns between two personas on the same screenshot.
89
+ * Returns the Wasserstein divergence between their saliency maps and
90
+ * identifies regions where attention differs most.
91
+ */
92
+ export declare function compareAttention(screenshotPath: string, personaA: string, personaB: string, cellSize?: number): Promise<AttentionComparisonResult>;
93
+ //# sourceMappingURL=attention-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-transport.d.ts","sourceRoot":"","sources":["../../src/visual/attention-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,KAAK,EAAE,YAAY,CAAC;IACpB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,QAAQ,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,WAAW,CAAC;IACzB,8FAA8F;IAC9F,cAAc,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,oBAAoB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,yDAAyD;IACzD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,gBAAgB,EAAE,KAAK,CAAC;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AA8OD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAwF5B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,yBAAyB,CAAC,CA2CpC"}
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Attention Transport — Saliency modeling via optimal transport
3
+ *
4
+ * Generates persona-specific saliency maps showing WHERE each persona's
5
+ * attention goes on a page, using W₂ distance on CIE-Lab color distributions
6
+ * for center-surround contrast detection.
7
+ *
8
+ * Based on:
9
+ * - Klein & Frintrop (DAGM 2012): W₂ saliency on multivariate normals
10
+ * - Bylinskii et al. (IEEE TPAMI 2019): EMD for saliency evaluation
11
+ * - Mialon et al. (ICLR 2021): attention as optimal transport plan
12
+ * - Sun & Li (JEI 2018): multi-scale aggregated Wasserstein saliency
13
+ *
14
+ * The transport plan between persona's attention prior and page's
15
+ * saliency map reveals WHERE attention flows — richer than saliency
16
+ * alone because it shows the mapping, not just the destination.
17
+ *
18
+ * @version 1.0.0
19
+ * @since v18.28.0
20
+ * @see https://github.com/alexandriashai/cbrowser/issues/159
21
+ */
22
+ import { getPerceptualProfile } from './perceptual-transport.js';
23
+ // ── CIE-Lab Color Space Conversion ──
24
+ function srgbToLab(r, g, b) {
25
+ // sRGB to linear
26
+ const toLinear = (c) => {
27
+ c /= 255;
28
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
29
+ };
30
+ const rl = toLinear(r), gl = toLinear(g), bl = toLinear(b);
31
+ // Linear RGB to XYZ (D65)
32
+ const x = 0.4124564 * rl + 0.3575761 * gl + 0.1804375 * bl;
33
+ const y = 0.2126729 * rl + 0.7151522 * gl + 0.0721750 * bl;
34
+ const z = 0.0193339 * rl + 0.1191920 * gl + 0.9503041 * bl;
35
+ // XYZ to Lab (D65 reference)
36
+ const xn = 0.95047, yn = 1.0, zn = 1.08883;
37
+ const f = (t) => t > 0.008856 ? Math.cbrt(t) : 7.787 * t + 16 / 116;
38
+ const fx = f(x / xn), fy = f(y / yn), fz = f(z / zn);
39
+ const L = 116 * fy - 16;
40
+ const a = 500 * (fx - fy);
41
+ const bLab = 200 * (fy - fz);
42
+ return [L, a, bLab];
43
+ }
44
+ // ── Core: Center-Surround Saliency via W₂ ──
45
+ /**
46
+ * Compute saliency map using Wasserstein-2 distance on CIE-Lab distributions.
47
+ *
48
+ * For each grid cell, computes the mean and variance of the Lab color distribution.
49
+ * Saliency = W₂ distance between the cell's distribution and its surround's
50
+ * distribution (center-surround contrast, Klein & Frintrop method).
51
+ *
52
+ * For Gaussian measures, W₂ has a closed-form solution:
53
+ * BW²(N(μ₁,σ₁²), N(μ₂,σ₂²)) = ||μ₁-μ₂||² + (σ₁-σ₂)²
54
+ */
55
+ async function computeLabSaliency(imagePath, cellSize = 16, surroundRadius = 3) {
56
+ const sharpModule = await import('sharp');
57
+ const sharp = sharpModule.default ?? sharpModule;
58
+ // Load and downscale
59
+ const scale = 0.5;
60
+ const img = sharp(imagePath);
61
+ const metadata = await img.metadata();
62
+ const width = Math.round((metadata.width || 800) * scale);
63
+ const height = Math.round((metadata.height || 600) * scale);
64
+ const { data } = await img
65
+ .resize(width, height)
66
+ .ensureAlpha()
67
+ .raw()
68
+ .toBuffer({ resolveWithObject: true });
69
+ const pixels = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
70
+ const rows = Math.ceil(height / cellSize);
71
+ const cols = Math.ceil(width / cellSize);
72
+ const numCells = rows * cols;
73
+ // Compute per-cell Lab statistics (mean L, a, b and variance)
74
+ const cellStats = [];
75
+ for (let row = 0; row < rows; row++) {
76
+ for (let col = 0; col < cols; col++) {
77
+ let sumL = 0, sumA = 0, sumB = 0;
78
+ let sumL2 = 0, sumA2 = 0, sumB2 = 0;
79
+ let count = 0;
80
+ const yStart = row * cellSize;
81
+ const xStart = col * cellSize;
82
+ const yEnd = Math.min(yStart + cellSize, height);
83
+ const xEnd = Math.min(xStart + cellSize, width);
84
+ for (let y = yStart; y < yEnd; y++) {
85
+ for (let x = xStart; x < xEnd; x++) {
86
+ const idx = (y * width + x) * 4;
87
+ if (pixels[idx + 3] < 25)
88
+ continue; // Skip transparent
89
+ const [L, a, b] = srgbToLab(pixels[idx], pixels[idx + 1], pixels[idx + 2]);
90
+ sumL += L;
91
+ sumA += a;
92
+ sumB += b;
93
+ sumL2 += L * L;
94
+ sumA2 += a * a;
95
+ sumB2 += b * b;
96
+ count++;
97
+ }
98
+ }
99
+ if (count > 0) {
100
+ const mL = sumL / count, mA = sumA / count, mB = sumB / count;
101
+ cellStats.push({
102
+ meanL: mL, meanA: mA, meanB: mB,
103
+ varL: Math.max(0.01, sumL2 / count - mL * mL),
104
+ varA: Math.max(0.01, sumA2 / count - mA * mA),
105
+ varB: Math.max(0.01, sumB2 / count - mB * mB),
106
+ count,
107
+ });
108
+ }
109
+ else {
110
+ cellStats.push({ meanL: 0, meanA: 0, meanB: 0, varL: 0.01, varA: 0.01, varB: 0.01, count: 0 });
111
+ }
112
+ }
113
+ }
114
+ // Compute center-surround W₂ saliency for each cell
115
+ const saliency = new Float64Array(numCells);
116
+ for (let row = 0; row < rows; row++) {
117
+ for (let col = 0; col < cols; col++) {
118
+ const idx = row * cols + col;
119
+ const center = cellStats[idx];
120
+ if (center.count === 0)
121
+ continue;
122
+ // Compute surround statistics (average of surrounding cells)
123
+ let sCount = 0;
124
+ let sMeanL = 0, sMeanA = 0, sMeanB = 0;
125
+ let sVarL = 0, sVarA = 0, sVarB = 0;
126
+ for (let dr = -surroundRadius; dr <= surroundRadius; dr++) {
127
+ for (let dc = -surroundRadius; dc <= surroundRadius; dc++) {
128
+ if (dr === 0 && dc === 0)
129
+ continue; // Skip center
130
+ const sr = row + dr, sc = col + dc;
131
+ if (sr < 0 || sr >= rows || sc < 0 || sc >= cols)
132
+ continue;
133
+ const si = sr * cols + sc;
134
+ const s = cellStats[si];
135
+ if (s.count === 0)
136
+ continue;
137
+ sMeanL += s.meanL;
138
+ sMeanA += s.meanA;
139
+ sMeanB += s.meanB;
140
+ sVarL += s.varL;
141
+ sVarA += s.varA;
142
+ sVarB += s.varB;
143
+ sCount++;
144
+ }
145
+ }
146
+ if (sCount === 0)
147
+ continue;
148
+ sMeanL /= sCount;
149
+ sMeanA /= sCount;
150
+ sMeanB /= sCount;
151
+ sVarL /= sCount;
152
+ sVarA /= sCount;
153
+ sVarB /= sCount;
154
+ // Bures-Wasserstein distance for 3D Gaussians (diagonal covariance)
155
+ // BW² = ||μ_center - μ_surround||² + Σ(√σ_center_i - √σ_surround_i)²
156
+ const meanDist = (center.meanL - sMeanL) ** 2 + (center.meanA - sMeanA) ** 2 + (center.meanB - sMeanB) ** 2;
157
+ const varDist = (Math.sqrt(center.varL) - Math.sqrt(sVarL)) ** 2 +
158
+ (Math.sqrt(center.varA) - Math.sqrt(sVarA)) ** 2 +
159
+ (Math.sqrt(center.varB) - Math.sqrt(sVarB)) ** 2;
160
+ saliency[idx] = Math.sqrt(meanDist + varDist);
161
+ }
162
+ }
163
+ // Normalize to 0-1
164
+ const maxSal = Math.max(...Array.from(saliency), 0.001);
165
+ for (let i = 0; i < numCells; i++)
166
+ saliency[i] /= maxSal;
167
+ return { cells: saliency, rows, cols, width: width / scale, height: height / scale };
168
+ }
169
+ // ── Persona-Filtered Saliency ──
170
+ /**
171
+ * Apply a persona's perceptual filter to the saliency map.
172
+ *
173
+ * Different personas have different attention modes:
174
+ * - uniform: all cells weighted equally (baseline)
175
+ * - center-heavy: center cells boosted, edges suppressed (motor impairment)
176
+ * - motion-attracted: high-variance cells boosted (ADHD)
177
+ * - text-focused: low-variance, high-L cells boosted (dyslexia, elderly)
178
+ * - large-elements: high-count cells boosted (low vision)
179
+ */
180
+ function applyPersonaFilter(saliency, rows, cols, filter) {
181
+ const filtered = new Float64Array(saliency);
182
+ switch (filter.attentionMode) {
183
+ case 'center-heavy': {
184
+ // Boost center, suppress edges (motor: narrow attention to avoid accidents)
185
+ const centerRow = rows / 2, centerCol = cols / 2;
186
+ const maxDist = Math.sqrt(centerRow ** 2 + centerCol ** 2);
187
+ for (let r = 0; r < rows; r++) {
188
+ for (let c = 0; c < cols; c++) {
189
+ const dist = Math.sqrt((r - centerRow) ** 2 + (c - centerCol) ** 2) / maxDist;
190
+ filtered[r * cols + c] *= 1 - dist * 0.7; // Edges get 30% of center weight
191
+ }
192
+ }
193
+ break;
194
+ }
195
+ case 'motion-attracted': {
196
+ // ADHD: boost high-saliency areas (already prominent things capture more)
197
+ // This models the "attention captured by novelty" pattern
198
+ for (let i = 0; i < filtered.length; i++) {
199
+ filtered[i] = Math.pow(filtered[i], 0.5); // Square root amplifies high values
200
+ }
201
+ break;
202
+ }
203
+ case 'text-focused': {
204
+ // Dyslexia/elderly: suppress high-saliency distractors, focus on text areas
205
+ // Text areas typically have moderate, uniform saliency (not flashy)
206
+ for (let i = 0; i < filtered.length; i++) {
207
+ // Moderate saliency (0.2-0.6) boosted, extreme saliency suppressed
208
+ const s = filtered[i];
209
+ filtered[i] = s > 0.7 ? s * 0.5 : s * 1.3;
210
+ }
211
+ break;
212
+ }
213
+ case 'large-elements': {
214
+ // Low vision: only high-saliency regions register
215
+ for (let i = 0; i < filtered.length; i++) {
216
+ filtered[i] = filtered[i] > 0.3 ? filtered[i] : filtered[i] * 0.2;
217
+ }
218
+ break;
219
+ }
220
+ // 'uniform' — no modification
221
+ }
222
+ // Apply processing speed: slower processors → more focused (fewer things register)
223
+ if (filter.processingSpeed < 0.8) {
224
+ const threshold = 0.3 + (1 - filter.processingSpeed) * 0.3;
225
+ for (let i = 0; i < filtered.length; i++) {
226
+ if (filtered[i] < threshold)
227
+ filtered[i] *= filter.processingSpeed;
228
+ }
229
+ }
230
+ // Renormalize
231
+ const max = Math.max(...Array.from(filtered), 0.001);
232
+ for (let i = 0; i < filtered.length; i++)
233
+ filtered[i] /= max;
234
+ return filtered;
235
+ }
236
+ // ── Public API ──
237
+ /**
238
+ * Compute persona-specific attention analysis for a screenshot.
239
+ *
240
+ * Generates a saliency map using W₂ on CIE-Lab distributions,
241
+ * applies the persona's perceptual filter, and computes attention metrics.
242
+ */
243
+ export async function analyzeAttention(screenshotPath, personaName, cellSize = 16) {
244
+ const startTime = performance.now();
245
+ const profile = getPerceptualProfile(personaName);
246
+ // Compute base saliency
247
+ const baseSaliency = await computeLabSaliency(screenshotPath, cellSize);
248
+ // Apply persona filter
249
+ const filtered = applyPersonaFilter(baseSaliency.cells, baseSaliency.rows, baseSaliency.cols, profile.visualFilter);
250
+ // Build saliency map with hotspots
251
+ const indexed = Array.from(filtered).map((s, i) => ({ s, i }));
252
+ indexed.sort((a, b) => b.s - a.s);
253
+ const hotspots = indexed.slice(0, 10).map(({ s, i }) => ({
254
+ row: Math.floor(i / baseSaliency.cols),
255
+ col: i % baseSaliency.cols,
256
+ x: (i % baseSaliency.cols) * cellSize * 2, // Scale back to original
257
+ y: Math.floor(i / baseSaliency.cols) * cellSize * 2,
258
+ saliency: s,
259
+ }));
260
+ const saliencyMap = {
261
+ cells: filtered,
262
+ rows: baseSaliency.rows,
263
+ cols: baseSaliency.cols,
264
+ width: baseSaliency.width,
265
+ height: baseSaliency.height,
266
+ cellSize: cellSize * 2, // Scaled
267
+ hotspots,
268
+ };
269
+ // Compute attention metrics
270
+ const totalSaliency = filtered.reduce((a, b) => a + b, 0) || 1;
271
+ // Entropy: -Σ p*log(p) where p = normalized saliency
272
+ let entropy = 0;
273
+ for (let i = 0; i < filtered.length; i++) {
274
+ const p = filtered[i] / totalSaliency;
275
+ if (p > 0)
276
+ entropy -= p * Math.log2(p + 1e-10);
277
+ }
278
+ const maxEntropy = Math.log2(filtered.length);
279
+ entropy = entropy / maxEntropy; // Normalize to 0-1
280
+ // Concentration: fraction of total saliency in top 20% of cells
281
+ const sorted = Array.from(filtered).sort((a, b) => b - a);
282
+ const top20Count = Math.ceil(filtered.length * 0.2);
283
+ const top20Sum = sorted.slice(0, top20Count).reduce((a, b) => a + b, 0);
284
+ const concentration = top20Sum / totalSaliency;
285
+ // Alignment: how well does the persona's saliency match the base (unfiltered) saliency?
286
+ // Computed as correlation between filtered and base saliency
287
+ let sumAB = 0, sumA2 = 0, sumB2 = 0;
288
+ const meanA = baseSaliency.cells.reduce((a, b) => a + b, 0) / baseSaliency.cells.length;
289
+ const meanB = filtered.reduce((a, b) => a + b, 0) / filtered.length;
290
+ for (let i = 0; i < filtered.length; i++) {
291
+ const da = baseSaliency.cells[i] - meanA;
292
+ const db = filtered[i] - meanB;
293
+ sumAB += da * db;
294
+ sumA2 += da * da;
295
+ sumB2 += db * db;
296
+ }
297
+ const alignmentScore = sumA2 > 0 && sumB2 > 0 ? sumAB / Math.sqrt(sumA2 * sumB2) : 1;
298
+ // Transport cost: W₁ between base and filtered saliency (how much attention moved)
299
+ let transportCost = 0;
300
+ for (let i = 0; i < filtered.length; i++) {
301
+ transportCost += Math.abs(baseSaliency.cells[i] / (totalSaliency || 1) - filtered[i] / (totalSaliency || 1));
302
+ }
303
+ // Attention competitors: group hotspots into regions
304
+ const attentionCompetitors = hotspots.slice(0, 5).map((h, i) => ({
305
+ region: `(${h.x}, ${h.y})`,
306
+ saliency: Math.round(h.saliency * 100) / 100,
307
+ }));
308
+ return {
309
+ persona: personaName,
310
+ saliencyMap,
311
+ alignmentScore: Math.round(alignmentScore * 1000) / 1000,
312
+ entropy: Math.round(entropy * 1000) / 1000,
313
+ concentration: Math.round(concentration * 1000) / 1000,
314
+ attentionCompetitors,
315
+ transportCost: Math.round(transportCost * 10000) / 10000,
316
+ computeTimeMs: performance.now() - startTime,
317
+ };
318
+ }
319
+ /**
320
+ * Compare attention patterns between two personas on the same screenshot.
321
+ * Returns the Wasserstein divergence between their saliency maps and
322
+ * identifies regions where attention differs most.
323
+ */
324
+ export async function compareAttention(screenshotPath, personaA, personaB, cellSize = 16) {
325
+ const [analysisA, analysisB] = await Promise.all([
326
+ analyzeAttention(screenshotPath, personaA, cellSize),
327
+ analyzeAttention(screenshotPath, personaB, cellSize),
328
+ ]);
329
+ const salA = analysisA.saliencyMap.cells;
330
+ const salB = analysisB.saliencyMap.cells;
331
+ const n = Math.min(salA.length, salB.length);
332
+ // W₁ between the two saliency distributions
333
+ let divergence = 0;
334
+ const totalA = salA.reduce((a, b) => a + b, 0) || 1;
335
+ const totalB = salB.reduce((a, b) => a + b, 0) || 1;
336
+ for (let i = 0; i < n; i++) {
337
+ divergence += Math.abs(salA[i] / totalA - salB[i] / totalB);
338
+ }
339
+ // Find most divergent regions
340
+ const divergentRegions = [];
341
+ for (let i = 0; i < n; i++) {
342
+ const div = Math.abs(salA[i] - salB[i]);
343
+ if (div > 0.3) { // Only significant divergences
344
+ const row = Math.floor(i / analysisA.saliencyMap.cols);
345
+ const col = i % analysisA.saliencyMap.cols;
346
+ divergentRegions.push({
347
+ row, col,
348
+ x: col * analysisA.saliencyMap.cellSize,
349
+ y: row * analysisA.saliencyMap.cellSize,
350
+ saliencyA: Math.round(salA[i] * 100) / 100,
351
+ saliencyB: Math.round(salB[i] * 100) / 100,
352
+ divergence: Math.round(div * 100) / 100,
353
+ });
354
+ }
355
+ }
356
+ divergentRegions.sort((a, b) => b.divergence - a.divergence);
357
+ return {
358
+ personaA: analysisA,
359
+ personaB: analysisB,
360
+ attentionDivergence: Math.round(divergence * 10000) / 10000,
361
+ divergentRegions: divergentRegions.slice(0, 10),
362
+ };
363
+ }
364
+ //# sourceMappingURL=attention-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-transport.js","sourceRoot":"","sources":["../../src/visual/attention-transport.ts"],"names":[],"mappings":"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"}
@@ -175,6 +175,19 @@ export declare function estimateCognitiveLoad(persona: OTCognitiveProfile, pageM
175
175
  * test coverage. Uses greedy farthest-point sampling in Wasserstein space.
176
176
  */
177
177
  export declare function selectMaxCoveragePersonas(profiles: OTCognitiveProfile[], n: number): OTCognitiveProfile[];
178
+ /**
179
+ * Extract page metrics from a Playwright page for cognitive load estimation.
180
+ * Runs a single page.evaluate() to gather all needed dimensions.
181
+ */
182
+ export declare function extractPageMetrics(page: any): Promise<{
183
+ informationDensity: number;
184
+ visualComplexity: number;
185
+ interactiveElementCount: number;
186
+ textDensity: number;
187
+ animationLevel: number;
188
+ choiceCount: number;
189
+ navigationDepth: number;
190
+ }>;
178
191
  /**
179
192
  * Compute the full pairwise distance matrix between personas.
180
193
  * Returns a symmetric matrix where entry [i][j] = W₁(persona_i, persona_j).
@@ -1 +1 @@
1
- {"version":3,"file":"cognitive-transport.d.ts","sourceRoot":"","sources":["../../src/visual/cognitive-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cognitive-transport.d.ts","sourceRoot":"","sources":["../../src/visual/cognitive-transport.ts"],"names":[],"mappings":"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"}
@@ -462,6 +462,59 @@ export function selectMaxCoveragePersonas(profiles, n) {
462
462
  }
463
463
  return selected;
464
464
  }
465
+ /**
466
+ * Extract page metrics from a Playwright page for cognitive load estimation.
467
+ * Runs a single page.evaluate() to gather all needed dimensions.
468
+ */
469
+ export async function extractPageMetrics(page) {
470
+ return page.evaluate(() => {
471
+ const all = document.querySelectorAll('*');
472
+ const body = document.body;
473
+ const textLength = (body.innerText || '').length;
474
+ const viewportArea = window.innerWidth * window.innerHeight;
475
+ // Interactive elements
476
+ const interactive = document.querySelectorAll('a, button, input, select, textarea, [role="button"], [onclick], [tabindex]');
477
+ const interactiveCount = interactive.length;
478
+ // Links and choices
479
+ const links = document.querySelectorAll('a[href]');
480
+ const selects = document.querySelectorAll('select');
481
+ let choiceCount = links.length;
482
+ selects.forEach(s => { choiceCount += s.querySelectorAll('option').length; });
483
+ // Animations
484
+ const animations = document.querySelectorAll('[class*="anim"], [class*="transition"], [class*="slide"], [class*="fade"], video, [autoplay]');
485
+ const hasCarousel = !!document.querySelector('[class*="carousel"], [class*="slider"], [class*="swiper"]');
486
+ // Navigation depth (breadcrumbs or nested menus)
487
+ const breadcrumbs = document.querySelectorAll('[class*="breadcrumb"] a, nav[aria-label*="breadcrumb"] a');
488
+ const navDepth = Math.max(1, breadcrumbs.length);
489
+ // Visual complexity heuristics
490
+ const uniqueColors = new Set();
491
+ const computed = getComputedStyle(body);
492
+ uniqueColors.add(computed.backgroundColor);
493
+ uniqueColors.add(computed.color);
494
+ // Sample a few elements
495
+ for (let i = 0; i < Math.min(50, all.length); i += Math.max(1, Math.floor(all.length / 50))) {
496
+ const cs = getComputedStyle(all[i]);
497
+ uniqueColors.add(cs.backgroundColor);
498
+ uniqueColors.add(cs.color);
499
+ }
500
+ // Images
501
+ const images = document.querySelectorAll('img, svg, [role="img"]');
502
+ // Normalize to 0-1
503
+ const informationDensity = Math.min(1, textLength / 5000);
504
+ const visualComplexity = Math.min(1, (uniqueColors.size / 30 + images.length / 20 + all.length / 500) / 3);
505
+ const textDensity = Math.min(1, textLength / (viewportArea * 0.003));
506
+ const animationLevel = Math.min(1, (animations.length + (hasCarousel ? 3 : 0)) / 10);
507
+ return {
508
+ informationDensity,
509
+ visualComplexity,
510
+ interactiveElementCount: interactiveCount,
511
+ textDensity,
512
+ animationLevel,
513
+ choiceCount: Math.min(choiceCount, 100),
514
+ navigationDepth: navDepth,
515
+ };
516
+ });
517
+ }
465
518
  /**
466
519
  * Compute the full pairwise distance matrix between personas.
467
520
  * Returns a symmetric matrix where entry [i][j] = W₁(persona_i, persona_j).