cbrowser 20.2.2 → 21.0.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.
Files changed (302) hide show
  1. package/README.md +2 -2
  2. package/dist/analysis/accessibility-empathy.d.ts +29 -1
  3. package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
  4. package/dist/analysis/accessibility-empathy.js +69 -35
  5. package/dist/analysis/accessibility-empathy.js.map +1 -1
  6. package/dist/browser.d.ts.map +1 -1
  7. package/dist/browser.js +11 -7
  8. package/dist/browser.js.map +1 -1
  9. package/dist/cif-score.d.ts +56 -5
  10. package/dist/cif-score.d.ts.map +1 -1
  11. package/dist/cif-score.js +595 -346
  12. package/dist/cif-score.js.map +1 -1
  13. package/dist/cli.js +10 -8
  14. package/dist/cli.js.map +1 -1
  15. package/dist/cognitive/default-traits.d.ts +14 -0
  16. package/dist/cognitive/default-traits.d.ts.map +1 -0
  17. package/dist/cognitive/default-traits.js +36 -0
  18. package/dist/cognitive/default-traits.js.map +1 -0
  19. package/dist/cognitive/emotions.d.ts.map +1 -1
  20. package/dist/cognitive/emotions.js +104 -174
  21. package/dist/cognitive/emotions.js.map +1 -1
  22. package/dist/cognitive/index.d.ts +28 -0
  23. package/dist/cognitive/index.d.ts.map +1 -1
  24. package/dist/cognitive/index.js +353 -287
  25. package/dist/cognitive/index.js.map +1 -1
  26. package/dist/cognitive/temporal.d.ts +0 -24
  27. package/dist/cognitive/temporal.d.ts.map +1 -1
  28. package/dist/cognitive/temporal.js +45 -35
  29. package/dist/cognitive/temporal.js.map +1 -1
  30. package/dist/data/ctc-reference-v2-2026-10-24.d.ts +16 -0
  31. package/dist/data/ctc-reference-v2-2026-10-24.d.ts.map +1 -0
  32. package/dist/data/ctc-reference-v2-2026-10-24.js +1004 -0
  33. package/dist/data/ctc-reference-v2-2026-10-24.js.map +1 -0
  34. package/dist/ideal-profiles-gap.d.ts +1 -0
  35. package/dist/ideal-profiles-gap.d.ts.map +1 -1
  36. package/dist/ideal-profiles-gap.js +9 -1
  37. package/dist/ideal-profiles-gap.js.map +1 -1
  38. package/dist/ideal-profiles.d.ts +8 -0
  39. package/dist/ideal-profiles.d.ts.map +1 -1
  40. package/dist/ideal-profiles.js +28 -24
  41. package/dist/ideal-profiles.js.map +1 -1
  42. package/dist/mcp-server-remote.d.ts.map +1 -1
  43. package/dist/mcp-server-remote.js +7 -8
  44. package/dist/mcp-server-remote.js.map +1 -1
  45. package/dist/mcp-tools/account-personas.d.ts.map +1 -1
  46. package/dist/mcp-tools/account-personas.js +3 -1
  47. package/dist/mcp-tools/account-personas.js.map +1 -1
  48. package/dist/mcp-tools/base/answer-provenance.d.ts +28 -0
  49. package/dist/mcp-tools/base/answer-provenance.d.ts.map +1 -0
  50. package/dist/mcp-tools/base/answer-provenance.js +32 -0
  51. package/dist/mcp-tools/base/answer-provenance.js.map +1 -0
  52. package/dist/mcp-tools/base/audit-tools.d.ts +0 -3
  53. package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
  54. package/dist/mcp-tools/base/audit-tools.js +152 -84
  55. package/dist/mcp-tools/base/audit-tools.js.map +1 -1
  56. package/dist/mcp-tools/base/capture-tools.js +1 -1
  57. package/dist/mcp-tools/base/capture-tools.js.map +1 -1
  58. package/dist/mcp-tools/base/chain-values.d.ts +38 -0
  59. package/dist/mcp-tools/base/chain-values.d.ts.map +1 -0
  60. package/dist/mcp-tools/base/chain-values.js +85 -0
  61. package/dist/mcp-tools/base/chain-values.js.map +1 -0
  62. package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
  63. package/dist/mcp-tools/base/cognitive-tools.js +126 -120
  64. package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
  65. package/dist/mcp-tools/base/gif-tools.d.ts.map +1 -1
  66. package/dist/mcp-tools/base/gif-tools.js +23 -5
  67. package/dist/mcp-tools/base/gif-tools.js.map +1 -1
  68. package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
  69. package/dist/mcp-tools/base/persona-comparison-tools.js +229 -172
  70. package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
  71. package/dist/mcp-tools/base/site-familiarity.d.ts +31 -0
  72. package/dist/mcp-tools/base/site-familiarity.d.ts.map +1 -0
  73. package/dist/mcp-tools/base/site-familiarity.js +30 -0
  74. package/dist/mcp-tools/base/site-familiarity.js.map +1 -0
  75. package/dist/mcp-tools/base/site-knowledge-tools.js +1 -1
  76. package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
  77. package/dist/mcp-tools/base/story-narrative.d.ts +50 -0
  78. package/dist/mcp-tools/base/story-narrative.d.ts.map +1 -0
  79. package/dist/mcp-tools/base/story-narrative.js +88 -0
  80. package/dist/mcp-tools/base/story-narrative.js.map +1 -0
  81. package/dist/mcp-tools/base/values-tools.d.ts.map +1 -1
  82. package/dist/mcp-tools/base/values-tools.js +19 -5
  83. package/dist/mcp-tools/base/values-tools.js.map +1 -1
  84. package/dist/mcp-tools/base/visual-testing-tools.d.ts +5 -5
  85. package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
  86. package/dist/mcp-tools/base/visual-testing-tools.js +38 -11
  87. package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
  88. package/dist/mcp-tools/persona-creation-tools.js +6 -6
  89. package/dist/mcp-tools/persona-creation-tools.js.map +1 -1
  90. package/dist/mcp-tools/persona-lifecycle-tools.d.ts.map +1 -1
  91. package/dist/mcp-tools/persona-lifecycle-tools.js +5 -1
  92. package/dist/mcp-tools/persona-lifecycle-tools.js.map +1 -1
  93. package/dist/mcp-tools/tier-gate.js +1 -1
  94. package/dist/mcp-tools/tool-result-saver.d.ts +7 -0
  95. package/dist/mcp-tools/tool-result-saver.d.ts.map +1 -1
  96. package/dist/mcp-tools/tool-result-saver.js +11 -0
  97. package/dist/mcp-tools/tool-result-saver.js.map +1 -1
  98. package/dist/mcp-tools/trait-provenance.d.ts +109 -0
  99. package/dist/mcp-tools/trait-provenance.d.ts.map +1 -0
  100. package/dist/mcp-tools/trait-provenance.js +187 -0
  101. package/dist/mcp-tools/trait-provenance.js.map +1 -0
  102. package/dist/mcp-tools/ui-resources.d.ts +6 -7
  103. package/dist/mcp-tools/ui-resources.d.ts.map +1 -1
  104. package/dist/mcp-tools/ui-resources.js +162 -12
  105. package/dist/mcp-tools/ui-resources.js.map +1 -1
  106. package/dist/mcp-tools/widget-kit.d.ts +129 -3
  107. package/dist/mcp-tools/widget-kit.d.ts.map +1 -1
  108. package/dist/mcp-tools/widget-kit.js +507 -28
  109. package/dist/mcp-tools/widget-kit.js.map +1 -1
  110. package/dist/performance/metrics.d.ts.map +1 -1
  111. package/dist/performance/metrics.js +4 -1
  112. package/dist/performance/metrics.js.map +1 -1
  113. package/dist/persona-questionnaire.js +1 -1
  114. package/dist/persona-questionnaire.js.map +1 -1
  115. package/dist/personas.d.ts.map +1 -1
  116. package/dist/personas.js +133 -82
  117. package/dist/personas.js.map +1 -1
  118. package/dist/recording/engine.d.ts.map +1 -1
  119. package/dist/recording/engine.js +5 -2
  120. package/dist/recording/engine.js.map +1 -1
  121. package/dist/recording/saliency-overlay.d.ts +8 -3
  122. package/dist/recording/saliency-overlay.d.ts.map +1 -1
  123. package/dist/recording/saliency-overlay.js +14 -5
  124. package/dist/recording/saliency-overlay.js.map +1 -1
  125. package/dist/recording/types.js +1 -1
  126. package/dist/testing/nl-test-suite.d.ts.map +1 -1
  127. package/dist/testing/nl-test-suite.js +2 -1
  128. package/dist/testing/nl-test-suite.js.map +1 -1
  129. package/dist/trait-reference.d.ts +19 -2
  130. package/dist/trait-reference.d.ts.map +1 -1
  131. package/dist/trait-reference.js +19 -2
  132. package/dist/trait-reference.js.map +1 -1
  133. package/dist/types.d.ts +32 -21
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/types.js +62 -52
  136. package/dist/types.js.map +1 -1
  137. package/dist/values/persona-completeness.js +1 -1
  138. package/dist/values/persona-completeness.js.map +1 -1
  139. package/dist/visual/ab-comparison.d.ts.map +1 -1
  140. package/dist/visual/ab-comparison.js +4 -1
  141. package/dist/visual/ab-comparison.js.map +1 -1
  142. package/dist/visual/attention-quality.d.ts +1 -1
  143. package/dist/visual/attention-quality.js +1 -1
  144. package/dist/visual/attention-transport.d.ts +74 -10
  145. package/dist/visual/attention-transport.d.ts.map +1 -1
  146. package/dist/visual/attention-transport.js +353 -193
  147. package/dist/visual/attention-transport.js.map +1 -1
  148. package/dist/visual/cognitive-models.d.ts +77 -55
  149. package/dist/visual/cognitive-models.d.ts.map +1 -1
  150. package/dist/visual/cognitive-models.js +231 -104
  151. package/dist/visual/cognitive-models.js.map +1 -1
  152. package/dist/visual/cognitive-transport-chain.d.ts +328 -30
  153. package/dist/visual/cognitive-transport-chain.d.ts.map +1 -1
  154. package/dist/visual/cognitive-transport-chain.js +576 -353
  155. package/dist/visual/cognitive-transport-chain.js.map +1 -1
  156. package/dist/visual/cognitive-transport.d.ts +446 -13
  157. package/dist/visual/cognitive-transport.d.ts.map +1 -1
  158. package/dist/visual/cognitive-transport.js +1085 -245
  159. package/dist/visual/cognitive-transport.js.map +1 -1
  160. package/dist/visual/cross-browser.d.ts.map +1 -1
  161. package/dist/visual/cross-browser.js +8 -6
  162. package/dist/visual/cross-browser.js.map +1 -1
  163. package/dist/visual/ctc-bands.d.ts +91 -0
  164. package/dist/visual/ctc-bands.d.ts.map +1 -0
  165. package/dist/visual/ctc-bands.js +117 -0
  166. package/dist/visual/ctc-bands.js.map +1 -0
  167. package/dist/visual/ctc-reference.d.ts +287 -0
  168. package/dist/visual/ctc-reference.d.ts.map +1 -0
  169. package/dist/visual/ctc-reference.js +376 -0
  170. package/dist/visual/ctc-reference.js.map +1 -0
  171. package/dist/visual/demand-laws.d.ts +145 -0
  172. package/dist/visual/demand-laws.d.ts.map +1 -0
  173. package/dist/visual/demand-laws.js +220 -0
  174. package/dist/visual/demand-laws.js.map +1 -0
  175. package/dist/visual/distance-metrics.d.ts +23 -1
  176. package/dist/visual/distance-metrics.d.ts.map +1 -1
  177. package/dist/visual/distance-metrics.js +49 -18
  178. package/dist/visual/distance-metrics.js.map +1 -1
  179. package/dist/visual/dro-bound.d.ts +220 -0
  180. package/dist/visual/dro-bound.d.ts.map +1 -0
  181. package/dist/visual/dro-bound.js +341 -0
  182. package/dist/visual/dro-bound.js.map +1 -0
  183. package/dist/visual/exact-w1.d.ts +60 -0
  184. package/dist/visual/exact-w1.d.ts.map +1 -0
  185. package/dist/visual/exact-w1.js +247 -0
  186. package/dist/visual/exact-w1.js.map +1 -0
  187. package/dist/visual/human-input.d.ts.map +1 -1
  188. package/dist/visual/human-input.js +45 -41
  189. package/dist/visual/human-input.js.map +1 -1
  190. package/dist/visual/index.d.ts +2 -0
  191. package/dist/visual/index.d.ts.map +1 -1
  192. package/dist/visual/index.js +2 -0
  193. package/dist/visual/index.js.map +1 -1
  194. package/dist/visual/law-times-report.d.ts +49 -0
  195. package/dist/visual/law-times-report.d.ts.map +1 -0
  196. package/dist/visual/law-times-report.js +38 -0
  197. package/dist/visual/law-times-report.js.map +1 -0
  198. package/dist/visual/model-provenance.d.ts +151 -0
  199. package/dist/visual/model-provenance.d.ts.map +1 -0
  200. package/dist/visual/model-provenance.js +334 -0
  201. package/dist/visual/model-provenance.js.map +1 -0
  202. package/dist/visual/normal-cdf.d.ts +14 -0
  203. package/dist/visual/normal-cdf.d.ts.map +1 -0
  204. package/dist/visual/normal-cdf.js +26 -0
  205. package/dist/visual/normal-cdf.js.map +1 -0
  206. package/dist/visual/perceptual-transport.d.ts +28 -4
  207. package/dist/visual/perceptual-transport.d.ts.map +1 -1
  208. package/dist/visual/perceptual-transport.js +66 -32
  209. package/dist/visual/perceptual-transport.js.map +1 -1
  210. package/dist/visual/provenance/attention.d.ts +55 -0
  211. package/dist/visual/provenance/attention.d.ts.map +1 -0
  212. package/dist/visual/provenance/attention.js +188 -0
  213. package/dist/visual/provenance/attention.js.map +1 -0
  214. package/dist/visual/provenance/chain.d.ts +41 -0
  215. package/dist/visual/provenance/chain.d.ts.map +1 -0
  216. package/dist/visual/provenance/chain.js +66 -0
  217. package/dist/visual/provenance/chain.js.map +1 -0
  218. package/dist/visual/provenance/cif.d.ts +42 -0
  219. package/dist/visual/provenance/cif.d.ts.map +1 -0
  220. package/dist/visual/provenance/cif.js +116 -0
  221. package/dist/visual/provenance/cif.js.map +1 -0
  222. package/dist/visual/provenance/ctc-reference.d.ts +36 -0
  223. package/dist/visual/provenance/ctc-reference.d.ts.map +1 -0
  224. package/dist/visual/provenance/ctc-reference.js +96 -0
  225. package/dist/visual/provenance/ctc-reference.js.map +1 -0
  226. package/dist/visual/provenance/distance.d.ts +10 -0
  227. package/dist/visual/provenance/distance.d.ts.map +1 -0
  228. package/dist/visual/provenance/distance.js +72 -0
  229. package/dist/visual/provenance/distance.js.map +1 -0
  230. package/dist/visual/provenance/dro.d.ts +10 -0
  231. package/dist/visual/provenance/dro.d.ts.map +1 -0
  232. package/dist/visual/provenance/dro.js +2 -0
  233. package/dist/visual/provenance/dro.js.map +1 -0
  234. package/dist/visual/provenance/emotion.d.ts +26 -0
  235. package/dist/visual/provenance/emotion.d.ts.map +1 -0
  236. package/dist/visual/provenance/emotion.js +99 -0
  237. package/dist/visual/provenance/emotion.js.map +1 -0
  238. package/dist/visual/provenance/human-input.d.ts +19 -0
  239. package/dist/visual/provenance/human-input.d.ts.map +1 -0
  240. package/dist/visual/provenance/human-input.js +84 -0
  241. package/dist/visual/provenance/human-input.js.map +1 -0
  242. package/dist/visual/provenance/journey-group.d.ts +15 -0
  243. package/dist/visual/provenance/journey-group.d.ts.map +1 -0
  244. package/dist/visual/provenance/journey-group.js +15 -0
  245. package/dist/visual/provenance/journey-group.js.map +1 -0
  246. package/dist/visual/provenance/journey-mcp.d.ts +24 -0
  247. package/dist/visual/provenance/journey-mcp.d.ts.map +1 -0
  248. package/dist/visual/provenance/journey-mcp.js +54 -0
  249. package/dist/visual/provenance/journey-mcp.js.map +1 -0
  250. package/dist/visual/provenance/journey.d.ts +34 -0
  251. package/dist/visual/provenance/journey.d.ts.map +1 -0
  252. package/dist/visual/provenance/journey.js +184 -0
  253. package/dist/visual/provenance/journey.js.map +1 -0
  254. package/dist/visual/provenance/laws.d.ts +38 -0
  255. package/dist/visual/provenance/laws.d.ts.map +1 -0
  256. package/dist/visual/provenance/laws.js +40 -0
  257. package/dist/visual/provenance/laws.js.map +1 -0
  258. package/dist/visual/provenance/page-metrics.d.ts +42 -0
  259. package/dist/visual/provenance/page-metrics.d.ts.map +1 -0
  260. package/dist/visual/provenance/page-metrics.js +79 -0
  261. package/dist/visual/provenance/page-metrics.js.map +1 -0
  262. package/dist/visual/provenance/perceptual.d.ts +63 -0
  263. package/dist/visual/provenance/perceptual.d.ts.map +1 -0
  264. package/dist/visual/provenance/perceptual.js +115 -0
  265. package/dist/visual/provenance/perceptual.js.map +1 -0
  266. package/dist/visual/provenance/persona-rates.d.ts +84 -0
  267. package/dist/visual/provenance/persona-rates.d.ts.map +1 -0
  268. package/dist/visual/provenance/persona-rates.js +112 -0
  269. package/dist/visual/provenance/persona-rates.js.map +1 -0
  270. package/dist/visual/provenance/personas.d.ts +122 -0
  271. package/dist/visual/provenance/personas.d.ts.map +1 -0
  272. package/dist/visual/provenance/personas.js +298 -0
  273. package/dist/visual/provenance/personas.js.map +1 -0
  274. package/dist/visual/provenance/profiles.d.ts +39 -0
  275. package/dist/visual/provenance/profiles.d.ts.map +1 -0
  276. package/dist/visual/provenance/profiles.js +37 -0
  277. package/dist/visual/provenance/profiles.js.map +1 -0
  278. package/dist/visual/provenance/temporal.d.ts +21 -0
  279. package/dist/visual/provenance/temporal.d.ts.map +1 -0
  280. package/dist/visual/provenance/temporal.js +56 -0
  281. package/dist/visual/provenance/temporal.js.map +1 -0
  282. package/dist/visual/provenance/visual-distance.d.ts +22 -0
  283. package/dist/visual/provenance/visual-distance.d.ts.map +1 -0
  284. package/dist/visual/provenance/visual-distance.js +30 -0
  285. package/dist/visual/provenance/visual-distance.js.map +1 -0
  286. package/dist/visual/regression.d.ts.map +1 -1
  287. package/dist/visual/regression.js +14 -9
  288. package/dist/visual/regression.js.map +1 -1
  289. package/dist/visual/responsive.d.ts.map +1 -1
  290. package/dist/visual/responsive.js +4 -1
  291. package/dist/visual/responsive.js.map +1 -1
  292. package/dist/visual/scope-prose.js +2 -2
  293. package/dist/visual/scope-prose.js.map +1 -1
  294. package/dist/visual/seeded-random.d.ts +16 -0
  295. package/dist/visual/seeded-random.d.ts.map +1 -0
  296. package/dist/visual/seeded-random.js +25 -0
  297. package/dist/visual/seeded-random.js.map +1 -0
  298. package/dist/visual/stored-accessibility-traits.d.ts +27 -0
  299. package/dist/visual/stored-accessibility-traits.d.ts.map +1 -0
  300. package/dist/visual/stored-accessibility-traits.js +35 -0
  301. package/dist/visual/stored-accessibility-traits.js.map +1 -0
  302. package/package.json +1 -1
