From fb3edad0c31601f772c5e6e8b904f24cbe594df1 Mon Sep 17 00:00:00 2001 From: Matt Low Date: Sat, 25 Jan 2025 19:11:25 +0000 Subject: [PATCH] tui: only perform database updates for modified messages --- pkg/tui/model/model.go | 42 ++++++++++++++++++++++++------------ pkg/tui/views/chat/cmds.go | 10 --------- pkg/tui/views/chat/update.go | 14 ++++++------ 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/pkg/tui/model/model.go b/pkg/tui/model/model.go index 5737a8d..95a3f61 100644 --- a/pkg/tui/model/model.go +++ b/pkg/tui/model/model.go @@ -22,12 +22,15 @@ type AppModel struct { ProviderName string Provider provider.ChatCompletionProvider Agent *lmcli.Agent + + modifiedMessages map[uint]bool } func NewAppModel(ctx *lmcli.Context, initialConversation *conversation.Conversation) *AppModel { app := &AppModel{ - Ctx: ctx, - Model: *ctx.Config.Defaults.Model, + Ctx: ctx, + Model: *ctx.Config.Defaults.Model, + modifiedMessages: make(map[uint]bool), } if initialConversation == nil { @@ -66,6 +69,11 @@ func (m *AppModel) ClearConversation() { m.Messages = []conversation.Message{} } +func (m *AppModel) NewConversation() { + m.ClearConversation() + m.ApplySystemPrompt() +} + func (m *AppModel) ApplySystemPrompt() { var system string agent := m.Ctx.GetAgent(m.Ctx.Config.Defaults.Agent) @@ -80,9 +88,16 @@ func (m *AppModel) ApplySystemPrompt() { } } -func (m *AppModel) NewConversation() { - m.ClearConversation() - m.ApplySystemPrompt() +func (m *AppModel) SetMessages(msg []conversation.Message) { + m.Messages = msg + clear(m.modifiedMessages) +} + +func (m *AppModel) SetMessageContents(i int, content string) { + m.Messages[i].Content = content + if m.Messages[i].ID > 0 { + m.modifiedMessages[m.Messages[i].ID] = true + } } func (a *AppModel) LoadConversationMessages() ([]conversation.Message, error) { @@ -117,10 +132,6 @@ func (a *AppModel) CloneMessage(message conversation.Message, selected bool) (*c return msg, nil } -func (a *AppModel) UpdateMessageContent(message *conversation.Message) error { - return a.Ctx.Conversations.UpdateMessage(message) -} - func cycleSelectedMessage(selected *conversation.Message, choices []conversation.Message, dir MessageCycleDirection) (*conversation.Message, error) { currentIndex := -1 for i, reply := range choices { @@ -194,12 +205,15 @@ func (a *AppModel) PersistMessages() ([]conversation.Message, error) { m.Conversation.SelectedRoot = &m.Conversation.RootMessages[0] a.Ctx.Conversations.UpdateConversation(m.Conversation) } else if m.ID > 0 { - // Existing message, update it - err := a.Ctx.Conversations.UpdateMessage(&m) - if err != nil { - return nil, fmt.Errorf("Could not update message %d: %v", a.Messages[i].ID, err) + if a.modifiedMessages[m.ID] { + // Existing message, update if modified + err := a.Ctx.Conversations.UpdateMessage(&m) + if err != nil { + return nil, fmt.Errorf("Could not update message %d: %v", a.Messages[i].ID, err) + } } messages[i] = m + a.modifiedMessages[m.ID] = false } else if i > 0 { // New message, reply to previous replies, err := a.Ctx.Conversations.Reply(&messages[i-1], m) @@ -223,7 +237,7 @@ func (a *AppModel) PersistConversation() (conversation.Conversation, error) { c, e := a.Ctx.Conversations.CreateConversation("") err = e if e == nil && c != nil { - conv = *c + conv = *c } } return conv, err diff --git a/pkg/tui/views/chat/cmds.go b/pkg/tui/views/chat/cmds.go index 0679817..4a65498 100644 --- a/pkg/tui/views/chat/cmds.go +++ b/pkg/tui/views/chat/cmds.go @@ -47,16 +47,6 @@ func (m *Model) cloneMessage(message conversation.Message, selected bool) tea.Cm } } -func (m *Model) updateMessageContent(message *conversation.Message) tea.Cmd { - return func() tea.Msg { - err := m.App.UpdateMessageContent(message) - if err != nil { - return shared.WrapError(err) - } - return msgMessageUpdated(message) - } -} - func (m *Model) cycleSelectedRoot(conv *conversation.Conversation, dir model.MessageCycleDirection) tea.Cmd { if len(conv.RootMessages) < 2 { return nil diff --git a/pkg/tui/views/chat/update.go b/pkg/tui/views/chat/update.go index 66878c5..fa95972 100644 --- a/pkg/tui/views/chat/update.go +++ b/pkg/tui/views/chat/update.go @@ -29,7 +29,7 @@ func (m *Model) setMessageContents(i int, content string) { if i >= len(m.App.Messages) { panic("i out of range") } - m.App.Messages[i].Content = content + m.App.SetMessageContents(i, content) m.messageCache[i] = m.renderMessage(i) } @@ -91,19 +91,17 @@ func (m *Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) { case input: m.input.SetValue(contents) case selectedMessage: - toEdit := m.App.Messages[m.selectedMessage] - if toEdit.Content != contents { - toEdit.Content = contents - m.setMessage(m.selectedMessage, toEdit) + if m.App.Messages[m.selectedMessage].Content != contents { + m.setMessageContents(m.selectedMessage, contents) m.updateContent() - if m.persistence && toEdit.ID > 0 { + if m.persistence && m.App.Messages[m.selectedMessage].ID > 0 { // create clone of message with its new contents - cmds = append(cmds, m.cloneMessage(toEdit, true)) + cmds = append(cmds, m.cloneMessage(m.App.Messages[m.selectedMessage], true)) } } } case msgConversationMessagesLoaded: - m.App.Messages = msg.messages + m.App.SetMessages(msg.messages) m.selectedMessage = len(msg.messages) - 1 m.rebuildMessageCache() m.updateContent()