@jobshimo/browser-link 0.14.0 → 0.15.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/agent-instructions/content.js +11 -0
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/auth/process-identity.d.ts +7 -0
- package/dist/auth/process-identity.js +56 -7
- package/dist/auth/process-identity.js.map +1 -1
- package/dist/extension/background.js +20 -239
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/inpage/builders.d.ts +70 -0
- package/dist/extension/inpage/builders.js +223 -0
- package/dist/extension/inpage/builders.js.map +1 -0
- package/dist/extension/inpage/deep-query.d.ts +40 -0
- package/dist/extension/inpage/deep-query.js +308 -0
- package/dist/extension/inpage/deep-query.js.map +1 -0
- package/dist/extension/inpage/dom-helpers.d.ts +22 -0
- package/dist/extension/inpage/dom-helpers.js +142 -0
- package/dist/extension/inpage/dom-helpers.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/tools/browser-definitions.js +16 -4
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.js +2 -2
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/package.json +1 -1
|
@@ -83,6 +83,17 @@ function body() {
|
|
|
83
83
|
' SILENTLY), applies visibility + ARIA checks, returns a stable',
|
|
84
84
|
' selector + viewport coords, and on multi-match returns up to 5',
|
|
85
85
|
' candidates with snippets for disambiguation.',
|
|
86
|
+
'- `snapshot`/`find`/`click`/`type` all pierce OPEN Shadow DOM roots and',
|
|
87
|
+
' same-origin iframes automatically — no special handling needed for',
|
|
88
|
+
' web components or in-page iframes. CLOSED shadow roots and',
|
|
89
|
+
' cross-origin iframes stay out of reach (no CDP workaround). If',
|
|
90
|
+
' `click` returns "Element covered by …", something else is on top of',
|
|
91
|
+
' the target — click or dismiss that element first, do not blindly',
|
|
92
|
+
' retry with `force:true`.',
|
|
93
|
+
'- A snapshot/find entry with `ambiguous: true` has a selector that',
|
|
94
|
+
' matches structurally-identical twins in other shadow roots/iframes',
|
|
95
|
+
' (no CSS syntax can scope to one root). It resolves first-match-wins:',
|
|
96
|
+
' use it in the SAME turn, and NEVER `browser.map.save` it.',
|
|
86
97
|
'- Trimming snapshot size → `browser.snapshot({ within_selector, only_interactive, exclude, max_interactive })`.',
|
|
87
98
|
' Filters are applied IN-page so the dropped material never travels back.',
|
|
88
99
|
' Pass `exclude:["nav","footer"]` to skip repeated landmarks; pass',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/agent-instructions/content.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/agent-instructions/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,3 +33,10 @@ export declare function parseLsofOutput(out: string, host: string, port: number)
|
|
|
33
33
|
export declare function decodeLsofString(s: string): string;
|
|
34
34
|
export declare function parseNetstatForLocal(out: string, host: string, port: number): number | null;
|
|
35
35
|
export declare function parseTasklistImage(out: string): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Parse `(Get-Process -Id <pid>).ProcessName` output: a single line carrying
|
|
38
|
+
* the image name minus its extension. We re-add `.exe` so the result matches
|
|
39
|
+
* the win32 allowlist (`chrome.exe`, ...). Returns the first non-empty line,
|
|
40
|
+
* or null when the process could not be found (empty output).
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseGetProcessName(out: string): string | null;
|
|
@@ -2,7 +2,10 @@ import { exec } from 'node:child_process';
|
|
|
2
2
|
import { platform } from 'node:os';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
const execAsync = promisify(exec);
|
|
5
|
-
|
|
5
|
+
// Generous enough to cover a slow `tasklist` fallback on loaded Windows
|
|
6
|
+
// machines (observed at ~3s), while still bounding a hung lookup. The fast
|
|
7
|
+
// primitives (PowerShell Get-Process, lsof, netstat) return well under this.
|
|
8
|
+
const LOOKUP_TIMEOUT_MS = 5000;
|
|
6
9
|
/**
|
|
7
10
|
* Identify which OS process owns the LOCAL end of a TCP connection at
|
|
8
11
|
* `host:port`. Returns null when the lookup cannot resolve a single owner
|
|
@@ -116,8 +119,8 @@ export function decodeLsofString(s) {
|
|
|
116
119
|
}
|
|
117
120
|
/**
|
|
118
121
|
* Windows path: `netstat -ano` lists every TCP connection with its owning
|
|
119
|
-
* PID
|
|
120
|
-
*
|
|
122
|
+
* PID, then we resolve that PID to an image name. Both primitives ship with
|
|
123
|
+
* Windows; no extra tooling needed.
|
|
121
124
|
*
|
|
122
125
|
* Like the UNIX path, this filters by LOCAL endpoint match — see
|
|
123
126
|
* `parseNetstatForLocal`. Keep the two branches in sync.
|
|
@@ -129,12 +132,43 @@ async function lookupWindows(host, port) {
|
|
|
129
132
|
const pid = parseNetstatForLocal(netstatOut, host, port);
|
|
130
133
|
if (pid === null)
|
|
131
134
|
return null;
|
|
132
|
-
const
|
|
133
|
-
timeout: LOOKUP_TIMEOUT_MS,
|
|
134
|
-
});
|
|
135
|
-
const binaryName = parseTasklistImage(tasklistOut);
|
|
135
|
+
const binaryName = await imageNameForPid(pid);
|
|
136
136
|
return binaryName ? { pid, binaryName } : null;
|
|
137
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve a Windows PID to its image name.
|
|
140
|
+
*
|
|
141
|
+
* Prefers PowerShell `Get-Process`, which returns in well under a second on
|
|
142
|
+
* normal machines. `tasklist` is kept as a fallback because, while it is the
|
|
143
|
+
* more universally-present tool, it can be pathologically slow (several
|
|
144
|
+
* seconds) on some installs — slow enough to blow `LOOKUP_TIMEOUT_MS` and make
|
|
145
|
+
* the WS peer check fail closed for EVERY browser, not just attackers. Trying
|
|
146
|
+
* them in order means a missing or locked-down PowerShell degrades to the
|
|
147
|
+
* original behaviour rather than failing outright.
|
|
148
|
+
*
|
|
149
|
+
* `Get-Process` reports `ProcessName` without the `.exe` suffix, so
|
|
150
|
+
* `parseGetProcessName` re-adds it to match the win32 allowlist.
|
|
151
|
+
*/
|
|
152
|
+
async function imageNameForPid(pid) {
|
|
153
|
+
try {
|
|
154
|
+
const { stdout } = await execAsync(`powershell -NoProfile -NonInteractive -Command "(Get-Process -Id ${pid}).ProcessName"`, { timeout: LOOKUP_TIMEOUT_MS });
|
|
155
|
+
const name = parseGetProcessName(stdout);
|
|
156
|
+
if (name)
|
|
157
|
+
return name;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// PowerShell missing, disabled by policy, or timed out — fall back.
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const { stdout } = await execAsync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, {
|
|
164
|
+
timeout: LOOKUP_TIMEOUT_MS,
|
|
165
|
+
});
|
|
166
|
+
return parseTasklistImage(stdout);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
138
172
|
export function parseNetstatForLocal(out, host, port) {
|
|
139
173
|
const target = `${host}:${port}`;
|
|
140
174
|
for (const line of out.split(/\r?\n/)) {
|
|
@@ -164,4 +198,19 @@ export function parseTasklistImage(out) {
|
|
|
164
198
|
}
|
|
165
199
|
return null;
|
|
166
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Parse `(Get-Process -Id <pid>).ProcessName` output: a single line carrying
|
|
203
|
+
* the image name minus its extension. We re-add `.exe` so the result matches
|
|
204
|
+
* the win32 allowlist (`chrome.exe`, ...). Returns the first non-empty line,
|
|
205
|
+
* or null when the process could not be found (empty output).
|
|
206
|
+
*/
|
|
207
|
+
export function parseGetProcessName(out) {
|
|
208
|
+
for (const line of out.split(/\r?\n/)) {
|
|
209
|
+
const trimmed = line.trim();
|
|
210
|
+
if (!trimmed)
|
|
211
|
+
continue;
|
|
212
|
+
return trimmed.toLowerCase().endsWith('.exe') ? trimmed : `${trimmed}.exe`;
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
167
216
|
//# sourceMappingURL=process-identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../src/auth/process-identity.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../src/auth/process-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildSnapshotJs, buildFindJs, buildClickResolveJs, buildTypeResolveJs, } from './inpage/builders.js';
|
|
1
2
|
const WS_URL = 'ws://127.0.0.1:17529';
|
|
2
3
|
const CDP_VERSION = '1.3';
|
|
3
4
|
const CONSOLE_BUFFER_MAX = 200;
|
|
@@ -379,218 +380,6 @@ function attachDebuggerListener(state) {
|
|
|
379
380
|
};
|
|
380
381
|
state.debuggerListener = listener;
|
|
381
382
|
}
|
|
382
|
-
/**
|
|
383
|
-
* Shared in-page DOM helpers, injected verbatim into any JS template that
|
|
384
|
-
* needs them (`buildSnapshotJs`, `buildFindJs`). Defining them once here
|
|
385
|
-
* keeps the heuristics (visibility, selector generation, accessible text)
|
|
386
|
-
* identical across tools so a selector returned by `snapshot` and a selector
|
|
387
|
-
* returned by `find` follow the same rules.
|
|
388
|
-
*/
|
|
389
|
-
const DOM_HELPERS_JS = `
|
|
390
|
-
function isVisible(el) {
|
|
391
|
-
if (!(el instanceof HTMLElement)) return true;
|
|
392
|
-
const style = getComputedStyle(el);
|
|
393
|
-
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false;
|
|
394
|
-
if (el.offsetParent === null && style.position !== 'fixed') return false;
|
|
395
|
-
return true;
|
|
396
|
-
}
|
|
397
|
-
function shortText(el) {
|
|
398
|
-
const t = (el.innerText || el.textContent || '').trim();
|
|
399
|
-
return t.length > 120 ? t.slice(0, 120) + '...' : t;
|
|
400
|
-
}
|
|
401
|
-
function safeCss(s) {
|
|
402
|
-
return s.replace(/"/g, '\\\\"');
|
|
403
|
-
}
|
|
404
|
-
function genSelector(el) {
|
|
405
|
-
if (el.id && !/^[\\d]/.test(el.id) && !/\\s/.test(el.id)) {
|
|
406
|
-
try { if (document.querySelectorAll('#' + CSS.escape(el.id)).length === 1) return '#' + CSS.escape(el.id); } catch (_) {}
|
|
407
|
-
}
|
|
408
|
-
const tid = el.getAttribute('data-testid');
|
|
409
|
-
if (tid) return '[data-testid="' + safeCss(tid) + '"]';
|
|
410
|
-
const al = el.getAttribute('aria-label');
|
|
411
|
-
if (al && al.length < 60) return el.tagName.toLowerCase() + '[aria-label="' + safeCss(al) + '"]';
|
|
412
|
-
const name = el.getAttribute('name');
|
|
413
|
-
if (name && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA')) {
|
|
414
|
-
return el.tagName.toLowerCase() + '[name="' + safeCss(name) + '"]';
|
|
415
|
-
}
|
|
416
|
-
const parts = [];
|
|
417
|
-
let cur = el;
|
|
418
|
-
while (cur && cur.nodeType === 1 && cur !== document.body && parts.length < 6) {
|
|
419
|
-
let part = cur.tagName.toLowerCase();
|
|
420
|
-
const parent = cur.parentElement;
|
|
421
|
-
if (parent) {
|
|
422
|
-
const sib = Array.from(parent.children).filter(s => s.tagName === cur.tagName);
|
|
423
|
-
if (sib.length > 1) {
|
|
424
|
-
part += ':nth-of-type(' + (sib.indexOf(cur) + 1) + ')';
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
parts.unshift(part);
|
|
428
|
-
cur = parent;
|
|
429
|
-
}
|
|
430
|
-
return parts.join(' > ');
|
|
431
|
-
}
|
|
432
|
-
function accessibleText(el) {
|
|
433
|
-
const aria = el.getAttribute && el.getAttribute('aria-label');
|
|
434
|
-
if (aria) return aria;
|
|
435
|
-
const txt = (el.innerText || el.textContent || '').trim();
|
|
436
|
-
if (txt) return txt;
|
|
437
|
-
if ('value' in el && el.value) return String(el.value);
|
|
438
|
-
const ph = el.getAttribute && el.getAttribute('placeholder');
|
|
439
|
-
if (ph) return ph;
|
|
440
|
-
const title = el.getAttribute && el.getAttribute('title');
|
|
441
|
-
if (title) return title;
|
|
442
|
-
return '';
|
|
443
|
-
}
|
|
444
|
-
`;
|
|
445
|
-
function buildSnapshotJs(opts = {}) {
|
|
446
|
-
const optsJson = JSON.stringify({
|
|
447
|
-
withinSelector: typeof opts.within_selector === 'string' ? opts.within_selector : null,
|
|
448
|
-
onlyInteractive: opts.only_interactive === true,
|
|
449
|
-
exclude: Array.isArray(opts.exclude) ? opts.exclude : [],
|
|
450
|
-
maxInteractive: typeof opts.max_interactive === 'number' && opts.max_interactive > 0
|
|
451
|
-
? Math.min(opts.max_interactive, 500)
|
|
452
|
-
: 120,
|
|
453
|
-
});
|
|
454
|
-
return `
|
|
455
|
-
(() => {
|
|
456
|
-
${DOM_HELPERS_JS}
|
|
457
|
-
const opts = ${optsJson};
|
|
458
|
-
let root = document;
|
|
459
|
-
let notice = '';
|
|
460
|
-
if (opts.withinSelector) {
|
|
461
|
-
const sub = document.querySelector(opts.withinSelector);
|
|
462
|
-
if (!sub) {
|
|
463
|
-
return {
|
|
464
|
-
title: document.title,
|
|
465
|
-
url: location.href,
|
|
466
|
-
interactive: [],
|
|
467
|
-
notice: 'within_selector did not match any element',
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
root = sub;
|
|
471
|
-
}
|
|
472
|
-
const excludeSet = new Set((opts.exclude || []).map(s => String(s).toLowerCase()));
|
|
473
|
-
function inExcludedLandmark(el) {
|
|
474
|
-
if (excludeSet.size === 0) return false;
|
|
475
|
-
let cur = el.parentElement;
|
|
476
|
-
while (cur && cur !== document.body) {
|
|
477
|
-
const tag = cur.tagName ? cur.tagName.toLowerCase() : '';
|
|
478
|
-
if (excludeSet.has(tag)) return true;
|
|
479
|
-
if (cur === root) return false;
|
|
480
|
-
cur = cur.parentElement;
|
|
481
|
-
}
|
|
482
|
-
return false;
|
|
483
|
-
}
|
|
484
|
-
const sel = 'a[href], button, input, select, textarea, [role=button], [role=link], [role=checkbox], [role=tab], [role=menuitem], [contenteditable=true]';
|
|
485
|
-
const interactive = [];
|
|
486
|
-
const scope = (root.querySelectorAll ? root : document);
|
|
487
|
-
scope.querySelectorAll(sel).forEach((el) => {
|
|
488
|
-
if (!isVisible(el)) return;
|
|
489
|
-
if (inExcludedLandmark(el)) return;
|
|
490
|
-
const tag = el.tagName.toLowerCase();
|
|
491
|
-
const role = el.getAttribute('role') || tag;
|
|
492
|
-
const entry = { tag, role, selector: genSelector(el) };
|
|
493
|
-
const txt = shortText(el);
|
|
494
|
-
if (txt) entry.text = txt;
|
|
495
|
-
if ('value' in el && el.value) entry.value = String(el.value);
|
|
496
|
-
const placeholder = el.getAttribute('placeholder');
|
|
497
|
-
if (placeholder) entry.placeholder = placeholder;
|
|
498
|
-
const aria_label = el.getAttribute('aria-label');
|
|
499
|
-
if (aria_label) entry.aria_label = aria_label;
|
|
500
|
-
const name = el.getAttribute('name');
|
|
501
|
-
if (name) entry.name = name;
|
|
502
|
-
const type = el.getAttribute('type');
|
|
503
|
-
if (type) entry.type = type;
|
|
504
|
-
const href = el.getAttribute('href');
|
|
505
|
-
if (href) entry.href = href;
|
|
506
|
-
if ('disabled' in el && el.disabled) entry.disabled = true;
|
|
507
|
-
interactive.push(entry);
|
|
508
|
-
});
|
|
509
|
-
const result = {
|
|
510
|
-
title: document.title,
|
|
511
|
-
url: location.href,
|
|
512
|
-
interactive: interactive.slice(0, opts.maxInteractive),
|
|
513
|
-
};
|
|
514
|
-
if (!opts.onlyInteractive) {
|
|
515
|
-
const headings = [];
|
|
516
|
-
scope.querySelectorAll('h1, h2, h3').forEach((h) => {
|
|
517
|
-
if (!isVisible(h)) return;
|
|
518
|
-
if (inExcludedLandmark(h)) return;
|
|
519
|
-
const t = shortText(h);
|
|
520
|
-
if (t) headings.push({ level: h.tagName, text: t });
|
|
521
|
-
});
|
|
522
|
-
result.headings = headings.slice(0, 30);
|
|
523
|
-
const textRoot = (root === document) ? (document.body || document) : root;
|
|
524
|
-
const visibleText = (textRoot && textRoot.innerText) ? textRoot.innerText.slice(0, 4000) : '';
|
|
525
|
-
if (visibleText) result.text = visibleText;
|
|
526
|
-
}
|
|
527
|
-
if (notice) result.notice = notice;
|
|
528
|
-
return result;
|
|
529
|
-
})()
|
|
530
|
-
`;
|
|
531
|
-
}
|
|
532
|
-
function buildFindJs(opts) {
|
|
533
|
-
const optsJson = JSON.stringify({
|
|
534
|
-
text: opts.text,
|
|
535
|
-
role: typeof opts.role === 'string' && opts.role.length > 0 ? opts.role : null,
|
|
536
|
-
exact: opts.exact === true,
|
|
537
|
-
candidateLimit: 5,
|
|
538
|
-
});
|
|
539
|
-
return `
|
|
540
|
-
(() => {
|
|
541
|
-
${DOM_HELPERS_JS}
|
|
542
|
-
const opts = ${optsJson};
|
|
543
|
-
const needle = opts.text.toLowerCase();
|
|
544
|
-
const ROLE_SELECTORS = {
|
|
545
|
-
button: 'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]',
|
|
546
|
-
link: 'a[href], [role="link"]',
|
|
547
|
-
textbox: 'input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="url"], input[type="tel"], input:not([type]), textarea, [role="textbox"], [contenteditable="true"]',
|
|
548
|
-
checkbox: 'input[type="checkbox"], [role="checkbox"]',
|
|
549
|
-
tab: '[role="tab"]',
|
|
550
|
-
menuitem: '[role="menuitem"]',
|
|
551
|
-
};
|
|
552
|
-
const selectorSet = opts.role && ROLE_SELECTORS[opts.role]
|
|
553
|
-
? ROLE_SELECTORS[opts.role]
|
|
554
|
-
: 'button, a, input, textarea, select, [role], [onclick], [contenteditable="true"], [tabindex]';
|
|
555
|
-
const all = Array.from(document.querySelectorAll(selectorSet));
|
|
556
|
-
const matches = [];
|
|
557
|
-
for (const el of all) {
|
|
558
|
-
if (!isVisible(el)) continue;
|
|
559
|
-
const text = accessibleText(el).trim();
|
|
560
|
-
if (text.length === 0) continue;
|
|
561
|
-
const lower = text.toLowerCase();
|
|
562
|
-
const ok = opts.exact ? lower === needle : lower.includes(needle);
|
|
563
|
-
if (ok) matches.push(el);
|
|
564
|
-
}
|
|
565
|
-
if (matches.length === 0) {
|
|
566
|
-
return { matched: false, reason: 'not-found' };
|
|
567
|
-
}
|
|
568
|
-
if (matches.length > 1) {
|
|
569
|
-
return {
|
|
570
|
-
matched: false,
|
|
571
|
-
reason: 'multiple-matches',
|
|
572
|
-
candidates: matches.slice(0, opts.candidateLimit).map((el) => ({
|
|
573
|
-
selector: genSelector(el),
|
|
574
|
-
text: shortText(el),
|
|
575
|
-
tag: el.tagName.toLowerCase(),
|
|
576
|
-
})),
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
const el = matches[0];
|
|
580
|
-
const rect = el.getBoundingClientRect();
|
|
581
|
-
return {
|
|
582
|
-
matched: true,
|
|
583
|
-
selector: genSelector(el),
|
|
584
|
-
coords: {
|
|
585
|
-
x: Math.round(rect.left + rect.width / 2),
|
|
586
|
-
y: Math.round(rect.top + rect.height / 2),
|
|
587
|
-
},
|
|
588
|
-
tag: el.tagName.toLowerCase(),
|
|
589
|
-
text: shortText(el),
|
|
590
|
-
};
|
|
591
|
-
})()
|
|
592
|
-
`;
|
|
593
|
-
}
|
|
594
383
|
function buildCanvasScreenshotJs(opts) {
|
|
595
384
|
const optsJson = JSON.stringify({
|
|
596
385
|
selector: opts.selector ?? null,
|
|
@@ -817,16 +606,17 @@ async function handleTool(state, msg) {
|
|
|
817
606
|
}
|
|
818
607
|
case 'click': {
|
|
819
608
|
const selector = str('selector');
|
|
820
|
-
const
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
609
|
+
const force = p.force === true;
|
|
610
|
+
const resolved = await evaluateInTab(tabId, buildClickResolveJs({ selector, force }));
|
|
611
|
+
if (!resolved.ok) {
|
|
612
|
+
if (resolved.reason === 'occluded') {
|
|
613
|
+
return {
|
|
614
|
+
kind: 'tool.response',
|
|
615
|
+
id: msg.id,
|
|
616
|
+
ok: false,
|
|
617
|
+
error: `Element covered by ${resolved.blocker} — click the covering element or dismiss it first`,
|
|
618
|
+
};
|
|
619
|
+
}
|
|
830
620
|
return {
|
|
831
621
|
kind: 'tool.response',
|
|
832
622
|
id: msg.id,
|
|
@@ -836,20 +626,20 @@ async function handleTool(state, msg) {
|
|
|
836
626
|
}
|
|
837
627
|
await cdp(tabId, 'Input.dispatchMouseEvent', {
|
|
838
628
|
type: 'mouseMoved',
|
|
839
|
-
x:
|
|
840
|
-
y:
|
|
629
|
+
x: resolved.x,
|
|
630
|
+
y: resolved.y,
|
|
841
631
|
});
|
|
842
632
|
await cdp(tabId, 'Input.dispatchMouseEvent', {
|
|
843
633
|
type: 'mousePressed',
|
|
844
|
-
x:
|
|
845
|
-
y:
|
|
634
|
+
x: resolved.x,
|
|
635
|
+
y: resolved.y,
|
|
846
636
|
button: 'left',
|
|
847
637
|
clickCount: 1,
|
|
848
638
|
});
|
|
849
639
|
await cdp(tabId, 'Input.dispatchMouseEvent', {
|
|
850
640
|
type: 'mouseReleased',
|
|
851
|
-
x:
|
|
852
|
-
y:
|
|
641
|
+
x: resolved.x,
|
|
642
|
+
y: resolved.y,
|
|
853
643
|
button: 'left',
|
|
854
644
|
clickCount: 1,
|
|
855
645
|
});
|
|
@@ -857,22 +647,14 @@ async function handleTool(state, msg) {
|
|
|
857
647
|
kind: 'tool.response',
|
|
858
648
|
id: msg.id,
|
|
859
649
|
ok: true,
|
|
860
|
-
result: { clicked: selector, tag:
|
|
650
|
+
result: { clicked: selector, tag: resolved.tag },
|
|
861
651
|
};
|
|
862
652
|
}
|
|
863
653
|
case 'type': {
|
|
864
654
|
const selector = str('selector');
|
|
865
655
|
const text = str('text');
|
|
866
656
|
const clear = p.clear === true;
|
|
867
|
-
const
|
|
868
|
-
(() => {
|
|
869
|
-
const el = document.querySelector(${JSON.stringify(selector)});
|
|
870
|
-
if (!el) return false;
|
|
871
|
-
el.focus();
|
|
872
|
-
${clear ? "if ('value' in el) { el.value = ''; el.dispatchEvent(new Event('input', { bubbles: true })); }" : ''}
|
|
873
|
-
return true;
|
|
874
|
-
})()`;
|
|
875
|
-
const focused = await evaluateInTab(tabId, focusExpr);
|
|
657
|
+
const focused = await evaluateInTab(tabId, buildTypeResolveJs({ selector, clear }));
|
|
876
658
|
if (!focused) {
|
|
877
659
|
return {
|
|
878
660
|
kind: 'tool.response',
|
|
@@ -1711,5 +1493,4 @@ setInterval(() => {
|
|
|
1711
1493
|
});
|
|
1712
1494
|
}
|
|
1713
1495
|
}, WS_IDLE_SWEEP_MS);
|
|
1714
|
-
export {};
|
|
1715
1496
|
//# sourceMappingURL=background.js.map
|