package/README.md CHANGED
@@ -124,7 +124,7 @@ The eight-layer Sequential Transport Chain computes how hard a page is for a giv
124
124
 
125
125
  | Layer | The Question It Answers | Research Basis |
126
126
  |-------|------------------------|----------------|
127
- | **Saliency** | Can they find the thing they came for? | CIE-Lab W₂ perceptual model |
127
+ | **Visual Complexity** | How much visual clutter and motion is there to see past? | A count of visual elements plus animation level (hand-set; not the attention model) |
128
128
  | **Cognitive Load** | Is there more on this page than they can hold at once? | Sweller (1988) CLT |
129
129
  | **Decision** | Are there too many choices to pick between? | Hick-Hyman Law |
130
130
  | **Motor** | Can they physically hit the target? | Grossman & Balakrishnan (2005) |
@@ -186,7 +186,7 @@ The agent-perceivability axis measures whether a machine can perceive your eleme
186
186
 
187
187
  ## Cognitive User Simulation
188
188
 
189
- Research-backed cognitive traits and motivational values model how real users think, struggle and give up:
189
+ Cognitive traits and motivational values model how users think, struggle and give up. Each trait's scale is drawn from the research in the table below; the values the built-in personas carry on those scales are set by hand and registered as hypotheses, not measured:
190
190
 
