@@ -22,6 +22,10 @@ import (
22 "github.com/kujtimiihoxha/opencode/internal/tui/util"
22 "github.com/kujtimiihoxha/opencode/internal/tui/util"
25+type cacheItem struct {
25type messagesCmp struct {
29type messagesCmp struct {
26 app *app.App
30 app *app.App
27 width, height int
31 width, height int
@@ -32,8 +36,9 @@ type messagesCmp struct {
32 uiMessages []uiMessage
36 uiMessages []uiMessage
33 currentMsgID string
37 currentMsgID string
34 mutex sync.Mutex
38 mutex sync.Mutex
35− cachedContent map[string][]uiMessage
39+ cachedContent map[string]cacheItem
36 spinner spinner.Model
40 spinner spinner.Model
37 rendering bool
42 rendering bool
39type renderFinishedMsg struct{}
44type renderFinishedMsg struct{}
@@ -44,6 +49,8 @@ func (m *messagesCmp) Init() tea.Cmd {
45func (m *messagesCmp) preloadSessions() tea.Cmd {
50func (m *messagesCmp) preloadSessions() tea.Cmd {
46 return func() tea.Msg {
51 return func() tea.Msg {
53+ defer m.mutex.Unlock()
47 sessions, err := m.app.Sessions.List(context.Background())
54 sessions, err := m.app.Sessions.List(context.Background())
48 if err != nil {
55 if err != nil {
49 return util.ReportError(err)()
56 return util.ReportError(err)()
@@ -67,13 +74,13 @@ func (m *messagesCmp) preloadSessions() tea.Cmd {
68 logging.Debug("preloaded sessions")
75 logging.Debug("preloaded sessions")
70− return nil
77+ return func() tea.Msg {
78+ return renderFinishedMsg{}
74func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int) {
83func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int) {
76− defer m.mutex.Unlock()
78 if m.width == 0 {
85 if m.width == 0 {
@@ -87,7 +94,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
90− m.cachedContent[msg.ID] = []uiMessage{userMsg}
97+ m.cachedContent[msg.ID] = cacheItem{
99+ content: []uiMessage{userMsg},
91 pos += userMsg.height + 1 // + 1 for spacing
101 pos += userMsg.height + 1 // + 1 for spacing
92 case message.Assistant:
102 case message.Assistant:
93 assistantMessages := renderAssistantMessage(
103 assistantMessages := renderAssistantMessage(
@@ -102,7 +112,10 @@ func (m *messagesCmp) cacheSessionMessages(messages []message.Message, width int
102 for _, msg := range assistantMessages {
112 for _, msg := range assistantMessages {
103 pos += msg.height + 1 // + 1 for spacing
113 pos += msg.height + 1 // + 1 for spacing
105− m.cachedContent[msg.ID] = assistantMessages
115+ m.cachedContent[msg.ID] = cacheItem{
117+ content: assistantMessages,
@@ -223,8 +236,8 @@ func (m *messagesCmp) renderView() {
223 for inx, msg := range m.messages {
236 for inx, msg := range m.messages {
224 switch msg.Role {
237 switch msg.Role {
225 case message.User:
238 case message.User:
226− if messages, ok := m.cachedContent[msg.ID]; ok {
239+ if cache, ok := m.cachedContent[msg.ID]; ok && cache.width == m.width {
227− m.uiMessages = append(m.uiMessages, messages...)
240+ m.uiMessages = append(m.uiMessages, cache.content...)
230 userMsg := renderUserMessage(
243 userMsg := renderUserMessage(
@@ -234,11 +247,14 @@ func (m *messagesCmp) renderView() {
236 m.uiMessages = append(m.uiMessages, userMsg)
249 m.uiMessages = append(m.uiMessages, userMsg)
237− m.cachedContent[msg.ID] = []uiMessage{userMsg}
250+ m.cachedContent[msg.ID] = cacheItem{
252+ content: []uiMessage{userMsg},
238 pos += userMsg.height + 1 // + 1 for spacing
254 pos += userMsg.height + 1 // + 1 for spacing
239 case message.Assistant:
255 case message.Assistant:
240− if messages, ok := m.cachedContent[msg.ID]; ok {
256+ if cache, ok := m.cachedContent[msg.ID]; ok && cache.width == m.width {
241− m.uiMessages = append(m.uiMessages, messages...)
257+ m.uiMessages = append(m.uiMessages, cache.content...)
244 assistantMessages := renderAssistantMessage(
260 assistantMessages := renderAssistantMessage(
@@ -254,7 +270,10 @@ func (m *messagesCmp) renderView() {
254 m.uiMessages = append(m.uiMessages, msg)
270 m.uiMessages = append(m.uiMessages, msg)
255 pos += msg.height + 1 // + 1 for spacing
271 pos += msg.height + 1 // + 1 for spacing
257− m.cachedContent[msg.ID] = assistantMessages
273+ m.cachedContent[msg.ID] = cacheItem{
275+ content: assistantMessages,
@@ -418,6 +437,10 @@ func (m *messagesCmp) SetSize(width, height int) tea.Cmd {
418 m.height = height
437 m.height = height
419 m.viewport.Width = width
438 m.viewport.Width = width
420 m.viewport.Height = height - 2
439 m.viewport.Height = height - 2
440+ for _, msg := range m.messages {
441+ delete(m.cachedContent, msg.ID)
443+ m.uiMessages = make([]uiMessage, 0)
421 m.renderView()
444 m.renderView()
422 return m.preloadSessions()
445 return m.preloadSessions()
@@ -456,7 +479,7 @@ func NewMessagesCmp(app *app.App) tea.Model {
456 return &messagesCmp{
479 return &messagesCmp{
457 app: app,
480 app: app,
458 writingMode: true,
481 writingMode: true,
459− cachedContent: make(map[string][]uiMessage),
482+ cachedContent: make(map[string]cacheItem),
460 viewport: viewport.New(0, 0),
483 viewport: viewport.New(0, 0),
461 spinner: s,
484 spinner: s,