@@ -27,6 +27,8 @@ type AssistantMessageItem struct {
2727 *highlightableMessageItem
2828 *cachedMessageItem
2929 *focusableMessageItem
30+ blurredCache *cachedMessageItem
31+ focusedCache *cachedMessageItem
3032
3133 message *message.Message
3234 sty *styles.Styles
@@ -40,6 +42,8 @@ func NewAssistantMessageItem(sty *styles.Styles, message *message.Message) Messa
4042 a := &AssistantMessageItem{
4143 highlightableMessageItem: defaultHighlighter(sty),
4244 cachedMessageItem: &cachedMessageItem{},
45+ blurredCache: &cachedMessageItem{},
46+ focusedCache: &cachedMessageItem{},
4347 focusableMessageItem: &focusableMessageItem{},
4448 message: message,
4549 sty: sty,
@@ -107,11 +111,22 @@ func (a *AssistantMessageItem) RawRender(width int) string {
107111
108112// Render implements MessageItem.
109113func (a *AssistantMessageItem) Render(width int) string {
110− style := a.sty.Chat.Message.AssistantBlurred
114+ cache := a.blurredCache
111115 if a.focused {
112− style = a.sty.Chat.Message.AssistantFocused
116+ cache = a.focusedCache
113117 }
114− return style.Render(a.RawRender(width))
118+
119+ content, _, ok := cache.getCachedRender(width)
120+ if !ok {
121+ style := a.sty.Chat.Message.AssistantBlurred
122+ if a.focused {
123+ style = a.sty.Chat.Message.AssistantFocused
124+ }
125+ content = style.Render(a.RawRender(width))
126+ cache.setCachedRender(content, width, lipgloss.Height(content))
127+ }
128+
129+ return content
115130}
116131
117132// renderMessageContent renders the message content including thinking, main content, and finish reason.