From 30468a636dffcc399cd583cd1a1cd800ad2a4ed8 Mon Sep 17 00:00:00 2001 From: Bryan Date: Fri, 12 Jun 2026 14:22:17 -0400 Subject: [PATCH] fix(processor): detect doom loops across messages instead of within current message --- packages/opencode/src/session/processor.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 2554315908ce..0af880769c80 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -516,21 +516,18 @@ export const layer = Layer.effect( : value.providerMetadata, })) - const parts = yield* MessageV2.parts(ctx.assistantMessage.id).pipe( + const msgs = yield* MessageV2.filterCompactedEffect(ctx.sessionID).pipe( Effect.provideService(Database.Service, database), ) - const recentParts = parts.slice(-DOOM_LOOP_THRESHOLD) + const matchingParts = msgs.flatMap((m) => m.parts).filter( + (part) => + part.type === "tool" && + part.tool === value.name && + part.state.status !== "pending" && + JSON.stringify(part.state.input) === JSON.stringify(input), + ) - if ( - recentParts.length !== DOOM_LOOP_THRESHOLD || - !recentParts.every( - (part) => - part.type === "tool" && - part.tool === value.name && - part.state.status !== "pending" && - JSON.stringify(part.state.input) === JSON.stringify(input), - ) - ) { + if (matchingParts.length < DOOM_LOOP_THRESHOLD) { return }