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.703 (insiders): Cancelling Annotate (Esc or the X) captures nothing and leaves your clipboard alone; it used to copy a screenshot of the page over your clipboard (found on John's laptop, 2026-10-07). Includes 2.0.702: the toolbar pen finds its window by tab id, so it works on Slack, Gmail and YouTube. Gates on winvm: smoke all pass, foreground pass, parity 55/56, jump list 12/15 (baseline).
3 files changed
+17−13
rust/Cargo.lock+12−12@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adom-pup-bridge"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-browser", "pup-cdp",@@ -655,7 +655,7 @@ dependencies = [ [[package]] name = "pup-browser"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-core", "pup-host",@@ -667,7 +667,7 @@ dependencies = [ [[package]] name = "pup-cdp"-version = "2.0.702"+version = "2.0.703" dependencies = [ "serde_json", "thiserror",@@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "pup-core"-version = "2.0.702"+version = "2.0.703" dependencies = [ "serde", "serde_json",@@ -687,7 +687,7 @@ dependencies = [ [[package]] name = "pup-dashboard"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-cdp", "pup-core",@@ -700,7 +700,7 @@ dependencies = [ [[package]] name = "pup-host"-version = "2.0.702"+version = "2.0.703" dependencies = [ "serde", "serde_json",@@ -709,14 +709,14 @@ dependencies = [ [[package]] name = "pup-host-mac"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-host", ] [[package]] name = "pup-host-win"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-core", "pup-host",@@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "pup-identity"-version = "2.0.702"+version = "2.0.703" dependencies = [ "fontdue", "image",@@ -736,7 +736,7 @@ dependencies = [ [[package]] name = "pup-session"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-core", "serde",@@ -746,7 +746,7 @@ dependencies = [ [[package]] name = "pup-vault"-version = "2.0.702"+version = "2.0.703" dependencies = [ "pup-core", "pup-host",@@ -757,7 +757,7 @@ dependencies = [ [[package]] name = "pup-verbs"-version = "2.0.702"+version = "2.0.703" 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.702"+version = "2.0.703" edition = "2021" license = "MIT"
rust/verbs/src/annotate.rs+4@@ -61,6 +61,10 @@ pub fn watch(ctx: Arc<Ctx>, sid: String, caller: Caller) { let Ok(lane) = crate::transport::lane_for(&ctx, &s) else { return }; let Ok((res, dpr)) = crate::transport::read_window(&lane, &t, "__pupAnnotateResult", true) else { return }; if res.is_null() { continue; }+ // 2.0.703: Esc / the X leave {done:false}. That is a CANCEL: capture nothing, leave the clipboard alone,+ // stop watching. Every result used to be processed as a capture, so cancelling copied a screenshot of the+ // page over whatever the user had on the clipboard (John's laptop, 2026-10-07 12:09).+ if res["done"] == json!(false) { pup_core::log(format!("[annotate] \"{sid}\" cancelled; nothing captured")); return; } if let Err(e) = process(&ctx, &sid, &lane, &t, dpr, &res, &caller) { pup_core::log(format!("[annotate] \"{sid}\" capture failed: {e}")); } } }).ok();