diff --git a/README.md b/README.md index ea2cc14..32430b9 100644 --- a/README.md +++ b/README.md @@ -1222,3 +1222,5 @@ MIT License - [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)의 metadata 안내를 callout 구조로 바꿨다. 권한 요청은 `확인 포인트`, 도구 결과는 `다음 권장 작업` 카드형 안내로 보여줘, 같은 transcript 안에서도 요청과 결과의 UX가 더 분리되어 보이게 정리했다. - 업데이트: 2026-04-06 13:26 (KST) - 파일 경로가 있는 권한 요청/도구 결과 카드에는 [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs) 에서 `프리뷰 열기` 액션을 직접 붙였다. 이제 `미리보기 권장` 상태나 파일 기반 결과에서 transcript 카드만 보고 끝나는 것이 아니라, 바로 우측 preview panel을 열어 확인 흐름으로 이어질 수 있다. +- 업데이트: 2026-04-06 13:31 (KST) + - [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)의 callout을 상태별 제목/강조선 구조로 다듬었다. 권한 요청은 `확인 포인트`, 승인 완료는 `적용 내용`, 도구 결과는 `승인 필요`, `오류 확인`, `부분 완료 점검`, `다음 권장 작업`처럼 제목이 달라져 카드 의미가 더 즉시 읽히게 정리했다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 930c125..6f1348f 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4950,3 +4950,4 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - Document update: 2026-04-06 13:14 (KST) - Added kind/category chips to permission and tool-result transcript banners so the action domain is visible at a glance. `ChatWindow.AgentEventRendering.cs` now surfaces labels such as `명령 실행`, `파일 수정`, `웹 요청`, `Git`, `문서`, `스킬`, and `MCP` alongside the status-oriented chips. - Document update: 2026-04-06 13:20 (KST) - Replaced the plain guidance line with typed callout boxes in `ChatWindow.AgentEventRendering.cs`. Permission requests now show an `확인 포인트` callout, while tool results show a `다음 권장 작업` callout, making the two transcript surfaces read differently even when they share the same chip language. - Document update: 2026-04-06 13:26 (KST) - Added an inline `프리뷰 열기` action to file-backed permission/tool-result banners in `ChatWindow.AgentEventRendering.cs`. When a permission request requires preview or a tool result carries a real file path, the transcript card can now open the preview panel directly instead of forcing the user to find the file elsewhere first. +- Document update: 2026-04-06 13:31 (KST) - Refined the callout presentation in `ChatWindow.AgentEventRendering.cs` so the title and left accent strip vary by state. Permission requests now read as `확인 포인트` or `적용 내용`, while tool results read as `승인 필요`, `오류 확인`, `부분 완료 점검`, or `다음 권장 작업` depending on `StatusKind`. diff --git a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs index eea0c0c..0a8055c 100644 --- a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs +++ b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs @@ -85,6 +85,7 @@ public partial class ChatWindow private Border CreateAgentMetaCallout(string title, string body, Brush titleBrush, Brush background, Brush borderBrush) { + var accentColor = (titleBrush as SolidColorBrush)?.Color ?? Colors.SteelBlue; return new Border { Background = background, @@ -93,30 +94,60 @@ public partial class ChatWindow CornerRadius = new CornerRadius(8), Padding = new Thickness(7, 5, 7, 5), Margin = new Thickness(11, 2, 0, 0), - Child = new StackPanel + Child = new Grid { + ColumnDefinitions = + { + new ColumnDefinition { Width = new GridLength(3) }, + new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, + }, Children = { - new TextBlock + new Border { - Text = title, - FontSize = 7.75, - FontWeight = FontWeights.SemiBold, - Foreground = titleBrush, + Background = new SolidColorBrush(accentColor), + CornerRadius = new CornerRadius(2), }, - new TextBlock + new StackPanel { - Text = body, - FontSize = 8.1, - Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.DimGray, - TextWrapping = TextWrapping.Wrap, - Margin = new Thickness(0, 1, 0, 0), + Margin = new Thickness(8, 0, 0, 0), + Children = + { + new TextBlock + { + Text = title, + FontSize = 7.75, + FontWeight = FontWeights.SemiBold, + Foreground = titleBrush, + }, + new TextBlock + { + Text = body, + FontSize = 8.1, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.DimGray, + TextWrapping = TextWrapping.Wrap, + Margin = new Thickness(0, 1, 0, 0), + } + } } } } }; } + private static string GetToolResultCalloutTitle(string statusKind) + { + return statusKind switch + { + "error" => "오류 확인", + "reject" => "거부됨", + "cancel" => "중단됨", + "approval_required" => "승인 필요", + "partial" => "부분 완료 점검", + _ => "다음 권장 작업", + }; + } + private Border CreateAgentInlineActionButton(string text, string icon, Brush foreground, Brush borderBrush, Action onClick) { var button = new Border @@ -312,7 +343,8 @@ public partial class ChatWindow : string.Equals(permissionPresentation.Severity, "medium", StringComparison.OrdinalIgnoreCase) ? BrushFromHex("#FDE68A") : BrushFromHex("#BFDBFE"); - stack.Children.Add(CreateAgentMetaCallout("확인 포인트", clipped, titleBrush, background, border)); + var title = evt.Type == AgentEventType.PermissionGranted ? "적용 내용" : "확인 포인트"; + stack.Children.Add(CreateAgentMetaCallout(title, clipped, titleBrush, background, border)); } else if (toolResultPresentation != null) { @@ -334,7 +366,7 @@ public partial class ChatWindow : string.Equals(toolResultPresentation.StatusKind, "approval_required", StringComparison.OrdinalIgnoreCase) ? BrushFromHex("#FED7AA") : BrushFromHex("#FDE68A"); - stack.Children.Add(CreateAgentMetaCallout("다음 권장 작업", clipped, titleBrush, background, border)); + stack.Children.Add(CreateAgentMetaCallout(GetToolResultCalloutTitle(toolResultPresentation.StatusKind), clipped, titleBrush, background, border)); } }