From e3f60a59332d0ea286826a8f71d5c8941eea4d43 Mon Sep 17 00:00:00 2001 From: liuzh Date: Thu, 2 Apr 2026 00:44:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20CLI=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20-=20=E6=B5=81=E5=BC=8F=E7=BC=A9=E8=BF=9B+=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=A1=86=E6=A8=AA=E7=BA=BF+=E6=97=A5=E5=BF=97=E9=99=8D?= =?UTF-8?q?=E5=99=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 流式输出: ● 标识与文本同行,续行4空格缩进对齐 - 输入框: 上下横线(─)分隔输入区域,宽度自适应终端 - 日志: 工具异常日志降为debug级别,避免终端输出stack trace Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../java/com/claudecode/repl/ReplSession.java | 32 ++++++++++++++++--- .../com/claudecode/tool/impl/AgentTool.java | 2 +- .../tool/impl/AskUserQuestionTool.java | 2 +- .../claudecode/tool/impl/WebSearchTool.java | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/claudecode/repl/ReplSession.java b/src/main/java/com/claudecode/repl/ReplSession.java index 849547e..56f10a4 100644 --- a/src/main/java/com/claudecode/repl/ReplSession.java +++ b/src/main/java/com/claudecode/repl/ReplSession.java @@ -192,9 +192,17 @@ public class ReplSession { statusLine.enable(providerInfo.model(), agentLoop.getTokenTracker()); } + // 输入框横线宽度 + int termWidth = terminal.getWidth(); + int lineWidth = termWidth > 10 ? termWidth - 2 : 78; + String inputLine = AnsiStyle.DIM + "─".repeat(lineWidth) + AnsiStyle.RESET; + CommandContext cmdContext = new CommandContext(agentLoop, toolRegistry, commandRegistry, out, () -> running = false); while (running) { + // 输入框上横线 + out.println(inputLine); + String input; try { input = reader.readLine(prompt).strip(); @@ -206,6 +214,9 @@ public class ReplSession { break; } + // 输入框下横线 + out.println(inputLine); + if (input.isEmpty()) { continue; } @@ -317,12 +328,25 @@ public class ReplSession { long startTime = System.currentTimeMillis(); - // AI 回复前的 ● 标识 - out.println(AnsiStyle.BRIGHT_CYAN + " ● " + AnsiStyle.RESET); + // AI 回复前的 ● 标识(不换行,后续流式文本紧跟其后) + out.print(AnsiStyle.BRIGHT_CYAN + " ● " + AnsiStyle.RESET); - // 流式回调:逐 token 输出到终端 + // 流式回调:逐 token 输出到终端,自动在每行开头加缩进 + final boolean[] isNewLine = {false}; // 跟踪是否刚输出换行符 String response = agentLoop.runStreaming(input, token -> { - out.print(token); + for (int i = 0; i < token.length(); i++) { + char c = token.charAt(i); + if (c == '\n') { + out.println(); + isNewLine[0] = true; + } else { + if (isNewLine[0]) { + out.print(" "); // 续行缩进(与 ● 后文本对齐) + isNewLine[0] = false; + } + out.print(c); + } + } out.flush(); }); diff --git a/src/main/java/com/claudecode/tool/impl/AgentTool.java b/src/main/java/com/claudecode/tool/impl/AgentTool.java index ca2cee8..d538bca 100644 --- a/src/main/java/com/claudecode/tool/impl/AgentTool.java +++ b/src/main/java/com/claudecode/tool/impl/AgentTool.java @@ -92,7 +92,7 @@ public class AgentTool implements Tool { log.info("Sub-agent completed, result length: {} chars", result.length()); return result; } catch (Exception e) { - log.error("Sub-agent execution failed", e); + log.debug("Sub-agent execution failed", e); return "Error: Sub-agent failed: " + e.getMessage(); } } diff --git a/src/main/java/com/claudecode/tool/impl/AskUserQuestionTool.java b/src/main/java/com/claudecode/tool/impl/AskUserQuestionTool.java index 88c09de..2b12a40 100644 --- a/src/main/java/com/claudecode/tool/impl/AskUserQuestionTool.java +++ b/src/main/java/com/claudecode/tool/impl/AskUserQuestionTool.java @@ -119,7 +119,7 @@ public class AskUserQuestionTool implements Tool { return "User response: " + userResponse; } catch (Exception e) { - log.error("Failed to get user input", e); + log.debug("Failed to get user input", e); return "Error: Failed to get user input - " + e.getMessage(); } } diff --git a/src/main/java/com/claudecode/tool/impl/WebSearchTool.java b/src/main/java/com/claudecode/tool/impl/WebSearchTool.java index 1201155..82570a6 100644 --- a/src/main/java/com/claudecode/tool/impl/WebSearchTool.java +++ b/src/main/java/com/claudecode/tool/impl/WebSearchTool.java @@ -92,7 +92,7 @@ public class WebSearchTool implements Tool { String html = fetchSearchPage(query); return parseResults(html, maxResults); } catch (Exception e) { - log.error("Search failed: query={}", query, e); + log.debug("Search failed: query={}", query, e); return "Error: Search failed - " + e.getMessage(); } }