@nuanu-ai/agentbrowse 0.2.14 → 0.2.16
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 +6 -5
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +16 -6
- package/dist/commands/action-acceptance.d.ts +1 -0
- package/dist/commands/action-acceptance.d.ts.map +1 -1
- package/dist/commands/action-acceptance.js +42 -2
- package/dist/commands/action-result-resolution.d.ts +17 -0
- package/dist/commands/action-result-resolution.d.ts.map +1 -0
- package/dist/commands/action-result-resolution.js +95 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +128 -12
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.test-harness.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# @nuanu-ai/agentbrowse
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Browser automation CLI for AI agents.
|
|
4
4
|
|
|
5
|
-
`agentbrowse`
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
`agentbrowse` controls a CDP-reachable browser for external agents that need
|
|
6
|
+
explicit browser primitives. It navigates pages, observes UI surfaces and
|
|
7
|
+
target refs, performs actions, extracts structured data, captures screenshots,
|
|
8
|
+
and optionally solves captchas when the active session supports it.
|
|
8
9
|
|
|
9
|
-
This
|
|
10
|
+
This package publishes the public `agentbrowse` CLI.
|
|
10
11
|
|
|
11
12
|
## Install
|
|
12
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAoCnD,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAqHxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,CAAC;AAoV7B,wBAAsB,GAAG,CACvB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAioBf"}
|
package/dist/commands/act.js
CHANGED
|
@@ -7,6 +7,7 @@ import { outputContractFailure, outputFailure, outputJSON } from '../output.js';
|
|
|
7
7
|
import { capturePageObservation, captureLocatorContextHash, captureLocatorState, createAcceptanceProbe, diagnoseNoObservableProgress, locatorStateChanged, pageObservationChanged, rankLocatorCandidates, shouldVerifyObservableProgress, waitForAcceptanceProbe, } from './action-acceptance.js';
|
|
8
8
|
import { captureActionFailureArtifacts, startActionTrace } from './action-artifacts.js';
|
|
9
9
|
import { buildLocator, resolveLocatorRoot } from './action-fallbacks.js';
|
|
10
|
+
import { resolveSubmitResult } from './action-result-resolution.js';
|
|
10
11
|
import { projectActionValue } from './action-value-projection.js';
|
|
11
12
|
import { applyActionWithFallbacks } from './action-executor.js';
|
|
12
13
|
import { BROWSE_ACTIONS, isBrowseAction } from './browse-actions.js';
|
|
@@ -719,13 +720,22 @@ export async function act(session, targetRef, action, value) {
|
|
|
719
720
|
throw new Error(`action_postcondition_failed:${finalProgressProbe.policy}`);
|
|
720
721
|
}
|
|
721
722
|
else if (!accepted && finalProgressProbe.policy === 'submit') {
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
723
|
+
const submitResolution = await resolveSubmitResult(finalProgressProbe, afterPageObservation);
|
|
724
|
+
if (submitResolution.acceptAsProgress) {
|
|
725
|
+
attempts.push(`submit-resolution:${submitResolution.finalVerdict}`);
|
|
726
|
+
if (submitResolution.claims.some((claim) => claim.kind === 'soft_result_candidate')) {
|
|
727
|
+
attempts.push('submit-resolution:soft-result-candidate');
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
|
|
732
|
+
attempts.push('no-progress.detected');
|
|
733
|
+
noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
|
|
734
|
+
if (noProgressDiagnosis) {
|
|
735
|
+
attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
|
|
736
|
+
}
|
|
737
|
+
throw new Error('no_observable_progress');
|
|
727
738
|
}
|
|
728
|
-
throw new Error('no_observable_progress');
|
|
729
739
|
}
|
|
730
740
|
else if (!accepted) {
|
|
731
741
|
const afterLocatorObservation = finalProgressProbe.trackedStateKeys.length > 0
|
|
@@ -10,6 +10,7 @@ export type PageObservation = {
|
|
|
10
10
|
contentHash: string | null;
|
|
11
11
|
structureHash: string | null;
|
|
12
12
|
submitSignalHash: string | null;
|
|
13
|
+
resultSignalHash: string | null;
|
|
13
14
|
validationBlockerCount: number;
|
|
14
15
|
};
|
|
15
16
|
type TargetStateKey = 'selected' | 'checked' | 'expanded' | 'pressed' | 'current' | 'focused';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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"}
|
|
@@ -405,6 +405,7 @@ const PAGE_OBSERVATION_SCRIPT = String.raw `(() => {
|
|
|
405
405
|
content: '',
|
|
406
406
|
structure: '',
|
|
407
407
|
submitSignals: '',
|
|
408
|
+
resultSignals: '',
|
|
408
409
|
validationBlockerCount: 0,
|
|
409
410
|
};
|
|
410
411
|
}
|
|
@@ -421,11 +422,47 @@ const PAGE_OBSERVATION_SCRIPT = String.raw `(() => {
|
|
|
421
422
|
const frames = frameSummary();
|
|
422
423
|
const headings = headingSummary();
|
|
423
424
|
const processing = processingSummary();
|
|
425
|
+
const resultSignals = (() => {
|
|
426
|
+
const selectors = [
|
|
427
|
+
'[role="alert"]',
|
|
428
|
+
'[aria-live="assertive"]',
|
|
429
|
+
'[role="dialog"]',
|
|
430
|
+
'[aria-modal="true"]',
|
|
431
|
+
];
|
|
432
|
+
const items = [];
|
|
433
|
+
|
|
434
|
+
for (const element of Array.from(document.querySelectorAll(selectors.join(', ')))) {
|
|
435
|
+
if (!(element instanceof HTMLElement) || !isVisible(element)) {
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (element.matches('[aria-busy="true"], [role="progressbar"]')) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const role = element.getAttribute('role') || '';
|
|
444
|
+
const label =
|
|
445
|
+
normalizeText(element.getAttribute('aria-label')) ||
|
|
446
|
+
normalizeText(element.id) ||
|
|
447
|
+
sampleText(normalizeText(element.textContent || ''), 160);
|
|
448
|
+
if (!label) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
items.push([role || 'live', label].join(':'));
|
|
453
|
+
if (items.length >= 20) {
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return items.join('|');
|
|
459
|
+
})();
|
|
424
460
|
const validation = validationSummary();
|
|
425
461
|
return {
|
|
426
462
|
content: [attrs, text, controls, dialogs, frames].join('\n'),
|
|
427
463
|
structure: [attrs, stableControls, dialogs, frames, headings].join('\n'),
|
|
428
464
|
submitSignals: [processing, dialogs, frames, headings, stableControls].join('\n'),
|
|
465
|
+
resultSignals,
|
|
429
466
|
validationBlockerCount: validation ? validation.split('|').length : 0,
|
|
430
467
|
};
|
|
431
468
|
})()`;
|
|
@@ -740,6 +777,7 @@ export async function capturePageObservation(page) {
|
|
|
740
777
|
const contentSnapshot = typeof snapshot === 'string' ? snapshot : (snapshot?.content ?? '');
|
|
741
778
|
const structureSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.structure ?? '');
|
|
742
779
|
const submitSignalSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.submitSignals ?? '');
|
|
780
|
+
const resultSignalSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.resultSignals ?? '');
|
|
743
781
|
const validationBlockerCount = typeof snapshot === 'string'
|
|
744
782
|
? 0
|
|
745
783
|
: typeof snapshot?.validationBlockerCount === 'number'
|
|
@@ -751,6 +789,7 @@ export async function capturePageObservation(page) {
|
|
|
751
789
|
contentHash: contentSnapshot ? hashText(contentSnapshot) : null,
|
|
752
790
|
structureHash: structureSnapshot ? hashText(structureSnapshot) : null,
|
|
753
791
|
submitSignalHash: submitSignalSnapshot ? hashText(submitSignalSnapshot) : null,
|
|
792
|
+
resultSignalHash: resultSignalSnapshot ? hashText(resultSignalSnapshot) : null,
|
|
754
793
|
validationBlockerCount,
|
|
755
794
|
};
|
|
756
795
|
}
|
|
@@ -1328,8 +1367,9 @@ export async function createAcceptanceProbe(args) {
|
|
|
1328
1367
|
? await captureLocatorValue(ownerLocator)
|
|
1329
1368
|
: null;
|
|
1330
1369
|
const beforeSurfaceContextHash = surfaceLocator &&
|
|
1331
|
-
target.structure?.family === 'structured-grid' &&
|
|
1332
|
-
|
|
1370
|
+
((target.structure?.family === 'structured-grid' &&
|
|
1371
|
+
(policy === 'selection' || policy === 'date-selection')) ||
|
|
1372
|
+
policy === 'submit')
|
|
1333
1373
|
? await captureLocatorContextHash(surfaceLocator)
|
|
1334
1374
|
: null;
|
|
1335
1375
|
const comparableValueType = comparableValueTypeForTarget(target);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AcceptanceProbe, type PageObservation } from './action-acceptance.js';
|
|
2
|
+
export type SubmitResultClaimKind = 'hard_result' | 'hard_blocker' | 'soft_result_candidate' | 'noisy_change';
|
|
3
|
+
export type SubmitResultClaim = {
|
|
4
|
+
kind: SubmitResultClaimKind;
|
|
5
|
+
source: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
ownerScopeRef?: string;
|
|
8
|
+
};
|
|
9
|
+
export type SubmitResultResolution = {
|
|
10
|
+
finalVerdict: 'outcome' | 'blocked' | 'none';
|
|
11
|
+
claims: SubmitResultClaim[];
|
|
12
|
+
decisiveClaims: SubmitResultClaim[];
|
|
13
|
+
acceptAsProgress: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function reduceSubmitResultClaims(claims: ReadonlyArray<SubmitResultClaim>): Omit<SubmitResultResolution, 'claims' | 'acceptAsProgress'>;
|
|
16
|
+
export declare function resolveSubmitResult(probe: AcceptanceProbe, afterPageObservation: PageObservation | null): Promise<SubmitResultResolution>;
|
|
17
|
+
//# sourceMappingURL=action-result-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-result-resolution.d.ts","sourceRoot":"","sources":["../../src/commands/action-result-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG/G,MAAM,MAAM,qBAAqB,GAC7B,aAAa,GACb,cAAc,GACd,uBAAuB,GACvB,cAAc,CAAC;AAEnB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACvC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,kBAAkB,CAAC,CAqB7D;AAiBD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,eAAe,EACtB,oBAAoB,EAAE,eAAe,GAAG,IAAI,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAsEjC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { captureLocatorContextHash } from './action-acceptance.js';
|
|
2
|
+
import { resolveSurfaceScopeRoot } from './target-resolution.js';
|
|
3
|
+
export function reduceSubmitResultClaims(claims) {
|
|
4
|
+
const hardBlockers = claims.filter((claim) => claim.kind === 'hard_blocker');
|
|
5
|
+
if (hardBlockers.length > 0) {
|
|
6
|
+
return {
|
|
7
|
+
finalVerdict: 'blocked',
|
|
8
|
+
decisiveClaims: hardBlockers,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const hardResults = claims.filter((claim) => claim.kind === 'hard_result');
|
|
12
|
+
if (hardResults.length > 0) {
|
|
13
|
+
return {
|
|
14
|
+
finalVerdict: 'outcome',
|
|
15
|
+
decisiveClaims: hardResults,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
finalVerdict: 'none',
|
|
20
|
+
decisiveClaims: [],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function captureAfterSurfaceContextHash(probe) {
|
|
24
|
+
if (probe.surface) {
|
|
25
|
+
const liveSurfaceLocator = await resolveSurfaceScopeRoot(probe.page, probe.surface).catch(() => null);
|
|
26
|
+
if (liveSurfaceLocator) {
|
|
27
|
+
return captureLocatorContextHash(liveSurfaceLocator).catch(() => null);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (probe.surfaceLocator) {
|
|
31
|
+
return captureLocatorContextHash(probe.surfaceLocator).catch(() => null);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
export async function resolveSubmitResult(probe, afterPageObservation) {
|
|
36
|
+
const beforePageObservation = probe.beforePage;
|
|
37
|
+
const claims = [];
|
|
38
|
+
if (!beforePageObservation || !afterPageObservation) {
|
|
39
|
+
return {
|
|
40
|
+
finalVerdict: 'none',
|
|
41
|
+
claims,
|
|
42
|
+
decisiveClaims: [],
|
|
43
|
+
acceptAsProgress: false,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (afterPageObservation.validationBlockerCount > beforePageObservation.validationBlockerCount) {
|
|
47
|
+
claims.push({
|
|
48
|
+
kind: 'hard_blocker',
|
|
49
|
+
source: 'validation',
|
|
50
|
+
reason: 'Validation blockers increased after submit.',
|
|
51
|
+
ownerScopeRef: probe.surface?.ref,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (beforePageObservation.url !== afterPageObservation.url ||
|
|
55
|
+
beforePageObservation.title !== afterPageObservation.title) {
|
|
56
|
+
claims.push({
|
|
57
|
+
kind: 'hard_result',
|
|
58
|
+
source: 'navigation',
|
|
59
|
+
reason: 'Page identity changed after submit.',
|
|
60
|
+
ownerScopeRef: probe.surface?.ref,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const resultSignalChanged = beforePageObservation.resultSignalHash !== afterPageObservation.resultSignalHash &&
|
|
64
|
+
afterPageObservation.resultSignalHash !== null;
|
|
65
|
+
const afterSurfaceContextHash = await captureAfterSurfaceContextHash(probe);
|
|
66
|
+
const ownerScopeChanged = probe.beforeSurfaceContextHash !== null &&
|
|
67
|
+
afterSurfaceContextHash !== null &&
|
|
68
|
+
probe.beforeSurfaceContextHash !== afterSurfaceContextHash;
|
|
69
|
+
if (resultSignalChanged) {
|
|
70
|
+
claims.push({
|
|
71
|
+
kind: 'soft_result_candidate',
|
|
72
|
+
source: ownerScopeChanged ? 'owner-scope' : 'page-signal',
|
|
73
|
+
reason: ownerScopeChanged
|
|
74
|
+
? 'Owner-scope result-bearing signal appeared after submit.'
|
|
75
|
+
: 'A result-bearing signal appeared after submit.',
|
|
76
|
+
ownerScopeRef: probe.surface?.ref,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (ownerScopeChanged) {
|
|
80
|
+
claims.push({
|
|
81
|
+
kind: 'noisy_change',
|
|
82
|
+
source: 'owner-scope',
|
|
83
|
+
reason: 'Owner scope changed after submit without a result-bearing signal.',
|
|
84
|
+
ownerScopeRef: probe.surface?.ref,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const reduced = reduceSubmitResultClaims(claims);
|
|
88
|
+
return {
|
|
89
|
+
...reduced,
|
|
90
|
+
claims,
|
|
91
|
+
acceptAsProgress: reduced.finalVerdict === 'outcome' ||
|
|
92
|
+
(reduced.finalVerdict === 'none' &&
|
|
93
|
+
claims.some((claim) => claim.kind === 'soft_result_candidate')),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1640,6 +1640,34 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
1640
1640
|
};
|
|
1641
1641
|
};
|
|
1642
1642
|
|
|
1643
|
+
const modalBackdropAncestorOf = (surface) => {
|
|
1644
|
+
let current = surface?.parentElement;
|
|
1645
|
+
let depth = 0;
|
|
1646
|
+
while (current && depth < 6) {
|
|
1647
|
+
if (isHTMLElementNode(current) && isVisible(current)) {
|
|
1648
|
+
const style = window.getComputedStyle(current);
|
|
1649
|
+
const position = (style.position || '').toLowerCase();
|
|
1650
|
+
const rect = current.getBoundingClientRect();
|
|
1651
|
+
const viewportArea = Math.max(window.innerWidth * window.innerHeight, 1);
|
|
1652
|
+
const coverage = (rect.width * rect.height) / viewportArea;
|
|
1653
|
+
if (
|
|
1654
|
+
position === 'fixed' &&
|
|
1655
|
+
coverage > 0.45 &&
|
|
1656
|
+
(style.backgroundColor &&
|
|
1657
|
+
style.backgroundColor !== 'transparent' &&
|
|
1658
|
+
style.backgroundColor !== 'rgba(0, 0, 0, 0)')
|
|
1659
|
+
) {
|
|
1660
|
+
return current;
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
current = current.parentElement;
|
|
1665
|
+
depth += 1;
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
return undefined;
|
|
1669
|
+
};
|
|
1670
|
+
|
|
1643
1671
|
const surfacePositionTraitsOf = (surface) => {
|
|
1644
1672
|
if (!isHTMLElementNode(surface) || !isVisible(surface)) return undefined;
|
|
1645
1673
|
|
|
@@ -1676,6 +1704,15 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
1676
1704
|
return { kind: 'floating-panel', priority: 82 };
|
|
1677
1705
|
}
|
|
1678
1706
|
|
|
1707
|
+
if (
|
|
1708
|
+
hasCardChrome &&
|
|
1709
|
+
coverage <= 0.35 &&
|
|
1710
|
+
interactiveCount >= 1 &&
|
|
1711
|
+
modalBackdropAncestorOf(surface)
|
|
1712
|
+
) {
|
|
1713
|
+
return { kind: 'floating-panel', priority: 90 };
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1679
1716
|
return undefined;
|
|
1680
1717
|
};
|
|
1681
1718
|
|
|
@@ -2137,17 +2174,47 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2137
2174
|
.filter((element) => isVisible(element));
|
|
2138
2175
|
|
|
2139
2176
|
const localSurfaceCandidateOf = (element) => {
|
|
2140
|
-
const
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
candidate
|
|
2144
|
-
|
|
2145
|
-
isVisible(candidate)
|
|
2146
|
-
|
|
2147
|
-
|
|
2177
|
+
const ranked = [];
|
|
2178
|
+
const pushCandidate = (candidate, depth) => {
|
|
2179
|
+
if (
|
|
2180
|
+
!isHTMLElementNode(candidate) ||
|
|
2181
|
+
candidate === element ||
|
|
2182
|
+
!isVisible(candidate)
|
|
2183
|
+
) {
|
|
2184
|
+
return;
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2187
|
+
const priority = surfacePriorityOf(candidate);
|
|
2188
|
+
if (priority <= 0) {
|
|
2189
|
+
return;
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
if (ranked.some((entry) => entry.element === candidate)) {
|
|
2193
|
+
return;
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
ranked.push({ element: candidate, priority, depth });
|
|
2197
|
+
};
|
|
2198
|
+
|
|
2199
|
+
pushCandidate(itemOf(element), 0);
|
|
2200
|
+
pushCandidate(containerOf(element), 1);
|
|
2201
|
+
|
|
2202
|
+
let current = composedParentElement(element);
|
|
2203
|
+
let depth = 0;
|
|
2204
|
+
while (current && depth < 8) {
|
|
2205
|
+
pushCandidate(current, depth + 2);
|
|
2206
|
+
current = composedParentElement(current);
|
|
2207
|
+
depth += 1;
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
ranked.sort((left, right) => {
|
|
2211
|
+
if (left.priority !== right.priority) {
|
|
2212
|
+
return right.priority - left.priority;
|
|
2213
|
+
}
|
|
2214
|
+
return left.depth - right.depth;
|
|
2148
2215
|
});
|
|
2149
2216
|
|
|
2150
|
-
return
|
|
2217
|
+
return ranked[0]?.element;
|
|
2151
2218
|
};
|
|
2152
2219
|
|
|
2153
2220
|
const surfaceSelectorsOf = (element, localSurface) => {
|
|
@@ -2347,6 +2414,36 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2347
2414
|
return false;
|
|
2348
2415
|
};
|
|
2349
2416
|
|
|
2417
|
+
const outputPriorityOf = (candidate) => {
|
|
2418
|
+
let score = candidate.surfacePriority || 0;
|
|
2419
|
+
|
|
2420
|
+
if (candidate.controlsSurfaceSelector) {
|
|
2421
|
+
score += 24;
|
|
2422
|
+
}
|
|
2423
|
+
if (candidate.structure?.family) {
|
|
2424
|
+
score += 18;
|
|
2425
|
+
}
|
|
2426
|
+
if (candidate.validation?.message) {
|
|
2427
|
+
score += 12;
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
const kind = (candidate.kind || '').toLowerCase();
|
|
2431
|
+
const role = (candidate.role || '').toLowerCase();
|
|
2432
|
+
if (['input', 'textarea', 'select'].includes(kind)) {
|
|
2433
|
+
score += 14;
|
|
2434
|
+
}
|
|
2435
|
+
if (['textbox', 'combobox', 'option', 'menuitem', 'gridcell'].includes(role)) {
|
|
2436
|
+
score += 12;
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
const allowedByHint = (candidate.interactionHint || '').toLowerCase();
|
|
2440
|
+
if (allowedByHint === 'click' || allowedByHint === 'press') {
|
|
2441
|
+
score += 4;
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2444
|
+
return score;
|
|
2445
|
+
};
|
|
2446
|
+
|
|
2350
2447
|
const seen = new Set();
|
|
2351
2448
|
return enrichDisplayLabels(collectTargets(document))
|
|
2352
2449
|
.filter((candidate) => {
|
|
@@ -2357,7 +2454,26 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2357
2454
|
seen.add(key);
|
|
2358
2455
|
return hasUsefulInventorySignal(candidate);
|
|
2359
2456
|
})
|
|
2360
|
-
.
|
|
2457
|
+
.map((candidate, index) => ({ candidate, index }))
|
|
2458
|
+
.sort((left, right) => {
|
|
2459
|
+
const priorityDelta = outputPriorityOf(right.candidate) - outputPriorityOf(left.candidate);
|
|
2460
|
+
if (priorityDelta !== 0) {
|
|
2461
|
+
return priorityDelta;
|
|
2462
|
+
}
|
|
2463
|
+
|
|
2464
|
+
return (left.candidate.ordinal ?? left.index) - (right.candidate.ordinal ?? right.index);
|
|
2465
|
+
})
|
|
2466
|
+
.slice(0, collectorOutputLimit)
|
|
2467
|
+
.sort((left, right) => {
|
|
2468
|
+
const ordinalDelta =
|
|
2469
|
+
(left.candidate.ordinal ?? left.index) - (right.candidate.ordinal ?? right.index);
|
|
2470
|
+
if (ordinalDelta !== 0) {
|
|
2471
|
+
return ordinalDelta;
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
return left.index - right.index;
|
|
2475
|
+
})
|
|
2476
|
+
.map(({ candidate }) => candidate);
|
|
2361
2477
|
})()`);
|
|
2362
2478
|
if (!Array.isArray(observedTargets)) {
|
|
2363
2479
|
return [];
|
|
@@ -2478,9 +2594,9 @@ async function collectPageSignalsFromDocument(context, options) {
|
|
|
2478
2594
|
return 'status';
|
|
2479
2595
|
}
|
|
2480
2596
|
if (/toast|snackbar|banner|notice|warning|error|success/.test(classBlob)) {
|
|
2481
|
-
return
|
|
2597
|
+
return 'notice';
|
|
2482
2598
|
}
|
|
2483
|
-
return
|
|
2599
|
+
return 'notice';
|
|
2484
2600
|
};
|
|
2485
2601
|
|
|
2486
2602
|
const seen = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAgDnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,eAAO,MAAM,yBAAyB;;;;iBAyR+wD,CAAC;gBAAwB,CAAC;;;;;
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAgDnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,eAAO,MAAM,yBAAyB;;;;iBAyR+wD,CAAC;gBAAwB,CAAC;;;;;iBAA0i6E,CAAC;gBAAwB,CAAC;;;CAzR909E,CAAC;AACtE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGrC,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkRzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.test-harness.d.ts","sourceRoot":"","sources":["../../src/commands/observe.test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AA0EvC,eAAO,MAAM,kBAAkB,EAAE,MAAiC,CAAC;AACnE,eAAO,MAAM,oBAAoB,EAAE,MAAmC,CAAC;AACvE,eAAO,MAAM,yBAAyB,EAAE,MAAwC,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,EAAE,MAAgC,CAAC;AACjE,eAAO,MAAM,cAAc,EAAE,MAA6B,CAAC;AAC3D,eAAO,MAAM,2BAA2B,EAAE,MAA0C,CAAC;AACrF,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,qBAAqB,EAAE,OAAO,EAAgC,CAAC;AA+B5E,eAAO,MAAQ,OAAO,yCAAE,yBAAyB;;;;iBAqEs+O,CAAC;gBAAwB,CAAC;;;;;
|
|
1
|
+
{"version":3,"file":"observe.test-harness.d.ts","sourceRoot":"","sources":["../../src/commands/observe.test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AA0EvC,eAAO,MAAM,kBAAkB,EAAE,MAAiC,CAAC;AACnE,eAAO,MAAM,oBAAoB,EAAE,MAAmC,CAAC;AACvE,eAAO,MAAM,yBAAyB,EAAE,MAAwC,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,EAAE,MAAgC,CAAC;AACjE,eAAO,MAAM,cAAc,EAAE,MAA6B,CAAC;AAC3D,eAAO,MAAM,2BAA2B,EAAE,MAA0C,CAAC;AACrF,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,qBAAqB,EAAE,OAAO,EAAgC,CAAC;AA+B5E,eAAO,MAAQ,OAAO,yCAAE,yBAAyB;;;;iBAqEs+O,CAAC;gBAAwB,CAAC;;;;;iBAA0i6E,CAAC;gBAAwB,CAAC;;;GArElkpF,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAE3E,CAAC;AACF,eAAO,MAAQ,0BAA0B;;;;;CAA+C,CAAC;AAMzF,wBAAgB,WAAW,IAAI,aAAa,CAW3C;AAYD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EACP,YAAY,SAAkC,GAC7C,CAAC,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;CAAE,CAM3C;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAyB9C"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuanu-ai/agentbrowse",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Browser automation CLI for AI agents: control a CDP browser, observe UI surfaces, act on refs, extract data, and solve captchas",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agentbrowse",
|
|
8
8
|
"browser",
|