← Commit history
v0.16.64 (insiders): Save dialog for the password export is now pressed deterministically via UIA by window title every tick, independent of the slow Win32 scan that was missing the dialog and leaving the user staring at it (nb-bridge#55; proven on AdomLapper: UIA Invoke presses Save in ~300ms while SendInput is refused by Windows).
6 files changed
+20−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.63'; // keep in lockstep with package.json (pkg version)+const VERSION = '0.16.64'; // 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.63+0.16.64
bridge/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "native-browser", "displayName": "Adom Native Browser",- "version": "0.16.63",+ "version": "0.16.64", "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.63",+ "version": "0.16.64", "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+15@@ -3440,6 +3440,21 @@ async function exportSavedLogins(opts) { foundFile = newLoginCsvSince(watchSince, csvPath); if (foundFile) { saved = true; if (sawDialogAt) dialogVisibleMs = Date.now() - sawDialogAt; break; } + // DETERMINISTIC + FAST path. The instant the native save dialog exists, commit it through UIA by+ // WINDOW TITLE - no Win32 pre-scan, no SendInput, every tick (250ms). UIA Invoke goes through the+ // accessibility provider, which is immune to the input-queue contention that makes SendInput+ // "refused by Windows" on this machine. PROVEN on AdomLapper 2026-10-30: while the cursor marker+ // read "BLOCKED: input refused by Windows", desktop_ui_click {window:"Export Passwords",+ // name:"Save", role:"Button"} returned invoked:true in ~300ms and the CSV (155 logins) landed.+ // Firing it from the hwnd-independent window match means the dialog is answered within a frame of+ // appearing, so the user never sits staring at it - which is exactly what went wrong before: the+ // Save press was gated behind the 1.2s scan finding the hwnd, and that scan was missing the+ // "Export Passwords From Chrome" dialog, so Save was never pressed.+ const sv = await abCommand(null, 'desktop_ui_click', { window: 'Export Passwords', name: 'Save', role: 'Button',+ reason: 'nb-bridge#55: commit the export via UIA the instant the save dialog appears (SendInput is refused here, UIA is not)' }).catch(() => null);+ const svInvoked = (() => { try { const b = (sv && sv.body && (sv.body.data || sv.body)) || {}; return !!(b.invoked || b.success); } catch { return false; } })();+ if (svInvoked) { if (!sawDialogAt) { sawDialogAt = Date.now(); stage = 'dialog'; } fillTries++; }+ // Scan the real OS windows every ~1.2s (one PowerShell spawn) so the caption tracks the actual step, // including windows ab's own list omits because they are elevated. if (Date.now() - lastScan > 1200) {
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "nb-bridge",- "version": "0.16.63",+ "version": "0.16.64", "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.",