oh-my-codex 0.21.19 → 0.21.20

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.
package/Cargo.lock CHANGED
@@ -32,7 +32,7 @@ checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
32
32
 
33
33
  [[package]]
34
34
  name = "omx-api"
35
- version = "0.21.19"
35
+ version = "0.21.20"
36
36
  dependencies = [
37
37
  "serde",
38
38
  "serde_json",
@@ -40,14 +40,14 @@ dependencies = [
40
40
 
41
41
  [[package]]
42
42
  name = "omx-explore-harness"
43
- version = "0.21.19"
43
+ version = "0.21.20"
44
44
  dependencies = [
45
45
  "libc",
46
46
  ]
47
47
 
48
48
  [[package]]
49
49
  name = "omx-mux"
50
- version = "0.21.19"
50
+ version = "0.21.20"
51
51
  dependencies = [
52
52
  "serde",
53
53
  "serde_json",
@@ -55,7 +55,7 @@ dependencies = [
55
55
 
56
56
  [[package]]
57
57
  name = "omx-runtime"
58
- version = "0.21.19"
58
+ version = "0.21.20"
59
59
  dependencies = [
60
60
  "fs2",
61
61
  "libc",
@@ -67,7 +67,7 @@ dependencies = [
67
67
 
68
68
  [[package]]
69
69
  name = "omx-runtime-core"
70
- version = "0.21.19"
70
+ version = "0.21.20"
71
71
  dependencies = [
72
72
  "fs2",
73
73
  "serde",
@@ -76,7 +76,7 @@ dependencies = [
76
76
 
77
77
  [[package]]
78
78
  name = "omx-sparkshell"
79
- version = "0.21.19"
79
+ version = "0.21.20"
80
80
  dependencies = [
81
81
  "omx-mux",
82
82
  ]
package/Cargo.toml CHANGED
@@ -11,7 +11,7 @@ resolver = "2"
11
11
 
12
12
  [workspace.package]
13
13
 
14
- version = "0.21.19"
14
+ version = "0.21.20"
15
15
 
16
16
  edition = "2021"
17
17
  rust-version = "1.73"
@@ -266,7 +266,7 @@ describe("issue 3790 live plugin cache pins", () => {
266
266
  const packaged = await resolvePackagedOmxMarketplace(packageRoot);
267
267
  assert.ok(packaged);
268
268
  const pluginManifest = JSON.parse(await readFile(packaged.pluginManifestPath, "utf-8"));
269
- assert.equal(pluginManifest.version, "0.21.19");
269
+ assert.equal(pluginManifest.version, "0.21.20");
270
270
  const published = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
271
271
  assert.equal(published.status, "materialized");
272
272
  assert.ok(legacySnapshots.every((snapshot) => published.cacheDir !== snapshot));
@@ -4006,6 +4006,36 @@ esac
4006
4006
  assert.equal(result, false, "waitForWorkerReady with timeout=0 should return false, not run checks after deadline");
4007
4007
  });
4008
4008
  });
4009
+ it('enforces deadline on every poll including when ready (Codex finding 4310966027)', async () => {
4010
+ // Test that even if a poll returns true (ready), we recheck the deadline.
4011
+ // Mock tmux to return ready after a delay that causes us to exceed the timeout.
4012
+ const delaySeconds = 0.15;
4013
+ const timeoutMs = 100;
4014
+ // With a timeout shorter than the delay, the poll will complete after deadline
4015
+ // and should return false despite the ready output.
4016
+ await withMockTmuxFixture('omx-worker-ready-deadline-enforce-', (logPath) => `#!/bin/sh
4017
+ set -eu
4018
+ printf '%s\\n' "$*" >> "${logPath}"
4019
+ case "$1" in
4020
+ capture-pane)
4021
+ # Simulate slow capture-pane that takes longer than the remaining timeout
4022
+ sleep ${delaySeconds}
4023
+ cat <<'EOF'
4024
+ ${READY_HELPER_CAPTURE}
4025
+ EOF
4026
+ exit 0
4027
+ ;;
4028
+ *)
4029
+ exit 0
4030
+ ;;
4031
+ esac`, async () => {
4032
+ // Poll with a very short timeout that will be exceeded during the capture
4033
+ const result = waitForWorkerReady('omx-team-x', 1, timeoutMs);
4034
+ // Even though capture-pane returns ready, the deadline was exceeded
4035
+ // so we should return false
4036
+ assert.equal(result, false, "waitForWorkerReady should return false when poll completes after deadline");
4037
+ });
4038
+ });
4009
4039
  });
4010
4040
  describe('waitForWorkerReadyAsync parity', () => {
4011
4041
  it('uses visible capture-pane argv without tail flags', async () => {
@@ -4288,6 +4318,36 @@ esac
4288
4318
  assert.equal(result, false, "waitForWorkerReadyAsync with timeout=0 should return false, not run checks after deadline");
4289
4319
  });
4290
4320
  });
4321
+ it('enforces deadline on every poll including when ready (Codex finding 4310966027)', async () => {
4322
+ // Test that even if a poll returns true (ready), we recheck the deadline.
4323
+ // Mock tmux to return ready after a delay that causes us to exceed the timeout.
4324
+ const delaySeconds = 0.15;
4325
+ const timeoutMs = 100;
4326
+ // With a timeout shorter than the delay, the poll will complete after deadline
4327
+ // and should return false despite the ready output.
4328
+ await withMockTmuxFixture('omx-worker-ready-deadline-enforce-async-', (logPath) => `#!/bin/sh
4329
+ set -eu
4330
+ printf '%s\\n' "$*" >> "${logPath}"
4331
+ case "$1" in
4332
+ capture-pane)
4333
+ # Simulate slow capture-pane that takes longer than the remaining timeout
4334
+ sleep ${delaySeconds}
4335
+ cat <<'EOF'
4336
+ ${READY_HELPER_CAPTURE}
4337
+ EOF
4338
+ exit 0
4339
+ ;;
4340
+ *)
4341
+ exit 0
4342
+ ;;
4343
+ esac`, async () => {
4344
+ // Poll with a very short timeout that will be exceeded during the capture
4345
+ const result = await waitForWorkerReadyAsync('omx-team-x', 1, timeoutMs);
4346
+ // Even though capture-pane returns ready, the deadline was exceeded
4347
+ // so we should return false
4348
+ assert.equal(result, false, "waitForWorkerReadyAsync should return false when poll completes after deadline");
4349
+ });
4350
+ });
4291
4351
  });
4292
4352
  describe('createTeamSession tmux instance tagging', () => {
4293
4353
  it('rejects split-window output unless it contains one canonical pane id and optional expected receipt', () => {