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.
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +48 -0
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +4 -0
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/index.d.ts +1 -1
- package/dist/mcp-tools/base/index.js +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +102 -0
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/visual/attention-transport.d.ts +93 -0
- package/dist/visual/attention-transport.d.ts.map +1 -0
- package/dist/visual/attention-transport.js +364 -0
- package/dist/visual/attention-transport.js.map +1 -0
- package/dist/visual/cognitive-transport.d.ts +13 -0
- package/dist/visual/cognitive-transport.d.ts.map +1 -1
- package/dist/visual/cognitive-transport.js +53 -0
- package/dist/visual/cognitive-transport.js.map +1 -1
- package/dist/visual/index.d.ts +1 -0
- package/dist/visual/index.d.ts.map +1 -1
- package/dist/visual/index.js +1 -0
- package/dist/visual/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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).
|