diff --git a/internal/ui/model/ui.go b/internal/ui/model/ui.go index 3952f05015e4a191c078c2774aa43640f2db7b30..0daffab1fbecda0a093737ada530534b11bd1a7c 100644 --- a/internal/ui/model/ui.go +++ b/internal/ui/model/ui.go @@ -329,56 +329,6 @@ func (m *UI) focusEditor() tea.Cmd { return m.textarea.Focus() } -func (m *UI) fork() tea.Msg { - if m.isAgentBusy() { - return uiutil.ReportWarn("Agent is busy, please wait...")() - } - if m.session == nil { - return uiutil.ReportWarn("No session to fork...")() - } - selectedItem := m.chat.SelectedItem() - if selectedItem == nil { - return uiutil.ReportWarn("No message selected...")() - } - messageID, ok := m.getMessageIDFromItem(selectedItem) - if !ok { - return uiutil.ReportWarn("Cannot fork from selected item...")() - } - newSession, err := m.com.App.Sessions.Fork(context.Background(), m.session.ID, messageID, m.com.App.Messages) - if err != nil { - return uiutil.ReportError(err)() - } - return loadSessionMsg{ - session: &newSession, - files: []SessionFile{}, - } -} - -func (m *UI) delete() tea.Msg { - if m.isAgentBusy() { - return uiutil.ReportWarn("Agent is busy, please wait...")() - } - if m.session == nil { - return uiutil.ReportWarn("No session to delete from...")() - } - selectedItem := m.chat.SelectedItem() - if selectedItem == nil { - return uiutil.ReportWarn("No message selected...")() - } - if _, ok := selectedItem.(*chat.UserMessageItem); !ok { - return uiutil.ReportWarn("Can only delete from user messages...")() - } - messageID, ok := m.getMessageIDFromItem(selectedItem) - if !ok { - return uiutil.ReportWarn("Cannot get message ID from selected item...")() - } - err := m.com.App.Messages.DeleteMessagesFrom(context.Background(), m.session.ID, messageID) - if err != nil { - return uiutil.ReportError(err)() - } - return m.loadSession(m.session.ID)() -} - // loadCustomCommands loads the custom commands asynchronously. func (m *UI) loadCustomCommands() tea.Cmd { return func() tea.Msg { @@ -1217,10 +1167,10 @@ func (m *UI) handleDialogMsg(msg tea.Msg) tea.Cmd { m.dialog.CloseDialog(dialog.CommandsID) case dialog.ActionForkConversation: m.dialog.CloseDialog(dialog.CommandsID) - cmds = append(cmds, m.fork, m.focusEditor()) + cmds = append(cmds, m.forkConversation, m.focusEditor()) case dialog.ActionDeleteMessages: m.dialog.CloseDialog(dialog.CommandsID) - cmds = append(cmds, m.delete, m.focusEditor()) + cmds = append(cmds, m.deleteBellow, m.focusEditor()) case dialog.ActionSelectModel: if m.isAgentBusy() { cmds = append(cmds, uiutil.ReportWarn("Agent is busy, please wait...")) @@ -2568,6 +2518,58 @@ func (m *UI) getMessageIDFromItem(item list.Item) (string, bool) { return "", false } +// forkConversation a conversation. +func (m *UI) forkConversation() tea.Msg { + if m.isAgentBusy() { + return uiutil.ReportWarn("Agent is busy, please wait...")() + } + if m.session == nil { + return uiutil.ReportWarn("No session to fork...")() + } + selectedItem := m.chat.SelectedItem() + if selectedItem == nil { + return uiutil.ReportWarn("No message selected...")() + } + messageID, ok := m.getMessageIDFromItem(selectedItem) + if !ok { + return uiutil.ReportWarn("Cannot fork from selected item...")() + } + newSession, err := m.com.App.Sessions.Fork(context.Background(), m.session.ID, messageID, m.com.App.Messages) + if err != nil { + return uiutil.ReportError(err)() + } + return loadSessionMsg{ + session: &newSession, + files: []SessionFile{}, + } +} + +// deleteBellow messages bellow the selected one. +func (m *UI) deleteBellow() tea.Msg { + if m.isAgentBusy() { + return uiutil.ReportWarn("Agent is busy, please wait...")() + } + if m.session == nil { + return uiutil.ReportWarn("No session to delete from...")() + } + selectedItem := m.chat.SelectedItem() + if selectedItem == nil { + return uiutil.ReportWarn("No message selected...")() + } + if _, ok := selectedItem.(*chat.UserMessageItem); !ok { + return uiutil.ReportWarn("Can only delete from user messages...")() + } + messageID, ok := m.getMessageIDFromItem(selectedItem) + if !ok { + return uiutil.ReportWarn("Cannot get message ID from selected item...")() + } + err := m.com.App.Messages.DeleteMessagesFrom(context.Background(), m.session.ID, messageID) + if err != nil { + return uiutil.ReportError(err)() + } + return m.loadSession(m.session.ID)() +} + // mimeOf detects the MIME type of the given content. func mimeOf(content []byte) string { mimeBufferSize := min(512, len(content))