← Commit history

Composite taskbar badge: favicon + Adom mark, overlay-only branding (John's design). Overlays are the GENTLE branding path and are now ALLOWED in minimal-touch: SetOverlayIcon paints onto the EXISTING taskbar button, unlike an AppUserModelID change which makes Windows destroy and recreate that button (the invasive behaviour that fired repeatedly on SPAs). So minimal mode now stamps NO identity and builds NO jump list, but each window wears ONE composed badge: the page's own favicon as the dominant image (23x23 at 1,1 on a 32x32 rounded dark plate) with the Adom mark tucked into the lower-right on a dark disc for legibility at taskbar size. The .ico fast-path no longer bypasses compositing, so every badge carries the Adom mark.

John Lauer ·c650d791a7 ·3mo ago ·parent 201ebcf
4 files changed +33−15
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.9.190",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.190/adom-bridge-puppeteer-v1.9.190.zip",-  "sha256": "ab2ac17a0aa1757da99036fa9bba72c18197ed5bdd279abe3d156dba32b61391",-  "size": 423532,+  "version": "1.9.191",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.191/adom-bridge-puppeteer-v1.9.191.zip",+  "sha256": "d80a99b310f363a2a432e0e1d6f9d13bfff988a23cc1f9abccefdff2decf5734",+  "size": 424096,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.190+1.9.191
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.9.190",+  "version": "1.9.191",   "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+27−9
@@ -3684,11 +3684,11 @@ async function fetchPageFavicon(page) { } const _appOverlayCache = new Map(); // sessionId -> composited b64 async function applyAppOverlay(session, sessionId) {-  // v1.9.189 (John's taskbar audit): this favicon/app overlay path leaked past minimal-touch, so-  // windows opened in minimal mode wore a HALF-BRANDED button — plain Chrome icon (no AUMID stamp)-  // with a pup-applied favicon overlay on it. Inconsistent by construction. In minimal mode pup-  // paints NOTHING on the taskbar: the window is a plain Chrome window, end to end.-  if (minimalTouch()) return false;+  // v1.9.191 (John): overlays are the GENTLE branding path and are ALLOWED in minimal-touch.+  // ITaskbarList3::SetOverlayIcon paints a badge onto the EXISTING taskbar button; it never+  // destroys and recreates that button the way an AppUserModelID change does (which is what made+  // the old branding so invasive on SPAs that re-registered constantly). So in minimal mode pup+  // stamps NO identity and rebuilds NO jump list, but it DOES wear one composed badge per window.   if (process.platform !== 'win32' || _identitySupported !== true) return false;   try {     // v1.9.0: reflect the ACTIVE tab (John: favicons are more useful than counts — show what@@ -3729,8 +3729,8 @@ async function applyAppOverlay(session, sessionId) {       let sharpMod = null;       try { sharpMod = require('sharp'); } catch (e) { sharpMod = null; }       const isIco = /x-icon|vnd\.microsoft\.icon/.test(src.mime) || (src.href || '').endsWith('.ico');-      if (isIco && !plateAuthed) {-        overlay = src.b64; // AD accepts ico base64 directly; no compositing possible (sharp can't read ico)+      if (isIco && !sharpMod) {+        overlay = src.b64; // sharp unavailable AND .ico — pass through (no compositing possible)       } else if (!sharpMod) {         overlay = src.b64;       } else {@@ -3741,9 +3741,27 @@ async function applyAppOverlay(session, sessionId) {           if (!isIco) {             try { iconPng = await sharpMod(Buffer.from(src.b64, 'base64')).resize(22, 22, { fit: 'inside' }).png().toBuffer(); } catch (e) { iconPng = null; }           }+          // v1.9.191 (John's design): a TRULY BRANDED badge = the page's own favicon as the main+          // image, with the Adom mark tucked into the LOWER-RIGHT corner, so one glance says both+          // "this is that site" and "this is Adom driving it". Layout on the 32x32 badge (it renders+          // ~16px on the taskbar, so the corner mark gets a dark disc behind it to stay legible):+          //   plate  32x32 rounded dark+          //   favicon 23x23 at (1,1)      — dominant, upper-left biased+          //   disc    15x15 at (16,16)    — dark backing so the mark separates from busy favicons+          //   mark    12x12 at (17,17)    — the Adom leaves           const plate = Buffer.from(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect x="0" y="0" width="32" height="32" rx="8" fill="${plateFill}" fill-opacity="${plateAuthed ? '1' : '0.92'}"/></svg>`);           let img = sharpMod(plate).resize(32, 32);-          if (iconPng) img = img.composite([{ input: iconPng, gravity: 'centre' }]);+          const layers = [];+          if (iconPng) layers.push({ input: await sharpMod(Buffer.from(src.b64, 'base64')).resize(23, 23, { fit: 'inside' }).png().toBuffer(), top: 1, left: 1 });+          try {+            const markB64 = pupBadgeB64();+            if (markB64) {+              const disc = Buffer.from('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15"><circle cx="7.5" cy="7.5" r="7.5" fill="#0b2325"/></svg>');+              layers.push({ input: await sharpMod(disc).resize(15, 15).png().toBuffer(), top: 16, left: 16 });+              layers.push({ input: await sharpMod(Buffer.from(markB64, 'base64')).resize(12, 12, { fit: 'inside' }).png().toBuffer(), top: 17, left: 17 });+            }+          } catch (e) { /* no mark available — favicon-only badge still valid */ }+          if (layers.length) img = img.composite(layers);           overlay = (await img.png().toBuffer()).toString('base64');         } catch (e) { return false; }       }@@ -3758,7 +3776,7 @@ async function applyAppOverlay(session, sessionId) {     session._appOverlay = true;     // v1.9.150 (John: 'prove what overlay icon you're showing and why'): record the WHAT and WHY     // so list_windows can report it and test tables can prove it.-    try { session._overlayDesc = 'favicon:' + (src && src.href && src.href !== 'data:inline' ? new URL(src.href).hostname : 'inline-icon'); } catch (e) { session._overlayDesc = 'favicon'; }+    try { session._overlayDesc = 'favicon+adom:' + (src && src.href && src.href !== 'data:inline' ? new URL(src.href).hostname : 'inline-icon'); } catch (e) { session._overlayDesc = 'favicon+adom'; }     return true;   } catch (e) { return false; } }