Deduplicate direct terminal reviewer deliveries

This commit is contained in:
Eyejoker
2026-04-05 06:57:39 +09:00
parent da6e428650
commit e560fe6536
3 changed files with 264 additions and 1 deletions

View File

@@ -48,6 +48,7 @@ interface GroupState {
runPhase: RunPhase;
runningTaskId: string | null;
currentRunId: string | null;
directTerminalDeliveryRoles: Set<string>;
pendingMessages: boolean;
pendingTasks: QueuedTask[];
process: ChildProcess | null;
@@ -113,6 +114,7 @@ function resetRunState(state: GroupState, groupJid: string): void {
state.process = null;
state.processName = null;
state.ipcDir = null;
state.directTerminalDeliveryRoles.clear();
transitionRunPhase(state, groupJid, 'idle');
}
@@ -197,6 +199,7 @@ export class GroupQueue {
runPhase: 'idle',
runningTaskId: null,
currentRunId: null,
directTerminalDeliveryRoles: new Set(),
pendingMessages: false,
pendingTasks: [],
process: null,
@@ -421,6 +424,41 @@ export class GroupQueue {
}
}
noteDirectTerminalDelivery(
groupJid: string,
senderRole?: string | null,
): void {
const state = this.getGroup(groupJid);
if (
state.runPhase !== 'running_messages' ||
!state.currentRunId ||
!senderRole
) {
return;
}
state.directTerminalDeliveryRoles.add(senderRole);
logger.info(
{
groupJid,
runId: state.currentRunId,
senderRole,
},
'Recorded direct terminal delivery for active run',
);
}
hasDirectTerminalDeliveryForRun(
groupJid: string,
runId: string,
senderRole?: string | null,
): boolean {
const state = this.getGroup(groupJid);
if (state.currentRunId !== runId || !senderRole) {
return false;
}
return state.directTerminalDeliveryRoles.has(senderRole);
}
private clearPostCloseTimers(state: GroupState): void {
if (state.postCloseTermTimer) {
clearTimeout(state.postCloseTermTimer);