← Commit history
bridge/BRIDGE_VERSION+1−1
@@ -1 +1 @@-0.1.51\ No newline at end of file+0.1.52\ No newline at end of file
bridge/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "native-browser",   "displayName": "Adom Browser Extension",-  "version": "0.1.51",+  "version": "0.1.52",   "expectedExtensionVersion": "0.1.3",   "description": "Drives the user's REAL signed-in Chrome/Edge. MOST verbs require the Adom extension installed in that browser profile (CDP driving: navigate/click/read/screenshot). TWO verbs need NO extension at all and work on any machine: nbrowser_open_os_window (open a URL in the user's real profile, background+flashing - the OAuth/consent path) and nbrowser_os_windows (enumerate browser windows). Also extension-free: nbrowser_profiles, nbrowser_wake_profile, nbrowser_force_close. The bridge binds an ephemeral loopback port and the native-messaging host pumps stdio <-> bridge.",   "homepage": "https://wiki.adom.inc/adom/adom-browser-extension",
bridge/package.json+1−1
@@ -1,6 +1,6 @@ {   "name": "adom-native-browser-bridge",-  "version": "0.1.51",+  "version": "0.1.52",   "private": true,   "description": "adom-desktop bridge for the Adom native-browser extension (Chrome + Edge)",   "main": "server.js",
bridge/server.js+10−2
@@ -2091,7 +2091,7 @@ function dispatch(verb, args) {         pending.delete(id);         resolve({ success: false, error: `verb ${verb} timed out`, _hint: 'extension did not reply in time' });       }, timeoutFor(verb));-      pending.set(id, { resolve, timer, verb, toFile: !!(args && args.toFile), profileKey: tgt.key, args });+      pending.set(id, { resolve, timer, verb, toFile: !!(args && args.toFile), profileKey: tgt.key, args, caller: currentCaller(), crossThreadWarn });       sock.write(JSON.stringify({ id, verb, args: args || {} }) + '\n');     };     // PIN the session to whatever profile this window opened in, so every later verb carrying this@@ -2117,6 +2117,14 @@ function dispatch(verb, args) { }  async function onHostFrame(frame) {+  // Re-enter the ORIGINATING caller's context: this reply arrives on the extension socket, outside the+  // HTTP request's async scope, so ALS is empty here. Without this, every badge paint / window-identity+  // / caption we fire from the reply path would forward "self" instead of the thread that asked.+  const _p0 = (frame && frame.id != null) ? pending.get(frame.id) : null;+  if (_p0 && _p0.caller) return callerCtx.run(_p0.caller, () => onHostFrameInner(frame));+  return onHostFrameInner(frame);+}+async function onHostFrameInner(frame) {   if (frame && frame.id != null && pending.has(frame.id)) {     const p = pending.get(frame.id);     clearTimeout(p.timer);@@ -2212,7 +2220,7 @@ async function onHostFrame(frame) {         if (payload.sessionId) touchBadge(payload.sessionId, p.profileKey);         else touchProfileBadge(p.profileKey);       }-      if (crossThreadWarn && payload && typeof payload === 'object') payload._concurrentAgents = crossThreadWarn;+      if (p.crossThreadWarn && payload && typeof payload === 'object') payload._concurrentAgents = p.crossThreadWarn;       const sid = payload && payload.sessionId;       logActivity({ verb: p.verb, sessionId: sid || null, thread: sessionThread.get(sid) || null, profile: p.profileKey || null, ok: payload && payload.ok !== false, errorCode: (payload && payload.errorCode) || null, ...(p._internal ? { internal: true } : {}) });       resolve_ok(p.resolve, payload);
native-browser-bridge-manifest.json+4−4
@@ -1,8 +1,8 @@ {   "manifest_version": 1,-  "version": "0.1.51",-  "url": "https://wiki.adom.inc/download/adom/adom-browser-extension/0.1.51/native-browser-bridge-v0.1.51.zip",-  "sha256": "02fa75c3af5cd3f4b4ff7cec6fdff66749d6a35edce356670add923f734072a0",-  "size": 98922,+  "version": "0.1.52",+  "url": "https://wiki.adom.inc/download/adom/adom-browser-extension/0.1.52/native-browser-bridge-v0.1.52.zip",+  "sha256": "87eb000def15054aec5d05f05b6b6d13f35d69f927380504fe93968a75236582",+  "size": 99127,   "released_at": "2026-07-25T00:00:00Z" }