← Commit history
v0.16.16 (insiders): Toolbar icon: 'auto' resolves to a packaged toolbar.json ({toolbarIcon:on}) when the host that loads the extension ships one (pup), so pup's window can show the pinned nbe icon while a user's own browser keeps the unpinned default without any desktop-wide change; nbrowser_status reports toolbarIcon and toolbarIconEffective. Extension 0.2.12.
8 files changed
+28−12
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.15'; // keep in lockstep with package.json (pkg version)+const VERSION = '0.16.16'; // 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.15+0.16.16
bridge/bridge.json+2−2@@ -2,8 +2,8 @@ "manifest_version": 1, "name": "native-browser", "displayName": "Adom Native Browser",- "version": "0.16.15",- "expectedExtensionVersion": "0.2.11",+ "version": "0.16.16",+ "expectedExtensionVersion": "0.2.12", "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.15",+ "version": "0.16.16", "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.11",+ "version": "0.2.12", "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/sw.js+17−4@@ -22,11 +22,24 @@ const VERSION = chrome.runtime.getManifest().version; // launcher that owns the profile (pup) sets. This switch decides what the pinned slot SHOWS. const ICON_DEFAULT = { 16: 'icons/icon16.png', 48: 'icons/icon48.png', 128: 'icons/icon128.png' }; const ICON_BLANK = { 16: 'icons/blank16.png', 48: 'icons/blank48.png' };-let _toolbarIcon = 'auto';+let _toolbarIcon = 'auto', _toolbarEffective = 'auto', _packagedDefault = null;+// PACKAGED DEFAULT: a host that copies this extension into its own profile (pup) can drop a toolbar.json+// next to the manifest, {"toolbarIcon":"on"}, and 'auto' then resolves to that. So pup's window shows the+// icon while John's own browser, loaded from the plain folder, keeps Chrome's unpinned default; no+// desktop-wide setting has to change for one host. The user's explicit on/off (nbrowser_settings) still wins.+async function packagedDefault() {+ if (_packagedDefault !== null) return _packagedDefault;+ try { const r = await fetch(chrome.runtime.getURL('toolbar.json')); const j = r.ok ? await r.json() : null; _packagedDefault = (j && ['on', 'off'].includes(j.toolbarIcon)) ? j.toolbarIcon : ''; }+ catch { _packagedDefault = ''; }+ return _packagedDefault;+} async function applyToolbarIcon(mode) { mode = ['auto', 'on', 'off'].includes(mode) ? mode : 'auto'; _toolbarIcon = mode; try { await chrome.storage.local.set({ nb_toolbar_icon: mode }); } catch {}+ const effective = mode === 'auto' ? ((await packagedDefault()) || 'auto') : mode;+ _toolbarEffective = effective;+ mode = effective; try { if (mode === 'off') { await chrome.action.setIcon({ path: ICON_BLANK });@@ -47,7 +60,7 @@ async function applyToolbarIcon(mode) { } } } catch (e) { /* action API missing (no action in manifest) or a race on startup: harmless */ }- return { ok: true, toolbarIcon: mode };+ return { ok: true, toolbarIcon: _toolbarIcon, effective: _toolbarEffective }; } (async () => { try { const { nb_toolbar_icon = 'auto' } = await chrome.storage.local.get('nb_toolbar_icon'); await applyToolbarIcon(nb_toolbar_icon); } catch {} })(); @@ -191,7 +204,7 @@ async function dispatch(verb, args) { // --- meta ------------------------------------------------------------- case 'nbrowser_status': { const own = native.ownershipSummary(); // dirty_session nag: surfaced while owned/spawned windows remain- return { ok: true, ext: 'nbe', version: VERSION, engine: 'native', browser: detectBrowser(), toolbarIcon: _toolbarIcon, ownedWindows: own.ownedWindows, spawnedWindows: own.spawnedWindows, sessions: own.sessions, _hint: own._nag };+ return { ok: true, ext: 'nbe', version: VERSION, engine: 'native', browser: detectBrowser(), toolbarIcon: _toolbarIcon, toolbarIconEffective: _toolbarEffective, ownedWindows: own.ownedWindows, spawnedWindows: own.spawnedWindows, sessions: own.sessions, _hint: own._nag }; } case 'nbrowser_whoami': { // Force a fresh Google-email resolve + RE-announce, so the bridge re-keys this connection to@@ -210,7 +223,7 @@ async function dispatch(verb, args) { // Pushed by the bridge on every hello and whenever nbrowser_settings changes. const r = {}; if (args && args.toolbarIcon !== undefined) Object.assign(r, await applyToolbarIcon(String(args.toolbarIcon)));- return { ok: true, applied: r, toolbarIcon: _toolbarIcon };+ return { ok: true, applied: r, toolbarIcon: _toolbarIcon, toolbarIconEffective: _toolbarEffective }; } case 'nbrowser_dev_reload': { // HARD-GATED. chrome.runtime.reload() restarts the SW, which re-launches the native host. This is
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "nb-bridge",- "version": "0.16.15",+ "version": "0.16.16", "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.",
skills/driving-the-extension/SKILL.md+4−1@@ -303,7 +303,10 @@ This is **not** screenshot→eyeball-a-pixel→click automation, so it does **no loads into its own window, so a pinned nbe shows a live Adom presence there. `off` is a transparent icon and a disabled action. An extension cannot pin itself; pinning is the profile's `extensions.pinned_extensions` preference (the nbe's id is `nncjgceobmlenfliamnibncjojpedbcc`, fixed by the manifest key), set by whoever- owns the profile. The bridge pushes the setting to every connected extension on hello and on change.+ owns the profile. The bridge pushes the setting to every connected extension on hello and on change. A host that copies the+ extension into its own profile (pup) drops `toolbar.json` `{"toolbarIcon":"on"}` next to the manifest and+ `auto` resolves to it there (ext 0.2.12), so pup's window shows the icon while the user's own browser keeps+ the unpinned default; `nbrowser_status` reports both `toolbarIcon` and `toolbarIconEffective`. - **Taskbar badge and progress on a COMBINED taskbar (2026-09-04, proven at native resolution on ConfRoomROG):** ab paints the Adom badge and the progress bar correctly (a KiCad button showed both), but a Chrome or Edge GROUP button shows only its most recently ACTIVE window's overlay and progress, and