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
Jump lists actually commit when the user turns them on + minimal-touch explained like a human. (1) John toggled jump lists ON, opened a wiki window, right-clicked, and got only the default menu - updateWikiJumplist carried TWO legacy gates that silently vetoed his explicit pref: an internal minimal-touch return (predating the pref; the pref IS the user's choice and now wins) and a grouped-mode exclusion (now allowed with last-writer-wins semantics on the shared button, matching how overlay badges already behave); the post-stamp re-attach had the same grouped gate, removed. (2) The minimal-touch setting description was jargon even its co-designer could not parse ('i don't even understand what this means and i built pup with you from the start') - rewritten in plain words: the safety mode from the Chrome crash hunt, ON means pup keeps its hands off windows beyond opening and driving them, the per-feature toggles above are the real controls and win over it, and the crash-isolation rule of thumb.
4 files changed
+14−10
adom-bridge-puppeteer-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "puppeteer",- "version": "1.9.268",- "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.268/adom-bridge-puppeteer-v1.9.268.zip",- "sha256": "2f21309f5c56e3b64aef380cd7a24174adfe272571a7097814d5813c0022b55f",- "size": 614644,+ "version": "1.9.269",+ "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.269/adom-bridge-puppeteer-v1.9.269.zip",+ "sha256": "6b731f7b9ec5a0c25779062b7b2b0255e45b13f32042f3669d02a5920146b3ba",+ "size": 614933, "verbPrefixes": [ "browser_", "desktop_recorder_",
src/BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.268+1.9.269
src/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "puppeteer", "displayName": "Puppeteer (Chrome for Testing + Native)",- "version": "1.9.268",+ "version": "1.9.269", "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. browser_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. browser_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, browser_alert_window posts a native toast whose click focuses the window, browser_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.", "homepage": "https://wiki.adom.inc/adom/adom-desktop", "author": "Adom Inc.",
src/server.js+8−4@@ -3009,7 +3009,7 @@ async function stampPupIdentity(sessionId, opts) { if (!ok) console.log(`[identity] "${sessionId}" stamp NOT applied (appId=${appId}): ${(raw || '').slice(0, 140)}`); if (ok) { console.log(`[identity] "${sessionId}" stamped appId=${appId}: ${(data.applied || []).join(',') || 'ok'}`);- if (sess && !grouped && prevAppId !== appId) {+ if (sess && prevAppId !== appId) { sess._curAppId = appId; // v1.9.245: the stamp DESTROYED and RECREATED the taskbar button, so whatever overlay was // painted is gone from glass. Mark bare so the 10s enforcer repaints the new button; also@@ -3197,9 +3197,13 @@ async function setWikiAuthedState(session, sessionId, authed, opts = {}) { // per-window menu would be ambiguous) and only for Adom (adom.inc) URLs; any other URL clears the // menu. Self-gates off if AD lacks the verb. Idempotent per (session, view) via _wikiJumplistView. async function updateWikiJumplist(session, sessionId, opts) {- if (minimalTouch()) return; // v1.9.185 minimal-touch: no cosmetic/shell machinery pushed at Chrome+ // v1.9.269 (John toggled jump lists ON and the wiki tasks never appeared): this function carried+ // TWO legacy gates that silently vetoed the user's explicit pref - the minimal-touch return (the+ // pref now IS the user's choice and wins) and the grouped exclusion (under grouped, commit with+ // last-writer-wins semantics, exactly how overlay badges already behave on a shared button).+ if (pupSettings().jumpLists !== 'on') return; if (process.platform !== 'win32' || _identitySupported !== true || _jumplistSupported === false) return;- if (!session || pupSettings().taskbarGrouping === 'grouped') return;+ if (!session) return; // v1.9.61: callers may pass the appId EXPLICITLY. stampPupIdentity brands the header BEFORE it // stamps the new appId onto the window, so at that moment session._curAppId is still the OLD id. const appId = (opts && opts.appId) || (session && session._curAppId) || `${PUP_APP_ID}.${sessionId}`;@@ -8562,7 +8566,7 @@ const SETTINGS_DEF=[ {k:'sleepRecovery',l:'Sleep and crash recovery',d:'After the laptop wakes or Chrome dies, automatically bring every pup window back at its last page, signed in. Never restarts a live Chrome.'}, {k:'autoLogin',l:'Auto-fill saved logins',d:'Fill (never submit) a matching saved login when a login page loads in a pup window.'}, {k:'reportIssues',l:'Issue-report hints',d:'Let pup invite AIs to file a wiki issue when they hit something broken.'},- {k:'minimalTouch',l:'Minimal-touch mode',d:'Master switch: pup does nothing to windows beyond opening and driving them. Individual toggles above override where they say so. Changing this affects many behaviors; leave on unless testing.'},+ {k:'minimalTouch',l:'Minimal-touch mode',d:'The safety mode from the Chrome crash hunt. ON means pup keeps its hands off your windows: it only opens them and drives the pages inside, and skips the extra Windows machinery (identity stamps, window sweeps, shell churn) that was suspected of freezing Chrome. The toggles above are the real per-feature controls now and they win over this switch. Rule of thumb: leave this ON; if pup ever gets crashy, make sure it is ON and turn features back on one at a time to find the culprit.'}, ]; function renderDlg(){ const st=(SNAP&&SNAP.bridge&&SNAP.bridge.settings)||{};