@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.
- package/README.md +3 -1
- package/docs/api-reference.md +33 -33
- package/docs/mcp-vs-cli.md +104 -104
- package/docs/publishing.md +1 -3
- package/docs/quickstart.md +6 -6
- package/docs/unpacked-extension.md +72 -0
- package/manifest.json +3 -17
- package/package.json +44 -42
- package/packages/agent-client/src/cli-helpers.js +10 -5
- package/packages/agent-client/src/cli.js +65 -135
- package/packages/agent-client/src/client.js +37 -17
- package/packages/agent-client/src/command-registry.js +101 -69
- package/packages/agent-client/src/detect.js +3 -6
- package/packages/agent-client/src/install.js +10 -27
- package/packages/agent-client/src/mcp-config.js +11 -30
- package/packages/agent-client/src/runtime.js +41 -20
- package/packages/agent-client/src/setup-status.js +13 -28
- package/packages/extension/src/background-helpers.js +51 -36
- package/packages/extension/src/background-routing.js +11 -13
- package/packages/extension/src/background.js +562 -299
- package/packages/extension/src/content-script-helpers.js +17 -16
- package/packages/extension/src/content-script.js +175 -109
- package/packages/extension/src/sidepanel-helpers.js +3 -1
- package/packages/extension/ui/popup.js +39 -20
- package/packages/extension/ui/sidepanel.js +108 -191
- package/packages/extension/ui/ui.css +2 -1
- package/packages/mcp-server/src/handlers.js +546 -250
- package/packages/mcp-server/src/server.js +558 -257
- package/packages/native-host/bin/bridge-daemon.js +6 -2
- package/packages/native-host/bin/install-manifest.js +2 -2
- package/packages/native-host/bin/postinstall.js +4 -2
- package/packages/native-host/src/config.js +11 -7
- package/packages/native-host/src/daemon.js +143 -92
- package/packages/native-host/src/install-manifest.js +73 -22
- package/packages/native-host/src/native-host.js +55 -40
- package/packages/protocol/src/budget.js +3 -7
- package/packages/protocol/src/capabilities.js +3 -3
- package/packages/protocol/src/errors.js +11 -11
- package/packages/protocol/src/protocol.js +104 -71
- package/packages/protocol/src/registry.js +300 -45
- package/packages/protocol/src/summary.js +249 -106
- package/packages/protocol/src/types.js +1 -1
- package/skills/browser-bridge/SKILL.md +1 -1
- package/skills/browser-bridge/agents/openai.yaml +3 -3
- package/skills/browser-bridge/references/interaction.md +33 -11
- package/skills/browser-bridge/references/patch-workflow.md +3 -0
- package/skills/browser-bridge/references/protocol.md +125 -70
- package/skills/browser-bridge/references/tailwind.md +12 -11
- package/skills/browser-bridge/references/token-efficiency.md +23 -22
- package/skills/browser-bridge/references/ui-workflows.md +8 -0
- package/packages/extension/ui/offscreen.html +0 -6
- 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 (
|
|
184
|
-
|
|
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 =
|
|
188
|
-
|
|
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(
|
|
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:
|
|
200
|
-
|
|
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:
|
|
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:
|
|
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(
|
|
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
|
-
|
|
319
|
-
|
|
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:
|
|
377
|
-
|
|
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:
|
|
382
|
-
|
|
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 =
|
|
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:
|
|
599
|
-
|
|
600
|
-
|
|
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: {
|
|
645
|
-
|
|
646
|
-
|
|
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:
|
|
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
|
-
|
|
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: {
|
|
703
|
-
|
|
731
|
+
pageTextBudget: {
|
|
732
|
+
min: 100,
|
|
733
|
+
max: 100000,
|
|
734
|
+
default: DEFAULT_PAGE_TEXT_BUDGET,
|
|
735
|
+
},
|
|
736
|
+
},
|
|
704
737
|
};
|
|
705
738
|
}
|