Mark pending tool components as aborted when streaming is interrupted

When user presses Esc during tool argument streaming, the assistant
message ends with stopReason="aborted" but tool execution never starts.
Now we check for aborted/error stopReasons in message_end and update
all pending tool execution components to show red error state with
"Operation aborted" message.

This fixes the issue where tool components stayed stuck in blue/pending
state after aborting during JSON streaming.
This commit is contained in:
Mario Zechner 2025-11-11 23:37:05 +01:00
parent 594edec31b
commit 2fdd304fbf

View file

@ -213,6 +213,21 @@ export class TuiRenderer {
break;
}
if (this.streamingComponent && event.message.role === "assistant") {
const assistantMsg = event.message as AssistantMessage;
// If message was aborted or errored, mark all pending tool components as failed
if (assistantMsg.stopReason === "aborted" || assistantMsg.stopReason === "error") {
const errorMessage =
assistantMsg.stopReason === "aborted" ? "Operation aborted" : assistantMsg.errorMessage || "Error";
for (const [toolCallId, component] of this.pendingTools.entries()) {
component.updateResult({
output: errorMessage,
isError: true,
});
}
this.pendingTools.clear();
}
// Keep the streaming component - it's now the final assistant message
this.streamingComponent = null;
}