← Commit history

v0.16.48 (insiders): nb-bridge#55: UI-automation Invoke on Chrome's own page button reports success without actuating (no Hello, no dialog, measured), so the export now verifies by outcome and falls back to a real click on the button's rect

John Lauer ·7240136349 ·13d ago ·parent 9271689
6 files changed +27−5
bin/nb-dashboard+1−1
@@ -20,7 +20,7 @@ const { execFile, spawn } = require('child_process'); const fs = require('fs'); const crypto = require('crypto'); -const VERSION = '0.16.47';           // keep in lockstep with package.json (pkg version)+const VERSION = '0.16.48';           // keep in lockstep with package.json (pkg version) // SEND TO AI IS UN-PARKED (John: "yeah, we are re-enabling the send to ai. it seems to be good now"). // The ah build thread certified the crash family dead on the gate-fixed build and the delivery leg is // proven end to end. The park const is DELETED rather than flipped, so no dead branch can resurrect it.
bridge/BRIDGE_VERSION+1−1
@@ -1 +1 @@-0.16.47\ No newline at end of file+0.16.48\ No newline at end of file
bridge/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "native-browser",   "displayName": "Adom Native Browser",-  "version": "0.16.47",+  "version": "0.16.48",   "expectedExtensionVersion": "0.2.22",   "description": "Drives the user's REAL signed-in Chrome/Edge, in two layers. Layer 1 (nb) needs NOTHING installed and works on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing, the OAuth/consent path), nbrowser_os_windows, nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. Layer 2 (nbe, the Adom Native Browser Extension) unlocks the rest: CDP driving (navigate/click/read/screenshot) inside their logged-in profile. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.",   "homepage": "https://wiki.adom.inc/adom/nb-bridge",
bridge/package.json+1−1
@@ -1,6 +1,6 @@ {   "name": "adom-native-browser-bridge",-  "version": "0.16.47",+  "version": "0.16.48",   "private": true,   "description": "Native-browser bridge for Bridge (ab): layer 1 (nb) plus layer 2 via nbe, the Adom Native Browser Extension (Chrome + Edge).",   "main": "server.js",
bridge/server.js+22
@@ -3183,6 +3183,28 @@ async function exportSavedLogins(opts) {     const okr = r && r.body && (r.body.success !== false);     if (okr) { invoked = name; break; }   }+  // UIA Invoke on a Chrome PAGE button reports success and does nothing (measured here 2026-10-29: the+  // click "succeeded", no Hello, no dialog, 200s of waiting). Same trap as the Load-unpacked picker. So+  // verify by OUTCOME: if no new dialog appears, find the button's rect and send a REAL click. The window+  // is foregrounded for that moment, which is honest here - we are asking the user to authenticate.+  if (invoked) {+    await _sleep(2500);+    const after = await abCommand(null, 'desktop_list_windows', {}).catch(() => null);+    const rows = (() => { try { return (after.body.data || after.body).windows || []; } catch { return []; } })();+    const dialogUp = rows.some((w) => w.className === '#32770' || /windows security|windows hello|verify your identity/i.test(String(w.title || '')));+    if (!dialogUp) {+      const f = await abCommand(null, 'desktop_find_control', { hwnd, contains: 'Download file' }).catch(() => null);+      const rect = (() => { try { const b = f.body.data || f.body; return (b.best || b.match || {}).rect || null; } catch { return null; } })();+      if (rect) {+        await abCommand(null, 'desktop_bring_to_front', { hwnd, reason: 'nb-bridge#55: the page button needs a real click; the user is about to be asked to authenticate' }).catch(() => {});+        await _sleep(400);+        await abCommand(null, 'desktop_click', { x: rect.centerX, y: rect.centerY, reason: 'nb-bridge#55: start the browser\'s own password export (UIA invoke did not actuate)' }).catch(() => {});+        steps.push(step('clicked Download file for real (UIA invoke did not actuate)', true));+      } else {+        steps.push(step('could not locate the Download file button to click for real', false));+      }+    }+  }   if (!invoked) {     const shot = await abCommand(null, 'desktop_screenshot_window', { hwnd, reason: 'nb-bridge#55: the export control was not found' }).catch(() => null);     const sp = (shot && shot.body && (shot.body.localSafePath || shot.body.safePath || shot.body.fullPath)) || null;
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "nb-bridge",-  "version": "0.16.47",+  "version": "0.16.48",   "type": "app",   "title": "NB - Native Browser Bridge",   "description": "This package installs the SKILLS into your container so your AI knows how to drive your real signed-in Chrome and Edge; Bridge loads the bridge runtime itself from the release zip.",