@nuanu-ai/agentbrowse 0.2.20 → 0.2.22

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 (90) hide show
  1. package/README.md +42 -9
  2. package/dist/commands/act.d.ts.map +1 -1
  3. package/dist/commands/act.js +100 -73
  4. package/dist/commands/action-acceptance.d.ts +4 -1
  5. package/dist/commands/action-acceptance.d.ts.map +1 -1
  6. package/dist/commands/action-acceptance.js +127 -37
  7. package/dist/commands/action-executor-helpers.d.ts.map +1 -1
  8. package/dist/commands/action-executor-helpers.js +12 -4
  9. package/dist/commands/action-fallbacks.d.ts.map +1 -1
  10. package/dist/commands/action-result-resolution.d.ts.map +1 -1
  11. package/dist/commands/action-result-resolution.js +1 -1
  12. package/dist/commands/action-value-projection.d.ts.map +1 -1
  13. package/dist/commands/datepicker-action-executor.d.ts.map +1 -1
  14. package/dist/commands/datepicker-action-executor.js +1 -1
  15. package/dist/commands/descriptor-validation.d.ts.map +1 -1
  16. package/dist/commands/descriptor-validation.js +13 -172
  17. package/dist/commands/extract-scoped-dialog-text.d.ts.map +1 -1
  18. package/dist/commands/extract-scoped-dialog-text.js +1 -4
  19. package/dist/commands/extract-snapshot-sanitizer.d.ts.map +1 -1
  20. package/dist/commands/extract-stagehand-executor.d.ts.map +1 -1
  21. package/dist/commands/extract.d.ts.map +1 -1
  22. package/dist/commands/extract.js +23 -4
  23. package/dist/commands/observe-accessibility.d.ts +22 -0
  24. package/dist/commands/observe-accessibility.d.ts.map +1 -0
  25. package/dist/commands/observe-accessibility.js +497 -0
  26. package/dist/commands/observe-display-label.d.ts +4 -0
  27. package/dist/commands/observe-display-label.d.ts.map +1 -0
  28. package/dist/commands/observe-display-label.js +26 -0
  29. package/dist/commands/observe-dom-label-contract.d.ts +2 -0
  30. package/dist/commands/observe-dom-label-contract.d.ts.map +1 -0
  31. package/dist/commands/observe-dom-label-contract.js +521 -0
  32. package/dist/commands/observe-fallback-semantics.d.ts +6 -0
  33. package/dist/commands/observe-fallback-semantics.d.ts.map +1 -0
  34. package/dist/commands/observe-fallback-semantics.js +86 -0
  35. package/dist/commands/observe-inventory.d.ts +23 -18
  36. package/dist/commands/observe-inventory.d.ts.map +1 -1
  37. package/dist/commands/observe-inventory.js +172 -719
  38. package/dist/commands/observe-label-policy.d.ts +8 -0
  39. package/dist/commands/observe-label-policy.d.ts.map +1 -0
  40. package/dist/commands/observe-label-policy.js +21 -0
  41. package/dist/commands/observe-page-state.d.ts +1 -1
  42. package/dist/commands/observe-page-state.d.ts.map +1 -1
  43. package/dist/commands/observe-persistence.d.ts.map +1 -1
  44. package/dist/commands/observe-persistence.js +10 -3
  45. package/dist/commands/observe-projection.d.ts +2 -1
  46. package/dist/commands/observe-projection.d.ts.map +1 -1
  47. package/dist/commands/observe-projection.js +5 -2
  48. package/dist/commands/observe-semantics.d.ts.map +1 -1
  49. package/dist/commands/observe-semantics.js +18 -1
  50. package/dist/commands/observe-signals.d.ts +48 -0
  51. package/dist/commands/observe-signals.d.ts.map +1 -0
  52. package/dist/commands/observe-signals.js +461 -0
  53. package/dist/commands/observe-stagehand.d.ts.map +1 -1
  54. package/dist/commands/observe-stagehand.js +5 -18
  55. package/dist/commands/observe-surfaces.d.ts.map +1 -1
  56. package/dist/commands/observe-surfaces.js +5 -4
  57. package/dist/commands/observe.d.ts +0 -6
  58. package/dist/commands/observe.d.ts.map +1 -1
  59. package/dist/commands/observe.js +30 -6
  60. package/dist/commands/observe.test-harness.d.ts +0 -6
  61. package/dist/commands/observe.test-harness.d.ts.map +1 -1
  62. package/dist/commands/screenshot.d.ts.map +1 -1
  63. package/dist/commands/select-action-executor.d.ts.map +1 -1
  64. package/dist/commands/select-action-executor.js +1 -1
  65. package/dist/commands/semantic-observe.d.ts.map +1 -1
  66. package/dist/commands/semantic-observe.js +1 -4
  67. package/dist/commands/status.d.ts.map +1 -1
  68. package/dist/commands/text-input-action-executor.d.ts.map +1 -1
  69. package/dist/commands/text-input-action-executor.js +1 -1
  70. package/dist/control-semantics.d.ts.map +1 -1
  71. package/dist/control-semantics.js +2 -6
  72. package/dist/playwright-runtime.d.ts.map +1 -1
  73. package/dist/playwright-runtime.js +3 -4
  74. package/dist/runtime-state.d.ts +3 -0
  75. package/dist/runtime-state.d.ts.map +1 -1
  76. package/dist/runtime-state.js +3 -0
  77. package/dist/secrets/catalog-applicability.d.ts.map +1 -1
  78. package/dist/secrets/form-matcher.d.ts.map +1 -1
  79. package/dist/secrets/form-matcher.js +2 -1
  80. package/dist/secrets/mock-agentpay-backend.d.ts +1 -1
  81. package/dist/secrets/mock-agentpay-backend.d.ts.map +1 -1
  82. package/dist/secrets/mock-agentpay-backend.js +2 -4
  83. package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -1
  84. package/dist/secrets/mock-agentpay-cabinet.js +6 -1
  85. package/dist/secrets/protected-field-values.d.ts.map +1 -1
  86. package/dist/secrets/protected-field-values.js +1 -1
  87. package/dist/secrets/protected-fill.d.ts.map +1 -1
  88. package/dist/secrets/protected-fill.js +16 -4
  89. package/dist/solver/captcha-detector.d.ts.map +1 -1
  90. package/package.json +3 -3
