← Commit history

1.8.77: pup provisions its own CfT at every spawn regardless of installed browsers; AD prewarm policy uninvolved, #204 withdrawn

John Lauer ·fdfa2d92f9 · ·parent eadbb5e
6 files changed +41−11
CHANGELOG.md+11
@@ -1,5 +1,16 @@ # Changelog — Adom Desktop Puppeteer Bridge +## 1.8.77 — 2026-07-18 — pup owns its own provisioning: warmup ALWAYS ensures CfT++John: "isn't that your decision? why would you need AD to change anything?" Correct — the+skip-CfT-when-Chrome-exists policy was the dead installed-browser-first doctrine living on in+pup's OWN warmup(). Now warmup (runs at every bridge spawn = AD install/update + machine start)+background-fetches CfT whenever it isn't cached, regardless of installed browsers — so a fresh+box provisions pup's browser at INSTALL time and the first "open in pup" never waits. Low-disk+guard unchanged. AD's job ends at "pup is installed"; no AD policy involved (issue #204+withdrawn — resolved pup-side; AD's v1.9.76 prewarmer is redundant for pup and the install+singleton dedupes if both fire).+ ## 1.8.76 — 2026-07-18 — Icon glyph tucked into the corner (clear gap from the leaves)  1.8.75's browser glyph touched the dark leaf and blended into it. The glyph is now smaller and
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.8.76",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.8.76/adom-bridge-puppeteer-v1.8.76.zip",-  "sha256": "3edcd783a95f5ff4e539eca1058697402977e345f0b3064050e78be88e137b9a",-  "size": 189687,+  "version": "1.8.77",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.8.77/adom-bridge-puppeteer-v1.8.77.zip",+  "sha256": "cca221788b02d23db70b4efb49407cfbf1bf5588838b2c80d2a1dbcd1e48dd79",+  "size": 190127,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
dev-skills/pup-bridge-dev/SKILL.md+7
@@ -494,6 +494,13 @@ from the user's browser.**    With CfT the pup window is a distinct binary (plus the teal taskbar badge), so "this is the AI's    sandbox, not my browser" is legible at a glance. +**Provisioning ownership (v1.8.77):** pup provisions its OWN browser. `chrome.warmup()` at every+bridge spawn ensures CfT is cached (background fetch, low-disk guarded) — regardless of what+branded browsers exist. Do NOT ask AD to carry prewarm policy for pup (issue #204 was withdrawn+for this reason): AD's job ends at "the bridge is installed"; the bridge's browser is the+bridge's business. If a first open ever waits on chrome_for_testing_installing, the warmup was+skipped or failed — check the [warmup] log line, don't add AD policy.+ **Ecosystem map (who owns what):** pup = anonymous sandboxed automation (CfT ideally). abe (nbrowser_*) = the user's REAL signed-in browser, for anything needing their sessions/identity. `desktop_open_url` = plain native OS launch, no automation, the right tool for "just open this for
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.8.76\ No newline at end of file+1.8.77\ No newline at end of file
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.8.76",+  "version": "1.8.77",   "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.",   "homepage": "https://wiki.adom.inc/adom/adom-desktop",   "author": "Adom Inc.",
src/chrome.js+17−5
@@ -808,15 +808,27 @@ function chromeStableStatus() { return { ...chromeStableState, inFlight: !!_chro // cached CfT — the only case that would otherwise force a mid-open download — start // fetching CfT NOW in the background (guarded on disk) so the user doesn't wait later. function warmup() {+  // v1.8.77: pup OWNS its browser provisioning (John: "isn't that your decision? why would+  // you need ad to change anything?"). CfT is pup's browser, PERIOD (demarcation doctrine),+  // so warmup ensures it exists on EVERY box — not only browser-less ones. The old+  // skip-when-Chrome-exists logic here was the dead installed-browser-first doctrine living+  // on in pup's own code. warmup runs at every bridge spawn (AD install/update, machine+  // start), so a fresh box downloads CfT in the background at INSTALL time and the user's+  // first "open in pup" finds it cached — no first-use wait, no AD policy involved.+  // AD's job ends at "pup is installed"; the rest is ours. (Its v1.9.76 prewarmer policy is+  // now redundant for pup either way — the install singleton dedupes if both fire.)   try {     const cands = launchCandidates();     const free = diskFreeMb();-    console.log(`[warmup] browsers: ${cands.map(c => `${c.kind}(${c.source})`).join(', ') || 'NONE'} | disk free: ${free == null ? '?' : free + 'MB'}`);-    if (!cands.length) {-      if (free != null && free < CFT_MIN_FREE_MB) { console.log(`[warmup] no browser + low disk (${free}MB) — NOT auto-fetching CfT; readiness reports lowDisk`); return; }-      console.log('[warmup] no Chrome/Edge and no cached CfT — background-fetching Chrome for Testing now so the first open is instant');-      ensureChromeReady({ background: true });+    const cft = detectChrome();+    console.log(`[warmup] browsers: ${cands.map(c => `${c.kind}(${c.source})`).join(', ') || 'NONE'} | cft cached: ${cft.installed} | disk free: ${free == null ? '?' : free + 'MB'}`);+    if (cft.installed) return; // pup's browser is ready — nothing to do+    if (free != null && free < CFT_MIN_FREE_MB) {+      console.log(`[warmup] CfT missing + low disk (${free}MB) — NOT auto-fetching; readiness reports lowDisk and opens will surface the disk hint`);+      return;     }+    console.log('[warmup] Chrome for Testing (pup\'s browser) not cached — background-fetching now so the first open never waits');+    ensureChromeReady({ background: true });   } catch (e) { console.error(`[warmup] ${e && e.message}`); } }