Commit History

latest 1000 ← Back to Activity
Notched category tiles (John's idea): punch a transparent rounded notch into the UPPER-RIGHT of each pup category .ico so the favicon overlay AD paints there sits on the clean taskbar background instead of the busy teal art. Generated at bridge runtime (sharp, desktop-only) into a cache dir via a minimal PNG-frame ICO encoder (format validated); baked into the static tile so there's NO per-window/per-favicon churn, only a one-time re-stamp. pupIconPath serves the notched copy once built. Notch geometry (50% upper-right) tuned live.
John Lauer · 4359d4b · 6d ago
Taskbar favicon overlay fix (John: icons still wrong). ROOT CAUSE: the badge compositor decided ICO-vs-image by the favicon URL ending in .ico, but analyzeIconBytes had already re-encoded it to PNG, so icoLargestPng ran on PNG bytes, returned null, and dropped the favicon -> bare Adom mark (hit Google Docs and any .ico-suffixed favicon). Now sniffs the real magic bytes. SECOND bug: the generic-glyph fallback set src but never populated iconPng (which is the only thing the composite draws), so undecodable favicons also went mark-only; now it renders the glyph into iconPng and marks src.href generic so the LED shows amber, not a lying green.
John Lauer · 80077ee · 6d ago
Credential import goes LIVE against AD 1.9.220's desktop_decrypt_browser_credentials. Vault (credential_vault.js) now identity-tagged: keep BOTH on a (host,username) conflict from different source accounts, newest-wins within an identity, getCredentialForUrl picks by preferred identity then most-recently-used; passwords in keytar under per-entry composite accounts, index never holds a password (offline-tested). Dashboard Import button calls the decrypt helper LOCALLY (bridge->AD direct API, never relay), handles consent_declined/elevation_declined/relay_forbidden/helper_missing, merges rows, drops plaintext, returns counts only.
John Lauer · e68eb14 · 6d ago
Overlay drift fix: the favicon taskbar badge now recomputes on the NAVIGATION EVENT (framenavigated), not just on explicit mutating verbs. Any nav pup didn't initiate — JS redirect, meta refresh, form submit, SPA route change, OAuth bounce, in-tab link click, browser_login submit — previously left a STALE badge; now every navigation from any source re-triggers the recalc (debounced, honors overlayBadges pref, active/visible tab).
John Lauer · 5d20955 · 7d ago
Dashboard Settings: 'Import logins from Chrome/Edge' picker (adom-you seed). Reads browser_import_scan, lists every discovered profile with source-account identity tags + saved-login count + ABE lock, checkbox each (default all). Import button reports honest-pending until the AD-core elevated decrypt helper (adom/adom-desktop #51) lands.
John Lauer · 7cf9de0 · 7d ago
browser_import_scan: read-only discovery verb for the comprehensive credential import — enumerates every Chromium profile (Chrome/Edge/Brave) with source-account identity tag, saved-password count, and ABE status; foundation for the Settings import picker. Actual decryption is AD-core (adom/adom-desktop #51).
John Lauer · b54adcb · 7d ago
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 · ec3148e · 7d ago
Make GROUPED mode actually group by category (John: 'i like that you just group to each category icon'): with icon-style category, windows of the same category share one AUMID (Adom.Pup.<cat>) so you get up to 5 category buttons each wearing its category icon; standard style still collapses to one Adom Pup button. Previously grouped lumped every window under one button regardless. Updated the setting copy
John Lauer · 7c11c5e · 7d ago
Fix jump lists not clearing when toggled OFF (John: 'i turned off jump lists but still see them'): turning jumpLists off now commits an EMPTY task list to every window (removing the menu tasks); toggling jumpLists on or the sub-prefs forces a re-commit so changes show live. Wired jumpLists/jlViewTasks/jlCloseAll to refreshAllJumplists()
John Lauer · efb8844 · 7d ago
Correct the jump-list setting copy: remove the stale 'Windows 11 bug keeps tasks off the menu' claim (tasks appear now); note it requires AUMID on and the honest first-click-blip / right-click-again quirk
John Lauer · f2daff4 · 7d ago
Replace the fake jump-list settings screenshots with REAL ones: captured the actual Windows jump-list flyout (double right-click for the blip) showing the live tasks, and cropped it into jumplist.png (full menu), jlviewtasks.png (the two Switch-to-view rows), jlcloseall.png (the Close ALL task). The AUMID/grouping/icon-style screenshots are untouched
John Lauer · 5471f74 · 7d ago
Add pup-jumplist dev skill documenting the first-right-click blip John has reported ~10 times: a CommitList rebuilding the shown flyout, the 2nd-click workaround, and the fix (dedup on task-set, kill redundant re-commits)
John Lauer · 0a7a2a4 · 7d ago
Reduce the jump-list first-right-click blip: stop forcing a redundant CommitList ~1.6s after every stamp (jump lists live on the AUMID and were already committed at stamp time; the re-commit only gave the shell another chance to dismiss a just-opened flyout). Dedup-respecting now. Residual ~200-300ms blip is a shell/AD race (documented in dev-skills/pup-jumplist)
John Lauer · 05ccc24 · 7d ago
Dashboard shows wiki login state per wiki window (John: 'why doesn't the dashboard say if i'm logged in to the wiki'): each pup window on an Adom wiki URL now gets a 'wiki: signed in' (green) or 'wiki: public' (warn) badge, from the _wikiAuthed state pup already tracks
John Lauer · 0a403b5 · 7d ago
Add permanent dev skills for the recurring issues John keeps repeating: pup-window-targeting (target windows by hwnd never title; the wiggle is dead), pup-icon-consistency (why the dashboard keeps mismatching the taskbar and the rules), and the presence-gated screen-takeover protocol (notify if he is at the laptop, work non-stop if away, never a consent gate)
John Lauer · b252e47 · 7d ago
Wiki pages open LOGGED IN by default (John's request): for an Adom wiki URL with no wikiView, default to authed (auto-signs from the desktop token, no prompt); pass noAutoLogin:true (or wikiView:public) for the anonymous/public view. Hint tells the AI it was logged in by default and how to opt out
John Lauer · d0d37ee · 7d ago
Fix jump lists never committing: the registration guard required the appId in _registeredPupAumids, which is only filled by desktop_register_app_identity (a silent no-op on this AD build), so updateWikiJumplist returned before every commit and then dedup-skipped forever. Register best-effort, never block the commit; the window stamp already binds the AUMID and the commit works with hwnd
John Lauer · 8a7f8db · 7d ago
diag: log jump-list gate conditions to find why updateWikiJumplist returns before committing
John Lauer · a5296e6 · 7d ago
Fix jump lists not working: updateWikiJumplist resolved its hwnd by title (desktop_find_window titleContains) which is null when the title tag is off, so payload.hwnd was never set and the jump list never committed to the window. Use the reliable birth-time/persisted handle instead. The 'known Windows 11 bug' was this title lookup
John Lauer · c6efe29 · 7d ago
Stop the dashboard refresh blip: badge image URL was cache-busted with SNAP.ts (new every SSE tick) and served no-store, so every icon refetched a couple times a second. Version the badge URL by its actual paint time and make badge + tab-favicon endpoints cacheable, so icons only reload when they truly change
John Lauer · 0606237 · 7d ago
Recovered windows restore their persisted OS handle on the rescan adoption path too (not just recoverSessions), so a multi-window-profile window that lost its handle to a respawn goes green from the saved handle instead of red now that the wiggle is gone
John Lauer · 1192e30 · 7d ago
PERMANENT fix for title-based window lookup (John: stop duct-taping it): add windowTarget() helper that returns the validated HWND, and route every AD window OPERATION (park z-bottom, taskbar overlay/progress/badge, thumbnail, screenshot, focus) through it so hwnd is primary everywhere; titleContains survives only as a cold fallback. Also delete the destructive width-wiggle
John Lauer · 08efd83 · 7d ago
Delete the destructive width-wiggle: it shrank windows to a marker width to identify them and left one stuck narrow when the restore failed (deformed John's window). Handle resolution now uses only read-only signals (birth-time capture, persisted handle, sole-window-of-profile); a window none resolve is left bare rather than resized
John Lauer · 54095b0 · 7d ago
Fix AUMID stamp failing on windows without a title tag: stamp by resolved HWND (same handle the overlay paint + flash use) instead of only titleContains, which could not find the dashboard window (no ai-thread tag) so it never stamped when AUMID was turned on
John Lauer · 8d12708 · 7d ago
Fix dashboard-vs-taskbar mismatch (revert the wrong 1.9.298 assumption): with aumidIcons off, live pup windows wear the Chrome-for-Testing exe icon + pup overlay, NOT a teal tile (proven by flashing the live windows). The teal tiles on the taskbar are GHOST buttons from dead AUMID-stamped windows. Dashboard now draws the real Chrome-for-Testing base icon for un-stamped windows, teal only when actually stamped, so it matches the glass
John Lauer · acae037 · 7d ago
Fix sleep/wake window loss: the 8s reaper was racing sleep-recovery and killing recovered windows. On wake, rescan reattaches a page then prunes it as the dead pre-sleep tab, leaving the session at 0 tabs with _lostBrowser already cleared, so the reaper deleted it before the healer relaunched. Now: re-mark any post-prune empty session as lost + refresh its heal window; the reaper never reaps a session the healer is still trying to recover (until it explicitly gives up)
John Lauer · 674307a · 7d ago
Birth-time handle resolution: each new window is born at a unique off-screen position and its OS handle captured while off-screen and small (before park maximizes it), the only unambiguous moment for a same-profile window; the resolver trusts this birth handle ahead of all geometry heuristics. Finally resolves multi-window profiles the width-wiggle never could
John Lauer · d8f96da · 7d ago
Reliable wiggle-free handle resolution: a profile process with exactly one window resolves to that window directly (works on maximized windows, which the width-wiggle never could); multi-window profiles still leave bare rather than guess until birth-time resolution lands
John Lauer · b1b0e20 · 7d ago
Make window-handle resolution conservative (correct-or-bare, never wrong): raise the wiggle serialization timeout above the enumeration time so concurrent wiggles cannot collapse multiple windows onto one handle; use a distinctive narrow marker width real windows never sit at; verify the width actually applied; require EXACTLY ONE match or leave the window bare rather than paint a guessed/shared handle
John Lauer · 2da5b81 · 7d ago
Kill overlay drift at the source: one centralized debounced overlay re-sync now fires for every mutating verb (navigate/reload/back/forward/switch_tab/click/type/eval) plus close_tab/close_window, clearing the favicon cache and repainting via the ungated applyAppOverlay (refreshWindowChrome was a no-op under minimalTouch), without touching the cached handle so no routine verb triggers the wiggle
John Lauer · dd26efc · 7d ago
Fix window-handle desync + stuck regenerate: time-box the width-wiggle lock so a hung holder cannot deadlock the whole chain (was leaving every window hwnd=None); persist the resolved OS handle to the session file and restore+validate it on respawn so windows stop re-wiggling after every ship; regenerate button preempts a wedged busy flag, per-window timeouts, and always clears the flag
John Lauer · 0b20a31 · 7d ago
Add pup-browser-import dev skill: how to import a user's Chrome logins into pup, the App-Bound Encryption wall, the admin/SYSTEM path that defeats it, and the reverse-engineered Codex Desktop playbook (passwords import via admin, cookies blocked by device policy)
John Lauer · 7e3b93b · 7d ago
Regenerate-overlays button now runs the sweep in the background and answers instantly (dashboard icons update live via SSE); header shows regenerating/last-sweep status; per-window drift report logged
John Lauer · 66a912f · 7d ago
Dashboard taskbar strip now shows the teal pup tile for every pup window (matching the real taskbar) instead of Chrome's exe logo for un-stamped windows; add a Regenerate All Overlay Icons header button that re-runs the from-scratch overlay algorithm on every window and reports which windows drifted
John Lauer · 3560f9a · 7d ago
Fix missing taskbar overlay: hwndBelongsToPup now requires a real top-level visible Chrome_WidgetWin_1 frame, not just any window owned by the profile process. A stale same-process utility handle (18) was passing the pid-only check forever, so overlays painted onto a non-taskbar window and never appeared
John Lauer · 7a02804 · 8d ago
Fix duplicate tab on burst opens: the popup-tracker was double-attaching pup's own in-window window.open blanks (which addTabToSession already adopts); it now skips any tab tagged with the pupclaim_ window.name marker
John Lauer · ee5f322 · 8d ago
Fix in-window tab adoption: identify the window.open tab by a unique per-call window.name marker instead of set-difference, which under a burst of adds could adopt the wrong new target and duplicate tabs
John Lauer · 8abe88b · 8d ago
Fix orphaned about:blank tabs: adopt the window.open tab by target set-difference instead of a racy opener match, which used to leave a stray blank tab beside the real one whenever the anchor page was mid-navigation
John Lauer · 7fcb237 · 8d ago
Publish 1.9.293
John Lauer · 9d36378 · 8d ago
The 'NOT foregrounded by Adom' caption is OFF by default now (John reasoned it out: 'i alt+tab to your pup windows too... this feature is very likely not possible to correctly track my moves'). He is right on two counts: (1) input-timing is only a heuristic for 'did the user raise this window' - a click, alt+tab, or window-click are all recent input, but the 2.5s watch tick vs the 1.5s idle window means a late tick would wrongly caption his own action; (2) more fundamentally, Windows blocks background processes from stealing the foreground, so the JS/Chrome self-raise the feature exists to catch rarely reaches the foreground at all - meaning it mostly fired on HIS actions and seldom on real ones. So the honest default is off. Kept as an opt-in toggle (idle-gate retained for anyone who enables it); a non-chosen stored 'on' migrates to off.
John Lauer · 3a53864 · 8d ago
Publish 1.9.292
John Lauer · e3456f9 · 8d ago
The 'NOT foregrounded by Adom' caption now stays silent when JOHN raised the window (John: 'i tend to click the taskbar icon to bring the window to the foreground, then you show this message. i only want to see it if it was some other reason'). YES pup can differentiate: a taskbar click is recent USER INPUT the OS records (GetLastInputInfo); a JavaScript/Chrome self-raise has none. The no-fault watch now checks time-since-last-input before captioning - if input happened within the last 1.5s, it assumes the user raised it and stays silent; only a raise with NO recent input (genuinely not the user) gets the caption. Errs toward silence (a JS raise coinciding with the user typing elsewhere is also suppressed - the polite direction), so the caption never fires on his click while still catching real non-user raises. Setting kept ON with its description updated.
John Lauer · 10da42e · 8d ago
Serialize the width-wiggle resolution so it is actually unique (1.9.290 collapsed everything onto one hwnd because the enforcer fires resolves CONCURRENTLY - their width changes and window enumerations overlapped, so every session matched whichever window was momentarily at a marker width). A global lock now guarantees exactly one wiggle (set unique width -> enumerate -> restore) runs at a time, with the lock released on every path including the error path (hoisted release handle so the outer catch frees it - no deadlock).
John Lauer · 5fc8ab9 · 8d ago
Robust observer-proof window resolution via UNIQUE-WIDTH WIGGLE (finally kills the dup-hwnd bug for all windows, clean titles kept). With titleTag off, the transient-title approach was fought by each page's own title observer (un-disconnectable on pre-1.9.288 pages), so same-profile windows parked at the identical rect collapsed onto one hwnd. New approach: when the tag is off, pup gives the window being resolved a UNIQUE width via CDP Browser.setWindowBounds (pup controls this directly, no page script can fight it), matches the one OS window at that exact width, then restores - deterministic and unambiguous even for many same-profile windows. Guarded to never resize a foreground window the user is looking at (falls back to plain bounds there); the window is off-screen during most resolves so the width change is invisible. Title-tag-ON path still uses the exact persistent-tag find. Together with the reconciler's duplicate-hwnd self-heal (clears any shared cache to force re-resolve), every window binds to its own unique handle.
John Lauer · 118b092 · 8d ago
Duplicate-hwnd self-heal: the reconciler now detects any OS handle claimed by more than one live session and clears the cached hwnd on all of them, forcing each to re-resolve to its own unique window (reliable now that 1.9.288 stopped the tag-strip observer from fighting the transient resolution). This corrects stale wrong-hwnd caches that per-profile validation cannot catch (two windows of the same Chrome process), so John's wildlife-compare/haircut-review shared-handle case self-heals within a sweep instead of persisting. Verified: two fresh same-profile windows resolve to distinct handles.
John Lauer · dad513c · 8d ago
Publish 1.9.288
John Lauer · 1dd075e · 8d ago
Duplicate-hwnd root cause fully fixed: with clean titles (titleTag off), the injector had installed a MutationObserver that STRIPPED the tag on every title change, so pup's TRANSIENT resolution tag was removed before AD could find the window, collapsing two same-profile windows onto one hwnd via ambiguous geometry (John saw wildlife-compare and haircut-review, both adom-you, share a handle). Fixes: (1) when titleTag is off the injector no longer runs the stripping observer (it strips once, passively), so a transient tag survives the find; (2) the tag observer is now stored globally and the reconciler DISCONNECTS it on existing pages too, so already-open windows stop fighting without needing a navigation; (3) a _resolvingHwnd guard keeps the reconciler's title-strip from removing a transient tag mid-find. Combined with 1.9.287's per-profile hwnd validation, every window resolves to its own unique handle whether the title tag is on or off.
John Lauer · 8848cb6 · 8d ago
Publish 1.9.287
John Lauer · 18cede3 · 8d ago
Fix cross-session hwnd collision (John caught two windows on DIFFERENT profiles sharing one taskbar handle - wildlife-compare on adom-you was wrongly holding hero-studio's hwnd). Root cause: the 1.9.278 ownership guard only proved an hwnd was SOME pup window, not THIS session's window, so a stale/mis-resolved cached hwnd that happened to be another pup window passed validation forever and was never corrected - overlays then painted on the wrong button. Fix: hwndBelongsToPup now takes the session and validates the hwnd's owning pid (or parent) is in THAT session's OWN profile Chrome process; a cross-profile hwnd fails and forces an immediate re-resolve to the correct window. Applied at all three OS-op guards (overlay paint, flash, cached-hwnd reuse). This also surfaced under 1.9.286's clean-title transient resolution, which made mis-resolution more visible. Ralph gained a unique-hwnd guard (no two live windows may resolve to the same handle).
John Lauer · 85a08ee · 8d ago
Publish 1.9.286
John Lauer · 18f8d63 · 8d ago