@browserbridge/bbx 1.0.0 → 1.0.1

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 (52) hide show
  1. package/README.md +3 -1
  2. package/docs/api-reference.md +33 -33
  3. package/docs/mcp-vs-cli.md +104 -104
  4. package/docs/publishing.md +1 -3
  5. package/docs/quickstart.md +6 -6
  6. package/docs/unpacked-extension.md +72 -0
  7. package/manifest.json +3 -17
  8. package/package.json +44 -42
  9. package/packages/agent-client/src/cli-helpers.js +10 -5
  10. package/packages/agent-client/src/cli.js +65 -135
  11. package/packages/agent-client/src/client.js +37 -17
  12. package/packages/agent-client/src/command-registry.js +101 -69
  13. package/packages/agent-client/src/detect.js +3 -6
  14. package/packages/agent-client/src/install.js +10 -27
  15. package/packages/agent-client/src/mcp-config.js +11 -30
  16. package/packages/agent-client/src/runtime.js +41 -20
  17. package/packages/agent-client/src/setup-status.js +13 -28
  18. package/packages/extension/src/background-helpers.js +51 -36
  19. package/packages/extension/src/background-routing.js +11 -13
  20. package/packages/extension/src/background.js +562 -299
  21. package/packages/extension/src/content-script-helpers.js +17 -16
  22. package/packages/extension/src/content-script.js +175 -109
  23. package/packages/extension/src/sidepanel-helpers.js +3 -1
  24. package/packages/extension/ui/popup.js +39 -20
  25. package/packages/extension/ui/sidepanel.js +108 -191
  26. package/packages/extension/ui/ui.css +2 -1
  27. package/packages/mcp-server/src/handlers.js +546 -250
  28. package/packages/mcp-server/src/server.js +558 -257
  29. package/packages/native-host/bin/bridge-daemon.js +6 -2
  30. package/packages/native-host/bin/install-manifest.js +2 -2
  31. package/packages/native-host/bin/postinstall.js +4 -2
  32. package/packages/native-host/src/config.js +11 -7
  33. package/packages/native-host/src/daemon.js +143 -92
  34. package/packages/native-host/src/install-manifest.js +73 -22
  35. package/packages/native-host/src/native-host.js +55 -40
  36. package/packages/protocol/src/budget.js +3 -7
  37. package/packages/protocol/src/capabilities.js +3 -3
  38. package/packages/protocol/src/errors.js +11 -11
  39. package/packages/protocol/src/protocol.js +104 -71
  40. package/packages/protocol/src/registry.js +300 -45
  41. package/packages/protocol/src/summary.js +249 -106
  42. package/packages/protocol/src/types.js +1 -1
  43. package/skills/browser-bridge/SKILL.md +1 -1
  44. package/skills/browser-bridge/agents/openai.yaml +3 -3
  45. package/skills/browser-bridge/references/interaction.md +33 -11
  46. package/skills/browser-bridge/references/patch-workflow.md +3 -0
  47. package/skills/browser-bridge/references/protocol.md +125 -70
  48. package/skills/browser-bridge/references/tailwind.md +12 -11
  49. package/skills/browser-bridge/references/token-efficiency.md +23 -22
  50. package/skills/browser-bridge/references/ui-workflows.md +8 -0
  51. package/packages/extension/ui/offscreen.html +0 -6
  52. package/packages/extension/ui/offscreen.js +0 -61
@@ -114,8 +114,8 @@ export function createRequest({ id, method, tabId = null, params = {}, meta = {}
114
114
  params,
115
115
  meta: {
116
116
  protocol_version: PROTOCOL_VERSION,
117
- ...meta
118
- }
117
+ ...meta,
118
+ },
119
119
  });
120
120
  }
121
121
 
@@ -133,8 +133,8 @@ export function createSuccess(id, result, meta = {}) {
133
133
  error: null,
134
134
  meta: {
135
135
  protocol_version: PROTOCOL_VERSION,
136
- ...meta
137
- }
136
+ ...meta,
137
+ },
138
138
  };
139
139
  }
140
140
 
@@ -156,12 +156,12 @@ export function createFailure(id, code, message, details = null, meta = {}) {
156
156
  code,
157
157
  message,
158
158
  details,
159
- ...(recovery && { recovery })
159
+ ...(recovery && { recovery }),
160
160
  },
