diff --git a/ui/desktop/src/components/UserMessage.tsx b/ui/desktop/src/components/UserMessage.tsx index e9257fc8b2..df963d353b 100644 --- a/ui/desktop/src/components/UserMessage.tsx +++ b/ui/desktop/src/components/UserMessage.tsx @@ -27,6 +27,13 @@ export default function UserMessage({ message, onMessageUpdate }: UserMessagePro // Get current user info from Matrix context const { currentUser } = useMatrix(); + // Determine the sender info - use message sender if available, otherwise current user + const senderInfo = message.sender || { + userId: currentUser?.userId || 'unknown', + displayName: currentUser?.displayName || 'You', + avatarUrl: currentUser?.avatarUrl, + }; + // Extract text content from the message const textContent = getTextContent(message); @@ -260,8 +267,8 @@ export default function UserMessage({ message, onMessageUpdate }: UserMessagePro {/* Avatar on the right side */}
diff --git a/ui/desktop/src/hooks/useSessionSharing.ts b/ui/desktop/src/hooks/useSessionSharing.ts index 3c51ec5b8c..a50d79e1f9 100644 --- a/ui/desktop/src/hooks/useSessionSharing.ts +++ b/ui/desktop/src/hooks/useSessionSharing.ts @@ -153,13 +153,43 @@ export const useSessionSharing = ({ // Also listen for regular messages that might contain session data const handleRegularMessage = (data: any) => { - const { content, sender, roomId } = data; + const { content, sender, roomId, senderInfo } = data; // Only process messages from Matrix rooms that are part of our session if (state.roomId && roomId === state.roomId && sender !== currentUser?.userId) { - console.log('💬 Regular message in session room:', { content, sender, roomId }); + console.log('💬 Regular message in session room:', { content, sender, roomId, senderInfo }); - // Convert regular Matrix messages to Goose messages + // Find sender info from friends or participants + let senderData = senderInfo; + if (!senderData) { + // Try to find sender in friends list + const friend = friends.find(f => f.userId === sender); + if (friend) { + senderData = { + userId: friend.userId, + displayName: friend.displayName, + avatarUrl: friend.avatarUrl, + }; + } else { + // Try to find in participants + const participant = state.participants.find(p => p.userId === sender); + if (participant) { + senderData = { + userId: participant.userId, + displayName: participant.displayName, + avatarUrl: participant.avatarUrl, + }; + } else { + // Fallback to basic sender info + senderData = { + userId: sender, + displayName: sender.split(':')[0].substring(1), // Extract username from Matrix ID + }; + } + } + } + + // Convert regular Matrix messages to Goose messages with sender info const message: Message = { id: `matrix-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, role: 'user', @@ -168,9 +198,10 @@ export const useSessionSharing = ({ type: 'text', text: content, }], + sender: senderData, }; - console.log('💬 Converting regular Matrix message to Goose message:', message); + console.log('💬 Converting regular Matrix message to Goose message with sender:', message); onMessageSync?.(message); } }; diff --git a/ui/desktop/src/services/MatrixService.ts b/ui/desktop/src/services/MatrixService.ts index e0e9080217..8f67942ef3 100644 --- a/ui/desktop/src/services/MatrixService.ts +++ b/ui/desktop/src/services/MatrixService.ts @@ -475,6 +475,16 @@ export class MatrixService extends EventEmitter { const sender = event.getSender(); const isFromSelf = sender === this.config.userId; + // Get sender information + const senderUser = this.client?.getUser(sender); + const senderMember = room.getMember(sender); + + const senderInfo = { + userId: sender, + displayName: senderMember?.name || senderUser?.displayName || sender.split(':')[0].substring(1), + avatarUrl: senderMember?.getMxcAvatarUrl() || senderUser?.avatarUrl || null, + }; + const messageData = { roomId: room.roomId, sender, @@ -482,6 +492,7 @@ export class MatrixService extends EventEmitter { timestamp: new Date(event.getTs()), event, isFromSelf, + senderInfo, }; // Check if this is a structured Goose message (new format) diff --git a/ui/desktop/src/types/message.ts b/ui/desktop/src/types/message.ts index 578636d9c1..c3cb90f74e 100644 --- a/ui/desktop/src/types/message.ts +++ b/ui/desktop/src/types/message.ts @@ -108,6 +108,12 @@ export interface Message { role: Role; created: number; content: MessageContent[]; + // Optional sender metadata for collaborative sessions + sender?: { + userId: string; + displayName?: string; + avatarUrl?: string; + }; } // Helper functions to create messages