From 15f72199970a2028db1c5565024b5efc1947dd60 Mon Sep 17 00:00:00 2001 From: 777genius Date: Thu, 23 Apr 2026 01:48:25 +0300 Subject: [PATCH] fix(team): clear permission state after approval --- .../opencode/permissions/RuntimePermission.ts | 8 ++++++ .../services/team/RuntimePermission.test.ts | 26 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/services/team/opencode/permissions/RuntimePermission.ts b/src/main/services/team/opencode/permissions/RuntimePermission.ts index ae628428..1186101b 100644 --- a/src/main/services/team/opencode/permissions/RuntimePermission.ts +++ b/src/main/services/team/opencode/permissions/RuntimePermission.ts @@ -536,6 +536,14 @@ export class RuntimePermissionAnswerService { .map((pendingRecord) => pendingRecord.appRequestId); await this.launchStateStore.updateMember(record.teamName, record.memberName, (member) => ({ ...member, + launchState: + remainingMemberPendingIds.length > 0 + ? 'runtime_pending_permission' + : member.launchState === 'confirmed_alive' + ? member.launchState + : member.bootstrapConfirmed + ? 'confirmed_alive' + : 'runtime_pending_bootstrap', pendingPermissionRequestIds: remainingMemberPendingIds, lastRuntimeEventAt: answeredAt, })); diff --git a/test/main/services/team/RuntimePermission.test.ts b/test/main/services/team/RuntimePermission.test.ts index cad88a03..97764482 100644 --- a/test/main/services/team/RuntimePermission.test.ts +++ b/test/main/services/team/RuntimePermission.test.ts @@ -203,6 +203,32 @@ describe('RuntimePermissionRequestStore and services', () => { answerOrigin: 'provider_side_effect_projection', }); expect(launchState.members.get('alice')).toMatchObject({ + launchState: 'runtime_pending_bootstrap', + pendingPermissionRequestIds: [], + }); + }); + + it('keeps confirmed_alive after answering the last pending permission', async () => { + await store.upsertPending(permissionRecord()); + launchState.members.set('alice', { + launchState: 'confirmed_alive', + bootstrapConfirmed: true, + pendingPermissionRequestIds: ['opencode:run-1:perm_1'], + }); + + await expect( + answerService().answer({ + appRequestId: 'opencode:run-1:perm_1', + runId: 'run-1', + decision: 'once', + }) + ).resolves.toMatchObject({ + ok: true, + diagnostics: [], + }); + + expect(launchState.members.get('alice')).toMatchObject({ + launchState: 'confirmed_alive', pendingPermissionRequestIds: [], }); });