diff --git a/CHANGELOG.md b/CHANGELOG.md index bb52cc8e6..76286bf76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ Status: beta. - **BREAKING:** Gateway auth mode "none" is removed; gateway now requires token/password (Tailscale Serve identity still allowed). ### Fixes +- Agents: add error handling to orphaned message cleanup to prevent message processing queue from blocking. (#2262) - Discord: restore username directory lookup in target resolution. (#3131) Thanks @bonald. - Agents: align MiniMax base URL test expectation with default provider config. (#3131) Thanks @bonald. - Agents: prevent retries on oversized image errors and surface size limits. (#2871) Thanks @Suksham-sharma. diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index 46a53bd8f..4388932e5 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -717,18 +717,26 @@ export async function runEmbeddedAttempt( }); // Repair orphaned trailing user messages so new prompts don't violate role ordering. - const leafEntry = sessionManager.getLeafEntry(); - if (leafEntry?.type === "message" && leafEntry.message.role === "user") { - if (leafEntry.parentId) { - sessionManager.branch(leafEntry.parentId); - } else { - sessionManager.resetLeaf(); + try { + const leafEntry = sessionManager.getLeafEntry(); + if (leafEntry?.type === "message" && leafEntry.message.role === "user") { + if (leafEntry.parentId) { + sessionManager.branch(leafEntry.parentId); + } else { + sessionManager.resetLeaf(); + } + const sessionContext = sessionManager.buildSessionContext(); + activeSession.agent.replaceMessages(sessionContext.messages); + log.warn( + `Removed orphaned user message to prevent consecutive user turns. ` + + `runId=${params.runId} sessionId=${params.sessionId}`, + ); } - const sessionContext = sessionManager.buildSessionContext(); - activeSession.agent.replaceMessages(sessionContext.messages); - log.warn( - `Removed orphaned user message to prevent consecutive user turns. ` + + } catch (err) { + log.error( + `Failed to repair orphaned user message, continuing anyway. ` + `runId=${params.runId} sessionId=${params.sessionId}`, + { error: err instanceof Error ? err.message : String(err) }, ); }