191
191
  | Trait | Research Basis | What It Models |
192
192
  |-------|---------------|----------------|
@@ -3,7 +3,7 @@
3
3
  * Copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com
4
4
  * Learn more at https://cbrowser.ai - MIT License
5
5
  */
6
- import type { EmpathyAuditResult, EmpathyAuditOptions, AccessibilityBarrier, AccessibilityBarrierSeverity } from "../types.js";
6
+ import type { EmpathyAuditResult, EmpathyAuditOptions, AccessibilityBarrier, AccessibilityBarrierSeverity, AccessibilityTraits } from "../types.js";
7
7
  /**
8
8
  * Move findings ABOVE the audited WCAG level out of the scored set.
9
9
  *
@@ -127,5 +127,33 @@ export declare function deriveWcagViolations(barriers: Array<{
127
127
  wcagCriteria?: string[];
128
128
  wcagAdvisoryCriteria?: string[];
129
129
  }>, recordedByDetectors: Set<string>, criteriaEverOnABarrier: Set<string>, wcagLevel: "A" | "AA" | "AAA"): string[];
130
+ /**
131
+ * The accessibility traits empathy_audit scores a persona with when it is not
132
+ * one of the built-in accessibility personas (those carry their own record).
133
+ *
134
+ * Inferred from name keywords and cognitive traits, then overlaid with what the
135
+ * persona's record stores: a stored trait always wins, and inference fills only
136
+ * the fields the record leaves out. Until 2026-10-22 the inference replaced the
137
+ * record outright, so a custom persona with low vision on record (visionLevel
138
+ * 0.3) was audited as fully sighted (1.0), and its stored reading traits were
139
+ * dropped, while attention_analysis drew the same persona through a low-vision
140
+ * filter. No built-in persona on this path stores accessibility traits, so the
141
+ * change moves custom personas only. (ISC-48.1)
142
+ *
143
+ * The name hints also decide whether the persona is reported as a disability
144
+ * persona; stored traits do not, yet.
145
+ */
146
+ export declare function wrappedPersonaAccessibility(personaName: string, persona: object): {
147
+ accessibilityTraits: AccessibilityTraits;
148
+ hints: {
149
+ vision: boolean;
150
+ motor: boolean;
151
+ cognitive: boolean;
152
+ screenReader: boolean;
153
+ hearing: boolean;
154
+ };
155
+ /** The fields that came from the record rather than from inference. */
156
+ storedFields: string[];
157
+ };
130
158
  export declare function runEmpathyAudit(url: string, options: EmpathyAuditOptions): Promise<EmpathyAuditResult>;
