tui: only perform database updates for modified messages
This commit is contained in:
@@ -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,
|
||||
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
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user