diff --git a/src/main/services/team/TeamLaunchStateEvaluator.ts b/src/main/services/team/TeamLaunchStateEvaluator.ts index 180821d3..3111e323 100644 --- a/src/main/services/team/TeamLaunchStateEvaluator.ts +++ b/src/main/services/team/TeamLaunchStateEvaluator.ts @@ -105,8 +105,14 @@ export function summarizePersistedLaunchMembers( let failedCount = 0; let runtimeAlivePendingCount = 0; const normalizedExpected = expectedMembers.map(normalizeMemberName).filter(Boolean); + const memberNames = Array.from( + new Set([ + ...normalizedExpected, + ...Object.keys(members).map(normalizeMemberName).filter(Boolean), + ]) + ); - for (const memberName of normalizedExpected) { + for (const memberName of memberNames) { const entry = members[memberName]; if (!entry) { pendingCount += 1; diff --git a/test/main/services/team/TeamLaunchStateEvaluator.test.ts b/test/main/services/team/TeamLaunchStateEvaluator.test.ts index 5f5c5344..d768b9d5 100644 --- a/test/main/services/team/TeamLaunchStateEvaluator.test.ts +++ b/test/main/services/team/TeamLaunchStateEvaluator.test.ts @@ -1,6 +1,9 @@ import { describe, expect, it } from 'vitest'; -import { snapshotToMemberSpawnStatuses } from '../../../../src/main/services/team/TeamLaunchStateEvaluator'; +import { + snapshotToMemberSpawnStatuses, + summarizePersistedLaunchMembers, +} from '../../../../src/main/services/team/TeamLaunchStateEvaluator'; describe('TeamLaunchStateEvaluator', () => { it('keeps member spawn statuses for persisted members even when expectedMembers is stale', () => { @@ -55,4 +58,27 @@ describe('TeamLaunchStateEvaluator', () => { pendingPermissionRequestIds: ['req-1'], }); }); + + it('counts persisted members in launch summary even when expectedMembers is stale', () => { + const summary = summarizePersistedLaunchMembers( + ['alice'], + { + alice: { + launchState: 'runtime_pending_bootstrap', + runtimeAlive: false, + }, + bob: { + launchState: 'runtime_pending_permission', + runtimeAlive: true, + }, + } as any + ); + + expect(summary).toEqual({ + confirmedCount: 0, + pendingCount: 2, + failedCount: 0, + runtimeAlivePendingCount: 1, + }); + }); });