package/README.md CHANGED
@@ -5,7 +5,8 @@ Browser automation CLI for AI agents.
5
5
  `agentbrowse` controls a CDP-reachable browser for external agents that need
6
6
  explicit browser primitives. It navigates pages, observes UI surfaces and
7
7
  target refs, performs actions, extracts structured data, captures screenshots,
8
- and optionally solves captchas when the active session supports it.
8
+ supports protected stored-secret fill flows, and can solve captchas when the
9
+ active session supports them.
9
10
 
10
11
  This package publishes the public `agentbrowse` CLI.
11
12
 
@@ -32,10 +33,18 @@ agentbrowse launch https://example.com
32
33
 
33
34
  ## Commands
34
35
 
36
+ Configure AgentPay gateway access:
37
+
38
+ ```bash
39
+ agentbrowse init ap_...
40
+ agentbrowse init ap_... --api-url https://your-project.supabase.co/functions/v1/api
41
+ ```
42
+
35
43
  Launch browser and optionally navigate:
36
44
 
37
45
  ```bash
38
46
  agentbrowse launch https://example.com
47
+ agentbrowse launch https://example.com --headless
39
48
  ```
40
49
 
41
50
  Navigate current session:
@@ -48,6 +57,7 @@ Observe available actions/elements:
48
57
 
49
58
  ```bash
50
59
  agentbrowse observe
60
+ agentbrowse observe "open checkout and find the pay button"
51
61
  ```
52
62
 
53
63
  Act on a previously observed target:
@@ -68,10 +78,11 @@ agentbrowse extract '{"shipping":"string"}' t21
68
78
  `extract` is for bounded structured page data; do not use it to enumerate
69
79
  buttons, links, inputs, or refs when `observe` already provides that inventory.
