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 () => {