diff --git a/src/main/services/team/TeamProvisioningService.ts b/src/main/services/team/TeamProvisioningService.ts index 50657bf9..d2229412 100644 --- a/src/main/services/team/TeamProvisioningService.ts +++ b/src/main/services/team/TeamProvisioningService.ts @@ -9333,6 +9333,9 @@ export class TeamProvisioningService { bootstrapConfirmed: evidence?.bootstrapConfirmed === true, hardFailure: evidence?.hardFailure === true || launchState === 'failed_to_start', hardFailureReason: evidence?.hardFailureReason, + pendingPermissionRequestIds: evidence?.pendingPermissionRequestIds?.length + ? [...new Set(evidence.pendingPermissionRequestIds)] + : undefined, firstSpawnAcceptedAt: evidence?.agentToolAccepted ? now : undefined, lastHeartbeatAt: evidence?.bootstrapConfirmed ? now : undefined, lastRuntimeAliveAt: evidence?.runtimeAlive ? now : undefined, diff --git a/test/main/services/team/TeamProvisioningService.test.ts b/test/main/services/team/TeamProvisioningService.test.ts index 7dd5363c..bedda02d 100644 --- a/test/main/services/team/TeamProvisioningService.test.ts +++ b/test/main/services/team/TeamProvisioningService.test.ts @@ -3014,6 +3014,41 @@ describe('TeamProvisioningService', () => { ).rejects.toThrow(); }); + it('preserves pending permission request ids for pure OpenCode launch-state members', () => { + const svc = new TeamProvisioningService(); + + const member = (svc as any).toOpenCodePersistedLaunchMember( + { + name: 'alice', + providerId: 'opencode', + model: 'minimax-m2.5-free', + effort: 'medium', + }, + { + launchState: 'runtime_pending_permission', + agentToolAccepted: true, + runtimeAlive: true, + bootstrapConfirmed: false, + hardFailure: false, + hardFailureReason: undefined, + pendingPermissionRequestIds: [ + 'opencode:run-1:perm-1', + 'opencode:run-1:perm-1', + 'opencode:run-1:perm-2', + ], + diagnostics: ['waiting for permission approval'], + } + ); + + expect(member).toMatchObject({ + name: 'alice', + providerId: 'opencode', + launchState: 'runtime_pending_permission', + pendingPermissionRequestIds: ['opencode:run-1:perm-1', 'opencode:run-1:perm-2'], + diagnostics: ['waiting for permission approval'], + }); + }); + it('fails early when the previous tmux pane does not exit before restart', async () => { vi.useFakeTimers();