@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.
Files changed (117) hide show
  1. package/dist/bot/agent.d.ts +61 -10
  2. package/dist/bot/agent.d.ts.map +1 -1
  3. package/dist/bot/agent.js +2577 -1626
  4. package/dist/bot/agent.js.map +1 -1
  5. package/dist/bot/browser.d.ts +34 -1
  6. package/dist/bot/browser.d.ts.map +1 -1
  7. package/dist/bot/browser.js +1313 -229
  8. package/dist/bot/browser.js.map +1 -1
  9. package/dist/bot/captcha-solver-2captcha.d.ts +21 -0
  10. package/dist/bot/captcha-solver-2captcha.d.ts.map +1 -1
  11. package/dist/bot/captcha-solver-2captcha.js +77 -0
  12. package/dist/bot/captcha-solver-2captcha.js.map +1 -1
  13. package/dist/bot/credential-extraction-flow.d.ts +66 -0
  14. package/dist/bot/credential-extraction-flow.d.ts.map +1 -0
  15. package/dist/bot/credential-extraction-flow.js +422 -0
  16. package/dist/bot/credential-extraction-flow.js.map +1 -0
  17. package/dist/bot/failure-stage.d.ts.map +1 -1
  18. package/dist/bot/failure-stage.js +8 -3
  19. package/dist/bot/failure-stage.js.map +1 -1
  20. package/dist/bot/flow-engine.d.ts +7 -0
  21. package/dist/bot/flow-engine.d.ts.map +1 -0
  22. package/dist/bot/flow-engine.js +13 -0
  23. package/dist/bot/flow-engine.js.map +1 -0
  24. package/dist/bot/form-fill.d.ts +31 -4
  25. package/dist/bot/form-fill.d.ts.map +1 -1
  26. package/dist/bot/form-fill.js +109 -8
  27. package/dist/bot/form-fill.js.map +1 -1
  28. package/dist/bot/google-login.d.ts.map +1 -1
  29. package/dist/bot/google-login.js +10 -2
  30. package/dist/bot/google-login.js.map +1 -1
  31. package/dist/bot/index.d.ts.map +1 -1
  32. package/dist/bot/index.js +9 -33
  33. package/dist/bot/index.js.map +1 -1
  34. package/dist/bot/nav-search.d.ts +34 -0
  35. package/dist/bot/nav-search.d.ts.map +1 -1
  36. package/dist/bot/nav-search.js +283 -31
  37. package/dist/bot/nav-search.js.map +1 -1
  38. package/dist/bot/observation-frame.d.ts +16 -0
  39. package/dist/bot/observation-frame.d.ts.map +1 -0
  40. package/dist/bot/observation-frame.js +22 -0
  41. package/dist/bot/observation-frame.js.map +1 -0
  42. package/dist/bot/onboarding-capture.d.ts +10 -2
  43. package/dist/bot/onboarding-capture.d.ts.map +1 -1
  44. package/dist/bot/onboarding-capture.js +131 -22
  45. package/dist/bot/onboarding-capture.js.map +1 -1
  46. package/dist/bot/post-signup-action-executor.d.ts +53 -0
  47. package/dist/bot/post-signup-action-executor.d.ts.map +1 -0
  48. package/dist/bot/post-signup-action-executor.js +104 -0
  49. package/dist/bot/post-signup-action-executor.js.map +1 -0
  50. package/dist/bot/post-signup-flow.d.ts +51 -0
  51. package/dist/bot/post-signup-flow.d.ts.map +1 -0
  52. package/dist/bot/post-signup-flow.js +134 -0
  53. package/dist/bot/post-signup-flow.js.map +1 -0
  54. package/dist/bot/post-signup-login-flow.d.ts +28 -0
  55. package/dist/bot/post-signup-login-flow.d.ts.map +1 -0
  56. package/dist/bot/post-signup-login-flow.js +35 -0
  57. package/dist/bot/post-signup-login-flow.js.map +1 -0
  58. package/dist/bot/post-signup-recovery-state.d.ts +145 -0
  59. package/dist/bot/post-signup-recovery-state.d.ts.map +1 -0
  60. package/dist/bot/post-signup-recovery-state.js +239 -0
  61. package/dist/bot/post-signup-recovery-state.js.map +1 -0
  62. package/dist/bot/post-signup-synthetic-capture.d.ts +43 -0
  63. package/dist/bot/post-signup-synthetic-capture.d.ts.map +1 -0
  64. package/dist/bot/post-signup-synthetic-capture.js +84 -0
  65. package/dist/bot/post-signup-synthetic-capture.js.map +1 -0
  66. package/dist/bot/promote-to-skill.d.ts +18 -1
  67. package/dist/bot/promote-to-skill.d.ts.map +1 -1
  68. package/dist/bot/promote-to-skill.js +310 -23
  69. package/dist/bot/promote-to-skill.js.map +1 -1
  70. package/dist/bot/read-otp.d.ts +1 -0
  71. package/dist/bot/read-otp.d.ts.map +1 -1
  72. package/dist/bot/read-otp.js +70 -18
  73. package/dist/bot/read-otp.js.map +1 -1
  74. package/dist/bot/redact.d.ts.map +1 -1
  75. package/dist/bot/redact.js +1 -0
  76. package/dist/bot/redact.js.map +1 -1
  77. package/dist/bot/replay-skill.d.ts +18 -0
  78. package/dist/bot/replay-skill.d.ts.map +1 -1
  79. package/dist/bot/replay-skill.js +1290 -71
  80. package/dist/bot/replay-skill.js.map +1 -1
  81. package/dist/bot/semantic-transition.d.ts +66 -0
  82. package/dist/bot/semantic-transition.d.ts.map +1 -0
  83. package/dist/bot/semantic-transition.js +361 -0
  84. package/dist/bot/semantic-transition.js.map +1 -0
  85. package/dist/bot/signup-oauth-flow.d.ts +16 -0
  86. package/dist/bot/signup-oauth-flow.d.ts.map +1 -0
  87. package/dist/bot/signup-oauth-flow.js +31 -0
  88. package/dist/bot/signup-oauth-flow.js.map +1 -0
  89. package/dist/bot/state-classifier.d.ts +18 -0
  90. package/dist/bot/state-classifier.d.ts.map +1 -0
  91. package/dist/bot/state-classifier.js +127 -0
  92. package/dist/bot/state-classifier.js.map +1 -0
  93. package/dist/bot/terminal-gate.d.ts +20 -0
  94. package/dist/bot/terminal-gate.d.ts.map +1 -0
  95. package/dist/bot/terminal-gate.js +165 -0
  96. package/dist/bot/terminal-gate.js.map +1 -0
  97. package/dist/bot/xvfb.d.ts +3 -0
  98. package/dist/bot/xvfb.d.ts.map +1 -1
  99. package/dist/bot/xvfb.js +106 -40
  100. package/dist/bot/xvfb.js.map +1 -1
  101. package/dist/provision-gate.d.ts +16 -0
  102. package/dist/provision-gate.d.ts.map +1 -0
  103. package/dist/provision-gate.js +66 -0
  104. package/dist/provision-gate.js.map +1 -0
  105. package/dist/provision-run.d.ts +45 -0
  106. package/dist/provision-run.d.ts.map +1 -0
  107. package/dist/provision-run.js +99 -0
  108. package/dist/provision-run.js.map +1 -0
  109. package/dist/skill-registry-client.d.ts +9 -0
  110. package/dist/skill-registry-client.d.ts.map +1 -1
  111. package/dist/skill-registry-client.js +31 -6
  112. package/dist/skill-registry-client.js.map +1 -1
  113. package/dist/tools/provision-any.d.ts +21 -0
  114. package/dist/tools/provision-any.d.ts.map +1 -1
  115. package/dist/tools/provision-any.js +127 -36
  116. package/dist/tools/provision-any.js.map +1 -1
  117. 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":"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"}
@@ -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,CA4Cd"}
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
- if (has("phone", "sms"))
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":"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"}
1
+ {"version":3,"file":"failure-stage.js","sourceRoot":"","sources":["../../src/bot/failure-stage.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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 interface FormFillStep {
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":"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"}
1
+ {"version":3,"file":"form-fill.d.ts","sourceRoot":"","sources":["../../src/bot/form-fill.ts"],"names":[],"mappings":"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"}