diff --git a/internal/ui/chat/assistant.go b/internal/ui/chat/assistant.go index 4ce71dda2515e5489900c33eb716e1d6d884409a..603beb28e9c35ffe499dc48bd2c31e2ed2c8b128 100644 --- a/internal/ui/chat/assistant.go +++ b/internal/ui/chat/assistant.go @@ -27,6 +27,8 @@ type AssistantMessageItem struct { *highlightableMessageItem *cachedMessageItem *focusableMessageItem + blurredCache *cachedMessageItem + focusedCache *cachedMessageItem message *message.Message sty *styles.Styles @@ -40,6 +42,8 @@ func NewAssistantMessageItem(sty *styles.Styles, message *message.Message) Messa a := &AssistantMessageItem{ highlightableMessageItem: defaultHighlighter(sty), cachedMessageItem: &cachedMessageItem{}, + blurredCache: &cachedMessageItem{}, + focusedCache: &cachedMessageItem{}, focusableMessageItem: &focusableMessageItem{}, message: message, sty: sty, @@ -107,11 +111,22 @@ func (a *AssistantMessageItem) RawRender(width int) string { // Render implements MessageItem. func (a *AssistantMessageItem) Render(width int) string { - style := a.sty.Chat.Message.AssistantBlurred + cache := a.blurredCache if a.focused { - style = a.sty.Chat.Message.AssistantFocused + cache = a.focusedCache } - return style.Render(a.RawRender(width)) + + content, _, ok := cache.getCachedRender(width) + if !ok { + style := a.sty.Chat.Message.AssistantBlurred + if a.focused { + style = a.sty.Chat.Message.AssistantFocused + } + content = style.Render(a.RawRender(width)) + cache.setCachedRender(content, width, lipgloss.Height(content)) + } + + return content } // renderMessageContent renders the message content including thinking, main content, and finish reason.