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.
Desktop recorder hard-requires Chrome for Testing (no native-first fallback) and the CfT install wedges at 100 percent with no failed state (arav-rog)
arav-rog, pup 2.0.397, 2026-09-05, while trying to record the KiCad tour (adom-bridge#143 context).
1. The desktop recorder HUD hard-requires Chrome for Testing. desktop_record_start fails with Could not find Chrome (ver. 148.0.7778.97) even after pup_use {browser:"auto"} and with a healthy system Chrome and Edge on the box. Cause in server.js: the recorder calls puppeteer.launch({headless:false, ...}) with no executablePath, so it resolves only the puppeteer cache. Every other pup launch path is native-first (v1.9.90). The recorder should use the same candidate order (installed Chrome, Edge, then CfT) so a box without CfT can still record.
2. The CfT installer wedges at 100 % with no failure state. pup_prewarm / pup_readiness report, for 630 s and counting: installing:true, installPhase:"installing", installProgressPct:100, bytesDownloaded == bytesTotal (190733480), chromeForTestingInstalled:false, chromeExecutablePath:null, lastError:null. The cache dir C:\Users\arav\.cache\puppeteer\chrome\win64-148.0.7778.97 exists with no chrome-win64\chrome.exe (npm's own postinstall said exactly that, and the earlier npm run logged EPERM rmdir under node_modules, so something on this box holds files open during unpack). installPhase never reaches failed, so pup_readiness keeps saying ready:true (system browser) while the recorder is dead and prewarm's _hint says "Chrome for Testing is ready and pinned as the default", which is false (chromeForTestingInstalled:false).
Asks: (a) recorder uses launchCandidates like everything else; (b) an unpack that has not produced chrome.exe within N minutes of bytesDownloaded == bytesTotal goes to installPhase:"failed" with lastError, removes the half-populated dir, and prewarm's hint tells the truth; (c) a pup_prewarm {reinstall:true} that removes the cache dir and re-fetches, so an AI can recover without a shell on the box.