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.
Extension lane can't click or type on CSP / Trusted Types pages (Google Admin, Calendar); the only fix today evicts other threads
Summary
On the default extension lane, pup cannot act on any page that blocks string eval (strict CSP or Trusted Types). Google Admin (admin.google.com) and Google Calendar (calendar.google.com) are two everyday examples. The lane has no input verbs, and pup_eval is the only other way to click, so on these pages pup can navigate and screenshot but cannot touch anything.
The only escape today is lane:"cdp", and on the shared adom-you profile that relaunches the browser and closes every other thread's extension-lane windows. The reverse also happens: when another thread reopens an extension-lane window, the CDP browser dies under you (browser_gone). A separate CDP profile avoids the eviction but is not signed in to anything, so the human has to type their password again.
Net effect for the user: "open a pup window and change one Google setting" is not possible without either closing another thread's work or a fresh sign-in.
Environment
- Windows (AdomLapper), Adom Bridge 2.1.118
- pup (puppeteer bridge) 2.0.590,
extensionLane.workerVersion2.0.590 - Shared
adom-youprofile, signed in to Google Workspace
Repro
pup_open_window {sessionId:"cal", url:"https://calendar.google.com/calendar/r/settings"}(no lane). Opens fine, signed in, screenshot shows the settings page.pup_eval {sessionId:"cal", expression:"location.host"}- Actual:
eval_failed: "Evaluating a string as JavaScript violates this document's Trusted Type assignment requirements."
- Actual:
- Same on
admin.google.com: "Evaluating a string as JavaScript violates the following Content Security Policy directive because 'unsafe-eval' is not an allowed source of script". pup_input_dispatch(click or key) on the same window:- Actual:
lane_needs_cdp: "window is on the extension lane (no debug port); this verb needs CDP".
- Actual:
pup_open_window {lane:"cdp", reason:"..."}on adom-you: works, but every other extension-lane window (other threads) is closed. When one of those threads reopened its window a few minutes later, the CDP window went dead withbrowser_gone("the browser behind this window is not connected").
Expected
Clicking a button or choosing a dropdown option in a signed-in pup window works on the default lane, without evicting other threads and without a new sign-in.
Proposal
Add DOM input verbs to the extension lane that do not go through page-world string eval, so page CSP and Trusted Types do not apply:
- Run the action from the extension's ISOLATED world, e.g.
chrome.scripting.executeScript({world:"ISOLATED", func, args})with a real function (not a string). Suggested verbs:pup_click {selector | text},pup_type {selector, text},pup_select {selector, value | label}. These produceisTrusted:falseevents, which is enough for ordinary buttons, links and Material selects (verified on Amex: a plainelement.click()opened a row menu that trusted CDP clicks did not). - Optionally, where a page needs trusted input, a short-lived
chrome.debuggerattach forInput.dispatchMouseEventon one tab, released immediately, as the lane already does for its screenshot fallback. - Make
lane_needs_cdphints point to these verbs before suggestinglane:"cdp".
Separately worth considering: a CDP-lane window that does not evict the shared profile's other windows, or a documented way for a separate CDP profile to reuse the adom-you sign-in.
Related: #113 (extension lane per profile) covers separate profiles on the extension lane. This issue is about input on the existing adom-you extension lane, which is needed even with one profile.
Found while
Doing routine Google Workspace admin for a user (archive a user, add a user, change a Calendar setting). Every step stalled on this gap and fell back to the user's own browser.