@mercuryo-ai/agentbrowse 0.2.50
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/CHANGELOG.md +15 -0
- package/README.md +335 -0
- package/dist/assistive-runtime.d.ts +110 -0
- package/dist/assistive-runtime.d.ts.map +1 -0
- package/dist/assistive-runtime.js +79 -0
- package/dist/assistive-runtime.test-support.d.ts +7 -0
- package/dist/assistive-runtime.test-support.d.ts.map +1 -0
- package/dist/assistive-runtime.test-support.js +106 -0
- package/dist/assistive-stagehand.d.ts +12 -0
- package/dist/assistive-stagehand.d.ts.map +1 -0
- package/dist/assistive-stagehand.js +10 -0
- package/dist/browser-session-state.d.ts +95 -0
- package/dist/browser-session-state.d.ts.map +1 -0
- package/dist/browser-session-state.js +279 -0
- package/dist/client-bindings.d.ts +10 -0
- package/dist/client-bindings.d.ts.map +1 -0
- package/dist/client-bindings.js +18 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +63 -0
- package/dist/command-api-tracing.d.ts +20 -0
- package/dist/command-api-tracing.d.ts.map +1 -0
- package/dist/command-api-tracing.js +149 -0
- package/dist/command-name.d.ts +3 -0
- package/dist/command-name.d.ts.map +1 -0
- package/dist/command-name.js +11 -0
- package/dist/commands/act.d.ts +43 -0
- package/dist/commands/act.d.ts.map +1 -0
- package/dist/commands/act.js +1107 -0
- package/dist/commands/action-acceptance.d.ts +93 -0
- package/dist/commands/action-acceptance.d.ts.map +1 -0
- package/dist/commands/action-acceptance.js +1938 -0
- package/dist/commands/action-artifacts.d.ts +33 -0
- package/dist/commands/action-artifacts.d.ts.map +1 -0
- package/dist/commands/action-artifacts.js +104 -0
- package/dist/commands/action-execution-guards.d.ts +5 -0
- package/dist/commands/action-execution-guards.d.ts.map +1 -0
- package/dist/commands/action-execution-guards.js +3 -0
- package/dist/commands/action-executor-helpers.d.ts +21 -0
- package/dist/commands/action-executor-helpers.d.ts.map +1 -0
- package/dist/commands/action-executor-helpers.js +265 -0
- package/dist/commands/action-executor.d.ts +14 -0
- package/dist/commands/action-executor.d.ts.map +1 -0
- package/dist/commands/action-executor.js +46 -0
- package/dist/commands/action-fallbacks.d.ts +6 -0
- package/dist/commands/action-fallbacks.d.ts.map +1 -0
- package/dist/commands/action-fallbacks.js +43 -0
- 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 +132 -0
- package/dist/commands/action-value-projection.d.ts +32 -0
- package/dist/commands/action-value-projection.d.ts.map +1 -0
- package/dist/commands/action-value-projection.js +151 -0
- package/dist/commands/attach.d.ts +41 -0
- package/dist/commands/attach.d.ts.map +1 -0
- package/dist/commands/attach.js +103 -0
- package/dist/commands/browse-actions.d.ts +4 -0
- package/dist/commands/browse-actions.d.ts.map +1 -0
- package/dist/commands/browse-actions.js +4 -0
- package/dist/commands/browser-status.d.ts +57 -0
- package/dist/commands/browser-status.d.ts.map +1 -0
- package/dist/commands/browser-status.js +243 -0
- package/dist/commands/click-action-executor.d.ts +12 -0
- package/dist/commands/click-action-executor.d.ts.map +1 -0
- package/dist/commands/click-action-executor.js +111 -0
- package/dist/commands/click-activation-policy.d.ts +5 -0
- package/dist/commands/click-activation-policy.d.ts.map +1 -0
- package/dist/commands/click-activation-policy.js +13 -0
- package/dist/commands/close.d.ts +26 -0
- package/dist/commands/close.d.ts.map +1 -0
- package/dist/commands/close.js +124 -0
- package/dist/commands/datepicker-action-executor.d.ts +12 -0
- package/dist/commands/datepicker-action-executor.d.ts.map +1 -0
- package/dist/commands/datepicker-action-executor.js +218 -0
- package/dist/commands/descriptor-validation.d.ts +27 -0
- package/dist/commands/descriptor-validation.d.ts.map +1 -0
- package/dist/commands/descriptor-validation.js +192 -0
- package/dist/commands/extract-scope-resolution.d.ts +20 -0
- package/dist/commands/extract-scope-resolution.d.ts.map +1 -0
- package/dist/commands/extract-scope-resolution.js +109 -0
- package/dist/commands/extract-scoped-dialog-text.d.ts +3 -0
- package/dist/commands/extract-scoped-dialog-text.d.ts.map +1 -0
- package/dist/commands/extract-scoped-dialog-text.js +210 -0
- package/dist/commands/extract-snapshot-sanitizer.d.ts +5 -0
- package/dist/commands/extract-snapshot-sanitizer.d.ts.map +1 -0
- package/dist/commands/extract-snapshot-sanitizer.js +98 -0
- package/dist/commands/extract-stagehand-executor.d.ts +17 -0
- package/dist/commands/extract-stagehand-executor.d.ts.map +1 -0
- package/dist/commands/extract-stagehand-executor.js +112 -0
- package/dist/commands/extract.d.ts +57 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +668 -0
- package/dist/commands/interaction-kernel.d.ts +46 -0
- package/dist/commands/interaction-kernel.d.ts.map +1 -0
- package/dist/commands/interaction-kernel.js +215 -0
- package/dist/commands/launch.d.ts +41 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +182 -0
- package/dist/commands/navigate.d.ts +31 -0
- package/dist/commands/navigate.d.ts.map +1 -0
- package/dist/commands/navigate.js +202 -0
- package/dist/commands/observe-accessibility.d.ts +22 -0
- package/dist/commands/observe-accessibility.d.ts.map +1 -0
- package/dist/commands/observe-accessibility.js +566 -0
- package/dist/commands/observe-display-label.d.ts +4 -0
- package/dist/commands/observe-display-label.d.ts.map +1 -0
- package/dist/commands/observe-display-label.js +26 -0
- package/dist/commands/observe-dom-label-contract.d.ts +2 -0
- package/dist/commands/observe-dom-label-contract.d.ts.map +1 -0
- package/dist/commands/observe-dom-label-contract.js +564 -0
- package/dist/commands/observe-fallback-semantics.d.ts +6 -0
- package/dist/commands/observe-fallback-semantics.d.ts.map +1 -0
- package/dist/commands/observe-fallback-semantics.js +86 -0
- package/dist/commands/observe-inventory.d.ts +149 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -0
- package/dist/commands/observe-inventory.js +3545 -0
- package/dist/commands/observe-label-policy.d.ts +8 -0
- package/dist/commands/observe-label-policy.d.ts.map +1 -0
- package/dist/commands/observe-label-policy.js +21 -0
- package/dist/commands/observe-page-state.d.ts +11 -0
- package/dist/commands/observe-page-state.d.ts.map +1 -0
- package/dist/commands/observe-page-state.js +89 -0
- package/dist/commands/observe-persistence.d.ts +15 -0
- package/dist/commands/observe-persistence.d.ts.map +1 -0
- package/dist/commands/observe-persistence.js +238 -0
- package/dist/commands/observe-projection.d.ts +119 -0
- package/dist/commands/observe-projection.d.ts.map +1 -0
- package/dist/commands/observe-projection.js +726 -0
- package/dist/commands/observe-protected.d.ts +6 -0
- package/dist/commands/observe-protected.d.ts.map +1 -0
- package/dist/commands/observe-protected.js +31 -0
- package/dist/commands/observe-semantics.d.ts +10 -0
- package/dist/commands/observe-semantics.d.ts.map +1 -0
- package/dist/commands/observe-semantics.js +535 -0
- package/dist/commands/observe-signals.d.ts +48 -0
- package/dist/commands/observe-signals.d.ts.map +1 -0
- package/dist/commands/observe-signals.js +461 -0
- package/dist/commands/observe-stagehand.d.ts +49 -0
- package/dist/commands/observe-stagehand.d.ts.map +1 -0
- package/dist/commands/observe-stagehand.js +94 -0
- package/dist/commands/observe-surfaces.d.ts +11 -0
- package/dist/commands/observe-surfaces.d.ts.map +1 -0
- package/dist/commands/observe-surfaces.js +290 -0
- package/dist/commands/observe.d.ts +113 -0
- package/dist/commands/observe.d.ts.map +1 -0
- package/dist/commands/observe.js +556 -0
- package/dist/commands/screenshot.d.ts +37 -0
- package/dist/commands/screenshot.d.ts.map +1 -0
- package/dist/commands/screenshot.js +269 -0
- package/dist/commands/select-action-executor.d.ts +10 -0
- package/dist/commands/select-action-executor.d.ts.map +1 -0
- package/dist/commands/select-action-executor.js +156 -0
- package/dist/commands/semantic-observe-lexical.d.ts +31 -0
- package/dist/commands/semantic-observe-lexical.d.ts.map +1 -0
- package/dist/commands/semantic-observe-lexical.js +186 -0
- package/dist/commands/semantic-observe.d.ts +37 -0
- package/dist/commands/semantic-observe.d.ts.map +1 -0
- package/dist/commands/semantic-observe.js +1339 -0
- package/dist/commands/structured-grid-action-executor.d.ts +3 -0
- package/dist/commands/structured-grid-action-executor.d.ts.map +1 -0
- package/dist/commands/structured-grid-action-executor.js +4 -0
- package/dist/commands/target-resolution.d.ts +4 -0
- package/dist/commands/target-resolution.d.ts.map +1 -0
- package/dist/commands/target-resolution.js +33 -0
- package/dist/commands/text-input-action-executor.d.ts +5 -0
- package/dist/commands/text-input-action-executor.d.ts.map +1 -0
- package/dist/commands/text-input-action-executor.js +116 -0
- package/dist/commands/user-actionable.d.ts +4 -0
- package/dist/commands/user-actionable.d.ts.map +1 -0
- package/dist/commands/user-actionable.js +216 -0
- package/dist/control-semantics.d.ts +30 -0
- package/dist/control-semantics.d.ts.map +1 -0
- package/dist/control-semantics.js +419 -0
- package/dist/diagnostics.d.ts +132 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +120 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +350 -0
- package/dist/library.d.ts +17 -0
- package/dist/library.d.ts.map +1 -0
- package/dist/library.js +14 -0
- package/dist/output.d.ts +32 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +33 -0
- package/dist/owned-browser.d.ts +12 -0
- package/dist/owned-browser.d.ts.map +1 -0
- package/dist/owned-browser.js +69 -0
- package/dist/owned-process.d.ts +19 -0
- package/dist/owned-process.d.ts.map +1 -0
- package/dist/owned-process.js +145 -0
- package/dist/playwright-runtime.d.ts +43 -0
- package/dist/playwright-runtime.d.ts.map +1 -0
- package/dist/playwright-runtime.js +339 -0
- package/dist/protected-fill-browser.d.ts +22 -0
- package/dist/protected-fill-browser.d.ts.map +1 -0
- package/dist/protected-fill-browser.js +52 -0
- package/dist/protected-fill.d.ts +82 -0
- package/dist/protected-fill.d.ts.map +1 -0
- package/dist/protected-fill.js +20 -0
- package/dist/runtime-metrics.d.ts +27 -0
- package/dist/runtime-metrics.d.ts.map +1 -0
- package/dist/runtime-metrics.js +66 -0
- package/dist/runtime-page-state.d.ts +11 -0
- package/dist/runtime-page-state.d.ts.map +1 -0
- package/dist/runtime-page-state.js +62 -0
- package/dist/runtime-protected-state.d.ts +14 -0
- package/dist/runtime-protected-state.d.ts.map +1 -0
- package/dist/runtime-protected-state.js +148 -0
- package/dist/runtime-resolution.d.ts +9 -0
- package/dist/runtime-resolution.d.ts.map +1 -0
- package/dist/runtime-resolution.js +19 -0
- package/dist/runtime-state.d.ts +251 -0
- package/dist/runtime-state.d.ts.map +1 -0
- package/dist/runtime-state.js +599 -0
- package/dist/secrets/catalog-applicability.d.ts +5 -0
- package/dist/secrets/catalog-applicability.d.ts.map +1 -0
- package/dist/secrets/catalog-applicability.js +59 -0
- package/dist/secrets/field-policy.d.ts +3 -0
- package/dist/secrets/field-policy.d.ts.map +1 -0
- package/dist/secrets/field-policy.js +3 -0
- package/dist/secrets/fill-ordering.d.ts +10 -0
- package/dist/secrets/fill-ordering.d.ts.map +1 -0
- package/dist/secrets/fill-ordering.js +41 -0
- package/dist/secrets/form-matcher.d.ts +60 -0
- package/dist/secrets/form-matcher.d.ts.map +1 -0
- package/dist/secrets/form-matcher.js +948 -0
- package/dist/secrets/protected-artifact-guard.d.ts +39 -0
- package/dist/secrets/protected-artifact-guard.d.ts.map +1 -0
- package/dist/secrets/protected-artifact-guard.js +44 -0
- package/dist/secrets/protected-bindings.d.ts +14 -0
- package/dist/secrets/protected-bindings.d.ts.map +1 -0
- package/dist/secrets/protected-bindings.js +29 -0
- package/dist/secrets/protected-exact-value-redaction.d.ts +14 -0
- package/dist/secrets/protected-exact-value-redaction.d.ts.map +1 -0
- package/dist/secrets/protected-exact-value-redaction.js +360 -0
- package/dist/secrets/protected-field-semantics.d.ts +9 -0
- package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
- package/dist/secrets/protected-field-semantics.js +154 -0
- package/dist/secrets/protected-field-values.d.ts +15 -0
- package/dist/secrets/protected-field-values.d.ts.map +1 -0
- package/dist/secrets/protected-field-values.js +131 -0
- package/dist/secrets/protected-fill.d.ts +47 -0
- package/dist/secrets/protected-fill.d.ts.map +1 -0
- package/dist/secrets/protected-fill.js +446 -0
- package/dist/secrets/protected-value-adapters.d.ts +4 -0
- package/dist/secrets/protected-value-adapters.d.ts.map +1 -0
- package/dist/secrets/protected-value-adapters.js +118 -0
- package/dist/secrets/types.d.ts +70 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +30 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +120 -0
- package/dist/solver/browser-launcher.d.ts +14 -0
- package/dist/solver/browser-launcher.d.ts.map +1 -0
- package/dist/solver/browser-launcher.js +799 -0
- package/dist/solver/config.d.ts +18 -0
- package/dist/solver/config.d.ts.map +1 -0
- package/dist/solver/config.js +67 -0
- package/dist/solver/fingerprint.d.ts +9 -0
- package/dist/solver/fingerprint.d.ts.map +1 -0
- package/dist/solver/fingerprint.js +96 -0
- package/dist/solver/profile-manager.d.ts +8 -0
- package/dist/solver/profile-manager.d.ts.map +1 -0
- package/dist/solver/profile-manager.js +74 -0
- package/dist/solver/turnstile-challenge.d.ts +3 -0
- package/dist/solver/turnstile-challenge.d.ts.map +1 -0
- package/dist/solver/turnstile-challenge.js +173 -0
- package/dist/solver/types.d.ts +67 -0
- package/dist/solver/types.d.ts.map +1 -0
- package/dist/solver/types.js +1 -0
- package/dist/stagehand-runtime.d.ts +4 -0
- package/dist/stagehand-runtime.d.ts.map +1 -0
- package/dist/stagehand-runtime.js +10 -0
- package/dist/stagehand.d.ts +15 -0
- package/dist/stagehand.d.ts.map +1 -0
- package/dist/stagehand.js +19 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/update-check.d.ts +14 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +182 -0
- package/dist/workflow-session-state.d.ts +30 -0
- package/dist/workflow-session-state.d.ts.map +1 -0
- package/dist/workflow-session-state.js +74 -0
- package/docs/README.md +25 -0
- package/docs/api-reference.md +242 -0
- package/docs/assistive-runtime.md +148 -0
- package/docs/configuration.md +287 -0
- package/docs/getting-started.md +237 -0
- package/docs/integration-checklist.md +36 -0
- package/docs/protected-fill.md +112 -0
- package/docs/testing.md +50 -0
- package/docs/troubleshooting.md +71 -0
- package/examples/README.md +18 -0
- package/examples/attach.ts +27 -0
- package/examples/basic.ts +36 -0
- package/examples/extract.ts +50 -0
- package/package.json +83 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
const DATE_LIKE_LABEL_RE = /(?:\b\d{1,2}\b|январ|феврал|март|апрел|ма[йя]|июн|июл|август|сентябр|октябр|ноябр|декабр|january|february|march|april|may|june|july|august|september|october|november|december|date|дата|calendar|datepicker|календар)/i;
|
|
2
|
+
const SUBMIT_LABEL_RE = /(?:buy|book|continue|search|find|open|submit|next|pay|купить|забронировать|продолжить|найти|открыть|оплатить)/i;
|
|
3
|
+
const PREREQUISITE_HINT_RE = /(?:choose|select|pick|set|enter|fill|complete)\b.*\b(?:first|before)\b|(?:first|before)\b.*\b(?:choose|select|pick|set|enter|fill|complete)\b|(?:сначала|сперва)\b.*\b(?:выберите|заполните|укажите|введите|завершите)\b|\b(?:выберите|заполните|укажите|введите|завершите)\b.*\b(?:сначала|сперва)\b|required first|available after|unlock/i;
|
|
4
|
+
const PHONE_FIELD_RE = /\b(phone|mobile|telephone|tel)\b/i;
|
|
5
|
+
const CARD_NUMBER_FIELD_RE = /\b(card.?number|cc.?number|cardnumber|pan|cc-number)\b/i;
|
|
6
|
+
const CARD_EXPIRY_FIELD_RE = /\b(exp(?:iry|iration)(?: date)?|cc-exp|valid\s+thru|valid\s+through|mm\s*\/\s*yy(?:yy)?)\b/i;
|
|
7
|
+
const CARD_CVC_FIELD_RE = /\b(cvc|cvv|cc-csc|security code|card cvc)\b/i;
|
|
8
|
+
const DATE_VALUE_MASK_RE = /(?:^|\b)(?:dd|d|дд|д)\s*[./-]\s*(?:mm|m|мм|м)\s*[./-]\s*(?:yyyy|yyy|yy|y|гггг|гг|г)(?:\b|$)/i;
|
|
9
|
+
const NON_CARD_DATE_FIELD_RE = /\b(?:birth|dob|date|issued|expires|expiry|expiration|expir)\b|(?:дата|рожд|срок)/i;
|
|
10
|
+
function normalizeText(value) {
|
|
11
|
+
return (value ?? '').trim().toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
function primaryLabel(facts) {
|
|
14
|
+
return facts.label ?? facts.displayLabel ?? facts.text ?? facts.placeholder ?? '';
|
|
15
|
+
}
|
|
16
|
+
function valueTypeHintBlob(facts) {
|
|
17
|
+
return [
|
|
18
|
+
facts.label,
|
|
19
|
+
facts.displayLabel,
|
|
20
|
+
facts.text,
|
|
21
|
+
facts.placeholder,
|
|
22
|
+
facts.inputName,
|
|
23
|
+
facts.autocomplete,
|
|
24
|
+
]
|
|
25
|
+
.filter((value) => Boolean(value))
|
|
26
|
+
.join(' ')
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
export function inferComparableValueTypeFromFacts(facts) {
|
|
30
|
+
const inputType = normalizeText(facts.inputType);
|
|
31
|
+
const autocomplete = normalizeText(facts.autocomplete);
|
|
32
|
+
const hintBlob = valueTypeHintBlob(facts);
|
|
33
|
+
if (inputType === 'tel' || autocomplete.includes('tel') || PHONE_FIELD_RE.test(hintBlob)) {
|
|
34
|
+
return 'phone';
|
|
35
|
+
}
|
|
36
|
+
if (autocomplete.includes('cc-number') || CARD_NUMBER_FIELD_RE.test(hintBlob)) {
|
|
37
|
+
return 'card-number';
|
|
38
|
+
}
|
|
39
|
+
const cardExpiryLike = autocomplete.includes('cc-exp') ||
|
|
40
|
+
(inputType !== 'date' &&
|
|
41
|
+
CARD_EXPIRY_FIELD_RE.test(hintBlob) &&
|
|
42
|
+
(autocomplete.startsWith('cc-') ||
|
|
43
|
+
/\b(card|credit|debit)\b/i.test(hintBlob) ||
|
|
44
|
+
/\bmm\s*\/\s*yy(?:yy)?\b/i.test(hintBlob)));
|
|
45
|
+
if (cardExpiryLike) {
|
|
46
|
+
return 'expiry';
|
|
47
|
+
}
|
|
48
|
+
if (autocomplete.includes('cc-csc') || CARD_CVC_FIELD_RE.test(hintBlob)) {
|
|
49
|
+
return 'cvc';
|
|
50
|
+
}
|
|
51
|
+
const nonCardDateLike = inputType === 'date' ||
|
|
52
|
+
DATE_VALUE_MASK_RE.test(hintBlob) ||
|
|
53
|
+
(NON_CARD_DATE_FIELD_RE.test(hintBlob) &&
|
|
54
|
+
!autocomplete.startsWith('cc-') &&
|
|
55
|
+
!/\b(card|credit|debit|cvc|cvv|security code)\b/i.test(hintBlob));
|
|
56
|
+
if (nonCardDateLike) {
|
|
57
|
+
return 'date';
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
function isPopupBackedTextEntry(facts) {
|
|
62
|
+
const kind = normalizeText(facts.kind);
|
|
63
|
+
const role = normalizeText(facts.role);
|
|
64
|
+
const surfaceKind = normalizeText(facts.surfaceKind);
|
|
65
|
+
if ((kind === 'input' || kind === 'textarea' || role === 'textbox') &&
|
|
66
|
+
(Boolean(facts.controlsSurfaceSelector) ||
|
|
67
|
+
surfaceKind === 'listbox' ||
|
|
68
|
+
surfaceKind === 'menu' ||
|
|
69
|
+
facts.states?.expanded !== undefined)) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function isPopupBackedComboboxFacts(facts) {
|
|
75
|
+
const kind = normalizeText(facts.kind);
|
|
76
|
+
const role = normalizeText(facts.role);
|
|
77
|
+
const surfaceKind = normalizeText(facts.surfaceKind);
|
|
78
|
+
if (kind !== 'combobox' && role !== 'combobox') {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return (Boolean(facts.controlsSurfaceSelector) ||
|
|
82
|
+
surfaceKind === 'listbox' ||
|
|
83
|
+
surfaceKind === 'menu' ||
|
|
84
|
+
surfaceKind === 'floating-panel' ||
|
|
85
|
+
facts.states?.expanded !== undefined);
|
|
86
|
+
}
|
|
87
|
+
function isSearchableComboboxFacts(facts) {
|
|
88
|
+
const ariaAutocomplete = normalizeText(facts.ariaAutocomplete);
|
|
89
|
+
if (!isPopupBackedComboboxFacts(facts)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return (ariaAutocomplete === 'list' || ariaAutocomplete === 'both' || ariaAutocomplete === 'inline');
|
|
93
|
+
}
|
|
94
|
+
function isSelectLikePopupOwner(facts) {
|
|
95
|
+
const kind = normalizeText(facts.kind);
|
|
96
|
+
if (kind === 'select') {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
if (isPopupBackedComboboxFacts(facts)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return isPopupBackedTextEntry(facts) && facts.states?.readonly === true;
|
|
103
|
+
}
|
|
104
|
+
function isButtonLikeInputFacts(facts) {
|
|
105
|
+
return (normalizeText(facts.kind) === 'input' &&
|
|
106
|
+
['button', 'submit', 'reset'].includes(normalizeText(facts.inputType)));
|
|
107
|
+
}
|
|
108
|
+
function isSelectionItemLikeFacts(facts) {
|
|
109
|
+
return isPopupSelectionListitemFacts(facts) || isLegacySelectionItemLikeFacts(facts);
|
|
110
|
+
}
|
|
111
|
+
function isLegacySelectionItemLikeFacts(facts) {
|
|
112
|
+
const kind = normalizeText(facts.kind);
|
|
113
|
+
const role = normalizeText(facts.role);
|
|
114
|
+
return (kind === 'option' ||
|
|
115
|
+
role === 'option' ||
|
|
116
|
+
role === 'menuitem' ||
|
|
117
|
+
facts.structure?.family === 'structured-grid');
|
|
118
|
+
}
|
|
119
|
+
function isPopupSelectionListitemFacts(facts) {
|
|
120
|
+
const kind = normalizeText(facts.kind);
|
|
121
|
+
const role = normalizeText(facts.role);
|
|
122
|
+
const surfaceKind = normalizeText(facts.surfaceKind);
|
|
123
|
+
return ((kind === 'listitem' || role === 'listitem') &&
|
|
124
|
+
(surfaceKind === 'floating-panel' ||
|
|
125
|
+
surfaceKind === 'listbox' ||
|
|
126
|
+
surfaceKind === 'menu' ||
|
|
127
|
+
facts.states?.selected === true ||
|
|
128
|
+
facts.states?.current === true ||
|
|
129
|
+
facts.states?.selectable === true));
|
|
130
|
+
}
|
|
131
|
+
function isBinaryToggleControlFacts(facts) {
|
|
132
|
+
const kind = normalizeText(facts.kind);
|
|
133
|
+
const role = normalizeText(facts.role);
|
|
134
|
+
const inputType = normalizeText(facts.inputType);
|
|
135
|
+
return (kind === 'checkbox' ||
|
|
136
|
+
kind === 'radio' ||
|
|
137
|
+
role === 'checkbox' ||
|
|
138
|
+
role === 'radio' ||
|
|
139
|
+
role === 'switch' ||
|
|
140
|
+
kind === 'tab' ||
|
|
141
|
+
role === 'tab' ||
|
|
142
|
+
inputType === 'checkbox' ||
|
|
143
|
+
inputType === 'radio');
|
|
144
|
+
}
|
|
145
|
+
function isDisclosureLikeTriggerFacts(facts, controlFamily) {
|
|
146
|
+
const kind = normalizeText(facts.kind);
|
|
147
|
+
const role = normalizeText(facts.role);
|
|
148
|
+
const inputType = normalizeText(facts.inputType);
|
|
149
|
+
const popupBacked = Boolean(facts.controlsSurfaceSelector) || facts.states?.expanded !== undefined;
|
|
150
|
+
if (!popupBacked) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
if (isSelectionItemLikeFacts(facts) || controlFamily === 'text-input') {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (controlFamily === 'select' || controlFamily === 'datepicker') {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
return (kind === 'button' ||
|
|
160
|
+
role === 'button' ||
|
|
161
|
+
kind === 'link' ||
|
|
162
|
+
role === 'link' ||
|
|
163
|
+
kind === 'combobox' ||
|
|
164
|
+
role === 'combobox' ||
|
|
165
|
+
kind === 'select' ||
|
|
166
|
+
isButtonLikeInputFacts(facts) ||
|
|
167
|
+
inputType === 'button' ||
|
|
168
|
+
isPopupBackedTextEntry(facts));
|
|
169
|
+
}
|
|
170
|
+
function isToggleLikeControlFacts(facts, controlFamily) {
|
|
171
|
+
const states = facts.states;
|
|
172
|
+
if (!states) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
if (states.checked !== undefined || isBinaryToggleControlFacts(facts)) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
if (states.selected !== undefined) {
|
|
179
|
+
if (isSelectionItemLikeFacts(facts) ||
|
|
180
|
+
controlFamily === 'select' ||
|
|
181
|
+
controlFamily === 'datepicker' ||
|
|
182
|
+
isDisclosureLikeTriggerFacts(facts, controlFamily)) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
if (states.pressed !== undefined) {
|
|
188
|
+
return !isDisclosureLikeTriggerFacts(facts, controlFamily);
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
export function isLikelyDateLikeLabel(value) {
|
|
193
|
+
const trimmed = (value ?? '').trim();
|
|
194
|
+
if (!trimmed) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
if (/^\+?\d{1,4}$/.test(trimmed)) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (/\+\d{1,4}\b/.test(trimmed)) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
return DATE_LIKE_LABEL_RE.test(trimmed);
|
|
204
|
+
}
|
|
205
|
+
export function inferAllowedActionsFromFacts(facts) {
|
|
206
|
+
const kind = normalizeText(facts.kind);
|
|
207
|
+
const role = normalizeText(facts.role);
|
|
208
|
+
const interactionHint = normalizeText(facts.interactionHint);
|
|
209
|
+
const legacyMethod = normalizeText(facts.legacyMethod);
|
|
210
|
+
const selectLikePopupOwner = isSelectLikePopupOwner(facts);
|
|
211
|
+
const buttonLikeInput = isButtonLikeInputFacts(facts);
|
|
212
|
+
const checkedToggle = facts.states?.checked !== undefined ||
|
|
213
|
+
kind === 'checkbox' ||
|
|
214
|
+
kind === 'radio' ||
|
|
215
|
+
role === 'checkbox' ||
|
|
216
|
+
role === 'radio' ||
|
|
217
|
+
role === 'switch';
|
|
218
|
+
const actions = new Set();
|
|
219
|
+
if (selectLikePopupOwner) {
|
|
220
|
+
actions.add('click');
|
|
221
|
+
actions.add('select');
|
|
222
|
+
actions.add('press');
|
|
223
|
+
if (facts.surfaceKind === 'datepicker' || isLikelyDateLikeLabel(primaryLabel(facts))) {
|
|
224
|
+
actions.add('fill');
|
|
225
|
+
}
|
|
226
|
+
if ((kind === 'combobox' || role === 'combobox') && isSearchableComboboxFacts(facts)) {
|
|
227
|
+
actions.add('fill');
|
|
228
|
+
actions.add('type');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else if (!buttonLikeInput &&
|
|
232
|
+
(kind === 'input' ||
|
|
233
|
+
kind === 'textarea' ||
|
|
234
|
+
role === 'textbox' ||
|
|
235
|
+
((kind === 'combobox' || role === 'combobox') && !isPopupBackedComboboxFacts(facts)))) {
|
|
236
|
+
actions.add('click');
|
|
237
|
+
actions.add('fill');
|
|
238
|
+
actions.add('type');
|
|
239
|
+
actions.add('press');
|
|
240
|
+
}
|
|
241
|
+
if (!selectLikePopupOwner && kind === 'select') {
|
|
242
|
+
actions.add('click');
|
|
243
|
+
actions.add('select');
|
|
244
|
+
actions.add('press');
|
|
245
|
+
}
|
|
246
|
+
if (kind === 'option' || role === 'option' || role === 'menuitem') {
|
|
247
|
+
actions.add('click');
|
|
248
|
+
}
|
|
249
|
+
if (isPopupSelectionListitemFacts(facts)) {
|
|
250
|
+
actions.add('click');
|
|
251
|
+
actions.add('press');
|
|
252
|
+
actions.add('select');
|
|
253
|
+
}
|
|
254
|
+
if (checkedToggle) {
|
|
255
|
+
actions.add('click');
|
|
256
|
+
actions.add('press');
|
|
257
|
+
}
|
|
258
|
+
if (role === 'gridcell' || facts.structure?.family === 'structured-grid') {
|
|
259
|
+
actions.add('click');
|
|
260
|
+
actions.add('press');
|
|
261
|
+
}
|
|
262
|
+
if (kind === 'button' ||
|
|
263
|
+
kind === 'link' ||
|
|
264
|
+
kind === 'tab' ||
|
|
265
|
+
role === 'button' ||
|
|
266
|
+
role === 'link' ||
|
|
267
|
+
role === 'tab') {
|
|
268
|
+
actions.add('click');
|
|
269
|
+
actions.add('press');
|
|
270
|
+
}
|
|
271
|
+
if (interactionHint === 'click') {
|
|
272
|
+
actions.add('click');
|
|
273
|
+
actions.add('press');
|
|
274
|
+
}
|
|
275
|
+
if (legacyMethod === 'click') {
|
|
276
|
+
actions.add('click');
|
|
277
|
+
actions.add('press');
|
|
278
|
+
}
|
|
279
|
+
if (legacyMethod === 'fill') {
|
|
280
|
+
actions.add('click');
|
|
281
|
+
actions.add('fill');
|
|
282
|
+
actions.add('type');
|
|
283
|
+
actions.add('press');
|
|
284
|
+
}
|
|
285
|
+
if (legacyMethod === 'type') {
|
|
286
|
+
actions.add('click');
|
|
287
|
+
actions.add('type');
|
|
288
|
+
actions.add('press');
|
|
289
|
+
}
|
|
290
|
+
if (legacyMethod === 'select') {
|
|
291
|
+
actions.add('click');
|
|
292
|
+
actions.add('select');
|
|
293
|
+
actions.add('press');
|
|
294
|
+
}
|
|
295
|
+
if (legacyMethod === 'press') {
|
|
296
|
+
actions.add('press');
|
|
297
|
+
}
|
|
298
|
+
return [...actions];
|
|
299
|
+
}
|
|
300
|
+
export function inferAvailabilityFromFacts(states, contextHint, options = {}) {
|
|
301
|
+
if (states?.occupied === true) {
|
|
302
|
+
return { state: 'gated', reason: 'occupied' };
|
|
303
|
+
}
|
|
304
|
+
const blocked = states?.disabled === true ||
|
|
305
|
+
states?.ariaDisabled === true ||
|
|
306
|
+
states?.readonly === true ||
|
|
307
|
+
states?.selectable === false;
|
|
308
|
+
if (blocked && PREREQUISITE_HINT_RE.test(contextHint ?? '')) {
|
|
309
|
+
return { state: 'gated', reason: 'prerequisite' };
|
|
310
|
+
}
|
|
311
|
+
if (states?.selectable === false) {
|
|
312
|
+
return { state: 'gated', reason: 'not-selectable' };
|
|
313
|
+
}
|
|
314
|
+
if (states?.disabled === true || states?.ariaDisabled === true) {
|
|
315
|
+
return { state: 'gated', reason: 'disabled' };
|
|
316
|
+
}
|
|
317
|
+
if (states?.readonly === true) {
|
|
318
|
+
if (options.readonlyInteractive) {
|
|
319
|
+
return { state: 'available' };
|
|
320
|
+
}
|
|
321
|
+
return { state: 'gated', reason: 'readonly' };
|
|
322
|
+
}
|
|
323
|
+
return { state: 'available' };
|
|
324
|
+
}
|
|
325
|
+
export function inferControlFamilyFromFacts(facts, allowedActions) {
|
|
326
|
+
const kind = normalizeText(facts.kind);
|
|
327
|
+
const role = normalizeText(facts.role);
|
|
328
|
+
const legacyMethod = normalizeText(facts.legacyMethod);
|
|
329
|
+
const label = primaryLabel(facts);
|
|
330
|
+
const dateLike = isLikelyDateLikeLabel(label) || facts.surfaceKind === 'datepicker';
|
|
331
|
+
const comparableValueType = inferComparableValueTypeFromFacts(facts);
|
|
332
|
+
if (facts.structure?.family === 'structured-grid') {
|
|
333
|
+
return 'structured-grid';
|
|
334
|
+
}
|
|
335
|
+
if (comparableValueType === 'expiry') {
|
|
336
|
+
return 'text-input';
|
|
337
|
+
}
|
|
338
|
+
if (dateLike &&
|
|
339
|
+
(kind === 'input' ||
|
|
340
|
+
kind === 'textarea' ||
|
|
341
|
+
kind === 'select' ||
|
|
342
|
+
kind === 'combobox' ||
|
|
343
|
+
role === 'textbox' ||
|
|
344
|
+
role === 'combobox' ||
|
|
345
|
+
kind === 'option' ||
|
|
346
|
+
role === 'option' ||
|
|
347
|
+
role === 'menuitem' ||
|
|
348
|
+
allowedActions.includes('select') ||
|
|
349
|
+
legacyMethod === 'select')) {
|
|
350
|
+
return 'datepicker';
|
|
351
|
+
}
|
|
352
|
+
if (isSelectLikePopupOwner(facts) ||
|
|
353
|
+
kind === 'option' ||
|
|
354
|
+
role === 'option' ||
|
|
355
|
+
role === 'menuitem' ||
|
|
356
|
+
allowedActions.includes('select') ||
|
|
357
|
+
legacyMethod === 'select') {
|
|
358
|
+
return 'select';
|
|
359
|
+
}
|
|
360
|
+
if (isButtonLikeInputFacts(facts)) {
|
|
361
|
+
return 'trigger';
|
|
362
|
+
}
|
|
363
|
+
if (kind === 'input' ||
|
|
364
|
+
kind === 'textarea' ||
|
|
365
|
+
role === 'textbox' ||
|
|
366
|
+
allowedActions.includes('fill') ||
|
|
367
|
+
allowedActions.includes('type') ||
|
|
368
|
+
legacyMethod === 'fill' ||
|
|
369
|
+
legacyMethod === 'type') {
|
|
370
|
+
return 'text-input';
|
|
371
|
+
}
|
|
372
|
+
if (kind === 'button' ||
|
|
373
|
+
kind === 'link' ||
|
|
374
|
+
role === 'button' ||
|
|
375
|
+
role === 'link' ||
|
|
376
|
+
allowedActions.includes('click') ||
|
|
377
|
+
allowedActions.includes('press') ||
|
|
378
|
+
legacyMethod === 'click' ||
|
|
379
|
+
legacyMethod === 'press') {
|
|
380
|
+
return 'trigger';
|
|
381
|
+
}
|
|
382
|
+
return undefined;
|
|
383
|
+
}
|
|
384
|
+
export function inferAcceptancePolicyFromFacts(facts, allowedActions) {
|
|
385
|
+
const legacyMethod = normalizeText(facts.legacyMethod);
|
|
386
|
+
const label = primaryLabel(facts);
|
|
387
|
+
const states = facts.states;
|
|
388
|
+
const kind = normalizeText(facts.kind);
|
|
389
|
+
const role = normalizeText(facts.role);
|
|
390
|
+
const controlFamily = inferControlFamilyFromFacts(facts, allowedActions);
|
|
391
|
+
if (facts.structure?.family === 'structured-grid') {
|
|
392
|
+
return facts.structure.variant === 'date-cell' ? 'date-selection' : 'selection';
|
|
393
|
+
}
|
|
394
|
+
if (controlFamily === 'text-input') {
|
|
395
|
+
return 'value-change';
|
|
396
|
+
}
|
|
397
|
+
if (isDisclosureLikeTriggerFacts(facts, controlFamily)) {
|
|
398
|
+
return 'disclosure';
|
|
399
|
+
}
|
|
400
|
+
if (isToggleLikeControlFacts(facts, controlFamily)) {
|
|
401
|
+
return 'toggle';
|
|
402
|
+
}
|
|
403
|
+
if (controlFamily === 'datepicker') {
|
|
404
|
+
return 'date-selection';
|
|
405
|
+
}
|
|
406
|
+
if (controlFamily === 'select') {
|
|
407
|
+
return 'selection';
|
|
408
|
+
}
|
|
409
|
+
if (role === 'link' || kind === 'link') {
|
|
410
|
+
return 'navigation';
|
|
411
|
+
}
|
|
412
|
+
if (!legacyMethod && SUBMIT_LABEL_RE.test(label)) {
|
|
413
|
+
return 'submit';
|
|
414
|
+
}
|
|
415
|
+
if (controlFamily === 'trigger' || legacyMethod === 'click' || legacyMethod === 'press') {
|
|
416
|
+
return 'generic-click';
|
|
417
|
+
}
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { BrowserSessionState } from './browser-session-state.js';
|
|
2
|
+
/** Command names emitted through the diagnostics hook surface. */
|
|
3
|
+
export type DiagnosticCommand = 'launch' | 'navigate' | 'observe' | 'act' | 'extract' | 'screenshot' | 'browser-status' | 'status' | 'close';
|
|
4
|
+
export type DiagnosticStepRefs = {
|
|
5
|
+
pageRef?: string;
|
|
6
|
+
targetRef?: string;
|
|
7
|
+
surfaceRef?: string;
|
|
8
|
+
fillRef?: string;
|
|
9
|
+
requestId?: string;
|
|
10
|
+
};
|
|
11
|
+
export type DiagnosticSnapshotPhase = 'before' | 'after' | 'point-in-time';
|
|
12
|
+
export type DiagnosticChildSpanKind = 'client';
|
|
13
|
+
/** Step handle returned by `startStep(...)` and passed back to later hooks. */
|
|
14
|
+
export type DiagnosticStepHandle = {
|
|
15
|
+
runId: string;
|
|
16
|
+
stepId: string;
|
|
17
|
+
command: DiagnosticCommand;
|
|
18
|
+
};
|
|
19
|
+
export type DiagnosticStepStartInput = {
|
|
20
|
+
runId?: string;
|
|
21
|
+
command: DiagnosticCommand;
|
|
22
|
+
input?: Record<string, unknown>;
|
|
23
|
+
refs?: DiagnosticStepRefs;
|
|
24
|
+
protectedStep?: boolean;
|
|
25
|
+
};
|
|
26
|
+
export type DiagnosticStepFinishInput = {
|
|
27
|
+
step: DiagnosticStepHandle | null | undefined;
|
|
28
|
+
success: boolean;
|
|
29
|
+
outcomeType?: string;
|
|
30
|
+
message?: string;
|
|
31
|
+
reason?: string;
|
|
32
|
+
artifactManifestId?: string;
|
|
33
|
+
};
|
|
34
|
+
export type DiagnosticSnapshotInput = {
|
|
35
|
+
step: DiagnosticStepHandle | null | undefined;
|
|
36
|
+
session: BrowserSessionState;
|
|
37
|
+
phase: DiagnosticSnapshotPhase;
|
|
38
|
+
pageRef?: string;
|
|
39
|
+
url?: string;
|
|
40
|
+
title?: string;
|
|
41
|
+
artifactRefs?: {
|
|
42
|
+
screenshotPath?: string;
|
|
43
|
+
htmlPath?: string;
|
|
44
|
+
tracePath?: string;
|
|
45
|
+
logPath?: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export type DiagnosticLifecycleEventInput = {
|
|
49
|
+
step: DiagnosticStepHandle | null | undefined;
|
|
50
|
+
phase: 'started' | 'completed' | 'failed';
|
|
51
|
+
attributes?: Record<string, unknown>;
|
|
52
|
+
};
|
|
53
|
+
export type DiagnosticChildSpanInput = {
|
|
54
|
+
step: DiagnosticStepHandle | null | undefined;
|
|
55
|
+
name: string;
|
|
56
|
+
kind?: DiagnosticChildSpanKind;
|
|
57
|
+
startedAt: string;
|
|
58
|
+
endedAt: string;
|
|
59
|
+
statusCode: 'unset' | 'ok' | 'error';
|
|
60
|
+
statusMessage?: string;
|
|
61
|
+
attributes?: Record<string, unknown>;
|
|
62
|
+
};
|
|
63
|
+
export type DiagnosticArtifactManifest = {
|
|
64
|
+
artifactManifestId: string;
|
|
65
|
+
stepId: string;
|
|
66
|
+
screenshots: Array<{
|
|
67
|
+
path: string;
|
|
68
|
+
purpose: string;
|
|
69
|
+
storageBucket?: string;
|
|
70
|
+
storagePath?: string;
|
|
71
|
+
}>;
|
|
72
|
+
htmlSnapshots: Array<{
|
|
73
|
+
path: string;
|
|
74
|
+
purpose: string;
|
|
75
|
+
storageBucket?: string;
|
|
76
|
+
storagePath?: string;
|
|
77
|
+
}>;
|
|
78
|
+
traces: Array<{
|
|
79
|
+
path: string;
|
|
80
|
+
purpose: string;
|
|
81
|
+
storageBucket?: string;
|
|
82
|
+
storagePath?: string;
|
|
83
|
+
}>;
|
|
84
|
+
logs: Array<{
|
|
85
|
+
path: string;
|
|
86
|
+
purpose: string;
|
|
87
|
+
storageBucket?: string;
|
|
88
|
+
storagePath?: string;
|
|
89
|
+
}>;
|
|
90
|
+
suppressed: Array<{
|
|
91
|
+
kind: 'screenshot' | 'html' | 'trace' | 'log';
|
|
92
|
+
reason: 'protected_exposure_active' | 'sensitive_scope' | 'policy_blocked' | 'capture_failed';
|
|
93
|
+
}>;
|
|
94
|
+
};
|
|
95
|
+
export type DiagnosticArtifactManifestInput = {
|
|
96
|
+
runId: string;
|
|
97
|
+
step?: DiagnosticStepHandle | null;
|
|
98
|
+
manifest: DiagnosticArtifactManifest;
|
|
99
|
+
};
|
|
100
|
+
export type AgentbrowseDiagnosticsHooks = {
|
|
101
|
+
startStep?: (input: DiagnosticStepStartInput) => DiagnosticStepHandle | null;
|
|
102
|
+
finishStep?: (input: DiagnosticStepFinishInput) => void | Promise<void>;
|
|
103
|
+
captureSnapshot?: (input: DiagnosticSnapshotInput) => void | Promise<void>;
|
|
104
|
+
recordCommandEvent?: (input: DiagnosticLifecycleEventInput) => void | Promise<void>;
|
|
105
|
+
recordChildSpan?: (input: DiagnosticChildSpanInput) => void | Promise<void>;
|
|
106
|
+
recordArtifactManifest?: (input: DiagnosticArtifactManifestInput) => void | Promise<void>;
|
|
107
|
+
flushRun?: (runId: string | undefined) => void | Promise<void>;
|
|
108
|
+
};
|
|
109
|
+
/** Configures process-global diagnostics hooks for AgentBrowse commands. */
|
|
110
|
+
export declare function configureAgentbrowseDiagnostics(hooks: AgentbrowseDiagnosticsHooks | null | undefined): void;
|
|
111
|
+
/** Clears the currently configured process-global diagnostics hooks. */
|
|
112
|
+
export declare function resetAgentbrowseDiagnostics(): void;
|
|
113
|
+
/** Starts a new diagnostic step when the caller provided a run id and hooks are configured. */
|
|
114
|
+
export declare function startDiagnosticStep(input: DiagnosticStepStartInput, options?: {
|
|
115
|
+
session?: BrowserSessionState | null;
|
|
116
|
+
}): DiagnosticStepHandle | null;
|
|
117
|
+
/** Finishes a diagnostic step and suppresses hook failures. */
|
|
118
|
+
export declare function finishDiagnosticStepBestEffort(input: DiagnosticStepFinishInput): Promise<void>;
|
|
119
|
+
/** Captures a best-effort diagnostics snapshot for the current page state. */
|
|
120
|
+
export declare function captureDiagnosticSnapshotBestEffort(input: DiagnosticSnapshotInput): void;
|
|
121
|
+
/** Records a best-effort command lifecycle event. */
|
|
122
|
+
export declare function recordCommandLifecycleEventBestEffort(input: DiagnosticLifecycleEventInput): void;
|
|
123
|
+
/** Records a best-effort child span inside the current command step. */
|
|
124
|
+
export declare function recordDiagnosticChildSpanBestEffort(input: DiagnosticChildSpanInput): void;
|
|
125
|
+
/** Records a best-effort artifact manifest for the current diagnostics run. */
|
|
126
|
+
export declare function recordDiagnosticArtifactManifestBestEffort(input: DiagnosticArtifactManifestInput | null | undefined): Promise<string | undefined>;
|
|
127
|
+
/** Flushes any pending diagnostics work for the run when hooks provide a flush handler. */
|
|
128
|
+
export declare function flushDiagnosticRunBestEffort(runId: string | undefined, options?: {
|
|
129
|
+
session?: BrowserSessionState | null;
|
|
130
|
+
step?: DiagnosticStepHandle | null;
|
|
131
|
+
}): Promise<void>;
|
|
132
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { getAgentbrowseSessionBindings } from './client-bindings.js';
|
|
2
|
+
let currentHooks = {};
|
|
3
|
+
const hooksByStep = new WeakMap();
|
|
4
|
+
function isPromiseLike(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && 'then' in value;
|
|
6
|
+
}
|
|
7
|
+
function fireAndForget(result) {
|
|
8
|
+
if (isPromiseLike(result)) {
|
|
9
|
+
void result.then(() => undefined, () => undefined);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Configures process-global diagnostics hooks for AgentBrowse commands. */
|
|
13
|
+
export function configureAgentbrowseDiagnostics(hooks) {
|
|
14
|
+
currentHooks = hooks ?? {};
|
|
15
|
+
}
|
|
16
|
+
/** Clears the currently configured process-global diagnostics hooks. */
|
|
17
|
+
export function resetAgentbrowseDiagnostics() {
|
|
18
|
+
currentHooks = {};
|
|
19
|
+
}
|
|
20
|
+
function resolveDiagnosticHooks(options = {}) {
|
|
21
|
+
const stepHooks = options.step ? hooksByStep.get(options.step) : null;
|
|
22
|
+
if (stepHooks) {
|
|
23
|
+
return stepHooks;
|
|
24
|
+
}
|
|
25
|
+
const boundHooks = options.session
|
|
26
|
+
? (getAgentbrowseSessionBindings(options.session)?.diagnostics ?? null)
|
|
27
|
+
: null;
|
|
28
|
+
return boundHooks ?? currentHooks;
|
|
29
|
+
}
|
|
30
|
+
/** Starts a new diagnostic step when the caller provided a run id and hooks are configured. */
|
|
31
|
+
export function startDiagnosticStep(input, options = {}) {
|
|
32
|
+
if (!input.runId) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const hooks = resolveDiagnosticHooks(options);
|
|
36
|
+
const step = hooks.startStep?.(input) ?? null;
|
|
37
|
+
if (step) {
|
|
38
|
+
hooksByStep.set(step, hooks);
|
|
39
|
+
}
|
|
40
|
+
return step;
|
|
41
|
+
}
|
|
42
|
+
/** Finishes a diagnostic step and suppresses hook failures. */
|
|
43
|
+
export async function finishDiagnosticStepBestEffort(input) {
|
|
44
|
+
if (!input.step) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
await resolveDiagnosticHooks({ step: input.step }).finishStep?.(input);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Best effort only.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Captures a best-effort diagnostics snapshot for the current page state. */
|
|
55
|
+
export function captureDiagnosticSnapshotBestEffort(input) {
|
|
56
|
+
if (!input.step) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
fireAndForget(resolveDiagnosticHooks({ step: input.step, session: input.session }).captureSnapshot?.(input));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Best effort only.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Records a best-effort command lifecycle event. */
|
|
67
|
+
export function recordCommandLifecycleEventBestEffort(input) {
|
|
68
|
+
if (!input.step) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
fireAndForget(resolveDiagnosticHooks({ step: input.step }).recordCommandEvent?.(input));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Best effort only.
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Records a best-effort child span inside the current command step. */
|
|
79
|
+
export function recordDiagnosticChildSpanBestEffort(input) {
|
|
80
|
+
if (!input.step) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
fireAndForget(resolveDiagnosticHooks({ step: input.step }).recordChildSpan?.(input));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Best effort only.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Records a best-effort artifact manifest for the current diagnostics run. */
|
|
91
|
+
export async function recordDiagnosticArtifactManifestBestEffort(input) {
|
|
92
|
+
if (!input?.runId) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
const recordArtifactManifest = resolveDiagnosticHooks({
|
|
96
|
+
step: input.step,
|
|
97
|
+
}).recordArtifactManifest;
|
|
98
|
+
if (!recordArtifactManifest) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
await recordArtifactManifest(input);
|
|
103
|
+
return input.manifest.artifactManifestId;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Flushes any pending diagnostics work for the run when hooks provide a flush handler. */
|
|
110
|
+
export async function flushDiagnosticRunBestEffort(runId, options = {}) {
|
|
111
|
+
if (!runId) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
await resolveDiagnosticHooks(options).flushRun?.(runId);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Best effort only.
|
|
119
|
+
}
|
|
120
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAmQA,iBAAe,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJhE;AAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAEhB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAWzF"}
|