diff --git a/README.md b/README.md index 096c331..9bbe61c 100644 --- a/README.md +++ b/README.md @@ -753,6 +753,7 @@ ow + toggle 시각 언어로 통일했습니다. - `OnAgentEvent(...)`는 이제 실행 이벤트 자체를 대화 모델과 앱 상태에 먼저 반영하고, 화면 갱신은 배치된 UI 이벤트 flush가 담당합니다. 이 조정으로 Cowork/Code 실행 중 빠른 이벤트 연속 구간에서 상태바와 진행률, 파일 미리보기 쪽이 따로따로 즉시 흔들리던 체감을 더 줄이는 방향으로 정리했습니다. - 대기열 다음 작업 시작도 입력창 UI에 의존하지 않게 바꿨습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `SendMessageAsync(...)`는 이제 선택적으로 직접 텍스트를 받을 수 있고, `StartNextQueuedDraftIfAny(...)`는 더 이상 `InputBox.Text`를 바꿔 포커스를 흔든 뒤 전송하지 않고 `SendMessageAsync(next.Text)`로 바로 실행합니다. 이걸로 Cowork/Code 자동 이어달리기가 입력창 상태를 덜 건드리게 됐습니다. - 실패 후 재시도도 같은 방향으로 정리했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `RetryLastUserMessageFromConversation()`는 이제 입력창에 마지막 요청을 다시 밀어 넣지 않고, 유휴 상태면 `SendMessageAsync(lastUserMessage)`로 바로 다시 실행하고, 이미 작업 중이면 같은 요청을 곧바로 대기열에 적재합니다. 재시도 동작도 입력창 포커스와 높이를 흔들지 않게 만든 조정입니다. +- 이어서 구형 본문 재시도 카드도 제거했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddRetryButton()` 경로를 걷어내고, 실패 시에는 본문에 임시 재시도 카드를 꽂지 않고 짧은 토스트로만 안내한 뒤 작업 요약/실패 이력 쪽 재시도 액션을 사용하도록 정리했습니다. 본문을 메시지와 상태 중심으로 유지하는 `claw-code` 방향에 더 가깝게 맞춘 것입니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 12:24 (KST) - 업데이트: 2026-04-05 12:31 (KST) @@ -767,6 +768,7 @@ ow + toggle 시각 언어로 통일했습니다. - 업데이트: 2026-04-05 13:29 (KST) - 업데이트: 2026-04-05 13:37 (KST) - 업데이트: 2026-04-05 13:44 (KST) +- 업데이트: 2026-04-05 13:52 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 348e9a8..a3a9e18 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4528,3 +4528,6 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - 업데이트: 2026-04-05 13:44 (KST) - `RetryLastUserMessageFromConversation()`도 입력창 의존을 제거했습니다. 마지막 사용자 요청을 재시도할 때 더 이상 `InputBox.Text`를 바꾸지 않고, 유휴 상태면 `SendMessageAsync(lastUserMessage)`로 바로 실행하며, 이미 작업 중이면 `ChatSession.EnqueueDraft(..., \"now\", ..., \"direct\")`로 곧바로 대기열에 올립니다. - 이 조정으로 실패 후 재시도 역시 입력창 포커스/높이/슬래시 칩 상태와 분리되었고, Cowork/Code의 재시도 흐름이 세션/대기열 중심으로 더 정리됐습니다. +- 업데이트: 2026-04-05 13:52 (KST) +- 남아 있던 구형 본문 재시도 카드도 제거했습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 `AddRetryButton()` 메서드와 그 호출 경로를 걷어내고, 예외 발생 시에는 토스트로만 짧게 안내한 뒤 작업 요약/실패 이력의 재시도 액션을 사용하게 했습니다. +- 이 변경으로 본문 `MessagePanel`에 실패 카드가 임시로 직접 삽입되는 구형 흐름이 사라졌고, 오류 복구도 메시지 축보다는 작업 요약 액션 축으로 수렴하게 됐습니다. diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 1e8c519..23bde2c 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -8461,7 +8461,7 @@ public partial class ChatWindow : Window { var errMsg = $"⚠ 오류: {ex.Message}"; assistantContent = errMsg; - AddRetryButton(); + ShowToast("실패한 요청은 작업 요약에서 다시 시도할 수 있습니다.", "\uE783", 2600); draftFailure = ex.Message; } finally @@ -11025,7 +11025,7 @@ public partial class ChatWindow : Window { var errMsg = $"⚠ 오류: {ex.Message}"; assistantContent = errMsg; - AddRetryButton(); + ShowToast("실패한 요청은 작업 요약에서 다시 시도할 수 있습니다.", "\uE783", 2600); } finally { @@ -11821,61 +11821,6 @@ public partial class ChatWindow : Window // 현재는 BringIntoView 기반이므로 별도 하이라이트 제거 불필요 } - // ─── 에러 복구 재시도 버튼 ────────────────────────────────────────────── - - private void AddRetryButton() - { - Dispatcher.Invoke(() => - { - var retryBorder = new Border - { - Background = new SolidColorBrush(Color.FromArgb(0x18, 0xEF, 0x44, 0x44)), - CornerRadius = new CornerRadius(8), - Padding = new Thickness(12, 8, 12, 8), - Margin = new Thickness(40, 4, 80, 4), - HorizontalAlignment = HorizontalAlignment.Left, - Cursor = System.Windows.Input.Cursors.Hand, - }; - var retrySp = new StackPanel { Orientation = Orientation.Horizontal }; - retrySp.Children.Add(new TextBlock - { - Text = "\uE72C", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 12, Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x44, 0x44)), - VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 6, 0), - }); - retrySp.Children.Add(new TextBlock - { - Text = "재시도", FontSize = 12, FontWeight = FontWeights.SemiBold, - Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x44, 0x44)), - VerticalAlignment = VerticalAlignment.Center, - }); - retryBorder.Child = retrySp; - retryBorder.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x30, 0xEF, 0x44, 0x44)); }; - retryBorder.MouseLeave += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xEF, 0x44, 0x44)); }; - retryBorder.MouseLeftButtonUp += (_, _) => - { - lock (_convLock) - { - var session = ChatSession; - if (session != null) - { - session.RemoveLastAssistantMessage(_activeTab, _storage); - _currentConversation = session.CurrentConversation; - } - else if (_currentConversation != null) - { - var lastIdx = _currentConversation.Messages.Count - 1; - if (lastIdx >= 0 && _currentConversation.Messages[lastIdx].Role == "assistant") - _currentConversation.Messages.RemoveAt(lastIdx); - } - } - _ = RegenerateLastAsync(); - }; - MessagePanel.Children.Add(retryBorder); - ForceScrollToEnd(); - }); - } - // ─── 메시지 우클릭 컨텍스트 메뉴 ─────────────────────────────────────── private void ShowMessageContextMenu(string content, string role)