From 0c4ba11ba2fbd3152a3ac5e0dfff24753e9145f8 Mon Sep 17 00:00:00 2001 From: Mr-Neutr0n <64578610+Mr-Neutr0n@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:18:37 +0530 Subject: [PATCH 1/2] fix: propagate abort signal to prevent TUI freeze during processing --- packages/opencode/src/session/processor.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index b5289e903a1..b0e03e45161 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -47,6 +47,7 @@ export namespace SessionProcessor { needsCompaction = false const shouldBreak = (await Config.get()).experimental?.continue_loop_on_deny !== true while (true) { + if (input.abort.aborted) break try { let currentText: MessageV2.TextPart | undefined let reasoningMap: Record = {} @@ -343,7 +344,7 @@ export namespace SessionProcessor { }) const error = MessageV2.fromError(e, { providerID: input.model.providerID }) const retry = SessionRetry.retryable(error) - if (retry !== undefined) { + if (retry !== undefined && !input.abort.aborted) { attempt++ const delay = SessionRetry.delay(attempt, error.name === "APIError" ? error : undefined) SessionStatus.set(input.sessionID, { @@ -353,9 +354,11 @@ export namespace SessionProcessor { next: Date.now() + delay, }) await SessionRetry.sleep(delay, input.abort).catch(() => {}) - continue + if (!input.abort.aborted) continue } - input.assistantMessage.error = error + input.assistantMessage.error = input.abort.aborted + ? new MessageV2.AbortedError({ message: "Aborted" }).toObject() + : error Bus.publish(Session.Event.Error, { sessionID: input.assistantMessage.sessionID, error: input.assistantMessage.error, @@ -397,9 +400,11 @@ export namespace SessionProcessor { await Session.updateMessage(input.assistantMessage) if (needsCompaction) return "compact" if (blocked) return "stop" + if (input.abort.aborted) return "stop" if (input.assistantMessage.error) return "stop" return "continue" } + return "stop" }, } return result From b9a416b117909702b5b1957d5070ea79e957b9f4 Mon Sep 17 00:00:00 2001 From: Mr-Neutr0n <64578610+Mr-Neutr0n@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:18:58 +0530 Subject: [PATCH 2/2] fix: auto-resume agent loop after context compaction --- packages/opencode/src/session/compaction.ts | 4 ++-- packages/opencode/src/session/prompt.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 73a70af9d46..23054577ed6 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -164,7 +164,8 @@ export namespace SessionCompaction { model, }) - if (result === "continue" && input.auto) { + if (processor.message.error) return "stop" + if (input.auto) { const continueMsg = await Session.updateMessage({ id: Identifier.ascending("message"), role: "user", @@ -188,7 +189,6 @@ export namespace SessionCompaction { }, }) } - if (processor.message.error) return "stop" Bus.publish(Event.Compacted, { sessionID: input.sessionID }) return "continue" } diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index d7f73b4f609..b198ad9506b 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -306,6 +306,7 @@ export namespace SessionPrompt { if ( lastAssistant?.finish && !["tool-calls", "unknown"].includes(lastAssistant.finish) && + !lastAssistant.summary && lastUser.id < lastAssistant.id ) { log.info("exiting loop", { sessionID })