131
159
  //# sourceMappingURL=accessibility-empathy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility-empathy.d.ts","sourceRoot":"","sources":["../../src/analysis/accessibility-empathy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,oBAAoB,EAEpB,4BAA4B,EAK7B,MAAM,aAAa,CAAC;AA+OrB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,4BAA4B,CAAA;CAAE,EAChH,QAAQ,EAAE,CAAC,EAAE,EACb,UAAU,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAC7B;IAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG;QAAE,eAAe,EAAE,IAAI,CAAC;QAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAA;KAAE,CAAC,CAAA;CAAE,CAmB3G;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACnH,QAAQ,EAAE,CAAC,EAAE,EACb,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAWhC;AA4iFD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAuG3E;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA2UjF;AAsBD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAE9E;AAmKD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmB,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC;IAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAC7E,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,EAChC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,EACnC,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAC5B,MAAM,EAAE,CAkBV;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAqY7B"}
1
+ {"version":3,"file":"accessibility-empathy.d.ts","sourceRoot":"","sources":["../../src/analysis/accessibility-empathy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,oBAAoB,EAEpB,4BAA4B,EAI5B,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AAgPrB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,4BAA4B,CAAA;CAAE,EAChH,QAAQ,EAAE,CAAC,EAAE,EACb,UAAU,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAC7B;IAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG;QAAE,eAAe,EAAE,IAAI,CAAC;QAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAA;KAAE,CAAC,CAAA;CAAE,CAmB3G;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACnH,QAAQ,EAAE,CAAC,EAAE,EACb,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAWhC;AA4iFD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAuG3E;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA2UjF;AAsBD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAE9E;AAmKD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmB,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC;IAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAC7E,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,EAChC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,EACnC,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAC5B,MAAM,EAAE,CAkBV;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd;IACD,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACxG,uEAAuE;IACvE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAiCA;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAsX7B"}
@@ -8,10 +8,11 @@ import { VERSION } from "../version.js";
8
8
  import { CBrowser } from "../browser.js";
9
9
  import { navigationError as toNavigationError } from "../navigation-errors.js";
10
10
  import { getAccessibilityPersona, PERSONA_ALIASES } from "../personas.js";
11
+ import { storedAccessibilityTraits } from "../visual/stored-accessibility-traits.js";
11
12
  import { runCognitiveJourney, isApiKeyConfigured, } from "../cognitive/index.js";
12
13
  import { calculatePerceptualScore, analyzePerceptualTransport, } from "../visual/perceptual-transport.js";
13
14
  import { buildOTCognitiveProfile, estimateCognitiveLoad, extractPageMetrics, } from "../visual/cognitive-transport.js";
14
- import { bridgeCapacityTraits } from "../visual/cognitive-models.js";
15
+ import { bridgeCapacityTraits, personaRateContext } from "../visual/cognitive-models.js";
15
16
  import { analyzeAttention, } from "../visual/attention-transport.js";
16
17
  import { getEmotionVisualizationStyles, generateEmotionVisualizationSection, } from "../utils.js";
17
18
  import { makeTempDir } from "../temp-files.js";
@@ -3270,6 +3271,55 @@ export function deriveWcagViolations(barriers, recordedByDetectors, criteriaEver
3270
3271
  return !criteria || order[criteria.level] <= order[wcagLevel];
3271
3272
  });
