Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
340886293a | ||
|
|
fc1699a526 | ||
|
|
4bcfe74514 | ||
|
|
bb41c24c08 |
Generated
+1
-1
@@ -45,7 +45,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "agent-browser-stealth"
|
name = "agent-browser-stealth"
|
||||||
version = "0.27.0-fork.24"
|
version = "0.27.0-fork.26"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes-gcm",
|
"aes-gcm",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "agent-browser-stealth"
|
name = "agent-browser-stealth"
|
||||||
version = "0.27.0-fork.24"
|
version = "0.27.0-fork.26"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Fast browser automation CLI for AI agents"
|
description = "Fast browser automation CLI for AI agents"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|||||||
@@ -107,6 +107,22 @@ impl RelayState {
|
|||||||
let session_id = raw.get("sessionId").and_then(|s| s.as_str());
|
let session_id = raw.get("sessionId").and_then(|s| s.as_str());
|
||||||
|
|
||||||
match method {
|
match method {
|
||||||
|
// Browser-level command the daemon uses as its liveness probe
|
||||||
|
// (`is_connection_alive` → `Browser.getVersion`). The extension only
|
||||||
|
// speaks per-tab `chrome.debugger`, so forwarding it errors → the
|
||||||
|
// daemon would deem the connection dead and reconnect+re-discover on
|
||||||
|
// EVERY command, resetting the active tab (eval/screenshot drift).
|
||||||
|
// Answer it locally so the relay connection reads as alive.
|
||||||
|
"Browser.getVersion" => ClientRoute::Local(json!({
|
||||||
|
"id": id,
|
||||||
|
"result": {
|
||||||
|
"protocolVersion": "1.3",
|
||||||
|
"product": "Chrome/ab-connect-relay",
|
||||||
|
"revision": "",
|
||||||
|
"userAgent": "",
|
||||||
|
"jsVersion": ""
|
||||||
|
}
|
||||||
|
})),
|
||||||
// Discovery is best-effort and event-driven in real CDP; abs only
|
// Discovery is best-effort and event-driven in real CDP; abs only
|
||||||
// reads the getTargets result, so an empty ack is enough here.
|
// reads the getTargets result, so an empty ack is enough here.
|
||||||
"Target.setDiscoverTargets" | "Target.setAutoAttach" => {
|
"Target.setDiscoverTargets" | "Target.setAutoAttach" => {
|
||||||
@@ -302,6 +318,21 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn browser_get_version_is_answered_locally() {
|
||||||
|
// Liveness probe must NOT be forwarded (the extension can't do
|
||||||
|
// browser-level commands) — else the daemon reconnects on every command.
|
||||||
|
let mut s = RelayState::new();
|
||||||
|
let route = s.route_client_command(1, &json!({ "id": 7, "method": "Browser.getVersion" }));
|
||||||
|
match route {
|
||||||
|
ClientRoute::Local(v) => {
|
||||||
|
assert_eq!(v["id"], 7);
|
||||||
|
assert!(v["result"]["protocolVersion"].is_string());
|
||||||
|
}
|
||||||
|
_ => panic!("Browser.getVersion must be answered locally"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn attach_to_target_returns_known_session() {
|
fn attach_to_target_returns_known_session() {
|
||||||
let mut s = RelayState::new();
|
let mut s = RelayState::new();
|
||||||
|
|||||||
@@ -270,13 +270,18 @@ pub fn strip_source_url_labels(input: &str) -> String {
|
|||||||
re_block.replace_all(&output, "").to_string()
|
re_block.replace_all(&output, "").to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The legacy `navigator.platform` value (set via the CDP
|
||||||
|
/// `Emulation.setUserAgentOverride` `platform` field). This is NOT the UA-CH
|
||||||
|
/// platform (see `platform_hint`): real Chrome reports `MacIntel` on macOS and
|
||||||
|
/// `Linux x86_64` on Linux, so emitting the UA-CH form ("macOS"/"Linux") here is
|
||||||
|
/// a detectable mismatch against the UA's "Intel Mac OS X" / Linux strings.
|
||||||
fn platform_string() -> &'static str {
|
fn platform_string() -> &'static str {
|
||||||
if cfg!(target_os = "macos") {
|
if cfg!(target_os = "macos") {
|
||||||
"macOS"
|
"MacIntel"
|
||||||
} else if cfg!(target_os = "windows") {
|
} else if cfg!(target_os = "windows") {
|
||||||
"Win32"
|
"Win32"
|
||||||
} else {
|
} else {
|
||||||
"Linux"
|
"Linux x86_64"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "agent-browser-stealth",
|
"name": "agent-browser-stealth",
|
||||||
"version": "0.27.0-fork.24",
|
"version": "0.27.0-fork.26",
|
||||||
"description": "Browser automation CLI for AI agents \u2014 stealth fork with anti-detection",
|
"description": "Browser automation CLI for AI agents \u2014 stealth fork with anti-detection",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"packageManager": "pnpm@11.1.3",
|
"packageManager": "pnpm@11.1.3",
|
||||||
|
|||||||
Reference in New Issue
Block a user