@trusty-squire/mcp 0.9.5 → 0.9.7
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.map +1 -1
- package/dist/bot/agent.js +71 -3
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +103 -16
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/promote-to-skill.d.ts +5 -1
- package/dist/bot/promote-to-skill.d.ts.map +1 -1
- package/dist/bot/promote-to-skill.js +74 -3
- package/dist/bot/promote-to-skill.js.map +1 -1
- package/dist/bot/replay-skill.d.ts +2 -1
- package/dist/bot/replay-skill.d.ts.map +1 -1
- package/dist/bot/replay-skill.js +54 -0
- package/dist/bot/replay-skill.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/bot/browser.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAS5D,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/bot/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/browser.js
CHANGED
|
@@ -31,14 +31,27 @@ import { startXvfb, xvfbAvailable } from "./xvfb.js";
|
|
|
31
31
|
// the CJS modules lazily (the stealth toolchain only ships CJS) and treat
|
|
32
32
|
// stealth as best-effort — a missing dep should never crash the bot.
|
|
33
33
|
const require = createRequire(import.meta.url);
|
|
34
|
-
// Whether
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// reCAPTCHA-v3 score on).
|
|
38
|
-
//
|
|
34
|
+
// Whether to use the CDP-hardened launcher (patchright, which runs
|
|
35
|
+
// evaluations in an isolated world and removes the automation tells —
|
|
36
|
+
// mainWorldExecution, navigator.webdriver, viewport — that Turnstile /
|
|
37
|
+
// reCAPTCHA-v3 / Google's consent SPA score on). See
|
|
38
|
+
// docs/DESIGN-antibot-hardening.md.
|
|
39
|
+
//
|
|
40
|
+
// 2026-06-08 — DEFAULT FLIPPED ON. The baseline (playwright-extra +
|
|
41
|
+
// stealth) self-inflicts a detectable navigator.webdriver via its manual
|
|
42
|
+
// defineProperty patch, so it is strictly WORSE on the fingerprint. The
|
|
43
|
+
// hardened launcher is all-green on the rebrowser bot-detector and was
|
|
44
|
+
// live-A/B'd: meilisearch's Google consent-SPA block became a (handleable)
|
|
45
|
+
// FedCM path, and render still signed up + extracted a key cleanly — no
|
|
46
|
+
// crash on either (the old crash was the retired rebrowser fork, not
|
|
47
|
+
// patchright). Default to hardened; opt out with BOT_CDP_HARDENED=0 for
|
|
48
|
+
// the baseline. If patchright isn't installed, getChromium() falls back to
|
|
49
|
+
// baseline gracefully.
|
|
39
50
|
function cdpHardeningRequested() {
|
|
40
51
|
const v = process.env.BOT_CDP_HARDENED;
|
|
41
|
-
|
|
52
|
+
if (v === "0" || v === "false" || v === "off")
|
|
53
|
+
return false;
|
|
54
|
+
return true;
|
|
42
55
|
}
|
|
43
56
|
let cachedChromium = null;
|
|
44
57
|
// The stealth profile the cached launcher actually represents. Set the
|
|
@@ -689,10 +702,29 @@ export class BrowserController {
|
|
|
689
702
|
async goto(url) {
|
|
690
703
|
if (!this.page)
|
|
691
704
|
throw new Error("Browser not started");
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
705
|
+
// Retry transient network/proxy drops. A residential SOCKS tunnel
|
|
706
|
+
// intermittently resets a connection mid-navigation (Chrome surfaces
|
|
707
|
+
// net::ERR_SOCKS_CONNECTION_FAILED / ERR_CONNECTION_RESET / ERR_NETWORK_
|
|
708
|
+
// CHANGED / ERR_TIMED_OUT), especially on heavy onboarding pages that
|
|
709
|
+
// open many subresource connections at once (algolia's dashboard_setup).
|
|
710
|
+
// The host is reachable on the next attempt — a single goto failure
|
|
711
|
+
// shouldn't fail the whole signup. Only retry these connection-level
|
|
712
|
+
// errors; HTTP statuses and selector/logic errors fall straight through.
|
|
713
|
+
const TRANSIENT_NET = /ERR_SOCKS_CONNECTION_FAILED|ERR_CONNECTION_(?:RESET|CLOSED|FAILED|ABORTED)|ERR_NETWORK_CHANGED|ERR_TIMED_OUT|ERR_NAME_NOT_RESOLVED|net::ERR_EMPTY_RESPONSE/i;
|
|
714
|
+
const MAX_GOTO_ATTEMPTS = 3;
|
|
715
|
+
for (let attempt = 1;; attempt++) {
|
|
716
|
+
try {
|
|
717
|
+
await this.page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
catch (err) {
|
|
721
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
722
|
+
if (attempt >= MAX_GOTO_ATTEMPTS || !TRANSIENT_NET.test(msg))
|
|
723
|
+
throw err;
|
|
724
|
+
// Linear backoff — give the tunnel a moment to recover a slot.
|
|
725
|
+
await this.sleep(1500 * attempt);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
696
728
|
// Post-load dwell. Cloudflare/reCAPTCHA scoring runs JS that
|
|
697
729
|
// collects behavior signals over a window (typically 500-2000ms);
|
|
698
730
|
// landing on a page and immediately interacting reads as bot-like.
|
|
@@ -4148,20 +4180,75 @@ export class BrowserController {
|
|
|
4148
4180
|
// fall through to the approve-button path
|
|
4149
4181
|
}
|
|
4150
4182
|
}
|
|
4151
|
-
// Consent screen: the approve control's
|
|
4152
|
-
// "Continue"
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4183
|
+
// Consent screen: the approve control's name varies by Google's
|
|
4184
|
+
// consent layout — "Continue", "Allow", "Allow access" (the
|
|
4185
|
+
// /signin/oauth/consent?part=… variant meilisearch hits). Match on a
|
|
4186
|
+
// startsWith verb set (not exact) so "Allow access" resolves, while
|
|
4187
|
+
// the verbs exclude Cancel/Deny/Back/No. Wait for the button to
|
|
4188
|
+
// render — the consent SPA paints the approve control a beat after
|
|
4189
|
+
// domcontentloaded, and the old exact-match + no-wait returned false
|
|
4190
|
+
// before it appeared.
|
|
4191
|
+
const APPROVE_NAME = /^(?:continue|allow|accept|agree)\b/i;
|
|
4192
|
+
const approve = this.page.getByRole("button", { name: APPROVE_NAME }).first();
|
|
4193
|
+
try {
|
|
4194
|
+
await approve.waitFor({ state: "visible", timeout: 8000 });
|
|
4195
|
+
}
|
|
4196
|
+
catch {
|
|
4197
|
+
// not visible within the window — fall through to the DOM-scan path
|
|
4198
|
+
}
|
|
4156
4199
|
if ((await approve.count().catch(() => 0)) > 0) {
|
|
4157
4200
|
try {
|
|
4158
4201
|
await approve.click({ timeout: 8000 });
|
|
4159
4202
|
return true;
|
|
4160
4203
|
}
|
|
4161
4204
|
catch {
|
|
4162
|
-
|
|
4205
|
+
// fall through to the DOM-scan fallback
|
|
4163
4206
|
}
|
|
4164
4207
|
}
|
|
4208
|
+
// Fallback: scan the DOM for an approve-like clickable when the ARIA
|
|
4209
|
+
// role query missed it (Google occasionally renders the control as a
|
|
4210
|
+
// <div role>/<span> or an <input type=submit value="Allow access">).
|
|
4211
|
+
// Click the first visible candidate whose text is an approve verb and
|
|
4212
|
+
// is NOT a cancel/deny/back. Log what was visible on failure.
|
|
4213
|
+
const clicked = await this.page
|
|
4214
|
+
.evaluate(() => {
|
|
4215
|
+
const APPROVE = /^(?:continue|allow|accept|agree)\b/i;
|
|
4216
|
+
const DENY = /\b(?:cancel|deny|back|no\b|not now|reject)\b/i;
|
|
4217
|
+
const els = Array.from(document.querySelectorAll('button, input[type="submit"], [role="button"], a[href]'));
|
|
4218
|
+
for (const el of els) {
|
|
4219
|
+
const r = el.getBoundingClientRect();
|
|
4220
|
+
if (r.width < 2 || r.height < 2)
|
|
4221
|
+
continue;
|
|
4222
|
+
const t = (el.textContent || el.value || "").trim();
|
|
4223
|
+
if (t.length === 0 || t.length > 40)
|
|
4224
|
+
continue;
|
|
4225
|
+
if (DENY.test(t))
|
|
4226
|
+
continue;
|
|
4227
|
+
if (APPROVE.test(t)) {
|
|
4228
|
+
el.click();
|
|
4229
|
+
return t.slice(0, 40);
|
|
4230
|
+
}
|
|
4231
|
+
}
|
|
4232
|
+
return null;
|
|
4233
|
+
})
|
|
4234
|
+
.catch(() => null);
|
|
4235
|
+
if (clicked !== null)
|
|
4236
|
+
return true;
|
|
4237
|
+
const seen = await this.page
|
|
4238
|
+
.evaluate(() => {
|
|
4239
|
+
const els = Array.from(document.querySelectorAll('button, input[type="submit"], [role="button"]'));
|
|
4240
|
+
return els
|
|
4241
|
+
.filter((b) => {
|
|
4242
|
+
const r = b.getBoundingClientRect();
|
|
4243
|
+
return r.width > 1 && r.height > 1;
|
|
4244
|
+
})
|
|
4245
|
+
.slice(0, 8)
|
|
4246
|
+
.map((b) => (b.textContent || b.value || "").trim().slice(0, 40))
|
|
4247
|
+
.filter((t) => t.length > 0);
|
|
4248
|
+
})
|
|
4249
|
+
.catch(() => []);
|
|
4250
|
+
console.error(`[universal-bot] Google advanceOAuthConsent failed — visible buttons: ` +
|
|
4251
|
+
`${seen.length === 0 ? "<none>" : seen.map((s) => JSON.stringify(s)).join(", ")}`);
|
|
4165
4252
|
return false;
|
|
4166
4253
|
}
|
|
4167
4254
|
// Restore the product page once the OAuth handshake completes. A
|