diff options
Diffstat (limited to 'packages/tui/internal')
| -rw-r--r-- | packages/tui/internal/components/chat/messages.go | 6 | ||||
| -rw-r--r-- | packages/tui/internal/tui/tui.go | 52 |
2 files changed, 58 insertions, 0 deletions
diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 098a329ba..fa0ec5e54 100644 --- a/packages/tui/internal/components/chat/messages.go +++ b/packages/tui/internal/components/chat/messages.go @@ -190,6 +190,12 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if msg.Properties.Part.SessionID == m.app.Session.ID { cmds = append(cmds, m.renderView()) } + case opencode.EventListResponseEventMessagePartRemoved: + if msg.Properties.SessionID == m.app.Session.ID { + // Clear the cache when a part is removed to ensure proper re-rendering + m.cache.Clear() + cmds = append(cmds, m.renderView()) + } case renderCompleteMsg: m.partCount = msg.partCount m.lineCount = msg.lineCount diff --git a/packages/tui/internal/tui/tui.go b/packages/tui/internal/tui/tui.go index ee0b22b48..410b8d1ae 100644 --- a/packages/tui/internal/tui/tui.go +++ b/packages/tui/internal/tui/tui.go @@ -402,6 +402,58 @@ func (a Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { a.app.Messages[messageIndex] = message } } + case opencode.EventListResponseEventMessagePartRemoved: + slog.Info("message part removed", "session", msg.Properties.SessionID, "message", msg.Properties.MessageID, "part", msg.Properties.PartID) + if msg.Properties.SessionID == a.app.Session.ID { + messageIndex := slices.IndexFunc(a.app.Messages, func(m app.Message) bool { + switch casted := m.Info.(type) { + case opencode.UserMessage: + return casted.ID == msg.Properties.MessageID + case opencode.AssistantMessage: + return casted.ID == msg.Properties.MessageID + } + return false + }) + if messageIndex > -1 { + message := a.app.Messages[messageIndex] + partIndex := slices.IndexFunc(message.Parts, func(p opencode.PartUnion) bool { + switch casted := p.(type) { + case opencode.TextPart: + return casted.ID == msg.Properties.PartID + case opencode.FilePart: + return casted.ID == msg.Properties.PartID + case opencode.ToolPart: + return casted.ID == msg.Properties.PartID + case opencode.StepStartPart: + return casted.ID == msg.Properties.PartID + case opencode.StepFinishPart: + return casted.ID == msg.Properties.PartID + } + return false + }) + if partIndex > -1 { + // Remove the part at partIndex + message.Parts = append(message.Parts[:partIndex], message.Parts[partIndex+1:]...) + a.app.Messages[messageIndex] = message + } + } + } + case opencode.EventListResponseEventMessageRemoved: + slog.Info("message removed", "session", msg.Properties.SessionID, "message", msg.Properties.MessageID) + if msg.Properties.SessionID == a.app.Session.ID { + messageIndex := slices.IndexFunc(a.app.Messages, func(m app.Message) bool { + switch casted := m.Info.(type) { + case opencode.UserMessage: + return casted.ID == msg.Properties.MessageID + case opencode.AssistantMessage: + return casted.ID == msg.Properties.MessageID + } + return false + }) + if messageIndex > -1 { + a.app.Messages = append(a.app.Messages[:messageIndex], a.app.Messages[messageIndex+1:]...) + } + } case opencode.EventListResponseEventMessageUpdated: if msg.Properties.Info.SessionID == a.app.Session.ID { matchIndex := slices.IndexFunc(a.app.Messages, func(m app.Message) bool { |
