← Commit history

OVERLAYS ARE NOW ENFORCED, not fire-and-forget (John: 'the whole point here is to get you to finally create overlay icons correctly cuz you still aren't doing it right. the fact that you still seem to not ensure there are overlay icons is infuriating'). Root causes of bare taskbar buttons: an overlay paint that failed transiently (window not yet resolvable by hwnd, favicon not loaded, AD busy) was NEVER retried, and a bridge restart wiped the painted state, so windows that once wore a badge sat bare afterwards. The 15s health sweep now re-applies the overlay to ANY session not currently wearing one, with a 60s per-session cooldown, and logs each enforcement. Also: the dashboard strip's window-count badge moved to BOTTOM-LEFT because it was sitting exactly on the top-right overlay corner, covering the very thing the mimic exists to show; and _curAppId (a window's stamped AUMID) is now persisted in the session file and restored on recovery, because it drives real-taskbar grouping (a stamped window keeps its OWN button until close) and losing it across restarts made the dashboard mimic diverge from the real taskbar.

John Lauer ·0869863077 ·2mo ago ·parent f58a56e
4 files changed +27−7
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.9.235",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.235/adom-bridge-puppeteer-v1.9.235.zip",-  "sha256": "f02619d369adcee7f45746a2938f90793e4de73ad9b78a18c01571548e6b15ef",-  "size": 457962,+  "version": "1.9.236",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.236/adom-bridge-puppeteer-v1.9.236.zip",+  "sha256": "f81df210f3e88771d0141ea550a89cb5cc10c3ab91265233024cb61d338cfba8",+  "size": 458434,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.235+1.9.236
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.9.235",+  "version": "1.9.236",   "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. browser_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. browser_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, browser_alert_window posts a native toast whose click focuses the window, browser_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.",   "homepage": "https://wiki.adom.inc/adom/adom-desktop",   "author": "Adom Inc.",
src/server.js+21−1
@@ -1047,6 +1047,7 @@ function saveSessionFile(sessionId, profileName, url) {     // biggest "pup windows don't behave / keep vanishing" driver (John, 2026-07-29). The flag is set     // by a granted raise OR by pup OBSERVING the user foreground the window themselves (taskbar click).     foreground: !!((sessions.get(sessionId) || {})._foreground),+    curAppId: ((sessions.get(sessionId) || {})._curAppId) || null,     // v1.9.197 BUG 4 (Bills thread): owner was NEVER written here, so every bridge restart erased it     // and browser_list_windows reported owner:null for every session — silently disabling the     // session_owned_by_another_thread protection that owner is supposed to back.@@ -1712,6 +1713,7 @@ async function recoverSessions() {       // park below yanked a window the user was actively using to the bottom (John, 2026-07-29).       if (sf.foreground) { session._foreground = true; session._userActiveAt = Date.now(); }       if (sf.owner) session.owner = sf.owner;   // v1.9.197 BUG 4: restore ownership across restarts+      if (sf.curAppId) session._curAppId = sf.curAppId;   // v1.9.236: stamped AUMID survives restart (drives real-taskbar grouping)       // v1.9.202 (John's icon audit): a recovered window came back with NO taskbar badge. Under       // minimalTouch the overlay is applied only on OPEN and NAVIGATE, and the re-stamp sweeps that       // used to cover recovery are gated off — so every bridge restart left surviving windows bare@@ -7900,7 +7902,7 @@ select,input{background:#111b23;color:#e6edf3;border:1px solid #23303c;border-ra .tbi.fg{border-color:#12e0c4} .tbi img.base{width:30px;height:30px;object-fit:contain} .tbi img.ov{position:absolute;top:1px;right:1px;width:17px;height:17px;object-fit:contain;border-radius:4px}-.tbi .n{position:absolute;top:-6px;right:-6px;background:#12e0c4;color:#06282a;font-size:10px;font-weight:700;border-radius:8px;min-width:16px;height:16px;line-height:16px;text-align:center;padding:0 3px}+.tbi .n{position:absolute;bottom:-6px;left:-6px;background:#12e0c4;color:#06282a;font-size:10px;font-weight:700;border-radius:8px;min-width:16px;height:16px;line-height:16px;text-align:center;padding:0 3px} .tbi .u{position:absolute;bottom:2px;left:50%;transform:translateX(-50%);width:16px;height:3px;border-radius:2px;background:#12e0c4}  /* tree */@@ -12017,6 +12019,24 @@ server.listen(PORT, BIND_HOST, async () => {         _healingIds.delete(sid);       }     }+    // (2b) OVERLAY ENFORCEMENT (v1.9.236, John: 'the whole point here is to get you to finally+    // create overlay icons correctly... you still seem to not ensure there are overlay icons').+    // An overlay is not fire-and-forget: paints fail transiently (window not yet resolvable, favicon+    // not loaded, AD busy) and were never retried, and a bridge restart wiped the painted state, so+    // real taskbar buttons sat BARE. Every sweep, any session without a painted overlay gets one+    // re-applied, with a 60s per-session cooldown so a genuinely unpaintable window is retried+    // gently instead of hammered.+    try {+      for (const [sid2, s2] of [...sessions]) {+        if (s2._appOverlay) continue;+        const last = s2._overlayEnforceAt || 0;+        if (Date.now() - last < 60000) continue;+        s2._overlayEnforceAt = Date.now();+        applyAppOverlay(s2, sid2).then(okp => {+          if (okp) console.log(`[overlay] "${sid2}" ENFORCED (was bare) — every pup window must wear its overlay`);+        }).catch(() => {});+      }+    } catch (e) {}     // (3) USER-ACTIVITY WATCHER + STUCK-OCCLUSION check (v1.9.180/181). One OS foreground read per     // tick. When the foreground IS a pup window: (a) stamp it user-active + foreground (PERSISTED),     // so no park/recovery/adoption path ever demotes a window the user chose to bring up — the