summaryrefslogtreecommitdiff
path: root/tui.go
diff options
context:
space:
mode:
Diffstat (limited to 'tui.go')
-rw-r--r--tui.go87
1 files changed, 53 insertions, 34 deletions
diff --git a/tui.go b/tui.go
index 69279d7..fd1946a 100644
--- a/tui.go
+++ b/tui.go
@@ -36,15 +36,16 @@ var (
[yellow]F6[white]: interrupt bot resp
[yellow]F7[white]: copy last msg to clipboard (linux xclip)
[yellow]F8[white]: copy n msg to clipboard (linux xclip)
-[yellow]Ctrl+s[white]: choose/replace system prompt
+[yellow]Ctrl+s[white]: load new char/agent
[yellow]Ctrl+e[white]: export chat to json file
+[yellow]Ctrl+n[white]: start a new chat
Press Enter to go back
`
)
func colorText() {
- // INFO: looks way too inefficient; use it with care or make it optional
+ // INFO: is there a better way to markdown?
tv := textView.GetText(false)
cq := quotesRE.ReplaceAllString(tv, `[orange:-:-]$1[-:-:-]`)
textView.SetText(starRE.ReplaceAllString(cq, `[turquoise::i]$1[-:-:-]`))
@@ -54,6 +55,46 @@ func updateStatusLine() {
position.SetText(fmt.Sprintf(indexLine, botRespMode, cfg.AssistantRole, activeChatName))
}
+func initSysCards() ([]string, error) {
+ labels := []string{}
+ labels = append(labels, sysLabels...)
+ cards, err := pngmeta.ReadDirCards(cfg.SysDir, cfg.UserRole)
+ if err != nil {
+ logger.Error("failed to read sys dir", "error", err)
+ return nil, err
+ }
+ for _, cc := range cards {
+ sysMap[cc.Role] = cc
+ labels = append(labels, cc.Role)
+ }
+ return labels, nil
+}
+
+func startNewChat() {
+ id, err := store.ChatGetMaxID()
+ if err != nil {
+ logger.Error("failed to get chat id", "error", err)
+ }
+ // TODO: get the current agent and it's starter
+ if ok := charToStart(cfg.AssistantRole); !ok {
+ logger.Warn("no such sys msg", "name", cfg.AssistantRole)
+ }
+ // set chat body
+ chatBody.Messages = defaultStarter
+ textView.SetText(chatToText(cfg.ShowSys))
+ newChat := &models.Chat{
+ ID: id + 1,
+ Name: fmt.Sprintf("%v_%v", "new", time.Now().Unix()),
+ Msgs: string(defaultStarterBytes),
+ Agent: cfg.AssistantRole,
+ }
+ activeChatName = newChat.Name
+ chatMap[newChat.Name] = newChat
+ updateStatusLine()
+ colorText()
+ return
+}
+
func init() {
theme := tview.Theme{
PrimitiveBackgroundColor: tcell.ColorDefault,
@@ -102,24 +143,8 @@ func init() {
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
switch buttonLabel {
case "new":
- id, err := store.ChatGetMaxID()
- if err != nil {
- logger.Error("failed to get chat id", "error", err)
- }
- // set chat body
- chatBody.Messages = defaultStarter
- textView.SetText(chatToText(cfg.ShowSys))
- newChat := &models.Chat{
- ID: id + 1,
- Name: fmt.Sprintf("%v_%v", "new", time.Now().Unix()),
- Msgs: string(defaultStarterBytes),
- Agent: cfg.AssistantRole,
- }
- // activeChatName = path.Join(historyDir, fmt.Sprintf("%d_chat.json", time.Now().Unix()))
- activeChatName = newChat.Name
- chatMap[newChat.Name] = newChat
+ startNewChat()
pages.RemovePage("history")
- colorText()
return
// set text
case "cancel":
@@ -155,21 +180,15 @@ func init() {
sysModal.ClearButtons()
return
default:
- cc, ok := sysMap[buttonLabel]
- if !ok {
+ if ok := charToStart(buttonLabel); !ok {
logger.Warn("no such sys msg", "name", buttonLabel)
pages.RemovePage("sys")
return
}
- // to replace it old role in text
- // oldRole := chatBody.Messages[0].Role
- // replace every role with char
- // chatBody.Messages[0].Content = cc.SysPrompt
- // chatBody.Messages[1].Content = cc.FirstMsg
- applyCharCard(cc)
// replace textview
textView.SetText(chatToText(cfg.ShowSys))
colorText()
+ updateStatusLine()
sysModal.ClearButtons()
pages.RemovePage("sys")
app.SetFocus(textArea)
@@ -294,6 +313,7 @@ func init() {
textView.SetText(chatToText(cfg.ShowSys))
colorText()
textView.ScrollToEnd()
+ initSysCards()
app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Key() == tcell.KeyF1 {
chatList, err := loadHistoryChats()
@@ -387,9 +407,13 @@ func init() {
textArea.SetText("pressed ctrl+a", true)
return nil
}
+ if event.Key() == tcell.KeyCtrlN {
+ startNewChat()
+ return nil
+ }
if event.Key() == tcell.KeyCtrlS {
// switch sys prompt
- cards, err := pngmeta.ReadDirCards(cfg.SysDir, cfg.UserRole)
+ labels, err := initSysCards()
if err != nil {
logger.Error("failed to read sys dir", "error", err)
if err := notifyUser("error", "failed to read: "+cfg.SysDir); err != nil {
@@ -397,15 +421,10 @@ func init() {
}
return nil
}
- labels := []string{}
- labels = append(labels, sysLabels...)
- for _, cc := range cards {
- labels = append(labels, cc.Role)
- sysMap[cc.Role] = cc
- }
sysModal.AddButtons(labels)
// load all chars
pages.AddPage("sys", sysModal, true, true)
+ updateStatusLine()
return nil
}
// cannot send msg in editMode or botRespMode