From 372e49199b58281bf1c7f75dfa2835189bc61383 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Tue, 17 Feb 2026 13:15:09 +0300 Subject: Feat: collapse/expand thinking blocks with alt+t --- bot.go | 10 +++++++++- main.go | 1 + tui.go | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/bot.go b/bot.go index 0ac94f7..61d33fa 100644 --- a/bot.go +++ b/bot.go @@ -1087,7 +1087,15 @@ func chatToTextSlice(messages []models.RoleMsg, showSys bool) []string { func chatToText(messages []models.RoleMsg, showSys bool) string { s := chatToTextSlice(messages, showSys) - return strings.Join(s, "\n") + text := strings.Join(s, "\n") + + // Collapse thinking blocks if enabled + if thinkingCollapsed { + placeholder := "[yellow::i][thinking... (press Alt+T to expand)][-:-:-]" + text = thinkRE.ReplaceAllString(text, placeholder) + } + + return text } func removeThinking(chatBody *models.ChatBody) { diff --git a/main.go b/main.go index 45f0d4b..8dc4752 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,7 @@ var ( injectRole = true selectedIndex = int(-1) shellMode = false + thinkingCollapsed = false indexLineCompletion = "F12 to show keys help | llm turn: [%s:-:b]%v[-:-:-] (F6) | chat: [orange:-:b]%s[-:-:-] (F1) | toolUseAdviced: [%s:-:b]%v[-:-:-] (ctrl+k) | model: [orange:-:b]%s[-:-:-] (ctrl+l) | skip LLM resp: [%s:-:b]%v[-:-:-] (F10)\nAPI: [orange:-:b]%s[-:-:-] (ctrl+v) | recording: [%s:-:b]%v[-:-:-] (ctrl+r) | writing as: [orange:-:b]%s[-:-:-] (ctrl+q) | bot will write as [orange:-:b]%s[-:-:-] (ctrl+x) | role injection (alt+7) [%s:-:b]%v[-:-:-]" focusSwitcher = map[tview.Primitive]tview.Primitive{} ) diff --git a/tui.go b/tui.go index 31f4091..2883511 100644 --- a/tui.go +++ b/tui.go @@ -96,6 +96,7 @@ var ( [yellow]Alt+7[white]: toggle role injection (inject role in messages) [yellow]Alt+8[white]: show char img or last picked img [yellow]Alt+9[white]: warm up (load) selected llama.cpp model +[yellow]Alt+t[white]: toggle thinking blocks visibility (collapse/expand blocks) === scrolling chat window (some keys similar to vim) === [yellow]arrows up/down and j/k[white]: scroll up and down @@ -831,6 +832,20 @@ func init() { injectRole = !injectRole updateStatusLine() } + // Handle Alt+T to toggle thinking block visibility + if event.Key() == tcell.KeyRune && event.Rune() == 't' && event.Modifiers()&tcell.ModAlt != 0 { + thinkingCollapsed = !thinkingCollapsed + textView.SetText(chatToText(chatBody.Messages, cfg.ShowSys)) + colorText() + status := "expanded" + if thinkingCollapsed { + status = "collapsed" + } + if err := notifyUser("thinking", fmt.Sprintf("Thinking blocks %s", status)); err != nil { + logger.Error("failed to send notification", "error", err) + } + return nil + } if event.Key() == tcell.KeyF1 { // chatList, err := loadHistoryChats() chatList, err := store.GetChatByChar(cfg.AssistantRole) -- cgit v1.2.3