161
161
  meta: {
162
162
  protocol_version: PROTOCOL_VERSION,
163
- ...meta
164
- }
163
+ ...meta,
164
+ },
165
165
  };
166
166
  }
167
167
 
@@ -180,15 +180,25 @@ export function validateBridgeRequest(request) {
180
180
  throw new BridgeError(ERROR_CODES.INVALID_REQUEST, 'Request id must be a non-empty string.');
181
181
  }
182
182
 
183
- if (typeof candidate.method !== 'string' || !METHODS.includes(/** @type {BridgeMethod} */ (candidate.method))) {
184
- throw new BridgeError(ERROR_CODES.INVALID_REQUEST, `Unsupported method: ${String(candidate.method)}`);
183
+ if (
184
+ typeof candidate.method !== 'string' ||
185
+ !METHODS.includes(/** @type {BridgeMethod} */ (candidate.method))
186
+ ) {
187
+ throw new BridgeError(
188
+ ERROR_CODES.INVALID_REQUEST,
189
+ `Unsupported method: ${String(candidate.method)}`
190
+ );
185
191
  }
186
192
 
187
- const meta = candidate.meta && typeof candidate.meta === 'object'
188
- ? /** @type {Record<string, unknown>} */ (candidate.meta)
189
- : {};
193
+ const meta =
194
+ candidate.meta && typeof candidate.meta === 'object'
195
+ ? /** @type {Record<string, unknown>} */ (candidate.meta)
196
+ : {};
190
197
  if (candidate.session_id != null) {
191
- throw new BridgeError(ERROR_CODES.INVALID_REQUEST, 'session_id is no longer supported. Use tab_id or window-scoped default routing.');
198
+ throw new BridgeError(
199
+ ERROR_CODES.INVALID_REQUEST,
200
+ 'session_id is no longer supported. Use tab_id or window-scoped default routing.'
201
+ );
192
202
  }
193
203
  const parsedTabId = Number(candidate.tab_id);
194
204
 
@@ -196,17 +206,17 @@ export function validateBridgeRequest(request) {
196
206
  id: candidate.id,
197
207
  method: /** @type {BridgeMethod} */ (candidate.method),
198
208
  tab_id: Number.isFinite(parsedTabId) && parsedTabId > 0 ? parsedTabId : null,
199
- params: candidate.params && typeof candidate.params === 'object'
200
- ? /** @type {Record<string, unknown>} */ (candidate.params)
201
- : {},
209
+ params:
210
+ candidate.params && typeof candidate.params === 'object'
211
+ ? /** @type {Record<string, unknown>} */ (candidate.params)
212
+ : {},
202
213
  meta: {
203
214
  ...meta,
204
- protocol_version: typeof meta.protocol_version === 'string'
205
- ? meta.protocol_version
206
- : PROTOCOL_VERSION,
215
+ protocol_version:
216
+ typeof meta.protocol_version === 'string' ? meta.protocol_version : PROTOCOL_VERSION,
207
217
  token_budget: typeof meta.token_budget === 'number' ? meta.token_budget : null,
208
- source: meta.source === 'cli' || meta.source === 'mcp' ? meta.source : undefined
209
- }
218
+ source: meta.source === 'cli' || meta.source === 'mcp' ? meta.source : undefined,
219
+ },
210
220
  };
211
221
  }
212
222
 
@@ -216,9 +226,10 @@ export function validateBridgeRequest(request) {
216
226
  */
217
227
  export function normalizeDomQuery(params = {}) {
218
228
  return {
219
- selector: typeof params.selector === 'string' && params.selector.trim() ? params.selector : 'body',
229
+ selector:
230
+ typeof params.selector === 'string' && params.selector.trim() ? params.selector : 'body',
220
231
  withinRef: typeof params.withinRef === 'string' ? params.withinRef : null,
221
- budget: applyBudget(params)
232
+ budget: applyBudget(params),
222
233
  };
223
234
  }
224
235
 
@@ -234,12 +245,15 @@ export function normalizeStyleQuery(params = {}) {
234
245
  );
235
246
  const elementRef = String(params.elementRef || target.elementRef || '');
236
247
  if (!elementRef && !target.selector) {
237
- throw new BridgeError(ERROR_CODES.INVALID_REQUEST, 'elementRef or target is required for style queries.');
248
+ throw new BridgeError(
249
+ ERROR_CODES.INVALID_REQUEST,
250
+ 'elementRef or target is required for style queries.'
251
+ );
238
252
  }
239
253
  return {
240
254
  elementRef,
241
255
  target,
242
- properties: Array.isArray(params.properties) ? params.properties.filter(Boolean) : []
256
+ properties: Array.isArray(params.properties) ? params.properties.filter(Boolean) : [],
243
257
  };
244
258
  }
