diff --git a/extensions/codex/npm-shrinkwrap.json b/extensions/codex/npm-shrinkwrap.json index 2bc420db96c..5926e6ecabf 100644 --- a/extensions/codex/npm-shrinkwrap.json +++ b/extensions/codex/npm-shrinkwrap.json @@ -8,16 +8,16 @@ "name": "@openclaw/codex", "version": "2026.7.1-beta.3", "dependencies": { - "@openai/codex": "0.142.5", + "@openai/codex": "0.143.0", "typebox": "1.3.3", "ws": "8.21.0", "zod": "4.4.3" } }, "node_modules/@openai/codex": { - "version": "0.142.5", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5.tgz", - "integrity": "sha512-WQEpD7l3k68eIAP0aq28EdR18ENBAf8DyprzFhzNwCOQJSv4nHzpwT8Fl30IJacprko2ZCmUBZjM2u941l2yLw==", + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0.tgz", + "integrity": "sha512-6h53sNtESIYncWVwU7zEjdVajwcad/0H94MOrgGqhwBMa9RRUDVG6DU9E9euC7yRdtrsKDAkJkz/m5moZ6MU3A==", "license": "Apache-2.0", "bin": { "codex": "bin/codex.js" @@ -26,19 +26,19 @@ "node": ">=16" }, "optionalDependencies": { - "@openai/codex-darwin-arm64": "npm:@openai/codex@0.142.5-darwin-arm64", - "@openai/codex-darwin-x64": "npm:@openai/codex@0.142.5-darwin-x64", - "@openai/codex-linux-arm64": "npm:@openai/codex@0.142.5-linux-arm64", - "@openai/codex-linux-x64": "npm:@openai/codex@0.142.5-linux-x64", - "@openai/codex-win32-arm64": "npm:@openai/codex@0.142.5-win32-arm64", - "@openai/codex-win32-x64": "npm:@openai/codex@0.142.5-win32-x64" + "@openai/codex-darwin-arm64": "npm:@openai/codex@0.143.0-darwin-arm64", + "@openai/codex-darwin-x64": "npm:@openai/codex@0.143.0-darwin-x64", + "@openai/codex-linux-arm64": "npm:@openai/codex@0.143.0-linux-arm64", + "@openai/codex-linux-x64": "npm:@openai/codex@0.143.0-linux-x64", + "@openai/codex-win32-arm64": "npm:@openai/codex@0.143.0-win32-arm64", + "@openai/codex-win32-x64": "npm:@openai/codex@0.143.0-win32-x64" } }, "node_modules/@openai/codex-darwin-arm64": { "name": "@openai/codex", - "version": "0.142.5-darwin-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-darwin-arm64.tgz", - "integrity": "sha512-l43p8xv+Z/2/b6fCUc7/FmcQZsaPB7RFizLponGwHAnFOWe3i9Vky69p+up3BUam9AetoQQUv7Mo+2KdaFEqhA==", + "version": "0.143.0-darwin-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-darwin-arm64.tgz", + "integrity": "sha512-hs9bPkE1c0+EtbHxxVfhaaGl1u6/LVdhEtOX5t9N+ri54yjMUkzKJLc7MOBa1DYRMDTWT+lPEfeB+8Fv9coTKg==", "cpu": [ "arm64" ], @@ -53,9 +53,9 @@ }, "node_modules/@openai/codex-darwin-x64": { "name": "@openai/codex", - "version": "0.142.5-darwin-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-darwin-x64.tgz", - "integrity": "sha512-yk6A06/VmW7NFsa48OVPaj//g/zeSpd79wjuqfXZwW8ZKRYQm3+wCd3hWjPl79F3QnXvDvM2j3JMIBL3m3GXXg==", + "version": "0.143.0-darwin-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-darwin-x64.tgz", + "integrity": "sha512-xHbrb/Qkj+ZZqYkAuio3mcFxpqlg/NNpBDz5iMKlGa7XfK3miUu6R50c9cRW1ZPQVRfRnFhs4l7OhI5u5r+HvA==", "cpu": [ "x64" ], @@ -70,9 +70,9 @@ }, "node_modules/@openai/codex-linux-arm64": { "name": "@openai/codex", - "version": "0.142.5-linux-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-linux-arm64.tgz", - "integrity": "sha512-77ka5PSnm5HdxdBT99IwntCasmbqevlS0eiC0AtEb6ZXCLkim2gm0AWm+jNYy0EhbssvNK+KghayWo34HMgXeA==", + "version": "0.143.0-linux-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-linux-arm64.tgz", + "integrity": "sha512-1TMx1a/YBEY0SBhPGn8z9HjOpaDssw+WJiIi/+r0CB5uZf6qnALN02TrZTZl2PSUI8olnBf/VccjnwVCrzR38w==", "cpu": [ "arm64" ], @@ -87,9 +87,9 @@ }, "node_modules/@openai/codex-linux-x64": { "name": "@openai/codex", - "version": "0.142.5-linux-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-linux-x64.tgz", - "integrity": "sha512-pxY+d3NgNE57Y/MApD3/TZUAygxJN6I9h3ZeDUwe67mxWjUxsuapxMRFTKSznCalYbRAeZp752+AAXmUbmguEg==", + "version": "0.143.0-linux-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-linux-x64.tgz", + "integrity": "sha512-B6v6oUgBbjt1bL7yBbRp7e0vLiVOjRdz9Wykotve52Aq2H2TeiCqxM5BSOaFkmNO6VxE0seW7hTi2UZF9x8LLA==", "cpu": [ "x64" ], @@ -104,9 +104,9 @@ }, "node_modules/@openai/codex-win32-arm64": { "name": "@openai/codex", - "version": "0.142.5-win32-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-win32-arm64.tgz", - "integrity": "sha512-65BEqGbUZ7r0ayunIHdBjo5crwgbwKX/6puOcO+VCswUw/dXvDsN2IGcbXB52+bS9U5+FxP783cUHfTT6m40DQ==", + "version": "0.143.0-win32-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-win32-arm64.tgz", + "integrity": "sha512-8ntYPI3IQWZuayL214tYanuYhom23RxHUWRkmay45hGymEW4TwwFqzppKXEzcBXrCF5uSWlOMMG+B2elN6kWuQ==", "cpu": [ "arm64" ], @@ -121,9 +121,9 @@ }, "node_modules/@openai/codex-win32-x64": { "name": "@openai/codex", - "version": "0.142.5-win32-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.142.5-win32-x64.tgz", - "integrity": "sha512-a+wI4PEx9a2fg6V5ueTTDkOkr1XpEvA5RFXIbo/L2hOfzMmGtyRnbG24bCGu5Q2RSgVxSQV0aLkdb3vdYMNH9A==", + "version": "0.143.0-win32-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.143.0-win32-x64.tgz", + "integrity": "sha512-d60HLkzSQ7rdL35xPxH1x3g8DuJjEbhEx1UOK5ivA1PBD9eWvP46rtdHkSvCZyqHUhaHFr5We2SugE9+Y8HhVA==", "cpu": [ "x64" ], diff --git a/extensions/codex/package.json b/extensions/codex/package.json index dcbd785bfba..d5896a9e39e 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -8,7 +8,7 @@ }, "type": "module", "dependencies": { - "@openai/codex": "0.142.5", + "@openai/codex": "0.143.0", "typebox": "1.3.3", "ws": "8.21.0", "zod": "4.4.3" diff --git a/extensions/codex/src/app-server/attempt-startup.test.ts b/extensions/codex/src/app-server/attempt-startup.test.ts index c540dfa0bd8..51a0dcdff92 100644 --- a/extensions/codex/src/app-server/attempt-startup.test.ts +++ b/extensions/codex/src/app-server/attempt-startup.test.ts @@ -141,7 +141,7 @@ async function answerInitialize(harness: ClientHarness): Promise { timeout: HARNESS_REQUEST_TIMEOUT_MS, }); const initialize = JSON.parse(harness.writes[0] ?? "{}") as { id?: number }; - harness.send({ id: initialize.id, result: { userAgent: "openclaw/0.142.0 (macOS; test)" } }); + harness.send({ id: initialize.id, result: { userAgent: "openclaw/0.143.0 (macOS; test)" } }); } async function waitForRequest( diff --git a/extensions/codex/src/app-server/client.test.ts b/extensions/codex/src/app-server/client.test.ts index a3b556b80d8..d78e88f5417 100644 --- a/extensions/codex/src/app-server/client.test.ts +++ b/extensions/codex/src/app-server/client.test.ts @@ -224,7 +224,7 @@ describe("CodexAppServerClient", () => { const { harness, initializing, outbound } = startInitialize(); harness.send({ id: outbound.id, - result: { userAgent: "openclaw/0.142.0 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0 (macOS; test)" }, }); await expect(initializing).resolves.toBeUndefined(); @@ -263,11 +263,11 @@ describe("CodexAppServerClient", () => { const { harness, initializing, outbound } = startInitialize(); harness.send({ id: outbound.id, - result: { userAgent: "openclaw/0.142.0-alpha.2 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0-alpha.2 (macOS; test)" }, }); await expect(initializing).rejects.toThrow( - `Codex app-server ${MIN_CODEX_APP_SERVER_VERSION} or newer is required, but detected 0.142.0-alpha.2`, + `Codex app-server ${MIN_CODEX_APP_SERVER_VERSION} or newer is required, but detected 0.143.0-alpha.2`, ); expect(harness.writes).toHaveLength(1); }); @@ -276,11 +276,11 @@ describe("CodexAppServerClient", () => { const { harness, initializing, outbound } = startInitialize(); harness.send({ id: outbound.id, - result: { userAgent: "openclaw/0.142.0+alpha.2 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0+alpha.2 (macOS; test)" }, }); await expect(initializing).rejects.toThrow( - `Codex app-server ${MIN_CODEX_APP_SERVER_VERSION} or newer is required, but detected 0.142.0+alpha.2`, + `Codex app-server ${MIN_CODEX_APP_SERVER_VERSION} or newer is required, but detected 0.143.0+alpha.2`, ); expect(harness.writes).toHaveLength(1); }); @@ -289,7 +289,7 @@ describe("CodexAppServerClient", () => { const { harness, initializing, outbound } = startInitialize(); harness.send({ id: outbound.id, - result: { userAgent: "openclaw/0.143.0-alpha.1 (macOS; test)" }, + result: { userAgent: "openclaw/0.144.0-alpha.1 (macOS; test)" }, }); await expect(initializing).resolves.toBeUndefined(); @@ -300,7 +300,7 @@ describe("CodexAppServerClient", () => { const { harness, initializing, outbound } = startInitialize(); harness.send({ id: outbound.id, - result: { userAgent: "openclaw/0.143.0+custom (macOS; test)" }, + result: { userAgent: "openclaw/0.144.0+custom (macOS; test)" }, }); await expect(initializing).resolves.toBeUndefined(); @@ -488,7 +488,7 @@ describe("CodexAppServerClient", () => { it("reads the Codex version from the app-server user agent", () => { expect(readCodexVersionFromUserAgent("Codex Desktop/0.125.0")).toBe("0.125.0"); - expect(readCodexVersionFromUserAgent("openclaw/0.142.0 (macOS; test)")).toBe("0.142.0"); + expect(readCodexVersionFromUserAgent("openclaw/0.143.0 (macOS; test)")).toBe("0.143.0"); expect(readCodexVersionFromUserAgent("codex_cli_rs/0.125.0-dev (linux; test)")).toBe( "0.125.0-dev", ); diff --git a/extensions/codex/src/app-server/models.test.ts b/extensions/codex/src/app-server/models.test.ts index ce8000e717f..b4ddef9c94a 100644 --- a/extensions/codex/src/app-server/models.test.ts +++ b/extensions/codex/src/app-server/models.test.ts @@ -70,7 +70,7 @@ describe("listCodexAppServerModels", () => { const initialize = JSON.parse(harness.writes[0] ?? "{}") as { id?: number }; harness.send({ id: initialize.id, - result: { userAgent: "openclaw/0.142.0 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0 (macOS; test)" }, }); await vi.waitFor(() => expect(harness.writes.length).toBeGreaterThanOrEqual(3)); const list = JSON.parse(harness.writes[2] ?? "{}") as { id?: number; method?: string }; @@ -132,7 +132,7 @@ describe("listCodexAppServerModels", () => { const initialize = JSON.parse(harness.writes[0] ?? "{}") as { id?: number }; harness.send({ id: initialize.id, - result: { userAgent: "openclaw/0.142.0 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0 (macOS; test)" }, }); await vi.waitFor(() => expect(harness.writes.length).toBeGreaterThanOrEqual(3)); const firstList = JSON.parse(harness.writes[2] ?? "{}") as { @@ -212,7 +212,7 @@ describe("listCodexAppServerModels", () => { const initialize = JSON.parse(harness.writes[0] ?? "{}") as { id?: number }; harness.send({ id: initialize.id, - result: { userAgent: "openclaw/0.142.0 (macOS; test)" }, + result: { userAgent: "openclaw/0.143.0 (macOS; test)" }, }); await vi.waitFor(() => expect(harness.writes.length).toBeGreaterThanOrEqual(3)); const firstList = JSON.parse(harness.writes[2] ?? "{}") as { id?: number }; diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json index 9fb2c42ae1b..239ce068efc 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json @@ -124,6 +124,7 @@ { "enum": [ "contextWindowExceeded", + "sessionBudgetExceeded", "usageLimitExceeded", "serverOverloaded", "cyberPolicy", diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json index 6b6245598bb..8a2fe50af98 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json @@ -79,7 +79,6 @@ { "enum": [ "untrusted", - "on-failure", "on-request", "never" ], @@ -229,6 +228,7 @@ { "enum": [ "contextWindowExceeded", + "sessionBudgetExceeded", "usageLimitExceeded", "serverOverloaded", "cyberPolicy", @@ -541,6 +541,18 @@ }, "McpToolCallAppContext": { "properties": { + "actionName": { + "type": [ + "string", + "null" + ] + }, + "appName": { + "type": [ + "string", + "null" + ] + }, "connectorId": { "type": "string" }, @@ -555,6 +567,12 @@ "string", "null" ] + }, + "templateId": { + "type": [ + "string", + "null" + ] } }, "required": [ @@ -663,13 +681,29 @@ ] }, "MultiAgentMode": { - "description": "Controls whether the model receives multi-agent delegation instructions and, when it does, whether it should only spawn sub-agents after an explicit user request or may delegate proactively when doing so would help. `none` leaves the multi-agent tools available without injecting delegation instructions.", - "enum": [ - "none", - "explicitRequestOnly", - "proactive" - ], - "type": "string" + "description": "Controls the effective multi-agent delegation instructions for a turn. `custom` means the configured mode hint defines the policy instead of a built-in policy.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "custom": { + "type": "string" + } + }, + "required": [ + "custom" + ], + "title": "CustomMultiAgentMode", + "type": "object" + }, + { + "enum": [ + "explicitRequestOnly", + "proactive" + ], + "type": "string" + } + ] }, "NetworkAccess": { "enum": [ @@ -1040,6 +1074,17 @@ "description": "Whether the thread is ephemeral and should not be materialized on disk.", "type": "boolean" }, + "extra": { + "anyOf": [ + { + "$ref": "#/definitions/ThreadExtra" + }, + { + "type": "null" + } + ], + "description": "Optional implementation-specific thread data." + }, "forkedFromId": { "description": "Source thread id when this thread was created by forking another thread.", "type": [ @@ -1058,7 +1103,17 @@ ], "description": "Optional Git metadata captured when the thread was created." }, + "historyMode": { + "allOf": [ + { + "$ref": "#/definitions/ThreadHistoryMode" + } + ], + "default": "legacy", + "description": "Persisted thread history contract selected when this thread was created." + }, "id": { + "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, "modelProvider": { @@ -1165,6 +1220,17 @@ ], "type": "string" }, + "ThreadExtra": { + "description": "Extra app-server data for a thread.", + "type": "object" + }, + "ThreadHistoryMode": { + "enum": [ + "legacy", + "paginated" + ], + "type": "string" + }, "ThreadId": { "type": "string" }, @@ -1751,7 +1817,7 @@ "type": "string" }, "path": { - "$ref": "#/definitions/AbsolutePathBuf" + "$ref": "#/definitions/LegacyAppPathString" }, "type": { "enum": [ @@ -2017,6 +2083,7 @@ "description": "Only populated when the Turn's status is failed." }, "id": { + "description": "Identifier for this turn. Codex-generated turn IDs are UUIDv7.", "type": "string" }, "items": { diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json index 8c0f4aa875e..d5b07ab346b 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json @@ -79,7 +79,6 @@ { "enum": [ "untrusted", - "on-failure", "on-request", "never" ], @@ -229,6 +228,7 @@ { "enum": [ "contextWindowExceeded", + "sessionBudgetExceeded", "usageLimitExceeded", "serverOverloaded", "cyberPolicy", @@ -541,6 +541,18 @@ }, "McpToolCallAppContext": { "properties": { + "actionName": { + "type": [ + "string", + "null" + ] + }, + "appName": { + "type": [ + "string", + "null" + ] + }, "connectorId": { "type": "string" }, @@ -555,6 +567,12 @@ "string", "null" ] + }, + "templateId": { + "type": [ + "string", + "null" + ] } }, "required": [ @@ -663,13 +681,29 @@ ] }, "MultiAgentMode": { - "description": "Controls whether the model receives multi-agent delegation instructions and, when it does, whether it should only spawn sub-agents after an explicit user request or may delegate proactively when doing so would help. `none` leaves the multi-agent tools available without injecting delegation instructions.", - "enum": [ - "none", - "explicitRequestOnly", - "proactive" - ], - "type": "string" + "description": "Controls the effective multi-agent delegation instructions for a turn. `custom` means the configured mode hint defines the policy instead of a built-in policy.", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "custom": { + "type": "string" + } + }, + "required": [ + "custom" + ], + "title": "CustomMultiAgentMode", + "type": "object" + }, + { + "enum": [ + "explicitRequestOnly", + "proactive" + ], + "type": "string" + } + ] }, "NetworkAccess": { "enum": [ @@ -1040,6 +1074,17 @@ "description": "Whether the thread is ephemeral and should not be materialized on disk.", "type": "boolean" }, + "extra": { + "anyOf": [ + { + "$ref": "#/definitions/ThreadExtra" + }, + { + "type": "null" + } + ], + "description": "Optional implementation-specific thread data." + }, "forkedFromId": { "description": "Source thread id when this thread was created by forking another thread.", "type": [ @@ -1058,7 +1103,17 @@ ], "description": "Optional Git metadata captured when the thread was created." }, + "historyMode": { + "allOf": [ + { + "$ref": "#/definitions/ThreadHistoryMode" + } + ], + "default": "legacy", + "description": "Persisted thread history contract selected when this thread was created." + }, "id": { + "description": "Identifier for this thread. Codex-generated thread IDs are UUIDv7.", "type": "string" }, "modelProvider": { @@ -1165,6 +1220,17 @@ ], "type": "string" }, + "ThreadExtra": { + "description": "Extra app-server data for a thread.", + "type": "object" + }, + "ThreadHistoryMode": { + "enum": [ + "legacy", + "paginated" + ], + "type": "string" + }, "ThreadId": { "type": "string" }, @@ -1751,7 +1817,7 @@ "type": "string" }, "path": { - "$ref": "#/definitions/AbsolutePathBuf" + "$ref": "#/definitions/LegacyAppPathString" }, "type": { "enum": [ @@ -2017,6 +2083,7 @@ "description": "Only populated when the Turn's status is failed." }, "id": { + "description": "Identifier for this turn. Codex-generated turn IDs are UUIDv7.", "type": "string" }, "items": { diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json index d621d94ee67..549589d0c37 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json @@ -147,6 +147,7 @@ { "enum": [ "contextWindowExceeded", + "sessionBudgetExceeded", "usageLimitExceeded", "serverOverloaded", "cyberPolicy", @@ -436,6 +437,18 @@ }, "McpToolCallAppContext": { "properties": { + "actionName": { + "type": [ + "string", + "null" + ] + }, + "appName": { + "type": [ + "string", + "null" + ] + }, "connectorId": { "type": "string" }, @@ -450,6 +463,12 @@ "string", "null" ] + }, + "templateId": { + "type": [ + "string", + "null" + ] } }, "required": [ @@ -1250,7 +1269,7 @@ "type": "string" }, "path": { - "$ref": "#/definitions/AbsolutePathBuf" + "$ref": "#/definitions/LegacyAppPathString" }, "type": { "enum": [ @@ -1438,6 +1457,7 @@ "description": "Only populated when the Turn's status is failed." }, "id": { + "description": "Identifier for this turn. Codex-generated turn IDs are UUIDv7.", "type": "string" }, "items": { diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json index 1f831695a3d..4f26eb09ea6 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json @@ -147,6 +147,7 @@ { "enum": [ "contextWindowExceeded", + "sessionBudgetExceeded", "usageLimitExceeded", "serverOverloaded", "cyberPolicy", @@ -436,6 +437,18 @@ }, "McpToolCallAppContext": { "properties": { + "actionName": { + "type": [ + "string", + "null" + ] + }, + "appName": { + "type": [ + "string", + "null" + ] + }, "connectorId": { "type": "string" }, @@ -450,6 +463,12 @@ "string", "null" ] + }, + "templateId": { + "type": [ + "string", + "null" + ] } }, "required": [ @@ -1250,7 +1269,7 @@ "type": "string" }, "path": { - "$ref": "#/definitions/AbsolutePathBuf" + "$ref": "#/definitions/LegacyAppPathString" }, "type": { "enum": [ @@ -1438,6 +1457,7 @@ "description": "Only populated when the Turn's status is failed." }, "id": { + "description": "Identifier for this turn. Codex-generated turn IDs are UUIDv7.", "type": "string" }, "items": { diff --git a/extensions/codex/src/app-server/protocol-validators.test.ts b/extensions/codex/src/app-server/protocol-validators.test.ts index 8731745a90d..69a83d0118f 100644 --- a/extensions/codex/src/app-server/protocol-validators.test.ts +++ b/extensions/codex/src/app-server/protocol-validators.test.ts @@ -38,7 +38,7 @@ function makeMinimalResponse(threadOverrides: Record = {}) { } describe("Codex thread response validators", () => { - // The 0.142 floor guarantees both thread ids; pre-0.131 servers without + // The 0.143 floor guarantees both thread ids; pre-0.131 servers without // sessionId must fail loudly instead of being silently normalized. it("rejects thread responses missing sessionId", () => { for (const assertResponse of [ @@ -58,6 +58,7 @@ describe("assertCodexThreadStartResponse", () => { const result = assertCodexThreadStartResponse(response); expect(result.thread.id).toBe("thread-1"); expect(result.thread.sessionId).toBe("session-1"); + expect(result.thread.historyMode).toBe("legacy"); }); it("throws on invalid response", () => { diff --git a/extensions/codex/src/app-server/protocol.ts b/extensions/codex/src/app-server/protocol.ts index 6de8815be3b..0b7d40c0e84 100644 --- a/extensions/codex/src/app-server/protocol.ts +++ b/extensions/codex/src/app-server/protocol.ts @@ -4,7 +4,6 @@ export type JsonObject = { [key: string]: JsonValue }; export type CodexServiceTier = string; export type CodexApprovalPolicy = | "untrusted" - | "on-failure" | "on-request" | { granular: { @@ -287,6 +286,8 @@ export type CodexTurn = { export type CodexThread = { id: string; sessionId?: string; + historyMode?: "legacy" | "paginated"; + extra?: JsonObject | null; name?: string | null; preview?: string | null; createdAt?: number | null; diff --git a/extensions/codex/src/app-server/shared-client.test.ts b/extensions/codex/src/app-server/shared-client.test.ts index a7068dd682d..e4c68ae531c 100644 --- a/extensions/codex/src/app-server/shared-client.test.ts +++ b/extensions/codex/src/app-server/shared-client.test.ts @@ -202,7 +202,7 @@ describe("shared Codex app-server client", () => { const listPromise = listCodexAppServerModels({ timeoutMs: 1000 }); await sendInitializeResult(desktop, "openclaw/0.124.9 (macOS; test)"); - await sendInitializeResult(pluginLocal, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(pluginLocal, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(pluginLocal); await expect(listPromise).resolves.toEqual({ models: [] }); @@ -235,7 +235,7 @@ describe("shared Codex app-server client", () => { expect(first.process.stdin.destroyed).toBe(true); const secondList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -257,7 +257,7 @@ describe("shared Codex app-server client", () => { abandonController.abort(); expect(harness.process.stdin.destroyed).toBe(false); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await expect(abandonedAcquire).resolves.toBe(harness.client); await expect(activeAcquire).resolves.toBe(harness.client); @@ -282,7 +282,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, authProfileId: "openai:work", }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(harness); await expect(listPromise).resolves.toEqual({ models: [] }); @@ -309,7 +309,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, authProfileStore, }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await expect(clientPromise).resolves.toBe(harness.client); expect(mocks.resolveCodexAppServerAuthProfileStore).toHaveBeenCalledWith({ @@ -355,7 +355,7 @@ describe("shared Codex app-server client", () => { authProfileId: "openai:persisted", agentDir: "/tmp/openclaw-persisted-agent", }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await expect(clientPromise).resolves.toBe(harness.client); const priorWriteCount = harness.writes.length; @@ -392,7 +392,7 @@ describe("shared Codex app-server client", () => { agentDir: "/tmp/openclaw-target-agent", config, }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await expect(clientPromise).resolves.toBe(harness.client); expect(mocks.resolveCodexAppServerAuthProfileIdForAgent).not.toHaveBeenCalled(); @@ -421,7 +421,7 @@ describe("shared Codex app-server client", () => { headers: {}, }, }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await expect(clientPromise).resolves.toBe(harness.client); expect(mocks.resolveCodexAppServerAuthProfileIdForAgent).not.toHaveBeenCalled(); @@ -439,7 +439,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, config, }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(harness); await expect(listPromise).resolves.toEqual({ models: [] }); @@ -466,7 +466,7 @@ describe("shared Codex app-server client", () => { authProfileId: "openai:work", agentDir: "/tmp/openclaw-agent-nova", }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(harness); await expect(listPromise).resolves.toEqual({ models: [] }); @@ -490,7 +490,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, agentDir: "/tmp/openclaw-agent-one", }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -498,7 +498,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, agentDir: "/tmp/openclaw-agent-two", }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -517,7 +517,7 @@ describe("shared Codex app-server client", () => { })); const listPromise = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(harness, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(harness, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(harness); await expect(listPromise).resolves.toEqual({ models: [] }); @@ -551,7 +551,7 @@ describe("shared Codex app-server client", () => { headers: {}, }, }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -566,7 +566,7 @@ describe("shared Codex app-server client", () => { headers: {}, }, }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -586,12 +586,12 @@ describe("shared Codex app-server client", () => { .mockReturnValueOnce("api-key:second"); const firstList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); const secondList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -634,7 +634,7 @@ describe("shared Codex app-server client", () => { }); await vi.waitFor(() => expect(second.writes.length).toBeGreaterThanOrEqual(1)); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -652,7 +652,7 @@ describe("shared Codex app-server client", () => { .mockReturnValueOnce(second.client); const firstList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -660,7 +660,7 @@ describe("shared Codex app-server client", () => { expect(first.process.stdin.destroyed).toBe(true); const secondList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -678,7 +678,7 @@ describe("shared Codex app-server client", () => { .mockReturnValueOnce(second.client); const firstList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -686,7 +686,7 @@ describe("shared Codex app-server client", () => { expect(first.process.stdin.destroyed).toBe(false); const secondList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -707,7 +707,7 @@ describe("shared Codex app-server client", () => { .mockReturnValueOnce(second.client); const firstList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -722,7 +722,7 @@ describe("shared Codex app-server client", () => { expect(first.process.stdin.destroyed).toBe(false); const secondList = listCodexAppServerModels({ timeoutMs: 1000 }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -744,7 +744,7 @@ describe("shared Codex app-server client", () => { const firstLease = getLeasedSharedCodexAppServerClient({ timeoutMs: 1000 }); const secondLease = getLeasedSharedCodexAppServerClient({ timeoutMs: 1000 }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await expect(firstLease).resolves.toBe(first.client); await expect(secondLease).resolves.toBe(first.client); @@ -778,7 +778,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, agentDir: "/tmp/openclaw-agent-one", }); - await sendInitializeResult(first, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(first, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(first); await expect(firstList).resolves.toEqual({ models: [] }); @@ -786,7 +786,7 @@ describe("shared Codex app-server client", () => { timeoutMs: 1000, agentDir: "/tmp/openclaw-agent-two", }); - await sendInitializeResult(second, "openclaw/0.142.0 (macOS; test)"); + await sendInitializeResult(second, "openclaw/0.143.0 (macOS; test)"); await sendEmptyModelList(second); await expect(secondList).resolves.toEqual({ models: [] }); @@ -812,7 +812,7 @@ describe("shared Codex app-server client", () => { const message = JSON.parse(rawDataToText(data)) as { id?: number; method?: string }; if (message.method === "initialize") { socket.send( - JSON.stringify({ id: message.id, result: { userAgent: "openclaw/0.142.0" } }), + JSON.stringify({ id: message.id, result: { userAgent: "openclaw/0.143.0" } }), ); return; } diff --git a/extensions/codex/src/app-server/transport-websocket.test.ts b/extensions/codex/src/app-server/transport-websocket.test.ts index 74ea2b92ee7..e9b6a5913d8 100644 --- a/extensions/codex/src/app-server/transport-websocket.test.ts +++ b/extensions/codex/src/app-server/transport-websocket.test.ts @@ -32,7 +32,7 @@ describe("Codex app-server websocket transport", () => { const message = JSON.parse(rawDataToText(data)) as { id?: number; method?: string }; if (message.method === "initialize") { socket.send( - JSON.stringify({ id: message.id, result: { userAgent: "openclaw/0.142.0" } }), + JSON.stringify({ id: message.id, result: { userAgent: "openclaw/0.143.0" } }), ); return; } diff --git a/extensions/codex/src/app-server/version.ts b/extensions/codex/src/app-server/version.ts index d7499d0adcb..4adee3a721e 100644 --- a/extensions/codex/src/app-server/version.ts +++ b/extensions/codex/src/app-server/version.ts @@ -3,11 +3,11 @@ */ // The floor tracks the managed package train. Every protocol shape OpenClaw // sends or reads assumes this floor; range-compat normalizers were removed -// with the 0.142 bump, so lowering it requires reintroducing them. +// with the 0.143 bump, so lowering it requires reintroducing them. /** Minimum Codex app-server version supported by the OpenClaw Codex bridge. */ -export const MIN_CODEX_APP_SERVER_VERSION = "0.142.0"; +export const MIN_CODEX_APP_SERVER_VERSION = "0.143.0"; /** npm package name for the managed Codex app-server binary. */ export const MANAGED_CODEX_APP_SERVER_PACKAGE = "@openai/codex"; // Keep this in sync with the Codex CLI live-test package pin. /** Managed Codex app-server package version installed by OpenClaw. */ -export const MANAGED_CODEX_APP_SERVER_PACKAGE_VERSION = "0.142.5"; +export const MANAGED_CODEX_APP_SERVER_PACKAGE_VERSION = "0.143.0"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbd62d1050b..ff98fa7cdd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -531,8 +531,8 @@ importers: extensions/codex: dependencies: '@openai/codex': - specifier: 0.142.5 - version: 0.142.5 + specifier: 0.143.0 + version: 0.143.0 typebox: specifier: 1.3.3 version: 1.3.3 @@ -3150,43 +3150,43 @@ packages: resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} engines: {node: ^20.17.0 || >=22.9.0} - '@openai/codex@0.142.5': - resolution: {integrity: sha512-WQEpD7l3k68eIAP0aq28EdR18ENBAf8DyprzFhzNwCOQJSv4nHzpwT8Fl30IJacprko2ZCmUBZjM2u941l2yLw==} + '@openai/codex@0.143.0': + resolution: {integrity: sha512-6h53sNtESIYncWVwU7zEjdVajwcad/0H94MOrgGqhwBMa9RRUDVG6DU9E9euC7yRdtrsKDAkJkz/m5moZ6MU3A==} engines: {node: '>=16'} hasBin: true - '@openai/codex@0.142.5-darwin-arm64': - resolution: {integrity: sha512-l43p8xv+Z/2/b6fCUc7/FmcQZsaPB7RFizLponGwHAnFOWe3i9Vky69p+up3BUam9AetoQQUv7Mo+2KdaFEqhA==} + '@openai/codex@0.143.0-darwin-arm64': + resolution: {integrity: sha512-hs9bPkE1c0+EtbHxxVfhaaGl1u6/LVdhEtOX5t9N+ri54yjMUkzKJLc7MOBa1DYRMDTWT+lPEfeB+8Fv9coTKg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@openai/codex@0.142.5-darwin-x64': - resolution: {integrity: sha512-yk6A06/VmW7NFsa48OVPaj//g/zeSpd79wjuqfXZwW8ZKRYQm3+wCd3hWjPl79F3QnXvDvM2j3JMIBL3m3GXXg==} + '@openai/codex@0.143.0-darwin-x64': + resolution: {integrity: sha512-xHbrb/Qkj+ZZqYkAuio3mcFxpqlg/NNpBDz5iMKlGa7XfK3miUu6R50c9cRW1ZPQVRfRnFhs4l7OhI5u5r+HvA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@openai/codex@0.142.5-linux-arm64': - resolution: {integrity: sha512-77ka5PSnm5HdxdBT99IwntCasmbqevlS0eiC0AtEb6ZXCLkim2gm0AWm+jNYy0EhbssvNK+KghayWo34HMgXeA==} + '@openai/codex@0.143.0-linux-arm64': + resolution: {integrity: sha512-1TMx1a/YBEY0SBhPGn8z9HjOpaDssw+WJiIi/+r0CB5uZf6qnALN02TrZTZl2PSUI8olnBf/VccjnwVCrzR38w==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@openai/codex@0.142.5-linux-x64': - resolution: {integrity: sha512-pxY+d3NgNE57Y/MApD3/TZUAygxJN6I9h3ZeDUwe67mxWjUxsuapxMRFTKSznCalYbRAeZp752+AAXmUbmguEg==} + '@openai/codex@0.143.0-linux-x64': + resolution: {integrity: sha512-B6v6oUgBbjt1bL7yBbRp7e0vLiVOjRdz9Wykotve52Aq2H2TeiCqxM5BSOaFkmNO6VxE0seW7hTi2UZF9x8LLA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@openai/codex@0.142.5-win32-arm64': - resolution: {integrity: sha512-65BEqGbUZ7r0ayunIHdBjo5crwgbwKX/6puOcO+VCswUw/dXvDsN2IGcbXB52+bS9U5+FxP783cUHfTT6m40DQ==} + '@openai/codex@0.143.0-win32-arm64': + resolution: {integrity: sha512-8ntYPI3IQWZuayL214tYanuYhom23RxHUWRkmay45hGymEW4TwwFqzppKXEzcBXrCF5uSWlOMMG+B2elN6kWuQ==} engines: {node: '>=16'} cpu: [arm64] os: [win32] - '@openai/codex@0.142.5-win32-x64': - resolution: {integrity: sha512-a+wI4PEx9a2fg6V5ueTTDkOkr1XpEvA5RFXIbo/L2hOfzMmGtyRnbG24bCGu5Q2RSgVxSQV0aLkdb3vdYMNH9A==} + '@openai/codex@0.143.0-win32-x64': + resolution: {integrity: sha512-d60HLkzSQ7rdL35xPxH1x3g8DuJjEbhEx1UOK5ivA1PBD9eWvP46rtdHkSvCZyqHUhaHFr5We2SugE9+Y8HhVA==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -8942,31 +8942,31 @@ snapshots: '@npmcli/redact@4.0.0': {} - '@openai/codex@0.142.5': + '@openai/codex@0.143.0': optionalDependencies: - '@openai/codex-darwin-arm64': '@openai/codex@0.142.5-darwin-arm64' - '@openai/codex-darwin-x64': '@openai/codex@0.142.5-darwin-x64' - '@openai/codex-linux-arm64': '@openai/codex@0.142.5-linux-arm64' - '@openai/codex-linux-x64': '@openai/codex@0.142.5-linux-x64' - '@openai/codex-win32-arm64': '@openai/codex@0.142.5-win32-arm64' - '@openai/codex-win32-x64': '@openai/codex@0.142.5-win32-x64' + '@openai/codex-darwin-arm64': '@openai/codex@0.143.0-darwin-arm64' + '@openai/codex-darwin-x64': '@openai/codex@0.143.0-darwin-x64' + '@openai/codex-linux-arm64': '@openai/codex@0.143.0-linux-arm64' + '@openai/codex-linux-x64': '@openai/codex@0.143.0-linux-x64' + '@openai/codex-win32-arm64': '@openai/codex@0.143.0-win32-arm64' + '@openai/codex-win32-x64': '@openai/codex@0.143.0-win32-x64' - '@openai/codex@0.142.5-darwin-arm64': + '@openai/codex@0.143.0-darwin-arm64': optional: true - '@openai/codex@0.142.5-darwin-x64': + '@openai/codex@0.143.0-darwin-x64': optional: true - '@openai/codex@0.142.5-linux-arm64': + '@openai/codex@0.143.0-linux-arm64': optional: true - '@openai/codex@0.142.5-linux-x64': + '@openai/codex@0.143.0-linux-x64': optional: true - '@openai/codex@0.142.5-win32-arm64': + '@openai/codex@0.143.0-win32-arm64': optional: true - '@openai/codex@0.142.5-win32-x64': + '@openai/codex@0.143.0-win32-x64': optional: true '@openclaw/crabline@0.1.9':