@trusty-squire/mcp 0.9.17-rc.3 → 0.9.17
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/dist/bot/agent.d.ts +61 -10
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +2577 -1626
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/browser.d.ts +34 -1
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +1313 -229
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/captcha-solver-2captcha.d.ts +21 -0
- package/dist/bot/captcha-solver-2captcha.d.ts.map +1 -1
- package/dist/bot/captcha-solver-2captcha.js +77 -0
- package/dist/bot/captcha-solver-2captcha.js.map +1 -1
- package/dist/bot/credential-extraction-flow.d.ts +66 -0
- package/dist/bot/credential-extraction-flow.d.ts.map +1 -0
- package/dist/bot/credential-extraction-flow.js +422 -0
- package/dist/bot/credential-extraction-flow.js.map +1 -0
- package/dist/bot/failure-stage.d.ts.map +1 -1
- package/dist/bot/failure-stage.js +8 -3
- package/dist/bot/failure-stage.js.map +1 -1
- package/dist/bot/flow-engine.d.ts +7 -0
- package/dist/bot/flow-engine.d.ts.map +1 -0
- package/dist/bot/flow-engine.js +13 -0
- package/dist/bot/flow-engine.js.map +1 -0
- package/dist/bot/form-fill.d.ts +31 -4
- package/dist/bot/form-fill.d.ts.map +1 -1
- package/dist/bot/form-fill.js +109 -8
- package/dist/bot/form-fill.js.map +1 -1
- package/dist/bot/google-login.d.ts.map +1 -1
- package/dist/bot/google-login.js +10 -2
- package/dist/bot/google-login.js.map +1 -1
- package/dist/bot/index.d.ts.map +1 -1
- package/dist/bot/index.js +9 -33
- package/dist/bot/index.js.map +1 -1
- package/dist/bot/nav-search.d.ts +34 -0
- package/dist/bot/nav-search.d.ts.map +1 -1
- package/dist/bot/nav-search.js +283 -31
- package/dist/bot/nav-search.js.map +1 -1
- package/dist/bot/observation-frame.d.ts +16 -0
- package/dist/bot/observation-frame.d.ts.map +1 -0
- package/dist/bot/observation-frame.js +22 -0
- package/dist/bot/observation-frame.js.map +1 -0
- package/dist/bot/onboarding-capture.d.ts +10 -2
- package/dist/bot/onboarding-capture.d.ts.map +1 -1
- package/dist/bot/onboarding-capture.js +131 -22
- package/dist/bot/onboarding-capture.js.map +1 -1
- package/dist/bot/post-signup-action-executor.d.ts +53 -0
- package/dist/bot/post-signup-action-executor.d.ts.map +1 -0
- package/dist/bot/post-signup-action-executor.js +104 -0
- package/dist/bot/post-signup-action-executor.js.map +1 -0
- package/dist/bot/post-signup-flow.d.ts +51 -0
- package/dist/bot/post-signup-flow.d.ts.map +1 -0
- package/dist/bot/post-signup-flow.js +134 -0
- package/dist/bot/post-signup-flow.js.map +1 -0
- package/dist/bot/post-signup-login-flow.d.ts +28 -0
- package/dist/bot/post-signup-login-flow.d.ts.map +1 -0
- package/dist/bot/post-signup-login-flow.js +35 -0
- package/dist/bot/post-signup-login-flow.js.map +1 -0
- package/dist/bot/post-signup-recovery-state.d.ts +145 -0
- package/dist/bot/post-signup-recovery-state.d.ts.map +1 -0
- package/dist/bot/post-signup-recovery-state.js +239 -0
- package/dist/bot/post-signup-recovery-state.js.map +1 -0
- package/dist/bot/post-signup-synthetic-capture.d.ts +43 -0
- package/dist/bot/post-signup-synthetic-capture.d.ts.map +1 -0
- package/dist/bot/post-signup-synthetic-capture.js +84 -0
- package/dist/bot/post-signup-synthetic-capture.js.map +1 -0
- package/dist/bot/promote-to-skill.d.ts +18 -1
- package/dist/bot/promote-to-skill.d.ts.map +1 -1
- package/dist/bot/promote-to-skill.js +310 -23
- package/dist/bot/promote-to-skill.js.map +1 -1
- package/dist/bot/read-otp.d.ts +1 -0
- package/dist/bot/read-otp.d.ts.map +1 -1
- package/dist/bot/read-otp.js +70 -18
- package/dist/bot/read-otp.js.map +1 -1
- package/dist/bot/redact.d.ts.map +1 -1
- package/dist/bot/redact.js +1 -0
- package/dist/bot/redact.js.map +1 -1
- package/dist/bot/replay-skill.d.ts +18 -0
- package/dist/bot/replay-skill.d.ts.map +1 -1
- package/dist/bot/replay-skill.js +1290 -71
- package/dist/bot/replay-skill.js.map +1 -1
- package/dist/bot/semantic-transition.d.ts +66 -0
- package/dist/bot/semantic-transition.d.ts.map +1 -0
- package/dist/bot/semantic-transition.js +361 -0
- package/dist/bot/semantic-transition.js.map +1 -0
- package/dist/bot/signup-oauth-flow.d.ts +16 -0
- package/dist/bot/signup-oauth-flow.d.ts.map +1 -0
- package/dist/bot/signup-oauth-flow.js +31 -0
- package/dist/bot/signup-oauth-flow.js.map +1 -0
- package/dist/bot/state-classifier.d.ts +18 -0
- package/dist/bot/state-classifier.d.ts.map +1 -0
- package/dist/bot/state-classifier.js +127 -0
- package/dist/bot/state-classifier.js.map +1 -0
- package/dist/bot/terminal-gate.d.ts +20 -0
- package/dist/bot/terminal-gate.d.ts.map +1 -0
- package/dist/bot/terminal-gate.js +165 -0
- package/dist/bot/terminal-gate.js.map +1 -0
- package/dist/bot/xvfb.d.ts +3 -0
- package/dist/bot/xvfb.d.ts.map +1 -1
- package/dist/bot/xvfb.js +106 -40
- package/dist/bot/xvfb.js.map +1 -1
- package/dist/provision-gate.d.ts +16 -0
- package/dist/provision-gate.d.ts.map +1 -0
- package/dist/provision-gate.js +66 -0
- package/dist/provision-gate.js.map +1 -0
- package/dist/provision-run.d.ts +45 -0
- package/dist/provision-run.d.ts.map +1 -0
- package/dist/provision-run.js +99 -0
- package/dist/provision-run.js.map +1 -0
- package/dist/skill-registry-client.d.ts +9 -0
- package/dist/skill-registry-client.d.ts.map +1 -1
- package/dist/skill-registry-client.js +31 -6
- package/dist/skill-registry-client.js.map +1 -1
- package/dist/tools/provision-any.d.ts +21 -0
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +127 -36
- package/dist/tools/provision-any.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
// CredentialExtractionFlow owns the policy boundary between "values the
|
|
2
|
+
// extractor happened to carry around" and "usable service credentials".
|
|
3
|
+
//
|
|
4
|
+
// The heavy extraction mechanics still live in agent.ts/extraction.ts for now;
|
|
5
|
+
// this module is intentionally the small, shared contract the orchestration
|
|
6
|
+
// loop uses to decide whether to continue navigating, wait for sibling fields,
|
|
7
|
+
// or return a successful bundle.
|
|
8
|
+
// Keys that the post-signup accumulator stores for housekeeping. They are not
|
|
9
|
+
// extracted credentials and must not count as progress or success.
|
|
10
|
+
export const NON_CREDENTIAL_KEYS = new Set([
|
|
11
|
+
"api_key_truncated",
|
|
12
|
+
"password",
|
|
13
|
+
"email",
|
|
14
|
+
]);
|
|
15
|
+
export function credentialFieldNames(creds) {
|
|
16
|
+
return Object.entries(creds)
|
|
17
|
+
.filter(([, value]) => value !== undefined && value.length > 0)
|
|
18
|
+
.map(([key]) => key)
|
|
19
|
+
.filter((key) => !NON_CREDENTIAL_KEYS.has(key));
|
|
20
|
+
}
|
|
21
|
+
// Credential fields that are usable by themselves. Other named fields can be
|
|
22
|
+
// part of a credential bundle, but a lone identifier such as cloud_name,
|
|
23
|
+
// application_id, client_id, or org_id must not end the post-signup loop.
|
|
24
|
+
export const SINGLE_CREDENTIAL_FIELDS = new Set([
|
|
25
|
+
"api_key",
|
|
26
|
+
"username",
|
|
27
|
+
"access_token",
|
|
28
|
+
]);
|
|
29
|
+
export function hasSingleCredentialValue(creds) {
|
|
30
|
+
return credentialFieldNames(creds).some((key) => SINGLE_CREDENTIAL_FIELDS.has(key));
|
|
31
|
+
}
|
|
32
|
+
// True iff the credentials Record holds at least one extracted value
|
|
33
|
+
// (api_key, username, or any labeled multi-cred field). Excludes metadata and
|
|
34
|
+
// truncated stubs. Used to decide whether an extraction round produced progress.
|
|
35
|
+
export function hasAnyExtractedCredential(creds) {
|
|
36
|
+
return credentialFieldNames(creds).length > 0;
|
|
37
|
+
}
|
|
38
|
+
// True iff the credentials Record contains a multi-credential bundle: anything
|
|
39
|
+
// beyond the legacy single api_key/username shape. This keeps multi-field
|
|
40
|
+
// services open long enough to collect sibling secrets.
|
|
41
|
+
export function isMultiCredBundle(creds) {
|
|
42
|
+
return credentialFieldNames(creds).some((key) => !SINGLE_CREDENTIAL_FIELDS.has(key));
|
|
43
|
+
}
|
|
44
|
+
// Final success policy for the signup result. Legacy single-key services can
|
|
45
|
+
// return on api_key; services with no literal api_key need at least two named
|
|
46
|
+
// non-metadata fields so a lone application/project ID does not masquerade as a
|
|
47
|
+
// usable secret.
|
|
48
|
+
export function hasUsableCredentialBundle(creds) {
|
|
49
|
+
if (hasSingleCredentialValue(creds))
|
|
50
|
+
return true;
|
|
51
|
+
return credentialFieldNames(creds).length >= 2;
|
|
52
|
+
}
|
|
53
|
+
// Phase E — multi-credential planner-prose parser. When a service
|
|
54
|
+
// exposes several distinct credentials on the same page (Cloudinary:
|
|
55
|
+
// cloud_name + api_key + api_secret; Algolia: application_id +
|
|
56
|
+
// admin_api_key + search_api_key; Twilio: account_sid + auth_token;
|
|
57
|
+
// Stripe: publishable_key + secret_key), the post-verify planner is
|
|
58
|
+
// instructed (Phase E prompt update) to label each value explicitly
|
|
59
|
+
// in its extract reason. This parser pulls those labels + values out
|
|
60
|
+
// and returns them as { [label]: value }.
|
|
61
|
+
//
|
|
62
|
+
// The label vocabulary is whitelisted to known credential-shaped
|
|
63
|
+
// names so the parser doesn't false-match prose like "the
|
|
64
|
+
// dashboard_url is …" or "the project_name is …". Anything outside
|
|
65
|
+
// the whitelist is dropped to keep credentials objects clean.
|
|
66
|
+
//
|
|
67
|
+
// Returns empty record when nothing parsed. Caller folds the result
|
|
68
|
+
// into the credentials dict; falls back to single-cred extraction
|
|
69
|
+
// when this returns empty.
|
|
70
|
+
export function extractAllLabeledTokensFromReason(reason, pageText) {
|
|
71
|
+
// Whitelist of credential labels we recognize. Snake_case canonical;
|
|
72
|
+
// the matcher tolerates the LLM emitting hyphenated or PascalCase
|
|
73
|
+
// variants. Each entry maps a normalized form back to the canonical
|
|
74
|
+
// snake_case used in the credentials Record.
|
|
75
|
+
const LABEL_ALIASES = {
|
|
76
|
+
api_key: "api_key",
|
|
77
|
+
apikey: "api_key",
|
|
78
|
+
api_token: "api_key",
|
|
79
|
+
apitoken: "api_key",
|
|
80
|
+
access_token: "access_token",
|
|
81
|
+
accesstoken: "access_token",
|
|
82
|
+
api_secret: "api_secret",
|
|
83
|
+
apisecret: "api_secret",
|
|
84
|
+
secret_key: "secret_key",
|
|
85
|
+
secretkey: "secret_key",
|
|
86
|
+
publishable_key: "publishable_key",
|
|
87
|
+
publishablekey: "publishable_key",
|
|
88
|
+
client_id: "client_id",
|
|
89
|
+
clientid: "client_id",
|
|
90
|
+
client_secret: "client_secret",
|
|
91
|
+
clientsecret: "client_secret",
|
|
92
|
+
cloud_name: "cloud_name",
|
|
93
|
+
cloudname: "cloud_name",
|
|
94
|
+
application_id: "application_id",
|
|
95
|
+
applicationid: "application_id",
|
|
96
|
+
app_id: "application_id",
|
|
97
|
+
appid: "application_id",
|
|
98
|
+
admin_api_key: "admin_api_key",
|
|
99
|
+
adminapikey: "admin_api_key",
|
|
100
|
+
search_api_key: "search_api_key",
|
|
101
|
+
searchapikey: "search_api_key",
|
|
102
|
+
monitoring_api_key: "monitoring_api_key",
|
|
103
|
+
account_sid: "account_sid",
|
|
104
|
+
accountsid: "account_sid",
|
|
105
|
+
auth_token: "auth_token",
|
|
106
|
+
authtoken: "auth_token",
|
|
107
|
+
sandbox_secret: "sandbox_secret",
|
|
108
|
+
sandboxsecret: "sandbox_secret",
|
|
109
|
+
org_id: "org_id",
|
|
110
|
+
orgid: "org_id",
|
|
111
|
+
organization_id: "org_id",
|
|
112
|
+
consumer_key: "consumer_key",
|
|
113
|
+
consumer_secret: "consumer_secret",
|
|
114
|
+
access_token_secret: "access_token_secret",
|
|
115
|
+
project_api_key: "project_api_key",
|
|
116
|
+
personal_api_key: "api_key",
|
|
117
|
+
app_key: "app_key",
|
|
118
|
+
appkey: "app_key",
|
|
119
|
+
app_secret: "app_secret",
|
|
120
|
+
appsecret: "app_secret",
|
|
121
|
+
// 2026-06-08 — bare "secret" (Pusher's App Keys page labels its app
|
|
122
|
+
// secret just "secret"; the bot reached the keys page + saw it but the
|
|
123
|
+
// parser dropped it because no alias mapped bare "secret"). Maps to a
|
|
124
|
+
// neutral `secret` credential name. The \bsecret\b match can't fire
|
|
125
|
+
// inside api_secret/client_secret/app_secret (the preceding "_" kills
|
|
126
|
+
// the word boundary), so this doesn't double-capture those.
|
|
127
|
+
secret: "secret",
|
|
128
|
+
// 0.8.3-rc.1 — typeform's planner uses `personal_access_token`
|
|
129
|
+
// and `Personal access token` (the latter when transcribing the
|
|
130
|
+
// page heading verbatim). Both alias to api_key — typeform issues
|
|
131
|
+
// ONE token type, and downstream consumers expect `api_key`.
|
|
132
|
+
personal_access_token: "api_key",
|
|
133
|
+
personalaccesstoken: "api_key",
|
|
134
|
+
// Bearer / private / write key patterns surfaced across the
|
|
135
|
+
// 2026-05-29 retest. Each was quoted by the planner but not in
|
|
136
|
+
// the alias set, so the labeled extractor missed them.
|
|
137
|
+
bearer_token: "api_key",
|
|
138
|
+
bearertoken: "api_key",
|
|
139
|
+
private_key: "api_key",
|
|
140
|
+
privatekey: "api_key",
|
|
141
|
+
write_key: "api_key",
|
|
142
|
+
writekey: "api_key",
|
|
143
|
+
read_key: "api_key",
|
|
144
|
+
readkey: "api_key",
|
|
145
|
+
server_token: "api_key",
|
|
146
|
+
servertoken: "api_key",
|
|
147
|
+
};
|
|
148
|
+
const out = {};
|
|
149
|
+
// Build the label-alternation from the whitelist keys. Restricting
|
|
150
|
+
// the regex to KNOWN labels avoids the greedy-match-eats-real-label
|
|
151
|
+
// bug (without this, "shows: application_id" would match as
|
|
152
|
+
// label='shows' / value='application_id' and consume the real
|
|
153
|
+
// 'application_id' that follows). Longer aliases first so the
|
|
154
|
+
// regex prefers `admin_api_key` over `api_key` at the same start.
|
|
155
|
+
const labelKeys = Object.keys(LABEL_ALIASES).sort((a, b) => b.length - a.length);
|
|
156
|
+
const labelAlt = labelKeys.map(escapeRegex).join("|");
|
|
157
|
+
// Hyphen + space variants — the LLM sometimes emits `cloud-name`
|
|
158
|
+
// or `Cloud name` instead of `cloud_name`. Replace _ with
|
|
159
|
+
// [-_\s] inside each alternative so the regex matches all three.
|
|
160
|
+
const labelAltLoose = labelAlt.replace(/_/g, "[-_\\s]");
|
|
161
|
+
// Two patterns:
|
|
162
|
+
//
|
|
163
|
+
// (A) Strict QUOTED form — `label='value'` / `label="value"` /
|
|
164
|
+
// `label:'value'` etc. Trusts the value as credential-shape
|
|
165
|
+
// because the planner was instructed (Phase E prompt) to quote.
|
|
166
|
+
//
|
|
167
|
+
// (B) Prose `label is value` form — required for natural-language
|
|
168
|
+
// extracts but DANGEROUS. The Cloudinary trace produced
|
|
169
|
+
// "api_secret is hidden behind asterisks" — the prose-pattern
|
|
170
|
+
// greedily captured `hidden` as the value, then the
|
|
171
|
+
// anti-hallucination check passed (the word "hidden" was in
|
|
172
|
+
// pageText/reason). Mitigations: (1) require the value to LOOK
|
|
173
|
+
// credential-shape (mixed alpha+digit, ≥16 chars, OR a known
|
|
174
|
+
// credential prefix); (2) hard-reject a curated set of common
|
|
175
|
+
// English status words that look label-like in extract prose.
|
|
176
|
+
const quotedRe = new RegExp(`\\b(${labelAltLoose})\\b\\s*[=:]\\s*['"\`]([A-Za-z0-9_.+/=\\-]{4,80})['"\`]`, "gi");
|
|
177
|
+
for (const m of reason.matchAll(quotedRe)) {
|
|
178
|
+
const rawLabel = (m[1] ?? "").toLowerCase().replace(/[-\s]+/g, "_");
|
|
179
|
+
const normalized = rawLabel.replace(/_+/g, "_");
|
|
180
|
+
const canonical = LABEL_ALIASES[normalized];
|
|
181
|
+
const value = m[2];
|
|
182
|
+
if (canonical === undefined || value === undefined)
|
|
183
|
+
continue;
|
|
184
|
+
// Email local-part guard. The value class stops at '@', so an email
|
|
185
|
+
// ("giselle703@gmail.com") is captured as its local-part ("giselle703")
|
|
186
|
+
// — a digit-bearing string that passes credential-shape. An email is
|
|
187
|
+
// never a credential; reject when the captured value is immediately
|
|
188
|
+
// followed by '@' in the source. (Cloudinary email-settings page.)
|
|
189
|
+
if (reason.includes(value + "@") || pageText.includes(value + "@"))
|
|
190
|
+
continue;
|
|
191
|
+
if (!pageText.includes(value))
|
|
192
|
+
continue;
|
|
193
|
+
if (out[canonical] === undefined)
|
|
194
|
+
out[canonical] = value;
|
|
195
|
+
}
|
|
196
|
+
// English status words that show up in planner prose alongside
|
|
197
|
+
// a credential label but are NEVER the credential value itself.
|
|
198
|
+
// Each is a literal lowercase comparison after value-lowercase.
|
|
199
|
+
const PROSE_BLACKLIST = new Set([
|
|
200
|
+
"hidden", "masked", "shown", "visible", "available", "missing",
|
|
201
|
+
"unavailable", "redacted", "obscured", "concealed", "secret",
|
|
202
|
+
"true", "false", "null", "none", "empty", "unset", "undefined",
|
|
203
|
+
"displayed", "revealed", "asterisks", "bullets", "dots", "stars",
|
|
204
|
+
"blurred", "encrypted",
|
|
205
|
+
]);
|
|
206
|
+
const looksCredentialShape = (v) => {
|
|
207
|
+
if (v.length >= 16)
|
|
208
|
+
return true; // long-enough tokens are presumed real
|
|
209
|
+
if (/^[A-Za-z]+$/.test(v))
|
|
210
|
+
return false; // pure word → suspect
|
|
211
|
+
if (/^\d{10,}$/.test(v))
|
|
212
|
+
return true; // long all-digit (Cloudinary api_key)
|
|
213
|
+
if (/[_\-]/.test(v) && /[a-z]/i.test(v) && /\d/.test(v))
|
|
214
|
+
return true; // mixed
|
|
215
|
+
if (/^[a-z]+_[A-Za-z0-9]/i.test(v))
|
|
216
|
+
return true; // prefix_ style (sk_…, npm_…)
|
|
217
|
+
if (/\d/.test(v) && /[A-Za-z]/.test(v))
|
|
218
|
+
return true; // alphanumeric mix
|
|
219
|
+
return false; // pure short word → reject as suspect
|
|
220
|
+
};
|
|
221
|
+
// Same separator vocab as quoted, plus optional quotes around the
|
|
222
|
+
// value. The credential-shape + blacklist guards run on the
|
|
223
|
+
// captured (possibly-unquoted) value.
|
|
224
|
+
const proseRe = new RegExp(`\\b(${labelAltLoose})\\b\\s*(?:[=:]|\\b(?:is|are)\\b)\\s*['"\`]?([A-Za-z0-9_.+/=\\-]{4,80})['"\`]?`, "gi");
|
|
225
|
+
for (const m of reason.matchAll(proseRe)) {
|
|
226
|
+
const rawLabel = (m[1] ?? "").toLowerCase().replace(/[-\s]+/g, "_");
|
|
227
|
+
const normalized = rawLabel.replace(/_+/g, "_");
|
|
228
|
+
const canonical = LABEL_ALIASES[normalized];
|
|
229
|
+
const value = m[2];
|
|
230
|
+
if (canonical === undefined || value === undefined)
|
|
231
|
+
continue;
|
|
232
|
+
if (out[canonical] !== undefined)
|
|
233
|
+
continue; // quoted-form already won
|
|
234
|
+
if (PROSE_BLACKLIST.has(value.toLowerCase()))
|
|
235
|
+
continue;
|
|
236
|
+
// Email local-part guard — see the quoted loop above.
|
|
237
|
+
if (reason.includes(value + "@") || pageText.includes(value + "@"))
|
|
238
|
+
continue;
|
|
239
|
+
if (!looksCredentialShape(value))
|
|
240
|
+
continue;
|
|
241
|
+
if (!pageText.includes(value))
|
|
242
|
+
continue;
|
|
243
|
+
out[canonical] = value;
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
function escapeRegex(s) {
|
|
248
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
249
|
+
}
|
|
250
|
+
// DOM-label phrase → canonical credential key. Shared by
|
|
251
|
+
// extractFromDomProximity (which harvests VALUES) and
|
|
252
|
+
// countPresentedCredentialLabels (which counts how many distinct
|
|
253
|
+
// credentials a page PRESENTS, masked included). Kept in lockstep with
|
|
254
|
+
// the Phase E LABEL_ALIASES vocabulary.
|
|
255
|
+
export const DOM_LABEL_TO_KEY = {
|
|
256
|
+
"api key": "api_key",
|
|
257
|
+
"api token": "api_key",
|
|
258
|
+
"api secret": "api_secret",
|
|
259
|
+
"secret key": "secret_key",
|
|
260
|
+
"publishable key": "publishable_key",
|
|
261
|
+
"access key": "access_key_id",
|
|
262
|
+
"access key id": "access_key_id",
|
|
263
|
+
"access token": "access_token",
|
|
264
|
+
"bearer token": "access_token",
|
|
265
|
+
"personal access token": "api_key",
|
|
266
|
+
"auth token": "auth_token",
|
|
267
|
+
"client id": "client_id",
|
|
268
|
+
"client secret": "client_secret",
|
|
269
|
+
"client key": "client_id",
|
|
270
|
+
"cloud name": "cloud_name",
|
|
271
|
+
cloudname: "cloud_name",
|
|
272
|
+
"application id": "application_id",
|
|
273
|
+
"app id": "application_id",
|
|
274
|
+
"admin api key": "admin_api_key",
|
|
275
|
+
"search api key": "search_api_key",
|
|
276
|
+
"search-only api key": "search_api_key",
|
|
277
|
+
"monitoring api key": "monitoring_api_key",
|
|
278
|
+
"account sid": "account_sid",
|
|
279
|
+
"secret access key": "secret_access_key",
|
|
280
|
+
"consumer key": "consumer_key",
|
|
281
|
+
"consumer secret": "consumer_secret",
|
|
282
|
+
"access token secret": "access_token_secret",
|
|
283
|
+
"project api key": "project_api_key",
|
|
284
|
+
"personal api key": "api_key",
|
|
285
|
+
"organization id": "org_id",
|
|
286
|
+
"org id": "org_id",
|
|
287
|
+
"app key": "app_key",
|
|
288
|
+
"app secret": "app_secret",
|
|
289
|
+
};
|
|
290
|
+
export class CredentialExtractionFlow {
|
|
291
|
+
hasAnyExtractedCredential(creds) {
|
|
292
|
+
return hasAnyExtractedCredential(creds);
|
|
293
|
+
}
|
|
294
|
+
isMultiCredBundle(creds) {
|
|
295
|
+
return isMultiCredBundle(creds);
|
|
296
|
+
}
|
|
297
|
+
hasUsableCredentialBundle(creds) {
|
|
298
|
+
return hasUsableCredentialBundle(creds);
|
|
299
|
+
}
|
|
300
|
+
async runPostSignupExtractionRound(input) {
|
|
301
|
+
const steps = [];
|
|
302
|
+
const roundLabel = `Post-verify ${input.round + 1}/${input.maxRounds}`;
|
|
303
|
+
const { credentials, port } = input;
|
|
304
|
+
const [pageText, inputValues] = await Promise.all([
|
|
305
|
+
port.extractText().catch(() => ""),
|
|
306
|
+
port.extractAllInputValues().catch(() => []),
|
|
307
|
+
]);
|
|
308
|
+
const verifySource = pageText + "\n" + inputValues.join("\n");
|
|
309
|
+
const legacy = await port.extractCredentials();
|
|
310
|
+
mergeFirstWins(credentials, legacy);
|
|
311
|
+
const labeled = extractAllLabeledTokensFromReason(input.reason, verifySource);
|
|
312
|
+
const labeledNewKeys = mergeFirstWins(credentials, labeled);
|
|
313
|
+
if (labeledNewKeys.length > 0) {
|
|
314
|
+
const summary = labeledNewKeys
|
|
315
|
+
.map((key) => summarizeCredential(key, labeled[key]))
|
|
316
|
+
.join(", ");
|
|
317
|
+
steps.push(`${roundLabel}: Phase E surfaced ${labeledNewKeys.length} labeled credential(s) (${summary})`);
|
|
318
|
+
}
|
|
319
|
+
const MASKED_HINT = /\b(?:masked|hidden|bullets?|asterisks?|••+|\*{3,}|reveal|unmask)\b/i;
|
|
320
|
+
if (MASKED_HINT.test(input.reason)) {
|
|
321
|
+
try {
|
|
322
|
+
const revealRes = await port.revealMaskedCredentials();
|
|
323
|
+
steps.push(`${roundLabel}: reveal pass clicked=${revealRes.clicked} diagnostic=[${revealRes.diagnostic.join("; ")}]`);
|
|
324
|
+
if (revealRes.clicked > 0) {
|
|
325
|
+
const labeledAfter = await port.extractFromDomProximity();
|
|
326
|
+
const afterNewKeys = mergeFirstWins(credentials, labeledAfter);
|
|
327
|
+
if (afterNewKeys.length > 0) {
|
|
328
|
+
steps.push(`${roundLabel}: post-reveal DOM-proximity extracted ${afterNewKeys.length} more (${afterNewKeys.join(", ")})`);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const allLabeled = await port.extractLabeledCredentialCandidates();
|
|
332
|
+
const candSummary = allLabeled
|
|
333
|
+
.filter((candidate) => !candidate.isMasked)
|
|
334
|
+
.slice(0, 8)
|
|
335
|
+
.map((candidate) => `${candidate.value.slice(0, 6)}…(${candidate.value.length}ch)/${candidate.label ?? "no-label"}`)
|
|
336
|
+
.join(", ");
|
|
337
|
+
steps.push(`${roundLabel}: post-reveal had ${allLabeled.length} candidates; visible: ${candSummary}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
steps.push(`${roundLabel}: reveal pass error (${err instanceof Error ? err.message : String(err)})`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
const labeledFromDom = await port.extractFromDomProximity();
|
|
347
|
+
const domNewKeys = mergeFirstWins(credentials, labeledFromDom);
|
|
348
|
+
if (domNewKeys.length > 0) {
|
|
349
|
+
const summary = domNewKeys
|
|
350
|
+
.map((key) => summarizeCredential(key, labeledFromDom[key]))
|
|
351
|
+
.join(", ");
|
|
352
|
+
steps.push(`${roundLabel}: DOM-proximity surfaced ${domNewKeys.length} more (${summary})`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// DOM-proximity is best-effort; a page mid-navigation should not abort
|
|
357
|
+
// the extraction round.
|
|
358
|
+
}
|
|
359
|
+
let presentedCredentialCount = null;
|
|
360
|
+
if (input.detectPresentedCredentialLabels) {
|
|
361
|
+
presentedCredentialCount = await port.countPresentedCredentialLabels();
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
foundAnyCredential: hasAnyExtractedCredential(credentials),
|
|
365
|
+
presentedCredentialCount,
|
|
366
|
+
verifySource,
|
|
367
|
+
steps,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
async pollAfterCredentialProducingClick(input) {
|
|
371
|
+
const maxWaitMs = input.maxWaitMs ?? 8000;
|
|
372
|
+
const pollIntervalSeconds = input.pollIntervalSeconds ?? 0.5;
|
|
373
|
+
const maxPolls = input.maxPolls ?? Number.POSITIVE_INFINITY;
|
|
374
|
+
const deadline = Date.now() + maxWaitMs;
|
|
375
|
+
let alertSeen = "";
|
|
376
|
+
let alertChecked = false;
|
|
377
|
+
let polls = 0;
|
|
378
|
+
while (Date.now() < deadline && polls < maxPolls) {
|
|
379
|
+
polls += 1;
|
|
380
|
+
await input.port.wait(pollIntervalSeconds);
|
|
381
|
+
// Reuse the first settle to grab transient toasts before they dismiss.
|
|
382
|
+
if (!alertChecked) {
|
|
383
|
+
alertChecked = true;
|
|
384
|
+
alertSeen = await input.port.captureTransientAlert(0);
|
|
385
|
+
}
|
|
386
|
+
try {
|
|
387
|
+
const pollExtract = await input.port.extractCredentials();
|
|
388
|
+
mergeFirstWins(input.credentials, pollExtract);
|
|
389
|
+
try {
|
|
390
|
+
const pollLabeled = await input.port.extractFromDomProximity();
|
|
391
|
+
mergeFirstWins(input.credentials, pollLabeled);
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// DOM-proximity failure is non-fatal; the next poll/round can retry.
|
|
395
|
+
}
|
|
396
|
+
if (input.credentials.api_key !== undefined)
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
// Page mid-render; keep polling until the deadline.
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
alertSeen,
|
|
405
|
+
foundApiKey: input.credentials.api_key !== undefined,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
function mergeFirstWins(target, source) {
|
|
410
|
+
const newKeys = [];
|
|
411
|
+
for (const [key, value] of Object.entries(source)) {
|
|
412
|
+
if (target[key] !== undefined)
|
|
413
|
+
continue;
|
|
414
|
+
target[key] = value;
|
|
415
|
+
newKeys.push(key);
|
|
416
|
+
}
|
|
417
|
+
return newKeys;
|
|
418
|
+
}
|
|
419
|
+
function summarizeCredential(key, value) {
|
|
420
|
+
return `${key}=${value.slice(0, 4)}…${value.slice(-4)}`;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=credential-extraction-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-extraction-flow.js","sourceRoot":"","sources":["../../src/bot/credential-extraction-flow.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wEAAwE;AACxE,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,iCAAiC;AAEjC,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAS;IACjD,mBAAmB;IACnB,UAAU;IACV,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAClC,KAAyC;IAEzC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;SACnB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,6EAA6E;AAC7E,yEAAyE;AACzE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAS;IACtD,SAAS;IACT,UAAU;IACV,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CACtC,KAAyC;IAEzC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9C,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,UAAU,yBAAyB,CACvC,KAAyC;IAEzC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,+EAA+E;AAC/E,0EAA0E;AAC1E,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAC/B,KAAyC;IAEzC,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,CACrC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,iBAAiB;AACjB,MAAM,UAAU,yBAAyB,CACvC,KAAyC;IAEzC,IAAI,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,kEAAkE;AAClE,qEAAqE;AACrE,+DAA+D;AAC/D,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,qEAAqE;AACrE,0CAA0C;AAC1C,EAAE;AACF,iEAAiE;AACjE,0DAA0D;AAC1D,mEAAmE;AACnE,8DAA8D;AAC9D,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,2BAA2B;AAC3B,MAAM,UAAU,iCAAiC,CAC/C,MAAc,EACd,QAAgB;IAEhB,qEAAqE;IACrE,kEAAkE;IAClE,oEAAoE;IACpE,6CAA6C;IAC7C,MAAM,aAAa,GAA2B;QAC5C,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,YAAY;QACvB,eAAe,EAAE,iBAAiB;QAClC,cAAc,EAAE,iBAAiB;QACjC,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,WAAW;QACrB,aAAa,EAAE,eAAe;QAC9B,YAAY,EAAE,eAAe;QAC7B,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,gBAAgB;QAChC,aAAa,EAAE,gBAAgB;QAC/B,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,gBAAgB;QACvB,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,eAAe;QAC5B,cAAc,EAAE,gBAAgB;QAChC,YAAY,EAAE,gBAAgB;QAC9B,kBAAkB,EAAE,oBAAoB;QACxC,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,aAAa;QACzB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,gBAAgB;QAChC,aAAa,EAAE,gBAAgB;QAC/B,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,QAAQ;QACf,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,cAAc;QAC5B,eAAe,EAAE,iBAAiB;QAClC,mBAAmB,EAAE,qBAAqB;QAC1C,eAAe,EAAE,iBAAiB;QAClC,gBAAgB,EAAE,SAAS;QAC3B,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,YAAY;QACvB,oEAAoE;QACpE,uEAAuE;QACvE,sEAAsE;QACtE,oEAAoE;QACpE,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,EAAE,QAAQ;QAChB,+DAA+D;QAC/D,gEAAgE;QAChE,kEAAkE;QAClE,6DAA6D;QAC7D,qBAAqB,EAAE,SAAS;QAChC,mBAAmB,EAAE,SAAS;QAC9B,4DAA4D;QAC5D,+DAA+D;QAC/D,uDAAuD;QACvD,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,SAAS;KACvB,CAAC;IAEF,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,mEAAmE;IACnE,oEAAoE;IACpE,4DAA4D;IAC5D,8DAA8D;IAC9D,8DAA8D;IAC9D,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAC9B,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,iEAAiE;IACjE,0DAA0D;IAC1D,iEAAiE;IACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxD,gBAAgB;IAChB,EAAE;IACF,+DAA+D;IAC/D,gEAAgE;IAChE,oEAAoE;IACpE,EAAE;IACF,kEAAkE;IAClE,4DAA4D;IAC5D,kEAAkE;IAClE,wDAAwD;IACxD,gEAAgE;IAChE,mEAAmE;IACnE,iEAAiE;IACjE,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,IAAI,MAAM,CACzB,OAAO,aAAa,yDAAyD,EAC7E,IAAI,CACL,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAC7D,oEAAoE;QACpE,wEAAwE;QACxE,qEAAqE;QACrE,oEAAoE;QACpE,mEAAmE;QACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACxC,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC3D,CAAC;IAED,+DAA+D;IAC/D,gEAAgE;IAChE,gEAAgE;IAChE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS;QACtC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;QAC9D,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ;QAC5D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW;QAC9D,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO;QAChE,SAAS,EAAE,WAAW;KACvB,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAG,CAAC,CAAS,EAAW,EAAE;QAClD,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,uCAAuC;QACxE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,sBAAsB;QAC/D,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,sCAAsC;QAC5E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,QAAQ;QAC9E,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;QAC/E,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,mBAAmB;QACxE,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC,CAAC;IACF,kEAAkE;IAClE,4DAA4D;IAC5D,sCAAsC;IACtC,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,OAAO,aAAa,gFAAgF,EACpG,IAAI,CACL,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAC7D,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,0BAA0B;QACtE,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACvD,sDAAsD;QACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACxC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,yDAAyD;AACzD,sDAAsD;AACtD,iEAAiE;AACjE,uEAAuE;AACvE,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,YAAY;IAC1B,YAAY,EAAE,YAAY;IAC1B,iBAAiB,EAAE,iBAAiB;IACpC,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,eAAe;IAChC,cAAc,EAAE,cAAc;IAC9B,cAAc,EAAE,cAAc;IAC9B,uBAAuB,EAAE,SAAS;IAClC,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,WAAW;IACxB,eAAe,EAAE,eAAe;IAChC,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,YAAY;IAC1B,SAAS,EAAE,YAAY;IACvB,gBAAgB,EAAE,gBAAgB;IAClC,QAAQ,EAAE,gBAAgB;IAC1B,eAAe,EAAE,eAAe;IAChC,gBAAgB,EAAE,gBAAgB;IAClC,qBAAqB,EAAE,gBAAgB;IACvC,oBAAoB,EAAE,oBAAoB;IAC1C,aAAa,EAAE,aAAa;IAC5B,mBAAmB,EAAE,mBAAmB;IACxC,cAAc,EAAE,cAAc;IAC9B,iBAAiB,EAAE,iBAAiB;IACpC,qBAAqB,EAAE,qBAAqB;IAC5C,iBAAiB,EAAE,iBAAiB;IACpC,kBAAkB,EAAE,SAAS;IAC7B,iBAAiB,EAAE,QAAQ;IAC3B,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,YAAY;CAC3B,CAAC;AA4DF,MAAM,OAAO,wBAAwB;IACnC,yBAAyB,CACvB,KAAyC;QAEzC,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,iBAAiB,CAAC,KAAyC;QACzD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,yBAAyB,CACvB,KAAyC;QAEzC,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,4BAA4B,CAChC,KAAqC;QAErC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,eAAe,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEpC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC;SACzD,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,iCAAiC,CAC/C,KAAK,CAAC,MAAM,EACZ,YAAY,CACb,CAAC;QACF,MAAM,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,cAAc;iBAC3B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAE,CAAC,CAAC;iBACrD,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,sBAAsB,cAAc,CAAC,MAAM,2BAA2B,OAAO,GAAG,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,qEAAqE,CAAC;QACxE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACvD,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,yBAAyB,SAAS,CAAC,OAAO,gBAAgB,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC1G,CAAC;gBACF,IAAI,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC1D,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;oBAC/D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,yCAAyC,YAAY,CAAC,MAAM,UAAU,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9G,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kCAAkC,EAAE,CAAC;wBACnE,MAAM,WAAW,GAAG,UAAU;6BAC3B,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;6BAC1C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;6BACX,GAAG,CACF,CAAC,SAAS,EAAE,EAAE,CACZ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,OAAO,SAAS,CAAC,KAAK,IAAI,UAAU,EAAE,CAClG;6BACA,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,qBAAqB,UAAU,CAAC,MAAM,yBAAyB,WAAW,EAAE,CAC1F,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC/D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,UAAU;qBACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAE,CAAC,CAAC;qBAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,4BAA4B,UAAU,CAAC,MAAM,UAAU,OAAO,GAAG,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,wBAAwB;QAC1B,CAAC;QAED,IAAI,wBAAwB,GAAkB,IAAI,CAAC;QACnD,IAAI,KAAK,CAAC,+BAA+B,EAAE,CAAC;YAC1C,wBAAwB,GAAG,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACzE,CAAC;QAED,OAAO;YACL,kBAAkB,EAAE,yBAAyB,CAAC,WAAW,CAAC;YAC1D,wBAAwB;YACxB,YAAY;YACZ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iCAAiC,CACrC,KAAmC;QAEnC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC;QAC1C,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,IAAI,GAAG,CAAC;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACjD,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC3C,uEAAuE;YACvE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,CAAC;gBACpB,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC/D,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACP,qEAAqE;gBACvE,CAAC;gBACD,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS;oBAAE,MAAM;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS;YACT,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS;SACrD,CAAC;IACJ,CAAC;CACF;AAED,SAAS,cAAc,CACrB,MAA8B,EAC9B,MAA8B;IAE9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAS;QACxC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAa;IACrD,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure-stage.d.ts","sourceRoot":"","sources":["../../src/bot/failure-stage.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,YAAY,GAEpB,MAAM,GAEN,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,GACT,eAAe,GACf,WAAW,GACX,cAAc,GACd,SAAS,GACT,cAAc,GACd,aAAa,GAGb,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,GAET,QAAQ,GAER,MAAM,GACN,OAAO,CAAC;AAIZ,eAAO,MAAM,kBAAkB,EAAE,SAAS,YAAY,EAkBrD,CAAC;AAKF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAMD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,iBAAiB,EAAE,OAAO,GACzB,YAAY,
|
|
1
|
+
{"version":3,"file":"failure-stage.d.ts","sourceRoot":"","sources":["../../src/bot/failure-stage.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,YAAY,GAEpB,MAAM,GAEN,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,GACT,eAAe,GACf,WAAW,GACX,cAAc,GACd,SAAS,GACT,cAAc,GACd,aAAa,GAGb,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,GAET,QAAQ,GAER,MAAM,GACN,OAAO,CAAC;AAIZ,eAAO,MAAM,kBAAkB,EAAE,SAAS,YAAY,EAkBrD,CAAC;AAKF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAChC;AAMD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,iBAAiB,EAAE,OAAO,GACzB,YAAY,CAoDd"}
|
|
@@ -63,15 +63,20 @@ export function classifyFailureStage(result, reachedOnboarding) {
|
|
|
63
63
|
}
|
|
64
64
|
// Tightened: oauth_required / sso / a literal oauth callback — NOT bare
|
|
65
65
|
// "oauth" (which appears in "post-OAuth navigation …" success-path prose).
|
|
66
|
-
if (has("oauth_required", "sso", "sso-callback", "oauth callback", "oauth-callback", "oauth handshake")) {
|
|
66
|
+
if (has("oauth_session_not_persisted", "oauth_required", "sso", "sso-callback", "oauth callback", "oauth-callback", "oauth handshake")) {
|
|
67
67
|
return "oauth_handshake";
|
|
68
68
|
}
|
|
69
69
|
if (has("hydrat", "clerk", "stytch", "not loaded", "spa "))
|
|
70
70
|
return "hydration";
|
|
71
71
|
// phone before verify_email: a "phone verification" gate is more specific
|
|
72
|
-
// than the generic email/OTP verification bucket.
|
|
73
|
-
|
|
72
|
+
// than the generic email/OTP verification bucket. Keep this intentionally
|
|
73
|
+
// strict; passwordless email flows also say "verification code".
|
|
74
|
+
if (/\b(phone|mobile) (?:number|verification|verify|code)\b/.test(err) ||
|
|
75
|
+
/\b(?:verify|enter|confirm).{0,24}\b(phone|mobile)\b/.test(err) ||
|
|
76
|
+
/\bsms (?:code|verification|message)\b/.test(err) ||
|
|
77
|
+
/\btext message\b/.test(err)) {
|
|
74
78
|
return "phone";
|
|
79
|
+
}
|
|
75
80
|
if (has("email_otp", "verification_not_sent", "verify", "verification", "otp"))
|
|
76
81
|
return "verify_email";
|
|
77
82
|
if (has("payment", "quota", "billing"))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure-stage.js","sourceRoot":"","sources":["../../src/bot/failure-stage.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,0EAA0E;AAC1E,0EAA0E;AAC1E,wCAAwC;AACxC,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AA2B3E,uEAAuE;AACvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAA4B;IACzD,MAAM;IACN,iBAAiB;IACjB,iBAAiB;IACjB,SAAS;IACT,eAAe;IACf,WAAW;IACX,cAAc;IACd,SAAS;IACT,cAAc;IACd,aAAa;IACb,SAAS;IACT,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC;AAWF,wEAAwE;AACxE,wEAAwE;AACxE,yEAAyE;AACzE,gEAAgE;AAChE,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,iBAA0B;IAE1B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEvD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,OAAiB,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,6EAA6E;IAC7E,IAAI,GAAG,CAAC,wBAAwB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEnD,6CAA6C;IAC7C,IAAI,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,iBAAiB,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9E,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC;IACzC,IAAI,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACnD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,SAAS,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACxG,IAAI,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IACnG,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,8CAA8C;IAC9C,IAAI,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAChH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"failure-stage.js","sourceRoot":"","sources":["../../src/bot/failure-stage.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,0EAA0E;AAC1E,0EAA0E;AAC1E,wCAAwC;AACxC,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AA2B3E,uEAAuE;AACvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAA4B;IACzD,MAAM;IACN,iBAAiB;IACjB,iBAAiB;IACjB,SAAS;IACT,eAAe;IACf,WAAW;IACX,cAAc;IACd,SAAS;IACT,cAAc;IACd,aAAa;IACb,SAAS;IACT,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC;AAWF,wEAAwE;AACxE,wEAAwE;AACxE,yEAAyE;AACzE,gEAAgE;AAChE,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,iBAA0B;IAE1B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEvD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,OAAiB,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,6EAA6E;IAC7E,IAAI,GAAG,CAAC,wBAAwB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEnD,6CAA6C;IAC7C,IAAI,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,iBAAiB,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9E,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC;IACzC,IAAI,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACnD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,SAAS,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACxG,IAAI,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IACnG,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,8CAA8C;IAC9C,IAAI,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAChH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,GAAG,CAAC,6BAA6B,EAAE,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACvI,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC;IAC/E,0EAA0E;IAC1E,0EAA0E;IAC1E,iEAAiE;IACjE,IACE,wDAAwD,CAAC,IAAI,CAAC,GAAG,CAAC;QAClE,qDAAqD,CAAC,IAAI,CAAC,GAAG,CAAC;QAC/D,uCAAuC,CAAC,IAAI,CAAC,GAAG,CAAC;QACjD,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IACtG,IAAI,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,IAAI,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC;QAAE,OAAO,SAAS,CAAC;IACvF,IAAI,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACnF,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;IAEtE,wEAAwE;IACxE,6DAA6D;IAC7D,OAAO,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface FlowStageStep<State, Action> {
|
|
2
|
+
action: Action;
|
|
3
|
+
nextState: State;
|
|
4
|
+
}
|
|
5
|
+
export declare function keepStage<State, Action>(state: State, action: Action): FlowStageStep<State, Action>;
|
|
6
|
+
export declare function patchStage<State extends object, Action>(state: State, action: Action, patch: Partial<State>): FlowStageStep<State, Action>;
|
|
7
|
+
//# sourceMappingURL=flow-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-engine.d.ts","sourceRoot":"","sources":["../../src/bot/flow-engine.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa,CAAC,KAAK,EAAE,MAAM;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAEnG;AAED,wBAAgB,UAAU,CAAC,KAAK,SAAS,MAAM,EAAE,MAAM,EACrD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GACpB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAE9B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// flow-engine.ts — shared typed boundary for provisioning flow stages.
|
|
2
|
+
//
|
|
3
|
+
// A stage reducer does not touch the browser. It receives immutable observed
|
|
4
|
+
// facts and returns the next executor action plus the loop-carried state for
|
|
5
|
+
// the next observation. Concrete stages keep their own action/outcome unions;
|
|
6
|
+
// this module owns the common transition shape.
|
|
7
|
+
export function keepStage(state, action) {
|
|
8
|
+
return { action, nextState: state };
|
|
9
|
+
}
|
|
10
|
+
export function patchStage(state, action, patch) {
|
|
11
|
+
return { action, nextState: { ...state, ...patch } };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=flow-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-engine.js","sourceRoot":"","sources":["../../src/bot/flow-engine.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,gDAAgD;AAOhD,MAAM,UAAU,SAAS,CAAgB,KAAY,EAAE,MAAc;IACnE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAY,EACZ,MAAc,EACd,KAAqB;IAErB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACvD,CAAC"}
|
package/dist/bot/form-fill.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type FlowStageStep } from "./flow-engine.js";
|
|
1
2
|
export declare function computePageSig(url: string, selectors: readonly string[]): string;
|
|
2
3
|
export declare function pageMovedSince(prevSig: string | null, currSig: string): boolean;
|
|
3
4
|
export declare function isStuckRepeat(input: {
|
|
@@ -18,7 +19,32 @@ export declare const FORM_FILL_BUDGETS: {
|
|
|
18
19
|
readonly MAX_OAUTH_SHELL_RELOADS: 1;
|
|
19
20
|
readonly MAX_UPSTREAM_BLIP_RETRIES: 8;
|
|
20
21
|
readonly MAX_SIGN_IN_ADVANCE_CLICKS: 2;
|
|
22
|
+
readonly MAX_SIGNUP_LINK_ADVANCE_CLICKS: 2;
|
|
21
23
|
};
|
|
24
|
+
export interface FormFillElement {
|
|
25
|
+
tag: string;
|
|
26
|
+
type?: string | null;
|
|
27
|
+
selector: string;
|
|
28
|
+
visible?: boolean;
|
|
29
|
+
inViewport?: boolean;
|
|
30
|
+
visibleText?: string | null;
|
|
31
|
+
ariaLabel?: string | null;
|
|
32
|
+
labelText?: string | null;
|
|
33
|
+
placeholder?: string | null;
|
|
34
|
+
href?: string | null;
|
|
35
|
+
role?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export declare function findSignupLinkOnLoginPage(input: {
|
|
38
|
+
inventory: readonly FormFillElement[];
|
|
39
|
+
url?: string | null;
|
|
40
|
+
title?: string | null;
|
|
41
|
+
htmlOrText?: string | null;
|
|
42
|
+
}): FormFillElement | null;
|
|
43
|
+
export declare function pickEmailCodeSubmitSelector(input: {
|
|
44
|
+
inventory: readonly FormFillElement[];
|
|
45
|
+
htmlOrText?: string | null;
|
|
46
|
+
currentSubmitSelector: string;
|
|
47
|
+
}): string | null;
|
|
22
48
|
export interface FormFillState {
|
|
23
49
|
errorReplans: number;
|
|
24
50
|
progressReplans: number;
|
|
@@ -27,6 +53,7 @@ export interface FormFillState {
|
|
|
27
53
|
oauthScanRetries: number;
|
|
28
54
|
oauthShellReloads: number;
|
|
29
55
|
signInAdvanceClicks: number;
|
|
56
|
+
signupLinkAdvanceClicks: number;
|
|
30
57
|
lastRoundPageSig: string | null;
|
|
31
58
|
lastNoProgressClickSelectors: ReadonlySet<string>;
|
|
32
59
|
committedToEmailPath: boolean;
|
|
@@ -72,6 +99,7 @@ export interface PrePlanObservation {
|
|
|
72
99
|
oauthScanShell: boolean;
|
|
73
100
|
alreadySignedIn: boolean;
|
|
74
101
|
signInAdvancePresent: boolean;
|
|
102
|
+
signupLinkOnLoginPage: boolean;
|
|
75
103
|
antiBotVendor: string | null;
|
|
76
104
|
oauthOnly: boolean;
|
|
77
105
|
oauthOnlyMissingProviders: readonly string[];
|
|
@@ -121,6 +149,8 @@ export type FormFillAction = {
|
|
|
121
149
|
kind: "oauth_shell_reload";
|
|
122
150
|
} | {
|
|
123
151
|
kind: "sign_in_advance";
|
|
152
|
+
} | {
|
|
153
|
+
kind: "signup_link_advance";
|
|
124
154
|
} | {
|
|
125
155
|
kind: "route_to_verification";
|
|
126
156
|
} | {
|
|
@@ -136,9 +166,6 @@ export type FormFillAction = {
|
|
|
136
166
|
hintKind: FormFillHintKind;
|
|
137
167
|
};
|
|
138
168
|
export type FormFillHintKind = "selector_not_in_inventory" | "selectors_did_not_verify" | "drop_the_check" | "page_advanced" | "submit_disabled" | "submit_went_stale" | "post_submit_validation";
|
|
139
|
-
export
|
|
140
|
-
action: FormFillAction;
|
|
141
|
-
nextState: FormFillState;
|
|
142
|
-
}
|
|
169
|
+
export type FormFillStep = FlowStageStep<FormFillState, FormFillAction>;
|
|
143
170
|
export declare function decideFormFillStep(state: FormFillState, obs: FormFillObservation): FormFillStep;
|
|
144
171
|
//# sourceMappingURL=form-fill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-fill.d.ts","sourceRoot":"","sources":["../../src/bot/form-fill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"form-fill.d.ts","sourceRoot":"","sources":["../../src/bot/form-fill.ts"],"names":[],"mappings":"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"}
|