@@ -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 {
2630 app *app.App
2731 width, height int
@@ -32,8 +36,9 @@ type messagesCmp struct {
3236 uiMessages []uiMessage
3337 currentMsgID string
3438 mutex sync.Mutex
35− cachedContent map[string][]uiMessage
39+ cachedContent map[string]cacheItem
3640 spinner spinner.Model
41+ lastUpdate time.Time
3742 rendering bool
3843}
3944type renderFinishedMsg struct{}
@@ -44,6 +49,8 @@ func (m *messagesCmp) Init() tea.Cmd {
4449
4550func (m *messagesCmp) preloadSessions() tea.Cmd {
4651 return func() tea.Msg {
52+ m.mutex.Lock()
53+ defer m.mutex.Unlock()
4754 sessions, err := m.app.Sessions.List(context.Background())
4855 if err != nil {
4956 return util.ReportError(err)()
@@ -67,13 +74,13 @@ func (m *messagesCmp) preloadSessions() tea.Cmd {
6774 }
6875 logging.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()
7784 pos := 0
7885 if m.width == 0 {
7986 return
@@ -87,7 +94,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
8794 width,
8895 pos,
8996 )
90− m.cachedContent[msg.ID] = []uiMessage{userMsg}
97+ m.cachedContent[msg.ID] = cacheItem{
98+ width: width,
99+ content: []uiMessage{userMsg},
100+ }
91101 pos += userMsg.height + 1 // + 1 for spacing
92102 case message.Assistant:
93103 assistantMessages := renderAssistantMessage(
@@ -102,7 +112,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
102112 for _, msg := range assistantMessages {
103113 pos += 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() {
223236 for inx, msg := range m.messages {
224237 switch msg.Role {
225238 case 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...)
228241 continue
229242 }
230243 userMsg := renderUserMessage(
@@ -234,11 +247,14 @@ func (m *messagesCmp) renderView() {
234247 pos,
235248 )
236249 m.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+ }
238254 pos += userMsg.height + 1 // + 1 for spacing
239255 case 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...)
242258 continue
243259 }
244260 assistantMessages := renderAssistantMessage(
@@ -254,7 +270,10 @@ func (m *messagesCmp) renderView() {
254270 m.uiMessages = append(m.uiMessages, msg)
255271 pos += 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 {
418437 m.height = height
419438 m.viewport.Width = width
420439 m.viewport.Height = height - 2
440+ for _, msg := range m.messages {
441+ delete(m.cachedContent, msg.ID)
442+ }
443+ m.uiMessages = make([]uiMessage, 0)
421444 m.renderView()
422445 return m.preloadSessions()
423446}
@@ -456,7 +479,7 @@ func NewMessagesCmp(app *app.App) tea.Model {
456479 return &messagesCmp{
457480 app: app,
458481 writingMode: true,
459− cachedContent: make(map[string][]uiMessage),
482+ cachedContent: make(map[string]cacheItem),
460483 viewport: viewport.New(0, 0),
461484 spinner: s,
462485 }