← Commit history

v1.8.40: auto-badge pup windows with the white Adom leaves via AD-core desktop_taskbar (custom PNG overlay, AD >=1.9.106) — resolves the window by its (session: id) title, cross-process, on every open

John Lauer ·fe0644437f · ·parent 5165af5
5 files changed +38−7
adom-bridge-puppeteer-manifest.json+5−5
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.8.39",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.8.39/adom-bridge-puppeteer-v1.8.39.zip",-  "sha256": "766c0aa6a3d4ba0848122cca8946b07088a4224fdb5287f0a93047ba3713a53b",-  "size": 159297,+  "version": "1.8.40",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.8.40/adom-bridge-puppeteer-v1.8.40.zip",+  "sha256": "4217e689071649e74f357a30efe0eef4efc9e325c57186f842b370b8e4abc7bd",+  "size": 159883,   "verbPrefixes": [     "browser_",     "desktop_recorder_",@@ -12,5 +12,5 @@   ],   "healthEndpoint": "/status",   "statusVerb": "browser_readiness",-  "released_at": "2026-07-14T21:16:15Z"+  "released_at": "2026-07-14T21:56:32Z" }\ No newline at end of file
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.8.39+1.8.40
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.8.39",+  "version": "1.8.40",   "description": "Drives a browser ALREADY on the machine — installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) — 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 → Edge → 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, …). 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 — 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 — a separate bridge, not pup's job.",   "homepage": "https://wiki.adom.inc/adom/adom-desktop",   "author": "Adom Inc.",
src/chrome.js+1
@@ -817,4 +817,5 @@ module.exports = {   installChrome, ensureChromeReady, readiness, expectedBuildId, cacheDir, diskFreeMb,   setDefaultBrowser, readDefault, clearDefault, markVerified, pickSummary,   installChromeStable, chromeStableStatus, warmup,+  adCommand, // v1.8.40: reused by server.js to call AD verbs (e.g. desktop_taskbar) via the direct-API };
src/server.js+30
@@ -1520,6 +1520,30 @@ function osGetForegroundWindow() {   } catch (e) { return null; } } +// v1.8.40: badge each pup window's TASKBAR BUTTON with the white Adom leaves, so users can+// tell a pup-driven window from their own browser. Done via AD-core desktop_taskbar (custom+// PNG overlay, AD ≥1.9.106) — AD paints it cross-process natively; pup just hands over the+// art (an in-bridge SetOverlayIcon is in-process-only and can't badge the browser's window).+// We resolve the window by its "(session: <id>)" title suffix so AD finds the hwnd itself.+let _pupBadgeB64 = null;+function pupBadgeB64() {+  if (_pupBadgeB64 !== null) return _pupBadgeB64;+  try { _pupBadgeB64 = fs.readFileSync(path.join(__dirname, 'icons', 'pup-overlay-32.png')).toString('base64'); }+  catch (e) { _pupBadgeB64 = ''; }+  return _pupBadgeB64;+}+async function badgePupTaskbar(sessionId) {+  if (process.platform !== 'win32') return;+  const icon = pupBadgeB64();+  if (!icon) return;+  try {+    await chrome.adCommand('desktop_taskbar', {+      titleContains: `(session: ${sessionId}`,+      overlay: { icon, tooltip: 'Adom pup — driven from the cloud' },+    }, { timeoutMs: 6000 });+  } catch (e) {}+}+ // NOTE: taskbar badge/overlay is an AD-CORE capability (desktop_taskbar, AD ≥1.8.152) — the // nbrowser_* extension uses it and AD does the cross-process work natively. pup must NOT // reimplement it (an in-bridge ITaskbarList3::SetOverlayIcon is in-process-only and fails on@@ -3100,6 +3124,12 @@ const server = http.createServer(async (req, res) => {             recordAgentUpdate(session, 'browser_open_window', args, session.activeTabId);             if (!foreground) scheduleAutoFlash(session, { silent: !!args.silent });           }+          // v1.8.40: badge the taskbar button with the Adom leaves (once the window + its+          // "(session: id)" title suffix exist and AD can enumerate it). Fire-and-forget ++          // one retry, via AD-core desktop_taskbar. Never blocks the open response.+          if (process.platform === 'win32') {+            for (const d of [1500, 3500]) setTimeout(() => { badgePupTaskbar(sessionId).catch(() => {}); }, d);+          }           // Verbose browser report: which browser we actually drove, what else is available.           const brep = browserPickReport();           const bgHint = foreground