import React, { useMemo } from 'react'; import LinkPreview from './LinkPreview'; import GooseResponseForm from './GooseResponseForm'; import { extractUrls } from '../utils/urlUtils'; import MarkdownContent from './MarkdownContent'; import ToolCallWithResponse from './ToolCallWithResponse'; import { Message, getTextContent, getToolRequests, getToolResponses, getToolConfirmationContent, } from '../types/message'; import ToolCallConfirmation from './ToolCallConfirmation'; interface GooseMessageProps { message: Message; messages: Message[]; metadata?: string[]; append: (value: string) => void; } export default function GooseMessage({ message, metadata, messages, append }: GooseMessageProps) { // Extract text content from the message let textContent = getTextContent(message); // Get tool requests from the message const toolRequests = getToolRequests(message); // Extract URLs under a few conditions // 1. The message is purely text // 2. The link wasn't also present in the previous message // 3. The message contains the explicit http:// or https:// protocol at the beginning const messageIndex = messages?.findIndex((msg) => msg.id === message.id); const previousMessage = messageIndex > 0 ? messages[messageIndex - 1] : null; const previousUrls = previousMessage ? extractUrls(getTextContent(previousMessage)) : []; const urls = toolRequests.length === 0 ? extractUrls(textContent, previousUrls) : []; const toolConfirmationContent = getToolConfirmationContent(message); const hasToolConfirmation = toolConfirmationContent !== undefined; // Find tool responses that correspond to the tool requests in this message const toolResponsesMap = useMemo(() => { const responseMap = new Map(); // Look for tool responses in subsequent messages if (messageIndex !== undefined && messageIndex >= 0) { for (let i = messageIndex + 1; i < messages.length; i++) { const responses = getToolResponses(messages[i]); for (const response of responses) { // Check if this response matches any of our tool requests const matchingRequest = toolRequests.find((req) => req.id === response.id); if (matchingRequest) { responseMap.set(response.id, response); } } } } return responseMap; }, [messages, messageIndex, toolRequests]); return (