← Commit history

The 'NOT foregrounded by Adom' caption: off-switch + can never linger again (John, rightly furious it stayed on his screen). Two fixes. (1) THE LINGER: the no-fault watch fires per-session, and rapid fires during activity all reused the caption id 'pup-nofault', each re-issue RESETTING AD's expiry timer so the 2s clamp never got to fire and the caption stayed up indefinitely. Now hard-deduped: at most one no-fault caption every 10s, so a re-issue storm can never hold it open; it always gets its 2 seconds and goes. (2) THE SETTING John asked for: new notMineCaption toggle, default ON (so he can see it for now) but he can turn it OFF to never show a not-foregrounded caption again; placed at the BOTTOM of the settings dialog since it is low importance. When off, the window is still marked foreground (iron law) but nothing is shown. Also force-cleared the stuck caption from his screen, and fixed a ralph badge assertion (the resurrection-guard fix from 1.9.281 actually WORKS - the badge now 404s - the test was mis-comparing the curl status).

John Lauer ·1dfe3dadf7 ·3mo ago ·parent b2e079b
4 files changed +18−7
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.9.281",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.281/adom-bridge-puppeteer-v1.9.281.zip",-  "sha256": "466b220386ab0f4e7ce9213b65aa927c042c9738031ea03660de1fad2b989054",-  "size": 712624,+  "version": "1.9.282",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.282/adom-bridge-puppeteer-v1.9.282.zip",+  "sha256": "0200b39cd13e7be8f4e459f1e7f36f470b319443a21f80c383fe2d766d138ea4",+  "size": 713017,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.281+1.9.282
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.9.281",+  "version": "1.9.282",   "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+12−1
@@ -2727,6 +2727,7 @@ function pupSettings() {   D.autoLogin = 'on'; D.reportIssues = 'on'; D.agentActivity = 'on';   // v1.9.275 (John: 'shouldn't there be a setting for whether to show the full jump list or not?')   D.jlViewTasks = 'on'; D.jlCloseAll = 'on';+  D.notMineCaption = 'on';   // v1.9.282 (John): the 'NOT foregrounded by Adom' caption, default on   if (_pupSettings.autoLogin === 'off' && !chosen.autoLogin) _pupSettings.autoLogin = 'on';   // v1.9.260 (John: "2s feels too fast cuz i can't read"): readable default. A stored 2000 was the   // old default, not a choice made in the dialog (it shipped hours ago) - migrate it up once.@@ -8739,6 +8740,7 @@ const SETTINGS_DEF=[  {k:'sleepRecovery',l:'Sleep and crash recovery',d:'After the laptop wakes or Chrome dies, automatically bring every pup window back at its last page, signed in. Never restarts a live Chrome.'},  {k:'autoLogin',l:'Auto-fill saved logins',d:'Fill (never submit) a matching saved login when a login page loads in a pup window.'},  {k:'reportIssues',l:'Issue-report hints',d:'Let pup invite AIs to file a wiki issue when they hit something broken.'},+ {k:'notMineCaption',l:'"Not foregrounded by Adom" caption',d:'Low importance. When a window comes to the front on its own (JavaScript, a focus change, Chrome, or your own click), briefly caption that Adom did NOT do it. Default on so you can see it; turn off once you trust that pup keeps windows in the background.'},  {k:'minimalTouch',l:'Minimal-touch mode',d:'The safety mode from the Chrome crash hunt. ON means pup keeps its hands off your windows: it only opens them and drives the pages inside, and skips the extra Windows machinery (identity stamps, window sweeps, shell churn) that was suspected of freezing Chrome. The toggles above are the real per-feature controls now and they win over this switch. Rule of thumb: leave this ON; if pup ever gets crashy, make sure it is ON and turn features back on one at a time to find the culprit.'}, ]; function renderDlg(){@@ -8941,6 +8943,7 @@ const server = http.createServer(async (req, res) => {             taskbarGrouping: ['split', 'grouped'],             aumidIconStyle: ['standard', 'category'],             jlViewTasks: ['on', 'off'], jlCloseAll: ['on', 'off'],+            notMineCaption: ['on', 'off'],           };           const key = String(a.key || ''); let val = a.value;           if (key === 'fgCaptionMs') {@@ -12921,7 +12924,15 @@ server.listen(PORT, BIND_HOST, async () => {           if (!s2._hwnd || String(fg) !== String(s2._hwnd)) continue;           s2._fgWatchUntil = 0;           s2._foreground = true;   // iron law: it is up, it stays up-          console.log(`[fg-watch] "${sid2}" surfaced to the foreground with no pup raise — captioning the no-fault notice (no knockback)`);+          // v1.9.282 (John, furious the caption lingered): (a) the whole caption is a user-toggle+          // (default on) - if off, mark foreground and move on, silently; (b) DEDUPE hard - the+          // watch fires per-session, and rapid fires all reused the id 'pup-nofault', each resetting+          // AD's expiry so the caption never got its 2s and stayed forever. At most one no-fault+          // caption every 10s, so it can NEVER be held open by a re-issue storm.+          if (pupSettings().notMineCaption !== 'on') break;+          if (Date.now() - (globalThis._lastNoFaultCaptionAt || 0) < 10000) break;+          globalThis._lastNoFaultCaptionAt = Date.now();+          console.log(`[fg-watch] "${sid2}" surfaced with no pup raise — no-fault caption (2s, deduped)`);           pupCaption(`This window was NOT foregrounded by Adom: JavaScript, a focus change, Chrome itself, or your own click raised "${sid2}". Not me!`, 2000, 'pup-nofault').catch(() => {});           break;         } catch (e) {}