fix: parse usage query numbers strictly

This commit is contained in:
Peter Steinberger
2026-05-28 15:13:22 -04:00
parent 4fb904ca63
commit 2a5a9fd720
2 changed files with 22 additions and 3 deletions

View File

@@ -33,6 +33,21 @@ describe("usage-helpers", () => {
expect(filterSessionsByQuery([a, b], "maxTokens:10").sessions).toEqual([b]);
});
it("rejects non-decimal numeric filter values", () => {
const session = { key: "a", usage: { totalTokens: 10_000, totalCost: 0 } };
expect(filterSessionsByQuery([session], "minTokens:1k").sessions).toEqual([session]);
expect(filterSessionsByQuery([session], "minTokens:1e3").warnings).toEqual([
"Invalid number for minTokens",
]);
expect(filterSessionsByQuery([session], "minTokens:0x1000").warnings).toEqual([
"Invalid number for minTokens",
]);
expect(filterSessionsByQuery([session], "minTokens:9007199254740993").warnings).toEqual([
"Invalid number for minTokens",
]);
});
it("warns on unknown keys and invalid numbers", () => {
const session = { key: "a", usage: { totalTokens: 10, totalCost: 0 } };
const res = filterSessionsByQuery([session], "wat:1 minTokens:wat");

View File

@@ -77,11 +77,15 @@ const parseQueryNumber = (value: string): number | null => {
multiplier = 1_000_000;
raw = raw.slice(0, -1);
}
const parsed = Number(raw);
if (!Number.isFinite(parsed)) {
if (!/^\d+(?:\.\d+)?$/.test(raw)) {
return null;
}
return parsed * multiplier;
const parsed = Number(raw);
const normalized = parsed * multiplier;
if (!Number.isFinite(normalized) || !Number.isSafeInteger(Math.round(normalized))) {
return null;
}
return normalized;
};
export const extractQueryTerms = (query: string): UsageQueryTerm[] => {