이번 변경은 claude-code 기준 구조 강건성을 높이기 위한 리팩터링입니다. 핵심 수정 사항: - AX Agent transcript를 TranscriptVisualItem/TranscriptVisualHost 기반 지연 materialization 구조로 전환해 MessageList 가상화 기반을 강화했습니다. - StreamingToolExecutionCoordinator를 IToolExecutionCoordinator 뒤로 분리해 AgentLoopService가 구체 구현에 직접 묶이지 않도록 정리했습니다. - 라이브 진행 카드 렌더를 ChatWindow.LiveProgressPresentation partial로 이동해 ChatWindow.xaml.cs의 책임을 더 줄였습니다. - 기존 메시지 bubble 조립 로직을 유지하면서 transcript host가 필요 시점에 bubble을 만들 수 있도록 helper 경로를 추가했습니다. 검증 결과: - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\ - 경고 0 / 오류 0
44 lines
1.0 KiB
C#
44 lines
1.0 KiB
C#
using System;
|
|
using System.Windows;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public sealed class TranscriptVisualItem
|
|
{
|
|
private readonly Func<UIElement>? _factory;
|
|
private readonly Action<UIElement>? _onMaterialized;
|
|
private UIElement? _element;
|
|
|
|
public TranscriptVisualItem(string key, UIElement element)
|
|
{
|
|
Key = key;
|
|
_element = element;
|
|
}
|
|
|
|
public TranscriptVisualItem(string key, Func<UIElement> factory, Action<UIElement>? onMaterialized = null)
|
|
{
|
|
Key = key;
|
|
_factory = factory;
|
|
_onMaterialized = onMaterialized;
|
|
}
|
|
|
|
public string Key { get; }
|
|
|
|
public bool IsMaterialized => _element != null;
|
|
|
|
public UIElement? Element => _element;
|
|
|
|
public UIElement GetOrCreateElement()
|
|
{
|
|
if (_element != null)
|
|
return _element;
|
|
|
|
if (_factory == null)
|
|
throw new InvalidOperationException("Transcript visual factory is not available.");
|
|
|
|
_element = _factory();
|
|
_onMaterialized?.Invoke(_element);
|
|
return _element;
|
|
}
|
|
}
|