Feat: edit role alt+4

This commit is contained in:
Grail Finder
2025-12-09 15:28:48 +03:00
parent e1bac8d064
commit 1cd8317f51
2 changed files with 44 additions and 3 deletions

View File

@@ -11,6 +11,7 @@ import (
var ( var (
botRespMode = false botRespMode = false
editMode = false editMode = false
roleEditMode = false
injectRole = true injectRole = true
selectedIndex = int(-1) selectedIndex = int(-1)
currentAPIIndex = 0 // Index to track current API in ApiLinks slice currentAPIIndex = 0 // Index to track current API in ApiLinks slice

46
tui.go
View File

@@ -30,11 +30,13 @@ var (
defaultImage = "sysprompts/llama.png" defaultImage = "sysprompts/llama.png"
indexPickWindow *tview.InputField indexPickWindow *tview.InputField
renameWindow *tview.InputField renameWindow *tview.InputField
roleEditWindow *tview.InputField
fullscreenMode bool fullscreenMode bool
// pages // pages
historyPage = "historyPage" historyPage = "historyPage"
agentPage = "agentPage" agentPage = "agentPage"
editMsgPage = "editMsgPage" editMsgPage = "editMsgPage"
roleEditPage = "roleEditPage"
indexPage = "indexPage" indexPage = "indexPage"
helpPage = "helpPage" helpPage = "helpPage"
renamePage = "renamePage" renamePage = "renamePage"
@@ -57,6 +59,7 @@ var (
[yellow]F2[white]: regen last [yellow]F2[white]: regen last
[yellow]F3[white]: delete last msg [yellow]F3[white]: delete last msg
[yellow]F4[white]: edit msg [yellow]F4[white]: edit msg
[yellow]Alt+4[white]: edit msg role
[yellow]F5[white]: toggle fullscreen for input/chat window [yellow]F5[white]: toggle fullscreen for input/chat window
[yellow]F6[white]: interrupt bot resp [yellow]F6[white]: interrupt bot resp
[yellow]F7[white]: copy last msg to clipboard (linux xclip) [yellow]F7[white]: copy last msg to clipboard (linux xclip)
@@ -555,6 +558,30 @@ func init() {
// colorText() // colorText()
// updateStatusLine() // 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 { indexPickWindow.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() { switch event.Key() {
case tcell.KeyBackspace: case tcell.KeyBackspace:
@@ -591,12 +618,17 @@ func init() {
return nil return nil
} }
m := chatBody.Messages[selectedIndex] 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 hideIndexBar() // Hide overlay first
pages.AddPage(editMsgPage, editArea, true, true) pages.AddPage(editMsgPage, editArea, true, true)
editArea.SetText(m.Content, true) editArea.SetText(m.Content, true)
} } else {
if !editMode {
if err := copyToClipboard(m.Content); err != nil { if err := copyToClipboard(m.Content); err != nil {
logger.Error("failed to copy to clipboard", "error", err) logger.Error("failed to copy to clipboard", "error", err)
} }
@@ -787,6 +819,14 @@ func init() {
showIndexBar() showIndexBar()
return nil 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 { if event.Key() == tcell.KeyF5 {
// toggle fullscreen // toggle fullscreen
fullscreenMode = !fullscreenMode fullscreenMode = !fullscreenMode