chore(codex): update app-server to 0.144.6 [AI] (#110821)

* build(codex): bump app-server to 0.144.6

* build(codex): align ACP runtime to 0.144.6

* test(codex): harden live image probe

* test(codex): accept alphanumeric image tokens

* test(codex): stabilize image probe glyphs

* test(gateway): disable cron probe delivery

* test(codex): enlarge live image token

* test(codex): tie compaction proof to native output

* test(codex): accept wrapped native stress commands

* test(codex): stabilize compaction acknowledgements

* docs(changelog): note Codex 0.144.6 update

* docs(changelog): defer Codex note to release
This commit is contained in:
Peter Steinberger
2026-07-18 20:19:17 +01:00
committed by GitHub
parent 138d2d071c
commit 04a9552a1f
11 changed files with 180 additions and 180 deletions
+3 -3
View File
@@ -131,7 +131,7 @@ flags, and plugin allow/deny references into this block. Explicit canonical
## App-server transport
For ordinary harness turns, OpenClaw starts the managed Codex binary shipped
with the official plugin (currently `@openai/codex` `0.144.5`):
with the official plugin (currently `@openai/codex` `0.144.6`):
```bash
codex app-server --listen stdio://
@@ -255,7 +255,7 @@ networking, so a full-access profile would not protect outbound traffic.
The plugin blocks older, newer-unvalidated, prerelease, build-suffixed, or
unversioned app-server handshakes. Codex app-server must report a stable version
from `0.143.0` through the bundled `0.144.5`.
from `0.143.0` through the bundled `0.144.6`.
OpenClaw treats non-loopback WebSocket app-server URLs as remote and requires
identity-bearing WebSocket auth through `appServer.authToken` or an
@@ -599,7 +599,7 @@ If discovery fails or times out, OpenClaw uses a bundled fallback catalog:
| `gpt-5.4-mini` | GPT-5.4-Mini | low, medium, high, xhigh |
<Note>
The current bundled harness is `@openai/codex` `0.144.5`. A `model/list` probe
The current bundled harness is `@openai/codex` `0.144.6`. A `model/list` probe
against that bundled app-server returned these public picker rows:
| Model id | Input modalities | Reasoning efforts |
+2 -2
View File
@@ -56,7 +56,7 @@ channel is the communication surface.
- The official `@openclaw/codex` plugin installed. Include `codex` in
`plugins.allow` if your config uses an allowlist.
- A stable Codex app-server from `0.143.0` through `0.144.5`. The plugin manages a compatible
- A stable Codex app-server from `0.143.0` through `0.144.6`. The plugin manages a compatible
binary by default, so a `codex` command on `PATH` does not affect normal
startup.
- Codex auth through `openclaw models auth login --provider openai`, an
@@ -976,7 +976,7 @@ Doctor rewrites legacy model refs to `openai/*`, removes stale session and
whole-agent runtime pins, and preserves existing auth-profile overrides.
**The app-server is rejected:** use a stable Codex app-server from `0.143.0`
through the bundled `0.144.5`. Prereleases, build-suffixed versions, and newer
through the bundled `0.144.6`. Prereleases, build-suffixed versions, and newer
unvalidated releases are rejected because OpenClaw validates generated schemas
against the bundled app-server version.
+27 -27
View File
@@ -722,9 +722,9 @@
}
},
"node_modules/@openai/codex": {
"version": "0.144.4",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4.tgz",
"integrity": "sha512-DTHzYatlKq9dw55E0/HsbK4tRCEKabuJ10ybbqpsG8gVv/kvwEdg3Z4OI3cvLXKa21xkIa4lkGlZoO/HmqmFFw==",
"version": "0.144.6",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6.tgz",
"integrity": "sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==",
"license": "Apache-2.0",
"bin": {
"codex": "bin/codex.js"
@@ -733,19 +733,19 @@
"node": ">=16"
},
"optionalDependencies": {
"@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.4-darwin-arm64",
"@openai/codex-darwin-x64": "npm:@openai/codex@0.144.4-darwin-x64",
"@openai/codex-linux-arm64": "npm:@openai/codex@0.144.4-linux-arm64",
"@openai/codex-linux-x64": "npm:@openai/codex@0.144.4-linux-x64",
"@openai/codex-win32-arm64": "npm:@openai/codex@0.144.4-win32-arm64",
"@openai/codex-win32-x64": "npm:@openai/codex@0.144.4-win32-x64"
"@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.6-darwin-arm64",
"@openai/codex-darwin-x64": "npm:@openai/codex@0.144.6-darwin-x64",
"@openai/codex-linux-arm64": "npm:@openai/codex@0.144.6-linux-arm64",
"@openai/codex-linux-x64": "npm:@openai/codex@0.144.6-linux-x64",
"@openai/codex-win32-arm64": "npm:@openai/codex@0.144.6-win32-arm64",
"@openai/codex-win32-x64": "npm:@openai/codex@0.144.6-win32-x64"
}
},
"node_modules/@openai/codex-darwin-arm64": {
"name": "@openai/codex",
"version": "0.144.4-darwin-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-darwin-arm64.tgz",
"integrity": "sha512-6J3g498cM2oA7vYIJhpuGJlnIi/M5JdYmjB5BZ1Of5HQ0ziIlplFSvH801oVy9J5TQFp642ODzOu/ZEokDUXsg==",
"version": "0.144.6-darwin-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-arm64.tgz",
"integrity": "sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==",
"cpu": [
"arm64"
],
@@ -760,9 +760,9 @@
},
"node_modules/@openai/codex-darwin-x64": {
"name": "@openai/codex",
"version": "0.144.4-darwin-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-darwin-x64.tgz",
"integrity": "sha512-k1HC8gdbAy+VmMbekYkhM+r+QE2Xfgd67n1VSp94tjz7aXVKoalHcDkdKNM/uUQ8o2tvbiwhHSUftJF8Sm9/Lw==",
"version": "0.144.6-darwin-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-x64.tgz",
"integrity": "sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==",
"cpu": [
"x64"
],
@@ -777,9 +777,9 @@
},
"node_modules/@openai/codex-linux-arm64": {
"name": "@openai/codex",
"version": "0.144.4-linux-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-linux-arm64.tgz",
"integrity": "sha512-OlKx65579OwIzech9Tt3OUH9+hFZfFrCBP1hL2MudnMIoNr1+cFZjB5YIj5MWMRoBD+K5W3wdBIpQSH855b5Sg==",
"version": "0.144.6-linux-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-arm64.tgz",
"integrity": "sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==",
"cpu": [
"arm64"
],
@@ -794,9 +794,9 @@
},
"node_modules/@openai/codex-linux-x64": {
"name": "@openai/codex",
"version": "0.144.4-linux-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-linux-x64.tgz",
"integrity": "sha512-2jxrmV6+/7eBNdg5uhhmOEPFu2o28eYY/ClLzWhSBHH8uo3f2KA1z9JQcVtwlbToW03nEPlEzYNYfCF1UBqsVQ==",
"version": "0.144.6-linux-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-x64.tgz",
"integrity": "sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==",
"cpu": [
"x64"
],
@@ -811,9 +811,9 @@
},
"node_modules/@openai/codex-win32-arm64": {
"name": "@openai/codex",
"version": "0.144.4-win32-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-win32-arm64.tgz",
"integrity": "sha512-CCgfI1smFhHZTIpTuBwDJwBr/AR40RTqaFxbBWVabu0RMeYDteRuPiDfdTlktf3C43Y1q10VZXhVGYtCokDg2w==",
"version": "0.144.6-win32-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-arm64.tgz",
"integrity": "sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==",
"cpu": [
"arm64"
],
@@ -828,9 +828,9 @@
},
"node_modules/@openai/codex-win32-x64": {
"name": "@openai/codex",
"version": "0.144.4-win32-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.4-win32-x64.tgz",
"integrity": "sha512-iL1ky0ERgdQJOKzom/Ms1fhpwkSmpsA9eVrzAqURFlYGS8z7JqwEgm33+nLGCsY7y25d8Xs/LJ91Oiqz3yXcUg==",
"version": "0.144.6-win32-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-x64.tgz",
"integrity": "sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==",
"cpu": [
"x64"
],
+28 -28
View File
@@ -8,7 +8,7 @@
"name": "@openclaw/codex",
"version": "2026.7.2",
"dependencies": {
"@openai/codex": "0.144.5",
"@openai/codex": "0.144.6",
"semver": "7.8.5",
"smol-toml": "1.7.0",
"typebox": "1.3.3",
@@ -17,9 +17,9 @@
}
},
"node_modules/@openai/codex": {
"version": "0.144.5",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5.tgz",
"integrity": "sha512-jjB+K+OMv572mKhS+2QuLxWXDJNdpwbPenf+V+8bdq7wg4Scqt3cn6WEekD8wPqDVZqck0HSX17K9rD9kbDJQA==",
"version": "0.144.6",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6.tgz",
"integrity": "sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==",
"license": "Apache-2.0",
"bin": {
"codex": "bin/codex.js"
@@ -28,19 +28,19 @@
"node": ">=16"
},
"optionalDependencies": {
"@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.5-darwin-arm64",
"@openai/codex-darwin-x64": "npm:@openai/codex@0.144.5-darwin-x64",
"@openai/codex-linux-arm64": "npm:@openai/codex@0.144.5-linux-arm64",
"@openai/codex-linux-x64": "npm:@openai/codex@0.144.5-linux-x64",
"@openai/codex-win32-arm64": "npm:@openai/codex@0.144.5-win32-arm64",
"@openai/codex-win32-x64": "npm:@openai/codex@0.144.5-win32-x64"
"@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.6-darwin-arm64",
"@openai/codex-darwin-x64": "npm:@openai/codex@0.144.6-darwin-x64",
"@openai/codex-linux-arm64": "npm:@openai/codex@0.144.6-linux-arm64",
"@openai/codex-linux-x64": "npm:@openai/codex@0.144.6-linux-x64",
"@openai/codex-win32-arm64": "npm:@openai/codex@0.144.6-win32-arm64",
"@openai/codex-win32-x64": "npm:@openai/codex@0.144.6-win32-x64"
}
},
"node_modules/@openai/codex-darwin-arm64": {
"name": "@openai/codex",
"version": "0.144.5-darwin-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-darwin-arm64.tgz",
"integrity": "sha512-zcT6NfBCqLFt+BReNSETTZW6v6PdbH0dzNtm9j7l7mDGqwPbKZDGJdnpkBao2389I0ZacyIKgSZoI0vez1d4Dw==",
"version": "0.144.6-darwin-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-arm64.tgz",
"integrity": "sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==",
"cpu": [
"arm64"
],
@@ -55,9 +55,9 @@
},
"node_modules/@openai/codex-darwin-x64": {
"name": "@openai/codex",
"version": "0.144.5-darwin-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-darwin-x64.tgz",
"integrity": "sha512-//Mo0m1MwaoT6psu5xsmofXpKx4/0irIkeq10xJvk59+886EG355ibjA+ZmlRcKhE3bLjsKD7p81nTbAdRL/bw==",
"version": "0.144.6-darwin-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-x64.tgz",
"integrity": "sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==",
"cpu": [
"x64"
],
@@ -72,9 +72,9 @@
},
"node_modules/@openai/codex-linux-arm64": {
"name": "@openai/codex",
"version": "0.144.5-linux-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-linux-arm64.tgz",
"integrity": "sha512-zAHggxVwR2TBxKmybXY7ZMiB0G8DMonY2YPdwNNjwXcf+LOIqNGgswwNCDMbP/HEe6r8j+R9ZX/yYoo8f+n/RQ==",
"version": "0.144.6-linux-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-arm64.tgz",
"integrity": "sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==",
"cpu": [
"arm64"
],
@@ -89,9 +89,9 @@
},
"node_modules/@openai/codex-linux-x64": {
"name": "@openai/codex",
"version": "0.144.5-linux-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-linux-x64.tgz",
"integrity": "sha512-FalLJlBQGFdK8Gc3kj9sa/ekNdgkHhUawLaKkvy5CtB18JaP2YxtTP/Pe1pD2iBiq8mMUliRnafpF6AdBdQMbg==",
"version": "0.144.6-linux-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-x64.tgz",
"integrity": "sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==",
"cpu": [
"x64"
],
@@ -106,9 +106,9 @@
},
"node_modules/@openai/codex-win32-arm64": {
"name": "@openai/codex",
"version": "0.144.5-win32-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-win32-arm64.tgz",
"integrity": "sha512-0Pj7iqjEOEvPQPO3kFfCy9vGX4BTu76ChFFZHr2eNNIfVc3FOENAv/X98u4L+iIUtDOK9DbqmfUudW3DPapshg==",
"version": "0.144.6-win32-arm64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-arm64.tgz",
"integrity": "sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==",
"cpu": [
"arm64"
],
@@ -123,9 +123,9 @@
},
"node_modules/@openai/codex-win32-x64": {
"name": "@openai/codex",
"version": "0.144.5-win32-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.5-win32-x64.tgz",
"integrity": "sha512-DnsSTlnnzleTxvLwIGnBitKInscxn2I7qASqosS8Fv+qysBygd+ZiBn/SQsRCgQ28PAlsNzmd3Gf3ZTecolAmg==",
"version": "0.144.6-win32-x64",
"resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-x64.tgz",
"integrity": "sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==",
"cpu": [
"x64"
],
+1 -1
View File
@@ -8,7 +8,7 @@
},
"type": "module",
"dependencies": {
"@openai/codex": "0.144.5",
"@openai/codex": "0.144.6",
"semver": "7.8.5",
"smol-toml": "1.7.0",
"typebox": "1.3.3",
@@ -257,7 +257,7 @@ describe("shared Codex app-server client", () => {
await sendInitializeResult(harness, "openclaw/0.117.9 (macOS; test)");
await expect(listPromise).rejects.toThrow(
"A stable Codex app-server from 0.143.0 through 0.144.5 is required",
"A stable Codex app-server from 0.143.0 through 0.144.6 is required",
);
expect(harness.process.stdin.destroyed).toBe(true);
startSpy.mockRestore();
+1 -1
View File
@@ -6,6 +6,6 @@
/** Minimum Codex app-server version supported by the OpenClaw Codex bridge. */
export const MIN_CODEX_APP_SERVER_VERSION = "0.143.0";
/** Newest Codex app-server version validated by the OpenClaw Codex bridge. */
export const MAX_CODEX_APP_SERVER_VERSION = "0.144.5";
export const MAX_CODEX_APP_SERVER_VERSION = "0.144.6";
/** npm package name for the managed Codex app-server binary. */
export const MANAGED_CODEX_APP_SERVER_PACKAGE = "@openai/codex";
+30 -98
View File
@@ -591,8 +591,8 @@ importers:
extensions/codex:
dependencies:
'@openai/codex':
specifier: 0.144.5
version: 0.144.5
specifier: 0.144.6
version: 0.144.6
semver:
specifier: 7.8.5
version: 7.8.5
@@ -3643,84 +3643,43 @@ packages:
resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==}
engines: {node: ^20.17.0 || >=22.9.0}
'@openai/codex@0.144.4':
resolution: {integrity: sha512-DTHzYatlKq9dw55E0/HsbK4tRCEKabuJ10ybbqpsG8gVv/kvwEdg3Z4OI3cvLXKa21xkIa4lkGlZoO/HmqmFFw==}
'@openai/codex@0.144.6':
resolution: {integrity: sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==}
engines: {node: '>=16'}
hasBin: true
'@openai/codex@0.144.4-darwin-arm64':
resolution: {integrity: sha512-6J3g498cM2oA7vYIJhpuGJlnIi/M5JdYmjB5BZ1Of5HQ0ziIlplFSvH801oVy9J5TQFp642ODzOu/ZEokDUXsg==}
'@openai/codex@0.144.6-darwin-arm64':
resolution: {integrity: sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
'@openai/codex@0.144.4-darwin-x64':
resolution: {integrity: sha512-k1HC8gdbAy+VmMbekYkhM+r+QE2Xfgd67n1VSp94tjz7aXVKoalHcDkdKNM/uUQ8o2tvbiwhHSUftJF8Sm9/Lw==}
'@openai/codex@0.144.6-darwin-x64':
resolution: {integrity: sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
'@openai/codex@0.144.4-linux-arm64':
resolution: {integrity: sha512-OlKx65579OwIzech9Tt3OUH9+hFZfFrCBP1hL2MudnMIoNr1+cFZjB5YIj5MWMRoBD+K5W3wdBIpQSH855b5Sg==}
'@openai/codex@0.144.6-linux-arm64':
resolution: {integrity: sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
'@openai/codex@0.144.4-linux-x64':
resolution: {integrity: sha512-2jxrmV6+/7eBNdg5uhhmOEPFu2o28eYY/ClLzWhSBHH8uo3f2KA1z9JQcVtwlbToW03nEPlEzYNYfCF1UBqsVQ==}
'@openai/codex@0.144.6-linux-x64':
resolution: {integrity: sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
'@openai/codex@0.144.4-win32-arm64':
resolution: {integrity: sha512-CCgfI1smFhHZTIpTuBwDJwBr/AR40RTqaFxbBWVabu0RMeYDteRuPiDfdTlktf3C43Y1q10VZXhVGYtCokDg2w==}
'@openai/codex@0.144.6-win32-arm64':
resolution: {integrity: sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [win32]
'@openai/codex@0.144.4-win32-x64':
resolution: {integrity: sha512-iL1ky0ERgdQJOKzom/Ms1fhpwkSmpsA9eVrzAqURFlYGS8z7JqwEgm33+nLGCsY7y25d8Xs/LJ91Oiqz3yXcUg==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
'@openai/codex@0.144.5':
resolution: {integrity: sha512-jjB+K+OMv572mKhS+2QuLxWXDJNdpwbPenf+V+8bdq7wg4Scqt3cn6WEekD8wPqDVZqck0HSX17K9rD9kbDJQA==}
engines: {node: '>=16'}
hasBin: true
'@openai/codex@0.144.5-darwin-arm64':
resolution: {integrity: sha512-zcT6NfBCqLFt+BReNSETTZW6v6PdbH0dzNtm9j7l7mDGqwPbKZDGJdnpkBao2389I0ZacyIKgSZoI0vez1d4Dw==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
'@openai/codex@0.144.5-darwin-x64':
resolution: {integrity: sha512-//Mo0m1MwaoT6psu5xsmofXpKx4/0irIkeq10xJvk59+886EG355ibjA+ZmlRcKhE3bLjsKD7p81nTbAdRL/bw==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
'@openai/codex@0.144.5-linux-arm64':
resolution: {integrity: sha512-zAHggxVwR2TBxKmybXY7ZMiB0G8DMonY2YPdwNNjwXcf+LOIqNGgswwNCDMbP/HEe6r8j+R9ZX/yYoo8f+n/RQ==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
'@openai/codex@0.144.5-linux-x64':
resolution: {integrity: sha512-FalLJlBQGFdK8Gc3kj9sa/ekNdgkHhUawLaKkvy5CtB18JaP2YxtTP/Pe1pD2iBiq8mMUliRnafpF6AdBdQMbg==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
'@openai/codex@0.144.5-win32-arm64':
resolution: {integrity: sha512-0Pj7iqjEOEvPQPO3kFfCy9vGX4BTu76ChFFZHr2eNNIfVc3FOENAv/X98u4L+iIUtDOK9DbqmfUudW3DPapshg==}
engines: {node: '>=16'}
cpu: [arm64]
os: [win32]
'@openai/codex@0.144.5-win32-x64':
resolution: {integrity: sha512-DnsSTlnnzleTxvLwIGnBitKInscxn2I7qASqosS8Fv+qysBygd+ZiBn/SQsRCgQ28PAlsNzmd3Gf3ZTecolAmg==}
'@openai/codex@0.144.6-win32-x64':
resolution: {integrity: sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
@@ -8398,7 +8357,7 @@ snapshots:
'@agentclientprotocol/codex-acp@1.1.2':
dependencies:
'@agentclientprotocol/sdk': 1.2.1(zod@4.4.3)
'@openai/codex': 0.144.4
'@openai/codex': 0.144.6
diff: 9.0.0
open: 11.0.0
vscode-jsonrpc: 9.0.1
@@ -10057,58 +10016,31 @@ snapshots:
'@npmcli/redact@4.0.0': {}
'@openai/codex@0.144.4':
'@openai/codex@0.144.6':
optionalDependencies:
'@openai/codex-darwin-arm64': '@openai/codex@0.144.4-darwin-arm64'
'@openai/codex-darwin-x64': '@openai/codex@0.144.4-darwin-x64'
'@openai/codex-linux-arm64': '@openai/codex@0.144.4-linux-arm64'
'@openai/codex-linux-x64': '@openai/codex@0.144.4-linux-x64'
'@openai/codex-win32-arm64': '@openai/codex@0.144.4-win32-arm64'
'@openai/codex-win32-x64': '@openai/codex@0.144.4-win32-x64'
'@openai/codex-darwin-arm64': '@openai/codex@0.144.6-darwin-arm64'
'@openai/codex-darwin-x64': '@openai/codex@0.144.6-darwin-x64'
'@openai/codex-linux-arm64': '@openai/codex@0.144.6-linux-arm64'
'@openai/codex-linux-x64': '@openai/codex@0.144.6-linux-x64'
'@openai/codex-win32-arm64': '@openai/codex@0.144.6-win32-arm64'
'@openai/codex-win32-x64': '@openai/codex@0.144.6-win32-x64'
'@openai/codex@0.144.4-darwin-arm64':
'@openai/codex@0.144.6-darwin-arm64':
optional: true
'@openai/codex@0.144.4-darwin-x64':
'@openai/codex@0.144.6-darwin-x64':
optional: true
'@openai/codex@0.144.4-linux-arm64':
'@openai/codex@0.144.6-linux-arm64':
optional: true
'@openai/codex@0.144.4-linux-x64':
'@openai/codex@0.144.6-linux-x64':
optional: true
'@openai/codex@0.144.4-win32-arm64':
'@openai/codex@0.144.6-win32-arm64':
optional: true
'@openai/codex@0.144.4-win32-x64':
optional: true
'@openai/codex@0.144.5':
optionalDependencies:
'@openai/codex-darwin-arm64': '@openai/codex@0.144.5-darwin-arm64'
'@openai/codex-darwin-x64': '@openai/codex@0.144.5-darwin-x64'
'@openai/codex-linux-arm64': '@openai/codex@0.144.5-linux-arm64'
'@openai/codex-linux-x64': '@openai/codex@0.144.5-linux-x64'
'@openai/codex-win32-arm64': '@openai/codex@0.144.5-win32-arm64'
'@openai/codex-win32-x64': '@openai/codex@0.144.5-win32-x64'
'@openai/codex@0.144.5-darwin-arm64':
optional: true
'@openai/codex@0.144.5-darwin-x64':
optional: true
'@openai/codex@0.144.5-linux-arm64':
optional: true
'@openai/codex@0.144.5-linux-x64':
optional: true
'@openai/codex@0.144.5-win32-arm64':
optional: true
'@openai/codex@0.144.5-win32-x64':
'@openai/codex@0.144.6-win32-x64':
optional: true
'@openclaw/crabline@0.1.11':
+78 -18
View File
@@ -802,7 +802,11 @@ function formatAssistantTextPreview(texts: string[], maxChars = 800): string {
if (!combined) {
return "<none>";
}
return combined.length > maxChars ? `${combined.slice(0, maxChars)}...` : combined;
if (combined.length <= maxChars) {
return combined;
}
const half = Math.floor(maxChars / 2);
return `${combined.slice(0, half)}\n...\n${combined.slice(-half)}`;
}
async function readCodexHarnessCompactionCount(params: {
@@ -852,30 +856,69 @@ async function verifyCodexCompactionStress(params: {
let completedCompactions = 0;
let reportedCompactions = 0;
for (let turn = 1; turn <= CODEX_HARNESS_COMPACTION_STRESS_TURNS; turn += 1) {
const acknowledgement = `CODEX-LARGE-OUTPUT-${turn}-${randomBytes(3)
.toString("hex")
.toUpperCase()}`;
const acknowledgement = `CODEX-LARGE-OUTPUT-${turn}-OK`;
const largeOutputCommand = `node -e 'for(let i=0;i<${outputLines};i++){console.log(i.toString(36).padStart(8,"0")+"-"+((i*2654435761)>>>0).toString(16).padStart(8,"0")+"-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")}'`;
const { text, events, compactionCount } = await requestAgentTextWithEvents({
client: params.client,
eventPrefixes: ["codex_app_server.", "compaction"],
eventPrefixes: ["codex_app_server.", "compaction", "tool"],
sessionKey: params.sessionKey,
message: [
"Large-output compaction probe.",
"Use the native exec_command tool exactly once.",
`Run this exact command: node -e 'for(let i=0;i<${outputLines};i++){console.log(i.toString(36).padStart(8,"0")+"-"+((i*2654435761)>>>0).toString(16).padStart(8,"0")+"-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")}'`,
`Run this exact command: ${largeOutputCommand}`,
"Set max_output_tokens to 10000.",
`After the tool completes, reply exactly ${acknowledgement} and nothing else.`,
].join("\n"),
});
expect(text).toContain(acknowledgement);
recordCodexAttemptIdentity({ events, sessionKey: params.sessionKey });
completedCompactions += events.filter(
const turnCompletedCompactions = events.filter(
(event) =>
event.stream === "compaction" &&
event.data?.phase === "end" &&
event.data?.completed === true,
).length;
completedCompactions += turnCompletedCompactions;
reportedCompactions += compactionCount;
const commandStartIndex = events.findIndex((event) => {
if (
event.stream !== "tool" ||
event.data?.phase !== "start" ||
event.data?.name !== "bash" ||
!event.data?.args ||
typeof event.data.args !== "object"
) {
return false;
}
const command = (event.data.args as { command?: unknown }).command;
// Codex may preserve the command text or wrap it in a login shell.
return (
typeof command === "string" &&
command.includes("node -e") &&
command.includes(`i<${outputLines}`) &&
command.includes("2654435761") &&
command.includes("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
);
});
const commandItemId = events[commandStartIndex]?.data?.itemId;
const commandResultIndex = events.findIndex((event, index) => {
const result = event.data?.result;
return (
index > commandStartIndex &&
event.stream === "tool" &&
event.data?.phase === "result" &&
event.data?.itemId === commandItemId &&
event.data?.status === "completed" &&
event.data?.isError === false &&
result !== null &&
typeof result === "object" &&
(result as { exitCode?: unknown }).exitCode === 0
);
});
expect(
commandResultIndex,
`large-output turn did not successfully complete the exact native command; events=${JSON.stringify(events)}`,
).toBeGreaterThan(commandStartIndex);
const history: { messages?: unknown[] } = await params.client.request("chat.history", {
sessionKey: params.sessionKey,
@@ -885,9 +928,18 @@ async function verifyCodexCompactionStress(params: {
const originalLengths = Array.from(serialized.matchAll(/original (\d+) chars/gu), (match) =>
Number(match[1]),
);
const hasTruncatedToolResult = originalLengths.some((length) => length > 10_000);
const postCommandCompaction = events.some(
(event, index) =>
index > commandResultIndex &&
event.stream === "compaction" &&
event.data?.phase === "end" &&
event.data?.completed === true,
);
// Native compaction can replace the command row after the successful large-output result.
expect(
originalLengths.some((length) => length > 10_000),
`expected a truncated large native tool result; lengths=${JSON.stringify(originalLengths)}`,
hasTruncatedToolResult || postCommandCompaction,
`expected a truncated large native tool result or its later native compaction; lengths=${JSON.stringify(originalLengths)}`,
).toBe(true);
}
@@ -940,12 +992,9 @@ async function waitForAssistantText(params: {
limit: 24,
});
const assistantTexts = extractAssistantTexts(history.messages ?? []);
const normalizedContains = params.contains.toUpperCase();
const normalizedContains = normalizeAssistantTokenText(params.contains);
const matched = assistantTexts.find((text) =>
text
.toUpperCase()
.replace(/[^A-F0-9]/g, "")
.includes(normalizedContains),
normalizeAssistantTokenText(text).includes(normalizedContains),
);
if (matched) {
return matched;
@@ -964,6 +1013,10 @@ async function waitForAssistantText(params: {
);
}
function normalizeAssistantTokenText(text: string): string {
return text.toUpperCase().replace(/[^A-Z0-9]/g, "");
}
async function verifyCodexImageProbe(params: {
client: GatewayClient;
sessionKey: string;
@@ -1033,7 +1086,7 @@ async function verifyCodexChatImageProbe(params: {
{
mimeType: "image/png",
fileName: "codex-chat-image-probe.png",
content: renderBitmapTextPngBase64(token),
content: renderBitmapTextPngBase64(token, { scale: 12, padding: 24 }),
},
],
originatingChannel: "codex-harness-live",
@@ -1051,14 +1104,15 @@ async function verifyCodexChatImageProbe(params: {
sessionKey: params.sessionKey,
contains: token,
});
const normalized = text.toUpperCase().replace(/[^A-F0-9]/g, "");
const normalized = normalizeAssistantTokenText(text);
expect(normalized, `Expected Codex to read bitmap token ${token}; received:\n${text}`).toContain(
token,
);
}
function randomBitmapTextToken(length = 6): string {
const alphabet = "24567ACEF";
// Keep glyphs visually distinct so this checks image transport, not tiny-font OCR quality.
const alphabet = "247";
return [...randomBytes(length)].map((byte) => alphabet[byte % alphabet.length]).join("");
}
@@ -1747,7 +1801,13 @@ describeLive("gateway live (Codex harness)", () => {
if (CODEX_HARNESS_CHAT_IMAGE_PROBE) {
logCodexLiveStep("chat-image-probe:start", { sessionKey });
await verifyCodexChatImageProbe({ client: activeClient, sessionKey });
const unsubscribeChatImageDebugEvents =
await subscribeCodexLiveDebugEvents(sessionKey);
try {
await verifyCodexChatImageProbe({ client: activeClient, sessionKey });
} finally {
unsubscribeChatImageDebugEvents();
}
logCodexLiveStep("chat-image-probe:done");
}
+7 -1
View File
@@ -74,11 +74,17 @@ describe("live-agent-probes", () => {
}),
).toContain("previous OpenClaw cron MCP tool call was cancelled");
const args = JSON.parse(spec.argsJson) as {
job?: { sessionTarget?: string; agentId?: string; sessionKey?: string };
job?: {
sessionTarget?: string;
agentId?: string;
sessionKey?: string;
delivery?: { mode?: string };
};
};
expect(args.job?.sessionTarget).toBe("session:agent:codex:acp:test");
expect(args.job?.agentId).toBe("codex");
expect(args.job?.sessionKey).toBe("agent:codex:acp:test");
expect(args.job?.delivery).toEqual({ mode: "none" });
});
it("builds a cron probe spec when the process clock is outside the Date range", () => {
+2
View File
@@ -83,6 +83,8 @@ export function createLiveCronProbeSpec(
name,
schedule: { kind: "at", at },
payload: { kind: "agentTurn", message },
// Live harnesses use synthetic channels that must not become announce targets.
delivery: { mode: "none" },
sessionTarget: params.sessionKey ? `session:${params.sessionKey}` : "current",
...(params.agentId ? { agentId: params.agentId } : {}),
...(params.sessionKey ? { sessionKey: params.sessionKey } : {}),