diff --git a/README.md b/README.md index 595720e..ea2cc14 100644 --- a/README.md +++ b/README.md @@ -1220,3 +1220,5 @@ MIT License - [ChatWindow.AgentEventRendering.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs)에 권한 요청/도구 결과 카테고리 chip을 추가했다. 이제 `명령 실행`, `파일 수정`, `웹 요청`, `Git`, `문서`, `스킬`, `MCP` 같은 종류가 상태 chip과 함께 보여서, 어떤 성격의 요청/결과인지 transcript에서 더 빨리 파악할 수 있다. - 업데이트: 2026-04-06 13:20 (KST) - [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을 열어 확인 흐름으로 이어질 수 있다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index f7cf055..930c125 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4949,3 +4949,4 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - Document update: 2026-04-06 13:08 (KST) - Refined the transcript chips to visually differentiate metadata states instead of rendering every cue in the same neutral style. `ChatWindow.AgentEventRendering.cs` now uses blue for preview guidance, red for high-severity attention, amber for review/partial follow-up, and orange for approval-required continuation cues. - 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. diff --git a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs index 430d1d1..eea0c0c 100644 --- a/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs +++ b/src/AxCopilot/Views/ChatWindow.AgentEventRendering.cs @@ -117,6 +117,52 @@ public partial class ChatWindow }; } + private Border CreateAgentInlineActionButton(string text, string icon, Brush foreground, Brush borderBrush, Action onClick) + { + var button = new Border + { + Background = Brushes.Transparent, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(999), + Padding = new Thickness(6, 2.5, 6, 2.5), + Margin = new Thickness(11, 3, 0, 0), + Cursor = Cursors.Hand, + Child = new StackPanel + { + Orientation = Orientation.Horizontal, + Children = + { + new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 8, + Foreground = foreground, + VerticalAlignment = VerticalAlignment.Center, + }, + new TextBlock + { + Text = text, + FontSize = 8.15, + Foreground = foreground, + Margin = new Thickness(4, 0, 0, 0), + VerticalAlignment = VerticalAlignment.Center, + } + } + } + }; + + button.MouseEnter += (_, _) => button.Background = new SolidColorBrush(Color.FromArgb(0x10, 0xFF, 0xFF, 0xFF)); + button.MouseLeave += (_, _) => button.Background = Brushes.Transparent; + button.MouseLeftButtonUp += (_, e) => + { + e.Handled = true; + onClick(); + }; + return button; + } + private static string GetPermissionKindLabel(string kind) { return kind switch @@ -294,6 +340,20 @@ public partial class ChatWindow if (chipRow.Children.Count > 0) stack.Children.Add(chipRow); + + if (!string.IsNullOrWhiteSpace(evt.FilePath) && + System.IO.File.Exists(evt.FilePath) && + ((permissionPresentation?.RequiresPreview ?? false) + || toolResultPresentation != null)) + { + var previewPath = evt.FilePath!; + stack.Children.Add(CreateAgentInlineActionButton( + "프리뷰 열기", + "\uE8A1", + BrushFromHex("#2563EB"), + BrushFromHex("#BFDBFE"), + () => ShowPreviewPanel(previewPath))); + } } private void AddAgentEventBanner(AgentEvent evt)