245
259
 
@@ -250,7 +264,7 @@ export function normalizeStyleQuery(params = {}) {
250
264
  function normalizeTarget(target) {
251
265
  return {
252
266
  elementRef: typeof target?.elementRef === 'string' ? target.elementRef : undefined,
253
- selector: typeof target?.selector === 'string' ? target.selector : undefined
267
+ selector: typeof target?.selector === 'string' ? target.selector : undefined,
254
268
  };
255
269
  }
256
270
 
@@ -259,9 +273,7 @@ function normalizeTarget(target) {
259
273
  * @returns {NormalizedInputAction}
260
274
  */
261
275
  export function normalizeInputAction(params = {}) {
262
- const button = params.button === 'middle' || params.button === 'right'
263
- ? params.button
264
- : 'left';
276
+ const button = params.button === 'middle' || params.button === 'right' ? params.button : 'left';
265
277
 
266
278
  return {
267
279
  target: normalizeTarget(
@@ -277,7 +289,7 @@ export function normalizeInputAction(params = {}) {
277
289
  key: typeof params.key === 'string' ? params.key : '',
278
290
  modifiers: Array.isArray(params.modifiers)
279
291
  ? params.modifiers.filter((modifier) => typeof modifier === 'string' && modifier.trim())
280
- : []
292
+ : [],
281
293
  };
282
294
  }
283
295
 
@@ -292,7 +304,7 @@ export function normalizeCheckedAction(params = {}) {
292
304
  ? /** @type {{ elementRef?: string, selector?: string }} */ (params.target)
293
305
  : undefined
294
306
  ),
295
- checked: params.checked !== false
307
+ checked: params.checked !== false,
296
308
  };
297
309
  }
298
310
 
@@ -315,9 +327,9 @@ export function normalizeSelectAction(params = {}) {
315
327
  : [],
316
328
  indexes: Array.isArray(params.indexes)
317
329
  ? params.indexes
318
- .map((index) => Number(index))
319
- .filter((index) => Number.isInteger(index) && index >= 0)
320
- : []
330
+ .map((index) => Number(index))
331
+ .filter((index) => Number.isInteger(index) && index >= 0)
332
+ : [],
321
333
  };
322
334
  }
323
335
 
@@ -335,7 +347,7 @@ export function normalizeViewportAction(params = {}) {
335
347
  top: Number.isFinite(Number(params.top)) ? Number(params.top) : 0,
336
348
  left: Number.isFinite(Number(params.left)) ? Number(params.left) : 0,
337
349
  behavior: params.behavior === 'smooth' ? 'smooth' : 'auto',
338
- relative: Boolean(params.relative)
350
+ relative: Boolean(params.relative),
339
351
  };
340
352
  }
341
353
 
@@ -362,7 +374,7 @@ export function normalizeNavigationAction(params = {}) {
362
374
  return {
363
375
  url,
364
376
  waitForLoad: params.waitForLoad !== false,
365
- timeoutMs: clampInt(params.timeoutMs, 500, 120_000, 15_000)
377
+ timeoutMs: clampInt(params.timeoutMs, 500, 120_000, 15_000),
366
378
  };
367
379
  }
368
380
 
@@ -373,17 +385,19 @@ export function normalizeNavigationAction(params = {}) {
373
385
  export function normalizePatchOperation(params = {}) {
374
386
  return {
375
387
  patchId: typeof params.patchId === 'string' ? params.patchId : null,
376
- target: params.target && typeof params.target === 'object'
377
- ? /** @type {Record<string, unknown>} */ (params.target)
378
- : {},
388
+ target:
389
+ params.target && typeof params.target === 'object'
390
+ ? /** @type {Record<string, unknown>} */ (params.target)
391
+ : {},
379
392
  operation: typeof params.operation === 'string' ? params.operation : null,
380
393
  name: typeof params.name === 'string' ? params.name : null,
381
- declarations: params.declarations && typeof params.declarations === 'object'
382
- ? /** @type {Record<string, string>} */ (params.declarations)
383
- : {},
394
+ declarations:
395
+ params.declarations && typeof params.declarations === 'object'
396
+ ? /** @type {Record<string, string>} */ (params.declarations)
397
+ : {},
384
398
  value: params.value ?? null,
385
399
  important: Boolean(params.important),
386
- verify: Boolean(params.verify)
400
+ verify: Boolean(params.verify),
387
401
  };
388
402
  }
389
403
 
@@ -403,7 +417,7 @@ export function normalizeEvaluateParams(params = {}) {
403
417
  expression,
404
418
  awaitPromise: Boolean(params.awaitPromise),
405
419
  timeoutMs: clampInt(params.timeoutMs, 100, 30_000, 5_000),
406
- returnByValue: params.returnByValue !== false
420
+ returnByValue: params.returnByValue !== false,
407
421
  };
408
422
  }
