import type { UseStream } from "@langchain/langgraph-sdk/react"; import { Conversation, ConversationContent, } from "@/components/ai-elements/conversation"; import { MessageResponse } from "@/components/ai-elements/message"; import { extractContentFromMessage, extractPresentFilesFromMessage, groupMessages, hasContent, hasPresentFiles, } from "@/core/messages/utils"; import { useRehypeSplitWordsIntoSpans } from "@/core/rehype"; import type { AgentThreadState } from "@/core/threads"; import { cn } from "@/lib/utils"; import { ArtifactFileList } from "../artifacts/artifact-file-list"; import { StreamingIndicator } from "../streaming-indicator"; import { MessageGroup } from "./message-group"; import { MessageListItem } from "./message-list-item"; import { MessageListSkeleton } from "./skeleton"; export function MessageList({ className, threadId, thread, paddingBottom = 160, }: { className?: string; threadId: string; thread: UseStream; paddingBottom?: number; }) { const rehypePlugins = useRehypeSplitWordsIntoSpans(thread.isLoading); if (thread.isThreadLoading) { return ; } return ( {groupMessages(thread.messages, (group) => { if (group.type === "human" || group.type === "assistant") { return ( ); } if (group.type === "assistant:present-files") { const files: string[] = []; for (const message of group.messages) { if (hasPresentFiles(message)) { const presentFiles = extractPresentFilesFromMessage(message); files.push(...presentFiles); } } return (
{group.messages[0] && hasContent(group.messages[0]) && ( {extractContentFromMessage(group.messages[0])} )}
); } return ( ); })} {thread.isLoading && }
); }