From d095d1663b7de5836fc67ed6c01fb7a945e79de0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 29 May 2026 06:49:23 -0400 Subject: [PATCH] fix(exa): reject non-decimal search counts --- extensions/exa/src/exa-web-search-provider.runtime.ts | 7 ++++--- extensions/exa/src/exa-web-search-provider.test.ts | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/extensions/exa/src/exa-web-search-provider.runtime.ts b/extensions/exa/src/exa-web-search-provider.runtime.ts index 954cfec07f5..fd908a94c82 100644 --- a/extensions/exa/src/exa-web-search-provider.runtime.ts +++ b/extensions/exa/src/exa-web-search-provider.runtime.ts @@ -1,3 +1,4 @@ +import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime"; import { buildSearchCacheKey, DEFAULT_SEARCH_COUNT, @@ -171,11 +172,11 @@ function isErrorPayload(value: unknown): value is { error: string; message: stri } function resolveExaSearchCount(value: unknown, fallback: number): number { - const parsed = typeof value === "number" ? value : Number(value); - if (!Number.isFinite(parsed)) { + const parsed = parseStrictPositiveInteger(value); + if (parsed === undefined) { return fallback; } - return Math.max(1, Math.min(EXA_MAX_SEARCH_COUNT, Math.floor(parsed))); + return Math.min(EXA_MAX_SEARCH_COUNT, parsed); } function parseExaContents( diff --git a/extensions/exa/src/exa-web-search-provider.test.ts b/extensions/exa/src/exa-web-search-provider.test.ts index c6e7cc575c0..a7e61d05ae8 100644 --- a/extensions/exa/src/exa-web-search-provider.test.ts +++ b/extensions/exa/src/exa-web-search-provider.test.ts @@ -184,6 +184,10 @@ describe("exa web search provider", () => { ]); expect(testing.resolveExaSearchCount(80, 10)).toBe(80); expect(testing.resolveExaSearchCount(120, 10)).toBe(100); + expect(testing.resolveExaSearchCount("+05", 10)).toBe(5); + expect(testing.resolveExaSearchCount("0x10", 10)).toBe(10); + expect(testing.resolveExaSearchCount("1e2", 10)).toBe(10); + expect(testing.resolveExaSearchCount(1.5, 10)).toBe(10); }); it("returns validation errors for conflicting time filters", async () => {