3272
3273
  }
3274
+ /**
3275
+ * The accessibility traits empathy_audit scores a persona with when it is not
3276
+ * one of the built-in accessibility personas (those carry their own record).
3277
+ *
3278
+ * Inferred from name keywords and cognitive traits, then overlaid with what the
3279
+ * persona's record stores: a stored trait always wins, and inference fills only
3280
+ * the fields the record leaves out. Until 2026-10-22 the inference replaced the
3281
+ * record outright, so a custom persona with low vision on record (visionLevel
3282
+ * 0.3) was audited as fully sighted (1.0), and its stored reading traits were
3283
+ * dropped, while attention_analysis drew the same persona through a low-vision
3284
+ * filter. No built-in persona on this path stores accessibility traits, so the
3285
+ * change moves custom personas only. (ISC-48.1)
3286
+ *
3287
+ * The name hints also decide whether the persona is reported as a disability
3288
+ * persona; stored traits do not, yet.
3289
+ */
3290
+ export function wrappedPersonaAccessibility(personaName, persona) {
3291
+ const ct = persona.cognitiveTraits || {};
3292
+ const name = personaName.toLowerCase();
3293
+ const vision = name.includes("vision") || name.includes("blind") || name.includes("elderly") || name.includes("magnif");
3294
+ const motor = name.includes("motor") || name.includes("tremor") || name.includes("parkinsons");
3295
+ const cognitive = name.includes("adhd") || name.includes("dyslexic") || name.includes("cognitive") || name.includes("memory");
3296
+ // Assistive-technology and hearing personas were in neither bucket, so
3297
+ // screen-reader-user came back isDisabilityPersona: false -- while the
3298
+ // same payload listed it as an exemplar on a sensory barrier and
3299
+ // list_cognitive_personas filed it under accessibility. Three parts of
3300
+ // the system disagreeing about whether a screen reader user has a
3301
+ // disability, and the "no" was the one that drove the score.
3302
+ const screenReader = name.includes("screen-reader") || name.includes("screenreader")
3303
+ || name.includes("nvda") || name.includes("jaws") || name.includes("voiceover");
3304
+ const hearing = name.includes("deaf") || name.includes("hearing")
3305
+ || name.includes("hard-of-hearing");
3306
+ const inferred = {
3307
+ motorControl: motor ? 0.3 : ct.motorControl ?? 1.0,
3308
+ tremor: motor,
3309
+ reachability: motor ? 0.4 : 1.0,
3310
+ visionLevel: vision ? 0.4 : ct.visionLevel ?? 1.0,
3311
+ contrastSensitivity: vision ? 0.5 : ct.contrastSensitivity ?? 1.0,
3312
+ processingSpeed: ct.comprehension ?? (cognitive ? 0.4 : 0.8),
3313
+ attentionSpan: ct.patience ?? (cognitive ? 0.3 : 0.7),
3314
+ fatigueSusceptibility: vision || motor ? 0.7 : 0.3,
3315
+ };
3316
+ const stored = storedAccessibilityTraits(persona);
3317
+ return {
3318
+ accessibilityTraits: { ...inferred, ...stored },
3319
+ hints: { vision, motor, cognitive, screenReader, hearing },
3320
+ storedFields: stored ? Object.keys(stored) : [],
3321
+ };
3322
+ }
3273
3323
  export async function runEmpathyAudit(url, options) {
3274
3324
  const { goal, disabilities, wcagLevel = "AA", maxSteps = 20, maxTime = 120, headless = true, } = options;
3275
3325
  const startTime = Date.now();
@@ -3298,6 +3348,9 @@ export async function runEmpathyAudit(url, options) {
3298
3348
  const personaName = resolvedNames[index];
3299
3349
  let persona = getAccessibilityPersona(personaName);
3300
3350
  let isDisabilityPersona = !!persona;
3351
+ // What the persona's record stores, for the attention pass below: the
3352
+ // filter attention_analysis draws this persona with. (ISC-48.1)
3353
+ let storedTraits = storedAccessibilityTraits(persona);
3301
3354
  if (!persona) {
3302
3355
  // Try to find as a regular cognitive persona and wrap it
3303
3356
  const { getAnyPersona, createCognitivePersona } = await import("../personas.js");
@@ -3306,39 +3359,15 @@ export async function runEmpathyAudit(url, options) {
3306
3359
  // into the scoped registry above, so getAnyPersona already sees them, and
3307
3360
  // a name nothing resolves was refused before the loop. (2026-10-09)
3308
3361
  if (cognitivePersona) {
3309
- // Wrap cognitive persona as accessibility persona, inferring traits from name + cognitive traits
3310
- const ct = cognitivePersona.cognitiveTraits || {};
3311
- const name = personaName.toLowerCase();
3312
- const hasVisionHint = name.includes("vision") || name.includes("blind") || name.includes("elderly") || name.includes("magnif");
3313
- const hasMotorHint = name.includes("motor") || name.includes("tremor") || name.includes("parkinsons");
3314
- const hasCognitiveHint = name.includes("adhd") || name.includes("dyslexic") || name.includes("cognitive") || name.includes("memory");
3315
- // Assistive-technology and hearing personas were in neither bucket, so
3316
- // screen-reader-user came back isDisabilityPersona: false -- while the
3317
- // same payload listed it as an exemplar on a sensory barrier and
3318
- // list_cognitive_personas filed it under accessibility. Three parts of
3319
- // the system disagreeing about whether a screen reader user has a
3320
- // disability, and the "no" was the one that drove the score.
3321
- const hasScreenReaderHint = name.includes("screen-reader") || name.includes("screenreader")
3322
- || name.includes("nvda") || name.includes("jaws") || name.includes("voiceover");
3323
- const hasHearingHint = name.includes("deaf") || name.includes("hearing")
3324
- || name.includes("hard-of-hearing");
3325
- persona = {
3326
- ...cognitivePersona,
3327
- accessibilityTraits: {
3328
- motorControl: hasMotorHint ? 0.3 : ct.motorControl ?? 1.0,
3329
- tremor: hasMotorHint,
3330
- reachability: hasMotorHint ? 0.4 : 1.0,
3331
- visionLevel: hasVisionHint ? 0.4 : ct.visionLevel ?? 1.0,
3332
- contrastSensitivity: hasVisionHint ? 0.5 : ct.contrastSensitivity ?? 1.0,
3333
- processingSpeed: ct.comprehension ?? (hasCognitiveHint ? 0.4 : 0.8),
3334
- attentionSpan: ct.patience ?? (hasCognitiveHint ? 0.3 : 0.7),
3335
- fatigueSusceptibility: hasVisionHint || hasMotorHint ? 0.7 : 0.3,
3336
- },
3337
- };
3362
+ // Wrap cognitive persona as accessibility persona: its stored traits,
3363
+ // and traits inferred from name + cognitive traits for the rest.
3364
+ storedTraits = storedAccessibilityTraits(cognitivePersona);
3365
+ const wrapped = wrappedPersonaAccessibility(personaName, cognitivePersona);
3366
+ const h = wrapped.hints;
3367
+ persona = { ...cognitivePersona, accessibilityTraits: wrapped.accessibilityTraits };
3338
3368
  // If the name hints at a disability, treat it as a disability persona for routing
3339
- isDisabilityPersona = hasVisionHint || hasMotorHint || hasCognitiveHint
3340
- || hasScreenReaderHint || hasHearingHint;
3341
- console.log(`[empathy_audit] "${disability}" wrapped as ${isDisabilityPersona ? "disability" : "general"} persona (vision=${hasVisionHint}, motor=${hasMotorHint}, cognitive=${hasCognitiveHint}, screenReader=${hasScreenReaderHint}, hearing=${hasHearingHint})`);
3369
+ isDisabilityPersona = h.vision || h.motor || h.cognitive || h.screenReader || h.hearing;
3370
+ console.log(`[empathy_audit] "${disability}" wrapped as ${isDisabilityPersona ? "disability" : "general"} persona (vision=${h.vision}, motor=${h.motor}, cognitive=${h.cognitive}, screenReader=${h.screenReader}, hearing=${h.hearing}, stored=[${wrapped.storedFields.join(",")}])`);
3342
3371
  }
3343
3372
  else {
3344
3373
  // Return an explicit error instead of silently skipping
@@ -3387,7 +3416,9 @@ export async function runEmpathyAudit(url, options) {
3387
3416
  attnTemp = await makeTempDir("empathy-attn");
3388
3417
  const attnScreenshot = attnTemp.file("page.png");
3389
3418
  await page.screenshot({ path: attnScreenshot, fullPage: false });
3390
- const attnAnalysis = await analyzeAttention(attnScreenshot, personaName, 16);
3419
+ // The record's stored traits, not the wrapped set: attention_analysis
3420
+ // passes the record's, so both tools resolve the same filter.
3421
+ const attnAnalysis = await analyzeAttention(attnScreenshot, personaName, 16, undefined, undefined, undefined, undefined, undefined, storedTraits);
3391
3422
  attentionData = {
3392
3423
  entropy: attnAnalysis.entropy,
3393
3424
  concentration: attnAnalysis.concentration,
@@ -3405,12 +3436,15 @@ export async function runEmpathyAudit(url, options) {
3405
3436
  //
3406
3437
  // Anyone who wants attention metrics should call attention_analysis,
3407
3438
  // which runs the same function at the finer default grid.
3439
+ // perceptualProfile is not a metric: it says which filter drew the
3440
+ // pass, as attention_analysis reports it, so the two can be compared.
3408
3441
  result.attentionAnalysis = {
3409
3442
  entropy: attnAnalysis.entropy,
3410
3443
  concentration: attnAnalysis.concentration,
3411
3444
  transportCost: attnAnalysis.transportCost,
3412
3445
  computeTimeMs: Math.round(attnAnalysis.computeTimeMs),
3413
3446
  gridCellPx: 16,
3447
+ perceptualProfile: attnAnalysis.perceptualProfile,
3414
3448
  };
3415
3449
  }
3416
3450
  catch (e) {
@@ -3480,7 +3514,7 @@ export async function runEmpathyAudit(url, options) {
3480
3514
  // persona scored the same on all three (B29, 2026-10-10). The copy keeps
3481
3515
  // the bridge from writing into the persona record itself.
3482
3516
  const loadTraits = { ...(resolvedPersona.cognitiveTraits || {}) };
3483
- bridgeCapacityTraits(personaName, loadTraits, resolvedPersona.accessibilityTraits);
3517
+ bridgeCapacityTraits(personaName, loadTraits, resolvedPersona.accessibilityTraits, personaRateContext(resolvedPersona));
3484
3518
  const otProfile = buildOTCognitiveProfile(personaName, loadTraits);
3485
3519
  const cogLoad = estimateCognitiveLoad(otProfile, pageMetrics);
3486
3520
  // Three separate models each produce a number called "cognitive load",