fix(team): clear stale permission launch state
This commit is contained in:
parent
76fca31fb1
commit
80beb3c877
2 changed files with 32 additions and 3 deletions
|
|
@ -375,8 +375,8 @@ export class RuntimePermissionRequestStore {
|
||||||
teamName: string;
|
teamName: string;
|
||||||
visibleProviderRequestIds: Set<string>;
|
visibleProviderRequestIds: Set<string>;
|
||||||
now: string;
|
now: string;
|
||||||
}): Promise<string[]> {
|
}): Promise<Array<Pick<RuntimePermissionRequestRecord, 'appRequestId' | 'memberName'>>> {
|
||||||
const expired: string[] = [];
|
const expired: Array<Pick<RuntimePermissionRequestRecord, 'appRequestId' | 'memberName'>> = [];
|
||||||
await this.store.updateLocked((records) =>
|
await this.store.updateLocked((records) =>
|
||||||
records.map((record) => {
|
records.map((record) => {
|
||||||
if (
|
if (
|
||||||
|
|
@ -387,7 +387,7 @@ export class RuntimePermissionRequestStore {
|
||||||
) {
|
) {
|
||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
expired.push(record.appRequestId);
|
expired.push({ appRequestId: record.appRequestId, memberName: record.memberName });
|
||||||
return {
|
return {
|
||||||
...record,
|
...record,
|
||||||
state: 'provider_missing' as const,
|
state: 'provider_missing' as const,
|
||||||
|
|
@ -648,6 +648,26 @@ export class RuntimePermissionReconciler {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clearedMembers = new Set(
|
||||||
|
expired
|
||||||
|
.map((record) => record.memberName)
|
||||||
|
.filter((memberName) => memberName.trim().length > 0)
|
||||||
|
.filter((memberName) => !pendingByMember.has(memberName))
|
||||||
|
);
|
||||||
|
for (const memberName of clearedMembers) {
|
||||||
|
await this.launchStateStore.updateMember(input.teamName, memberName, (member) => ({
|
||||||
|
...member,
|
||||||
|
launchState:
|
||||||
|
member.launchState === 'confirmed_alive'
|
||||||
|
? member.launchState
|
||||||
|
: member.bootstrapConfirmed
|
||||||
|
? 'confirmed_alive'
|
||||||
|
: 'runtime_pending_bootstrap',
|
||||||
|
pendingPermissionRequestIds: [],
|
||||||
|
lastRuntimeEventAt: now,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
for (const [memberName, requestIds] of pendingByMember) {
|
for (const [memberName, requestIds] of pendingByMember) {
|
||||||
await this.launchStateStore.updateMember(input.teamName, memberName, (member) => ({
|
await this.launchStateStore.updateMember(input.teamName, memberName, (member) => ({
|
||||||
...member,
|
...member,
|
||||||
|
|
|
||||||
|
|
@ -349,6 +349,11 @@ describe('RuntimePermissionRequestStore and services', () => {
|
||||||
|
|
||||||
it('expires local pending requests that disappeared from provider', async () => {
|
it('expires local pending requests that disappeared from provider', async () => {
|
||||||
await store.upsertPending(permissionRecord());
|
await store.upsertPending(permissionRecord());
|
||||||
|
await launchState.updateMember('team-a', 'alice', (member) => ({
|
||||||
|
...member,
|
||||||
|
launchState: 'runtime_pending_permission',
|
||||||
|
pendingPermissionRequestIds: ['opencode:run-1:perm_1'],
|
||||||
|
}));
|
||||||
client.pending = [];
|
client.pending = [];
|
||||||
const reconciler = new RuntimePermissionReconciler(
|
const reconciler = new RuntimePermissionReconciler(
|
||||||
client,
|
client,
|
||||||
|
|
@ -368,6 +373,10 @@ describe('RuntimePermissionRequestStore and services', () => {
|
||||||
state: 'provider_missing',
|
state: 'provider_missing',
|
||||||
lastError: 'Provider no longer lists this permission request',
|
lastError: 'Provider no longer lists this permission request',
|
||||||
});
|
});
|
||||||
|
expect(launchState.members.get('alice')).toMatchObject({
|
||||||
|
launchState: 'runtime_pending_bootstrap',
|
||||||
|
pendingPermissionRequestIds: [],
|
||||||
|
});
|
||||||
expect(diagnostics.append).toHaveBeenCalledWith(
|
expect(diagnostics.append).toHaveBeenCalledWith(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
type: 'opencode_permission_requests_expired',
|
type: 'opencode_permission_requests_expired',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue