app
Pup - the AI's own browser
Public Made by Adomby adom
pup gives your AI a real browser on your desktop that it drives completely, in the background, signed in as you: windows that never jump in front of your work, one shared profile that learns your logins, and every window labeled on the taskbar with its AI thread's name.
← Commit history
v2.0.679 (insiders): pup accepts only plain-version folders as a usable browser build, so a half-unpacked .partial folder or a renamed copy is never launched (found while testing ab 2.1.153's prewarm of pup, which works end to end: ab calls pup_prewarm, pup downloads and unpacks the pinned build in the background, ab records ok). Plus everything in 2.0.678.
3 files changed
+16−14
rust/Cargo.lock+12−12@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-pup-bridge"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-browser", "pup-cdp",@@ -655,7 +655,7 @@ dependencies = [ [[package]] name = "pup-browser"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-core", "pup-host",@@ -667,7 +667,7 @@ dependencies = [ [[package]] name = "pup-cdp"-version = "2.0.678"+version = "2.0.679" dependencies = [ "serde_json", "thiserror",@@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "pup-core"-version = "2.0.678"+version = "2.0.679" dependencies = [ "serde", "serde_json",@@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "pup-dashboard"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-cdp", "pup-core",@@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "pup-host"-version = "2.0.678"+version = "2.0.679" dependencies = [ "serde", "serde_json",@@ -709,14 +709,14 @@ dependencies = [ [[package]] name = "pup-host-mac"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-host", ] [[package]] name = "pup-host-win"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-core", "pup-host",@@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "pup-identity"-version = "2.0.678"+version = "2.0.679" dependencies = [ "fontdue", "image",@@ -736,7 +736,7 @@ dependencies = [ [[package]] name = "pup-session"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-core", "serde",@@ -746,7 +746,7 @@ dependencies = [ [[package]] name = "pup-vault"-version = "2.0.678"+version = "2.0.679" dependencies = [ "pup-core", "pup-host",@@ -757,7 +757,7 @@ dependencies = [ [[package]] name = "pup-verbs"-version = "2.0.678"+version = "2.0.679" dependencies = [ "base64", "png 0.17.16",
rust/Cargo.toml+1−1@@ -4,7 +4,7 @@ members = ["core", "host", "host-win", "host-mac", "cdp", "browser", "session", # One version for the whole bridge, in lockstep with src/BRIDGE_VERSION (tools/ship.sh bumps both). [workspace.package]-version = "2.0.678"+version = "2.0.679" edition = "2021" license = "MIT"
rust/browser/src/lib.rs+3−1@@ -57,7 +57,9 @@ pub fn detect_cft(host: &dyn Host) -> Option<Candidate> { let root = host.cft_cache_dir().join("chrome"); let mut builds: Vec<(String, PathBuf)> = fs::read_dir(&root).ok()?.flatten() .filter_map(|e| { let n = e.file_name().to_string_lossy().to_string(); let prefix = format!("{}-", host.cft_platform()); n.strip_prefix(&prefix).map(|b| (b.to_string(), e.path().join(host.cft_exe_relative()))) })- .filter(|(_, p)| p.is_file()).collect();+ // 2.0.679: a build id is a plain version. Folders like "<build>.partial" (an unpack in progress) or a renamed+ // copy matched the prefix and could be launched half-written (found testing ab's prewarm on CRR, 2026-09-22).+ .filter(|(b, p)| !b.is_empty() && b.chars().all(|c| c.is_ascii_digit() || c == '.') && p.is_file()).collect(); builds.sort_by(|a, b| version_key(&b.0).cmp(&version_key(&a.0))); builds.into_iter().next().map(|(b, p)| Candidate { kind: "chrome-for-testing".into(), source: "cache".into(), executable_path: p, build_id: Some(b) }) }