11import { AgentMessageData } from "@/models" ;
2-
32import ReactMarkdown from "react-markdown" ;
43import remarkGfm from "remark-gfm" ;
54import rehypePrism from "rehype-prism" ;
6- // Render AI thinking/planning state
7- const renderAgentMessages = ( agentMessages : AgentMessageData [ ] ) => {
8- if ( ! agentMessages || agentMessages . length === 0 ) return null ;
95
10- return (
11- < div >
12- { agentMessages . map ( ( msg , index ) => {
13- const trimmed = msg . raw_content ?. trim ( ) ;
14- if ( ! trimmed ) return null ; // skip if empty, null, or whitespace
15- return (
16- < div key = { index } style = { { marginBottom : '16px' } } >
17- < strong > { msg . agent } </ strong > :
18- < ReactMarkdown
19- remarkPlugins = { [ remarkGfm ] }
20- rehypePlugins = { [ rehypePrism ] }
21- >
22- { trimmed }
23- </ ReactMarkdown >
24- </ div >
25- ) ;
26- } ) }
6+ interface StreamingAgentMessageProps {
7+ agentMessages : AgentMessageData [ ] ;
8+ }
9+
10+ const StreamingAgentMessage = ( { agentMessages } : StreamingAgentMessageProps ) => {
11+ if ( ! agentMessages ?. length ) return null ;
12+
13+ // Filter out messages with empty content
14+ const validMessages = agentMessages . filter ( msg => msg . raw_content ?. trim ( ) ) ;
15+
16+ if ( ! validMessages . length ) return null ;
17+
18+ return (
19+ < div className = "streaming-agent-messages" >
20+ { validMessages . map ( ( message , index ) => (
21+ < div key = { `${ message . agent } -${ message . timestamp } -${ index } ` } className = "agent-message" >
22+ < div className = "agent-name" >
23+ < strong > { message . agent } </ strong > :
24+ </ div >
25+ < div className = "agent-content" >
26+ < ReactMarkdown
27+ remarkPlugins = { [ remarkGfm ] }
28+ rehypePlugins = { [ rehypePrism ] }
29+ >
30+ { message . raw_content . trim ( ) }
31+ </ ReactMarkdown >
32+ </ div >
2733 </ div >
28- ) ;
34+ ) ) }
35+ </ div >
36+ ) ;
2937} ;
30- export default renderAgentMessages ;
38+
39+ export default StreamingAgentMessage ;
0 commit comments