409
423
 
@@ -416,7 +430,7 @@ export function normalizeConsoleParams(params = {}) {
416
430
  return {
417
431
  level: validLevels.includes(String(params.level ?? '')) ? String(params.level) : 'all',
418
432
  clear: Boolean(params.clear),
419
- limit: clampInt(params.limit, 1, 200, 50)
433
+ limit: clampInt(params.limit, 1, 200, 50),
420
434
  };
421
435
  }
422
436
 
@@ -432,7 +446,7 @@ export function normalizeWaitForParams(params = {}) {
432
446
  state: validStates.includes(String(params.state ?? ''))
433
447
  ? /** @type {'attached' | 'detached' | 'visible' | 'hidden'} */ (String(params.state))
434
448
  : 'attached',
435
- timeoutMs: clampInt(params.timeoutMs, 100, 30_000, 5_000)
449
+ timeoutMs: clampInt(params.timeoutMs, 100, 30_000, 5_000),
436
450
  };
437
451
  }
438
452
 
@@ -445,7 +459,7 @@ export function normalizeFindByTextParams(params = {}) {
445
459
  text: typeof params.text === 'string' ? params.text : '',
446
460
  exact: Boolean(params.exact),
447
461
  selector: typeof params.selector === 'string' && params.selector.trim() ? params.selector : '*',
448
- maxResults: clampInt(params.maxResults, 1, 50, 10)
462
+ maxResults: clampInt(params.maxResults, 1, 50, 10),
449
463
  };
450
464
  }
451
465
 
@@ -458,7 +472,7 @@ export function normalizeFindByRoleParams(params = {}) {
458
472
  role: typeof params.role === 'string' ? params.role : '',
459
473
  name: typeof params.name === 'string' ? params.name : '',
460
474
  selector: typeof params.selector === 'string' && params.selector.trim() ? params.selector : '*',
461
- maxResults: clampInt(params.maxResults, 1, 50, 10)
475
+ maxResults: clampInt(params.maxResults, 1, 50, 10),
462
476
  };
463
477
  }
464
478
 
@@ -476,7 +490,7 @@ export function normalizeGetHtmlParams(params = {}) {
476
490
  elementRef: String(params.elementRef || target.elementRef || ''),
477
491
  target,
478
492
  outer: Boolean(params.outer),
479
- maxLength: clampInt(params.maxLength, 32, 50_000, 2000)
493
+ maxLength: clampInt(params.maxLength, 32, 50_000, 2000),
480
494
  };
481
495
  }
482
496
 
@@ -491,7 +505,7 @@ export function normalizeHoverParams(params = {}) {
491
505
  ? /** @type {{ elementRef?: string, selector?: string }} */ (params.target)
492
506
  : undefined
493
507
  ),
494
- duration: clampInt(params.duration, 0, 5_000, 0)
508
+ duration: clampInt(params.duration, 0, 5_000, 0),
495
509
  };
496
510
  }
497
511
 
@@ -512,7 +526,7 @@ export function normalizeDragParams(params = {}) {
512
526
  : undefined
513
527
  ),
514
528
  offsetX: Number.isFinite(Number(params.offsetX)) ? Number(params.offsetX) : 0,
515
- offsetY: Number.isFinite(Number(params.offsetY)) ? Number(params.offsetY) : 0
529
+ offsetY: Number.isFinite(Number(params.offsetY)) ? Number(params.offsetY) : 0,
516
530
  };
517
531
  }
518
532
 
