+ {({ index, style }) => {
+ const message = messages[index];
+ return (
+
+ handleMessageRender(message.id, index)}
+ />
+
+ );
+ }}
+
+ );
+};
\ No newline at end of file
diff --git a/perf-analysis/messageLine-optimized.tsx b/perf-analysis/messageLine-optimized.tsx
new file mode 100644
index 00000000000..a9e3d914094
--- /dev/null
+++ b/perf-analysis/messageLine-optimized.tsx
@@ -0,0 +1,188 @@
+import React, { useState, useRef, useEffect, useCallback } from 'react';
+import { Box, Text } from 'ink';
+import { useTheme } from '../hooks/useTheme';
+import { MessageData } from '../gatewayTypes';
+import { Markdown } from './markdown';
+import { themed } from './themed';
+import { usePerformanceMonitor, useScrollPerformance } from '../hooks/performanceHooks';
+
+// Optimize the MessageLine component with proper memoization
+export const MessageLine: React.FC<{
+ message: MessageData;
+ isHighlighted?: boolean;
+ expandCode?: boolean;
+}> = React.memo(({ message, isHighlighted = false, expandCode = false }) => {
+ const theme = useTheme();
+ const { role, content } = message;
+ const { logEvent } = usePerformanceMonitor(`MessageLine-${role.substring(0,1)}${message.id?.substring(0,4)}`);
+
+ // Skip rendering for empty messages
+ if (!content) return null;
+
+ const RoleLabel = themed(Text, {
+ user: theme.message.user.label,
+ assistant: theme.message.assistant.label,
+ system: theme.message.system.label,
+ tool: theme.message.tool.label,
+ function: theme.message.function.label,
+ });
+
+ const roleStyles = {
+ user: theme.message.user.content,
+ assistant: theme.message.assistant.content,
+ system: theme.message.system.content,
+ tool: theme.message.tool.content,
+ function: theme.message.function.content,
+ };
+
+ // Log initial render for performance monitoring
+ useEffect(() => {
+ logEvent('initial-render');
+ }, []);
+
+ return (
+