fix(team): keep persisted launch members in spawn statuses

This commit is contained in:
777genius 2026-04-23 01:59:59 +03:00
parent 53d45c5e30
commit 72517418d9
2 changed files with 65 additions and 1 deletions

View file

@ -484,7 +484,13 @@ export function snapshotToMemberSpawnStatuses(
): Record<string, MemberSpawnStatusEntry> {
if (!snapshot) return {};
const statuses: Record<string, MemberSpawnStatusEntry> = {};
for (const memberName of snapshot.expectedMembers) {
const memberNames = Array.from(
new Set([
...snapshot.expectedMembers.map(normalizeMemberName).filter(Boolean),
...Object.keys(snapshot.members).map(normalizeMemberName).filter(Boolean),
])
);
for (const memberName of memberNames) {
const entry = snapshot.members[memberName];
if (!entry) continue;
let status: MemberSpawnStatusEntry['status'] = 'offline';

View file

@ -0,0 +1,58 @@
import { describe, expect, it } from 'vitest';
import { snapshotToMemberSpawnStatuses } from '../../../../src/main/services/team/TeamLaunchStateEvaluator';
describe('TeamLaunchStateEvaluator', () => {
it('keeps member spawn statuses for persisted members even when expectedMembers is stale', () => {
const statuses = snapshotToMemberSpawnStatuses({
version: 1,
teamName: 'my-team',
runId: 'run-1',
leadSessionId: 'lead-session',
expectedMembers: ['alice'],
bootstrapExpectedMembers: ['alice'],
updatedAt: '2026-04-23T00:00:00.000Z',
launchPhase: 'active',
teamLaunchState: 'partial_pending',
summary: {
confirmedCount: 0,
pendingCount: 2,
failedCount: 0,
runtimeAlivePendingCount: 0,
},
members: {
alice: {
launchState: 'runtime_pending_bootstrap',
diagnostics: ['waiting for teammate check-in'],
agentToolAccepted: true,
runtimeAlive: false,
bootstrapConfirmed: false,
hardFailure: false,
lastEvaluatedAt: '2026-04-23T00:00:00.000Z',
sources: {},
},
bob: {
launchState: 'runtime_pending_permission',
diagnostics: ['waiting for permission approval'],
agentToolAccepted: true,
runtimeAlive: true,
bootstrapConfirmed: false,
hardFailure: false,
pendingPermissionRequestIds: ['req-1'],
lastEvaluatedAt: '2026-04-23T00:00:01.000Z',
sources: {},
},
},
} as any);
expect(statuses.alice).toMatchObject({
launchState: 'runtime_pending_bootstrap',
status: 'waiting',
});
expect(statuses.bob).toMatchObject({
launchState: 'runtime_pending_permission',
status: 'online',
pendingPermissionRequestIds: ['req-1'],
});
});
});