AX Agent 구형 본문 재시도 카드를 제거해 메시지 축을 더 단순화
- ChatWindow의 AddRetryButton 경로를 제거하고 실패 시 토스트 안내 후 작업 요약 재시도 액션을 사용하도록 정리 - 본문 MessagePanel에 임시 실패 카드를 직접 삽입하던 구형 흐름을 걷어내고 claw-code 방향의 메시지/상태 중심 구조로 추가 정리 - README와 DEVELOPMENT 문서에 2026-04-05 13:52 (KST) 기준 이력과 검증 결과를 반영 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0, 오류 0)
This commit is contained in:
@@ -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)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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`에 실패 카드가 임시로 직접 삽입되는 구형 흐름이 사라졌고, 오류 복구도 메시지 축보다는 작업 요약 액션 축으로 수렴하게 됐습니다.
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user