@nuanu-ai/agentbrowse 0.2.13 → 0.2.15

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 (33) hide show
  1. package/dist/commands/act.d.ts.map +1 -1
  2. package/dist/commands/act.js +16 -6
  3. package/dist/commands/action-acceptance.d.ts +1 -0
  4. package/dist/commands/action-acceptance.d.ts.map +1 -1
  5. package/dist/commands/action-acceptance.js +42 -2
  6. package/dist/commands/action-result-resolution.d.ts +17 -0
  7. package/dist/commands/action-result-resolution.d.ts.map +1 -0
  8. package/dist/commands/action-result-resolution.js +95 -0
  9. package/dist/commands/observe-inventory.d.ts.map +1 -1
  10. package/dist/commands/observe-inventory.js +171 -12
  11. package/dist/commands/observe-persistence.d.ts +1 -0
  12. package/dist/commands/observe-persistence.d.ts.map +1 -1
  13. package/dist/commands/observe-persistence.js +52 -1
  14. package/dist/commands/observe-projection.d.ts +27 -2
  15. package/dist/commands/observe-projection.d.ts.map +1 -1
  16. package/dist/commands/observe-projection.js +80 -7
  17. package/dist/commands/observe-semantics.d.ts.map +1 -1
  18. package/dist/commands/observe-semantics.js +13 -2
  19. package/dist/commands/observe-surfaces.d.ts +1 -0
  20. package/dist/commands/observe-surfaces.d.ts.map +1 -1
  21. package/dist/commands/observe-surfaces.js +65 -0
  22. package/dist/commands/observe.d.ts.map +1 -1
  23. package/dist/commands/observe.js +22 -9
  24. package/dist/commands/observe.test-harness.d.ts +1 -0
  25. package/dist/commands/observe.test-harness.d.ts.map +1 -1
  26. package/dist/commands/observe.test-harness.js +53 -16
  27. package/dist/commands/semantic-observe.d.ts +2 -0
  28. package/dist/commands/semantic-observe.d.ts.map +1 -1
  29. package/dist/commands/semantic-observe.js +4 -0
  30. package/dist/runtime-state.d.ts +3 -0
  31. package/dist/runtime-state.d.ts.map +1 -1
  32. package/dist/runtime-state.js +2 -0
  33. package/package.json +1 -1
