@@ -27,6 +27,8 @@ type AssistantMessageItem struct {
27 *highlightableMessageItem
27 *highlightableMessageItem
28 *cachedMessageItem
28 *cachedMessageItem
29 *focusableMessageItem
29 *focusableMessageItem
30+ blurredCache *cachedMessageItem
31+ focusedCache *cachedMessageItem
31 message *message.Message
33 message *message.Message
32 sty *styles.Styles
34 sty *styles.Styles
@@ -40,6 +42,8 @@ func NewAssistantMessageItem(sty *styles.Styles, message *message.Message) Messa
40 a := &AssistantMessageItem{
42 a := &AssistantMessageItem{
41 highlightableMessageItem: defaultHighlighter(sty),
43 highlightableMessageItem: defaultHighlighter(sty),
42 cachedMessageItem: &cachedMessageItem{},
44 cachedMessageItem: &cachedMessageItem{},
45+ blurredCache: &cachedMessageItem{},
46+ focusedCache: &cachedMessageItem{},
43 focusableMessageItem: &focusableMessageItem{},
47 focusableMessageItem: &focusableMessageItem{},
44 message: message,
48 message: message,
@@ -107,11 +111,22 @@ func (a *AssistantMessageItem) RawRender(width int) string {
108// Render implements MessageItem.
112// Render implements MessageItem.
109func (a *AssistantMessageItem) Render(width int) string {
113func (a *AssistantMessageItem) Render(width int) string {
110− style := a.sty.Chat.Message.AssistantBlurred
114+ cache := a.blurredCache
111 if a.focused {
115 if a.focused {
112− style = a.sty.Chat.Message.AssistantFocused
116+ cache = a.focusedCache
119+ content, _, ok := cache.getCachedRender(width)
121+ style := a.sty.Chat.Message.AssistantBlurred
123+ style = a.sty.Chat.Message.AssistantFocused
114− return style.Render(a.RawRender(width))
125+ content = style.Render(a.RawRender(width))
126+ cache.setCachedRender(content, width, lipgloss.Height(content))
117// renderMessageContent renders the message content including thinking, main content, and finish reason.
132// renderMessageContent renders the message content including thinking, main content, and finish reason.