@@ -523,7 +537,7 @@ export function normalizeDragParams(params = {}) {
523
537
  export function normalizeStorageParams(params = {}) {
524
538
  return {
525
539
  type: params.type === 'session' ? 'session' : 'local',
526
- keys: Array.isArray(params.keys) ? params.keys.filter((k) => typeof k === 'string') : null
540
+ keys: Array.isArray(params.keys) ? params.keys.filter((k) => typeof k === 'string') : null,
527
541
  };
528
542
  }
529
543
 
@@ -534,7 +548,7 @@ export function normalizeStorageParams(params = {}) {
534
548
  export function normalizeWaitForLoadStateParams(params = {}) {
535
549
  return {
536
550
  waitForLoad: params.waitForLoad !== false,
537
- timeoutMs: clampInt(params.timeoutMs, 500, 120_000, 15_000)
551
+ timeoutMs: clampInt(params.timeoutMs, 500, 120_000, 15_000),
538
552
  };
539
553
  }
540
554
 
@@ -543,7 +557,8 @@ export function normalizeWaitForLoadStateParams(params = {}) {
543
557
  * @returns {NormalizedTabCreateParams}
544
558
  */
545
559
  export function normalizeTabCreateParams(params = {}) {
546
- const url = typeof params.url === 'string' && params.url.trim() ? params.url.trim() : 'about:blank';
560
+ const url =
561
+ typeof params.url === 'string' && params.url.trim() ? params.url.trim() : 'about:blank';
547
562
  if (url !== 'about:blank') {
548
563
  try {
549
564
  const parsed = new URL(url);
@@ -560,7 +575,7 @@ export function normalizeTabCreateParams(params = {}) {
560
575
  }
561
576
  return {
562
577
  url,
563
- active: params.active !== false
578
+ active: params.active !== false,
564
579
  };
565
580
  }
566
581
 
@@ -583,7 +598,7 @@ export function normalizeTabCloseParams(params = {}) {
583
598
  export function normalizeAccessibilityTreeParams(params = {}) {
584
599
  return {
585
600
  maxDepth: clampInt(params.maxDepth, 1, 20, DEFAULT_A11Y_MAX_DEPTH),
586
- maxNodes: clampInt(params.maxNodes, 10, 5000, DEFAULT_A11Y_MAX_NODES)
601
+ maxNodes: clampInt(params.maxNodes, 10, 5000, DEFAULT_A11Y_MAX_NODES),
587
602
  };
588
603
  }
589
604
 
@@ -595,9 +610,10 @@ export function normalizeNetworkParams(params = {}) {
595
610
  return {
596
611
  clear: Boolean(params.clear),
597
612
  limit: clampInt(params.limit, 1, 500, DEFAULT_NETWORK_LIMIT),
598
- urlPattern: typeof params.urlPattern === 'string' && params.urlPattern.trim()
599
- ? params.urlPattern.trim()
600
- : null
613
+ urlPattern:
614
+ typeof params.urlPattern === 'string' && params.urlPattern.trim()
615
+ ? params.urlPattern.trim()
616
+ : null,
601
617
  };
602
618
  }
603
619
 
@@ -607,7 +623,7 @@ export function normalizeNetworkParams(params = {}) {
607
623
  */
608
624
  export function normalizePageTextParams(params = {}) {
609
625
  return {
610
- textBudget: clampInt(params.textBudget, 100, 100_000, DEFAULT_PAGE_TEXT_BUDGET)
626
+ textBudget: clampInt(params.textBudget, 100, 100_000, DEFAULT_PAGE_TEXT_BUDGET),
611
627
  };
612
628
  }
613
629
 
@@ -620,7 +636,7 @@ export function normalizeViewportResizeParams(params = {}) {
620
636
  width: clampInt(params.width, 320, 7680, DEFAULT_VIEWPORT_WIDTH),
621
637
  height: clampInt(params.height, 200, 4320, DEFAULT_VIEWPORT_HEIGHT),
622
638
  deviceScaleFactor: clampInt(params.deviceScaleFactor, 0, 4, 0),
623
- reset: Boolean(params.reset)
639
+ reset: Boolean(params.reset),
624
640
  };
625
641
  }
626
642
 
@@ -641,24 +657,37 @@ export function createRuntimeContext() {
641
657
  return {
642
658
  v: PROTOCOL_VERSION,
643
659
  budgets: {
644
- quick: { n: BUDGET_PRESETS.quick.maxNodes, d: BUDGET_PRESETS.quick.maxDepth, t: BUDGET_PRESETS.quick.textBudget },
645
- normal: { n: BUDGET_PRESETS.normal.maxNodes, d: BUDGET_PRESETS.normal.maxDepth, t: BUDGET_PRESETS.normal.textBudget },
646
- deep: { n: BUDGET_PRESETS.deep.maxNodes, d: BUDGET_PRESETS.deep.maxDepth, t: BUDGET_PRESETS.deep.textBudget }
660
+ quick: {
661
+ n: BUDGET_PRESETS.quick.maxNodes,
662
+ d: BUDGET_PRESETS.quick.maxDepth,
663
+ t: BUDGET_PRESETS.quick.textBudget,
664
+ },
665
+ normal: {
666
+ n: BUDGET_PRESETS.normal.maxNodes,
667
+ d: BUDGET_PRESETS.normal.maxDepth,
668
+ t: BUDGET_PRESETS.normal.textBudget,
669
+ },
670
+ deep: {
671
+ n: BUDGET_PRESETS.deep.maxNodes,
672
+ d: BUDGET_PRESETS.deep.maxDepth,
673
+ t: BUDGET_PRESETS.deep.textBudget,
674
+ },
647
675
  },
648
676
  methods: methodGroups,
649
677
  errors: {
650
- ACCESS_DENIED: 'Browser Bridge is off for this window or the page is restricted; if access is off, the first denied call surfaces an Enable cue in the extension UI',
678
+ ACCESS_DENIED:
679
+ 'Browser Bridge is off for this window or the page is restricted; if access is off, the first denied call surfaces an Enable cue in the extension UI',
651
680
  TAB_MISMATCH: 'Tab closed or not found',
652
681
  ELEMENT_STALE: 'Element removed from DOM - re-query',
653
682
  INVALID_REQUEST: 'Malformed method or params',
654
683
  TIMEOUT: 'Operation exceeded time limit',
655
684
  RATE_LIMITED: 'Too many requests - back off',
656
685
  INTERNAL_ERROR: 'Unexpected extension error',
657
- EXTENSION_DISCONNECTED: 'Extension not connected to daemon - check Chrome'
686
+ EXTENSION_DISCONNECTED: 'Extension not connected to daemon - check Chrome',
658
687
  },
659
688
  tips: [
660
689
  'dom.query quick budget first; widen only if truncated',
661
- 'Reuse elementRef; don\'t re-query',
690
+ "Reuse elementRef; don't re-query",
662
691
  'Set attributeAllowlist for focused DOM reads',
663
692
  'patch.apply_styles before patch.apply_dom',
664
693
  'Verify with get_box_model not screenshots',
@@ -676,7 +705,7 @@ export function createRuntimeContext() {
676
705
  'performance.get_metrics for Core Web Vitals and load timing',
677
706
  'viewport.resize to test responsive layouts',
678
707
  'Prefer screenshot.capture_element, or a tight screenshot.capture_region when element capture cannot express the needed area',
679
- 'page.get_storage reads localStorage/sessionStorage without evaluate'
708
+ 'page.get_storage reads localStorage/sessionStorage without evaluate',
680
709
  ],
681
710
  flow: [
682
711
  'health.ping',
@@ -686,7 +715,7 @@ export function createRuntimeContext() {
686
715
  'patch.apply_styles',
687
716
  'layout.get_box_model',
688
717
  'page.get_console',
689
- 'patch.rollback'
718
+ 'patch.rollback',
690
719
  ],
691
720
  limits: {
692
721
  maxNodes: { min: 1, max: 250, default: DEFAULT_MAX_NODES },
@@ -699,7 +728,11 @@ export function createRuntimeContext() {
699
728
  a11yMaxNodes: { min: 10, max: 5000, default: DEFAULT_A11Y_MAX_NODES },
700
729
  networkLimit: { min: 1, max: 500, default: DEFAULT_NETWORK_LIMIT },
701
730
  consoleLimit: { min: 1, max: 200, default: DEFAULT_CONSOLE_LIMIT },
702
- pageTextBudget: { min: 100, max: 100000, default: DEFAULT_PAGE_TEXT_BUDGET }
703
- }
731
+ pageTextBudget: {
732
+ min: 100,
733
+ max: 100000,
734
+ default: DEFAULT_PAGE_TEXT_BUDGET,
735
+ },
736
+ },
704
737
  };
705
738
  }