AX Agent 도구·스킬 정합성 재구성 및 실행 품질 보강
변경 목적: - AX Agent의 도구 이름, 내부 설정, 스킬 정책, 실행 루프 사이의 불일치를 줄이고 전체 동작 품질을 높인다. - claw-code 수준의 일관된 동작 품질을 참고하되 AX 구조에 맞는 고유한 카탈로그·정규화 레이어로 재구성한다. 핵심 수정사항: - 도구 canonical id, legacy alias, 탭 노출, 설정 카테고리, read-only 분류를 중앙 카탈로그로 통합했다. - ToolRegistry, AgentLoopService, 병렬 실행 분류, 권한 처리, 훅 처리, 스킬 allowed-tools 해석이 같은 이름 체계를 사용하도록 정리했다. - Agent 설정/일반 설정/도움말의 도구 카드와 훅 편집기, 스킬 설명을 현재 런타임 구조에 맞게 갱신했다. - 컨텍스트 압축, intent gate, spawn agents, session learning, model prompt adapter, workspace context 관련 변경과 테스트 추가를 함께 반영했다. - 문서 이력과 비교/로드맵 문서를 최신 상태로 갱신했다. 검증 결과: - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify_toolcat\ -p:IntermediateOutputPath=obj\verify_toolcat\ : 경고 0 / 오류 0 - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter AgentToolCatalogTests -p:OutputPath=bin\verify_toolcat_tests\ -p:IntermediateOutputPath=obj\verify_toolcat_tests\ : 통과 8
This commit is contained in:
@@ -4,6 +4,7 @@ using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using AxCopilot.Models;
|
||||
using AxCopilot.Services;
|
||||
|
||||
@@ -40,19 +41,18 @@ public partial class ChatWindow
|
||||
var msgMaxWidth = GetMessageMaxWidth();
|
||||
var wrapper = new StackPanel
|
||||
{
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
Width = msgMaxWidth,
|
||||
MaxWidth = msgMaxWidth,
|
||||
Margin = new Thickness(0, 4, 0, 6),
|
||||
HorizontalAlignment = HorizontalAlignment.Right,
|
||||
MaxWidth = msgMaxWidth * 0.85,
|
||||
Margin = new Thickness(60, 8, 12, 10), // 좌측 여백 넓게 → 우측에 붙음
|
||||
};
|
||||
|
||||
var bubble = new Border
|
||||
{
|
||||
BorderBrush = borderBrush,
|
||||
BorderThickness = new Thickness(1),
|
||||
CornerRadius = new CornerRadius(14),
|
||||
Padding = new Thickness(14, 10, 14, 10),
|
||||
HorizontalAlignment = HorizontalAlignment.Stretch,
|
||||
BorderThickness = new Thickness(0),
|
||||
CornerRadius = new CornerRadius(18),
|
||||
Padding = new Thickness(16, 12, 16, 12),
|
||||
HorizontalAlignment = HorizontalAlignment.Right,
|
||||
};
|
||||
// DynamicResource 방식으로 바인딩 — 테마 전환 시 기존 버블도 자동 업데이트
|
||||
bubble.SetResourceReference(Border.BackgroundProperty, "HintBackground");
|
||||
@@ -73,10 +73,10 @@ public partial class ChatWindow
|
||||
{
|
||||
Text = content,
|
||||
TextAlignment = TextAlignment.Left,
|
||||
FontSize = 12,
|
||||
FontSize = 14,
|
||||
Foreground = primaryText,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
LineHeight = 18,
|
||||
LineHeight = 22,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ public partial class ChatWindow
|
||||
{
|
||||
Orientation = Orientation.Horizontal,
|
||||
HorizontalAlignment = HorizontalAlignment.Right,
|
||||
Opacity = 0.8,
|
||||
Opacity = 0,
|
||||
Margin = new Thickness(0, 2, 0, 0),
|
||||
};
|
||||
var capturedUserContent = content;
|
||||
@@ -110,7 +110,7 @@ public partial class ChatWindow
|
||||
{
|
||||
Text = timestamp.ToString("HH:mm"),
|
||||
FontSize = 10.5,
|
||||
Opacity = 0.52,
|
||||
Opacity = 0,
|
||||
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
|
||||
HorizontalAlignment = HorizontalAlignment.Right,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
@@ -119,8 +119,21 @@ public partial class ChatWindow
|
||||
Grid.SetColumn(timestampText, 2);
|
||||
userBottomBar.Children.Add(timestampText);
|
||||
wrapper.Children.Add(userBottomBar);
|
||||
wrapper.MouseEnter += (_, _) => userActionBar.Opacity = 1;
|
||||
wrapper.MouseLeave += (_, _) => userActionBar.Opacity = ReferenceEquals(_selectedMessageActionBar, userActionBar) ? 1 : 0.8;
|
||||
wrapper.MouseEnter += (_, _) =>
|
||||
{
|
||||
userActionBar.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(0.7, TimeSpan.FromMilliseconds(150)));
|
||||
timestampText.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(0.5, TimeSpan.FromMilliseconds(150)));
|
||||
};
|
||||
wrapper.MouseLeave += (_, _) =>
|
||||
{
|
||||
var targetOpacity = ReferenceEquals(_selectedMessageActionBar, userActionBar) ? 1.0 : 0.0;
|
||||
userActionBar.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(targetOpacity, TimeSpan.FromMilliseconds(200)));
|
||||
timestampText.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(0, TimeSpan.FromMilliseconds(200)));
|
||||
};
|
||||
wrapper.MouseLeftButtonUp += (_, _) => SelectMessageActionBar(userActionBar, bubble);
|
||||
|
||||
var userContent = content;
|
||||
@@ -150,10 +163,9 @@ public partial class ChatWindow
|
||||
var assistantMaxWidth = GetMessageMaxWidth();
|
||||
var container = new StackPanel
|
||||
{
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
Width = assistantMaxWidth,
|
||||
HorizontalAlignment = HorizontalAlignment.Left,
|
||||
MaxWidth = assistantMaxWidth,
|
||||
Margin = new Thickness(0, 6, 0, 6),
|
||||
Margin = new Thickness(12, 10, 60, 10), // 우측 여백 넓게 → 좌측에 붙음
|
||||
};
|
||||
if (animate)
|
||||
ApplyMessageEntryAnimation(container);
|
||||
@@ -165,10 +177,10 @@ public partial class ChatWindow
|
||||
header.Children.Add(new TextBlock
|
||||
{
|
||||
Text = agentName,
|
||||
FontSize = 11,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
FontSize = 12,
|
||||
FontWeight = FontWeights.Medium,
|
||||
Foreground = secondaryText,
|
||||
Margin = new Thickness(4, 0, 0, 0),
|
||||
Margin = new Thickness(6, 0, 0, 0),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
});
|
||||
// 아이콘 애니메이션 적용
|
||||
@@ -327,7 +339,7 @@ public partial class ChatWindow
|
||||
Orientation = Orientation.Horizontal,
|
||||
HorizontalAlignment = HorizontalAlignment.Left,
|
||||
Margin = new Thickness(2, 2, 0, 0),
|
||||
Opacity = 0.8,
|
||||
Opacity = 0,
|
||||
};
|
||||
var btnColor = secondaryText;
|
||||
var capturedContent = content;
|
||||
@@ -356,8 +368,17 @@ public partial class ChatWindow
|
||||
if (assistantMeta != null)
|
||||
container.Children.Add(assistantMeta);
|
||||
|
||||
container.MouseEnter += (_, _) => actionBar.Opacity = 1;
|
||||
container.MouseLeave += (_, _) => actionBar.Opacity = ReferenceEquals(_selectedMessageActionBar, actionBar) ? 1 : 0.8;
|
||||
container.MouseEnter += (_, _) =>
|
||||
{
|
||||
actionBar.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(1, TimeSpan.FromMilliseconds(150)));
|
||||
};
|
||||
container.MouseLeave += (_, _) =>
|
||||
{
|
||||
var targetOpacity = ReferenceEquals(_selectedMessageActionBar, actionBar) ? 1.0 : 0.0;
|
||||
actionBar.BeginAnimation(OpacityProperty,
|
||||
new DoubleAnimation(targetOpacity, TimeSpan.FromMilliseconds(200)));
|
||||
};
|
||||
container.MouseLeftButtonUp += (_, _) => SelectMessageActionBar(actionBar, contentCard);
|
||||
|
||||
var aiContent = content;
|
||||
|
||||
Reference in New Issue
Block a user