From 1cd8317f5186634d2e28bd827f113788714f1999 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Tue, 9 Dec 2025 15:28:48 +0300 Subject: Feat: edit role alt+4 --- main.go | 1 + tui.go | 46 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index baa783d..06575b0 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( var ( botRespMode = false editMode = false + roleEditMode = false injectRole = true selectedIndex = int(-1) currentAPIIndex = 0 // Index to track current API in ApiLinks slice diff --git a/tui.go b/tui.go index 04d20bd..9eab7e0 100644 --- a/tui.go +++ b/tui.go @@ -30,11 +30,13 @@ var ( defaultImage = "sysprompts/llama.png" indexPickWindow *tview.InputField renameWindow *tview.InputField + roleEditWindow *tview.InputField fullscreenMode bool // pages historyPage = "historyPage" agentPage = "agentPage" editMsgPage = "editMsgPage" + roleEditPage = "roleEditPage" indexPage = "indexPage" helpPage = "helpPage" renamePage = "renamePage" @@ -57,6 +59,7 @@ var ( [yellow]F2[white]: regen last [yellow]F3[white]: delete last msg [yellow]F4[white]: edit msg +[yellow]Alt+4[white]: edit msg role [yellow]F5[white]: toggle fullscreen for input/chat window [yellow]F6[white]: interrupt bot resp [yellow]F7[white]: copy last msg to clipboard (linux xclip) @@ -555,6 +558,30 @@ func init() { // colorText() // updateStatusLine() }) + + roleEditWindow = tview.NewInputField(). + SetLabel("Enter new role: "). + SetPlaceholder("e.g., user, assistant, system, tool"). + SetDoneFunc(func(key tcell.Key) { + if key == tcell.KeyEnter { + newRole := roleEditWindow.GetText() + if newRole == "" { + if err := notifyUser("edit", "no role provided"); err != nil { + logger.Error("failed to send notification", "error", err) + } + pages.RemovePage(roleEditPage) + return + } + if selectedIndex >= 0 && selectedIndex < len(chatBody.Messages) { + chatBody.Messages[selectedIndex].Role = newRole + textView.SetText(chatToText(cfg.ShowSys)) + colorText() + pages.RemovePage(roleEditPage) + } + } else if key == tcell.KeyEscape { + pages.RemovePage(roleEditPage) + } + }) indexPickWindow.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyBackspace: @@ -591,12 +618,17 @@ func init() { return nil } m := chatBody.Messages[selectedIndex] - if editMode { + if roleEditMode { + hideIndexBar() // Hide overlay first + // Set the current role as the default text in the input field + roleEditWindow.SetText(m.Role) + pages.AddPage(roleEditPage, roleEditWindow, true, true) + roleEditMode = false // Reset the flag + } else if editMode { hideIndexBar() // Hide overlay first pages.AddPage(editMsgPage, editArea, true, true) editArea.SetText(m.Content, true) - } - if !editMode { + } else { if err := copyToClipboard(m.Content); err != nil { logger.Error("failed to copy to clipboard", "error", err) } @@ -787,6 +819,14 @@ func init() { showIndexBar() return nil } + if event.Key() == tcell.KeyRune && event.Modifiers() == tcell.ModAlt && event.Rune() == '4' { + // edit msg role - show index input as overlay at top + editMode = false // Reset edit mode to false to handle role editing + showIndexBar() + // Set a flag to indicate we're in role edit mode + roleEditMode = true + return nil + } if event.Key() == tcell.KeyF5 { // toggle fullscreen fullscreenMode = !fullscreenMode -- cgit v1.2.3