- 코워크·코드 프롬프트, 도구 선택, 문서 생성/검증 흐름을 claude-code 동등 품질 기준으로 재정렬함 - OpenAI/vLLM 경로의 오래된 tool history를 평탄화하고 최근 이력만 구조화해 컨텍스트 직렬화를 경량화함 - AX Agent UI를 테마 기준으로 재구성하고 플랜 승인/오버레이/이벤트 렌더링/명령 입력 상호작용을 개선함 - 파일 후보 제안, 반복 경로 정체 복구, LSP 보강, 문서·PPT 처리 개선, 설정/서비스 인터페이스 정리를 함께 반영함 - README.md 및 docs/DEVELOPMENT.md를 작업 시점별로 갱신함 - 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0, 오류 0)
55 lines
2.1 KiB
C#
55 lines
2.1 KiB
C#
using System.Linq;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public partial class ChatWindow
|
|
{
|
|
/// <summary>최대 캐시 보유 수. 화면 표시 항목 + 여유분.</summary>
|
|
private const int TranscriptCacheRetentionCount = 120;
|
|
|
|
private void PruneTranscriptElementCache(IReadOnlyCollection<string> visibleKeys)
|
|
{
|
|
// 캐시가 보유 한도의 1.5배 이상일 때만 정리 (빈번한 정리 방지)
|
|
if (_elementCache.Count <= TranscriptCacheRetentionCount * 3 / 2)
|
|
return;
|
|
|
|
var keep = new HashSet<string>(visibleKeys, StringComparer.Ordinal);
|
|
// 최근 렌더링된 키 중 보유 한도만큼만 유지
|
|
var retainFromRendered = Math.Min(TranscriptCacheRetentionCount, _lastRenderedTimelineKeys.Count);
|
|
foreach (var key in _lastRenderedTimelineKeys.TakeLast(retainFromRendered))
|
|
keep.Add(key);
|
|
|
|
var removable = _elementCache.Keys
|
|
.Where(key => !keep.Contains(key))
|
|
.ToList();
|
|
|
|
foreach (var key in removable)
|
|
_elementCache.Remove(key);
|
|
|
|
// _transcriptElementMap도 동기 정리 — 더 이상 transcript에 없는 element 참조 제거
|
|
PruneTranscriptElementMap();
|
|
}
|
|
|
|
/// <summary>
|
|
/// _transcriptElementMap에서 현재 _transcriptElements에 없는 항목을 제거합니다.
|
|
/// ObservableCollection 변경 시 자동으로 정리되지 않는 stale 참조를 회수합니다.
|
|
/// </summary>
|
|
private void PruneTranscriptElementMap()
|
|
{
|
|
if (_transcriptElementMap.Count <= _transcriptElements.Count * 2)
|
|
return; // 맵이 실제 요소의 2배 미만이면 정리 불필요
|
|
|
|
var activeElements = new HashSet<System.Windows.UIElement>(
|
|
_transcriptElements
|
|
.Where(item => item.IsMaterialized && item.Element != null)
|
|
.Select(item => item.Element!));
|
|
|
|
var staleKeys = _transcriptElementMap.Keys
|
|
.Where(key => !activeElements.Contains(key))
|
|
.ToList();
|
|
|
|
foreach (var key in staleKeys)
|
|
_transcriptElementMap.Remove(key);
|
|
}
|
|
}
|