diff --git a/src/message-agent-executor.ts b/src/message-agent-executor.ts index 16e590c..877bf7a 100644 --- a/src/message-agent-executor.ts +++ b/src/message-agent-executor.ts @@ -1076,13 +1076,16 @@ export async function runAgentForGroup( // After owner/reviewer completes, enqueue the next turn so // the message loop picks it up without waiting for a new message. - // Skip if owner produced no output — likely interrupted by /stop. + // Skip if: no output (interrupted), or task already completed (ESCALATE, done, etc.) if ( pairedExecutionContext && pairedExecutionStatus === 'succeeded' && pairedSawOutput ) { - deps.queue.enqueueMessageCheck(chatJid); + const finishedCheck = getPairedTaskById(pairedExecutionContext.task.id); + if (finishedCheck?.status !== 'completed') { + deps.queue.enqueueMessageCheck(chatJid); + } } } } diff --git a/src/paired-execution-context.ts b/src/paired-execution-context.ts index 4d560f5..5552054 100644 --- a/src/paired-execution-context.ts +++ b/src/paired-execution-context.ts @@ -246,7 +246,12 @@ export function preparePairedExecutionContext(args: { return undefined; } - const task = ensureActiveTask(group, chatJid, roomRoleContext, args.hasHumanMessage); + const task = ensureActiveTask( + group, + chatJid, + roomRoleContext, + args.hasHumanMessage, + ); if (!task) { return undefined; }