cbrowser 20.2.1 → 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.
- package/README.md +2 -2
- package/dist/analysis/accessibility-empathy.d.ts +29 -1
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +69 -35
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +11 -7
- package/dist/browser.js.map +1 -1
- package/dist/cif-score.d.ts +56 -5
- package/dist/cif-score.d.ts.map +1 -1
- package/dist/cif-score.js +595 -346
- package/dist/cif-score.js.map +1 -1
- package/dist/cli.js +10 -8
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/default-traits.d.ts +14 -0
- package/dist/cognitive/default-traits.d.ts.map +1 -0
- package/dist/cognitive/default-traits.js +36 -0
- package/dist/cognitive/default-traits.js.map +1 -0
- package/dist/cognitive/emotions.d.ts.map +1 -1
- package/dist/cognitive/emotions.js +104 -174
- package/dist/cognitive/emotions.js.map +1 -1
- package/dist/cognitive/index.d.ts +34 -2
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +366 -297
- package/dist/cognitive/index.js.map +1 -1
- package/dist/cognitive/temporal.d.ts +0 -24
- package/dist/cognitive/temporal.d.ts.map +1 -1
- package/dist/cognitive/temporal.js +45 -35
- package/dist/cognitive/temporal.js.map +1 -1
- package/dist/data/ctc-reference-v2-2026-10-24.d.ts +16 -0
- package/dist/data/ctc-reference-v2-2026-10-24.d.ts.map +1 -0
- package/dist/data/ctc-reference-v2-2026-10-24.js +1004 -0
- package/dist/data/ctc-reference-v2-2026-10-24.js.map +1 -0
- package/dist/ideal-profiles-gap.d.ts +1 -0
- package/dist/ideal-profiles-gap.d.ts.map +1 -1
- package/dist/ideal-profiles-gap.js +9 -1
- package/dist/ideal-profiles-gap.js.map +1 -1
- package/dist/ideal-profiles.d.ts +8 -0
- package/dist/ideal-profiles.d.ts.map +1 -1
- package/dist/ideal-profiles.js +28 -24
- package/dist/ideal-profiles.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js +7 -8
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-tools/account-personas.d.ts.map +1 -1
- package/dist/mcp-tools/account-personas.js +3 -1
- package/dist/mcp-tools/account-personas.js.map +1 -1
- package/dist/mcp-tools/base/answer-provenance.d.ts +28 -0
- package/dist/mcp-tools/base/answer-provenance.d.ts.map +1 -0
- package/dist/mcp-tools/base/answer-provenance.js +32 -0
- package/dist/mcp-tools/base/answer-provenance.js.map +1 -0
- package/dist/mcp-tools/base/audit-tools.d.ts +0 -3
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +152 -84
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/capture-tools.js +1 -1
- package/dist/mcp-tools/base/capture-tools.js.map +1 -1
- package/dist/mcp-tools/base/chain-values.d.ts +38 -0
- package/dist/mcp-tools/base/chain-values.d.ts.map +1 -0
- package/dist/mcp-tools/base/chain-values.js +85 -0
- package/dist/mcp-tools/base/chain-values.js.map +1 -0
- package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/cognitive-tools.js +126 -120
- package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
- package/dist/mcp-tools/base/gif-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/gif-tools.js +23 -5
- package/dist/mcp-tools/base/gif-tools.js.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.js +229 -172
- package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
- package/dist/mcp-tools/base/site-familiarity.d.ts +31 -0
- package/dist/mcp-tools/base/site-familiarity.d.ts.map +1 -0
- package/dist/mcp-tools/base/site-familiarity.js +30 -0
- package/dist/mcp-tools/base/site-familiarity.js.map +1 -0
- package/dist/mcp-tools/base/site-knowledge-tools.js +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
- package/dist/mcp-tools/base/story-narrative.d.ts +50 -0
- package/dist/mcp-tools/base/story-narrative.d.ts.map +1 -0
- package/dist/mcp-tools/base/story-narrative.js +88 -0
- package/dist/mcp-tools/base/story-narrative.js.map +1 -0
- package/dist/mcp-tools/base/values-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/values-tools.js +19 -5
- package/dist/mcp-tools/base/values-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts +5 -5
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +38 -11
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/persona-creation-tools.js +6 -6
- package/dist/mcp-tools/persona-creation-tools.js.map +1 -1
- package/dist/mcp-tools/persona-lifecycle-tools.d.ts.map +1 -1
- package/dist/mcp-tools/persona-lifecycle-tools.js +5 -1
- package/dist/mcp-tools/persona-lifecycle-tools.js.map +1 -1
- package/dist/mcp-tools/tier-gate.js +1 -1
- package/dist/mcp-tools/tool-result-saver.d.ts +7 -0
- package/dist/mcp-tools/tool-result-saver.d.ts.map +1 -1
- package/dist/mcp-tools/tool-result-saver.js +11 -0
- package/dist/mcp-tools/tool-result-saver.js.map +1 -1
- package/dist/mcp-tools/trait-provenance.d.ts +109 -0
- package/dist/mcp-tools/trait-provenance.d.ts.map +1 -0
- package/dist/mcp-tools/trait-provenance.js +187 -0
- package/dist/mcp-tools/trait-provenance.js.map +1 -0
- package/dist/mcp-tools/ui-resources.d.ts +6 -7
- package/dist/mcp-tools/ui-resources.d.ts.map +1 -1
- package/dist/mcp-tools/ui-resources.js +162 -12
- package/dist/mcp-tools/ui-resources.js.map +1 -1
- package/dist/mcp-tools/widget-kit.d.ts +129 -3
- package/dist/mcp-tools/widget-kit.d.ts.map +1 -1
- package/dist/mcp-tools/widget-kit.js +507 -28
- package/dist/mcp-tools/widget-kit.js.map +1 -1
- package/dist/performance/metrics.d.ts.map +1 -1
- package/dist/performance/metrics.js +4 -1
- package/dist/performance/metrics.js.map +1 -1
- package/dist/persona-questionnaire.js +1 -1
- package/dist/persona-questionnaire.js.map +1 -1
- package/dist/personas.d.ts.map +1 -1
- package/dist/personas.js +133 -82
- package/dist/personas.js.map +1 -1
- package/dist/recording/engine.d.ts.map +1 -1
- package/dist/recording/engine.js +5 -2
- package/dist/recording/engine.js.map +1 -1
- package/dist/recording/saliency-overlay.d.ts +8 -3
- package/dist/recording/saliency-overlay.d.ts.map +1 -1
- package/dist/recording/saliency-overlay.js +14 -5
- package/dist/recording/saliency-overlay.js.map +1 -1
- package/dist/recording/types.js +1 -1
- package/dist/testing/nl-test-suite.d.ts.map +1 -1
- package/dist/testing/nl-test-suite.js +2 -1
- package/dist/testing/nl-test-suite.js.map +1 -1
- package/dist/trait-reference.d.ts +19 -2
- package/dist/trait-reference.d.ts.map +1 -1
- package/dist/trait-reference.js +19 -2
- package/dist/trait-reference.js.map +1 -1
- package/dist/types.d.ts +32 -21
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +62 -52
- package/dist/types.js.map +1 -1
- package/dist/values/persona-completeness.js +1 -1
- package/dist/values/persona-completeness.js.map +1 -1
- package/dist/visual/ab-comparison.d.ts.map +1 -1
- package/dist/visual/ab-comparison.js +4 -1
- package/dist/visual/ab-comparison.js.map +1 -1
- package/dist/visual/attention-quality.d.ts +1 -1
- package/dist/visual/attention-quality.js +1 -1
- package/dist/visual/attention-transport.d.ts +74 -10
- package/dist/visual/attention-transport.d.ts.map +1 -1
- package/dist/visual/attention-transport.js +353 -193
- package/dist/visual/attention-transport.js.map +1 -1
- package/dist/visual/cognitive-models.d.ts +77 -55
- package/dist/visual/cognitive-models.d.ts.map +1 -1
- package/dist/visual/cognitive-models.js +231 -104
- package/dist/visual/cognitive-models.js.map +1 -1
- package/dist/visual/cognitive-transport-chain.d.ts +328 -30
- package/dist/visual/cognitive-transport-chain.d.ts.map +1 -1
- package/dist/visual/cognitive-transport-chain.js +576 -353
- package/dist/visual/cognitive-transport-chain.js.map +1 -1
- package/dist/visual/cognitive-transport.d.ts +446 -13
- package/dist/visual/cognitive-transport.d.ts.map +1 -1
- package/dist/visual/cognitive-transport.js +1085 -245
- package/dist/visual/cognitive-transport.js.map +1 -1
- package/dist/visual/cross-browser.d.ts.map +1 -1
- package/dist/visual/cross-browser.js +8 -6
- package/dist/visual/cross-browser.js.map +1 -1
- package/dist/visual/ctc-bands.d.ts +91 -0
- package/dist/visual/ctc-bands.d.ts.map +1 -0
- package/dist/visual/ctc-bands.js +117 -0
- package/dist/visual/ctc-bands.js.map +1 -0
- package/dist/visual/ctc-reference.d.ts +287 -0
- package/dist/visual/ctc-reference.d.ts.map +1 -0
- package/dist/visual/ctc-reference.js +376 -0
- package/dist/visual/ctc-reference.js.map +1 -0
- package/dist/visual/demand-laws.d.ts +145 -0
- package/dist/visual/demand-laws.d.ts.map +1 -0
- package/dist/visual/demand-laws.js +220 -0
- package/dist/visual/demand-laws.js.map +1 -0
- package/dist/visual/distance-metrics.d.ts +23 -1
- package/dist/visual/distance-metrics.d.ts.map +1 -1
- package/dist/visual/distance-metrics.js +49 -18
- package/dist/visual/distance-metrics.js.map +1 -1
- package/dist/visual/dro-bound.d.ts +220 -0
- package/dist/visual/dro-bound.d.ts.map +1 -0
- package/dist/visual/dro-bound.js +341 -0
- package/dist/visual/dro-bound.js.map +1 -0
- package/dist/visual/exact-w1.d.ts +60 -0
- package/dist/visual/exact-w1.d.ts.map +1 -0
- package/dist/visual/exact-w1.js +247 -0
- package/dist/visual/exact-w1.js.map +1 -0
- package/dist/visual/human-input.d.ts.map +1 -1
- package/dist/visual/human-input.js +45 -41
- package/dist/visual/human-input.js.map +1 -1
- package/dist/visual/index.d.ts +2 -0
- package/dist/visual/index.d.ts.map +1 -1
- package/dist/visual/index.js +2 -0
- package/dist/visual/index.js.map +1 -1
- package/dist/visual/law-times-report.d.ts +49 -0
- package/dist/visual/law-times-report.d.ts.map +1 -0
- package/dist/visual/law-times-report.js +38 -0
- package/dist/visual/law-times-report.js.map +1 -0
- package/dist/visual/model-provenance.d.ts +151 -0
- package/dist/visual/model-provenance.d.ts.map +1 -0
- package/dist/visual/model-provenance.js +334 -0
- package/dist/visual/model-provenance.js.map +1 -0
- package/dist/visual/normal-cdf.d.ts +14 -0
- package/dist/visual/normal-cdf.d.ts.map +1 -0
- package/dist/visual/normal-cdf.js +26 -0
- package/dist/visual/normal-cdf.js.map +1 -0
- package/dist/visual/perceptual-transport.d.ts +28 -4
- package/dist/visual/perceptual-transport.d.ts.map +1 -1
- package/dist/visual/perceptual-transport.js +66 -32
- package/dist/visual/perceptual-transport.js.map +1 -1
- package/dist/visual/provenance/attention.d.ts +55 -0
- package/dist/visual/provenance/attention.d.ts.map +1 -0
- package/dist/visual/provenance/attention.js +188 -0
- package/dist/visual/provenance/attention.js.map +1 -0
- package/dist/visual/provenance/chain.d.ts +41 -0
- package/dist/visual/provenance/chain.d.ts.map +1 -0
- package/dist/visual/provenance/chain.js +66 -0
- package/dist/visual/provenance/chain.js.map +1 -0
- package/dist/visual/provenance/cif.d.ts +42 -0
- package/dist/visual/provenance/cif.d.ts.map +1 -0
- package/dist/visual/provenance/cif.js +116 -0
- package/dist/visual/provenance/cif.js.map +1 -0
- package/dist/visual/provenance/ctc-reference.d.ts +36 -0
- package/dist/visual/provenance/ctc-reference.d.ts.map +1 -0
- package/dist/visual/provenance/ctc-reference.js +96 -0
- package/dist/visual/provenance/ctc-reference.js.map +1 -0
- package/dist/visual/provenance/distance.d.ts +10 -0
- package/dist/visual/provenance/distance.d.ts.map +1 -0
- package/dist/visual/provenance/distance.js +72 -0
- package/dist/visual/provenance/distance.js.map +1 -0
- package/dist/visual/provenance/dro.d.ts +10 -0
- package/dist/visual/provenance/dro.d.ts.map +1 -0
- package/dist/visual/provenance/dro.js +2 -0
- package/dist/visual/provenance/dro.js.map +1 -0
- package/dist/visual/provenance/emotion.d.ts +26 -0
- package/dist/visual/provenance/emotion.d.ts.map +1 -0
- package/dist/visual/provenance/emotion.js +99 -0
- package/dist/visual/provenance/emotion.js.map +1 -0
- package/dist/visual/provenance/human-input.d.ts +19 -0
- package/dist/visual/provenance/human-input.d.ts.map +1 -0
- package/dist/visual/provenance/human-input.js +84 -0
- package/dist/visual/provenance/human-input.js.map +1 -0
- package/dist/visual/provenance/journey-group.d.ts +15 -0
- package/dist/visual/provenance/journey-group.d.ts.map +1 -0
- package/dist/visual/provenance/journey-group.js +15 -0
- package/dist/visual/provenance/journey-group.js.map +1 -0
- package/dist/visual/provenance/journey-mcp.d.ts +24 -0
- package/dist/visual/provenance/journey-mcp.d.ts.map +1 -0
- package/dist/visual/provenance/journey-mcp.js +54 -0
- package/dist/visual/provenance/journey-mcp.js.map +1 -0
- package/dist/visual/provenance/journey.d.ts +34 -0
- package/dist/visual/provenance/journey.d.ts.map +1 -0
- package/dist/visual/provenance/journey.js +184 -0
- package/dist/visual/provenance/journey.js.map +1 -0
- package/dist/visual/provenance/laws.d.ts +38 -0
- package/dist/visual/provenance/laws.d.ts.map +1 -0
- package/dist/visual/provenance/laws.js +40 -0
- package/dist/visual/provenance/laws.js.map +1 -0
- package/dist/visual/provenance/page-metrics.d.ts +42 -0
- package/dist/visual/provenance/page-metrics.d.ts.map +1 -0
- package/dist/visual/provenance/page-metrics.js +79 -0
- package/dist/visual/provenance/page-metrics.js.map +1 -0
- package/dist/visual/provenance/perceptual.d.ts +63 -0
- package/dist/visual/provenance/perceptual.d.ts.map +1 -0
- package/dist/visual/provenance/perceptual.js +115 -0
- package/dist/visual/provenance/perceptual.js.map +1 -0
- package/dist/visual/provenance/persona-rates.d.ts +84 -0
- package/dist/visual/provenance/persona-rates.d.ts.map +1 -0
- package/dist/visual/provenance/persona-rates.js +112 -0
- package/dist/visual/provenance/persona-rates.js.map +1 -0
- package/dist/visual/provenance/personas.d.ts +122 -0
- package/dist/visual/provenance/personas.d.ts.map +1 -0
- package/dist/visual/provenance/personas.js +298 -0
- package/dist/visual/provenance/personas.js.map +1 -0
- package/dist/visual/provenance/profiles.d.ts +39 -0
- package/dist/visual/provenance/profiles.d.ts.map +1 -0
- package/dist/visual/provenance/profiles.js +37 -0
- package/dist/visual/provenance/profiles.js.map +1 -0
- package/dist/visual/provenance/temporal.d.ts +21 -0
- package/dist/visual/provenance/temporal.d.ts.map +1 -0
- package/dist/visual/provenance/temporal.js +56 -0
- package/dist/visual/provenance/temporal.js.map +1 -0
- package/dist/visual/provenance/visual-distance.d.ts +22 -0
- package/dist/visual/provenance/visual-distance.d.ts.map +1 -0
- package/dist/visual/provenance/visual-distance.js +30 -0
- package/dist/visual/provenance/visual-distance.js.map +1 -0
- package/dist/visual/regression.d.ts.map +1 -1
- package/dist/visual/regression.js +14 -9
- package/dist/visual/regression.js.map +1 -1
- package/dist/visual/responsive.d.ts.map +1 -1
- package/dist/visual/responsive.js +4 -1
- package/dist/visual/responsive.js.map +1 -1
- package/dist/visual/scope-prose.js +2 -2
- package/dist/visual/scope-prose.js.map +1 -1
- package/dist/visual/seeded-random.d.ts +16 -0
- package/dist/visual/seeded-random.d.ts.map +1 -0
- package/dist/visual/seeded-random.js +25 -0
- package/dist/visual/seeded-random.js.map +1 -0
- package/dist/visual/stored-accessibility-traits.d.ts +27 -0
- package/dist/visual/stored-accessibility-traits.d.ts.map +1 -0
- package/dist/visual/stored-accessibility-traits.js +35 -0
- package/dist/visual/stored-accessibility-traits.js.map +1 -0
- 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
|
-
| **
|
|
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
|
-
|
|
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,
|
|
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
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
const
|
|
3313
|
-
const
|
|
3314
|
-
|
|
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 =
|
|
3340
|
-
|
|
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
|
-
|
|
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",
|