Skip to content

Commit 2a5a9fd

Browse files
committed
fix: parse usage query numbers strictly
1 parent 4fb904c commit 2a5a9fd

2 files changed

Lines changed: 21 additions & 2 deletions

File tree

ui/src/ui/usage-helpers.node.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ describe("usage-helpers", () => {
3333
expect(filterSessionsByQuery([a, b], "maxTokens:10").sessions).toEqual([b]);
3434
});
3535

36+
it("rejects non-decimal numeric filter values", () => {
37+
const session = { key: "a", usage: { totalTokens: 10_000, totalCost: 0 } };
38+
39+
expect(filterSessionsByQuery([session], "minTokens:1k").sessions).toEqual([session]);
40+
expect(filterSessionsByQuery([session], "minTokens:1e3").warnings).toEqual([
41+
"Invalid number for minTokens",
42+
]);
43+
expect(filterSessionsByQuery([session], "minTokens:0x1000").warnings).toEqual([
44+
"Invalid number for minTokens",
45+
]);
46+
expect(filterSessionsByQuery([session], "minTokens:9007199254740993").warnings).toEqual([
47+
"Invalid number for minTokens",
48+
]);
49+
});
50+
3651
it("warns on unknown keys and invalid numbers", () => {
3752
const session = { key: "a", usage: { totalTokens: 10, totalCost: 0 } };
3853
const res = filterSessionsByQuery([session], "wat:1 minTokens:wat");

ui/src/ui/usage-helpers.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,15 @@ const parseQueryNumber = (value: string): number | null => {
7777
multiplier = 1_000_000;
7878
raw = raw.slice(0, -1);
7979
}
80+
if (!/^\d+(?:\.\d+)?$/.test(raw)) {
81+
return null;
82+
}
8083
const parsed = Number(raw);
81-
if (!Number.isFinite(parsed)) {
84+
const normalized = parsed * multiplier;
85+
if (!Number.isFinite(normalized) || !Number.isSafeInteger(Math.round(normalized))) {
8286
return null;
8387
}
84-
return parsed * multiplier;
88+
return normalized;
8589
};
8690

8791
export const extractQueryTerms = (query: string): UsageQueryTerm[] => {

0 commit comments

Comments
 (0)