on main help sign in
fix(ui): cache blurred and focused renderings separately for assistant messages (#2252)
2656a18Ayman Bagabas
internal/ui/chat/assistant.go+18−3
@@ -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
30
32
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,
45 sty: sty,
49 sty: sty,
@@ -107,11 +111,22 @@ func (a *AssistantMessageItem) RawRender(width int) string {
107
111
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
113 }
117 }
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+ }
114− return style.Render(a.RawRender(width))
125+ content = style.Render(a.RawRender(width))
126+ cache.setCachedRender(content, width, lipgloss.Height(content))
127+ }
128+
129+ return content
115}
130}
116
131
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.