From 1042dce4548a5e7b2aff44130538e9112763dfd5 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 29 May 2026 06:37:59 -0400 Subject: [PATCH] fix(codex): centralize session limit parsing --- extensions/codex/src/command-handlers.ts | 6 +++--- extensions/codex/src/commands.test.ts | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/extensions/codex/src/command-handlers.ts b/extensions/codex/src/command-handlers.ts index fee1aa7ef02..a57f2c99190 100644 --- a/extensions/codex/src/command-handlers.ts +++ b/extensions/codex/src/command-handlers.ts @@ -1,5 +1,6 @@ import crypto from "node:crypto"; import { resolveAgentDir, resolveSessionAgentIds } from "openclaw/plugin-sdk/agent-runtime"; +import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime"; import type { PluginCommandContext, PluginCommandResult } from "openclaw/plugin-sdk/plugin-entry"; import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime"; import { CODEX_CONTROL_METHODS, type CodexControlMethod } from "./app-server/capabilities.js"; @@ -1932,9 +1933,8 @@ function parseCodexCliSessionsArgs(args: string[]): ParsedCodexCliSessionsArgs { } if (arg === "--limit") { const value = readRequiredOptionValue(args, index); - const parsedLimit = - value && /^\+?\d+$/.test(value.trim()) ? Number(value.trim()) : Number.NaN; - if (!Number.isSafeInteger(parsedLimit) || parsedLimit <= 0) { + const parsedLimit = parseStrictPositiveInteger(value); + if (parsedLimit === undefined) { parsed.help = true; continue; } diff --git a/extensions/codex/src/commands.test.ts b/extensions/codex/src/commands.test.ts index 16b204d843a..1efedbc5bb8 100644 --- a/extensions/codex/src/commands.test.ts +++ b/extensions/codex/src/commands.test.ts @@ -595,6 +595,26 @@ describe("codex command", () => { }); }); + it("normalizes signed decimal Codex CLI session limits before node dispatch", async () => { + const listCodexCliSessionsOnNode = vi.fn(async () => ({ + node: { nodeId: "mb-m5", displayName: "mb-m5" }, + result: { + codexHome: "/Users/mariano/.codex", + sessions: [], + }, + })); + + await handleCodexCommand(createContext("sessions --host mb-m5 --limit +05 bridge"), { + deps: createDeps({ listCodexCliSessionsOnNode }), + }); + + expect(listCodexCliSessionsOnNode).toHaveBeenCalledWith({ + requestedNode: "mb-m5", + filter: "bridge", + limit: 5, + }); + }); + it("rejects partial Codex CLI session limits before node dispatch", async () => { const listCodexCliSessionsOnNode = vi.fn();