Align live tool event rendering

This commit is contained in:
Federico Jaramillo Martinez
2026-05-07 14:03:12 +02:00
parent 0b7872b479
commit 886c0fcde9
3 changed files with 42 additions and 6 deletions
@@ -1,6 +1,7 @@
import { api, type CommandResult, type SessionActivity, type SessionInfo, type SessionStatus } from "../api";
import { appendText, normalizeMessages, textMessage } from "../chatMessages";
import { GlobalSessionSocket, SessionSocket, type SessionUiEvent } from "../sessionSocket";
import type { ChatLine, ChatPart } from "../components/shared";
import type { GetState, SetState, UpdateUrl } from "./types";
export class SessionController {
@@ -139,9 +140,9 @@ export class SessionController {
if (event.type === "assistant.delta") {
this.setState({ messages: appendText(messages, "assistant", event.text) });
} else if (event.type === "tool.start") {
this.setState({ messages: [...messages, { role: "tool", parts: [{ type: "toolCall", toolName: event.toolName, summary: "" }] }] });
this.setState({ messages: appendPart(messages, "assistant", { type: "toolCall", toolName: event.toolName, summary: event.summary }) });
} else if (event.type === "tool.end") {
this.setState({ messages: [...messages, textMessage("tool", `${event.isError ? "✖" : "✓"} ${event.toolName}`)] });
this.setState({ messages: [...messages, { role: "tool", parts: [{ type: "toolResult", toolName: event.toolName, text: event.text, isError: event.isError }] }] });
} else if (event.type === "status.update") {
this.applyStatus(event.status);
} else if (event.type === "activity.update") {
@@ -153,3 +154,9 @@ export class SessionController {
}
}
}
function appendPart(messages: ChatLine[], role: ChatLine["role"], part: ChatPart): ChatLine[] {
const last = messages.at(-1);
if (last?.role === role) return [...messages.slice(0, -1), { ...last, parts: [...last.parts, part] }];
return [...messages, { role, parts: [part] }];
}
+2 -2
View File
@@ -2,8 +2,8 @@ import { globalSessionEvents, sessionEvents, type SessionActivity, type SessionS
export type SessionUiEvent =
| { type: "assistant.delta"; text: string }
| { type: "tool.start"; toolName: string }
| { type: "tool.end"; toolName: string; isError: boolean }
| { type: "tool.start"; toolName: string; summary: string }
| { type: "tool.end"; toolName: string; text: string; isError: boolean }
| { type: "status.update"; status: SessionStatus }
| { type: "activity.update"; activity: SessionActivity }
| { type: "command.output"; level: "info" | "success" | "error"; message: string }