diff --git a/internal/ui/dialog/commands.go b/internal/ui/dialog/commands.go index e1da440d24a6933b4fea4b47f12160eee5e8c603..0f45addbf31b586cac1387555bcf48a08b19b8eb 100644 --- a/internal/ui/dialog/commands.go +++ b/internal/ui/dialog/commands.go @@ -63,24 +63,22 @@ type Commands struct { windowWidth int - customCommands []commands.CustomCommand - mcpPrompts []commands.MCPPrompt - canFork bool // whether a user message is selected for forking - canDelete bool // whether a user message is selected for deletion + customCommands []commands.CustomCommand + mcpPrompts []commands.MCPPrompt + isUserMessageSelected bool // whether a user message is selected in chat } var _ Dialog = (*Commands)(nil) // NewCommands creates a new commands dialog. -func NewCommands(com *common.Common, sessionID string, customCommands []commands.CustomCommand, mcpPrompts []commands.MCPPrompt, canFork, canDelete bool) (*Commands, error) { +func NewCommands(com *common.Common, sessionID string, customCommands []commands.CustomCommand, mcpPrompts []commands.MCPPrompt, isUserMessageSelected bool) (*Commands, error) { c := &Commands{ - com: com, - selected: SystemCommands, - sessionID: sessionID, - customCommands: customCommands, - mcpPrompts: mcpPrompts, - canFork: canFork, - canDelete: canDelete, + com: com, + selected: SystemCommands, + sessionID: sessionID, + customCommands: customCommands, + mcpPrompts: mcpPrompts, + isUserMessageSelected: isUserMessageSelected, } help := help.New() @@ -392,14 +390,9 @@ func (c *Commands) defaultCommands() []*CommandItem { NewCommandItem(c.com.Styles, "new_session", "New Session", "ctrl+n", ActionNewSession{}), } - if c.canFork { + if c.isUserMessageSelected { commands = append(commands, NewCommandItem(c.com.Styles, "fork_conversation", "Fork Conversation", "", ActionForkConversation{}), - ) - } - - if c.canDelete { - commands = append(commands, NewCommandItem(c.com.Styles, "delete_messages", "Delete Messages (including this)", "", ActionDeleteMessages{}), ) } diff --git a/internal/ui/model/ui.go b/internal/ui/model/ui.go index 7b8a8797edd6ff741b46517cdd51d5c0f2e16b03..72adc90d9026d197a89cd0216c2a1e279c275251 100644 --- a/internal/ui/model/ui.go +++ b/internal/ui/model/ui.go @@ -322,6 +322,13 @@ func (m *UI) setState(state uiState, focus uiFocusState) { m.updateLayoutAndSize() } +// focusEditor focuses the editor and blurs the chat list. +func (m *UI) focusEditor() tea.Cmd { + m.chat.list.Blur() + m.focus = uiFocusEditor + return m.textarea.Focus() +} + // loadCustomCommands loads the custom commands asynchronously. func (m *UI) loadCustomCommands() tea.Cmd { return func() tea.Msg { @@ -1193,9 +1200,7 @@ func (m *UI) handleDialogMsg(msg tea.Msg) tea.Cmd { } }) m.dialog.CloseDialog(dialog.CommandsID) - m.chat.list.Blur() - m.focus = uiFocusEditor - cmds = append(cmds, m.textarea.Focus()) + cmds = append(cmds, m.focusEditor()) case dialog.ActionDeleteMessages: if m.isAgentBusy() { @@ -1228,9 +1233,7 @@ func (m *UI) handleDialogMsg(msg tea.Msg) tea.Cmd { return m.loadSession(m.session.ID)() }) m.dialog.CloseDialog(dialog.CommandsID) - m.chat.list.Blur() - m.focus = uiFocusEditor - cmds = append(cmds, m.textarea.Focus()) + cmds = append(cmds, m.focusEditor()) case dialog.ActionSelectModel: if m.isAgentBusy() { @@ -2789,13 +2792,11 @@ func (m *UI) openModelsDialog() tea.Cmd { // openCommandsDialog opens the commands dialog. func (m *UI) openCommandsDialog() tea.Cmd { - canFork := false - canDelete := false + isUserMessageSelected := false selectedItem := m.chat.SelectedItem() if selectedItem != nil { if _, ok := selectedItem.(*chat.UserMessageItem); ok { - canFork = true - canDelete = true + isUserMessageSelected = true } } @@ -2809,7 +2810,7 @@ func (m *UI) openCommandsDialog() tea.Cmd { sessionID = m.session.ID } - commands, err := dialog.NewCommands(m.com, sessionID, m.customCommands, m.mcpPrompts, canFork, canDelete) + commands, err := dialog.NewCommands(m.com, sessionID, m.customCommands, m.mcpPrompts, isUserMessageSelected) if err != nil { return uiutil.ReportError(err) }