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
package/dist/cli.js
CHANGED
|
@@ -590,6 +590,10 @@ SCREEN CAPTURE (video/GIF — distinct from 'record', which captures actions)
|
|
|
590
590
|
--quality <1-100> JPEG quality of captured frames (default: 80)
|
|
591
591
|
--max-frames <n> Stop retaining frames after n (default: 3000)
|
|
592
592
|
--contact-sheet Also write one JPEG summarising the whole capture
|
|
593
|
+
--attention-overlay Paint the predicted-attention map over every frame
|
|
594
|
+
(adds ~0.5-1s per frame; uses the live DOM)
|
|
595
|
+
--overlay-persona <name> Persona weighting the overlay (default: first-timer)
|
|
596
|
+
--overlay-goal <text> Goal string weighting goal-relevance in the overlay
|
|
593
597
|
--after <event> Start on load|domcontentloaded|networkidle
|
|
594
598
|
--after-element <sel> Start when the element is present and visible
|
|
595
599
|
--after-delay <500ms> Extra delay after the start trigger
|
|
@@ -624,7 +628,7 @@ WEBHOOKS (v2.5.0)
|
|
|
624
628
|
|
|
625
629
|
PERSONA QUESTIONNAIRE
|
|
626
630
|
persona-questionnaire start Build a persona from a behavioural questionnaire
|
|
627
|
-
--comprehensive All
|
|
631
|
+
--comprehensive All 26 traits (default: 8 core traits)
|
|
628
632
|
--name <name> Persona name (prompted if omitted)
|
|
629
633
|
--output <file> Save answers to JSON
|
|
630
634
|
persona-questionnaire list-traits List available traits with descriptions
|
|
@@ -976,11 +980,12 @@ const COMMAND_FLAGS = {
|
|
|
976
980
|
capture: [
|
|
977
981
|
"fps", "duration", "format", "out", "name", "quality", "max-frames",
|
|
978
982
|
"viewport", "region", "element", "element-padding", "contact-sheet",
|
|
983
|
+
"attention-overlay", "overlay-persona", "overlay-goal",
|
|
979
984
|
"after", "after-element", "after-delay",
|
|
980
985
|
"until-element", "until-element-gone", "until-idle", "timeout",
|
|
981
986
|
],
|
|
982
|
-
evaluate: ["file", "arg", "json", "raw", "wait-for", "expect-truthy"],
|
|
983
|
-
eval: ["file", "arg", "json", "raw", "wait-for", "expect-truthy"],
|
|
987
|
+
evaluate: ["file", "arg", "json", "raw", "wait-for", "timeout", "expect-truthy"],
|
|
988
|
+
eval: ["file", "arg", "json", "raw", "wait-for", "timeout", "expect-truthy"],
|
|
984
989
|
keyboard: ["delay", "selector", "hold", "repeat", "text"],
|
|
985
990
|
"test-suite": [
|
|
986
991
|
"capture", "capture-fps", "capture-format", "capture-out",
|
|
@@ -1116,7 +1121,7 @@ const CAPTURE_FLAGS = new Set([
|
|
|
1116
1121
|
// capture-specific
|
|
1117
1122
|
"fps", "duration", "format", "out", "name", "quality", "max-frames",
|
|
1118
1123
|
"viewport", "region", "element", "element-padding",
|
|
1119
|
-
"contact-sheet",
|
|
1124
|
+
"contact-sheet", "attention-overlay", "overlay-persona", "overlay-goal",
|
|
1120
1125
|
"after", "after-element", "after-delay",
|
|
1121
1126
|
"until-element", "until-element-gone", "until-idle", "timeout",
|
|
1122
1127
|
// globals honoured by the shared CBrowser construction
|
|
@@ -1352,6 +1357,17 @@ async function runOneCapture(browser, page, options, slug, outDirOverride) {
|
|
|
1352
1357
|
await session.start({
|
|
1353
1358
|
fps, durationMs, outDir, format, slug, target, quality, maxFrames,
|
|
1354
1359
|
contactSheet: options["contact-sheet"] === true || typeof options["contact-sheet"] === "string",
|
|
1360
|
+
// Overlay the model's predicted-attention map on every frame. Opt-in: it
|
|
1361
|
+
// costs one attention pass per frame. DOM is read from the live page at
|
|
1362
|
+
// stop, so this is the full 35/65 model, not bottom-up contrast alone.
|
|
1363
|
+
...(options["attention-overlay"]
|
|
1364
|
+
? {
|
|
1365
|
+
saliencyOverlay: {
|
|
1366
|
+
...(typeof options["overlay-persona"] === "string" ? { persona: options["overlay-persona"] } : {}),
|
|
1367
|
+
...(typeof options["overlay-goal"] === "string" ? { goal: options["overlay-goal"] } : {}),
|
|
1368
|
+
},
|
|
1369
|
+
}
|
|
1370
|
+
: {}),
|
|
1355
1371
|
...triggers,
|
|
1356
1372
|
// Element tracking resolves through the browser's existing nine-strategy
|
|
1357
1373
|
// resolver rather than a second one living in the capture engine.
|
|
@@ -1713,7 +1729,7 @@ function reportAutoCapture(capture) {
|
|
|
1713
1729
|
// =========================================================================
|
|
1714
1730
|
/** Flags `evaluate` understands; anything else is rejected rather than ignored. */
|
|
1715
1731
|
const EVALUATE_FLAGS = new Set([
|
|
1716
|
-
"file", "arg", "json", "raw", "wait-for", "expect-truthy",
|
|
1732
|
+
"file", "arg", "json", "raw", "wait-for", "timeout", "expect-truthy",
|
|
1717
1733
|
"url", "browser", "device", "headless", "persistent", "restore",
|
|
1718
1734
|
"locale", "timezone", "geo", "verbose",
|
|
1719
1735
|
]);
|
|
@@ -1852,11 +1868,35 @@ async function runEvaluate(browser, args, options) {
|
|
|
1852
1868
|
await browser.navigate(options.url);
|
|
1853
1869
|
const page = await browser.getPage();
|
|
1854
1870
|
if (typeof options["wait-for"] === "string") {
|
|
1871
|
+
// Bounded by the caller, not by a constant.
|
|
1872
|
+
//
|
|
1873
|
+
// This was a hardcoded 30s, which is two defects wearing one number. For a
|
|
1874
|
+
// user it meant no way to fail fast on a page that renders in 200ms and no
|
|
1875
|
+
// way to wait longer on one that does not. For the suite it meant the test
|
|
1876
|
+
// asserting that a never-matching selector fails loudly spent 30 of its 60
|
|
1877
|
+
// second budget deliberately waiting, so browser launch plus teardown had
|
|
1878
|
+
// to fit in the rest -- which held when the test ran alone and did not when
|
|
1879
|
+
// the full suite ran browsers in parallel. The test read as flaky and was
|
|
1880
|
+
// not: it was structurally tight against a constant it could not reach.
|
|
1881
|
+
// (2026-08-02)
|
|
1882
|
+
// Falls back to the configured default rather than a fresh literal.
|
|
1883
|
+
// `CBROWSER_TIMEOUT` is documented in --help as "Default timeout in ms" and
|
|
1884
|
+
// config.ts already resolves it; a second hardcoded 30_000 here would mean
|
|
1885
|
+
// the documented env var silently did not apply to this one wait.
|
|
1886
|
+
const { getDefaultConfig } = await import("./config.js");
|
|
1887
|
+
const configuredMs = getDefaultConfig().timeout ?? 30_000;
|
|
1888
|
+
const waitMs = typeof options.timeout === "string" ? Number(options.timeout)
|
|
1889
|
+
: typeof options.timeout === "number" ? options.timeout
|
|
1890
|
+
: configuredMs;
|
|
1891
|
+
if (!Number.isFinite(waitMs) || waitMs <= 0) {
|
|
1892
|
+
console.error(`Error: --timeout must be a positive number of milliseconds, got: ${options.timeout}`);
|
|
1893
|
+
process.exit(1);
|
|
1894
|
+
}
|
|
1855
1895
|
try {
|
|
1856
|
-
await page.waitForSelector(options["wait-for"], { timeout:
|
|
1896
|
+
await page.waitForSelector(options["wait-for"], { timeout: waitMs });
|
|
1857
1897
|
}
|
|
1858
1898
|
catch {
|
|
1859
|
-
console.error(`✗ Timed out waiting for selector: ${options["wait-for"]}`);
|
|
1899
|
+
console.error(`✗ Timed out waiting for selector: ${options["wait-for"]} (after ${waitMs}ms)`);
|
|
1860
1900
|
process.exit(1);
|
|
1861
1901
|
}
|
|
1862
1902
|
}
|
|
@@ -6376,7 +6416,10 @@ Documentation: https://github.com/alexandriashai/cbrowser/wiki
|
|
|
6376
6416
|
fs.writeFileSync(options.output, JSON.stringify(result, null, 2));
|
|
6377
6417
|
console.log(`\n📄 Report saved: ${options.output}`);
|
|
6378
6418
|
}
|
|
6379
|
-
// Exit with appropriate code
|
|
6419
|
+
// Exit with appropriate code. This IS a cognitive journey, so
|
|
6420
|
+
// goalAchieved genuinely means the persona reached the goal — unlike
|
|
6421
|
+
// the empathy audit's field of the same old name, which measured
|
|
6422
|
+
// barriers and was renamed to noBlockingBarriers.
|
|
6380
6423
|
process.exit(result.goalAchieved ? 0 : 1);
|
|
6381
6424
|
}
|
|
6382
6425
|
catch (error) {
|
|
@@ -6807,7 +6850,7 @@ Commands:
|
|
|
6807
6850
|
persona-questionnaire lookup Look up behaviors for a specific trait value
|
|
6808
6851
|
|
|
6809
6852
|
Options for 'start':
|
|
6810
|
-
--comprehensive Include all
|
|
6853
|
+
--comprehensive Include all 26 traits (default: 8 core traits)
|
|
6811
6854
|
--name <name> Name for the persona (prompted if not provided)
|
|
6812
6855
|
--output <file> Save questionnaire answers to JSON file
|
|
6813
6856
|
|
|
@@ -6854,7 +6897,9 @@ Examples:
|
|
|
6854
6897
|
if (answer && answer.trim()) {
|
|
6855
6898
|
const idx = parseInt(answer.trim()) - 1;
|
|
6856
6899
|
if (idx >= 0 && idx < q.options.length) {
|
|
6857
|
-
|
|
6900
|
+
// Keyed by id, not trait: a Big Five item has no trait, and for a trait
|
|
6901
|
+
// question id and trait are the same string anyway.
|
|
6902
|
+
answers[q.id] = q.options[idx].value;
|
|
6858
6903
|
console.log(` ✓ ${q.options[idx].label}`);
|
|
6859
6904
|
}
|
|
6860
6905
|
}
|