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.539 (insiders): Proven on AdomLapper on 2.0.537-539: 20 of 20 vendor sites as tabs in ONE extension-lane window on adom-you, cold, no duplicates (URL dedup + relaunch never appends onto a newer window); the window survives two pup restarts by re-adoption (same hwnd, 20 tabs, one window, no kill); ab-smoke ALL PASS on the default lane; pup_clear_cookies added for the Akamai verdict-cookie fix.
2 files changed
+17−1
src/extension/manifest.json+2−1@@ -16,7 +16,8 @@ "alarms", "scripting", "system.display",- "downloads"+ "downloads",+ "cookies" ], "host_permissions": [ "<all_urls>",
src/extension/worker.js+15@@ -239,6 +239,21 @@ async function pupExtPoll() { const wins = await chrome.windows.getAll({}); for (const w of wins) { try { await chrome.windows.remove(w.id); } catch (e) {} } out = { id: cmd.id, ok: true, closed: wins.length };+ } else if (cmd.action === 'clearCookies') {+ // Remove every cookie whose domain ends with cmd.domain (HttpOnly included). Used to drop a bot+ // manager's poisoned verdict cookie (Akamai _abck at ~-1~) so a site gets a clean look at this browser.+ const dom = String(cmd.domain || '').replace(/^\./, '').toLowerCase();+ const all = await chrome.cookies.getAll({});+ let n = 0;+ for (const c of all) {+ const cd = (c.domain || '').replace(/^\./, '').toLowerCase();+ if (!dom || cd === dom || cd.endsWith('.' + dom)) {+ if (cmd.names && cmd.names.length && !cmd.names.includes(c.name)) continue;+ const url = (c.secure ? 'https://' : 'http://') + cd + (c.path || '/');+ try { await chrome.cookies.remove({ url, name: c.name, storeId: c.storeId }); n++; } catch (e) {}+ }+ }+ out = { id: cmd.id, ok: true, removed: n, domain: dom }; } else if (cmd.action === 'download') { // chrome.downloads: the lane's download path (no CDP Browser.setDownloadBehavior here). Resolves when the // item completes, with its saved path and byte count, or fails with the interrupt reason.