feat(webui): polish chat layout and titles

Align the WebUI sidebar and chat chrome with the updated design, and generate WebUI session titles asynchronously without blocking turns.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Xubin Ren
2026-05-06 22:20:35 +08:00
committed by Xubin Ren
co-authored by Cursor
parent d8fd4c80bf
commit 790a03ec28
33 changed files with 1270 additions and 312 deletions
+8 -1
View File
@@ -38,6 +38,7 @@ export function useNanobotStream(
chatId: string | null,
initialMessages: UIMessage[] = [],
hasPendingToolCalls = false,
onTurnEnd?: () => void,
): {
messages: UIMessage[];
isStreaming: boolean;
@@ -159,6 +160,12 @@ export function useNanobotStream(
setMessages((prev) =>
prev.map((m) => (m.isStreaming ? { ...m, isStreaming: false } : m)),
);
onTurnEnd?.();
return;
}
if (ev.event === "session_updated") {
onTurnEnd?.();
return;
}
@@ -233,7 +240,7 @@ export function useNanobotStream(
streamEndTimerRef.current = null;
}
};
}, [chatId, client]);
}, [chatId, client, onTurnEnd]);
const send = useCallback(
(content: string, images?: SendImage[]) => {
+2 -1
View File
@@ -61,6 +61,7 @@ export function useSessions(): {
chatId,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
title: "",
preview: "",
},
...prev.filter((s) => s.key !== key),
@@ -221,7 +222,7 @@ export function sessionTitle(
firstUserMessage?: string,
): string {
return deriveTitle(
firstUserMessage || session.preview,
session.title || firstUserMessage || session.preview,
i18n.t("chat.newChat"),
);
}