@@ -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;AAmCnD,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,CAsnBf"}
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"}
@@ -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
- attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
723
- attempts.push('no-progress.detected');
724
- noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
725
- if (noProgressDiagnosis) {
726
- attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
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
- (policy === 'selection' || policy === 'date-selection')
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,8 +1640,86 @@ 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
+
1671
+ const surfacePositionTraitsOf = (surface) => {
1672
+ if (!isHTMLElementNode(surface) || !isVisible(surface)) return undefined;
1673
+
1674
+ const style = window.getComputedStyle(surface);
1675
+ const position = (style.position || '').toLowerCase();
1676
+ const rect = surface.getBoundingClientRect();
1677
+ const interactiveCount = visibleInteractiveDescendantCountOf(surface);
1678
+ const viewportArea = Math.max(window.innerWidth * window.innerHeight, 1);
1679
+ const coverage = (rect.width * rect.height) / viewportArea;
1680
+ const zIndexValue = Number(style.zIndex || '0');
1681
+ const hasCardChrome =
1682
+ style.boxShadow !== 'none' ||
1683
+ parseFloat(style.borderTopWidth || '0') > 0 ||
1684
+ parseFloat(style.borderRightWidth || '0') > 0 ||
1685
+ parseFloat(style.borderBottomWidth || '0') > 0 ||
1686
+ parseFloat(style.borderLeftWidth || '0') > 0 ||
1687
+ (style.backgroundColor &&
1688
+ style.backgroundColor !== 'transparent' &&
1689
+ style.backgroundColor !== 'rgba(0, 0, 0, 0)');
1690
+
1691
+ if (rect.width < 180 || rect.height < 72 || interactiveCount < 1 || coverage > 0.45) {
1692
+ return undefined;
1693
+ }
1694
+
1695
+ if (position === 'fixed') {
1696
+ return { kind: 'floating-panel', priority: 92 };
1697
+ }
1698
+
1699
+ if (position === 'sticky') {
1700
+ return { kind: 'sticky-panel', priority: 88 };
1701
+ }
1702
+
1703
+ if (position === 'absolute' && hasCardChrome && zIndexValue > 0) {
1704
+ return { kind: 'floating-panel', priority: 82 };
1705
+ }
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
+
1716
+ return undefined;
1717
+ };
1718
+
1643
1719
  const inferSurfaceKind = (surface) => {
1644
1720
  if (!isHTMLElementNode(surface)) return undefined;
1721
+ const positionedSurface = surfacePositionTraitsOf(surface);
1722
+ if (positionedSurface?.kind) return positionedSurface.kind;
1645
1723
  const role = surface.getAttribute('role')?.trim();
1646
1724
  if (role === 'dialog') return 'dialog';
1647
1725
  if (role === 'listbox') return 'listbox';
@@ -1692,6 +1770,8 @@ async function collectDomTargetsFromDocument(context, options) {
1692
1770
 
1693
1771
  const surfacePriorityOf = (surface) => {
1694
1772
  if (!isHTMLElementNode(surface)) return 0;
1773
+ const positionedSurface = surfacePositionTraitsOf(surface);
1774
+ if (positionedSurface?.priority) return positionedSurface.priority;
1695
1775
  const role = surface.getAttribute('role')?.trim() || '';
1696
1776
  const className = (surface.getAttribute('class') || '').toLowerCase();
1697
1777
  if (role === 'dialog' || surface.getAttribute('aria-modal') === 'true') return 100;
@@ -2094,17 +2174,47 @@ async function collectDomTargetsFromDocument(context, options) {
2094
2174
  .filter((element) => isVisible(element));
2095
2175
 
2096
2176
  const localSurfaceCandidateOf = (element) => {
2097
- const candidates = [itemOf(element), containerOf(element)].filter((candidate) => {
2098
- return (
2099
- isHTMLElementNode(candidate) &&
2100
- candidate !== element &&
2101
- !candidate.matches?.(overlaySurfaceSelector) &&
2102
- isVisible(candidate) &&
2103
- surfacePriorityOf(candidate) > 0
2104
- );
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;
2105
2215
  });
2106
2216
 
2107
- return candidates[0];
2217
+ return ranked[0]?.element;
2108
2218
  };
2109
2219
 
2110
2220
  const surfaceSelectorsOf = (element, localSurface) => {
@@ -2304,6 +2414,36 @@ async function collectDomTargetsFromDocument(context, options) {
2304
2414
  return false;
2305
2415
  };
2306
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
+
2307
2447
  const seen = new Set();
2308
2448
  return enrichDisplayLabels(collectTargets(document))
2309
2449
  .filter((candidate) => {
@@ -2314,7 +2454,26 @@ async function collectDomTargetsFromDocument(context, options) {
2314
2454
  seen.add(key);
2315
2455
  return hasUsefulInventorySignal(candidate);
2316
2456
  })
2317
- .slice(0, collectorOutputLimit);
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);
2318
2477
  })()`);
2319
2478
  if (!Array.isArray(observedTargets)) {
2320
2479
  return [];
@@ -2435,9 +2594,9 @@ async function collectPageSignalsFromDocument(context, options) {
2435
2594
  return 'status';
2436
2595
  }
2437
2596
  if (/toast|snackbar|banner|notice|warning|error|success/.test(classBlob)) {
2438
- return outcomeTextRe.test(text) ? 'outcome' : 'notice';
2597
+ return 'notice';
2439
2598
  }
2440
- return outcomeTextRe.test(text) ? 'outcome' : 'notice';
2599
+ return 'notice';
2441
2600
  };
2442
2601
 
2443
2602
  const seen = new Set();
@@ -11,4 +11,5 @@ export declare function persistObservedSurfacesForPage(session: BrowseSession, p
11
11
  surfaceRefMap: Map<string, string>;
12
12
  };
13
13
  export declare function reconcileObservedTargetsForPage(session: BrowseSession, pageRef: string, observedTargets: ReadonlyArray<Pick<TargetDescriptor, 'ref'>>): void;
14
+ export declare function linkObservedSurfaceGraph(session: BrowseSession, pageRef: string, domTargets: ReadonlyArray<DomObservedTarget>, persistedTargets: ReadonlyArray<TargetDescriptor>, observedScopes: ReadonlyArray<SurfaceDescriptor>, surfaceRefMap: ReadonlyMap<string, string>): SurfaceDescriptor[];
14
15
  //# sourceMappingURL=observe-persistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observe-persistence.d.ts","sourceRoot":"","sources":["../../src/commands/observe-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAmF/B;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,OAAO,EAAE,gBAAgB,EAAE,GAC1B,IAAI,CAYN;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACzC,OAAO,CAAC,EAAE;IACR,gBAAgB,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C,GACA;IACD,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAgEA;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAC5D,IAAI,CAsBN"}
1
+ {"version":3,"file":"observe-persistence.d.ts","sourceRoot":"","sources":["../../src/commands/observe-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQhE,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAmF/B;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,OAAO,EAAE,gBAAgB,EAAE,GAC1B,IAAI,CAYN;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACzC,OAAO,CAAC,EAAE;IACR,gBAAgB,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C,GACA;IACD,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAgEA;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAC5D,IAAI,CAsBN;AAUD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACjD,cAAc,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAChD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,iBAAiB,EAAE,CAmDrB"}
@@ -1,5 +1,5 @@
1
1
  import { ensureRuntimeState, markSurfaceLifecycle, markTargetLifecycle, replaceSurfacesForPage, setSurfaceAvailability, setTargetAvailability, } from '../runtime-state.js';
2
- import { collectSurfaceDescriptors, pushUniqueLocatorCandidate, surfaceReplacementKey } from './observe-surfaces.js';
2
+ import { buildSyntheticFormSurfaceId, collectSurfaceDescriptors, pushUniqueLocatorCandidate, surfaceReplacementKey, } from './observe-surfaces.js';
3
3
  export function toDomDescriptor(pageRef, target, surfaceRefMap) {
4
4
  const locatorCandidates = [];
5
5
  if (target.role && target.label) {
@@ -168,3 +168,54 @@ export function reconcileObservedTargetsForPage(session, pageRef, observedTarget
168
168
  setTargetAvailability(session, target.ref, 'hidden', 'target-not-observed');
169
169
  }
170
170
  }
171
+ function pushUniqueRef(map, key, ref) {
172
+ const refs = map.get(key) ?? [];
173
+ if (!refs.includes(ref)) {
174
+ refs.push(ref);
175
+ map.set(key, refs);
176
+ }
177
+ }
178
+ export function linkObservedSurfaceGraph(session, pageRef, domTargets, persistedTargets, observedScopes, surfaceRefMap) {
179
+ const runtime = ensureRuntimeState(session);
180
+ const activeSurfaceRefs = new Set(observedScopes.map((scope) => scope.ref));
181
+ const targetRefsBySurface = new Map();
182
+ const parentBySurface = new Map();
183
+ const childRefsByParent = new Map();
184
+ for (const [index, persistedTarget] of persistedTargets.entries()) {
185
+ if (persistedTarget.pageRef !== pageRef) {
186
+ continue;
187
+ }
188
+ if (persistedTarget.surfaceRef) {
189
+ pushUniqueRef(targetRefsBySurface, persistedTarget.surfaceRef, persistedTarget.ref);
190
+ }
191
+ const domTarget = domTargets[index];
192
+ if (!domTarget) {
193
+ continue;
194
+ }
195
+ const syntheticFormSurfaceId = buildSyntheticFormSurfaceId(domTarget);
196
+ const formSurfaceRef = syntheticFormSurfaceId
197
+ ? surfaceRefMap.get(syntheticFormSurfaceId)
198
+ : undefined;
199
+ if (!formSurfaceRef || !persistedTarget.surfaceRef || persistedTarget.surfaceRef === formSurfaceRef) {
200
+ continue;
201
+ }
202
+ parentBySurface.set(persistedTarget.surfaceRef, formSurfaceRef);
203
+ pushUniqueRef(childRefsByParent, formSurfaceRef, persistedTarget.surfaceRef);
204
+ }
205
+ for (const surface of Object.values(runtime.surfaces)) {
206
+ if (surface.pageRef !== pageRef) {
207
+ continue;
208
+ }
209
+ runtime.surfaces[surface.ref] = {
210
+ ...surface,
211
+ parentSurfaceRef: activeSurfaceRefs.has(surface.ref)
212
+ ? parentBySurface.get(surface.ref)
213
+ : undefined,
214
+ childSurfaceRefs: activeSurfaceRefs.has(surface.ref)
215
+ ? [...(childRefsByParent.get(surface.ref) ?? [])]
216
+ : [],
217
+ targetRefs: activeSurfaceRefs.has(surface.ref) ? [...(targetRefsBySurface.get(surface.ref) ?? [])] : [],
218
+ };
219
+ }
220
+ return observedScopes.map((scope) => runtime.surfaces[scope.ref] ?? scope);
221
+ }