70
80
 
71
- Solve captcha when the active session supports it:
81
+ Capture a screenshot:
72
82
 
73
83
  ```bash
74
- agentbrowse solve-captcha --timeout 90
84
+ agentbrowse screenshot
85
+ agentbrowse screenshot --path ./checkout.png
75
86
  ```
76
87
 
77
88
  Inspect or close the current session:
@@ -81,11 +92,25 @@ agentbrowse status
81
92
  agentbrowse close
82
93
  ```
83
94
 
84
- Persist AgentPay gateway config for future runs:
95
+ Refresh stored-secret metadata for the current page or a specific URL:
85
96
 
86
97
  ```bash
87
- agentbrowse init ap_...
88
- agentbrowse init ap_... --api-url https://your-project.supabase.co/functions/v1/api
98
+ agentbrowse get-secrets-catalog
99
+ agentbrowse get-secrets-catalog https://example.com/checkout
100
+ ```
101
+
102
+ Create and complete a protected stored-secret fill:
103
+
104
+ ```bash
105
+ agentbrowse create-intent f12 ss_card_visa
106
+ agentbrowse poll-intent intent_123
107
+ agentbrowse fill-secret f12 intent_123
108
+ ```
109
+
110
+ Solve captcha when the active session supports it:
111
+
112
+ ```bash
113
+ agentbrowse solve-captcha --timeout 90
89
114
  ```
90
115
 
91
116
  ## Configure
@@ -103,18 +128,26 @@ overrides.
103
128
  ## Runtime model
104
129
 
105
130
  - `agentbrowse` persists the active browser session under `~/.agentpay`
131
+ - `agentbrowse init` persists AgentPay gateway configuration for future runs
106
132
  - mock stored secrets for live/manual runs come from one canonical file:
107
133
  `~/.agentpay/mock-stored-secrets.json`
108
- - repo JSON fixtures under `src/secrets/` are fallback seeds and test inputs, not an additional runtime config source
134
+ - repo JSON fixtures under `src/secrets/` are fallback seeds and test inputs,
135
+ not an additional runtime config source
109
136
  - all commands require AgentPay gateway configuration; prefer `agentbrowse init`
110
137
  and use env vars only as runtime overrides
111
138
  - the external AI agent remains the orchestration owner
112
139
  - `agentbrowse` is a single-step browser toolset, not an internal reactive form loop
113
140
  - runtime may enrich `observe` output with semantic hints and validation evidence, but it should not silently auto-submit, auto-retry, or maintain hidden durable field-state machines on behalf of the agent
141
+ - protected fills use an explicit intent flow:
142
+ - `get-secrets-catalog(url?)`
143
+ - `create-intent(fillRef, storedSecretRef)`
144
+ - `poll-intent(intentId)`
145
+ - `fill-secret(fillRef, intentId)`
114
146
  - main workflow is:
115
147
  - `observe(goal?)`
116
148
  - `act(targetRef, action, value?)`
117
149
  - `extract(schema, scopeRef?)`
150
+ - screenshots are explicit via `screenshot [--path <file>]`
118
151
  - `solve-captcha` requires both:
119
152
  - a session with captcha-solving capability
120
153
  - AgentPay gateway configuration
@@ -137,7 +170,7 @@ Default verification for this package is no longer unit-only:
137
170
 
138
171
  See package docs:
139
172
 
140
- - [packages/browse-cli/docs/README.md](/Users/dmitry/Dev/mercuryo-agent-pay/packages/browse-cli/docs/README.md)
141
- - [packages/browse-cli/docs/testing/cli-usage-guide.md](/Users/dmitry/Dev/mercuryo-agent-pay/packages/browse-cli/docs/testing/cli-usage-guide.md)
173
+ - [Package docs index](https://github.com/nuanu-ai/mercuryo-agent-pay/tree/main/packages/browse-cli/docs)
174
+ - [CLI usage guide](https://github.com/nuanu-ai/mercuryo-agent-pay/blob/main/packages/browse-cli/docs/testing/cli-usage-guide.md)
142
175
 
143
176
  Releases are published automatically from `main` after checks pass. `@nuanu-ai/agentbrowse` is the only CLI package published by the current npm release workflow.
@@ -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;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,CAmqBf"}
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;AAqCnD,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAyHxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,CAAC;AA4V7B,wBAAsB,GAAG,CACvB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAmsBf"}
@@ -4,7 +4,7 @@
4
4
  import { saveSession } from '../session.js';
5
5
  import { clearProtectedExposure, getProtectedExposure, getSurface, getTarget, incrementMetric, locatorCandidateKey, markTargetLifecycle, recordActionResult, registerPage, setTargetAvailability, setCurrentPage, updateTarget, } from '../runtime-state.js';
6
6
  import { outputContractFailure, outputFailure, outputJSON } from '../output.js';
7
- import { capturePageObservation, captureLocatorContextHash, captureLocatorState, createAcceptanceProbe, diagnoseNoObservableProgress, locatorStateChanged, pageObservationChanged, rankLocatorCandidates, shouldVerifyObservableProgress, waitForAcceptanceProbe, } from './action-acceptance.js';
7
+ import { capturePageObservation, captureLocatorContextHash, captureLocatorState, createAcceptanceProbe, diagnoseNoObservableProgress, genericClickObservationChanged, 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
10
  import { resolveSubmitResult } from './action-result-resolution.js';
@@ -141,6 +141,11 @@ function shouldWatchForNewPageAfterAction(target, action) {
141
141
  }
142
142
  return !isEditableLikeTarget(target);
143
143
  }
144
+ function shouldDeferSurfaceResolutionForEditablePress(target, action) {
145
+ return (action === 'press' &&
146
+ isEditableLikeTarget(target) &&
147
+ !target.locatorCandidates.some((candidate) => candidate.scope === 'surface'));
148
+ }
144
149
  function targetUsesSurfaceAsPrimaryLocator(target, surface) {
145
150
  const surfaceCandidates = new Set(surface.locatorCandidates.map(locatorCandidateKey));
146
151
  return target.locatorCandidates.some((candidate) => surfaceCandidates.has(locatorCandidateKey(candidate)));
@@ -486,7 +491,8 @@ export async function act(session, targetRef, action, value) {
486
491
  return true;
487
492
  };
488
493
  const assertResolvedTargetStillValid = async (resolvedLocator, stage) => {
489
- if (liveTarget.pageSignature && normalizePageSignature(page.url()) !== liveTarget.pageSignature) {
494
+ if (liveTarget.pageSignature &&
495
+ normalizePageSignature(page.url()) !== liveTarget.pageSignature) {
490
496
  attempts.push(`stale.page-signature:${stage}`);
491
497
  staleReason = 'page-signature-mismatch';
492
498
  throw new Error('stale_target_page_signature_changed');
@@ -513,7 +519,13 @@ export async function act(session, targetRef, action, value) {
513
519
  const beforePages = listPages(browser);
514
520
  const shouldCheckProgress = shouldVerifyObservableProgress(target, action);
515
521
  const beforePageObservation = shouldCheckProgress ? await capturePageObservation(page) : null;
516
- const { baseRoot, locatorRoot, surfaceRoot } = await resolveActionRoot(page, target, attempts, surface);
522
+ const deferSurfaceResolution = shouldDeferSurfaceResolutionForEditablePress(target, action);
523
+ let baseRoot = resolveLocatorRoot(page, target.framePath ?? surface?.framePath);
524
+ let locatorRoot = baseRoot;
525
+ let surfaceRoot = null;
526
+ if (!deferSurfaceResolution) {
527
+ ({ baseRoot, locatorRoot, surfaceRoot } = await resolveActionRoot(page, target, attempts, surface));
528
+ }
517
529
  let lastError = null;
518
530
  let sawDomSignatureMismatch = false;
519
531
  let sawDisabledTarget = false;
@@ -632,35 +644,46 @@ export async function act(session, targetRef, action, value) {
632
644
  const popupPromise = watchForNewPage
633
645
  ? waitForPopup(page.context())
634
646
  : Promise.resolve(null);
635
- for (const candidate of rankLocatorCandidates(target.locatorCandidates, action)) {
636
- const candidateRoot = resolveLocatorRootForCandidate(baseRoot, locatorRoot, surfaceRoot, candidate);
637
- if (!candidateRoot) {
638
- attempts.push(`resolve.skip:${candidate.strategy}:surface-unavailable`);
639
- continue;
640
- }
641
- const locator = buildLocator(candidateRoot, candidate);
642
- if (!locator)
643
- continue;
644
- const preparedLocator = await prepareLocatorForAction(locator, action, candidate.strategy, attempts, {
645
- allowReadonlyFallback: action === 'fill' && target.controlFamily === 'datepicker',
646
- allowDescendantPressFallback: action === 'press' &&
647
- (target.controlFamily === 'text-input' ||
648
- target.controlFamily === 'select' ||
649
- target.controlFamily === 'datepicker'),
650
- });
651
- if (preparedLocator.blockedReason === 'disabled') {
652
- sawDisabledTarget = true;
653
- }
654
- if (preparedLocator.blockedReason === 'readonly') {
655
- sawReadonlyTarget = true;
656
- }
657
- const resolvedLocator = preparedLocator.locator;
658
- if (!resolvedLocator) {
659
- continue;
647
+ const tryRankedCandidates = async () => {
648
+ for (const candidate of rankLocatorCandidates(target.locatorCandidates, action)) {
649
+ const candidateRoot = resolveLocatorRootForCandidate(baseRoot, locatorRoot, surfaceRoot, candidate);
650
+ if (!candidateRoot) {
651
+ attempts.push(`resolve.skip:${candidate.strategy}:surface-unavailable`);
652
+ continue;
653
+ }
654
+ const locator = buildLocator(candidateRoot, candidate);
655
+ if (!locator)
656
+ continue;
657
+ const preparedLocator = await prepareLocatorForAction(locator, action, candidate.strategy, attempts, {
658
+ allowReadonlyFallback: action === 'fill' && target.controlFamily === 'datepicker',
659
+ allowDescendantPressFallback: action === 'press' &&
660
+ (target.controlFamily === 'text-input' ||
661
+ target.controlFamily === 'select' ||
662
+ target.controlFamily === 'datepicker'),
663
+ });
664
+ if (preparedLocator.blockedReason === 'disabled') {
665
+ sawDisabledTarget = true;
666
+ }
667
+ if (preparedLocator.blockedReason === 'readonly') {
668
+ sawReadonlyTarget = true;
669
+ }
670
+ const resolvedLocator = preparedLocator.locator;
671
+ if (!resolvedLocator) {
672
+ continue;
673
+ }
674
+ const resolved = await attemptResolvedLocator(resolvedLocator, candidate.strategy);
675
+ if (resolved) {
676
+ break;
677
+ }
660
678
  }
661
- const resolved = await attemptResolvedLocator(resolvedLocator, candidate.strategy);
662
- if (resolved) {
663
- break;
679
+ };
680
+ await tryRankedCandidates();
681
+ if (!resolvedBy && !lastError && deferSurfaceResolution && surface) {
682
+ const deferredSurfaceRoot = await resolveSurfaceScopeRoot(page, surface, attempts);
683
+ if (deferredSurfaceRoot) {
684
+ surfaceRoot = deferredSurfaceRoot;
685
+ locatorRoot = targetUsesSurfaceAsPrimaryLocator(target, surface) ? baseRoot : surfaceRoot;
686
+ await tryRankedCandidates();
664
687
  }
665
688
  }
666
689
  if (!resolvedBy && !lastError && surfaceRoot) {
@@ -735,53 +758,57 @@ export async function act(session, targetRef, action, value) {
735
758
  if (acceptance.polls > 1) {
736
759
  attempts.push(`acceptance.polled:${acceptance.polls}`);
737
760
  }
738
- if (!accepted && finalProgressProbe.policy === 'value-change') {
739
- attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
740
- throw new Error('action_postcondition_failed:value-change');
741
- }
742
- else if (!accepted &&
743
- (finalProgressProbe.policy === 'selection' ||
744
- finalProgressProbe.policy === 'date-selection') &&
745
- finalProgressProbe.expectedValue !== null) {
746
- attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
747
- throw new Error(`action_postcondition_failed:${finalProgressProbe.policy}`);
748
- }
749
- else if (!accepted && finalProgressProbe.policy === 'submit') {
750
- const submitResolution = await resolveSubmitResult(finalProgressProbe, afterPageObservation);
751
- if (submitResolution.acceptAsProgress) {
752
- attempts.push(`submit-resolution:${submitResolution.finalVerdict}`);
753
- if (submitResolution.claims.some((claim) => claim.kind === 'soft_result_candidate')) {
754
- attempts.push('submit-resolution:soft-result-candidate');
755
- }
761
+ if (!accepted) {
762
+ if (finalProgressProbe.policy === 'value-change') {
763
+ attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
764
+ throw new Error('action_postcondition_failed:value-change');
756
765
  }
757
- else {
766
+ if ((finalProgressProbe.policy === 'selection' ||
767
+ finalProgressProbe.policy === 'date-selection') &&
768
+ finalProgressProbe.expectedValue !== null) {
758
769
  attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
759
- attempts.push('no-progress.detected');
760
- noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
761
- if (noProgressDiagnosis) {
762
- attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
770
+ throw new Error(`action_postcondition_failed:${finalProgressProbe.policy}`);
771
+ }
772
+ if (finalProgressProbe.policy === 'submit') {
773
+ const submitResolution = await resolveSubmitResult(finalProgressProbe, afterPageObservation);
774
+ if (submitResolution.acceptAsProgress) {
775
+ attempts.push(`submit-resolution:${submitResolution.finalVerdict}`);
776
+ if (submitResolution.claims.some((claim) => claim.kind === 'soft_result_candidate')) {
777
+ attempts.push('submit-resolution:soft-result-candidate');
778
+ }
779
+ }
780
+ else {
781
+ attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
782
+ attempts.push('no-progress.detected');
783
+ noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
784
+ if (noProgressDiagnosis) {
785
+ attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
786
+ }
787
+ throw new Error('no_observable_progress');
763
788
  }
764
- throw new Error('no_observable_progress');
765
789
  }
766
- }
767
- else if (!accepted) {
768
- const afterLocatorObservation = finalProgressProbe.trackedStateKeys.length > 0
769
- ? await captureLocatorState(finalProgressProbe.locator, finalProgressProbe.trackedStateKeys)
770
- : null;
771
- const afterContextHash = await captureLocatorContextHash(finalProgressProbe.locator);
772
- const hasComparableSignal = finalProgressProbe.trackedStateKeys.length > 0 ||
773
- Boolean(finalProgressProbe.beforeContextHash || afterContextHash) ||
774
- Boolean(finalProgressProbe.beforePage || afterPageObservation);
775
- if (hasComparableSignal &&
776
- !pageObservationChanged(finalProgressProbe.beforePage, afterPageObservation) &&
777
- finalProgressProbe.beforeContextHash === afterContextHash &&
778
- !locatorStateChanged(finalProgressProbe.beforeLocator, afterLocatorObservation)) {
779
- attempts.push('no-progress.detected');
780
- noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
781
- if (noProgressDiagnosis) {
782
- attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
790
+ else {
791
+ const afterLocatorObservation = finalProgressProbe.trackedStateKeys.length > 0
792
+ ? await captureLocatorState(finalProgressProbe.locator, finalProgressProbe.trackedStateKeys)
793
+ : null;
794
+ const afterContextHash = await captureLocatorContextHash(finalProgressProbe.locator);
795
+ const hasComparableSignal = finalProgressProbe.trackedStateKeys.length > 0 ||
796
+ Boolean(finalProgressProbe.beforeContextHash || afterContextHash) ||
797
+ Boolean(finalProgressProbe.beforePage || afterPageObservation);
798
+ const pageProgressChanged = finalProgressProbe.policy === 'generic-click'
799
+ ? genericClickObservationChanged(finalProgressProbe.beforePage, afterPageObservation)
800
+ : pageObservationChanged(finalProgressProbe.beforePage, afterPageObservation);
801
+ if (hasComparableSignal &&
802
+ !pageProgressChanged &&
803
+ finalProgressProbe.beforeContextHash === afterContextHash &&
804
+ !locatorStateChanged(finalProgressProbe.beforeLocator, afterLocatorObservation)) {
805
+ attempts.push('no-progress.detected');
806
+ noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
807
+ if (noProgressDiagnosis) {
808
+ attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
809
+ }
810
+ throw new Error('no_observable_progress');
783
811
  }
784
- throw new Error('no_observable_progress');
785
812
  }
786
813
  }
787
814
  }
@@ -63,7 +63,9 @@ export declare function capturePageObservation(page: Page): Promise<PageObservat
63
63
  export declare function captureLocatorContextHash(locator: Locator): Promise<string | null>;
64
64
  declare function comparableValueTypeForTarget(target: TargetDescriptor): ComparableValueType | undefined;
65
65
  declare function normalizeComparableValue(value: string | null, comparableValueType?: ComparableValueType): string;
66
- declare function valuesMatchExpected(expected: string | null, actual: string | null, comparableValueType?: ComparableValueType): boolean;
66
+ declare function valuesMatchExpected(expected: string | null, actual: string | null, comparableValueType?: ComparableValueType, options?: {
67
+ allowCompactActualSequence?: boolean;
68
+ }): boolean;
67
69
  export declare const __testComparableValues: {
68
70
  comparableValueTypeForTarget: typeof comparableValueTypeForTarget;
69
71
  normalizeComparableValue: typeof normalizeComparableValue;
@@ -72,6 +74,7 @@ export declare const __testComparableValues: {
72
74
  export declare function captureLocatorState(locator: Locator, keys: ReadonlyArray<TargetStateKey>): Promise<LocatorStateObservation | null>;
73
75
  export declare function locatorStateChanged(before: LocatorStateObservation | null, after: LocatorStateObservation | null): boolean;
74
76
  export declare function pageObservationChanged(before: PageObservation | null, after: PageObservation | null): boolean;
77
+ export declare function genericClickObservationChanged(before: PageObservation | null, after: PageObservation | null): boolean;
75
78
  export declare function submitObservationChanged(before: PageObservation | null, after: PageObservation | null): boolean;
76
79
  export declare function diagnoseNoObservableProgress(page: Page, locator: Locator): Promise<NoObservableProgressDiagnosis | null>;
77
80
  export declare function createAcceptanceProbe(args: {
@@ -1 +1 @@
1
- {"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAc,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,KAAK,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9F,KAAK,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AAEjF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,WAAW,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1D,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC9C,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAClD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,WAAW,CAAC;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH,CAAC;AA8qBF,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,EACjG,MAAM,EAAE,YAAY,oDAYrB;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,GACnB,OAAO,CAMT;AAmGD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAoCjF;AA6BD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxF;AAuHD,iBAAS,4BAA4B,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,SAAS,CAa/F;AAED,iBAAS,wBAAwB,CAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,MAAM,CA2CR;AAED,iBAAS,mBAAmB,CAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAOT;AAuGD,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,aAAa,CAAC,cAAc,CAAC,GAClC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA2GzC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,uBAAuB,GAAG,IAAI,EACtC,KAAK,EAAE,uBAAuB,GAAG,IAAI,GACpC,OAAO,CAoBT;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,eAAe,GAAG,IAAI,GAC5B,OAAO,CAcT;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,eAAe,GAAG,IAAI,GAC5B,OAAO,CAsBT;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAsG/C;AA8DD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/C,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkFlC;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,eAAe,EACtB,oBAAoB,EAAE,eAAe,GAAG,IAAI,GAC3C,OAAO,CAAC,OAAO,CAAC,CAgKlB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,qBAAqB,CAAC,CA6BhC"}
1
+ {"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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"}