summaryrefslogtreecommitdiffhomepage
path: root/packages/tui/internal
diff options
context:
space:
mode:
Diffstat (limited to 'packages/tui/internal')
-rw-r--r--packages/tui/internal/components/chat/messages.go6
-rw-r--r--packages/tui/internal/tui/tui.go52
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 {