AX Agent transcript 렌더 계획/적용 구조를 분리해 유지보수성을 높이고 문서를 갱신한다
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
- ChatWindow transcript 렌더를 planner/execution 단계로 분리해 RenderMessages 오케스트레이션을 단순화함 - TranscriptRenderPlanner/TranscriptRenderExecution partial을 추가해 planning과 host 적용 책임을 나눔 - README와 DEVELOPMENT 문서에 2026-04-09 09:37 (KST) 기준 구조 개선 이력을 반영함 - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ 검증 결과 경고 0개 오류 0개
This commit is contained in:
60
src/AxCopilot/Views/ChatWindow.TranscriptRenderExecution.cs
Normal file
60
src/AxCopilot/Views/ChatWindow.TranscriptRenderExecution.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
namespace AxCopilot.Views;
|
||||
|
||||
public partial class ChatWindow
|
||||
{
|
||||
private bool TryApplyIncrementalTranscriptRender(TranscriptRenderPlan renderPlan)
|
||||
{
|
||||
if (!renderPlan.CanIncremental)
|
||||
return false;
|
||||
|
||||
var prefixMatch = true;
|
||||
for (var i = 0; i < renderPlan.PreviousStableCount; i++)
|
||||
{
|
||||
if (i >= renderPlan.NewKeys.Count || !string.Equals(_lastRenderedTimelineKeys[i], renderPlan.NewKeys[i], StringComparison.Ordinal))
|
||||
{
|
||||
prefixMatch = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!prefixMatch)
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
for (var removeIndex = 0; removeIndex < renderPlan.PreviousLiveCount && GetTranscriptElementCount() > 0; removeIndex++)
|
||||
RemoveTranscriptElementAt(GetTranscriptElementCount() - 1);
|
||||
|
||||
for (var i = renderPlan.PreviousStableCount; i < renderPlan.VisibleTimeline.Count; i++)
|
||||
renderPlan.VisibleTimeline[i].Render();
|
||||
|
||||
_lastRenderedTimelineKeys = renderPlan.NewKeys;
|
||||
_lastRenderedHiddenCount = renderPlan.HiddenCount;
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Services.LogService.Warn($"증분 transcript 렌더 실패, 전체 렌더로 전환: {ex.Message}");
|
||||
_lastRenderedTimelineKeys.Clear();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyFullTranscriptRender(TranscriptRenderPlan renderPlan)
|
||||
{
|
||||
ClearTranscriptElements();
|
||||
_runBannerAnchors.Clear();
|
||||
|
||||
if (renderPlan.HiddenCount > 0)
|
||||
AddTranscriptElement(CreateTimelineLoadMoreCard(renderPlan.HiddenCount));
|
||||
|
||||
foreach (var item in renderPlan.VisibleTimeline)
|
||||
item.Render();
|
||||
|
||||
if (_agentLiveContainer != null && !ContainsTranscriptElement(_agentLiveContainer))
|
||||
AddTranscriptElement(_agentLiveContainer);
|
||||
|
||||
_lastRenderedTimelineKeys = renderPlan.NewKeys;
|
||||
_lastRenderedHiddenCount = renderPlan.HiddenCount;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user