diff --git a/frontend/web/src/components/chat.tsx b/frontend/web/src/components/chat.tsx index cc7a476..54384fb 100644 --- a/frontend/web/src/components/chat.tsx +++ b/frontend/web/src/components/chat.tsx @@ -120,11 +120,14 @@ function statusLabel(status: ToolStatus): string { * concrete client the message came from, e.g. "来自 web:chrome:a1b2c3". Rendered * only when a deviceId is present, so legacy/unlabelled messages stay clean. The * Web client defaults to this label; other clients decide themselves. */ -function SourceLabel({ deviceId }: { deviceId?: string }): React.ReactNode { +function SourceLabel({ deviceId, role }: { deviceId?: string; role?: string }): React.ReactNode { if (!deviceId) return null; + // A user message is received FROM a client; an assistant reply goes TO the + // client that prompted it. Semantic direction differs — "来自" vs "发送至". + const dir = role === "assistant" ? "发送至" : "来自"; return (
- 来自 {deviceId} + {dir} {deviceId}
); } @@ -213,7 +216,7 @@ function AssistantParaBubble({ {full && message.mood ? (
心情 · {message.mood}
) : null} - {full ? : null} + {full ? : null} {full ? : null} {full ? : null} {full ? message.tools?.map((t, i) => ) : null} @@ -245,7 +248,7 @@ function UserParaBubble({ ) : null} {renderContent(text)} - {full ? : null} + {full ? : null} ); } @@ -319,7 +322,7 @@ function UserBubble({ message, mode }: { message: ChatMessage; mode: Mode }): Re ) : null} {body} - + ); @@ -345,7 +348,7 @@ function AssistantBubble({ {message.mood ? (
心情 · {message.mood}
) : null} - + {message.tools?.map((t, i) => )}