← Commit history

Consistent toolbar icon order + more room for the ai-thread name. (1) The three Adom extension icons (Pup dots, Annotate pencil, Identity profile) were pinned in PARALLEL, so their completion order — and thus the toolbar layout — was random every launch; they are now pinned strictly SEQUENTIALLY in a fixed canonical order (Pup, Annotate, Identity LAST) so the Identity/profile icon always lands at the right end, closest to Chrome's own profile avatar, and the order is memorable and stable. (2) The toolbar popup header gave the owning ai-thread only a 116px, ellipsis-clipped slot that truncated names like pup-dashboard; the popup is wider (320px) and the ai-thread name is now the header's headline — it takes all leftover width, is bold and brighter, and wraps rather than clipping, because the owning thread is load-bearing info. Extension 0.2.8.

John Lauer ·f18f66cca4 ·2mo ago ·parent 061feb4
6 files changed +34−19
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "2.0.146",-  "url": "https://wiki.adom.inc/download/adom/pup-bridge/2.0.146/adom-bridge-puppeteer-v2.0.146.zip",-  "sha256": "b921b4a8add5a7b163e73731f13c4704da5fb39d1a014e726678a9c88fe0ed91",-  "size": 898291,+  "version": "2.0.147",+  "url": "https://wiki.adom.inc/download/adom/pup-bridge/2.0.147/adom-bridge-puppeteer-v2.0.147.zip",+  "sha256": "4d12772b7c9ce3873c858bf0319b2da3d6ff00264f91f1a9674cdd02f92bab52",+  "size": 898981,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-2.0.146+2.0.147
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "2.0.146",+  "version": "2.0.147",   "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. pup_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. pup_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, pup_alert_window posts a native toast whose click focuses the window, pup_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-bridge",   "author": "Adom Inc.",
src/extension/manifest.json+1−1
@@ -1,7 +1,7 @@ {   "manifest_version": 3,   "name": "Adom Pup",-  "version": "0.2.7",+  "version": "0.2.8",   "description": "Toolbar for Adom Pup browser windows: annotate, snip, view toggle, dashboard, owner info. Thin trigger surface - the pup bridge is the engine.",   "action": {     "default_popup": "popup.html",
src/extension/popup.html+11−6
@@ -15,18 +15,23 @@     --green: #3fb950;   }   body {-    margin: 0; width: 252px; background: var(--bg); color: var(--text-body);+    margin: 0; width: 320px; background: var(--bg); color: var(--text-body);     font: 400 13px 'Satoshi', sans-serif; border: 1px solid var(--border);   }   .hdr {     display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 12px;     border-bottom: 1px solid var(--border); background: var(--surface);   }-  .hdr svg.logo { width: 16px; height: 16px; color: var(--text); }-  .hdr .t { font: 600 13px 'Familjen Grotesk', sans-serif; color: var(--accent); }-  .hdr .owner { margin-left: auto; font-size: 11px; color: var(--text-2); max-width: 116px;-    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }-  .owner b { color: var(--yellow); font-weight: 500; }+  .hdr svg.logo { width: 16px; height: 16px; color: var(--text); flex: none; }+  .hdr .t { font: 600 13px 'Familjen Grotesk', sans-serif; color: var(--accent); flex: none; }+  /* v2.0.147 (John: "give the ai-thread name more room, this is turning out to be really+     important"). The owning ai-thread is now the headline: it takes ALL the leftover header width+     (flex:1, was a cramped 116px cap that truncated "pup-dashboard"), the thread name itself is+     bold+brighter, and it can wrap to a second line rather than ellipsis-clipping a name the user+     needs to read. */+  .hdr .owner { flex: 1; min-width: 0; margin-left: 6px; text-align: right; font-size: 11px;+    color: var(--text-2); line-height: 1.25; }+  .owner b { color: var(--yellow); font-weight: 600; word-break: break-all; }   .menu { padding: 6px; }   button.row {     display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
src/server.js+16−6
@@ -2898,15 +2898,25 @@ async function ensureExtensionsEnabled(browser, profileName) {         chrome.developerPrivate.updateProfileConfiguration({ inDeveloperMode: true }, () => {           chrome.developerPrivate.getExtensionsInfo((infos) => {             const adom = (infos || []).filter((i) => /^Adom /.test(i.name || ''));-            let pending = adom.length;-            if (!pending) return resolve({ ok: true, devMode: true, pinned: 0 });+            if (!adom.length) return resolve({ ok: true, devMode: true, pinned: 0 });+            // v2.0.147 (John: "be consistent on your icon order, users memorize these; profile+            // always at the RIGHT end, next to Chrome's own profile icon"). Chrome lays pinned+            // extension icons out in the ORDER THEY ARE PINNED; the old code pinned all three in+            // PARALLEL, so the completion order (and thus the toolbar order) was random every launch+            // — the exact inconsistency John saw. Fix: a FIXED canonical order — Pup (dots), then+            // Annotate (pencil), then Identity (profile) LAST so it lands rightmost — pinned strictly+            // SEQUENTIALLY (await each before the next) so the layout is deterministic every time.+            const rank = (n) => /^Adom Pup\b/.test(n) ? 0 : /^Adom Annotate\b/.test(n) ? 1 : /^Adom Identity\b/.test(n) ? 3 : 2;+            adom.sort((a, b) => rank(a.name || '') - rank(b.name || '') || String(a.name).localeCompare(String(b.name)));             let pinned = 0;-            adom.forEach((i) => {-              chrome.developerPrivate.updateExtensionConfiguration({ extensionId: i.id, pinnedToToolbar: true }, () => {+            const pinNext = (idx) => {+              if (idx >= adom.length) return resolve({ ok: true, devMode: true, pinned, total: adom.length, order: adom.map(a => a.name) });+              chrome.developerPrivate.updateExtensionConfiguration({ extensionId: adom[idx].id, pinnedToToolbar: true }, () => {                 if (!chrome.runtime.lastError) pinned++;-                if (--pending === 0) resolve({ ok: true, devMode: true, pinned, total: adom.length });+                pinNext(idx + 1);   // strictly sequential → deterministic toolbar order               });-            });+            };+            pinNext(0);           });         });       } catch (e) { resolve({ ok: false, why: e.message }); }