From 728295c04637490a43adf7ed128daa4ac6df425d Mon Sep 17 00:00:00 2001 From: Cyrus Forbes Date: Fri, 10 Apr 2026 22:52:02 -0700 Subject: [PATCH] Codex: parse Desktop app-server user agents --- extensions/codex/src/app-server/client.test.ts | 4 ++++ extensions/codex/src/app-server/client.ts | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/extensions/codex/src/app-server/client.test.ts b/extensions/codex/src/app-server/client.test.ts index f34c6e6d8c8..534d1084bc6 100644 --- a/extensions/codex/src/app-server/client.test.ts +++ b/extensions/codex/src/app-server/client.test.ts @@ -200,10 +200,14 @@ describe("CodexAppServerClient", () => { expect(process.unref).toHaveBeenCalledTimes(1); }); it("reads the Codex version from the app-server user agent", () => { + expect(readCodexVersionFromUserAgent("Codex Desktop/0.118.0")).toBe("0.118.0"); expect(readCodexVersionFromUserAgent("openclaw/0.118.0 (macOS; test)")).toBe("0.118.0"); expect(readCodexVersionFromUserAgent("codex_cli_rs/0.118.1-dev (linux; test)")).toBe( "0.118.1-dev", ); + expect(readCodexVersionFromUserAgent("Codex Desktop/not-a-version")).toBeUndefined(); + expect(readCodexVersionFromUserAgent("Codex Desktop/0.118")).toBeUndefined(); + expect(readCodexVersionFromUserAgent("openclaw/0.118.0abc")).toBeUndefined(); expect(readCodexVersionFromUserAgent("missing-version")).toBeUndefined(); }); diff --git a/extensions/codex/src/app-server/client.ts b/extensions/codex/src/app-server/client.ts index b7a30045efb..e38d6fda9d9 100644 --- a/extensions/codex/src/app-server/client.ts +++ b/extensions/codex/src/app-server/client.ts @@ -373,8 +373,11 @@ function assertSupportedCodexAppServerVersion(response: CodexInitializeResponse) export function readCodexVersionFromUserAgent(userAgent: string | undefined): string | undefined { // Codex returns `/ ...`; the originator can be - // OpenClaw or an env override, so only the slash-delimited version is stable. - const match = userAgent?.match(/^[^/\s]+\/(\d+\.\d+\.\d+(?:[-+][^\s()]*)?)/); + // OpenClaw, Codex Desktop, or an env override, so only the slash-delimited + // version in the leading product field is stable. + const match = userAgent?.match( + /^[^/]+\/(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)(?:[\s(]|$)/, + ); return match?.[1]; }