Fix OpenCode replacement prompts after interrupt

This commit is contained in:
Mohamed Boudra
2026-05-26 11:54:36 +07:00
parent a3071b46a4
commit 1d38aacf5c
@@ -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<void> | 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,