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
credentials skill: the serve-from-the-vault doctrine + pup_vault_sync (never ask the human for a password)
2 files changed
+54
SKILL.md+5@@ -31,6 +31,11 @@ dropdown. Backed by the OS keychain (encrypted at rest); passwords are never log domain is caught before the secret is sent. - **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+ the user's saved Chrome/Edge/Brave logins into the vault (one consent + UAC, local only); `pup_vault_sync+ {peer, reason}` merges the adom-you vault with another of the user's desktops BOTH directions+ (newest-wins, pup-to-pup, no AI sees a password). The vault exists so you serve logins from it+ rather than asking; see the `pup-credentials` skill. - **Reveal one to a LOCAL assistant** (v2.0.368): `pup_credential_reveal {host, reason}` hands the saved username + password for ONE host to a caller running on the desktop (a desktop assistant such as Grok Bot calling `adom-bridge` natively), after the user clicks **Reveal** on a sticky toast
skills/pup-credentials/SKILL.md+49@@ -5,6 +5,31 @@ description: "How pup signs the user into sites AS THEM: pup's OS-keychain crede # pup credentials — sign the user in AS THEM +## ⛔ THE RULE: serve the login from the vault, NEVER ask the human for a password++pup's adom-you vault EXISTS so the AI never has to ask the user for a username or password. If you+find yourself about to ask "what's your Google password?" — STOP. You have verbs for this:++1. **It's probably already saved.** `pup_credentials {}` lists every host+username pup holds. To+ sign a window in, `pup_login {submit:true, submitReason}` — pup fills and submits from the vault.+ To hand the actual secret to a LOCAL desktop assistant, `pup_credential_reveal {host, reason}`+ (one consent click).+2. **Not saved on THIS box? Import the user's own browser logins.** `pup_import_browser_logins+ {hostFilter?}` pulls their saved Chrome/Edge/Brave passwords into the vault (one consent + UAC).+ That is ab's signed decrypt helper doing the work locally; a cloud caller cannot, only pup can.+3. **Saved on ANOTHER of the user's desktops? Sync it.** `pup_vault_sync {peer, reason}` merges this+ box's adom-you logins with a peer desktop's, BOTH directions, so both boxes hold the union+ (newest-wins on a conflict). ONE consent toast on this box; passwords move pup-to-pup over ab's+ cross-desktop egress and **never touch an AI**. `targets` names the peers. This is the answer when+ one box has learned some logins and another box built up others.+4. **Only if a stored password is STALE** do you fall to the browser-password-manager recovery in+ section 3 below. That is the LAST resort, not the first move.++Asking the human to paste a password in chat is almost always the wrong move: it exposes the secret,+it does not grow the shared adom-you profile, and pup already has a cleaner path. Grow the vault+(capture on login, import, sync) and serve from it.++ pup is the user's doppelganger, so it needs to log in the way the user does. This skill is the whole credential story: the vault, importing the user's saved logins, and the not-pretty-but-it-works way to recover a **current** password when a stored one has gone stale. Verbs live in the `pup` bridge;@@ -46,6 +71,30 @@ adom-bridge-cli pup_import_browser_logins {"hostFilter":["digikey","mouser","sna everything saved. - After importing, `pup_login` on those sites just works. +## 2b. Sync the vault across the user's desktops (a real union, not a push)++The user runs several desktops; each pup learns different logins over time (one signs into Gusto on+the laptop, another into a vendor portal on the office box). `pup_vault_sync {peer, reason}` makes+both complete:++```+adom-bridge-cli pup_vault_sync {"peer":"arav-rog","reason":"both my desktops should have all my logins"}+```++- **Bidirectional.** It pushes THIS box's logins to the peer AND pulls the peer's back, so afterwards+ both boxes hold the UNION. A one-way copy would leave each box missing what the other learned —+ which is exactly the failure this verb avoids.+- **Newest-wins.** If the same host has different passwords on the two boxes, the more recently+ updated one wins on both. Identical entries are skipped.+- **No AI sees a password.** The bytes go pup→ab→peer-ab→peer-pup over the account's cross-desktop+ egress. `pup_vault_export` / `pup_vault_import` (the internal halves) are refused for cloud/relay+ callers — only same-account desktops sync.+- **One consent.** The initiating box shows one toast ("Sync your saved logins with <peer>?"); the+ user clicks Allow. Like every consent verb, waiting on the click is not a timeout — re-call with the+ same args to re-attach.+- Run it again whenever a box has learned new logins; it is cheap and idempotent.++ ## 3. Recover a CURRENT password when a saved one is STALE (the not-pretty-but-works path) **The tell:** pup fills + submits (`filledUsername/filledPassword/submitted` all true) but the site