fix: recover interrupted paired turn attempts

This commit is contained in:
ejclaw
2026-05-27 05:57:29 +09:00
parent c4e0e7459f
commit 0177437a8a
5 changed files with 283 additions and 1 deletions

View File

@@ -19,6 +19,7 @@ import { writeGroupsSnapshot } from './agent-runner.js';
import {
hasRecentRestartAnnouncement,
initDatabase,
recoverInterruptedPairedTurnAttemptsForService,
storeChatMetadata,
storeMessage,
} from './db.js';
@@ -259,6 +260,45 @@ async function announceRestartRecovery(
return null;
}
function queueInterruptedPairedTurnAttemptRecovery(): void {
for (const candidate of recoverInterruptedPairedTurnAttemptsForService({
serviceId: SERVICE_ID,
})) {
const binding = runtimeState.getRoomBindings()[candidate.chat_jid];
if (!binding) {
logger.warn(
{
chatJid: candidate.chat_jid,
groupFolder: candidate.group_folder,
taskId: candidate.task_id,
turnId: candidate.turn_id,
attemptId: candidate.attempt_id,
},
'Skipped interrupted paired turn recovery because room binding is missing',
);
continue;
}
queue.enqueueMessageCheck(
candidate.chat_jid,
resolveGroupIpcPath(binding.folder),
);
logger.info(
{
chatJid: candidate.chat_jid,
groupFolder: binding.folder,
taskId: candidate.task_id,
taskStatus: candidate.task_status,
turnId: candidate.turn_id,
attemptId: candidate.attempt_id,
attemptNo: candidate.attempt_no,
role: candidate.role,
intentKind: candidate.intent_kind,
},
'Queued interrupted paired turn attempt for restart recovery',
);
}
}
async function main(): Promise<void> {
const processStartedAtMs = Date.now();
initDatabase();
@@ -477,6 +517,7 @@ async function main(): Promise<void> {
});
queue.setProcessMessagesFn(runtime.processGroupMessages);
queue.enterRecoveryMode();
queueInterruptedPairedTurnAttemptRecovery();
runtime.recoverPendingMessages();
const restartContext = await announceRestartRecovery(processStartedAtMs);
const roomBindings = runtimeState.getRoomBindings();