diff --git a/src/renderer/components/team/activity/ActivityItem.tsx b/src/renderer/components/team/activity/ActivityItem.tsx
index 95f4e7ce..7c35ed10 100644
--- a/src/renderer/components/team/activity/ActivityItem.tsx
+++ b/src/renderer/components/team/activity/ActivityItem.tsx
@@ -91,6 +91,21 @@ export function getCrossTeamSentTarget(
return recipient.teamName;
}
+export function getCrossTeamSentMemberName(value: string | undefined): string | null {
+ return parseQualifiedRecipient(value)?.memberName ?? null;
+}
+
+function CrossTeamTeamBadge({ teamName }: { teamName: string }): React.JSX.Element {
+ return (
+
+ {teamName}
+
+ );
+}
+
interface ActivityItemProps {
message: InboxMessage;
teamName: string;
@@ -319,6 +334,10 @@ export const ActivityItem = ({
() => getCrossTeamSentTarget(message.to, teamName, localMemberNames),
[message.to, teamName, localMemberNames]
);
+ const crossTeamSentMemberName = useMemo(
+ () => getCrossTeamSentMemberName(message.to),
+ [message.to]
+ );
const isCrossTeam = message.source === CROSS_TEAM_SOURCE || parsedCrossTeamPrefix !== null;
const isCrossTeamSent =
message.source === CROSS_TEAM_SENT_SOURCE ||
@@ -344,6 +363,10 @@ export const ActivityItem = ({
if (dot <= 0) return message.to;
return message.to.substring(0, dot);
}, [crossTeamSentTarget, isCrossTeamSent, message.to, qualifiedRecipient]);
+ const senderName = crossTeamOrigin ? crossTeamOrigin.memberName : message.from;
+ const senderColor = crossTeamOrigin ? undefined : (memberColor ?? message.color);
+ const senderHideAvatar =
+ message.from === 'user' || message.from === 'system' || crossTeamOrigin?.memberName === 'user';
// Strip agent-only blocks + normalize escape sequences (before linkification)
const strippedText = useMemo(() => {
@@ -477,15 +500,13 @@ export const ActivityItem = ({
) : null}
{/* Sender avatar + name badge */}
+ {crossTeamOrigin ? : null}
{/* Role */}
@@ -517,26 +538,6 @@ export const ActivityItem = ({
) : null}
- {/* Cross-team origin badge */}
- {isCrossTeam && crossTeamOrigin ? (
-
- from {crossTeamOrigin.teamName}
-
- ) : null}
-
- {/* Cross-team sent badge */}
- {isCrossTeamSent && crossTeamTarget ? (
-
- to {crossTeamTarget}
-
- ) : null}
-
{/* Rate limit warning badge */}
{rateLimited ? (
@@ -559,15 +560,19 @@ export const ActivityItem = ({
→
-
+ {crossTeamTarget ? : null}
+ {crossTeamSentMemberName || !crossTeamTarget ? (
+
+ ) : null}
>
) : null}
diff --git a/test/renderer/components/team/activity/ActivityItem.test.ts b/test/renderer/components/team/activity/ActivityItem.test.ts
index 6f20ad17..9920636e 100644
--- a/test/renderer/components/team/activity/ActivityItem.test.ts
+++ b/test/renderer/components/team/activity/ActivityItem.test.ts
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest';
import {
+ getCrossTeamSentMemberName,
getCrossTeamSentTarget,
getSystemMessageLabel,
isQualifiedExternalRecipient,
@@ -37,5 +38,7 @@ describe('ActivityItem legacy system message fallback', () => {
expect(getCrossTeamSentTarget('team-best.user', 'my-team', new Set(['ops.bot']))).toBe(
'team-best'
);
+ expect(getCrossTeamSentMemberName('team-best.user')).toBe('user');
+ expect(getCrossTeamSentMemberName('cross-team:team-best')).toBeNull();
});
});