From 8f1e223d61eea55b6729b3de7549fb468486b3b1 Mon Sep 17 00:00:00 2001 From: 777genius Date: Sat, 30 May 2026 22:57:41 +0300 Subject: [PATCH] perf(renderer): slow task refreshes during launch --- src/renderer/store/index.ts | 8 ++++- .../renderer/store/teamChangeThrottle.test.ts | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index 4e446744..ac63e068 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -363,6 +363,7 @@ export function initializeNotificationListeners(): () => void { const TEAM_MEMBER_SPAWN_REFRESH_THROTTLE_MS = 500; const TEAM_LIST_REFRESH_THROTTLE_MS = 2000; const GLOBAL_TASKS_REFRESH_THROTTLE_MS = 500; + const GLOBAL_TASKS_REFRESH_DURING_LAUNCH_THROTTLE_MS = 5000; const PROCESS_LITE_STRUCTURAL_RECONCILE_IDLE_MS = 2_500; const PROCESS_LITE_STRUCTURAL_RECONCILE_MAX_WAIT_MS = 15_000; const buildTeamChangeFanoutReason = (eventType: string): string => `event:${eventType}`; @@ -2054,6 +2055,11 @@ export function initializeNotificationListeners(): () => void { // Throttled refresh of global tasks list for sidebar. if (shouldRefreshGlobalTasks) { + const globalTasksRefreshDelayMs = shouldDeferAutomaticTeamDataRefreshDuringLaunch( + event.teamName + ) + ? GLOBAL_TASKS_REFRESH_DURING_LAUNCH_THROTTLE_MS + : GLOBAL_TASKS_REFRESH_THROTTLE_MS; noteGlobalRefreshScheduled( pendingGlobalTasksRefreshDiagnostics, event.teamName, @@ -2069,7 +2075,7 @@ export function initializeNotificationListeners(): () => void { 'fetchAllTasks' ); void useStore.getState().fetchAllTasks(); - }, GLOBAL_TASKS_REFRESH_THROTTLE_MS); + }, globalTasksRefreshDelayMs); } } diff --git a/test/renderer/store/teamChangeThrottle.test.ts b/test/renderer/store/teamChangeThrottle.test.ts index fa83a6a5..46e526d6 100644 --- a/test/renderer/store/teamChangeThrottle.test.ts +++ b/test/renderer/store/teamChangeThrottle.test.ts @@ -1101,6 +1101,35 @@ describe('team change throttling', () => { expect(snapshot?.counts['team-change-listener:event:config:fetchAllTasks:executed']).toBe(1); }); + it('slows global task refreshes during active provisioning', async () => { + const fetchAllTasksSpy = vi.fn(async () => undefined); + useStore.setState({ + fetchAllTasks: fetchAllTasksSpy, + currentProvisioningRunIdByTeam: { 'my-team': 'run-1' }, + provisioningRuns: { + 'run-1': { + runId: 'run-1', + teamName: 'my-team', + state: 'spawning', + message: 'Spawning', + startedAt: '2026-05-03T00:00:00.000Z', + updatedAt: '2026-05-03T00:00:00.000Z', + }, + }, + } as never); + + await vi.advanceTimersByTimeAsync(5000); + fetchAllTasksSpy.mockClear(); + + hoisted.onTeamChangeCb?.({}, { type: 'task', teamName: 'my-team' }); + + await vi.advanceTimersByTimeAsync(4999); + expect(fetchAllTasksSpy).not.toHaveBeenCalled(); + + await vi.advanceTimersByTimeAsync(1); + expect(fetchAllTasksSpy).toHaveBeenCalledTimes(1); + }); + it('lead-message refreshes message head only, not team list, tasks, or structural detail', async () => { const state = useStore.getState(); const fetchTeamsSpy = vi.spyOn(state, 'fetchTeams');