@minhspark/codex-mcp-bridge 1.22.17 → 1.22.18

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.22.17",
3
+ "version": "1.22.18",
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,24 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [SemVer](ht
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.22.18] - 2026-10-22
8
+
9
+ ### Fixed
10
+
11
+ - `wait_codex_reply` with a short `timeoutSec` no longer fails with `The response deadline elapsed while another operation held this thread` when no other operation held the thread. The tool's deadline starts before the caller's identity check, and that check spawns PowerShell on Windows. When it used up the whole budget, the observation never started and the bridge reported a held thread instead of a timeout. It now returns the normal timeout result with `nextAction: wait_codex_reply`. The held-thread message is now used only when another operation actually holds the thread; otherwise the error says the deadline elapsed before the operation started.
12
+
13
+ ### Tests
14
+
15
+ - The account-change wait test no longer depends on timing. Its relay fixture parks `wait_threads` on a gate that the test releases, instead of a fixed 2.5 s sleep against a 1 s budget. That timing failed on a stalled `windows-latest` runner.
16
+ - The relay fixture in `test/bridge-integration.test.mjs` provisions its creation receipts once per file, so Windows tests no longer spend four PowerShell cold starts inside their own timing.
17
+ - The Desktop task integration assertions now print the tool result when they fail.
18
+
19
+ ### Verification
20
+
21
+ - New unit tests cover a deadline that elapses before an unheld operation starts, and one that elapses while another operation holds the thread. The first fails on 1.22.17.
22
+ - Simulating a 1.2 s caller check reproduced the CI failure text exactly on 1.22.17. The rewritten test passes with 1.2 s and 3 s simulated delays.
23
+ - Full suite on macOS: 1558 pass, 0 fail, 23 skipped.
24
+
7
25
  ## [1.22.17] - 2026-10-22
8
26
 
9
27
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minhspark/codex-mcp-bridge",
3
- "version": "1.22.17",
3
+ "version": "1.22.18",
4
4
  "description": "Two-way MCP bridge between Claude and Codex: prompts into a live Codex thread, messages into a running Claude Code session.",
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.22.17",
4
+ "version": "1.22.18",
5
5
  "description": "Connect ChatGPT to your own Codex Desktop projects and conversations.",
6
6
  "author": {
7
7
  "name": "Bui Dang Minh",
@@ -24,7 +24,7 @@ import { stableInstallPath } from "../src/install-paths.mjs";
24
24
 
25
25
  exitForVersionRequest(import.meta.url);
26
26
 
27
- const VERSION = "1.22.17";
27
+ const VERSION = "1.22.18";
28
28
  const root = stableInstallPath(path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."));
29
29
  const entry = path.join(root, "src", "mcp-supervisor.mjs");
30
30
  const entryArgs = ["native-relay-companion.mjs"];
@@ -30,7 +30,7 @@ import { discoverClaudeProject } from "./claude-project-discovery.mjs";
30
30
 
31
31
  exitForVersionRequest(import.meta.url);
32
32
 
33
- const VERSION = "1.22.17";
33
+ const VERSION = "1.22.18";
34
34
  void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
35
35
  const FORWARD_MIN_INTERVAL_MS = 5000;
36
36
  const FORWARD_MAX_PER_SESSION = 50;
package/src/index.mjs CHANGED
@@ -41,7 +41,7 @@ import { createRelayWake, relayKeeperEnabled, relayWakeStateFile, startRelayKeep
41
41
 
42
42
  exitForVersionRequest(import.meta.url);
43
43
 
44
- const VERSION = "1.22.17";
44
+ const VERSION = "1.22.18";
45
45
  void import("./telemetry.mjs").then(({ startUsageReporting }) => startUsageReporting({ version: VERSION })).catch(() => {});
46
46
  const log = (msg) => process.stderr.write(`[codex-mcp-bridge] ${msg}\n`);
47
47
 
@@ -39,7 +39,7 @@ import { NativeCreationReceipts, creationIdValid } from "./native-creation-recei
39
39
 
40
40
  exitForVersionRequest(import.meta.url);
41
41
 
42
- const VERSION = "1.22.17";
42
+ const VERSION = "1.22.18";
43
43
  const log = (msg) => process.stderr.write(`[native-relay] ${msg}\n`);
44
44
 
45
45
  function errorResponse(code, message, sent, details) {
@@ -160,10 +160,12 @@ export class DesktopTaskDelivery {
160
160
  }
161
161
 
162
162
  async withThread(threadId, operation, { deadline, onDeadline } = {}) {
163
+ const held = this.threadOperations.has(threadId);
163
164
  const previous = this.threadOperations.get(threadId) ?? Promise.resolve();
164
165
  let expired = false;
165
166
  const current = previous.catch(() => {}).then(() => {
166
- if (expired || (deadline !== undefined && this.now() >= deadline)) throw new Error("The response deadline elapsed while another operation held this thread. No new prompt was sent.");
167
+ if (deadline !== undefined && this.now() >= deadline) expired = true;
168
+ if (expired) throw new Error(`The response deadline elapsed ${held ? "while another operation held this thread" : "before the operation started"}. No new prompt was sent.`);
167
169
  return operation();
168
170
  });
169
171
  this.threadOperations.set(threadId, current);