From 439c09668ea7d5cf8804a4d20cd90a10055bf1ad Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 30 May 2026 06:06:19 -0400 Subject: [PATCH] fix(ui): ignore invalid usage export timestamps --- ui/src/ui/views/usage-query.test.ts | 19 +++++++++++++++++++ ui/src/ui/views/usage-query.ts | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 ui/src/ui/views/usage-query.test.ts diff --git a/ui/src/ui/views/usage-query.test.ts b/ui/src/ui/views/usage-query.test.ts new file mode 100644 index 00000000000..1c7197de771 --- /dev/null +++ b/ui/src/ui/views/usage-query.test.ts @@ -0,0 +1,19 @@ +// @vitest-environment node +import { describe, expect, it } from "vitest"; +import { buildSessionsCsv } from "./usage-query.ts"; +import type { UsageSessionEntry } from "./usageTypes.ts"; + +describe("usage query CSV export", () => { + it("omits invalid session updated timestamps instead of throwing", () => { + const csv = buildSessionsCsv([ + { + key: "session-1", + label: "Session 1", + updatedAt: Number.POSITIVE_INFINITY, + usage: null, + } satisfies UsageSessionEntry, + ]); + + expect(csv).toContain("session-1,Session 1,,,,,,,,,,,,,,,"); + }); +}); diff --git a/ui/src/ui/views/usage-query.ts b/ui/src/ui/views/usage-query.ts index 1a3e9f97642..148e7114fe5 100644 --- a/ui/src/ui/views/usage-query.ts +++ b/ui/src/ui/views/usage-query.ts @@ -1,3 +1,4 @@ +import { timestampMsToIsoString } from "../../../../src/shared/number-coercion.js"; import { normalizeLowercaseStringOrEmpty, uniqueStrings } from "../string-coerce.ts"; import { extractQueryTerms } from "../usage-helpers.ts"; import type { CostDailyEntry, UsageAggregates, UsageSessionEntry } from "./usageTypes.ts"; @@ -63,7 +64,7 @@ const buildSessionsCsv = (sessions: UsageSessionEntry[]): string => { session.channel ?? "", session.modelProvider ?? session.providerOverride ?? "", session.model ?? session.modelOverride ?? "", - session.updatedAt ? new Date(session.updatedAt).toISOString() : "", + timestampMsToIsoString(session.updatedAt) ?? "", usage?.durationMs ?? "", usage?.messageCounts?.total ?? "", usage?.messageCounts?.errors ?? "",