@minhspark/codex-mcp-bridge 1.26.2 → 1.26.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-mcp-bridge",
3
- "version": "1.26.2",
3
+ "version": "1.26.4",
4
4
  "description": "Connect ChatGPT to your own Codex Desktop projects and conversations.",
5
5
  "author": {
6
6
  "name": "Bui Dang Minh"
package/CHANGELOG.md CHANGED
@@ -4,6 +4,33 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [SemVer](ht
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.26.4] - 2026-11-01
8
+
9
+ ### Fixed
10
+
11
+ - `codex-bridge-update` no longer stops with `UPDATE_SETUP_INCOMPLETE` / `WORKER_MCP_COLLISION` on machines with more than one Node.js installation. The Antigravity `worker-relay` entry is still recognised as the bridge's own when it launches this package's `background-relay-mcp.mjs` through another existing `node` / `node.exe`, matching how every other bridge MCP entry is checked. Entries that use a different script, a non-Node launcher, a missing executable, a URL, headers or embedded environment are still refused and left unchanged.
12
+
13
+ ### Upgrade
14
+
15
+ ```sh
16
+ npm exec --yes --ignore-scripts --package=@minhspark/codex-mcp-bridge@latest -- codex-bridge-update
17
+ ```
18
+
19
+ ## [1.26.3] - 2026-11-01
20
+
21
+ ### Fixed
22
+
23
+ - `antigravity_bridge_status` and `agent_bridge_status` now return their full status (version, caller, Desktop sidecar availability, CLI and outbound routes) as structured content. Previously the supervisor attached only its `autoReload` block as structured content, so clients that render structured content showed the reload state and hid whether the Antigravity sidecar was reachable.
24
+ - The supervisor no longer creates structured content for a status result that has none; it adds `autoReload` only to an existing structured object and always appends the reload summary to the text content.
25
+
26
+ ### Upgrade
27
+
28
+ ```sh
29
+ npm exec --yes --ignore-scripts --package=@minhspark/codex-mcp-bridge@latest -- codex-bridge-update
30
+ ```
31
+
32
+ Reconnect the `antigravity-bridge` MCP server in each open client after updating; the running supervisor keeps its old code until it restarts.
33
+
7
34
  ## [1.26.2] - 2026-11-01
8
35
 
9
36
  ### Upgrade
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minhspark/codex-mcp-bridge",
3
- "version": "1.26.2",
3
+ "version": "1.26.4",
4
4
  "description": "Connect Claude, Codex, and Antigravity through MCP, with native Desktop handoffs and bridge-owned Antigravity CLI sessions.",
5
5
  "keywords": [
6
6
  "mcp",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "codex-mcp-bridge",
4
- "version": "1.26.2",
4
+ "version": "1.26.4",
5
5
  "description": "Connect ChatGPT to your own Codex Desktop projects and conversations.",
6
6
  "author": {
7
7
  "name": "Bui Dang Minh",
@@ -25,7 +25,7 @@ import { removeRelayFile } from "../src/native-relay-files.mjs";
25
25
 
26
26
  exitForVersionRequest(import.meta.url);
27
27
 
28
- const VERSION = "1.26.2";
28
+ const VERSION = "1.26.4";
29
29
  const root = stableInstallPath(path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."));
30
30
  const entry = path.join(root, "src", "mcp-supervisor.mjs");
31
31
  const entryArgs = ["native-relay-companion.mjs"];
@@ -27,7 +27,7 @@ const sessions = new Map();
27
27
  let startingSessions = 0;
28
28
  const caller = process.env.ANTIGRAVITY_BRIDGE_CALLER;
29
29
  const senderRelay = new NativeDesktopRelay({ socketPath: desktopTaskSocketPath(), accountSocketPath: accountRelaySocketPath() });
30
- const result = (value) => ({ content: [{ type: "text", text: JSON.stringify(value, null, 2) }] });
30
+ const result = (value) => ({ content: [{ type: "text", text: JSON.stringify(value, null, 2) }], ...(value && typeof value === "object" && !Array.isArray(value) ? { structuredContent: value } : {}) });
31
31
  const schema = { requestId: z.string().uuid(), cwd: z.string().min(1), prompt: z.string().min(1).max(65536) };
32
32
  const reloadReason = () => startingSessions ? "Antigravity CLI sessions are still starting"
33
33
  : deliveries.active.size ? "Antigravity deliveries are still active"
@@ -18,7 +18,7 @@ import { bridgeDiagnostic, withBridgeDiagnostic, preflightFailure } from "./reci
18
18
  import { createReloadControl, exitWhenClientCloses } from "./reload-control.mjs";
19
19
 
20
20
  const { version } = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf8"));
21
- const result = (value) => ({ content: [{ type: "text", text: JSON.stringify(value, null, 2) }] });
21
+ const result = (value) => ({ content: [{ type: "text", text: JSON.stringify(value, null, 2) }], ...(value && typeof value === "object" && !Array.isArray(value) ? { structuredContent: value } : {}) });
22
22
  const targetSchema = { target: z.enum(["codex", "claude"]) };
23
23
  const taskSchema = { ...targetSchema, conversationId: z.string().uuid(), taskId: z.string().min(1).max(256).optional() };
24
24
 
@@ -120,9 +120,16 @@ function samePath(left, right, platform) {
120
120
  catch { return false; }
121
121
  }
122
122
 
123
+ function nodeLauncher(command, expected, platform) {
124
+ if (samePath(command, expected, platform)) return true;
125
+ if (typeof command !== "string" || !path.isAbsolute(command) || command.includes("\0")) return false;
126
+ if (!(platform === "win32" ? /^node\.exe$/i : /^node$/).test(path.basename(command))) return false;
127
+ try { return fs.statSync(command).isFile(); } catch { return false; }
128
+ }
129
+
123
130
  function ownedEntry(entry, expected, platform) {
124
131
  if (entry === undefined) return;
125
- if (!object(entry) || !samePath(entry.command, expected.command, platform)
132
+ if (!object(entry) || !nodeLauncher(entry.command, expected.command, platform)
126
133
  || !Array.isArray(entry.args) || entry.args.length !== 1 || !samePath(entry.args[0], expected.args[0], platform)
127
134
  || entry.type !== undefined && entry.type !== "stdio"
128
135
  || ["url", "serverUrl", "serverURL", "httpUrl", "headers", "oauth", "authProviderType"].some((key) => Object.hasOwn(entry, key))
@@ -31,7 +31,7 @@ import { BACKGROUND_WORKER_GUIDANCE, registerBackgroundTools } from "./backgroun
31
31
 
32
32
  exitForVersionRequest(import.meta.url);
33
33
 
34
- const VERSION = "1.26.2";
34
+ const VERSION = "1.26.4";
35
35
  void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
36
36
  const FORWARD_MIN_INTERVAL_MS = 5000;
37
37
  const FORWARD_MAX_PER_SESSION = 50;
package/src/index.mjs CHANGED
@@ -44,7 +44,7 @@ import { BACKGROUND_WORKER_GUIDANCE, registerBackgroundTools } from "./backgroun
44
44
 
45
45
  exitForVersionRequest(import.meta.url);
46
46
 
47
- const VERSION = "1.26.2";
47
+ const VERSION = "1.26.4";
48
48
  void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
49
49
  const log = (msg) => process.stderr.write(`[codex-mcp-bridge] ${msg}\n`);
50
50
 
@@ -236,7 +236,8 @@ export async function runSupervisor(entry, options = {}) {
236
236
  ready = true;
237
237
  }
238
238
  if (message.result && ["codex_bridge_status", "claude_bridge_status", "native_relay_status", "antigravity_bridge_status", "agent_bridge_status"].includes(pending.tool)) {
239
- message.result.structuredContent = { ...message.result.structuredContent, autoReload: diagnostics() };
239
+ const structured = message.result.structuredContent;
240
+ if (structured && typeof structured === "object" && !Array.isArray(structured)) message.result.structuredContent = { ...structured, autoReload: diagnostics() };
240
241
  message.result.content = [...(message.result.content ?? []), { type: "text", text: `automatic reload: ${diagnostics().state}\nsupervisor pid: ${process.pid}\nworker pid: ${worker.process.pid}\nreload count: ${reloads}\nrecovery count: ${recoveries}${reason ? `\nreload detail: ${reason}` : ""}` }];
241
242
  }
242
243
  output({ ...message, id: pending.id });
@@ -43,7 +43,7 @@ import { remoteCodexSocketPath, remoteNativeAdapter, remoteRequestResponse } fro
43
43
 
44
44
  exitForVersionRequest(import.meta.url);
45
45
 
46
- const VERSION = "1.26.2";
46
+ const VERSION = "1.26.4";
47
47
  const log = (msg) => process.stderr.write(`[native-relay] ${msg}\n`);
48
48
 
49
49
  function errorResponse(code, message, sent, details) {