diff --git a/packages/app/e2e/browser/usage-sidebar-item.spec.ts b/packages/app/e2e/browser/usage-sidebar-item.spec.ts index 9151403904..29772ffe17 100644 --- a/packages/app/e2e/browser/usage-sidebar-item.spec.ts +++ b/packages/app/e2e/browser/usage-sidebar-item.spec.ts @@ -469,3 +469,27 @@ test("visible usage summary requests reports on load", async ({ page }) => { await expectPinnedUsage(page, ["31% 5h", "54% wk", "7% 5h", "12% wk"]); expect(usage.listRequests()).toHaveLength(1); }); + +test("visible usage summary picks up changed reports without opening Usage", async ({ page }) => { + test.setTimeout(180_000); + const usage = await installUsageReportsFixture(page, { + lists: [() => claudeSessionAt(31), () => claudeSessionAt(80)], + }); + await seedSidebarFooterPreferences(page, [{ key: "usage", visible: true }]); + await page.setViewportSize(WIDE); + await page.clock.install(); + await gotoAppShell(page); + await expectPinnedUsage(page, ["31% 5h", "54% wk", "7% 5h", "12% wk"]); + expect(usage.listRequests()).toHaveLength(1); + + await page.clock.fastForward(61_000); + await expectPinnedUsage(page, ["80% 5h", "54% wk", "7% 5h", "12% wk"]); + await expect(usageModal(page)).toHaveCount(0); +}); + +function claudeSessionAt(usedPct: number) { + const reports = claudeAndCodexReports(); + const claude = reports[0]!; + if (claude.report.status === "available") claude.report.windows[0]!.usedPct = usedPct; + return reports; +} diff --git a/packages/app/src/usage/queries.ts b/packages/app/src/usage/queries.ts index 524972a010..1403cec77f 100644 --- a/packages/app/src/usage/queries.ts +++ b/packages/app/src/usage/queries.ts @@ -166,7 +166,8 @@ const NO_REPORTS: UsageReportEntry[] = []; /** * The reports of the sidebar's usage host, which is connected and reports usage; none until they - * load, or without a host. + * load, or without a host. Re-read every minute while the summary is shown, since the daemon never + * pushes report changes. */ export function useUsageHostReports(serverId: string | null): UsageReportEntry[] { const setting = useUsageSetting(serverId); @@ -177,6 +178,7 @@ export function useUsageHostReports(serverId: string | null): UsageReportEntry[] queryFn: serverId ? () => listReports(queryClient, serverId) : skipToken, dataShape: "list", staleTimeMs: REPORTS_STALE_TIME_MS, + refetchInterval: REPORTS_STALE_TIME_MS, }); return setting.enabled ? (query.data ?? NO_REPORTS) : NO_REPORTS; }