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
Publish 2.0.597
4 files changed
+64−6
SKILL.md+6@@ -38,6 +38,12 @@ dropdown. Backed by the OS keychain (encrypted at rest); passwords are never log `pup_login {submit:true, submitReason:"<why this domain is the right one>"}`. Bare `submit:true` is refused with `submit_reason_required` and the exact live host, so a lookalike/typo/redirected domain is caught before the secret is sent.+- **Google is its own verb**: `pup_google_signin {account, submitReason}` (never `pup_login`, which+ cannot do Google's email-then-password pages). Users usually have several Google accounts and pup+ never guesses: with no `account` it returns the list (work or personal, the browser profile each is+ signed into) and you decide from the task, the user's work and personal skills, or by asking. It+ sends no password when the account is already signed in, and hands back any verification step with+ the exact call that finishes it. Full playbook: the `pup-credentials` skill, section 0. - **Manage**: `pup_credentials {}` lists saved logins (host + username only); `credential_delete {host}` removes one; `credential_set {host, username, password}` stores one explicitly. - **Grow + share the vault (never ask the human for a password)**: `pup_import_browser_logins` pulls
package.json+2−2@@ -1,6 +1,6 @@ { "slug": "pup-bridge",- "version": "2.0.596",+ "version": "2.0.597", "type": "app", "description": "The pup SKILL PACK \u2014 the AI skills that teach a cloud/container AI how to drive the Adom Desktop Puppeteer (pup) bridge (browser_* verbs): the everyday `pup` skill plus focused sub-skills for windows/sessions/tabs, screenshots+recording, browsers+Chrome install, and driving the Adom wiki. Installs into ~/.claude/skills + ~/.codex/skills. DOCS ONLY \u2014 this is NOT the bridge runtime. The bridge itself (the Node program that drives the browser) runs on the DESKTOP: Adom Desktop bundles it and auto-installs/updates it, and it's published separately on the Releases tab as adom-bridge-puppeteer-v<ver>.zip. The pkg version is kept in lockstep with the Release version so the page's max version row always carries BOTH a pkg tarball (skills) and a runtime zip (bridge) \u2014 a skills-only or runtime-only bump on the top row breaks constraint installs. TL;DR: pkg install = the skills for your AI; the bridge = the Release zip, which Adom Desktop manages for you.", "keywords": [@@ -148,5 +148,5 @@ "prompt": "Download the puppeteer-bridge zip from the wiki and walk me through server.js" } ],- "changelog": "Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site AND username (a second Google account no longer overwrites the first). pup_login no longer reports success when it filled nothing."+ "changelog": "Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site and username. pup_login no longer reports success when it filled nothing. The browser-login import runs in the background and re-attaches instead of timing out while the user approves it." }
page.json+2−2@@ -4,7 +4,7 @@ "slug": "pup-bridge", "title": "Pup - Puppeteer Bridge", "brief": "pup is the AI's own browser: a real, full Chrome on the user's desktop that the AI fully controls (a sandbox, not the user's signed-in browser). Rides Bridge; pup_* verbs open windows and tabs, navigate, screenshot, and eval JS.",- "version": "2.0.596",+ "version": "2.0.597", "tags": [ "skills", "pup",@@ -168,5 +168,5 @@ "pup-bridge verbs are invoked through the adom-bridge CLI, not through a binary this package installs, so prefix rules cannot reach them." ] },- "changelog": "Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site AND username (a second Google account no longer overwrites the first). pup_login no longer reports success when it filled nothing."+ "changelog": "Google sign-in as the right account: pup_google_accounts searches every browser profile, nb's profiles, the vault and pup's own signed-in sessions; pup_google_signin fills the email and that account's saved password, hands back the verification step with the exact next call, and never guesses between accounts. The vault keeps one login per site and username. pup_login no longer reports success when it filled nothing. The browser-login import runs in the background and re-attaches instead of timing out while the user approves it." }
skills/pup-credentials/SKILL.md+54−2@@ -1,6 +1,6 @@ --- name: pup-credentials-description: "How pup signs the user into sites AS THEM: pup's OS-keychain credential vault (auto-capture on login + silent autofill on return, matched across a site's whole registrable domain), importing the user's OWN saved Chrome/Edge/Brave passwords into the vault (pup_import_browser_logins — the SYSTEM-elevated decrypt behind one consent + one Windows UAC), and — when a saved password is STALE (a login that 'Fail to authenticate's) — recovering the CURRENT username+password straight from the user's browser password manager by driving it with Bridge desktop verbs, clicking the eyeball, waiting for the user's Windows Hello, and reading the revealed value. It is not pretty, but it works (proven end to end: recovered a live password, fixed a wrong username, logged into a gated CAD portal, downloaded a real library). Read before trying to log a user into any site pup does not already have a working credential for. Trigger words: pup vault, saved password, autofill login, import my passwords, import browser logins, pup_import_browser_logins, decrypt browser credentials, credential_set, pup_credentials, stale password, fail to authenticate, wrong password, recover my password, password manager, chrome://password-manager, show password eyeball, windows hello, get my username and password, log me in as me, seed adom-you logins."+description: "How pup signs the user into sites AS THEM: pup's OS-keychain credential vault (auto-capture on login + silent autofill on return, matched across a site's whole registrable domain), importing the user's OWN saved Chrome/Edge/Brave passwords into the vault (pup_import_browser_logins — the SYSTEM-elevated decrypt behind one consent + one Windows UAC), and — when a saved password is STALE (a login that 'Fail to authenticate's) — recovering the CURRENT username+password straight from the user's browser password manager by driving it with Bridge desktop verbs, clicking the eyeball, waiting for the user's Windows Hello, and reading the revealed value. It is not pretty, but it works (proven end to end: recovered a live password, fixed a wrong username, logged into a gated CAD portal, downloaded a real library). Read before trying to log a user into any site pup does not already have a working credential for. Trigger words: pup vault, saved password, autofill login, import my passwords, import browser logins, pup_import_browser_logins, decrypt browser credentials, credential_set, pup_credentials, stale password, fail to authenticate, wrong password, recover my password, password manager, chrome://password-manager, show password eyeball, windows hello, get my username and password, log me in as me, seed adom-you logins, google login, sign into google, log into gmail, google account, which google account, work or personal google, pup_google_signin, pup_google_accounts." --- # pup credentials — sign the user in AS THEM@@ -35,6 +35,56 @@ credential story: the vault, importing the user's saved logins, and the not-pret to recover a **current** password when a stored one has gone stale. Verbs live in the `pup` bridge; call them with `adom-bridge-cli`. +## 0. Google: `pup_google_signin` (never pup_login)++Google asks for the email on one page and the password on the next, so `pup_login` cannot do it and+says so (`no_login_form`). Use the Google verbs (2.0.596):++```+adom-bridge pup_google_accounts {} # who this user is on Google, cached a day+adom-bridge pup_google_signin {"account":"[email protected]","submitReason":"the task is the work calendar"}+```++**Most users have several Google accounts, and pup never guesses which one.** The first time it is+asked, pup searches everything it can reach: every Chrome and Edge profile on the desktop (with the+label the user gave it, like "John Personal"), nb's browser profiles, pup's own vault, and which+accounts pup's profile is already signed into. Each account comes back as `work` or `personal` (from+its domain) and `likelyStale` when it lives only in pup's vault and in no browser (those are usually+years old and Google demands a second step for them).++Call `pup_google_signin` with no `account` and more than one account exists, and the answer is+`google_account_choice_required` with the list. Decide, in order:+1. **The task.** Company mail, calendars, docs, vendor portals: the work account. Family, banking,+ school, personal purchases: the personal one.+2. **Your own skills.** The user's work and personal skills usually name their accounts. Search them.+3. **Ask the user.** Then pass `account` as the email. `"work"` or `"personal"` also works when exactly+ one account of that kind exists (a user with two work accounts gets the list again).++What the verb does, and what each answer means:++| Answer | Meaning | Do |+|---|---|---|+| `signedIn:true, alreadySignedIn:true` | pup's profile was already signed in; no password sent | drive the window |+| `signedIn:true` | email and saved password went through | drive the window |+| `google_password_missing` | not signed in and no saved password for that account | `pup_import_browser_logins {hostFilter:"google.com"}`, or the user signs in once in the pup window |+| `google_verification_required` + `options` | Google wants a second step | `pup_google_signin {window, account, challenge:"text message"}` |+| `google_verification_required` (code) | Google sent a code | `pup_google_signin {window, account, code:"123456"}` |+| `google_verification_required` (other device) | the user must tap Yes on their phone | tell them; pup already waited 45 s |+| `google_password_rejected` | the saved password is out of date | import again or section 3; never retry the same one |+| `google_signin_unconfirmed` | Gmail opened as a different account | call again; do not assume |++Traps measured on John's laptop (2026-09-16):+- **Landing on Gmail proves nothing.** `mail.google.com/mail/u/?authuser=<email>` for an account that is+ not signed in silently opens the signed-in account's inbox. pup confirms the account by name.+- **Never restart a sign-in stuck on a verification step.** That resends the password and a new code.+ Finish it with `{window, code}` or `{window, challenge}`.+- **A text code can finish hands-free** when your thread has the user's standing permission to read+ their texts (a personal texting skill). Otherwise ask the user for it.+- Google does not block pup's default window. A window opened with `lane:"cdp"` carries a debug port+ and can draw "This browser or app may not be secure".+- **The vault holds one login per site AND username** since 2.0.596. Before that a second Google+ account overwrote the first.+ ## 1. The vault (how pup remembers logins) - **Auto-capture:** when the user (or pup) signs into a site, pup grabs the credential and stores it@@ -59,7 +109,9 @@ Chrome/Edge/Brave passwords into the vault. adom-bridge-cli pup_import_scan {} # import (optionally filter to specific sites). Runs the SYSTEM-elevated decrypt LOCALLY:-# the user approves ONE Adom Bridge consent dialog + ONE Windows UAC prompt on the desktop.+# the user approves ONE Adom Bridge consent + ONE Windows UAC prompt on the desktop. When Bridge runs+# inside Hydrogen the consent is a notification and a card in Hydrogen, NOT a window: say so to the user.+# A call that answers consent_pending re-attaches when called again (no second prompt). adom-bridge-cli pup_import_browser_logins {"hostFilter":["digikey","mouser","snapeda"]} ```