Skip to content

Commit 911f0d9

Browse files
authored
Adapt agent thread announcements to current thread UI
Render structured and legacy authorless agent announcements with the Agent identity in the Quill thread row, and keep message actions limited to human messages. Add regression coverage for the current component. Generated-By: PostHog Code Task-Id: 152cf34b-23c8-4e87-be9e-12d727e08edd
1 parent 5ce84d0 commit 911f0d9

2 files changed

Lines changed: 47 additions & 5 deletions

File tree

packages/ui/src/features/canvas/components/ThreadPanel.test.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import type { ConversationItem } from "@posthog/ui/features/sessions/components/buildConversationItems";
22
import { render, screen } from "@testing-library/react";
33
import { describe, expect, it } from "vitest";
4-
import { AgentStatusLine, UserPromptRow } from "./ThreadPanel";
4+
import {
5+
AgentStatusLine,
6+
ThreadMessageRow,
7+
UserPromptRow,
8+
} from "./ThreadPanel";
59
import { agentTurns } from "./threadAgentTurns";
610

711
describe("agentTurns", () => {
@@ -45,6 +49,33 @@ describe("AgentStatusLine", () => {
4549
});
4650
});
4751

52+
describe("ThreadMessageRow", () => {
53+
it("renders backend-authored agent announcements as Agent", () => {
54+
render(
55+
<ThreadMessageRow
56+
message={{
57+
id: "announcement",
58+
task: "task",
59+
author_kind: "agent",
60+
event: "canvas_created",
61+
payload: {},
62+
content: "Canvas created",
63+
created_at: "2026-07-17T00:00:00Z",
64+
author: null,
65+
}}
66+
isTaskAuthor={false}
67+
isOwnMessage={false}
68+
canForward={false}
69+
onSendToAgent={() => {}}
70+
onDelete={() => {}}
71+
/>,
72+
);
73+
74+
expect(screen.getByText("Agent")).toBeInTheDocument();
75+
expect(screen.queryByText("Unknown")).not.toBeInTheDocument();
76+
});
77+
});
78+
4879
describe("UserPromptRow", () => {
4980
it("prefixes direct task prompts with @agent", () => {
5081
render(

packages/ui/src/features/canvas/components/ThreadPanel.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ import { track } from "@posthog/ui/shell/analytics";
8787
import { useQuery } from "@tanstack/react-query";
8888
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8989

90-
function ThreadMessageRow({
90+
export function ThreadMessageRow({
9191
message,
9292
isTaskAuthor,
9393
isOwnMessage,
@@ -105,18 +105,29 @@ function ThreadMessageRow({
105105
onDelete: () => void;
106106
}) {
107107
const forwarded = !!message.forwarded_to_agent_at;
108-
const showMenu = (isTaskAuthor && !forwarded) || isOwnMessage;
108+
const isAgent =
109+
message.author_kind === "agent" ||
110+
(!message.author_kind && !message.author);
111+
const showMenu = !isAgent && ((isTaskAuthor && !forwarded) || isOwnMessage);
109112

110113
return (
111114
<ThreadItem>
112115
<ThreadItemGutter>
113116
<Avatar size="lg" className="sticky top-2">
114-
<AvatarFallback>{getUserInitials(message.author)}</AvatarFallback>
117+
<AvatarFallback>
118+
{isAgent ? (
119+
<RobotIcon size={14} />
120+
) : (
121+
getUserInitials(message.author)
122+
)}
123+
</AvatarFallback>
115124
</Avatar>
116125
</ThreadItemGutter>
117126
<ThreadItemContent>
118127
<ThreadItemHeader>
119-
<ThreadItemAuthor>{userDisplayName(message.author)}</ThreadItemAuthor>
128+
<ThreadItemAuthor>
129+
{isAgent ? "Agent" : userDisplayName(message.author)}
130+
</ThreadItemAuthor>
120131
<ThreadTimestamp dateTime={message.created_at} />
121132
</ThreadItemHeader>
122133
<ThreadItemBody>

0 commit comments

Comments
 (0)