cbrowser 18.78.0 → 18.80.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 +395 -66
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
- package/dist/analysis/agent-ready-audit.js +78 -0
- package/dist/analysis/agent-ready-audit.js.map +1 -1
- package/dist/analysis/page-understanding.d.ts +139 -1
- package/dist/analysis/page-understanding.d.ts.map +1 -1
- package/dist/analysis/page-understanding.js +179 -12
- package/dist/analysis/page-understanding.js.map +1 -1
- package/dist/artifact-store.d.ts +19 -5
- package/dist/artifact-store.d.ts.map +1 -1
- package/dist/artifact-store.js +41 -11
- package/dist/artifact-store.js.map +1 -1
- package/dist/browser.d.ts +9 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +81 -5
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +55 -10
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +3 -2
- package/dist/cognitive/index.js.map +1 -1
- package/dist/config.d.ts +57 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +234 -7
- package/dist/config.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js +108 -4
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +62 -938
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/account-personas.d.ts +41 -0
- package/dist/mcp-tools/account-personas.d.ts.map +1 -0
- package/dist/mcp-tools/account-personas.js +98 -0
- package/dist/mcp-tools/account-personas.js.map +1 -0
- package/dist/mcp-tools/base/analysis-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/analysis-tools.js +12 -2
- package/dist/mcp-tools/base/analysis-tools.js.map +1 -1
- package/dist/mcp-tools/base/artifact-tools.d.ts +3 -0
- package/dist/mcp-tools/base/artifact-tools.d.ts.map +1 -0
- package/dist/mcp-tools/base/artifact-tools.js +78 -0
- package/dist/mcp-tools/base/artifact-tools.js.map +1 -0
- package/dist/mcp-tools/base/audit-tools.d.ts +11 -0
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +595 -340
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/browser-management-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/browser-management-tools.js +18 -0
- package/dist/mcp-tools/base/browser-management-tools.js.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.js +59 -3
- package/dist/mcp-tools/base/bug-analysis-tools.js.map +1 -1
- package/dist/mcp-tools/base/capture-tools.d.ts +37 -0
- package/dist/mcp-tools/base/capture-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/capture-tools.js +267 -6
- package/dist/mcp-tools/base/capture-tools.js.map +1 -1
- package/dist/mcp-tools/base/cognitive-tools.d.ts +12 -0
- package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/cognitive-tools.js +63 -15
- package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
- package/dist/mcp-tools/base/extraction-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/extraction-tools.js +33 -2
- package/dist/mcp-tools/base/extraction-tools.js.map +1 -1
- package/dist/mcp-tools/base/index.d.ts +2 -0
- package/dist/mcp-tools/base/index.d.ts.map +1 -1
- package/dist/mcp-tools/base/index.js +9 -0
- package/dist/mcp-tools/base/index.js.map +1 -1
- package/dist/mcp-tools/base/marketing-tools.js +3 -3
- package/dist/mcp-tools/base/marketing-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 +529 -40
- package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.js +36 -3
- package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
- package/dist/mcp-tools/base/values-tools.d.ts +113 -0
- package/dist/mcp-tools/base/values-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/values-tools.js +868 -78
- package/dist/mcp-tools/base/values-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +130 -10
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/index.d.ts +3 -1
- package/dist/mcp-tools/index.d.ts.map +1 -1
- package/dist/mcp-tools/index.js +3 -28
- package/dist/mcp-tools/index.js.map +1 -1
- package/dist/mcp-tools/persona-creation-tools.d.ts.map +1 -1
- package/dist/mcp-tools/persona-creation-tools.js +363 -20
- package/dist/mcp-tools/persona-creation-tools.js.map +1 -1
- package/dist/mcp-tools/persona-lifecycle-tools.d.ts +3 -0
- package/dist/mcp-tools/persona-lifecycle-tools.d.ts.map +1 -0
- package/dist/mcp-tools/persona-lifecycle-tools.js +406 -0
- package/dist/mcp-tools/persona-lifecycle-tools.js.map +1 -0
- package/dist/mcp-tools/screenshot-utils.d.ts.map +1 -1
- package/dist/mcp-tools/screenshot-utils.js +56 -10
- package/dist/mcp-tools/screenshot-utils.js.map +1 -1
- package/dist/mcp-tools/tier-gate.js +2 -2
- package/dist/mcp-tools/tier-gate.js.map +1 -1
- package/dist/mcp-tools/tool-categories.d.ts.map +1 -1
- package/dist/mcp-tools/tool-categories.js +4 -1
- package/dist/mcp-tools/tool-categories.js.map +1 -1
- package/dist/mcp-tools/ui-resources.d.ts +167 -0
- package/dist/mcp-tools/ui-resources.d.ts.map +1 -0
- package/dist/mcp-tools/ui-resources.js +707 -0
- package/dist/mcp-tools/ui-resources.js.map +1 -0
- package/dist/mcp-tools/widget-kit.d.ts +299 -0
- package/dist/mcp-tools/widget-kit.d.ts.map +1 -0
- package/dist/mcp-tools/widget-kit.js +2034 -0
- package/dist/mcp-tools/widget-kit.js.map +1 -0
- package/dist/mcp-ui-resources.d.ts.map +1 -1
- package/dist/mcp-ui-resources.js +14 -4
- package/dist/mcp-ui-resources.js.map +1 -1
- package/dist/persona-questionnaire.d.ts +69 -1
- package/dist/persona-questionnaire.d.ts.map +1 -1
- package/dist/persona-questionnaire.js +177 -76
- package/dist/persona-questionnaire.js.map +1 -1
- package/dist/persona-scope.d.ts +20 -0
- package/dist/persona-scope.d.ts.map +1 -0
- package/dist/persona-scope.js +59 -0
- package/dist/persona-scope.js.map +1 -0
- package/dist/personas.d.ts +51 -17
- package/dist/personas.d.ts.map +1 -1
- package/dist/personas.js +947 -286
- package/dist/personas.js.map +1 -1
- package/dist/recording/capture-player.d.ts +68 -0
- package/dist/recording/capture-player.d.ts.map +1 -0
- package/dist/recording/capture-player.js +298 -0
- package/dist/recording/capture-player.js.map +1 -0
- package/dist/recording/engine.d.ts +52 -0
- package/dist/recording/engine.d.ts.map +1 -1
- package/dist/recording/engine.js +241 -3
- package/dist/recording/engine.js.map +1 -1
- package/dist/recording/inline-player.d.ts +39 -0
- package/dist/recording/inline-player.d.ts.map +1 -0
- package/dist/recording/inline-player.js +272 -0
- package/dist/recording/inline-player.js.map +1 -0
- package/dist/recording/saliency-overlay.d.ts +133 -0
- package/dist/recording/saliency-overlay.d.ts.map +1 -0
- package/dist/recording/saliency-overlay.js +360 -0
- package/dist/recording/saliency-overlay.js.map +1 -0
- package/dist/recording/types.d.ts +32 -0
- package/dist/recording/types.d.ts.map +1 -1
- package/dist/recording/types.js +46 -0
- package/dist/recording/types.js.map +1 -1
- package/dist/site-model/manager.d.ts +20 -0
- package/dist/site-model/manager.d.ts.map +1 -1
- package/dist/site-model/manager.js +52 -0
- package/dist/site-model/manager.js.map +1 -1
- package/dist/trait-reference.d.ts +26 -2
- package/dist/trait-reference.d.ts.map +1 -1
- package/dist/trait-reference.js +129 -19
- package/dist/trait-reference.js.map +1 -1
- package/dist/types.d.ts +105 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/url-resolution.d.ts +58 -0
- package/dist/url-resolution.d.ts.map +1 -0
- package/dist/url-resolution.js +143 -0
- package/dist/url-resolution.js.map +1 -0
- package/dist/values/big-five-inference.d.ts +121 -0
- package/dist/values/big-five-inference.d.ts.map +1 -0
- package/dist/values/big-five-inference.js +241 -0
- package/dist/values/big-five-inference.js.map +1 -0
- package/dist/values/big-five-values.d.ts +76 -0
- package/dist/values/big-five-values.d.ts.map +1 -0
- package/dist/values/big-five-values.js +152 -0
- package/dist/values/big-five-values.js.map +1 -0
- package/dist/values/index.d.ts +1 -1
- package/dist/values/index.d.ts.map +1 -1
- package/dist/values/index.js +1 -1
- package/dist/values/index.js.map +1 -1
- package/dist/values/persona-completeness.d.ts +91 -0
- package/dist/values/persona-completeness.d.ts.map +1 -0
- package/dist/values/persona-completeness.js +114 -0
- package/dist/values/persona-completeness.js.map +1 -0
- package/dist/values/persona-diff.d.ts +50 -0
- package/dist/values/persona-diff.d.ts.map +1 -0
- package/dist/values/persona-diff.js +126 -0
- package/dist/values/persona-diff.js.map +1 -0
- package/dist/values/persona-values.d.ts +16 -0
- package/dist/values/persona-values.d.ts.map +1 -1
- package/dist/values/persona-values.js +33 -0
- package/dist/values/persona-values.js.map +1 -1
- package/dist/values/schwartz-values.d.ts +9 -1
- package/dist/values/schwartz-values.d.ts.map +1 -1
- package/dist/values/schwartz-values.js +10 -2
- package/dist/values/schwartz-values.js.map +1 -1
- package/dist/values/value-mappings.d.ts +41 -2
- package/dist/values/value-mappings.d.ts.map +1 -1
- package/dist/values/value-mappings.js +65 -8
- package/dist/values/value-mappings.js.map +1 -1
- package/dist/visual/attention-quality.d.ts +27 -0
- package/dist/visual/attention-quality.d.ts.map +1 -1
- package/dist/visual/attention-quality.js +164 -2
- package/dist/visual/attention-quality.js.map +1 -1
- package/dist/visual/attention-transport.d.ts +41 -2
- package/dist/visual/attention-transport.d.ts.map +1 -1
- package/dist/visual/attention-transport.js +98 -26
- package/dist/visual/attention-transport.js.map +1 -1
- package/dist/visual/barrier-overlay-html.d.ts +10 -0
- package/dist/visual/barrier-overlay-html.d.ts.map +1 -1
- package/dist/visual/barrier-overlay-html.js.map +1 -1
- package/dist/visual/cognitive-models.d.ts +109 -13
- package/dist/visual/cognitive-models.d.ts.map +1 -1
- package/dist/visual/cognitive-models.js +166 -3
- package/dist/visual/cognitive-models.js.map +1 -1
- package/dist/visual/cognitive-transport-chain.d.ts +149 -5
- package/dist/visual/cognitive-transport-chain.d.ts.map +1 -1
- package/dist/visual/cognitive-transport-chain.js +558 -30
- package/dist/visual/cognitive-transport-chain.js.map +1 -1
- package/dist/visual/cognitive-transport.d.ts +45 -3
- package/dist/visual/cognitive-transport.d.ts.map +1 -1
- package/dist/visual/cognitive-transport.js +126 -12
- package/dist/visual/cognitive-transport.js.map +1 -1
- package/dist/visual/fixation-corpus.d.ts +52 -0
- package/dist/visual/fixation-corpus.d.ts.map +1 -1
- package/dist/visual/fixation-corpus.js +95 -0
- package/dist/visual/fixation-corpus.js.map +1 -1
- package/dist/visual/llm-relevance.d.ts +193 -0
- package/dist/visual/llm-relevance.d.ts.map +1 -0
- package/dist/visual/llm-relevance.js +480 -0
- package/dist/visual/llm-relevance.js.map +1 -0
- package/dist/visual/perceptual-transport.d.ts +60 -0
- package/dist/visual/perceptual-transport.d.ts.map +1 -1
- package/dist/visual/perceptual-transport.js +228 -19
- package/dist/visual/perceptual-transport.js.map +1 -1
- package/dist/visual/persona-context.d.ts +23 -0
- package/dist/visual/persona-context.d.ts.map +1 -0
- package/dist/visual/persona-context.js +44 -0
- package/dist/visual/persona-context.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-judged element relevance for the semantic attention layer.
|
|
3
|
+
*
|
|
4
|
+
* WHAT THIS REPLACES. `computeGoalRelevance` scores an element by counting how
|
|
5
|
+
* many goal keywords appear as substrings of its text, then scaling by 2.0. It
|
|
6
|
+
* has no stemming, no synonyms and no semantics, so for the goal "buy a
|
|
7
|
+
* subscription" the button "Checkout" scores ZERO, "Get Started" scores ZERO and
|
|
8
|
+
* "Upgrade to Pro" scores ZERO — while a footer link reading "Subscription
|
|
9
|
+
* terms" takes the full boost. Substring matching also fires on fragments:
|
|
10
|
+
* "car rental" boosts "careers" and "shopping cart".
|
|
11
|
+
*
|
|
12
|
+
* That layer is supposed to model task-driven attention — Yarbus 1967, one of
|
|
13
|
+
* the most replicated findings in eye-tracking — and it systematically misses
|
|
14
|
+
* exactly the elements a goal-directed user goes for, because real calls to
|
|
15
|
+
* action are rarely worded like the goal.
|
|
16
|
+
*
|
|
17
|
+
* WHAT IT DOES INSTEAD. One LLM call per (persona, goal, element-set) judges
|
|
18
|
+
* every element at once. The model gets the persona's traits, motivational
|
|
19
|
+
* values and description, not just its name, so relevance is judged the way the
|
|
20
|
+
* persona would weigh it: an impatient power-user and an anxious first-timer
|
|
21
|
+
* looking for the same thing do not attend to the same elements, and a semantic
|
|
22
|
+
* vocabulary can express that where six element-type multipliers cannot.
|
|
23
|
+
*
|
|
24
|
+
* ONE CALL PER PAGE, NOT PER ELEMENT. A page carries tens of elements and the
|
|
25
|
+
* overlay runs per frame; per-element or per-frame calls would make this
|
|
26
|
+
* unusable. The cache key covers everything that can change the answer, so a
|
|
27
|
+
* repeated run is free and deterministic — an LLM layer is only usable in a
|
|
28
|
+
* regression context if repeating a run repeats the answer.
|
|
29
|
+
*
|
|
30
|
+
* FAILURE IS A DOWNGRADE, NEVER AN ERROR. No API key, a refused call, or
|
|
31
|
+
* unparseable output falls back to the keyword scorer and reports `source`
|
|
32
|
+
* accordingly. A relevance score whose provenance is unknown is worse than a
|
|
33
|
+
* weak one: the caller must be able to say which method produced the number.
|
|
34
|
+
*
|
|
35
|
+
* @copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com https://cbrowser.ai
|
|
36
|
+
* @license MIT
|
|
37
|
+
*/
|
|
38
|
+
import { createHash } from "node:crypto";
|
|
39
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
40
|
+
import { homedir } from "node:os";
|
|
41
|
+
import { join } from "node:path";
|
|
42
|
+
import { getTraitDefinition, getTraitLevel } from "../trait-reference.js";
|
|
43
|
+
const CACHE_DIR = join(process.env.CBROWSER_DATA_DIR || join(homedir(), ".cbrowser"), "llm-relevance-cache");
|
|
44
|
+
/** The model rung this layer runs on. Judgement task, not a reasoning task. */
|
|
45
|
+
const RELEVANCE_MODEL = "claude-sonnet-5";
|
|
46
|
+
/**
|
|
47
|
+
* Cache generation. Bump when a change makes existing entries wrong.
|
|
48
|
+
*
|
|
49
|
+
* v2: entries written before the partial-result guard can hold scores with no
|
|
50
|
+
* reasoning, from a truncated response. Refusing to WRITE those does not stop
|
|
51
|
+
* the ones already on disk from replaying forever — a content-addressed cache
|
|
52
|
+
* has no other way to expire them, and the observed symptom was four of five
|
|
53
|
+
* moments returning source "llm" with no reasoning, indefinitely.
|
|
54
|
+
*/
|
|
55
|
+
const CACHE_VERSION = "v2";
|
|
56
|
+
function cacheKey(elements, ctx) {
|
|
57
|
+
const h = createHash("sha256");
|
|
58
|
+
// Geometry and colour are part of the question, so they must be part of the
|
|
59
|
+
// key: the same words restyled from a grey footer link to a filled button is
|
|
60
|
+
// a different judgement, and reusing the old answer would hide exactly the
|
|
61
|
+
// effect this layer was extended to capture.
|
|
62
|
+
h.update(JSON.stringify(elements.map((e) => [
|
|
63
|
+
e.index, e.type, e.text,
|
|
64
|
+
e.x, e.y, e.width, e.height,
|
|
65
|
+
e.color, e.backgroundColor, e.fontSize, e.fontWeight,
|
|
66
|
+
])));
|
|
67
|
+
h.update(`|${CACHE_VERSION}|${ctx.personaName}|${ctx.goal ?? ""}|${RELEVANCE_MODEL}|`);
|
|
68
|
+
h.update(JSON.stringify(ctx.traits ?? {}));
|
|
69
|
+
h.update(JSON.stringify(ctx.values ?? {}));
|
|
70
|
+
if (ctx.screenshot)
|
|
71
|
+
h.update(ctx.screenshot);
|
|
72
|
+
return h.digest("hex").slice(0, 32);
|
|
73
|
+
}
|
|
74
|
+
function readCache(key) {
|
|
75
|
+
try {
|
|
76
|
+
const p = join(CACHE_DIR, `${key}.json`);
|
|
77
|
+
if (!existsSync(p))
|
|
78
|
+
return null;
|
|
79
|
+
return { ...JSON.parse(readFileSync(p, "utf8")), cached: true };
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function writeCache(key, value) {
|
|
86
|
+
try {
|
|
87
|
+
if (!existsSync(CACHE_DIR))
|
|
88
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
89
|
+
writeFileSync(join(CACHE_DIR, `${key}.json`), JSON.stringify(value));
|
|
90
|
+
}
|
|
91
|
+
catch { /* a cold cache is slower, never wrong */ }
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Render traits with what each VALUE means behaviourally for this persona.
|
|
95
|
+
*
|
|
96
|
+
* "patience 0.20 (low)" tells a judge almost nothing. The trait registry already
|
|
97
|
+
* carries a behavioural example per band — patience 0.20 is "Gives up after 1-2
|
|
98
|
+
* failed attempts" — and handing over that sentence instead of the number is the
|
|
99
|
+
* difference between the model guessing what low patience implies and being told.
|
|
100
|
+
*/
|
|
101
|
+
function describeTraits(traits) {
|
|
102
|
+
if (!traits)
|
|
103
|
+
return "unspecified";
|
|
104
|
+
const notable = Object.entries(traits)
|
|
105
|
+
.filter(([, v]) => typeof v === "number" && (v <= 0.35 || v >= 0.65))
|
|
106
|
+
.sort((a, b) => Math.abs(b[1] - 0.5) - Math.abs(a[1] - 0.5))
|
|
107
|
+
.slice(0, 12)
|
|
108
|
+
.map(([k, v]) => {
|
|
109
|
+
const def = getTraitDefinition(k);
|
|
110
|
+
if (!def)
|
|
111
|
+
return `- ${k} ${v.toFixed(2)}`;
|
|
112
|
+
const example = def.examples[getTraitLevel(v)];
|
|
113
|
+
return `- ${k} ${v.toFixed(2)} — ${def.description}. At this level: ${example}`;
|
|
114
|
+
});
|
|
115
|
+
return notable.length > 0 ? "\n" + notable.join("\n") : "all traits near baseline";
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Schwartz values with their behavioural reading.
|
|
119
|
+
*
|
|
120
|
+
* No registry equivalent exists for values, and a bare number is as opaque here
|
|
121
|
+
* as it is for traits, so the meaning is spelled out at the point of use.
|
|
122
|
+
*/
|
|
123
|
+
const VALUE_MEANING = {
|
|
124
|
+
selfDirection: ["ignores recommendations, wants to explore and decide alone", "follows curated paths and suggestions"],
|
|
125
|
+
stimulation: ["prefers familiar, predictable interfaces", "drawn to novelty, new, beta, latest"],
|
|
126
|
+
hedonism: ["tolerates friction for utility", "abandons anything unpleasant or effortful"],
|
|
127
|
+
achievement: ["satisfices, takes the first workable option", "optimises, compares, seeks the best outcome"],
|
|
128
|
+
power: ["indifferent to status signals", "responds to premium, pro, exclusive framing"],
|
|
129
|
+
security: ["untroubled by risk signals", "scrutinises safety, privacy, guarantees, refunds"],
|
|
130
|
+
conformity: ["immune to social proof", "strongly moved by reviews, ratings, popularity"],
|
|
131
|
+
tradition: ["comfortable with the unfamiliar", "distrusts novelty, wants the established option"],
|
|
132
|
+
benevolence: ["self-focused in decisions", "attends to how choices affect others"],
|
|
133
|
+
universalism: ["indifferent to ethics framing", "attends to sustainability, fairness, accessibility claims"],
|
|
134
|
+
};
|
|
135
|
+
function describeValues(values) {
|
|
136
|
+
if (!values)
|
|
137
|
+
return "unspecified";
|
|
138
|
+
const notable = Object.entries(values)
|
|
139
|
+
.filter(([, v]) => typeof v === "number" && (v <= 0.35 || v >= 0.65))
|
|
140
|
+
.sort((a, b) => Math.abs(b[1] - 0.5) - Math.abs(a[1] - 0.5))
|
|
141
|
+
.map(([k, v]) => {
|
|
142
|
+
const m = VALUE_MEANING[k];
|
|
143
|
+
if (!m)
|
|
144
|
+
return `- ${k} ${v.toFixed(2)}`;
|
|
145
|
+
return `- ${k} ${v.toFixed(2)} — ${v >= 0.65 ? m[1] : m[0]}`;
|
|
146
|
+
});
|
|
147
|
+
return notable.length > 0 ? "\n" + notable.join("\n") : "all values near baseline";
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The keyword scorer this layer replaces, kept as the fallback.
|
|
151
|
+
*
|
|
152
|
+
* Deliberately identical to the historical behaviour so a downgrade changes the
|
|
153
|
+
* source field and nothing else.
|
|
154
|
+
*/
|
|
155
|
+
export function keywordRelevance(elementText, goal) {
|
|
156
|
+
if (!goal || !elementText)
|
|
157
|
+
return 0;
|
|
158
|
+
const stopWords = new Set(["the", "a", "an", "to", "for", "of", "in", "on", "at", "is", "it", "my", "i", "me", "and", "or", "how", "do", "can"]);
|
|
159
|
+
const goalWords = goal.toLowerCase().split(/\s+/).filter((w) => w.length > 2 && !stopWords.has(w));
|
|
160
|
+
if (goalWords.length === 0)
|
|
161
|
+
return 0;
|
|
162
|
+
const textLower = elementText.toLowerCase();
|
|
163
|
+
const matches = goalWords.filter((w) => textLower.includes(w)).length;
|
|
164
|
+
return matches === 0 ? 0 : (matches / goalWords.length) * 2.0;
|
|
165
|
+
}
|
|
166
|
+
function keywordFallback(elements, ctx, unavailable) {
|
|
167
|
+
const scores = {};
|
|
168
|
+
if (ctx.goal) {
|
|
169
|
+
for (const el of elements) {
|
|
170
|
+
// Historical scorer runs 0-2; this layer's contract is 0-1.
|
|
171
|
+
const raw = keywordRelevance(el.text, ctx.goal) / 2;
|
|
172
|
+
if (raw > 0)
|
|
173
|
+
scores[el.index] = Math.min(1, raw);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { scores, source: "keyword-fallback", cached: false, unavailable };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Judge how much each element deserves this persona's attention.
|
|
180
|
+
*
|
|
181
|
+
* Returns 0-1 per element index. Callers multiply their existing element weight
|
|
182
|
+
* by `1 + k * score` rather than replacing it — relevance modulates the
|
|
183
|
+
* element-type prior, it does not override it.
|
|
184
|
+
*/
|
|
185
|
+
export async function judgeRelevance(elements, ctx, getApiKey) {
|
|
186
|
+
if (elements.length === 0) {
|
|
187
|
+
return { scores: {}, source: "llm", cached: false };
|
|
188
|
+
}
|
|
189
|
+
const key = cacheKey(elements, ctx);
|
|
190
|
+
const hit = readCache(key);
|
|
191
|
+
if (hit)
|
|
192
|
+
return hit;
|
|
193
|
+
if (ctx.entitled === false) {
|
|
194
|
+
return keywordFallback(elements, ctx, "Persona-judged relevance requires CBrowser Pro — using keyword matching");
|
|
195
|
+
}
|
|
196
|
+
const apiKey = getApiKey();
|
|
197
|
+
if (!apiKey)
|
|
198
|
+
return keywordFallback(elements, ctx, "No Anthropic API key configured");
|
|
199
|
+
const system = "You judge which page elements a specific person would pay attention to. " +
|
|
200
|
+
"You are modelling ONE person's attention, described by their traits, values and goal. " +
|
|
201
|
+
"Score every element 0.0-1.0 for how much THIS person's attention it deserves.\n\n" +
|
|
202
|
+
"Judge by meaning, not word overlap. For the goal \"buy a subscription\", a button " +
|
|
203
|
+
"labelled \"Checkout\", \"Get Started\" or \"Upgrade to Pro\" is highly relevant even though " +
|
|
204
|
+
"it shares no words with the goal, while a footer link reading \"Subscription terms\" is not.\n\n" +
|
|
205
|
+
"Weigh the persona. Low patience skips explanatory copy and hunts for the action. High " +
|
|
206
|
+
"anxiety or low trust dwells on security, price and reassurance. High conformity is pulled " +
|
|
207
|
+
"by social proof and ratings; high self-direction ignores them. Low comprehension needs " +
|
|
208
|
+
"labels and headings before controls. Let these genuinely change the ranking — two personas " +
|
|
209
|
+
"with the same goal should not produce the same scores.\n\n" +
|
|
210
|
+
"Return ONLY JSON: {\"scores\": {\"<index>\": <0.0-1.0>, ...}, \"reasoning\": \"<two sentences>\"}. " +
|
|
211
|
+
"Omit elements scoring 0. Keep `reasoning` to TWO sentences, under 60 words total — it is " +
|
|
212
|
+
"emitted after the scores and a long one gets truncated, losing itself. Say what this persona " +
|
|
213
|
+
"is drawn to on THIS page and what they ignore, naming their traits. Write it so a designer " +
|
|
214
|
+
"reading it knows what to change.";
|
|
215
|
+
const user = [
|
|
216
|
+
`Persona: ${ctx.personaName}`,
|
|
217
|
+
ctx.personaDescription ? `Description: ${ctx.personaDescription}` : "",
|
|
218
|
+
`Notable traits:${describeTraits(ctx.traits)}`,
|
|
219
|
+
ctx.values ? `Motivational values:${describeValues(ctx.values)}` : "",
|
|
220
|
+
ctx.goal ? `Goal on this page: ${ctx.goal}` : "No stated goal — judge by what this persona is drawn to.",
|
|
221
|
+
ctx.viewport ? `Viewport: ${ctx.viewport.width}x${ctx.viewport.height} (fold at y=${ctx.viewport.height})` : "",
|
|
222
|
+
"",
|
|
223
|
+
ctx.screenshot
|
|
224
|
+
? "The rendered page is attached. Elements below are listed with size, position and colour."
|
|
225
|
+
: "Elements below are listed with size, position and colour.",
|
|
226
|
+
"",
|
|
227
|
+
"Elements:",
|
|
228
|
+
...elements.map((e) => {
|
|
229
|
+
const bits = [`${e.index}. [${e.type}] ${e.text.slice(0, 120)}`];
|
|
230
|
+
if (e.width && e.height)
|
|
231
|
+
bits.push(`${Math.round(e.width)}x${Math.round(e.height)}px`);
|
|
232
|
+
if (e.x !== undefined && e.y !== undefined)
|
|
233
|
+
bits.push(`at (${Math.round(e.x)},${Math.round(e.y)})`);
|
|
234
|
+
if (e.fontSize)
|
|
235
|
+
bits.push(`${Math.round(e.fontSize)}px${e.fontWeight && e.fontWeight >= 600 ? " bold" : ""}`);
|
|
236
|
+
if (e.color)
|
|
237
|
+
bits.push(`fg ${e.color}`);
|
|
238
|
+
if (e.backgroundColor)
|
|
239
|
+
bits.push(`bg ${e.backgroundColor}`);
|
|
240
|
+
return bits.join(" ");
|
|
241
|
+
}),
|
|
242
|
+
].filter(Boolean).join("\n");
|
|
243
|
+
try {
|
|
244
|
+
const { default: Anthropic } = await import("@anthropic-ai/sdk");
|
|
245
|
+
const client = new Anthropic({ apiKey });
|
|
246
|
+
const response = await client.messages.create({
|
|
247
|
+
model: RELEVANCE_MODEL,
|
|
248
|
+
max_tokens: 4000,
|
|
249
|
+
system,
|
|
250
|
+
messages: [{
|
|
251
|
+
role: "user",
|
|
252
|
+
content: ctx.screenshot
|
|
253
|
+
? [
|
|
254
|
+
{
|
|
255
|
+
type: "image",
|
|
256
|
+
source: {
|
|
257
|
+
type: "base64",
|
|
258
|
+
media_type: ctx.screenshotMediaType ?? "image/png",
|
|
259
|
+
data: ctx.screenshot.toString("base64"),
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
{ type: "text", text: user },
|
|
263
|
+
]
|
|
264
|
+
: user,
|
|
265
|
+
}],
|
|
266
|
+
});
|
|
267
|
+
// Concatenate EVERY text block, not just the first: a leading prose block
|
|
268
|
+
// pushed the JSON into content[1] and the layer silently degraded to keyword
|
|
269
|
+
// matching, which is the worst possible failure here because the fallback
|
|
270
|
+
// still returns plausible numbers.
|
|
271
|
+
const text = response.content
|
|
272
|
+
.filter((b) => b.type === "text")
|
|
273
|
+
.map((b) => b.text)
|
|
274
|
+
.join("\n")
|
|
275
|
+
.replace(/```(?:json)?/gi, "");
|
|
276
|
+
// Brace-balanced scan rather than a greedy regex, so prose containing braces
|
|
277
|
+
// on either side of the payload does not swallow or truncate it.
|
|
278
|
+
const extractJson = (src) => {
|
|
279
|
+
const start = src.indexOf("{");
|
|
280
|
+
if (start < 0)
|
|
281
|
+
return null;
|
|
282
|
+
let depth = 0, inStr = false, esc = false;
|
|
283
|
+
for (let i = start; i < src.length; i++) {
|
|
284
|
+
const c = src[i];
|
|
285
|
+
if (esc) {
|
|
286
|
+
esc = false;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (c === "\\") {
|
|
290
|
+
esc = true;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (c === '"') {
|
|
294
|
+
inStr = !inStr;
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (inStr)
|
|
298
|
+
continue;
|
|
299
|
+
if (c === "{")
|
|
300
|
+
depth++;
|
|
301
|
+
else if (c === "}" && --depth === 0)
|
|
302
|
+
return src.slice(start, i + 1);
|
|
303
|
+
}
|
|
304
|
+
return null;
|
|
305
|
+
};
|
|
306
|
+
const json = extractJson(text);
|
|
307
|
+
// Salvage a truncated response rather than discarding it.
|
|
308
|
+
//
|
|
309
|
+
// `scores` is emitted before `reasoning`, so a response cut off mid-sentence
|
|
310
|
+
// still contains a COMPLETE scores object — and the scores are the part that
|
|
311
|
+
// matters. Throwing the whole thing away and silently returning keyword
|
|
312
|
+
// numbers was strictly worse than losing only the prose. Observed live: a
|
|
313
|
+
// response ending mid-reasoning with "scores": {"0": 0.95} fully intact.
|
|
314
|
+
let parsed = null;
|
|
315
|
+
if (json) {
|
|
316
|
+
try {
|
|
317
|
+
parsed = JSON.parse(json);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
parsed = null;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (!parsed) {
|
|
324
|
+
const scoresOnly = text.match(/"scores"\s*:\s*(\{[^{}]*\})/);
|
|
325
|
+
if (scoresOnly) {
|
|
326
|
+
try {
|
|
327
|
+
parsed = { scores: JSON.parse(scoresOnly[1]) };
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
parsed = null;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (!parsed) {
|
|
335
|
+
return keywordFallback(elements, ctx, `Model returned no parseable JSON (${text.slice(0, 80).replace(/\s+/g, " ")})`);
|
|
336
|
+
}
|
|
337
|
+
const scores = {};
|
|
338
|
+
for (const [k, v] of Object.entries(parsed.scores ?? {})) {
|
|
339
|
+
const idx = Number(k);
|
|
340
|
+
// Reject anything that is not a real index or a real 0-1 score rather
|
|
341
|
+
// than letting a malformed key become element 0 at NaN weight.
|
|
342
|
+
if (!Number.isInteger(idx) || typeof v !== "number" || !Number.isFinite(v))
|
|
343
|
+
continue;
|
|
344
|
+
if (idx < 0 || idx >= elements.length)
|
|
345
|
+
continue;
|
|
346
|
+
if (v > 0)
|
|
347
|
+
scores[idx] = Math.max(0, Math.min(1, v));
|
|
348
|
+
}
|
|
349
|
+
const result = {
|
|
350
|
+
scores, source: "llm", cached: false, model: RELEVANCE_MODEL,
|
|
351
|
+
sawScreenshot: Boolean(ctx.screenshot),
|
|
352
|
+
...(typeof parsed.reasoning === "string" ? { reasoning: parsed.reasoning } : {}),
|
|
353
|
+
};
|
|
354
|
+
// Only cache a COMPLETE judgement. A salvaged response carries scores but no
|
|
355
|
+
// reasoning, and caching it meant every later frame sharing that DOM
|
|
356
|
+
// replayed the reasoning-less result — observed as four of five moments
|
|
357
|
+
// reporting source "llm" with no reasoning at all, while the one frame with
|
|
358
|
+
// a different DOM came back complete. A partial answer should cost one
|
|
359
|
+
// retry, not poison every subsequent lookup.
|
|
360
|
+
if (result.reasoning)
|
|
361
|
+
writeCache(key, result);
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
catch (e) {
|
|
365
|
+
return keywordFallback(elements, ctx, `LLM relevance failed: ${e.message}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Narrate a whole recording from the moments that were judged along the way.
|
|
370
|
+
*
|
|
371
|
+
* A per-frame judgement answers "what did this persona attend to here". It does
|
|
372
|
+
* not answer "how did this experience go", which is the question a designer
|
|
373
|
+
* watching a recording actually has — where attention went first, what pulled it
|
|
374
|
+
* away, whether the thing they came to do ever became findable. That is a
|
|
375
|
+
* different question over a different unit (the run, not the frame), so it is a
|
|
376
|
+
* separate call rather than a field on the last frame.
|
|
377
|
+
*
|
|
378
|
+
* Costs one call per capture regardless of length, because it consumes the
|
|
379
|
+
* already-computed keyframe judgements rather than the frames.
|
|
380
|
+
*/
|
|
381
|
+
export async function summarizeCapture(moments, ctx, getApiKey) {
|
|
382
|
+
if (moments.length === 0) {
|
|
383
|
+
return { narrative: "", source: "unavailable", unavailable: "No judged moments to summarise" };
|
|
384
|
+
}
|
|
385
|
+
if (ctx.entitled === false) {
|
|
386
|
+
return { narrative: "", source: "unavailable", unavailable: "Capture summary requires CBrowser Pro" };
|
|
387
|
+
}
|
|
388
|
+
const apiKey = getApiKey();
|
|
389
|
+
if (!apiKey)
|
|
390
|
+
return { narrative: "", source: "unavailable", unavailable: "No Anthropic API key configured" };
|
|
391
|
+
const system = "You narrate how one specific person experienced a screen recording of a web page. " +
|
|
392
|
+
"You are given the moments where the interface changed enough to re-judge their attention. " +
|
|
393
|
+
"Write 3-5 sentences covering: what the model predicts pulled attention first, how the predicted " +
|
|
394
|
+
"attention differs between the moments shown, whether what the persona came to do is prominent, " +
|
|
395
|
+
"and the single change that would most improve this page for THIS person. Refer to their traits " +
|
|
396
|
+
"by name where it explains a difference. Write for a designer who will act on it — concrete, no " +
|
|
397
|
+
"hedging.\n\n" +
|
|
398
|
+
"An ACTION LOG may be supplied. It is the complete record of what was driven " +
|
|
399
|
+
"on the page — every click, input and submit. Anything not in it did not happen. " +
|
|
400
|
+
"You may say what an action led to; you may not invent one that is not listed.\n\n" +
|
|
401
|
+
"CRITICAL — DO NOT INFER BEHAVIOUR FROM TIME. These timestamps are when an automation issued " +
|
|
402
|
+
"its next command; the gaps between them are script cadence, NOT a person deliberating. Never " +
|
|
403
|
+
"write that the user hesitated, stalled, lingered, re-read, second-guessed, hovered, or 'took N " +
|
|
404
|
+
"seconds to decide'. There is no human in this recording and no dwell data. A four-second gap " +
|
|
405
|
+
"means nothing called the tool for four seconds. Describe what the page shows and what the model " +
|
|
406
|
+
"predicts about it — never a mental state, and never a duration as evidence of one.\n\n" +
|
|
407
|
+
"This holds for the RECOMMENDATION too. Do not justify a fix with what a user 'will stall on' " +
|
|
408
|
+
"or 'would hesitate over' — that reads as an observed finding to anyone skimming, and nothing " +
|
|
409
|
+
"here observed a user. Argue from the model instead: 'this persona weights security signals " +
|
|
410
|
+
"heavily and the page has none above the fold' is defensible; 'they stall before signing up' " +
|
|
411
|
+
"is not, even as a prediction.\n\n" +
|
|
412
|
+
"Return ONLY JSON: {\"narrative\": \"<3-5 sentences>\"}.";
|
|
413
|
+
const user = [
|
|
414
|
+
`Persona: ${ctx.personaName}`,
|
|
415
|
+
ctx.personaDescription ? `Description: ${ctx.personaDescription}` : "",
|
|
416
|
+
`Notable traits:${describeTraits(ctx.traits)}`,
|
|
417
|
+
ctx.values ? `Motivational values:${describeValues(ctx.values)}` : "",
|
|
418
|
+
ctx.goal ? `Goal: ${ctx.goal}` : "No stated goal.",
|
|
419
|
+
`Recording: ${ctx.frameCount} frames over ${(ctx.durationMs / 1000).toFixed(1)}s, ${moments.length} judged moments.`,
|
|
420
|
+
"",
|
|
421
|
+
ctx.actions && ctx.actions.length > 0
|
|
422
|
+
? "Action log (complete — nothing else was driven):\n" +
|
|
423
|
+
ctx.actions.map((a) => ` t=${(a.atMs / 1000).toFixed(1)}s ${a.type}${a.label ? ` on "${a.label}"` : ""}`).join("\n")
|
|
424
|
+
: "Action log: EMPTY. Nothing was clicked or typed during this recording. " +
|
|
425
|
+
"Do not describe the persona as doing anything.",
|
|
426
|
+
"",
|
|
427
|
+
"Moments:",
|
|
428
|
+
...moments.map((m) => [
|
|
429
|
+
`t=${(m.tMs / 1000).toFixed(1)}s (frame ${m.frameIndex})`,
|
|
430
|
+
m.topElements.length > 0
|
|
431
|
+
? ` drew attention: ${m.topElements.map((e) => `${e.text.slice(0, 60)} (${e.score.toFixed(2)})`).join("; ")}`
|
|
432
|
+
: " drew attention: nothing scored",
|
|
433
|
+
m.reasoning ? ` why: ${m.reasoning}` : "",
|
|
434
|
+
].filter(Boolean).join("\n")),
|
|
435
|
+
].filter(Boolean).join("\n");
|
|
436
|
+
try {
|
|
437
|
+
const { default: Anthropic } = await import("@anthropic-ai/sdk");
|
|
438
|
+
const client = new Anthropic({ apiKey });
|
|
439
|
+
const response = await client.messages.create({
|
|
440
|
+
model: RELEVANCE_MODEL,
|
|
441
|
+
max_tokens: 2000,
|
|
442
|
+
system,
|
|
443
|
+
messages: [{ role: "user", content: user }],
|
|
444
|
+
});
|
|
445
|
+
const text = response.content
|
|
446
|
+
.filter((b) => b.type === "text")
|
|
447
|
+
.map((b) => b.text)
|
|
448
|
+
.join("\n")
|
|
449
|
+
.replace(/```(?:json)?/gi, "");
|
|
450
|
+
// Salvage a truncated narrative rather than returning the raw JSON envelope.
|
|
451
|
+
// A cut-off response has no closing brace, so the brace scan failed and the
|
|
452
|
+
// "prose without JSON" fallback handed back the literal {"narrative":"...
|
|
453
|
+
// string — which then rendered verbatim in the player.
|
|
454
|
+
const narrativeOnly = text.match(/"narrative"\s*:\s*"((?:[^"\\]|\\.)*)/);
|
|
455
|
+
const start = text.indexOf("{");
|
|
456
|
+
const end = text.lastIndexOf("}");
|
|
457
|
+
if ((start < 0 || end <= start) && narrativeOnly) {
|
|
458
|
+
const salvaged = narrativeOnly[1]
|
|
459
|
+
.replace(/\\"/g, '"').replace(/\\n/g, " ").replace(/\\\\/g, "\\").trim();
|
|
460
|
+
if (salvaged)
|
|
461
|
+
return { narrative: salvaged, source: "llm" };
|
|
462
|
+
}
|
|
463
|
+
if (start < 0 || end <= start) {
|
|
464
|
+
// Prose without JSON is still a usable narrative; losing it to a parse
|
|
465
|
+
// rule would discard the answer over its packaging.
|
|
466
|
+
const bare = text.trim();
|
|
467
|
+
return bare
|
|
468
|
+
? { narrative: bare, source: "llm" }
|
|
469
|
+
: { narrative: "", source: "unavailable", unavailable: "Model returned nothing usable" };
|
|
470
|
+
}
|
|
471
|
+
const parsed = JSON.parse(text.slice(start, end + 1));
|
|
472
|
+
return parsed.narrative
|
|
473
|
+
? { narrative: parsed.narrative, source: "llm" }
|
|
474
|
+
: { narrative: "", source: "unavailable", unavailable: "Model returned no narrative" };
|
|
475
|
+
}
|
|
476
|
+
catch (e) {
|
|
477
|
+
return { narrative: "", source: "unavailable", unavailable: `Summary failed: ${e.message}` };
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=llm-relevance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-relevance.js","sourceRoot":"","sources":["../../src/visual/llm-relevance.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,6 +90,7 @@ export declare function calculatePerceptualScore(barriers: Array<{
|
|
|
90
90
|
type: string;
|
|
91
91
|
severity: string;
|
|
92
92
|
element?: string;
|
|
93
|
+
wcagCriteria?: string[];
|
|
93
94
|
}>, frictionPoints: Array<{
|
|
94
95
|
impact: string;
|
|
95
96
|
}>, goalAchieved: boolean, personaName: string, accessibilityTraits?: Record<string, unknown>): {
|
|
@@ -128,4 +129,63 @@ export declare function analyzePerceptualTransport(screenshotPath: string, perso
|
|
|
128
129
|
* List all available perceptual profiles.
|
|
129
130
|
*/
|
|
130
131
|
export declare function listPerceptualProfiles(): string[];
|
|
132
|
+
/**
|
|
133
|
+
* Severity of a barrier as this persona actually experiences it.
|
|
134
|
+
*
|
|
135
|
+
* Susceptibility weights already exist and already drive scoring, but the
|
|
136
|
+
* severity a reader sees was persona-blind -- so a 169-item navigation
|
|
137
|
+
* displayed as "minor" to cognitive-adhd while being charged at a 3.0
|
|
138
|
+
* cognitive_load weight and driving the top bottleneck. The number said one
|
|
139
|
+
* thing and the label said another, and the label is what gets acted on.
|
|
140
|
+
*
|
|
141
|
+
* The base severity is kept alongside, because it is the one that maps to WCAG
|
|
142
|
+
* conformance: a criterion does not become more or less violated because of
|
|
143
|
+
* who is reading. This is about triage order, not compliance.
|
|
144
|
+
*/
|
|
145
|
+
export type BarrierSeverityLevel = "minor" | "major" | "critical";
|
|
146
|
+
export declare function weightedSeverity(base: string, weight: number): {
|
|
147
|
+
severity: BarrierSeverityLevel;
|
|
148
|
+
shifted: number;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Resolve a barrier to the key its susceptibility weight is stored under.
|
|
152
|
+
*
|
|
153
|
+
* The two vocabularies do not match and looking up the raw type silently
|
|
154
|
+
* returned 1.0 for most barriers. Emitted types are sensory, cognitive_load,
|
|
155
|
+
* motor_precision, visual_clarity, visual, motor, touch_target and timing;
|
|
156
|
+
* weights are keyed color_only, missing_alt, low_contrast, touch_target,
|
|
157
|
+
* cognitive_load, timing, missing_label, hover_dependent, form_complexity.
|
|
158
|
+
* Only three overlap, so `sensory` -- the most common type -- always defaulted.
|
|
159
|
+
*
|
|
160
|
+
* That is how a deaf-user audit reported weight 1.0 on a colour-only barrier
|
|
161
|
+
* while the persona's own table says 0.5: the table was right and the lookup
|
|
162
|
+
* never reached it.
|
|
163
|
+
*
|
|
164
|
+
* WCAG criteria are consulted first because they identify the barrier far more
|
|
165
|
+
* precisely than the type does: both a missing alt and a colour-only link are
|
|
166
|
+
* "sensory", and they have opposite susceptibility profiles.
|
|
167
|
+
*/
|
|
168
|
+
/**
|
|
169
|
+
* The single map from a detector-emitted barrier type to a profile weight key.
|
|
170
|
+
*
|
|
171
|
+
* Barrier types and susceptibility keys are different vocabularies, and this
|
|
172
|
+
* file used to hold two independent translations between them -- one used to
|
|
173
|
+
* SCORE, one used to DISPLAY the weight that was applied. They disagreed on
|
|
174
|
+
* motor_precision, so an audit reported a 0.1 weight beside a deduction
|
|
175
|
+
* computed at 2.5. Both paths read this now.
|
|
176
|
+
*/
|
|
177
|
+
export declare const BARRIER_TYPE_TO_WEIGHT_KEY: Record<string, string>;
|
|
178
|
+
export declare function weightKeyFor(barrierType: string, wcagCriteria?: string[]): string | null;
|
|
179
|
+
/**
|
|
180
|
+
* Susceptibility weight for a barrier, and whether it was actually found.
|
|
181
|
+
*
|
|
182
|
+
* `defaulted` matters: an unmeasured 1.0 and a measured 1.0 mean different
|
|
183
|
+
* things, and presenting the first as the second is what made a deaf user look
|
|
184
|
+
* maximally susceptible to colour.
|
|
185
|
+
*/
|
|
186
|
+
export declare function barrierWeightFor(personaName: string, barrierType: string, wcagCriteria?: string[]): {
|
|
187
|
+
weight: number;
|
|
188
|
+
key: string | null;
|
|
189
|
+
defaulted: boolean;
|
|
190
|
+
};
|
|
131
191
|
//# sourceMappingURL=perceptual-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perceptual-transport.d.ts","sourceRoot":"","sources":["../../src/visual/perceptual-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACnE,4FAA4F;IAC5F,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,2CAA2C;IAC3C,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,+DAA+D;IAC/D,aAAa,EAAE,SAAS,GAAG,cAAc,GAAG,kBAAkB,GAAG,cAAc,GAAG,gBAAgB,CAAC;IACnG,oFAAoF;IACpF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAC;IACxB,gHAAgH;IAChH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,aAAa,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,eAAe,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"perceptual-transport.d.ts","sourceRoot":"","sources":["../../src/visual/perceptual-transport.ts"],"names":[],"mappings":"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"}
|