Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e5dfd35cb | ||
|
|
b6b2ca56ca |
Generated
+1
-1
@@ -45,7 +45,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "agent-browser-stealth"
|
name = "agent-browser-stealth"
|
||||||
version = "0.27.0-fork.39"
|
version = "0.27.0-fork.40"
|
||||||
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.39"
|
version = "0.27.0-fork.40"
|
||||||
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"
|
||||||
|
|||||||
@@ -344,6 +344,19 @@ fn host_manifest_path_for_chrome() -> Option<PathBuf> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// True if the ab-connect native-messaging host manifest is present — i.e. the
|
||||||
|
/// user has set up the extension path. When installed, auto-connect treats the
|
||||||
|
/// dialog-free extension relay as the *intended* transport and refuses to fall
|
||||||
|
/// back to a raw debug port (which would pop Chrome 136+'s "Allow remote
|
||||||
|
/// debugging?" consent modal). The relay-url file comes and goes with the
|
||||||
|
/// service worker; this manifest is the durable signal that the extension is
|
||||||
|
/// the chosen path.
|
||||||
|
pub fn host_installed() -> bool {
|
||||||
|
native_messaging_dirs()
|
||||||
|
.into_iter()
|
||||||
|
.any(|d| d.join(format!("{HOST_NAME}.json")).exists())
|
||||||
|
}
|
||||||
|
|
||||||
fn report(json: bool, ok: bool, msg: &str) {
|
fn report(json: bool, ok: bool, msg: &str) {
|
||||||
if json {
|
if json {
|
||||||
println!(
|
println!(
|
||||||
|
|||||||
@@ -783,14 +783,40 @@ pub async fn auto_connect_cdp() -> Result<String, String> {
|
|||||||
// / :9222 probes below: if the user's Chrome happens to also be listening on a
|
// / :9222 probes below: if the user's Chrome happens to also be listening on a
|
||||||
// debug port, attaching there would pop the consent dialog and defeat the
|
// debug port, attaching there would pop the consent dialog and defeat the
|
||||||
// whole zero-interaction extension path.
|
// whole zero-interaction extension path.
|
||||||
if let Some(relay) = crate::connect::relay_url() {
|
// If the extension is installed, it is the *intended* transport. The relay
|
||||||
// The relay is a local CDP-over-WS endpoint we connect to like Chrome.
|
// URL file comes and goes with the MV3 service worker (a Chrome restart or an
|
||||||
// A bare TCP liveness check (no WS upgrade) confirms it is actually
|
// idle SW briefly drops it), so a single failed probe doesn't mean "no
|
||||||
// accepting before we commit, mirroring the consent-free probe used for
|
// extension" — retry for a few seconds while it reconnects. Crucially, when
|
||||||
// DevToolsActivePort.
|
// the extension is set up we must NEVER fall through to the raw :9222 path
|
||||||
if relay_is_live(&relay).await {
|
// below: that pops Chrome 136+'s "Allow remote debugging?" dialog, the exact
|
||||||
return Ok(relay);
|
// thing the extension exists to avoid.
|
||||||
|
let host_installed = crate::connect::host_installed();
|
||||||
|
let relay_attempts = if host_installed { 10 } else { 1 };
|
||||||
|
for attempt in 0..relay_attempts {
|
||||||
|
if let Some(relay) = crate::connect::relay_url() {
|
||||||
|
// The relay is a local CDP-over-WS endpoint we connect to like Chrome.
|
||||||
|
// A bare TCP liveness check (no WS upgrade) confirms it is actually
|
||||||
|
// accepting before we commit, mirroring the consent-free probe used
|
||||||
|
// for DevToolsActivePort.
|
||||||
|
if relay_is_live(&relay).await {
|
||||||
|
return Ok(relay);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if host_installed && attempt + 1 < relay_attempts {
|
||||||
|
tokio::time::sleep(std::time::Duration::from_millis(500)).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if host_installed {
|
||||||
|
return Err(
|
||||||
|
"The agent-browser-stealth extension is installed, but its relay \
|
||||||
|
isn't connected right now. Wake it up — click the extension's \
|
||||||
|
toolbar icon, or reload it at chrome://extensions — then retry. \
|
||||||
|
(agent-browser will not attach to a raw --remote-debugging-port \
|
||||||
|
while the extension is set up, because that pops Chrome's \"Allow \
|
||||||
|
remote debugging?\" dialog. Use --cdp <port> to force the raw path.)"
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let user_data_dirs = get_chrome_user_data_dirs();
|
let user_data_dirs = get_chrome_user_data_dirs();
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "agent-browser-stealth",
|
"name": "agent-browser-stealth",
|
||||||
"version": "0.27.0-fork.39",
|
"version": "0.27.0-fork.40",
|
||||||
"description": "Browser automation CLI for AI agents — stealth fork with anti-detection",
|
"description": "Browser automation CLI for AI agents — 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