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.
Files changed (235) hide show
  1. package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
  2. package/dist/analysis/accessibility-empathy.js +395 -66
  3. package/dist/analysis/accessibility-empathy.js.map +1 -1
  4. package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
  5. package/dist/analysis/agent-ready-audit.js +78 -0
  6. package/dist/analysis/agent-ready-audit.js.map +1 -1
  7. package/dist/analysis/page-understanding.d.ts +139 -1
  8. package/dist/analysis/page-understanding.d.ts.map +1 -1
  9. package/dist/analysis/page-understanding.js +179 -12
  10. package/dist/analysis/page-understanding.js.map +1 -1
  11. package/dist/artifact-store.d.ts +19 -5
  12. package/dist/artifact-store.d.ts.map +1 -1
  13. package/dist/artifact-store.js +41 -11
  14. package/dist/artifact-store.js.map +1 -1
  15. package/dist/browser.d.ts +9 -0
  16. package/dist/browser.d.ts.map +1 -1
  17. package/dist/browser.js +81 -5
  18. package/dist/browser.js.map +1 -1
  19. package/dist/cli.js +55 -10
  20. package/dist/cli.js.map +1 -1
  21. package/dist/cognitive/index.d.ts.map +1 -1
  22. package/dist/cognitive/index.js +3 -2
  23. package/dist/cognitive/index.js.map +1 -1
  24. package/dist/config.d.ts +57 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +234 -7
  27. package/dist/config.js.map +1 -1
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/mcp-server-remote.d.ts.map +1 -1
  31. package/dist/mcp-server-remote.js +108 -4
  32. package/dist/mcp-server-remote.js.map +1 -1
  33. package/dist/mcp-server.d.ts.map +1 -1
  34. package/dist/mcp-server.js +62 -938
  35. package/dist/mcp-server.js.map +1 -1
  36. package/dist/mcp-tools/account-personas.d.ts +41 -0
  37. package/dist/mcp-tools/account-personas.d.ts.map +1 -0
  38. package/dist/mcp-tools/account-personas.js +98 -0
  39. package/dist/mcp-tools/account-personas.js.map +1 -0
  40. package/dist/mcp-tools/base/analysis-tools.d.ts.map +1 -1
  41. package/dist/mcp-tools/base/analysis-tools.js +12 -2
  42. package/dist/mcp-tools/base/analysis-tools.js.map +1 -1
  43. package/dist/mcp-tools/base/artifact-tools.d.ts +3 -0
  44. package/dist/mcp-tools/base/artifact-tools.d.ts.map +1 -0
  45. package/dist/mcp-tools/base/artifact-tools.js +78 -0
  46. package/dist/mcp-tools/base/artifact-tools.js.map +1 -0
  47. package/dist/mcp-tools/base/audit-tools.d.ts +11 -0
  48. package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
  49. package/dist/mcp-tools/base/audit-tools.js +595 -340
  50. package/dist/mcp-tools/base/audit-tools.js.map +1 -1
  51. package/dist/mcp-tools/base/browser-management-tools.d.ts.map +1 -1
  52. package/dist/mcp-tools/base/browser-management-tools.js +18 -0
  53. package/dist/mcp-tools/base/browser-management-tools.js.map +1 -1
  54. package/dist/mcp-tools/base/bug-analysis-tools.d.ts.map +1 -1
  55. package/dist/mcp-tools/base/bug-analysis-tools.js +59 -3
  56. package/dist/mcp-tools/base/bug-analysis-tools.js.map +1 -1
  57. package/dist/mcp-tools/base/capture-tools.d.ts +37 -0
  58. package/dist/mcp-tools/base/capture-tools.d.ts.map +1 -1
  59. package/dist/mcp-tools/base/capture-tools.js +267 -6
  60. package/dist/mcp-tools/base/capture-tools.js.map +1 -1
  61. package/dist/mcp-tools/base/cognitive-tools.d.ts +12 -0
  62. package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
  63. package/dist/mcp-tools/base/cognitive-tools.js +63 -15
  64. package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
  65. package/dist/mcp-tools/base/extraction-tools.d.ts.map +1 -1
  66. package/dist/mcp-tools/base/extraction-tools.js +33 -2
  67. package/dist/mcp-tools/base/extraction-tools.js.map +1 -1
  68. package/dist/mcp-tools/base/index.d.ts +2 -0
  69. package/dist/mcp-tools/base/index.d.ts.map +1 -1
  70. package/dist/mcp-tools/base/index.js +9 -0
  71. package/dist/mcp-tools/base/index.js.map +1 -1
  72. package/dist/mcp-tools/base/marketing-tools.js +3 -3
  73. package/dist/mcp-tools/base/marketing-tools.js.map +1 -1
  74. package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
  75. package/dist/mcp-tools/base/persona-comparison-tools.js +529 -40
  76. package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
  77. package/dist/mcp-tools/base/site-knowledge-tools.d.ts.map +1 -1
  78. package/dist/mcp-tools/base/site-knowledge-tools.js +36 -3
  79. package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
  80. package/dist/mcp-tools/base/values-tools.d.ts +113 -0
  81. package/dist/mcp-tools/base/values-tools.d.ts.map +1 -1
  82. package/dist/mcp-tools/base/values-tools.js +868 -78
  83. package/dist/mcp-tools/base/values-tools.js.map +1 -1
  84. package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
  85. package/dist/mcp-tools/base/visual-testing-tools.js +130 -10
  86. package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
  87. package/dist/mcp-tools/index.d.ts +3 -1
  88. package/dist/mcp-tools/index.d.ts.map +1 -1
  89. package/dist/mcp-tools/index.js +3 -28
  90. package/dist/mcp-tools/index.js.map +1 -1
  91. package/dist/mcp-tools/persona-creation-tools.d.ts.map +1 -1
  92. package/dist/mcp-tools/persona-creation-tools.js +363 -20
  93. package/dist/mcp-tools/persona-creation-tools.js.map +1 -1
  94. package/dist/mcp-tools/persona-lifecycle-tools.d.ts +3 -0
  95. package/dist/mcp-tools/persona-lifecycle-tools.d.ts.map +1 -0
  96. package/dist/mcp-tools/persona-lifecycle-tools.js +406 -0
  97. package/dist/mcp-tools/persona-lifecycle-tools.js.map +1 -0
  98. package/dist/mcp-tools/screenshot-utils.d.ts.map +1 -1
  99. package/dist/mcp-tools/screenshot-utils.js +56 -10
  100. package/dist/mcp-tools/screenshot-utils.js.map +1 -1
  101. package/dist/mcp-tools/tier-gate.js +2 -2
  102. package/dist/mcp-tools/tier-gate.js.map +1 -1
  103. package/dist/mcp-tools/tool-categories.d.ts.map +1 -1
  104. package/dist/mcp-tools/tool-categories.js +4 -1
  105. package/dist/mcp-tools/tool-categories.js.map +1 -1
  106. package/dist/mcp-tools/ui-resources.d.ts +167 -0
  107. package/dist/mcp-tools/ui-resources.d.ts.map +1 -0
  108. package/dist/mcp-tools/ui-resources.js +707 -0
  109. package/dist/mcp-tools/ui-resources.js.map +1 -0
  110. package/dist/mcp-tools/widget-kit.d.ts +299 -0
  111. package/dist/mcp-tools/widget-kit.d.ts.map +1 -0
  112. package/dist/mcp-tools/widget-kit.js +2034 -0
  113. package/dist/mcp-tools/widget-kit.js.map +1 -0
  114. package/dist/mcp-ui-resources.d.ts.map +1 -1
  115. package/dist/mcp-ui-resources.js +14 -4
  116. package/dist/mcp-ui-resources.js.map +1 -1
  117. package/dist/persona-questionnaire.d.ts +69 -1
  118. package/dist/persona-questionnaire.d.ts.map +1 -1
  119. package/dist/persona-questionnaire.js +177 -76
  120. package/dist/persona-questionnaire.js.map +1 -1
  121. package/dist/persona-scope.d.ts +20 -0
  122. package/dist/persona-scope.d.ts.map +1 -0
  123. package/dist/persona-scope.js +59 -0
  124. package/dist/persona-scope.js.map +1 -0
  125. package/dist/personas.d.ts +51 -17
  126. package/dist/personas.d.ts.map +1 -1
  127. package/dist/personas.js +947 -286
  128. package/dist/personas.js.map +1 -1
  129. package/dist/recording/capture-player.d.ts +68 -0
  130. package/dist/recording/capture-player.d.ts.map +1 -0
  131. package/dist/recording/capture-player.js +298 -0
  132. package/dist/recording/capture-player.js.map +1 -0
  133. package/dist/recording/engine.d.ts +52 -0
  134. package/dist/recording/engine.d.ts.map +1 -1
  135. package/dist/recording/engine.js +241 -3
  136. package/dist/recording/engine.js.map +1 -1
  137. package/dist/recording/inline-player.d.ts +39 -0
  138. package/dist/recording/inline-player.d.ts.map +1 -0
  139. package/dist/recording/inline-player.js +272 -0
  140. package/dist/recording/inline-player.js.map +1 -0
  141. package/dist/recording/saliency-overlay.d.ts +133 -0
  142. package/dist/recording/saliency-overlay.d.ts.map +1 -0
  143. package/dist/recording/saliency-overlay.js +360 -0
  144. package/dist/recording/saliency-overlay.js.map +1 -0
  145. package/dist/recording/types.d.ts +32 -0
  146. package/dist/recording/types.d.ts.map +1 -1
  147. package/dist/recording/types.js +46 -0
  148. package/dist/recording/types.js.map +1 -1
  149. package/dist/site-model/manager.d.ts +20 -0
  150. package/dist/site-model/manager.d.ts.map +1 -1
  151. package/dist/site-model/manager.js +52 -0
  152. package/dist/site-model/manager.js.map +1 -1
  153. package/dist/trait-reference.d.ts +26 -2
  154. package/dist/trait-reference.d.ts.map +1 -1
  155. package/dist/trait-reference.js +129 -19
  156. package/dist/trait-reference.js.map +1 -1
  157. package/dist/types.d.ts +105 -18
  158. package/dist/types.d.ts.map +1 -1
  159. package/dist/types.js.map +1 -1
  160. package/dist/url-resolution.d.ts +58 -0
  161. package/dist/url-resolution.d.ts.map +1 -0
  162. package/dist/url-resolution.js +143 -0
  163. package/dist/url-resolution.js.map +1 -0
  164. package/dist/values/big-five-inference.d.ts +121 -0
  165. package/dist/values/big-five-inference.d.ts.map +1 -0
  166. package/dist/values/big-five-inference.js +241 -0
  167. package/dist/values/big-five-inference.js.map +1 -0
  168. package/dist/values/big-five-values.d.ts +76 -0
  169. package/dist/values/big-five-values.d.ts.map +1 -0
  170. package/dist/values/big-five-values.js +152 -0
  171. package/dist/values/big-five-values.js.map +1 -0
  172. package/dist/values/index.d.ts +1 -1
  173. package/dist/values/index.d.ts.map +1 -1
  174. package/dist/values/index.js +1 -1
  175. package/dist/values/index.js.map +1 -1
  176. package/dist/values/persona-completeness.d.ts +91 -0
  177. package/dist/values/persona-completeness.d.ts.map +1 -0
  178. package/dist/values/persona-completeness.js +114 -0
  179. package/dist/values/persona-completeness.js.map +1 -0
  180. package/dist/values/persona-diff.d.ts +50 -0
  181. package/dist/values/persona-diff.d.ts.map +1 -0
  182. package/dist/values/persona-diff.js +126 -0
  183. package/dist/values/persona-diff.js.map +1 -0
  184. package/dist/values/persona-values.d.ts +16 -0
  185. package/dist/values/persona-values.d.ts.map +1 -1
  186. package/dist/values/persona-values.js +33 -0
  187. package/dist/values/persona-values.js.map +1 -1
  188. package/dist/values/schwartz-values.d.ts +9 -1
  189. package/dist/values/schwartz-values.d.ts.map +1 -1
  190. package/dist/values/schwartz-values.js +10 -2
  191. package/dist/values/schwartz-values.js.map +1 -1
  192. package/dist/values/value-mappings.d.ts +41 -2
  193. package/dist/values/value-mappings.d.ts.map +1 -1
  194. package/dist/values/value-mappings.js +65 -8
  195. package/dist/values/value-mappings.js.map +1 -1
  196. package/dist/visual/attention-quality.d.ts +27 -0
  197. package/dist/visual/attention-quality.d.ts.map +1 -1
  198. package/dist/visual/attention-quality.js +164 -2
  199. package/dist/visual/attention-quality.js.map +1 -1
  200. package/dist/visual/attention-transport.d.ts +41 -2
  201. package/dist/visual/attention-transport.d.ts.map +1 -1
  202. package/dist/visual/attention-transport.js +98 -26
  203. package/dist/visual/attention-transport.js.map +1 -1
  204. package/dist/visual/barrier-overlay-html.d.ts +10 -0
  205. package/dist/visual/barrier-overlay-html.d.ts.map +1 -1
  206. package/dist/visual/barrier-overlay-html.js.map +1 -1
  207. package/dist/visual/cognitive-models.d.ts +109 -13
  208. package/dist/visual/cognitive-models.d.ts.map +1 -1
  209. package/dist/visual/cognitive-models.js +166 -3
  210. package/dist/visual/cognitive-models.js.map +1 -1
  211. package/dist/visual/cognitive-transport-chain.d.ts +149 -5
  212. package/dist/visual/cognitive-transport-chain.d.ts.map +1 -1
  213. package/dist/visual/cognitive-transport-chain.js +558 -30
  214. package/dist/visual/cognitive-transport-chain.js.map +1 -1
  215. package/dist/visual/cognitive-transport.d.ts +45 -3
  216. package/dist/visual/cognitive-transport.d.ts.map +1 -1
  217. package/dist/visual/cognitive-transport.js +126 -12
  218. package/dist/visual/cognitive-transport.js.map +1 -1
  219. package/dist/visual/fixation-corpus.d.ts +52 -0
  220. package/dist/visual/fixation-corpus.d.ts.map +1 -1
  221. package/dist/visual/fixation-corpus.js +95 -0
  222. package/dist/visual/fixation-corpus.js.map +1 -1
  223. package/dist/visual/llm-relevance.d.ts +193 -0
  224. package/dist/visual/llm-relevance.d.ts.map +1 -0
  225. package/dist/visual/llm-relevance.js +480 -0
  226. package/dist/visual/llm-relevance.js.map +1 -0
  227. package/dist/visual/perceptual-transport.d.ts +60 -0
  228. package/dist/visual/perceptual-transport.d.ts.map +1 -1
  229. package/dist/visual/perceptual-transport.js +228 -19
  230. package/dist/visual/perceptual-transport.js.map +1 -1
  231. package/dist/visual/persona-context.d.ts +23 -0
  232. package/dist/visual/persona-context.d.ts.map +1 -0
  233. package/dist/visual/persona-context.js +44 -0
  234. package/dist/visual/persona-context.js.map +1 -0
  235. 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 25 traits (default: 8 core traits)
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: 30_000 });
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 25 traits (default: 8 core traits)
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
- answers[q.trait] = q.options[idx].value;
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
  }