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
Skill 1.5.3: make the ZERO-PROMPT typed-verb Node bootstrap (send_files + launch_process/tar + registry_set) the primary cold-start recipe (proven on winvm); demote desktop_install_node UAC + shell_execute to fallbacks; name the ungated typed verbs
4 files changed
+51−32
PROPOSAL-shared-runtimes.md+3−2@@ -126,7 +126,8 @@ nvm/uv (shared cache + `.nvmrc`/pin), Python venvs (shared interpreter + per-pro ## Migration / back-compat - `runtime` is additive; older AD ignores it and keeps today's behavior.-- Until AD ships this, pup's SKILL keeps the no-UAC portable-Node recipe + the UAC/PATH warnings as the- interim path (documented, user-warned).+- Until AD ships this, pup's SKILL carries a PROVEN zero-prompt interim recipe (typed verbs: send_files ++ launch_process/tar + registry_set; only an AD reopen remains). desktop_install_node (UAC) / shell_execute+ (approval) are fallbacks. - Once AD spawns by absolute path from the shared cache, the interim recipe and the UAC/firewall/PATH warnings become dead code we can delete from the skill.
SKILL.md+39−25@@ -33,31 +33,42 @@ When you run `browser_open_window`, one of these happens — handle each: **Want real Google Chrome on an Edge-only box?** If the user asks for Chrome specifically, run `browser_use '{"browser":"chrome","install":true}'` — pup downloads Google's official installer and installs Chrome **user-scoped (no admin prompt in most cases)**, then pins it. Poll `browser_readiness` (`installingChrome` / `chromeStablePhase`) until `browserKind:"chrome"`. If it stalls, a UAC prompt may be waiting on the user's desktop — ask them to accept it. -### The Node step — WARN the user, a UAC prompt is coming--Installing Node.js (`desktop_install_node`) pops a **Windows UAC dialog** on the user's desktop-(*"Node.js — OpenJS Foundation — allow changes?"*). A cloud AI can't click it — **the user must**, and-if they aren't expecting it they'll deny it and the whole cold-start dead-ends. So **before** you call-`desktop_install_node`:--1. **Say it in chat:** "Windows is about to show a User Account Control prompt for **Node.js** (publisher: OpenJS Foundation). Click **Yes** — it just installs Node so pup can drive the browser."-2. **Fire a desktop heads-up so they don't miss/deny it:**- ```bash- adom-desktop notify_user '{"title":"Approve the Node.js prompt","body":"A Windows UAC prompt is about to appear to install Node.js. Click Yes — it just lets pup control the browser."}'- ```-3. **Then** run `adom-desktop desktop_install_node '{}'` and wait ~1–2 min.-4. After it succeeds, if `browser_*` STILL says `node_not_found`, AD's PATH is stale → ask the user to **quit and reopen Adom Desktop**, then retry. Don't re-run the installer.--(Use `--target <name>` on all of these when more than one desktop is connected.)--**No-UAC alternative (portable Node).** If the user refuses/denies the UAC, install Node the user-scoped-way — **no admin, no UAC** — via `shell_execute` (which needs a one-time AD *shell* approval, see below —-NOT a UAC). Warn them, `notify_user`, then run:+### The Node step — get Node on the box with ZERO prompts (preferred)++pup is a Node process, so on a fresh box AD can't spawn it until Node exists (`node_not_found` /+`could not run npm`). **Do NOT use `desktop_install_node` (a UAC/admin MSI) or `shell_execute` (an approval+popup).** Install portable Node with **AD's typed verbs, which are ungated — no UAC, no shell approval, no+firewall.** Proven on a fresh Edge-only box. Get `<user>` from `bridge_list` (pup's `installPath`) or+`list_dir C:\Users`; use `--target <name>` when >1 desktop is connected.+ ```bash-adom-desktop shell_execute '{"command":"powershell -NoProfile -Command \"$v=\\\"v22.11.0\\\"; $d=\\\"$env:LOCALAPPDATA\\adom-node\\\"; $z=\\\"$env:TEMP\\node.zip\\\"; Invoke-WebRequest \\\"https://nodejs.org/dist/$v/node-$v-win-x64.zip\\\" -OutFile $z; Expand-Archive $z $d -Force; $n=(Get-ChildItem $d -Directory | Select-Object -First 1).FullName; [Environment]::SetEnvironmentVariable(\\\"Path\\\", \\\"$n;\\\"+[Environment]::GetEnvironmentVariable(\\\"Path\\\",\\\"User\\\"),\\\"User\\\")\""}'+# 1. In the container: download the portable Node zip (~34 MB)+curl -sL https://nodejs.org/dist/v22.11.0/node-v22.11.0-win-x64.zip -o /tmp/node.zip++# 2. Push it to the box — send_files is a typed 'files' verb (NO prompt)+adom-desktop send_files '{"filePaths":["/tmp/node.zip"],"dest":"C:\\Users\\<user>\\AppData\\Local\\adom-node"}'++# 3. Unzip with Windows' built-in tar via launch_process (typed, NO prompt)+adom-desktop launch_process '{"path":"C:\\Windows\\System32\\tar.exe","args":["-xf","C:\\Users\\<user>\\AppData\\Local\\adom-node\\node.zip","-C","C:\\Users\\<user>\\AppData\\Local\\adom-node"],"window":"hidden"}'++# 4. Add node to the USER PATH — read first, APPEND, don't clobber (registry_* are typed, NO prompt)+adom-desktop registry_get '{"hive":"HKCU","key":"Environment","name":"Path"}' # note the current value+adom-desktop registry_set '{"hive":"HKCU","key":"Environment","name":"Path","type":"REG_SZ","value":"<existing>;C:\\Users\\<user>\\AppData\\Local\\adom-node\\node-v22.11.0-win-x64"}' ```-Then the user **quits + reopens Adom Desktop** (so AD's PATH picks up the new user dir — again, an app-restart, not a UAC). Both Node paths still require that AD reopen; only AD bundling `node.exe` avoids it.++5. **Ask the user to quit + reopen Adom Desktop** so AD re-reads PATH — an app restart, **not** a prompt,+ **not** admin. Then `browser_readiness` → ready, and `browser_open_window` drives Edge. (This one reopen+ is the only manual step; it disappears once AD ships absolute-path runtime spawn — see the shared-runtime+ proposal.)++**Zero approval popups, zero UAC, zero firewall.** Verify with `list_dir` after step 3 (`node.exe` ++`npm.cmd` present) and `registry_get` after step 4.++**Fallbacks (only if the above is blocked):**+- `desktop_install_node` — installs Node via an admin MSI → **a Windows UAC**. If you must use it, warn the+ user first (chat + `notify_user`) that a UAC for "Node.js — OpenJS Foundation" will appear and they must+ click **Yes**, else the cold-start dead-ends. Then reopen AD (stale PATH) as in step 5.+- `shell_execute` — works but pops an AD shell-approval; the typed verbs above avoid it entirely. ## Permissions on the user's desktop — what needs the user to approve @@ -67,8 +78,11 @@ But **anything open-ended — `shell_execute`, `run_script`, arbitrary PowerShel Until the user clicks it, **your call just hangs and times out** (that's not a failure of your code — it's waiting for approval). -- **Prefer core verbs.** Do the job with `browser_*` / `desktop_*` verbs whenever possible — they never- prompt. Reach for `shell_execute` / `run_script` only when no verb covers it.+- **Prefer typed verbs — they never prompt.** AD's `system`/`files` verbs exist specifically to replace+ `shell_execute`: `write_file`, `read_file`, `list_dir`, `delete_file`, `registry_get`/`registry_set`,+ `launch_process` / `launch`, `find_exe`, `send_files`, `process_list`/`process_kill`. Compose these+ (plus `browser_*`) instead of shelling out — that's how the whole Node bootstrap runs with zero popups.+ Reach for `shell_execute` / `run_script` only when genuinely no typed verb covers it. - **Whenever you DO issue `shell_execute` / `run_script`, warn the user first** — in chat AND with a desktop heads-up, so they approve instead of ignoring it: ```bash
dev-skills/pup-bridge-dev.md+8−4@@ -135,10 +135,14 @@ What we learned and baked into the code: listen — a THIRD scary prompt after UAC + shell-approval, and worse on a fresh portable-node path the firewall has never seen. Fix: `server.listen(PORT, '127.0.0.1', ...)`. AD only ever talks to the bridge over loopback, and loopback sockets are firewall-exempt → the prompt never appears.-- **No prompt-free Node without AD.** pup is a Node process AD spawns via `node` on PATH. Getting Node onto- a fresh box costs SOME prompt: the MSI (`desktop_install_node`) = a UAC; portable Node (zip→user dir→user- PATH via `shell_execute`) = a shell-approval, no UAC. BOTH then need AD reopened (stale PATH). The only- zero-prompt path is AD bundling `node.exe` / doing the portable install itself — see HANDOFF.+- **Zero-prompt Node bootstrap IS possible with typed verbs (PROVEN on winvm).** pup is a Node process, so+ it can't self-install Node — but the AI can, using AD's UNGATED typed verbs (only `shell_execute` /+ `run_script` / `wsl_exec*` prompt; everything typed does not). Proven flow, zero popups: `send_files` the+ portable Node zip → `launch_process` `C:\Windows\System32\tar.exe -xf` to extract → `registry_get` ++ `registry_set` HKCU\Environment\Path (append, REG_SZ) → user reopens AD (app restart, no prompt) so it+ re-reads PATH. NO UAC, NO shell-approval, NO firewall. The recipe lives in SKILL.md. The only human step+ is the AD reopen, which the shared-runtime proposal (absolute-path spawn) removes. `desktop_install_node`+ (UAC MSI) + `shell_execute` (approval popup) are fallbacks only. ## Publishing (the wiki has TWO storage layers — don't mix them)
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-desktop-puppeteer-bridge",- "version": "1.6.1",+ "version": "1.5.3", "type": "app", "description": "CONTAINER-SIDE install \u2014 the everyday `pup` user skill only. This pkg drops the `pup` skill (drive the browser bridge: open/close/tabs/screenshot/record, background-by-default) into ~/.claude/skills/ AND ~/.codex/skills/. It does NOT install the developer/publishing skills (pup-bridge-dev, pup-bridge-publish) \u2014 those are source-only; clone the repo (adom-wiki repo clone adom/adom-desktop-puppeteer-bridge) to get them from dev-skills/. It also does NOT contain the bridge runtime: the bridge (Node + Chrome for Testing) lives on the DESKTOP \u2014 bundled inside Adom Desktop and published here on the Releases tab as adom-bridge-puppeteer-v<ver>.zip, which Adom Desktop streams into its bridges-cache. TL;DR: `pkg install` = the pup user skill; dev skills = clone the source; the bridge = the Release zip + bundled in Adom Desktop.", "keywords": [