From f28d2328ef27301f42ff5821cf1413e34c6c7097 Mon Sep 17 00:00:00 2001 From: abel533 Date: Sat, 4 Apr 2026 17:28:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=9D=83=E9=99=90/AskUser=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E6=94=B9=E4=B8=BA=E8=99=9A=E6=8B=9F=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=EF=BC=8C=E9=81=BF=E5=85=8D=E9=94=81=E7=AB=9E?= =?UTF-8?q?=E4=BA=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handlePermissionInput 回调在虚拟线程中执行 - confirmAskUser 回调在虚拟线程中执行 - 移除 confirmAskUser 中多余的 synchronized 嵌套 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../com/claudecode/tui/ClaudeCodeComponent.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java index b4d5943..c379041 100644 --- a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java +++ b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java @@ -604,7 +604,9 @@ public class ClaudeCodeComponent extends Component Consumer cb = permissionCallback; permissionCallback = null; setState(new TuiState("", s.messages, 0, false, "")); - if (cb != null) cb.accept(answer); + if (cb != null) { + Thread.startVirtualThread(() -> cb.accept(answer)); + } } else if (key.backspace() && !s.inputText.isEmpty()) { setState(new TuiState(s.inputText.substring(0, s.inputText.length() - 1), s.messages, s.scrollOffset, false, "")); @@ -669,7 +671,7 @@ public class ClaudeCodeComponent extends Component } } - /** 确认 AskUser 选择并回调 */ + /** 确认 AskUser 选择并回调(调用方已持有 stateLock) */ private void confirmAskUser(String answer) { Consumer cb = permissionCallback; permissionCallback = null; @@ -677,11 +679,12 @@ public class ClaudeCodeComponent extends Component askQuestion = null; askInputMode = false; askSelectedIndex = 0; - synchronized (stateLock) { - TuiState s = getState(); - setState(new TuiState("", s.messages, 0, false, "")); + TuiState s = getState(); + setState(new TuiState("", s.messages, 0, false, "")); + // 回调在锁外执行(cb.accept 可能阻塞或触发其他状态变更) + if (cb != null) { + Thread.startVirtualThread(() -> cb.accept(answer)); } - if (cb != null) cb.accept(answer); } /** 处理滚动输入 */