chromeflow 0.10.0 → 0.10.1
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/bin/chromeflow.mjs +11 -4
- package/package.json +1 -1
package/bin/chromeflow.mjs
CHANGED
|
@@ -24825,6 +24825,11 @@ After tabs.onUpdated fires status=complete, chromeflow also runs a 6s settle che
|
|
|
24825
24825
|
text += `
|
|
24826
24826
|
|
|
24827
24827
|
\u26A0 expect_selector "${expect_selector}" never appeared within the 6s settle window. The page may be partially loaded or stuck.`;
|
|
24828
|
+
}
|
|
24829
|
+
if (r.anti_bot_detected) {
|
|
24830
|
+
text += `
|
|
24831
|
+
|
|
24832
|
+
\u26A0 anti_bot_detected: "${r.anti_bot_detected}" \u2014 the page returned a known block / challenge response. Page content is unlikely to be the intended target. Don't try to interact with it; navigate elsewhere or surface to the user.`;
|
|
24828
24833
|
}
|
|
24829
24834
|
return { content: [{ type: "text", text }] };
|
|
24830
24835
|
}
|
|
@@ -25589,6 +25594,8 @@ Set binary=true for non-text responses (PDFs, images, zips) \u2014 the body is r
|
|
|
25589
25594
|
}, wsTimeout);
|
|
25590
25595
|
if (response.type !== "fetch_url_response") throw new Error(`Unexpected response: ${response.type}`);
|
|
25591
25596
|
const r = response;
|
|
25597
|
+
const antiBotLine = r.anti_bot_detected ? `
|
|
25598
|
+
\u26A0 anti_bot_detected: "${r.anti_bot_detected}" \u2014 response body matches a known block / challenge page. Don't parse as the expected JSON/HTML; the user's IP may be challenged or the endpoint may require a real browser context.` : "";
|
|
25592
25599
|
if (to_file) {
|
|
25593
25600
|
const cwd = process.cwd();
|
|
25594
25601
|
const resolved = isAbsolute(to_file) ? to_file : resolve(cwd, to_file);
|
|
@@ -25607,14 +25614,14 @@ Set binary=true for non-text responses (PDFs, images, zips) \u2014 the body is r
|
|
|
25607
25614
|
type: "text",
|
|
25608
25615
|
text: `HTTP ${r.status} ${r.status_text} \u2014 ${r.content_type || "no content-type"} \u2014 ${r.total_bytes} bytes
|
|
25609
25616
|
Written to: ${resolved}
|
|
25610
|
-
Size on disk: ${buf.byteLength}
|
|
25617
|
+
Size on disk: ${buf.byteLength}${antiBotLine}
|
|
25611
25618
|
|
|
25612
25619
|
Headers:
|
|
25613
25620
|
${hdrLines}`
|
|
25614
25621
|
}]
|
|
25615
25622
|
};
|
|
25616
25623
|
}
|
|
25617
|
-
const header = `HTTP ${r.status} ${r.status_text} \u2014 ${r.content_type || "no content-type"} \u2014 ${r.total_bytes} bytes${r.truncated ? ` (truncated to ${max_bytes ?? 1e5}; set to_file=<path> to capture the full ${r.total_bytes} bytes)` : ""}`;
|
|
25624
|
+
const header = `HTTP ${r.status} ${r.status_text} \u2014 ${r.content_type || "no content-type"} \u2014 ${r.total_bytes} bytes${r.truncated ? ` (truncated to ${max_bytes ?? 1e5}; set to_file=<path> to capture the full ${r.total_bytes} bytes)` : ""}${antiBotLine}`;
|
|
25618
25625
|
const bodyPart = r.body_base64 ? `
|
|
25619
25626
|
|
|
25620
25627
|
[base64, ${r.body_base64.length} chars]
|
|
@@ -25651,7 +25658,7 @@ Scope matching with \`within_selector\` or \`near_text\` restricts where matches
|
|
|
25651
25658
|
|
|
25652
25659
|
Shadow DOM (open AND closed) is pierced by default via chrome.dom.openOrClosedShadowRoot \u2014 Reddit faceplate-* / r-post-form-submit-button / web-component-heavy SPAs no longer need manual deepFind recipes.
|
|
25653
25660
|
|
|
25654
|
-
ANTI-BOT SUBMIT CEILING \u2014 synthetic clicks on social/auth platforms (Reddit, X / Twitter,
|
|
25661
|
+
ANTI-BOT SUBMIT CEILING \u2014 synthetic clicks on social/auth platforms (Reddit, X / Twitter, mcp.so) are silently rejected by isTrusted-aware form validators and CSRF/reCAPTCHA gates. Pass \`expect_submit: true\` to detect this case (returns success=false with "submit silently rejected" when no signal fires within 4s). For confirmed anti-bot sites, do NOT retry \u2014 pre-fill the form, then highlight the submit button and call wait_for_click so a real human gesture fires the submission.`,
|
|
25655
25662
|
{
|
|
25656
25663
|
textHint: external_exports.string().optional().describe(
|
|
25657
25664
|
"The visible label of the button or link (e.g. 'Save product', 'Continue', 'Add a product', 'Create'). Exactly one of textHint or selector must be set."
|
|
@@ -26048,7 +26055,7 @@ ${lines.join("\n")}${shadowSection}` }] };
|
|
|
26048
26055
|
}
|
|
26049
26056
|
|
|
26050
26057
|
// packages/mcp-server/src/index.ts
|
|
26051
|
-
var PACKAGE_VERSION = true ? "0.10.
|
|
26058
|
+
var PACKAGE_VERSION = true ? "0.10.1" : "dev";
|
|
26052
26059
|
main().catch((err) => {
|
|
26053
26060
|
console.error("[chromeflow] Fatal error:", err);
|
|
26054
26061
|
process.exit(1);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chromeflow",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "MCP server for chromeflow — lets Claude Code or Codex CLI drive your real Chrome browser with sessions intact. Plugin install recommended; npx chromeflow for manual MCP wiring.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./bin/chromeflow.mjs",
|