enhance: improve assistant message rendering and console patching

- 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>
pull/1/head
abel533 1 month ago
parent 45283c87e4
commit 02ab8c2777
  1. 40
      src/main/java/com/claudecode/tui/ClaudeCodeComponent.java
  2. 3
      src/main/java/com/claudecode/tui/JinkReplSession.java

@ -225,10 +225,42 @@ public class ClaudeCodeComponent extends Component<ClaudeCodeComponent.TuiState>
case AssistantMsg m -> {
List<Renderable> 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;
}

@ -96,6 +96,9 @@ public class JinkReplSession {
// 启动 jink 渲染
inkApp = Ink.render(component);
// 拦截 System.out/err,防止日志干扰 TUI
inkApp.patchConsole();
// 阻塞等待退出
inkApp.waitUntilExit();

Loading…
Cancel
Save