@@ -22,6 +22,10 @@ import (
2222"github.com/kujtimiihoxha/opencode/internal/tui/util"
2323)
2424
25+ type cacheItem struct {
26+ width int
27+ content []uiMessage
28+ }
2529type messagesCmp struct {
2630app * app.App
2731width , height int
@@ -32,8 +36,9 @@ type messagesCmp struct {
3236uiMessages []uiMessage
3337currentMsgID string
3438mutex sync.Mutex
35- cachedContent map [string ][] uiMessage
39+ cachedContent map [string ]cacheItem
3640spinner spinner.Model
41+ lastUpdate time.Time
3742rendering bool
3843}
3944type renderFinishedMsg struct {}
@@ -44,6 +49,8 @@ func (m *messagesCmp) Init() tea.Cmd {
4449
4550func (m * messagesCmp ) preloadSessions () tea.Cmd {
4651return func () tea.Msg {
52+ m .mutex .Lock ()
53+ defer m .mutex .Unlock ()
4754sessions , err := m .app .Sessions .List (context .Background ())
4855if err != nil {
4956return util .ReportError (err )()
@@ -67,13 +74,13 @@ func (m *messagesCmp) preloadSessions() tea.Cmd {
6774}
6875logging .Debug ("preloaded sessions" )
6976
70- return nil
77+ return func () tea.Msg {
78+ return renderFinishedMsg {}
79+ }
7180}
7281}
7382
7483func (m * messagesCmp ) cacheSessionMessages (messages []message.Message , width int ) {
75- m .mutex .Lock ()
76- defer m .mutex .Unlock ()
7784pos := 0
7885if m .width == 0 {
7986return
@@ -87,7 +94,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
8794width ,
8895pos ,
8996)
90- m .cachedContent [msg .ID ] = []uiMessage {userMsg }
97+ m .cachedContent [msg .ID ] = cacheItem {
98+ width : width ,
99+ content : []uiMessage {userMsg },
100+ }
91101pos += userMsg .height + 1 // + 1 for spacing
92102case message .Assistant :
93103assistantMessages := renderAssistantMessage (
@@ -102,7 +112,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
102112for _ , msg := range assistantMessages {
103113pos += msg .height + 1 // + 1 for spacing
104114}
105- m .cachedContent [msg .ID ] = assistantMessages
115+ m .cachedContent [msg .ID ] = cacheItem {
116+ width : width ,
117+ content : assistantMessages ,
118+ }
106119}
107120}
108121}
@@ -223,8 +236,8 @@ func (m *messagesCmp) renderView() {
223236for inx , msg := range m .messages {
224237switch msg .Role {
225238case message .User :
226- if messages , ok := m .cachedContent [msg .ID ]; ok {
227- m .uiMessages = append (m .uiMessages , messages ... )
239+ if cache , ok := m .cachedContent [msg .ID ]; ok && cache . width == m . width {
240+ m .uiMessages = append (m .uiMessages , cache . content ... )
228241continue
229242}
230243userMsg := renderUserMessage (
@@ -234,11 +247,14 @@ func (m *messagesCmp) renderView() {
234247pos ,
235248)
236249m .uiMessages = append (m .uiMessages , userMsg )
237- m .cachedContent [msg .ID ] = []uiMessage {userMsg }
250+ m .cachedContent [msg .ID ] = cacheItem {
251+ width : m .width ,
252+ content : []uiMessage {userMsg },
253+ }
238254pos += userMsg .height + 1 // + 1 for spacing
239255case message .Assistant :
240- if messages , ok := m .cachedContent [msg .ID ]; ok {
241- m .uiMessages = append (m .uiMessages , messages ... )
256+ if cache , ok := m .cachedContent [msg .ID ]; ok && cache . width == m . width {
257+ m .uiMessages = append (m .uiMessages , cache . content ... )
242258continue
243259}
244260assistantMessages := renderAssistantMessage (
@@ -254,7 +270,10 @@ func (m *messagesCmp) renderView() {
254270m .uiMessages = append (m .uiMessages , msg )
255271pos += msg .height + 1 // + 1 for spacing
256272}
257- m .cachedContent [msg .ID ] = assistantMessages
273+ m .cachedContent [msg .ID ] = cacheItem {
274+ width : m .width ,
275+ content : assistantMessages ,
276+ }
258277}
259278}
260279
@@ -418,6 +437,10 @@ func (m *messagesCmp) SetSize(width, height int) tea.Cmd {
418437m .height = height
419438m .viewport .Width = width
420439m .viewport .Height = height - 2
440+ for _ , msg := range m .messages {
441+ delete (m .cachedContent , msg .ID )
442+ }
443+ m .uiMessages = make ([]uiMessage , 0 )
421444m .renderView ()
422445return m .preloadSessions ()
423446}
@@ -456,7 +479,7 @@ func NewMessagesCmp(app *app.App) tea.Model {
456479return & messagesCmp {
457480app : app ,
458481writingMode : true ,
459- cachedContent : make (map [string ][] uiMessage ),
482+ cachedContent : make (map [string ]cacheItem ),
460483viewport : viewport .New (0 , 0 ),
461484spinner : s ,
462485}
0 commit comments