diff --git a/ui/src/components/IssueChatThread.tsx b/ui/src/components/IssueChatThread.tsx index 0b28c3cc..6507fffc 100644 --- a/ui/src/components/IssueChatThread.tsx +++ b/ui/src/components/IssueChatThread.tsx @@ -360,7 +360,7 @@ function IssueChatUserMessage() { return ( -
+
- + You
@@ -508,26 +508,38 @@ function IssueChatAssistantMessage() { {message.createdAt ? formatShortDate(message.createdAt) : ""} - {runHref ? ( - - - - - + + + + + + { + const text = message.content + .filter((p): p is { type: "text"; text: string } => p.type === "text") + .map((p) => p.text) + .join("\n\n"); + void navigator.clipboard.writeText(text); + }} + > + + Copy message + + {runHref ? ( View run - - - ) : null} + ) : null} + +
@@ -830,38 +842,38 @@ function IssueChatSystemMessage() { const agentIcon = isAgent && actorId ? agentMap?.get(actorId)?.icon : undefined; const eventContent = ( -
-
+
+
{actorName} updated this task {timeAgo(message.createdAt)}
{statusChange ? ( -
- +
+ Status {humanizeValue(statusChange.from)} - + {humanizeValue(statusChange.to)}
) : null} {assigneeChange ? ( -
- +
+ Assignee {formatTimelineAssigneeLabel(assigneeChange.from, agentMap, currentUserId)} - + {formatTimelineAssigneeLabel(assigneeChange.to, agentMap, currentUserId)} @@ -873,7 +885,7 @@ function IssueChatSystemMessage() { if (isCurrentUser) { return ( -
+
{eventContent}
@@ -882,12 +894,12 @@ function IssueChatSystemMessage() { return ( -
- +
+ {agentIcon ? ( - + ) : ( - {initialsForName(actorName)} + {initialsForName(actorName)} )}
@@ -903,24 +915,24 @@ function IssueChatSystemMessage() { if (custom.kind === "run" && runId && runAgentId && displayedRunAgentName && runStatus) { return ( -
- +
+ {runAgentIcon ? ( - + ) : ( - {initialsForName(displayedRunAgentName)} + {initialsForName(displayedRunAgentName)} )}
-
+
{displayedRunAgentName} run {runId.slice(0, 8)} @@ -929,7 +941,7 @@ function IssueChatSystemMessage() { {timeAgo(message.createdAt)} diff --git a/ui/src/lib/assignees.test.ts b/ui/src/lib/assignees.test.ts index 225f7133..fbe57758 100644 --- a/ui/src/lib/assignees.test.ts +++ b/ui/src/lib/assignees.test.ts @@ -47,7 +47,7 @@ describe("assignee selection helpers", () => { }); it("formats current and board user labels consistently", () => { - expect(formatAssigneeUserLabel("user-1", "user-1")).toBe("Me"); + expect(formatAssigneeUserLabel("user-1", "user-1")).toBe("You"); expect(formatAssigneeUserLabel("local-board", "someone-else")).toBe("Board"); expect(formatAssigneeUserLabel("user-abcdef", "someone-else")).toBe("user-"); }); diff --git a/ui/src/lib/assignees.ts b/ui/src/lib/assignees.ts index 0dc57e96..87a278ce 100644 --- a/ui/src/lib/assignees.ts +++ b/ui/src/lib/assignees.ts @@ -76,7 +76,7 @@ export function formatAssigneeUserLabel( currentUserId: string | null | undefined, ): string | null { if (!userId) return null; - if (currentUserId && userId === currentUserId) return "Me"; + if (currentUserId && userId === currentUserId) return "You"; if (userId === "local-board") return "Board"; return userId.slice(0, 5); } diff --git a/ui/src/lib/issue-chat-messages.ts b/ui/src/lib/issue-chat-messages.ts index 6f0dc9c8..bfd172ef 100644 --- a/ui/src/lib/issue-chat-messages.ts +++ b/ui/src/lib/issue-chat-messages.ts @@ -485,6 +485,7 @@ export function buildIssueChatMessages(args: { } for (const run of [...linkedRuns].sort((a, b) => toTimestamp(runTimestamp(a)) - toTimestamp(runTimestamp(b)))) { + if (run.status === "succeeded") continue; orderedMessages.push({ createdAtMs: toTimestamp(runTimestamp(run)), order: 2,