From d47eee44076ea314f0006ffe216dda089774746a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 28 May 2026 13:34:47 -0400 Subject: [PATCH] fix: parse queue caps strictly --- .../reply/directive-handling.queue-validation.test.ts | 10 ++++++++++ src/auto-reply/reply/queue/directive.ts | 11 ++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/auto-reply/reply/directive-handling.queue-validation.test.ts b/src/auto-reply/reply/directive-handling.queue-validation.test.ts index a644dd5e9f34..e13850ab034a 100644 --- a/src/auto-reply/reply/directive-handling.queue-validation.test.ts +++ b/src/auto-reply/reply/directive-handling.queue-validation.test.ts @@ -44,4 +44,14 @@ describe("maybeHandleQueueDirective", () => { "Options: modes steer, followup, collect, interrupt; debounce:, cap:, drop:old|new|summarize.", ); }); + + it.each(["cap:1e3", "cap:0x10", "cap:4.9"])("rejects non-decimal-integer caps: %s", (cap) => { + const invalid = maybeHandleQueueDirective({ + directives: parseInlineDirectives(`/queue collect ${cap}`), + cfg: {} as OpenClawConfig, + channel: "quietchat", + }); + + expect(invalid?.text).toContain("Invalid cap"); + }); }); diff --git a/src/auto-reply/reply/queue/directive.ts b/src/auto-reply/reply/queue/directive.ts index 15819edd681e..31b381b3dca1 100644 --- a/src/auto-reply/reply/queue/directive.ts +++ b/src/auto-reply/reply/queue/directive.ts @@ -1,4 +1,5 @@ import { parseDurationMs } from "../../../cli/parse-duration.js"; +import { parseStrictPositiveInteger } from "../../../infra/parse-finite-number.js"; import { normalizeOptionalLowercaseString } from "../../../shared/string-coerce.js"; import { skipDirectiveArgPrefix, takeDirectiveToken } from "../directive-parsing.js"; import { normalizeQueueDropPolicy, normalizeQueueMode } from "./normalize.js"; @@ -23,15 +24,7 @@ function parseQueueCap(raw?: string): number | undefined { if (!raw) { return undefined; } - const num = Number(raw); - if (!Number.isFinite(num)) { - return undefined; - } - const cap = Math.floor(num); - if (cap < 1) { - return undefined; - } - return cap; + return parseStrictPositiveInteger(raw); } function parseQueueDirectiveArgs(raw: string): {