MCPcopy Index your code
hub / github.com/winfunc/opcode / StreamMessageComponent

Function StreamMessageComponent

src/components/StreamMessage.tsx:54–737  ·  view source on GitHub ↗
({ message, className, streamMessages, onLinkDetected })

Source from the content-addressed store, hash-verified

52 * Component to render a single Claude Code stream message
53 */
54const StreamMessageComponent: React.FC<StreamMessageProps> = ({ message, className, streamMessages, onLinkDetected }) => {
55 // State to track tool results mapped by tool call ID
56 const [toolResults, setToolResults] = useState<Map<string, any>>(new Map());
57
58 // Get current theme
59 const { theme } = useTheme();
60 const syntaxTheme = getClaudeSyntaxTheme(theme);
61
62 // Extract all tool results from stream messages
63 useEffect(() => {
64 const results = new Map<string, any>();
65
66 // Iterate through all messages to find tool results
67 streamMessages.forEach(msg => {
68 if (msg.type === "user" && msg.message?.content && Array.isArray(msg.message.content)) {
69 msg.message.content.forEach((content: any) => {
70 if (content.type === "tool_result" && content.tool_use_id) {
71 results.set(content.tool_use_id, content);
72 }
73 });
74 }
75 });
76
77 setToolResults(results);
78 }, [streamMessages]);
79
80 // Helper to get tool result for a specific tool call ID
81 const getToolResult = (toolId: string | undefined): any => {
82 if (!toolId) return null;
83 return toolResults.get(toolId) || null;
84 };
85
86 try {
87 // Skip rendering for meta messages that don't have meaningful content
88 if (message.isMeta && !message.leafUuid && !message.summary) {
89 return null;
90 }
91
92 // Handle summary messages
93 if (message.leafUuid && message.summary && (message as any).type === "summary") {
94 return <SummaryWidget summary={message.summary} leafUuid={message.leafUuid} />;
95 }
96
97 // System initialization message
98 if (message.type === "system" && message.subtype === "init") {
99 return (
100 <SystemInitializedWidget
101 sessionId={message.session_id}
102 model={message.model}
103 cwd={message.cwd}
104 tools={message.tools}
105 />
106 );
107 }
108
109 // Assistant message
110 if (message.type === "assistant" && message.message) {
111 const msg = message.message;

Callers

nothing calls this directly

Calls 5

useThemeFunction · 0.90
getClaudeSyntaxThemeFunction · 0.90
cnFunction · 0.90
getToolResultFunction · 0.85
renderToolWidgetFunction · 0.85

Tested by

no test coverage detected