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();