import { ScrollToBottom, StickyToBottomContent } from "@/utils/scroll-utils"; import { Message } from "@langchain/langgraph-sdk"; import { getMessageContentString } from "@open-swe/shared/messages"; import { useState } from "react"; import { StickToBottom } from "use-stick-to-bottom"; import { TooltipIconButton } from "../ui/tooltip-icon-button"; import { AnimatePresence, motion } from "framer-motion"; import { Bot, Copy, CopyCheck, Send, User, Loader2 } from "lucide-react"; import { Textarea } from "../ui/textarea"; import { Button } from "../ui/button"; import { useStream } from "@langchain/langgraph-sdk/react"; import { ManagerGraphState } from "@open-swe/shared/open-swe/manager/types"; import { cn } from "@/lib/utils"; import { isAIMessageSDK } from "@/lib/langchain-messages"; import { BasicMarkdownText } from "../thread/markdown-text"; function MessageCopyButton({ content }: { content: string }) { const [copied, setCopied] = useState(false); const handleCopy = (e: React.MouseEvent) => { e.stopPropagation(); navigator.clipboard.writeText(content); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return ( handleCopy(e)} variant="ghost" tooltip="Copy content" className="size-6 p-1" > {copied ? ( ) : ( )} ); } interface ManagerChatProps { messages: Message[]; chatInput: string; setChatInput: (input: string) => void; handleSendMessage: () => void; isLoading: boolean; cancelRun: () => void; } function extractResponseFromMessage(message: Message): string { if (!isAIMessageSDK(message)) { return getMessageContentString(message.content); } const toolCall = message.tool_calls?.[0]; const response = toolCall?.args?.response; if (!toolCall || !response) { return getMessageContentString(message.content); } return response; } export function ManagerChat({ messages, chatInput, setChatInput, handleSendMessage, isLoading, cancelRun, }: ManagerChatProps) { return (
{messages.map((message) => { const messageContentString = extractResponseFromMessage(message); return (
{message.type === "human" ? (
) : (
)}
{message.type === "human" ? "You" : "Agent"}
{messageContentString}
); })} } footer={
} />