Private
Public Access
1
0

tui: only perform database updates for modified messages

This commit is contained in:
2025-01-25 19:11:25 +00:00
parent 8e2991da1a
commit fb3edad0c3
3 changed files with 34 additions and 32 deletions

View File

@@ -22,12 +22,15 @@ type AppModel struct {
ProviderName string ProviderName string
Provider provider.ChatCompletionProvider Provider provider.ChatCompletionProvider
Agent *lmcli.Agent Agent *lmcli.Agent
modifiedMessages map[uint]bool
} }
func NewAppModel(ctx *lmcli.Context, initialConversation *conversation.Conversation) *AppModel { func NewAppModel(ctx *lmcli.Context, initialConversation *conversation.Conversation) *AppModel {
app := &AppModel{ app := &AppModel{
Ctx: ctx, Ctx: ctx,
Model: *ctx.Config.Defaults.Model, Model: *ctx.Config.Defaults.Model,
modifiedMessages: make(map[uint]bool),
} }
if initialConversation == nil { if initialConversation == nil {
@@ -66,6 +69,11 @@ func (m *AppModel) ClearConversation() {
m.Messages = []conversation.Message{} m.Messages = []conversation.Message{}
} }
func (m *AppModel) NewConversation() {
m.ClearConversation()
m.ApplySystemPrompt()
}
func (m *AppModel) ApplySystemPrompt() { func (m *AppModel) ApplySystemPrompt() {
var system string var system string
agent := m.Ctx.GetAgent(m.Ctx.Config.Defaults.Agent) agent := m.Ctx.GetAgent(m.Ctx.Config.Defaults.Agent)
@@ -80,9 +88,16 @@ func (m *AppModel) ApplySystemPrompt() {
} }
} }
func (m *AppModel) NewConversation() { func (m *AppModel) SetMessages(msg []conversation.Message) {
m.ClearConversation() m.Messages = msg
m.ApplySystemPrompt() 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) { func (a *AppModel) LoadConversationMessages() ([]conversation.Message, error) {
@@ -117,10 +132,6 @@ func (a *AppModel) CloneMessage(message conversation.Message, selected bool) (*c
return msg, nil 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) { func cycleSelectedMessage(selected *conversation.Message, choices []conversation.Message, dir MessageCycleDirection) (*conversation.Message, error) {
currentIndex := -1 currentIndex := -1
for i, reply := range choices { for i, reply := range choices {
@@ -194,12 +205,15 @@ func (a *AppModel) PersistMessages() ([]conversation.Message, error) {
m.Conversation.SelectedRoot = &m.Conversation.RootMessages[0] m.Conversation.SelectedRoot = &m.Conversation.RootMessages[0]
a.Ctx.Conversations.UpdateConversation(m.Conversation) a.Ctx.Conversations.UpdateConversation(m.Conversation)
} else if m.ID > 0 { } else if m.ID > 0 {
// Existing message, update it if a.modifiedMessages[m.ID] {
err := a.Ctx.Conversations.UpdateMessage(&m) // Existing message, update if modified
if err != nil { err := a.Ctx.Conversations.UpdateMessage(&m)
return nil, fmt.Errorf("Could not update message %d: %v", a.Messages[i].ID, err) if err != nil {
return nil, fmt.Errorf("Could not update message %d: %v", a.Messages[i].ID, err)
}
} }
messages[i] = m messages[i] = m
a.modifiedMessages[m.ID] = false
} else if i > 0 { } else if i > 0 {
// New message, reply to previous // New message, reply to previous
replies, err := a.Ctx.Conversations.Reply(&messages[i-1], m) 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("") c, e := a.Ctx.Conversations.CreateConversation("")
err = e err = e
if e == nil && c != nil { if e == nil && c != nil {
conv = *c conv = *c
} }
} }
return conv, err return conv, err

View File

@@ -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 { func (m *Model) cycleSelectedRoot(conv *conversation.Conversation, dir model.MessageCycleDirection) tea.Cmd {
if len(conv.RootMessages) < 2 { if len(conv.RootMessages) < 2 {
return nil return nil

View File

@@ -29,7 +29,7 @@ func (m *Model) setMessageContents(i int, content string) {
if i >= len(m.App.Messages) { if i >= len(m.App.Messages) {
panic("i out of range") panic("i out of range")
} }
m.App.Messages[i].Content = content m.App.SetMessageContents(i, content)
m.messageCache[i] = m.renderMessage(i) m.messageCache[i] = m.renderMessage(i)
} }
@@ -91,19 +91,17 @@ func (m *Model) Update(msg tea.Msg) (shared.ViewModel, tea.Cmd) {
case input: case input:
m.input.SetValue(contents) m.input.SetValue(contents)
case selectedMessage: case selectedMessage:
toEdit := m.App.Messages[m.selectedMessage] if m.App.Messages[m.selectedMessage].Content != contents {
if toEdit.Content != contents { m.setMessageContents(m.selectedMessage, contents)
toEdit.Content = contents
m.setMessage(m.selectedMessage, toEdit)
m.updateContent() 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 // 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: case msgConversationMessagesLoaded:
m.App.Messages = msg.messages m.App.SetMessages(msg.messages)
m.selectedMessage = len(msg.messages) - 1 m.selectedMessage = len(msg.messages) - 1
m.rebuildMessageCache() m.rebuildMessageCache()
m.updateContent() m.updateContent()