@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.
@@ -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
- const LOOKUP_TIMEOUT_MS = 1500;
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. We then ask `tasklist` for the image name of that PID. Both ship by
120
- * default with Windows; no extra tooling needed.
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 { stdout: tasklistOut } = await execAsync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, {
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 expr = `
821
- (() => {
822
- const el = document.querySelector(${JSON.stringify(selector)});
823
- if (!el) return null;
824
- el.scrollIntoView({ block: 'center', inline: 'center' });
825
- const r = el.getBoundingClientRect();
826
- return { x: r.left + r.width / 2, y: r.top + r.height / 2, tag: el.tagName.toLowerCase() };
827
- })()`;
828
- const coords = await evaluateInTab(tabId, expr);
829
- if (!coords) {
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: coords.x,
840
- y: coords.y,
629
+ x: resolved.x,
630
+ y: resolved.y,
841
631
  });
842
632
  await cdp(tabId, 'Input.dispatchMouseEvent', {
843
633
  type: 'mousePressed',
844
- x: coords.x,
845
- y: coords.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: coords.x,
852
- y: coords.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: coords.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 focusExpr = `
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