From f74561fe9b48c478c002daec39b8797f1dd0ede6 Mon Sep 17 00:00:00 2001 From: "Kai (Tam Nhu) Tran" <61256810+kaitranntt@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:48:11 -0400 Subject: [PATCH] fix: avoid quadratic cliproxy usage hydration (#1537) Replaces O(n^2) usage hydration in the cliproxy merge path with a linear lookup. --- src/web-server/usage/cliproxy-usage-transformer.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/web-server/usage/cliproxy-usage-transformer.ts b/src/web-server/usage/cliproxy-usage-transformer.ts index 0a6cfcdd..44c953a5 100644 --- a/src/web-server/usage/cliproxy-usage-transformer.ts +++ b/src/web-server/usage/cliproxy-usage-transformer.ts @@ -275,15 +275,19 @@ function hydrateProviderlessHistoryDetails( existing: CliproxyUsageHistoryDetail[], incoming: CliproxyUsageHistoryDetail[] ): CliproxyUsageHistoryDetail[] { + if (!existing.some((detail) => !detail.provider)) return existing; + const incomingByProviderlessSignature = new Map(); for (const detail of incoming) { if (!detail.provider) continue; const signature = createProviderlessHistorySignature(detail); - incomingByProviderlessSignature.set(signature, [ - ...(incomingByProviderlessSignature.get(signature) ?? []), - detail, - ]); + const matches = incomingByProviderlessSignature.get(signature); + if (matches) { + matches.push(detail); + } else { + incomingByProviderlessSignature.set(signature, [detail]); + } } return existing.map((detail) => {