diff --git a/docs/plugins/codex-harness-reference.md b/docs/plugins/codex-harness-reference.md index 1bde045148b0..e14ba9268081 100644 --- a/docs/plugins/codex-harness-reference.md +++ b/docs/plugins/codex-harness-reference.md @@ -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 | -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 | diff --git a/docs/plugins/codex-harness.md b/docs/plugins/codex-harness.md index ea2a6cd058cd..bd277225085b 100644 --- a/docs/plugins/codex-harness.md +++ b/docs/plugins/codex-harness.md @@ -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. diff --git a/extensions/acpx/npm-shrinkwrap.json b/extensions/acpx/npm-shrinkwrap.json index a3017484d370..45d46e945e3b 100644 --- a/extensions/acpx/npm-shrinkwrap.json +++ b/extensions/acpx/npm-shrinkwrap.json @@ -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" ], diff --git a/extensions/codex/npm-shrinkwrap.json b/extensions/codex/npm-shrinkwrap.json index b5bb7d6204aa..d461d695ecf3 100644 --- a/extensions/codex/npm-shrinkwrap.json +++ b/extensions/codex/npm-shrinkwrap.json @@ -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" ], diff --git a/extensions/codex/package.json b/extensions/codex/package.json index 346474a8ab60..aecabcb16c1b 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -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", diff --git a/extensions/codex/src/app-server/shared-client.test.ts b/extensions/codex/src/app-server/shared-client.test.ts index b711adb00ba0..326e29be2a0c 100644 --- a/extensions/codex/src/app-server/shared-client.test.ts +++ b/extensions/codex/src/app-server/shared-client.test.ts @@ -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(); diff --git a/extensions/codex/src/app-server/version.ts b/extensions/codex/src/app-server/version.ts index 0e5c18d4d1d8..bc9fa8aa55e6 100644 --- a/extensions/codex/src/app-server/version.ts +++ b/extensions/codex/src/app-server/version.ts @@ -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"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1c769dee67f..765162373604 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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': diff --git a/src/gateway/gateway-codex-harness.live.test.ts b/src/gateway/gateway-codex-harness.live.test.ts index cf948c623cce..5cbc863fc13e 100644 --- a/src/gateway/gateway-codex-harness.live.test.ts +++ b/src/gateway/gateway-codex-harness.live.test.ts @@ -802,7 +802,11 @@ function formatAssistantTextPreview(texts: string[], maxChars = 800): string { if (!combined) { return ""; } - 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"); } diff --git a/src/gateway/live-agent-probes.test.ts b/src/gateway/live-agent-probes.test.ts index b4ecc24816c9..abf8fe446209 100644 --- a/src/gateway/live-agent-probes.test.ts +++ b/src/gateway/live-agent-probes.test.ts @@ -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", () => { diff --git a/src/gateway/live-agent-probes.ts b/src/gateway/live-agent-probes.ts index a3d369ebf3a1..eab42f0c23cd 100644 --- a/src/gateway/live-agent-probes.ts +++ b/src/gateway/live-agent-probes.ts @@ -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 } : {}),