From 1d38aacf5c756127a095da43dbe6cf4cbf180df5 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 26 May 2026 11:54:36 +0700 Subject: [PATCH] Fix OpenCode replacement prompts after interrupt --- .../server/agent/providers/opencode-agent.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/server/src/server/agent/providers/opencode-agent.ts b/packages/server/src/server/agent/providers/opencode-agent.ts index c5be8b74e..6284b6f80 100644 --- a/packages/server/src/server/agent/providers/opencode-agent.ts +++ b/packages/server/src/server/agent/providers/opencode-agent.ts @@ -2491,6 +2491,25 @@ function unwrapOpenCodeGlobalEvent(event: unknown): OpenCodeEvent | null { return null; } +function isOpenCodeUserMessageEvent(event: OpenCodeEvent, sessionId: string): boolean { + return ( + event.type === "message.updated" && + event.properties.info.sessionID === sessionId && + event.properties.info.role === "user" + ); +} + +function isOpenCodeTerminalEvent(event: OpenCodeEvent, sessionId: string): boolean { + if (event.type === "session.idle" || event.type === "session.error") { + return event.properties.sessionID === sessionId; + } + return ( + event.type === "session.status" && + event.properties.sessionID === sessionId && + event.properties.status.type === "idle" + ); +} + class OpenCodeAgentSession implements AgentSession { readonly provider = "opencode" as const; readonly capabilities = OPENCODE_CAPABILITIES; @@ -2530,6 +2549,7 @@ class OpenCodeAgentSession implements AgentSession { private releaseServer: (() => void) | null; private eventStreamAbortController: AbortController | null = null; private eventStreamReady: Deferred | null = null; + private suppressTerminalUntilNextUserMessage = false; private closed = false; private readonly persistSession: boolean; private deletedFromProvider = false; @@ -2615,6 +2635,7 @@ class OpenCodeAgentSession implements AgentSession { ); }); if (turnId) { + this.suppressTerminalUntilNextUserMessage = true; this.finishForegroundTurn( { type: "turn_canceled", provider: "opencode", reason: "interrupted" }, turnId, @@ -3007,6 +3028,18 @@ class OpenCodeAgentSession implements AgentSession { }); return; } + if (this.suppressTerminalUntilNextUserMessage) { + if (isOpenCodeUserMessageEvent(event, this.sessionId)) { + this.suppressTerminalUntilNextUserMessage = false; + } else if (isOpenCodeTerminalEvent(event, this.sessionId)) { + this.traceOpenCode("provider.opencode.event.skip", { + n: eventCount, + reason: "stale_interrupt_terminal", + type: event.type, + }); + return; + } + } const translated = await this.translateEvent(event); this.traceOpenCode("provider.opencode.parsed_event", { turnId,