Pup - Puppeteer Bridge
Public Made by Adomby adom
pup is the AI's own browser: a real, full Chrome on the user's desktop that the AI fully controls (a sandbox, not the user's signed-in browser). Rides Bridge; pup_* verbs open windows and tabs, navigate, screenshot, and eval JS.
name: pup-jumplist description: How pup taskbar jump lists work AND the one bug John has reported ~10 times that keeps not getting fixed - the FIRST right-click shows the menu for a blip then it vanishes, and you must right-click a SECOND time ~1s later for it to stay. Cause, the 2nd-click workaround, and the real fix. READ THIS before touching updateWikiJumplist, any desktop_set_window_jumplist call, or any code that re-commits a jump list on a timer/stamp/nav.
pup taskbar jump lists
🔴 THE BUG John keeps reporting (write it here so it is NEVER forgotten again)
John, verbatim and repeatedly ("i've fucking told you about this 10 fucking times"):
"The FIRST time you right-click it, the jump list shows for a BLIP and then goes away. Then you always have to right-click a SECOND time ~1 second later, and THEN it works and stays open."
This is real, reproducible, and long-standing. Do not "fix jump lists," verify they COMMIT, and call it done - committing is necessary but the BLIP is the bug he actually feels. The menu appearing and then self-dismissing on the first right-click is the whole complaint.
Cause: a CommitList lands while the shell is showing the menu
desktop_set_window_jumplist → the Windows shell ICustomDestinationList::CommitList, and every
CommitList REBUILDS the menu from scratch. If a commit fires WHILE the user is opening (or has just
opened) the jump list, the shell DISMISSES the open menu - the blip. The second right-click works
because by then no commit is in flight, so nothing rebuilds it out from under the user.
So the bug is pup re-committing the jump list too close to the user's right-click. The prime
suspects, all in updateWikiJumplist's callers, are re-commits that fire on events that coincide with
a right-click:
- The post-stamp-settle re-commit (a
setTimeout(..., 1600)that clears the dedup key and re-commits "on the live button"). ~1.6s is suspiciously close to John's "~1s later." A focus change from the user clicking the taskbar can trigger a re-stamp → this re-commit → dismiss. - Any timer/nav/overlay-driven call into
updateWikiJumplistthat isn't gated on the task set ACTUALLY changing.
The old dedup key was (appId | view | jlViewTasks | jlCloseAll). That still re-commits whenever the
appId changes (a re-stamp) even though the TASKS are identical, which is a redundant CommitList that
can eat the menu.
The fix (do this, don't just document it)
- Dedup on the exact TASK-SET, not on appId/view. Hash the committed
tasksarray (titles + args); if the hash is unchanged, do NOT calldesktop_set_window_jumplistat all. A re-stamp with identical tasks must be a no-op - no CommitList, no blip. - Kill the periodic / post-stamp-settle re-commit unless the task-set hash changed. "Hygiene" re-commits are exactly what dismiss the menu. One commit per real content change, ever.
- Never commit in response to a focus/foreground change - that is when the user is opening the menu.
- If a genuine shell race remains after pup stops over-committing, THAT part is AD's (it owns the shell interaction) - file it there with a repro, don't paper over it with another re-commit.
The 2nd-click workaround (tell the user, honestly)
Until the over-committing is gone: right-click, if it blips away, right-click again ~1s later. Say this plainly; do not pretend the first click works.
The "Switch to logged-in view" task did NOTHING (v1.9.332)
John clicked the "Switch to logged-in view" jump-list task and nothing happened. Cause: the callback
pup_wiki_set_view short-circuited with {unchanged:true} (just bringToFront, NO reload)
whenever pup BELIEVED the window was already in the requested view. And pup makes wiki windows default
to authed, so it almost always believed "already logged in" → the click was a silent no-op. Worse,
pup's view belief is unreliable (the default-authed may never have actually signed the page in; a cookie
expired), so "do nothing because I think you're already there" is exactly the wrong call.
FIX: a real USER click (caller aiThread: 'user-taskbar-menu', which every jump-list task carries via
jarg) must ALWAYS re-assert the requested view — fall through to the mint/navigate path, which is a
genuine reload that GUARANTEES the view (for authed it re-mints a magic link / auto-signs from AD's
desktop token, actually signing the page in). Only a PROGRAMMATIC same-view call keeps the unchanged
short-circuit. The task's own description promises a "harmless reload" — honor it. Detect the user click
by _callerThread === 'user-taskbar-menu' (the header the CLI sets from the task's JSON caller).
How jump lists work (the parts that ARE correct)
- Tasks attach to the AUMID, so a per-session appId gives that window its own menu. Requires
aumidIconsON (jump lists ride on the stamp) - seepup-icon-consistency. - Commit MUST target the window by hwnd, not title (it was silently failing on title - see
pup-window-targeting). Passhwnd: session._hwnd. - Do NOT gate the commit on
_registeredPupAumids- that set is filled only bydesktop_register_app_identity, a silent no-op on some AD builds, and it blocked EVERY commit (v1.9.314). The window stamp already binds the AUMID; the commit works with just hwnd+appId+tasks. - Tasks: wiki view-switch tasks (
jlViewTasks, only on Adom wiki URLs) + a "Close ALL Adom Pup windows" task (jlCloseAll). Each needs aniconPathor the row shows a blank document glyph. - Real screenshots of the flyout can only be captured under a real pointer; an AD right-click opens
the Win11 TASK-VIEW THUMBNAILS, not the flyout. See the MOUSE-TAKEOVER section in
pup-bridge-dev.
---
name: pup-jumplist
description: How pup taskbar jump lists work AND the one bug John has reported ~10 times that keeps not getting fixed - the FIRST right-click shows the menu for a blip then it vanishes, and you must right-click a SECOND time ~1s later for it to stay. Cause, the 2nd-click workaround, and the real fix. READ THIS before touching updateWikiJumplist, any desktop_set_window_jumplist call, or any code that re-commits a jump list on a timer/stamp/nav.
---
# pup taskbar jump lists
## 🔴 THE BUG John keeps reporting (write it here so it is NEVER forgotten again)
John, verbatim and repeatedly ("i've fucking told you about this 10 fucking times"):
> "The FIRST time you right-click it, the jump list shows for a BLIP and then goes away. Then you
> always have to right-click a SECOND time ~1 second later, and THEN it works and stays open."
This is real, reproducible, and long-standing. Do not "fix jump lists," verify they COMMIT, and call
it done - committing is necessary but the BLIP is the bug he actually feels. The menu appearing and
then self-dismissing on the first right-click is the whole complaint.
### Cause: a CommitList lands while the shell is showing the menu
`desktop_set_window_jumplist` → the Windows shell `ICustomDestinationList::CommitList`, and **every
CommitList REBUILDS the menu from scratch**. If a commit fires WHILE the user is opening (or has just
opened) the jump list, the shell DISMISSES the open menu - the blip. The second right-click works
because by then no commit is in flight, so nothing rebuilds it out from under the user.
So the bug is **pup re-committing the jump list too close to the user's right-click.** The prime
suspects, all in `updateWikiJumplist`'s callers, are re-commits that fire on events that coincide with
a right-click:
- The **post-stamp-settle re-commit** (a `setTimeout(..., 1600)` that clears the dedup key and
re-commits "on the live button"). ~1.6s is suspiciously close to John's "~1s later." A focus change
from the user clicking the taskbar can trigger a re-stamp → this re-commit → dismiss.
- Any **timer/nav/overlay-driven** call into `updateWikiJumplist` that isn't gated on the task set
ACTUALLY changing.
The old dedup key was `(appId | view | jlViewTasks | jlCloseAll)`. That still re-commits whenever the
appId changes (a re-stamp) even though the TASKS are identical, which is a redundant CommitList that
can eat the menu.
### The fix (do this, don't just document it)
1. **Dedup on the exact TASK-SET, not on appId/view.** Hash the committed `tasks` array (titles +
args); if the hash is unchanged, do NOT call `desktop_set_window_jumplist` at all. A re-stamp with
identical tasks must be a no-op - no CommitList, no blip.
2. **Kill the periodic / post-stamp-settle re-commit** unless the task-set hash changed. "Hygiene"
re-commits are exactly what dismiss the menu. One commit per real content change, ever.
3. **Never commit in response to a focus/foreground change** - that is when the user is opening the
menu.
4. If a genuine shell race remains after pup stops over-committing, THAT part is AD's (it owns the
shell interaction) - file it there with a repro, don't paper over it with another re-commit.
### The 2nd-click workaround (tell the user, honestly)
Until the over-committing is gone: right-click, if it blips away, right-click again ~1s later. Say
this plainly; do not pretend the first click works.
## The "Switch to logged-in view" task did NOTHING (v1.9.332)
John clicked the "Switch to logged-in view" jump-list task and nothing happened. Cause: the callback
`pup_wiki_set_view` short-circuited with `{unchanged:true}` (just `bringToFront`, NO reload)
whenever pup BELIEVED the window was already in the requested view. And pup makes wiki windows default
to `authed`, so it almost always believed "already logged in" → the click was a silent no-op. Worse,
pup's view belief is unreliable (the default-authed may never have actually signed the page in; a cookie
expired), so "do nothing because I think you're already there" is exactly the wrong call.
FIX: a real USER click (caller `aiThread: 'user-taskbar-menu'`, which every jump-list task carries via
`jarg`) must ALWAYS re-assert the requested view — fall through to the mint/navigate path, which is a
genuine reload that GUARANTEES the view (for `authed` it re-mints a magic link / auto-signs from AD's
desktop token, actually signing the page in). Only a PROGRAMMATIC same-view call keeps the `unchanged`
short-circuit. The task's own description promises a "harmless reload" — honor it. Detect the user click
by `_callerThread === 'user-taskbar-menu'` (the header the CLI sets from the task's JSON `caller`).
## How jump lists work (the parts that ARE correct)
- Tasks attach to the **AUMID**, so a per-session appId gives that window its own menu. Requires
`aumidIcons` ON (jump lists ride on the stamp) - see `pup-icon-consistency`.
- Commit MUST target the window by **hwnd**, not title (it was silently failing on title - see
`pup-window-targeting`). Pass `hwnd: session._hwnd`.
- Do NOT gate the commit on `_registeredPupAumids` - that set is filled only by
`desktop_register_app_identity`, a silent no-op on some AD builds, and it blocked EVERY commit
(v1.9.314). The window stamp already binds the AUMID; the commit works with just hwnd+appId+tasks.
- Tasks: wiki view-switch tasks (`jlViewTasks`, only on Adom wiki URLs) + a "Close ALL Adom Pup
windows" task (`jlCloseAll`). Each needs an `iconPath` or the row shows a blank document glyph.
- Real screenshots of the flyout can only be captured under a real pointer; an AD right-click opens
the Win11 TASK-VIEW THUMBNAILS, not the flyout. See the MOUSE-TAKEOVER section in `pup-bridge-dev`.