@nuanu-ai/agentbrowse 0.2.47 → 0.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -10
- package/dist/agentpay-gateway.d.ts +9 -0
- package/dist/agentpay-gateway.d.ts.map +1 -1
- package/dist/agentpay-gateway.js +31 -1
- package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
- package/dist/agentpay-stagehand-llm.js +9 -1
- package/dist/command-api-tracing.d.ts +19 -0
- package/dist/command-api-tracing.d.ts.map +1 -0
- package/dist/command-api-tracing.js +137 -0
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +822 -670
- package/dist/commands/act.test-harness.d.ts +6 -0
- package/dist/commands/act.test-harness.d.ts.map +1 -1
- package/dist/commands/act.test-harness.js +44 -1
- package/dist/commands/action-acceptance.d.ts.map +1 -1
- package/dist/commands/action-acceptance.js +115 -0
- package/dist/commands/captcha-solve.d.ts.map +1 -1
- package/dist/commands/captcha-solve.js +83 -16
- package/dist/commands/click-action-executor.d.ts +0 -1
- package/dist/commands/click-action-executor.d.ts.map +1 -1
- package/dist/commands/click-action-executor.js +31 -77
- package/dist/commands/close.d.ts +3 -3
- package/dist/commands/close.d.ts.map +1 -1
- package/dist/commands/close.js +178 -0
- package/dist/commands/descriptor-validation.d.ts.map +1 -1
- package/dist/commands/descriptor-validation.js +75 -57
- package/dist/commands/end-session.d.ts +25 -0
- package/dist/commands/end-session.d.ts.map +1 -0
- package/dist/commands/end-session.js +161 -0
- package/dist/commands/extract-stagehand-executor.js +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +339 -202
- package/dist/commands/fill-secret.d.ts +3 -3
- package/dist/commands/fill-secret.d.ts.map +1 -1
- package/dist/commands/fill-secret.js +419 -234
- package/dist/commands/get-secrets-catalog.d.ts.map +1 -1
- package/dist/commands/get-secrets-catalog.js +66 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -3
- 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 +1 -3
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +115 -27
- package/dist/commands/navigate.d.ts.map +1 -1
- package/dist/commands/navigate.js +188 -45
- package/dist/commands/observe-accessibility.d.ts.map +1 -1
- package/dist/commands/observe-accessibility.js +46 -39
- package/dist/commands/observe-dom-label-contract.d.ts.map +1 -1
- package/dist/commands/observe-dom-label-contract.js +5 -0
- package/dist/commands/observe-inventory.d.ts +13 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +320 -65
- package/dist/commands/observe-persistence.d.ts.map +1 -1
- package/dist/commands/observe-persistence.js +3 -0
- package/dist/commands/observe-projection.d.ts +1 -0
- package/dist/commands/observe-projection.d.ts.map +1 -1
- package/dist/commands/observe-projection.js +7 -2
- package/dist/commands/observe-protected.d.ts +1 -0
- package/dist/commands/observe-protected.d.ts.map +1 -1
- package/dist/commands/observe-protected.js +9 -4
- package/dist/commands/observe-semantics.d.ts.map +1 -1
- package/dist/commands/observe-semantics.js +5 -2
- package/dist/commands/observe-stagehand.d.ts +1 -0
- package/dist/commands/observe-stagehand.d.ts.map +1 -1
- package/dist/commands/observe-stagehand.js +2 -0
- package/dist/commands/observe.d.ts +2 -0
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +387 -203
- package/dist/commands/observe.test-harness.d.ts +8 -0
- package/dist/commands/observe.test-harness.d.ts.map +1 -1
- package/dist/commands/observe.test-harness.js +48 -1
- package/dist/commands/poll-secret.d.ts +6 -0
- package/dist/commands/poll-secret.d.ts.map +1 -0
- package/dist/commands/poll-secret.js +159 -0
- package/dist/commands/request-secret.d.ts +6 -0
- package/dist/commands/request-secret.d.ts.map +1 -0
- package/dist/commands/request-secret.js +284 -0
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/screenshot.js +172 -7
- package/dist/commands/select-action-executor.d.ts.map +1 -1
- package/dist/commands/semantic-observe.d.ts +4 -0
- package/dist/commands/semantic-observe.d.ts.map +1 -1
- package/dist/commands/semantic-observe.js +388 -17
- package/dist/commands/start-session.d.ts +31 -0
- package/dist/commands/start-session.d.ts.map +1 -0
- package/dist/commands/start-session.js +347 -0
- package/dist/commands/status.d.ts +2 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +166 -144
- package/dist/control-semantics.d.ts +1 -0
- package/dist/control-semantics.d.ts.map +1 -1
- package/dist/control-semantics.js +51 -9
- package/dist/generated/build-config.d.ts +2 -0
- package/dist/generated/build-config.d.ts.map +1 -0
- package/dist/generated/build-config.js +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +163 -63
- package/dist/otel-exporter.d.ts +58 -0
- package/dist/otel-exporter.d.ts.map +1 -0
- package/dist/otel-exporter.js +263 -0
- package/dist/otel-projector.d.ts +75 -0
- package/dist/otel-projector.d.ts.map +1 -0
- package/dist/otel-projector.js +409 -0
- package/dist/owned-browser.d.ts +1 -1
- package/dist/owned-browser.d.ts.map +1 -1
- package/dist/owned-browser.js +13 -1
- package/dist/owned-process.d.ts +2 -0
- package/dist/owned-process.d.ts.map +1 -1
- package/dist/owned-process.js +7 -3
- package/dist/playwright-runtime.d.ts +1 -1
- package/dist/playwright-runtime.d.ts.map +1 -1
- package/dist/playwright-runtime.js +8 -8
- package/dist/run-observability.d.ts +25 -0
- package/dist/run-observability.d.ts.map +1 -0
- package/dist/run-observability.js +115 -0
- package/dist/run-store.d.ts +274 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +631 -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 +16 -0
- package/dist/runtime-protected-state.d.ts.map +1 -0
- package/dist/runtime-protected-state.js +157 -0
- package/dist/runtime-state.d.ts +10 -44
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +57 -222
- package/dist/secrets/backend.d.ts +65 -16
- package/dist/secrets/backend.d.ts.map +1 -1
- package/dist/secrets/backend.js +135 -95
- package/dist/secrets/catalog-sync.d.ts.map +1 -1
- package/dist/secrets/catalog-sync.js +4 -1
- package/dist/secrets/form-matcher.d.ts +5 -5
- package/dist/secrets/form-matcher.d.ts.map +1 -1
- package/dist/secrets/form-matcher.js +292 -164
- package/dist/secrets/intent-output.d.ts +6 -10
- package/dist/secrets/intent-output.d.ts.map +1 -1
- package/dist/secrets/intent-output.js +4 -58
- package/dist/secrets/mock-agentpay-cabinet.d.ts +38 -27
- package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -1
- package/dist/secrets/mock-agentpay-cabinet.js +177 -111
- package/dist/secrets/protected-artifact-guard.d.ts +2 -2
- package/dist/secrets/protected-artifact-guard.d.ts.map +1 -1
- package/dist/secrets/protected-artifact-guard.js +2 -2
- package/dist/secrets/protected-bindings.d.ts +1 -1
- package/dist/secrets/protected-bindings.d.ts.map +1 -1
- package/dist/secrets/protected-bindings.js +6 -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.map +1 -1
- package/dist/secrets/protected-field-values.js +3 -3
- package/dist/secrets/protected-fill.d.ts +1 -1
- package/dist/secrets/protected-fill.d.ts.map +1 -1
- package/dist/secrets/protected-fill.js +45 -149
- package/dist/secrets/protected-value-adapters.d.ts +2 -1
- package/dist/secrets/protected-value-adapters.d.ts.map +1 -1
- package/dist/secrets/protected-value-adapters.js +80 -1
- package/dist/secrets/request-output.d.ts +11 -0
- package/dist/secrets/request-output.d.ts.map +1 -0
- package/dist/secrets/request-output.js +75 -0
- package/dist/secrets/types.d.ts +15 -9
- package/dist/secrets/types.d.ts.map +1 -1
- package/dist/secrets/types.js +3 -0
- package/dist/session-event-exporter.d.ts +36 -0
- package/dist/session-event-exporter.d.ts.map +1 -0
- package/dist/session-event-exporter.js +428 -0
- package/dist/session.d.ts +16 -7
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +150 -23
- package/dist/sessions-backend.d.ts +354 -0
- package/dist/sessions-backend.d.ts.map +1 -0
- package/dist/sessions-backend.js +126 -0
- package/dist/solver/browser-launcher.d.ts +1 -1
- package/dist/solver/browser-launcher.d.ts.map +1 -1
- package/dist/solver/browser-launcher.js +39 -13
- package/dist/solver/captcha-solver.d.ts.map +1 -1
- package/dist/solver/captcha-solver.js +8 -1
- package/dist/solver/config.d.ts +0 -1
- package/dist/solver/config.d.ts.map +1 -1
- package/dist/solver/config.js +0 -22
- package/dist/solver/types.d.ts +1 -0
- package/dist/solver/types.d.ts.map +1 -1
- package/dist/workflow-session-completion.d.ts +33 -0
- package/dist/workflow-session-completion.d.ts.map +1 -0
- package/dist/workflow-session-completion.js +156 -0
- package/package.json +11 -1
- package/dist/commands/create-intent.d.ts +0 -6
- package/dist/commands/create-intent.d.ts.map +0 -1
- package/dist/commands/create-intent.js +0 -75
- package/dist/commands/poll-intent.d.ts +0 -6
- package/dist/commands/poll-intent.d.ts.map +0 -1
- package/dist/commands/poll-intent.js +0 -57
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { inferComparableValueTypeFromFacts } from '../control-semantics.js';
|
|
2
|
+
const LOGIN_USERNAME_SIGNAL_RE = /\b(email|e-mail|username|user name|login|account(?: email| name)?|member(?: email| name| id)?)\b/i;
|
|
3
|
+
const LOGIN_PASSWORD_SIGNAL_RE = /\b(password|passcode|pass word)\b/i;
|
|
4
|
+
const PAYMENT_CARD_NAME_SIGNAL_RE = /\b(cardholder|card holder|name on card|cardholder name|full name)\b/i;
|
|
5
|
+
const PAYMENT_CARD_PAN_SIGNAL_RE = /\b(card number|card no|cc-number|cc number)\b/i;
|
|
6
|
+
const PAYMENT_CARD_EXP_SIGNAL_RE = /\b(expiration|expiry|exp(?:iry)? date|exp date|mm\s*\/\s*yy|mmyy|mm\/yy)\b/i;
|
|
7
|
+
const PAYMENT_CARD_CVV_SIGNAL_RE = /\b(security code|cvv|cvc)\b/i;
|
|
8
|
+
const IDENTITY_DOCUMENT_SIGNAL_RE = /\b(passport|document(?: number| no)?|id(?: number| no)?|identity(?: number)?)\b/i;
|
|
9
|
+
const IDENTITY_BIRTH_SIGNAL_RE = /\b(date of birth|birth date|dob)\b/i;
|
|
10
|
+
const IDENTITY_NATIONALITY_SIGNAL_RE = /\b(nationality|citizenship)\b/i;
|
|
11
|
+
const IDENTITY_ISSUING_COUNTRY_SIGNAL_RE = /\b(issuing country|country of issue|country\/region of issue|issuing state)\b/i;
|
|
12
|
+
const IDENTITY_ISSUE_DATE_SIGNAL_RE = /\b(issue date|date of issue)\b/i;
|
|
13
|
+
const IDENTITY_EXPIRY_DATE_SIGNAL_RE = /\b(expiry date|expiration date|date of expiry)\b/i;
|
|
14
|
+
function normalizeText(value) {
|
|
15
|
+
return value?.replace(/\s+/g, ' ').trim().toLowerCase() ?? '';
|
|
16
|
+
}
|
|
17
|
+
function directFieldSignals(target) {
|
|
18
|
+
const values = new Set();
|
|
19
|
+
const push = (value) => {
|
|
20
|
+
const normalized = normalizeText(value);
|
|
21
|
+
if (normalized) {
|
|
22
|
+
values.add(normalized);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
push(target.label);
|
|
26
|
+
push(target.displayLabel);
|
|
27
|
+
push(target.placeholder);
|
|
28
|
+
push(target.inputName);
|
|
29
|
+
push(target.inputType);
|
|
30
|
+
push(target.autocomplete);
|
|
31
|
+
push(target.semantics?.name);
|
|
32
|
+
return [...values];
|
|
33
|
+
}
|
|
34
|
+
function uniqueMeaningHints(hints) {
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
const result = [];
|
|
37
|
+
for (const hint of hints) {
|
|
38
|
+
const key = `${hint.kind}:${hint.fieldKey}:${hint.valueHint}`;
|
|
39
|
+
if (seen.has(key)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
seen.add(key);
|
|
43
|
+
result.push(hint);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
export function inferProtectedFieldMeaningFromTarget(target) {
|
|
48
|
+
const autocomplete = normalizeText(target.autocomplete);
|
|
49
|
+
const inputType = normalizeText(target.inputType);
|
|
50
|
+
const inputName = normalizeText(target.inputName);
|
|
51
|
+
const signals = directFieldSignals(target);
|
|
52
|
+
const comparableValueType = inferComparableValueTypeFromFacts({
|
|
53
|
+
kind: target.kind,
|
|
54
|
+
role: target.semantics?.role,
|
|
55
|
+
label: target.label,
|
|
56
|
+
displayLabel: target.displayLabel,
|
|
57
|
+
placeholder: target.placeholder,
|
|
58
|
+
inputName: target.inputName,
|
|
59
|
+
inputType: target.inputType,
|
|
60
|
+
autocomplete: target.autocomplete,
|
|
61
|
+
states: target.semantics?.states,
|
|
62
|
+
structure: target.structure,
|
|
63
|
+
});
|
|
64
|
+
const hints = [];
|
|
65
|
+
if (autocomplete.includes('username') ||
|
|
66
|
+
autocomplete.includes('email') ||
|
|
67
|
+
inputType === 'email' ||
|
|
68
|
+
/\b(user(name)?|login|email|account)\b/.test(inputName) ||
|
|
69
|
+
signals.some((signal) => LOGIN_USERNAME_SIGNAL_RE.test(signal))) {
|
|
70
|
+
hints.push({ kind: 'login', fieldKey: 'username', valueHint: 'direct' });
|
|
71
|
+
}
|
|
72
|
+
if (autocomplete.includes('current-password') ||
|
|
73
|
+
inputType === 'password' ||
|
|
74
|
+
/\bpassword\b/.test(inputName) ||
|
|
75
|
+
signals.some((signal) => LOGIN_PASSWORD_SIGNAL_RE.test(signal))) {
|
|
76
|
+
hints.push({ kind: 'login', fieldKey: 'password', valueHint: 'direct' });
|
|
77
|
+
}
|
|
78
|
+
if (autocomplete.includes('cc-number') || comparableValueType === 'card-number') {
|
|
79
|
+
hints.push({ kind: 'payment_card', fieldKey: 'pan', valueHint: 'direct' });
|
|
80
|
+
}
|
|
81
|
+
else if (/\b(card[-_ ]?number|cardnumber|cc-?number)\b/.test(inputName) ||
|
|
82
|
+
signals.some((signal) => PAYMENT_CARD_PAN_SIGNAL_RE.test(signal))) {
|
|
83
|
+
hints.push({ kind: 'payment_card', fieldKey: 'pan', valueHint: 'direct' });
|
|
84
|
+
}
|
|
85
|
+
if (autocomplete.includes('cc-exp') || comparableValueType === 'expiry') {
|
|
86
|
+
hints.push({ kind: 'payment_card', fieldKey: 'exp_month', valueHint: 'direct' });
|
|
87
|
+
hints.push({ kind: 'payment_card', fieldKey: 'exp_year', valueHint: 'direct' });
|
|
88
|
+
}
|
|
89
|
+
else if (/\b(exp|expiry|expiration)\b/.test(inputName) ||
|
|
90
|
+
signals.some((signal) => PAYMENT_CARD_EXP_SIGNAL_RE.test(signal))) {
|
|
91
|
+
hints.push({ kind: 'payment_card', fieldKey: 'exp_month', valueHint: 'direct' });
|
|
92
|
+
hints.push({ kind: 'payment_card', fieldKey: 'exp_year', valueHint: 'direct' });
|
|
93
|
+
}
|
|
94
|
+
if (autocomplete.includes('cc-csc') || comparableValueType === 'cvc') {
|
|
95
|
+
hints.push({ kind: 'payment_card', fieldKey: 'cvv', valueHint: 'direct' });
|
|
96
|
+
}
|
|
97
|
+
else if (/\b(cvv|cvc|security)\b/.test(inputName) ||
|
|
98
|
+
signals.some((signal) => PAYMENT_CARD_CVV_SIGNAL_RE.test(signal))) {
|
|
99
|
+
hints.push({ kind: 'payment_card', fieldKey: 'cvv', valueHint: 'direct' });
|
|
100
|
+
}
|
|
101
|
+
if (autocomplete.includes('cc-name') ||
|
|
102
|
+
/\b(cardholder|card-holder|cc-name)\b/.test(inputName) ||
|
|
103
|
+
signals.some((signal) => PAYMENT_CARD_NAME_SIGNAL_RE.test(signal))) {
|
|
104
|
+
hints.push({ kind: 'payment_card', fieldKey: 'cardholder', valueHint: 'direct' });
|
|
105
|
+
}
|
|
106
|
+
if (autocomplete.includes('given-name')) {
|
|
107
|
+
hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.given' });
|
|
108
|
+
}
|
|
109
|
+
if (autocomplete.includes('family-name')) {
|
|
110
|
+
hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.family' });
|
|
111
|
+
}
|
|
112
|
+
if (autocomplete === 'name' ||
|
|
113
|
+
/\bfull_?name\b/.test(inputName) ||
|
|
114
|
+
signals.some((signal) => /\bfull name\b/.test(signal))) {
|
|
115
|
+
hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'direct' });
|
|
116
|
+
}
|
|
117
|
+
if (/\b(first|given|forename)_?name\b/.test(inputName) ||
|
|
118
|
+
signals.some((signal) => /\b(first name|given name|forename)\b/.test(signal))) {
|
|
119
|
+
hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.given' });
|
|
120
|
+
}
|
|
121
|
+
if (/\b(last|family|surname)_?name\b/.test(inputName) ||
|
|
122
|
+
signals.some((signal) => /\b(last name|family name|surname)\b/.test(signal))) {
|
|
123
|
+
hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.family' });
|
|
124
|
+
}
|
|
125
|
+
if (autocomplete.includes('bday') ||
|
|
126
|
+
(comparableValueType === 'date' &&
|
|
127
|
+
(/\b(date_?of_?birth|birth_?date|dob)\b/.test(inputName) ||
|
|
128
|
+
signals.some((signal) => IDENTITY_BIRTH_SIGNAL_RE.test(signal))))) {
|
|
129
|
+
hints.push({ kind: 'identity', fieldKey: 'date_of_birth', valueHint: 'direct' });
|
|
130
|
+
}
|
|
131
|
+
if (/\b(passport|document|identity|id)(?:_?number|_?no)?\b/.test(inputName) ||
|
|
132
|
+
signals.some((signal) => IDENTITY_DOCUMENT_SIGNAL_RE.test(signal))) {
|
|
133
|
+
hints.push({ kind: 'identity', fieldKey: 'document_number', valueHint: 'direct' });
|
|
134
|
+
}
|
|
135
|
+
if (/\b(nationality|citizenship)\b/.test(inputName) ||
|
|
136
|
+
signals.some((signal) => IDENTITY_NATIONALITY_SIGNAL_RE.test(signal))) {
|
|
137
|
+
hints.push({ kind: 'identity', fieldKey: 'nationality', valueHint: 'direct' });
|
|
138
|
+
}
|
|
139
|
+
if (/\b(issuing_?country|country_?of_?issue|issuing_?state)\b/.test(inputName) ||
|
|
140
|
+
signals.some((signal) => IDENTITY_ISSUING_COUNTRY_SIGNAL_RE.test(signal))) {
|
|
141
|
+
hints.push({ kind: 'identity', fieldKey: 'issuing_country', valueHint: 'direct' });
|
|
142
|
+
}
|
|
143
|
+
if (comparableValueType === 'date' &&
|
|
144
|
+
(/\b(issue(?:_?date)?)\b/.test(inputName) ||
|
|
145
|
+
signals.some((signal) => IDENTITY_ISSUE_DATE_SIGNAL_RE.test(signal)))) {
|
|
146
|
+
hints.push({ kind: 'identity', fieldKey: 'issue_date', valueHint: 'direct' });
|
|
147
|
+
}
|
|
148
|
+
if (comparableValueType === 'date' &&
|
|
149
|
+
(/\b(expiry|expiration)(?:_?date)?\b/.test(inputName) ||
|
|
150
|
+
signals.some((signal) => IDENTITY_EXPIRY_DATE_SIGNAL_RE.test(signal)))) {
|
|
151
|
+
hints.push({ kind: 'identity', fieldKey: 'expiry_date', valueHint: 'direct' });
|
|
152
|
+
}
|
|
153
|
+
return uniqueMeaningHints(hints);
|
|
154
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-field-values.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-field-values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAyDtF,wBAAsB,mCAAmC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;QACtB,OAAO,EAAE,wBAAwB,CAAC;QAClC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"protected-field-values.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-field-values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAyDtF,wBAAsB,mCAAmC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;QACtB,OAAO,EAAE,wBAAwB,CAAC;QAClC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6G/B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { AgentpayStagehandLlmClient } from '../agentpay-stagehand-llm.js';
|
|
3
3
|
import { tryResolveAgentpayGatewayConfig } from '../agentpay-gateway.js';
|
|
4
|
-
import { recordLlmUsage, recordPayloadBudget } from '../runtime-
|
|
4
|
+
import { recordLlmUsage, recordPayloadBudget } from '../runtime-metrics.js';
|
|
5
5
|
import { resolveProtectedFieldPolicy } from './field-policy.js';
|
|
6
6
|
import { resolveDeterministicProtectedBindingValue } from './protected-value-adapters.js';
|
|
7
7
|
import { protectedBindingKey, protectedBindingValueHintSchema } from './protected-bindings.js';
|
|
@@ -56,8 +56,8 @@ export async function resolveAssistedProtectedFieldValues(params) {
|
|
|
56
56
|
return new Map();
|
|
57
57
|
}
|
|
58
58
|
const resolvedValues = new Map();
|
|
59
|
-
const unresolvedBindings = assistedBindings.filter(({ binding }) => {
|
|
60
|
-
const deterministicValue = resolveDeterministicProtectedBindingValue(binding, params.protectedValues);
|
|
59
|
+
const unresolvedBindings = assistedBindings.filter(({ binding, target }) => {
|
|
60
|
+
const deterministicValue = resolveDeterministicProtectedBindingValue(binding, params.protectedValues, target ?? undefined);
|
|
61
61
|
if (typeof deterministicValue !== 'string' ||
|
|
62
62
|
deterministicValue.trim().length === 0 ||
|
|
63
63
|
!canUseDeterministicValueForPolicy(binding, params.fieldPolicies)) {
|
|
@@ -41,7 +41,7 @@ export declare function executeProtectedFill(params: {
|
|
|
41
41
|
export declare const __testProtectedFill: {
|
|
42
42
|
actionForTarget: typeof actionForTarget;
|
|
43
43
|
formatCardExpiry: typeof formatCardExpiry;
|
|
44
|
-
resolveBindingValue: (fieldKeys: ReadonlyArray<StoredSecretFieldKey>, protectedValues: Record<string, string
|
|
44
|
+
resolveBindingValue: (fieldKeys: ReadonlyArray<StoredSecretFieldKey>, protectedValues: Record<string, string>, target?: TargetDescriptor) => string;
|
|
45
45
|
};
|
|
46
46
|
export {};
|
|
47
47
|
//# sourceMappingURL=protected-fill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiBnF,OAAO,KAAK,EAEV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,MAAM,EAAE,4BAA4B,GAAG,mBAAmB,CAAC;IAC3D,sBAAsB,CAAC,EAAE,IAAI,CAAC;CAC/B;AAED,KAAK,2BAA2B,GAC5B,gBAAgB,GAChB,iBAAiB,GACjB,yBAAyB,GACzB,wBAAwB,GACxB,2BAA2B,GAC3B,gBAAgB,CAAC;AAarB,MAAM,MAAM,4BAA4B,GACpC;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EACF,yBAAyB,GACzB,mCAAmC,GACnC,sCAAsC,GACtC,kCAAkC,GAClC,eAAe,CAAC;CACrB,CAAC;AAEN,iBAAS,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,CActE;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AAsTD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,qBAAqB,CAAC;IACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAuLxC;AAED,eAAO,MAAM,mBAAmB;;;qCAIjB,aAAa,CAAC,oBAAoB,CAAC,mBAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAC9B,gBAAgB;CAuB5B,CAAC"}
|
|
@@ -1,98 +1,13 @@
|
|
|
1
1
|
import { getSurface, getTarget } from '../runtime-state.js';
|
|
2
|
-
import { createAcceptanceProbe,
|
|
3
|
-
import { buildLocator, resolveLocatorRoot, } from '../commands/action-fallbacks.js';
|
|
2
|
+
import { createAcceptanceProbe, waitForAcceptanceProbe } from '../commands/action-acceptance.js';
|
|
4
3
|
import { applyActionWithFallbacks } from '../commands/action-executor.js';
|
|
5
4
|
import { normalizePageSignature, readLocatorDomSignature, } from '../commands/descriptor-validation.js';
|
|
6
|
-
import {
|
|
5
|
+
import { assertStoredBindingStillValid, resolvePreparedLocatorCandidates, resolveInteractionRoots, } from '../commands/interaction-kernel.js';
|
|
7
6
|
import { resolveProtectedFieldPolicy } from './field-policy.js';
|
|
8
7
|
import { protectedBindingKey } from './protected-bindings.js';
|
|
9
8
|
import { resolveAssistedProtectedFieldValues } from './protected-field-values.js';
|
|
10
9
|
import { resolveDeterministicProtectedBindingValue } from './protected-value-adapters.js';
|
|
11
10
|
import { sortProtectedBindingsForExecution } from './fill-ordering.js';
|
|
12
|
-
function targetUsesSurfaceAsPrimaryLocator(target, surface) {
|
|
13
|
-
const surfaceCandidateKeys = new Set(surface.locatorCandidates.map((candidate) => [
|
|
14
|
-
candidate.strategy,
|
|
15
|
-
candidate.name ?? '',
|
|
16
|
-
candidate.value,
|
|
17
|
-
candidate.attribute ?? '',
|
|
18
|
-
candidate.scope ?? '',
|
|
19
|
-
].join(':')));
|
|
20
|
-
return target.locatorCandidates.some((candidate) => surfaceCandidateKeys.has([
|
|
21
|
-
candidate.strategy,
|
|
22
|
-
candidate.name ?? '',
|
|
23
|
-
candidate.value,
|
|
24
|
-
candidate.attribute ?? '',
|
|
25
|
-
candidate.scope ?? '',
|
|
26
|
-
].join(':')));
|
|
27
|
-
}
|
|
28
|
-
function resolveLocatorRootForCandidate(baseRoot, defaultRoot, surfaceRoot, scope) {
|
|
29
|
-
if (scope === 'root') {
|
|
30
|
-
return baseRoot;
|
|
31
|
-
}
|
|
32
|
-
if (scope === 'surface') {
|
|
33
|
-
return surfaceRoot;
|
|
34
|
-
}
|
|
35
|
-
return defaultRoot;
|
|
36
|
-
}
|
|
37
|
-
async function prepareLocator(locator, action, strategy, attempts, options) {
|
|
38
|
-
const count = await locator.count().catch(() => 0);
|
|
39
|
-
if (count === 0) {
|
|
40
|
-
attempts.push(`resolve.skip:${strategy}:empty`);
|
|
41
|
-
return { locator: null };
|
|
42
|
-
}
|
|
43
|
-
if (count > 1) {
|
|
44
|
-
attempts.push(`resolve.skip:${strategy}:ambiguous:${count}`);
|
|
45
|
-
return { locator: null };
|
|
46
|
-
}
|
|
47
|
-
const resolvedLocator = locator.first();
|
|
48
|
-
const visible = await resolvedLocator.isVisible().catch(() => false);
|
|
49
|
-
if (!visible) {
|
|
50
|
-
attempts.push(`resolve.skip:${strategy}:hidden`);
|
|
51
|
-
return { locator: null };
|
|
52
|
-
}
|
|
53
|
-
const disabled = await resolvedLocator.isDisabled?.().catch(() => false);
|
|
54
|
-
if (disabled) {
|
|
55
|
-
attempts.push(`resolve.skip:${strategy}:disabled`);
|
|
56
|
-
return { locator: null, blockedReason: 'disabled' };
|
|
57
|
-
}
|
|
58
|
-
if (action === 'fill' || action === 'type') {
|
|
59
|
-
const editable = await resolvedLocator.isEditable().catch(() => false);
|
|
60
|
-
if (!editable) {
|
|
61
|
-
const descendants = resolvedLocator.locator('input:not([type="hidden"]), textarea, select, [contenteditable="true"]');
|
|
62
|
-
const descendantCount = await descendants.count().catch(() => 0);
|
|
63
|
-
const visibleEditableDescendants = [];
|
|
64
|
-
for (let index = 0; index < descendantCount; index += 1) {
|
|
65
|
-
const descendant = descendants.nth(index);
|
|
66
|
-
const descendantVisible = await descendant.isVisible().catch(() => false);
|
|
67
|
-
if (!descendantVisible) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const descendantEditable = await descendant.isEditable().catch(() => false);
|
|
71
|
-
if (!descendantEditable) {
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
visibleEditableDescendants.push(descendant);
|
|
75
|
-
}
|
|
76
|
-
if (visibleEditableDescendants.length === 1) {
|
|
77
|
-
attempts.push(`resolve.descendant-editable:${strategy}`);
|
|
78
|
-
return { locator: visibleEditableDescendants[0] ?? null };
|
|
79
|
-
}
|
|
80
|
-
if (visibleEditableDescendants.length > 1) {
|
|
81
|
-
attempts.push(`resolve.skip:${strategy}:descendant-ambiguous:${visibleEditableDescendants.length}`);
|
|
82
|
-
return { locator: null };
|
|
83
|
-
}
|
|
84
|
-
const readonly = await resolvedLocator
|
|
85
|
-
.getAttribute?.('readonly')
|
|
86
|
-
.then((value) => value !== null)
|
|
87
|
-
.catch(() => false);
|
|
88
|
-
if (readonly && !options?.allowReadonlyFallback) {
|
|
89
|
-
attempts.push(`resolve.skip:${strategy}:readonly`);
|
|
90
|
-
return { locator: null, blockedReason: 'readonly' };
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return { locator: resolvedLocator };
|
|
95
|
-
}
|
|
96
11
|
function actionForTarget(target) {
|
|
97
12
|
if (target.controlFamily === 'select') {
|
|
98
13
|
return 'select';
|
|
@@ -113,11 +28,11 @@ function formatCardExpiry(month, year) {
|
|
|
113
28
|
const normalizedYear = year.trim().length > 2 ? year.trim().slice(-2) : year.trim().padStart(2, '0');
|
|
114
29
|
return `${normalizedMonth}/${normalizedYear}`;
|
|
115
30
|
}
|
|
116
|
-
function resolveBindingValue(fields, protectedValues, fieldPolicies, assistedValues) {
|
|
31
|
+
function resolveBindingValue(fields, target, protectedValues, fieldPolicies, assistedValues) {
|
|
117
32
|
if (fields.length === 1) {
|
|
118
33
|
const field = fields[0];
|
|
119
34
|
const policy = resolveProtectedFieldPolicy(fieldPolicies, field.fieldKey);
|
|
120
|
-
const deterministicValue = resolveDeterministicProtectedBindingValue(field, protectedValues);
|
|
35
|
+
const deterministicValue = resolveDeterministicProtectedBindingValue(field, protectedValues, target);
|
|
121
36
|
if (policy === 'llm_assisted') {
|
|
122
37
|
const assistedValue = assistedValues.get(protectedBindingKey(field));
|
|
123
38
|
if (typeof assistedValue === 'string' && assistedValue.length > 0) {
|
|
@@ -266,52 +181,37 @@ async function prepareBindings(session, page, fillableForm) {
|
|
|
266
181
|
};
|
|
267
182
|
}
|
|
268
183
|
const surface = target.surfaceRef ? getSurface(session, target.surfaceRef) : null;
|
|
269
|
-
const baseRoot =
|
|
270
|
-
let locatorRoot = baseRoot;
|
|
271
|
-
let surfaceRoot = null;
|
|
272
|
-
if (surface) {
|
|
273
|
-
surfaceRoot = await resolveSurfaceScopeRoot(page, surface, attempts).catch(() => null);
|
|
274
|
-
if (surfaceRoot && !targetUsesSurfaceAsPrimaryLocator(target, surface)) {
|
|
275
|
-
locatorRoot = surfaceRoot;
|
|
276
|
-
}
|
|
277
|
-
else if (!surfaceRoot) {
|
|
278
|
-
attempts.push('surface.resolve.fallback:page');
|
|
279
|
-
}
|
|
280
|
-
}
|
|
184
|
+
const { baseRoot, locatorRoot, surfaceRoot } = await resolveInteractionRoots(page, target, surface, attempts);
|
|
281
185
|
let resolvedLocator = null;
|
|
282
186
|
let sawDomSignatureMismatch = false;
|
|
283
187
|
let sawBlockedTarget = false;
|
|
284
188
|
const action = actionForTarget(target);
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
continue;
|
|
294
|
-
}
|
|
295
|
-
const prepared = await prepareLocator(locator, action, candidate.strategy, attempts, {
|
|
189
|
+
const resolution = await resolvePreparedLocatorCandidates({
|
|
190
|
+
target,
|
|
191
|
+
action,
|
|
192
|
+
baseRoot,
|
|
193
|
+
locatorRoot,
|
|
194
|
+
surfaceRoot,
|
|
195
|
+
attempts,
|
|
196
|
+
prepareOptions: {
|
|
296
197
|
allowReadonlyFallback: action === 'fill' && target.controlFamily === 'datepicker',
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
if (liveSignature && liveSignature !== target.domSignature) {
|
|
307
|
-
sawDomSignatureMismatch = true;
|
|
308
|
-
attempts.push(`domSignature.mismatch:${candidate.strategy}`);
|
|
309
|
-
continue;
|
|
198
|
+
},
|
|
199
|
+
onPreparedLocator: async (preparedLocator, strategy) => {
|
|
200
|
+
if (target.domSignature) {
|
|
201
|
+
const liveSignature = await readLocatorDomSignature(preparedLocator).catch(() => null);
|
|
202
|
+
if (liveSignature && liveSignature !== target.domSignature) {
|
|
203
|
+
sawDomSignatureMismatch = true;
|
|
204
|
+
attempts.push(`domSignature.mismatch:${strategy}`);
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
310
207
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
208
|
+
resolvedLocator = preparedLocator;
|
|
209
|
+
attempts.push(`resolve:${strategy}`);
|
|
210
|
+
return true;
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
if (resolution.sawDisabledTarget || resolution.sawReadonlyTarget) {
|
|
214
|
+
sawBlockedTarget = true;
|
|
315
215
|
}
|
|
316
216
|
if (!resolvedLocator) {
|
|
317
217
|
return {
|
|
@@ -339,22 +239,6 @@ async function prepareBindings(session, page, fillableForm) {
|
|
|
339
239
|
}
|
|
340
240
|
return preparedBindings;
|
|
341
241
|
}
|
|
342
|
-
async function assertBindingStillValid(page, binding, stage) {
|
|
343
|
-
if (binding.target.pageSignature &&
|
|
344
|
-
normalizePageSignature(page.url()) !== binding.target.pageSignature) {
|
|
345
|
-
throw new Error(`binding_stale:page_signature_mismatch:${stage}`);
|
|
346
|
-
}
|
|
347
|
-
const liveCount = await binding.locator.count().catch(() => 0);
|
|
348
|
-
if (liveCount === 0) {
|
|
349
|
-
throw new Error(`binding_stale:locator_resolution_failed:${stage}`);
|
|
350
|
-
}
|
|
351
|
-
if (binding.target.domSignature) {
|
|
352
|
-
const liveSignature = await readLocatorDomSignature(binding.locator).catch(() => null);
|
|
353
|
-
if (liveSignature && liveSignature !== binding.target.domSignature) {
|
|
354
|
-
throw new Error(`binding_stale:dom_signature_mismatch:${stage}`);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
242
|
function staleReasonFromError(error) {
|
|
359
243
|
const message = error instanceof Error ? error.message : String(error);
|
|
360
244
|
if (message.includes('page_signature_mismatch')) {
|
|
@@ -398,7 +282,7 @@ export async function executeProtectedFill(params) {
|
|
|
398
282
|
let acceptanceProbe = null;
|
|
399
283
|
let acceptanceResult = null;
|
|
400
284
|
try {
|
|
401
|
-
actionValue = resolveBindingValue(binding.fields, params.protectedValues, params.fieldPolicies, assistedValues);
|
|
285
|
+
actionValue = resolveBindingValue(binding.fields, binding.target, params.protectedValues, params.fieldPolicies, assistedValues);
|
|
402
286
|
}
|
|
403
287
|
catch (error) {
|
|
404
288
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -438,7 +322,9 @@ export async function executeProtectedFill(params) {
|
|
|
438
322
|
await applyActionWithFallbacks(params.page, binding.root, binding.locator, binding.action, actionValue, binding.attempts, binding.target.controlFamily, {
|
|
439
323
|
guards: {
|
|
440
324
|
assertStillValid: async (stage) => {
|
|
441
|
-
await
|
|
325
|
+
await assertStoredBindingStillValid(params.page, binding.locator, binding.target, stage, {
|
|
326
|
+
errorForReason: (reason, validationStage) => `binding_stale:${reason}:${validationStage}`,
|
|
327
|
+
});
|
|
442
328
|
},
|
|
443
329
|
},
|
|
444
330
|
});
|
|
@@ -522,9 +408,19 @@ export async function executeProtectedFill(params) {
|
|
|
522
408
|
export const __testProtectedFill = {
|
|
523
409
|
actionForTarget,
|
|
524
410
|
formatCardExpiry,
|
|
525
|
-
resolveBindingValue: (fieldKeys, protectedValues) => resolveBindingValue(fieldKeys.map((fieldKey) => ({
|
|
411
|
+
resolveBindingValue: (fieldKeys, protectedValues, target) => resolveBindingValue(fieldKeys.map((fieldKey) => ({
|
|
526
412
|
fieldKey,
|
|
527
413
|
targetRef: 't_test',
|
|
528
414
|
valueHint: 'direct',
|
|
529
|
-
})),
|
|
415
|
+
})), target ??
|
|
416
|
+
{
|
|
417
|
+
ref: 't_test',
|
|
418
|
+
pageRef: 'p0',
|
|
419
|
+
capability: 'actionable',
|
|
420
|
+
lifecycle: 'live',
|
|
421
|
+
availability: { state: 'available' },
|
|
422
|
+
allowedActions: ['fill'],
|
|
423
|
+
locatorCandidates: [],
|
|
424
|
+
createdAt: 0,
|
|
425
|
+
}, protectedValues, undefined, new Map()),
|
|
530
426
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TargetDescriptor } from '../runtime-state.js';
|
|
1
2
|
import type { FillableFormFieldBinding } from './types.js';
|
|
2
|
-
export declare function resolveDeterministicProtectedBindingValue(binding: Pick<FillableFormFieldBinding, 'fieldKey' | 'valueHint'>, protectedValues: Record<string, string>): string | null;
|
|
3
|
+
export declare function resolveDeterministicProtectedBindingValue(binding: Pick<FillableFormFieldBinding, 'fieldKey' | 'valueHint'>, protectedValues: Record<string, string>, target?: Pick<TargetDescriptor, 'label' | 'displayLabel' | 'context'>): string | null;
|
|
3
4
|
//# sourceMappingURL=protected-value-adapters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-value-adapters.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-value-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAwB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"protected-value-adapters.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-value-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAwB,MAAM,YAAY,CAAC;AAwFjF,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,UAAU,GAAG,WAAW,CAAC,EACjE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAAC,GACpE,MAAM,GAAG,IAAI,CAqEf"}
|
|
@@ -11,7 +11,86 @@ function directStoredValue(protectedValues, fieldKey) {
|
|
|
11
11
|
const value = protectedValues[fieldKey];
|
|
12
12
|
return typeof value === 'string' && value.trim().length > 0 ? value : null;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
function parseIsoDate(value) {
|
|
15
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
|
|
16
|
+
if (!match) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const year = match[1];
|
|
20
|
+
const month = match[2];
|
|
21
|
+
const day = match[3];
|
|
22
|
+
if (!year || !month || !day) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return { year, month, day };
|
|
26
|
+
}
|
|
27
|
+
function monthName(month) {
|
|
28
|
+
const names = [
|
|
29
|
+
'January',
|
|
30
|
+
'February',
|
|
31
|
+
'March',
|
|
32
|
+
'April',
|
|
33
|
+
'May',
|
|
34
|
+
'June',
|
|
35
|
+
'July',
|
|
36
|
+
'August',
|
|
37
|
+
'September',
|
|
38
|
+
'October',
|
|
39
|
+
'November',
|
|
40
|
+
'December',
|
|
41
|
+
];
|
|
42
|
+
return names[Number(month) - 1] ?? month;
|
|
43
|
+
}
|
|
44
|
+
function monthShortName(month) {
|
|
45
|
+
return monthName(month).slice(0, 3);
|
|
46
|
+
}
|
|
47
|
+
function monthProjectionStyle(target) {
|
|
48
|
+
const context = [target?.label, target?.displayLabel, target?.context?.hintText]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join(' ')
|
|
51
|
+
.replace(/\s+/g, ' ')
|
|
52
|
+
.trim()
|
|
53
|
+
.toLowerCase();
|
|
54
|
+
if (/\bjanuary\b|\bfebruary\b|\bmarch\b|\bapril\b|\bmay\b|\bjune\b|\bjuly\b|\baugust\b|\bseptember\b|\boctober\b|\bnovember\b|\bdecember\b/.test(context)) {
|
|
55
|
+
return 'name';
|
|
56
|
+
}
|
|
57
|
+
if (/\bjan\b|\bfeb\b|\bmar\b|\bapr\b|\bjun\b|\bjul\b|\baug\b|\bsep\b|\boct\b|\bnov\b|\bdec\b/.test(context)) {
|
|
58
|
+
return 'short';
|
|
59
|
+
}
|
|
60
|
+
return 'numeric';
|
|
61
|
+
}
|
|
62
|
+
export function resolveDeterministicProtectedBindingValue(binding, protectedValues, target) {
|
|
63
|
+
if (binding.fieldKey === 'date_of_birth') {
|
|
64
|
+
const dateOfBirth = directStoredValue(protectedValues, 'date_of_birth');
|
|
65
|
+
if (!dateOfBirth) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const valueHint = binding.valueHint ?? 'direct';
|
|
69
|
+
if (valueHint === 'direct') {
|
|
70
|
+
return dateOfBirth;
|
|
71
|
+
}
|
|
72
|
+
const parsed = parseIsoDate(dateOfBirth);
|
|
73
|
+
if (!parsed) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
if (valueHint === 'date_of_birth.day') {
|
|
77
|
+
return String(Number(parsed.day));
|
|
78
|
+
}
|
|
79
|
+
if (valueHint === 'date_of_birth.year') {
|
|
80
|
+
return parsed.year;
|
|
81
|
+
}
|
|
82
|
+
if (valueHint === 'date_of_birth.month') {
|
|
83
|
+
const style = monthProjectionStyle(target);
|
|
84
|
+
if (style === 'name') {
|
|
85
|
+
return monthName(parsed.month);
|
|
86
|
+
}
|
|
87
|
+
if (style === 'short') {
|
|
88
|
+
return monthShortName(parsed.month);
|
|
89
|
+
}
|
|
90
|
+
return parsed.month;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
15
94
|
if (binding.fieldKey !== 'full_name') {
|
|
16
95
|
return binding.valueHint === 'direct'
|
|
17
96
|
? directStoredValue(protectedValues, binding.fieldKey)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SecretRequestSnapshot, SecretRequestStatus, SecretRequestType } from './types.js';
|
|
2
|
+
export declare function serializeSecretRequest(snapshot: SecretRequestSnapshot): Record<string, unknown>;
|
|
3
|
+
export declare function serializeSecretRequestContext(snapshot: SecretRequestSnapshot): Record<string, unknown>;
|
|
4
|
+
export type SecretRequestStatusContract = {
|
|
5
|
+
message: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
nextAction?: string;
|
|
8
|
+
outcomeType?: 'approval_pending' | 'approval_denied' | 'request_expired';
|
|
9
|
+
};
|
|
10
|
+
export declare function describeSecretRequestStatus(status: SecretRequestStatus, requestType: SecretRequestType): SecretRequestStatusContract;
|
|
11
|
+
//# sourceMappingURL=request-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-output.d.ts","sourceRoot":"","sources":["../../src/secrets/request-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc/F;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,qBAAqB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;CAC1E,CAAC;AAQF,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,iBAAiB,GAC7B,2BAA2B,CA0C7B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function serializeSecretRequest(snapshot) {
|
|
2
|
+
return {
|
|
3
|
+
requestId: snapshot.requestId,
|
|
4
|
+
fillRef: snapshot.fillRef,
|
|
5
|
+
requestType: snapshot.requestType,
|
|
6
|
+
status: snapshot.status,
|
|
7
|
+
...(snapshot.storedSecretRef ? { storedSecretRef: snapshot.storedSecretRef } : {}),
|
|
8
|
+
...(snapshot.kind ? { kind: snapshot.kind } : {}),
|
|
9
|
+
createdAt: snapshot.createdAt,
|
|
10
|
+
updatedAt: snapshot.updatedAt,
|
|
11
|
+
...(snapshot.expiresAt ? { expiresAt: snapshot.expiresAt } : {}),
|
|
12
|
+
...(snapshot.resolvedAt ? { resolvedAt: snapshot.resolvedAt } : {}),
|
|
13
|
+
...(snapshot.claimedAt ? { claimedAt: snapshot.claimedAt } : {}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function serializeSecretRequestContext(snapshot) {
|
|
17
|
+
return {
|
|
18
|
+
requestType: snapshot.requestType,
|
|
19
|
+
...(snapshot.storedSecretRef ? { storedSecretRef: snapshot.storedSecretRef } : {}),
|
|
20
|
+
...(snapshot.kind ? { kind: snapshot.kind } : {}),
|
|
21
|
+
createdAt: snapshot.createdAt,
|
|
22
|
+
updatedAt: snapshot.updatedAt,
|
|
23
|
+
...(snapshot.expiresAt ? { expiresAt: snapshot.expiresAt } : {}),
|
|
24
|
+
...(snapshot.resolvedAt ? { resolvedAt: snapshot.resolvedAt } : {}),
|
|
25
|
+
...(snapshot.claimedAt ? { claimedAt: snapshot.claimedAt } : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function fulfilledReasonForType(type) {
|
|
29
|
+
return type === 'secret_read'
|
|
30
|
+
? 'AgentPay approved access to the saved secret values for this request.'
|
|
31
|
+
: 'The user supplied the requested secret values for this request.';
|
|
32
|
+
}
|
|
33
|
+
export function describeSecretRequestStatus(status, requestType) {
|
|
34
|
+
switch (status) {
|
|
35
|
+
case 'pending':
|
|
36
|
+
return {
|
|
37
|
+
outcomeType: 'approval_pending',
|
|
38
|
+
message: 'Protected secret request is waiting for user approval.',
|
|
39
|
+
reason: 'AgentPay has not approved this secret request yet.',
|
|
40
|
+
nextAction: 'poll-secret',
|
|
41
|
+
};
|
|
42
|
+
case 'fulfilled':
|
|
43
|
+
return {
|
|
44
|
+
message: 'Protected secret request is approved and ready to fill.',
|
|
45
|
+
reason: fulfilledReasonForType(requestType),
|
|
46
|
+
nextAction: 'fill-secret',
|
|
47
|
+
};
|
|
48
|
+
case 'denied':
|
|
49
|
+
return {
|
|
50
|
+
outcomeType: 'approval_denied',
|
|
51
|
+
message: 'Protected secret request was denied and cannot be used.',
|
|
52
|
+
reason: 'AgentPay reports that the user denied this protected request.',
|
|
53
|
+
nextAction: 'ask-user',
|
|
54
|
+
};
|
|
55
|
+
case 'expired':
|
|
56
|
+
return {
|
|
57
|
+
outcomeType: 'request_expired',
|
|
58
|
+
message: 'Protected secret request is no longer usable.',
|
|
59
|
+
reason: 'AgentPay reports that this secret request expired before it could be claimed.',
|
|
60
|
+
nextAction: 'request-secret',
|
|
61
|
+
};
|
|
62
|
+
case 'failed':
|
|
63
|
+
return {
|
|
64
|
+
message: 'Protected secret request failed and cannot be used.',
|
|
65
|
+
reason: 'AgentPay reports that this secret request failed before it could be claimed.',
|
|
66
|
+
nextAction: 'request-secret',
|
|
67
|
+
};
|
|
68
|
+
case 'canceled':
|
|
69
|
+
return {
|
|
70
|
+
message: 'Protected secret request was canceled and cannot be used.',
|
|
71
|
+
reason: 'AgentPay reports that this secret request was canceled before it could be claimed.',
|
|
72
|
+
nextAction: 'request-secret',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|