← Commit history

Lock the comprehensive all-profiles credential-import spec: import from EVERY Chromium profile across Chrome+Edge+Brave via ONE admin/SYSTEM helper (one ABE key per browser, one Login Data per profile), merge into an identity-tagged adom-you vault keeping both on conflict, passwords+bookmarks+autofill, first-run + all-profile settings picker; SYSTEM decrypt helper is AD-core

John Lauer ·ec3148e69a ·3mo ago ·parent 7c11c5e
1 file changed +43−19
dev-skills/pup-browser-import/SKILL.md+43−19
@@ -83,27 +83,51 @@ Codex's "Import from Chrome" is the reference implementation of doing this RIGHT   the feature such that a cookie failure blocks the password import (Codex reports them   independently - do the same). -## Implications for pup's import feature (the plan)+## Implications for pup's import feature (the plan — COMPREHENSIVE, all profiles, LOCKED 2026-08-04) -Priority order, matching what actually works:+John (2026-08-04): "i have [email protected], [email protected], and [email protected] profiles... most+users will have lots of profiles... you should import on ALL of the user's profiles to make a+comprehensive adom-you profile that pup can use. that gives the AI the most power." The earlier+"Profile 1 only" plan was too narrow. Measured on John's box: **4 Chrome profiles (Default, Profile,+Profile 1 [819KB], Profile 2) + 1 Edge profile (Default), ALL ABE=True.** So the feature is ALL+profiles across ALL Chromium browsers. -1. **Passwords via an admin-elevated SYSTEM helper** (the Codex path). This is the real feature:-   - AD-side (NOT the container bridge - the container can't touch Windows DPAPI or elevate): a-     helper that requests UAC elevation, gets a SYSTEM token, unwraps-     `os_crypt.app_bound_encrypted_key` (strip `APPB`, SYSTEM-DPAPI unwrap, then user-DPAPI unwrap) to-     get the AES-256-GCM master key, copies `Login Data`, decrypts each `v20`-     `password_value` (3-byte version prefix, 12-byte nonce, ciphertext, 16-byte GCM tag), and returns-     `{origin, username, password}` rows.-   - Bridge side: import those rows into pup's **credential vault** (`src/credential_vault.js`) so the-     EXISTING `autoLogin` path signs the agent into sites and builds FRESH sessions (more durable than-     copied cookies, which expire anyway).-   - Never write a plaintext CSV/file. Decrypt in memory, hand to the vault, zero the buffers.-2. **Cookies: attempt, but treat failure as normal.** Same SYSTEM helper can try the `Cookies`-   store (`Network\Cookies`, `v20`, same master key). On a managed profile expect the-   "device security policy" refusal - surface it honestly per-item (Codex-style), do not fail the run.-3. **First-run prompt + a dashboard "Import from Chrome" settings section** (John's explicit ask), so-   the user can run it later if they skip first-run. Per-profile picker (enumerate `Default` +-   `Profile*`). Show the same honest consent about the admin prompt.+STRUCTURAL FACT (verified): the ABE master key lives in each browser's SHARED `User Data/Local State`+(one key per BROWSER), while each PROFILE has its own `Login Data`. So per browser: unwrap the key+ONCE, decrypt EVERY profile with it.++1. **Discover everything.** Enumerate every profile of every Chromium browser (Chrome, Edge, Brave if+   present), reusing HD's existing browser-profile-scan logic. For each profile read `Preferences`+   → `account_info[].email` to get the SOURCE ACCOUNT NAME ([email protected] vs [email protected] vs+   [email protected]) — the identity tag is the whole point.+2. **Passwords via ONE admin-elevated SYSTEM helper, ALL profiles.** AD-side (the container can't+   touch Windows DPAPI or elevate — this half is AD-CORE work, file it there): one UAC → SYSTEM token+   → for EACH browser, unwrap `os_crypt.app_bound_encrypted_key` (strip `APPB`, SYSTEM-DPAPI unwrap,+   then user-DPAPI unwrap) to the AES-256-GCM master key → for EACH profile of that browser, copy+   `Login Data`, decrypt every `v20` `password_value` (3-byte version prefix, 12-byte nonce,+   ciphertext, 16-byte GCM tag). Returns rows `{origin, username, password, sourceBrowser,+   sourceProfile, sourceAccount, lastUsed}`. ONE elevation covers Chrome + Edge + all profiles.+3. **Merge into ONE identity-tagged adom-you vault** (`src/credential_vault.js`, pup-side, ours).+   DECISION 1 (locked): **keep BOTH on a (origin,username) conflict, tagged by identity** — do not+   collapse to newest. A site saved under personal AND work stays as two tagged entries so the agent+   can act as the RIGHT persona; pick by context (the pup window's owner/profile/thread), fall back to+   most-recently-used. This is the "most power" John wants.+4. **Feed the EXISTING `autoLogin`** so the agent logs into any site with the matching tagged+   credential and builds FRESH sessions. DECISION 2 (locked): import **passwords + bookmarks ++   autofill** (bookmarks/autofill are DPAPI-cheap and ride the same pass); cookies stay best-effort+   (blocked by the managed-profile device policy — see below).+   Never write a plaintext CSV/file. Decrypt in memory, hand to the vault, zero the buffers.+5. **DECISION 3 (locked) — ownership:** the elevated SYSTEM decrypt helper is **AD-core** (file+   against adom/adom-desktop); pup owns discovery-surfacing, the merge, the vault, and the UX.+6. **Cookies: attempt, but treat failure as normal.** Same SYSTEM helper can try each profile's+   `Cookies` store (`Network\Cookies`, `v20`, same per-browser master key). On a managed profile expect+   the "device security policy" refusal - surface it honestly per-item (Codex-style), do not fail the+   run. Passwords are the deliverable; sessions come from pup logging in with them.+7. **First-run prompt + a Settings "Import logins from Chrome/Edge" section** (John's explicit ask).+   Lists EVERY discovered profile across ALL browsers with its account name + saved-password count and+   a checkbox each (DEFAULT: all checked). One Import button → ONE UAC prompt → the whole SYSTEM pass →+   merged into the tagged vault. Show the honest consent about the admin prompt (it's the user's own+   data, own machine, own elevation — same as Codex/any password-manager import).  ### Passkeys and camera (asked about, decided)