변경 목적: - 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
62 lines
1.9 KiB
C#
62 lines
1.9 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
/// <summary>
|
|
/// TranscriptVisualItem의 지연 생성 호스트.
|
|
/// VirtualizingStackPanel Recycling 모드에서 효율적으로 동작합니다:
|
|
/// - Loaded: 콘텐츠 구체화 (GetOrCreateElement)
|
|
/// - Unloaded: 콘텐츠 참조 해제 (재활용 시 메모리 절약)
|
|
/// - DataContextChanged: 재활용된 컨테이너에 새 아이템 바인딩
|
|
/// </summary>
|
|
public sealed class TranscriptVisualHost : ContentControl
|
|
{
|
|
public TranscriptVisualHost()
|
|
{
|
|
HorizontalAlignment = HorizontalAlignment.Stretch;
|
|
HorizontalContentAlignment = HorizontalAlignment.Stretch;
|
|
DataContextChanged += OnDataContextChanged;
|
|
Loaded += OnLoaded;
|
|
Unloaded += OnUnloaded;
|
|
}
|
|
|
|
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
// 재활용 시: 이전 콘텐츠 즉시 해제 후 새 아이템 구체화
|
|
if (e.OldValue != null && e.NewValue != e.OldValue)
|
|
Content = null;
|
|
|
|
if (IsLoaded)
|
|
SyncContent();
|
|
}
|
|
|
|
private void OnLoaded(object sender, RoutedEventArgs e) => SyncContent();
|
|
|
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
|
{
|
|
// 화면 밖으로 스크롤된 항목의 콘텐츠 참조 해제
|
|
// 단, DataContext가 이미 새 아이템으로 바뀐 경우(재활용 중)는 건드리지 않음
|
|
// → Unloaded가 DataContextChanged 이후 호출되는 레이스 컨디션 방지
|
|
if (DataContext is not TranscriptVisualItem)
|
|
Content = null;
|
|
}
|
|
|
|
private void SyncContent()
|
|
{
|
|
if (DataContext is TranscriptVisualItem item)
|
|
{
|
|
Content = item.GetOrCreateElement();
|
|
return;
|
|
}
|
|
|
|
if (DataContext is UIElement element)
|
|
{
|
|
Content = element;
|
|
return;
|
|
}
|
|
|
|
Content = null;
|
|
}
|
|
}
|