← Commit history

v0.16.45 (insiders): a session whose window was just closed no longer answers a tab list with an empty set (which read as 'no tabs' instead of 'the window is gone'): the window is verified before the query; extension 0.2.22

John Lauer ·30807560e7 ·13d ago ·parent d99ae4c
7 files changed +14−9
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.44';           // keep in lockstep with package.json (pkg version)+const VERSION = '0.16.45';           // 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.44\ No newline at end of file+0.16.45\ No newline at end of file
bridge/bridge.json+2−2
@@ -2,8 +2,8 @@   "manifest_version": 1,   "name": "native-browser",   "displayName": "Adom Native Browser",-  "version": "0.16.44",-  "expectedExtensionVersion": "0.2.21",+  "version": "0.16.45",+  "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",   "author": "Adom Inc.",
bridge/package.json+1−1
@@ -1,6 +1,6 @@ {   "name": "adom-native-browser-bridge",-  "version": "0.16.44",+  "version": "0.16.45",   "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",
extension/manifest.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 3,   "name": "Adom Native Browser Extension",   "short_name": "Adom",-  "version": "0.2.21",+  "version": "0.2.22",   "description": "Layer 2 of Adom Native Browser (nb): lets your Adom AI drive your real, signed-in Chrome or Edge, using your own logins.",   "minimum_chrome_version": "116",   "background": {
extension/src/native.js+7−2
@@ -807,13 +807,18 @@ export async function listTabs(args = {}) {   // A SESSION-SCOPED list must never widen to the whole profile. When the session's window is gone,   // querying every tab returned the USER's tabs instead, so nbrowser_state showed dead sessions as alive   // on whatever the user was reading (John's Gmail, caught by the battery 2026-10-21). Refuse instead.-  if (args.sessionId && windowId == null) {+  // The map can still hold a window that has just been closed (close_window -> list_tabs in the same+  // breath), and querying a dead windowId returns an EMPTY list, which reads as "this session has no+  // tabs" instead of "this session is gone". Verify the window is really there (battery, 2026-10-28).+  let windowGone = windowId == null;+  if (!windowGone) { try { await chrome.windows.get(windowId); } catch { windowGone = true; } }+  if (args.sessionId && windowGone) {     const e = new Error(`session '${args.sessionId}' has no live window (it was closed, or the browser restarted), so there are no tabs to list`);     e.errorCode = 'session_window_gone';     e.hint = "This is NOT the user's tabs - a session-scoped list never falls back to them. Open a new window with nbrowser_open_window, or drop the session. nbrowser_list_windows {mine:false} shows what is actually open.";     throw e;   }-  const tabs = await chrome.tabs.query(windowId != null ? { windowId } : {});+  const tabs = await chrome.tabs.query(!windowGone && windowId != null ? { windowId } : {});   const active = tabs.find((t) => t.active);   const owned = ownedWindowSet();   let out = tabs.map((t) => {
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "nb-bridge",-  "version": "0.16.44",+  "version": "0.16.45",   "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.",