From 02ab8c27779555e2fcbc1cab1b93eb8b90d4ebf8 Mon Sep 17 00:00:00 2001 From: abel533 Date: Sat, 4 Apr 2026 15:02:04 +0800 Subject: [PATCH] enhance: improve assistant message rendering and console patching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Split multi-line assistant messages into separate rendered lines - Add streaming cursor (▌) indicator for in-progress responses - Add patchConsole() to intercept System.out/err during TUI mode - Handle empty assistant message edge case Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../claudecode/tui/ClaudeCodeComponent.java | 40 +++++++++++++++++-- .../com/claudecode/tui/JinkReplSession.java | 3 ++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java index 399d7e2..daa63f6 100644 --- a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java +++ b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java @@ -225,10 +225,42 @@ public class ClaudeCodeComponent extends Component case AssistantMsg m -> { List lines = new ArrayList<>(); - lines.add(Text.of( - Text.of("● ").color(Color.BRIGHT_CYAN), - Text.of(m.streaming() ? m.text() + "▌" : m.text()).color(Color.WHITE) - )); + String text = m.text(); + if (text == null || text.isEmpty()) { + if (m.streaming()) { + lines.add(Text.of( + Text.of("● ").color(Color.BRIGHT_CYAN), + Text.of("▌").color(Color.BRIGHT_CYAN) + )); + } + yield lines; + } + // 将多行文本拆分为单独的行 + String[] textLines = text.split("\n", -1); + for (int i = 0; i < textLines.length; i++) { + String line = textLines[i]; + if (i == 0) { + // 首行带 ● 前缀 + String displayLine = line; + if (m.streaming() && i == textLines.length - 1) { + displayLine += "▌"; + } + lines.add(Text.of( + Text.of("● ").color(Color.BRIGHT_CYAN), + Text.of(displayLine).color(Color.WHITE) + )); + } else { + // 续行缩进对齐 + String displayLine = line; + if (m.streaming() && i == textLines.length - 1) { + displayLine += "▌"; + } + lines.add(Text.of( + Text.of(" ").dimmed(), + Text.of(displayLine).color(Color.WHITE) + )); + } + } yield lines; } diff --git a/src/main/java/com/claudecode/tui/JinkReplSession.java b/src/main/java/com/claudecode/tui/JinkReplSession.java index 943f056..968a88b 100644 --- a/src/main/java/com/claudecode/tui/JinkReplSession.java +++ b/src/main/java/com/claudecode/tui/JinkReplSession.java @@ -96,6 +96,9 @@ public class JinkReplSession { // 启动 jink 渲染 inkApp = Ink.render(component); + // 拦截 System.out/err,防止日志干扰 TUI + inkApp.patchConsole(); + // 阻塞等待退出 inkApp.waitUntilExit();