AX Agent 메모리 적용 상태 요약 UI 추가
Some checks failed
Release Gate / gate (push) Has been cancelled

- AX Agent 설정의 에이전트 메모리 섹션에 현재 적용 중인 메모리 계층 요약 row 추가
- 계층형 규칙 수와 학습 메모리 수를 한눈에 보여주고 활성 규칙의 우선순위, 설명, 태그를 바로 읽을 수 있도록 정리
- 새로고침 버튼을 추가해 현재 작업 폴더 기준 메모리 적용 상태를 즉시 다시 계산 가능하게 구현
- 메모리 파일 저장과 학습 메모리 초기화 이후 요약이 자동으로 다시 반영되도록 연결
- README 및 DEVELOPMENT 문서에 2026-04-07 01:00 (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:
2026-04-07 00:39:26 +09:00
parent 0bfec6fb78
commit aef5f51c89
4 changed files with 84 additions and 5 deletions

View File

@@ -1414,3 +1414,6 @@ MIT License
- 업데이트: 2026-04-07 00:52 (KST)
- 계층형 메모리 frontmatter를 더 확장해 `enabled:``tags:`를 지원하도록 했습니다. 이제 실험용 규칙을 파일에 남겨둔 채 비활성화할 수 있고, 규칙 묶음을 태그 단위로 구분해 관리할 수 있습니다.
- [AgentMemoryService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/AgentMemoryService.cs)는 `enabled: false`인 규칙 파일을 메모리 계층에서 제외하고, [MemoryTool.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/MemoryTool.cs)의 `list/search` 결과에는 `tags` 메타를 함께 보여줘 어떤 규칙군인지 더 빠르게 읽을 수 있게 했습니다.
- 업데이트: 2026-04-07 01:00 (KST)
- AX Agent 설정의 에이전트 메모리 섹션에 `적용 중 메모리 계층` 요약을 추가했습니다. 현재 컨텍스트에 반영된 계층형 규칙 수와 학습 메모리 수를 한 줄로 보고, 아래에서 활성 규칙 파일의 우선순위·설명·태그를 바로 확인할 수 있습니다.
- 메모리 파일을 편집하거나 학습 메모리를 초기화하면 이 요약이 즉시 다시 계산되도록 연결했고, `새로고침` 버튼도 추가해 현재 작업 폴더 기준 메모리 적용 상태를 바로 다시 확인할 수 있게 했습니다.

View File

@@ -5217,3 +5217,12 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 사용자는 이제 `/memory` 결과에서 규칙의 설명, 적용 경로, 우선순위뿐 아니라 태그 묶음까지 같이 확인할 수 있다.
- [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs)
- 메모리 편집 다이얼로그의 frontmatter 예시를 `description / enabled / tags / paths` 기준으로 갱신해, 설정 UI에서도 현재 지원 메타 전체를 바로 참고할 수 있게 했다.
## 2026-04-07 01:00 (KST)
- [SettingsWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml)
- 에이전트 메모리 섹션에 `적용 중 메모리 계층` row를 추가했다.
- 현재 컨텍스트에 반영된 계층형 규칙 수, 학습 메모리 수, 활성 규칙 파일 요약을 보여주고 `새로고침` 버튼으로 즉시 재계산할 수 있게 했다.
- [SettingsWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/SettingsWindow.xaml.cs)
- `RefreshMemoryOverview()`를 추가해 현재 작업 폴더 기준 메모리 계층 적용 상태를 계산해 UI에 표시하도록 했다.
- 설정 창 로드 시, 메모리 파일 저장 후, 학습 메모리 초기화 후 모두 이 요약을 자동으로 갱신해 설정 UI와 실제 적용 상태가 어긋나지 않도록 정리했다.

View File

@@ -4890,11 +4890,11 @@
</StackPanel>
</Grid>
</Border>
<Border Style="{StaticResource AgentSettingsRow}">
<Grid>
<StackPanel HorizontalAlignment="Left">
<TextBlock Style="{StaticResource RowLabel}" Text="메모리 관리"/>
<TextBlock Style="{StaticResource RowHint}" Text="계층형 메모리 파일을 직접 열어 수정하거나, 학습 메모리를 초기화합니다."/>
<Border Style="{StaticResource AgentSettingsRow}">
<Grid>
<StackPanel HorizontalAlignment="Left">
<TextBlock Style="{StaticResource RowLabel}" Text="메모리 관리"/>
<TextBlock Style="{StaticResource RowHint}" Text="계층형 메모리 파일을 직접 열어 수정하거나, 학습 메모리를 초기화합니다."/>
<WrapPanel Margin="0,10,0,0">
<Button Style="{StaticResource MemoryScopeButton}" Content="관리형 편집" Click="BtnEditManagedMemory_Click"/>
<Button Style="{StaticResource MemoryScopeButton}" Content="사용자 편집" Click="BtnEditUserMemory_Click"/>
@@ -4918,6 +4918,24 @@
</StackPanel>
</Grid>
</Border>
<Border Style="{StaticResource AgentSettingsRow}">
<Grid>
<StackPanel HorizontalAlignment="Left" Margin="0,0,60,0">
<TextBlock Style="{StaticResource RowLabel}" Text="적용 중 메모리 계층"/>
<TextBlock x:Name="TxtMemoryOverviewSummary"
Style="{StaticResource RowHint}"
Text="현재 메모리 적용 상태를 불러오는 중입니다."/>
<TextBlock x:Name="TxtMemoryOverviewScopes"
Margin="0,8,0,0"
FontSize="12"
Foreground="{DynamicResource SecondaryText}"
TextWrapping="Wrap"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Style="{StaticResource MemoryScopeButton}" Content="새로고침" Click="BtnRefreshMemoryOverview_Click"/>
</StackPanel>
</Grid>
</Border>
<Border Style="{StaticResource AgentSettingsRow}">
<Grid>
<StackPanel HorizontalAlignment="Left" Margin="0,0,60,0">

View File

@@ -70,6 +70,7 @@ public partial class SettingsWindow : Window
Loaded += async (_, _) =>
{
BindIndexProgress();
RefreshMemoryOverview();
RefreshHotkeyBadges();
SetVersionText();
EnsureHotkeyInCombo();
@@ -2979,9 +2980,12 @@ public partial class SettingsWindow : Window
var app = System.Windows.Application.Current as App;
app?.MemoryService?.Clear();
RefreshMemoryOverview();
CustomMessageBox.Show("에이전트 메모리가 초기화되었습니다.", "완료", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void BtnRefreshMemoryOverview_Click(object sender, RoutedEventArgs e) => RefreshMemoryOverview();
private void BtnEditManagedMemory_Click(object sender, RoutedEventArgs e) => OpenMemoryScopeEditor("managed", "관리형 메모리");
private void BtnEditUserMemory_Click(object sender, RoutedEventArgs e) => OpenMemoryScopeEditor("user", "사용자 메모리");
private void BtnEditProjectMemory_Click(object sender, RoutedEventArgs e) => OpenMemoryScopeEditor("project", "프로젝트 메모리");
@@ -3172,6 +3176,7 @@ public partial class SettingsWindow : Window
}
memory.Load(workFolder);
RefreshMemoryOverview();
CustomMessageBox.Show("메모리 파일이 저장되었습니다.", "메모리 편집", MessageBoxButton.OK, MessageBoxImage.Information);
dlg.Close();
}
@@ -3190,6 +3195,50 @@ public partial class SettingsWindow : Window
dlg.ShowDialog();
}
private void RefreshMemoryOverview()
{
if (TxtMemoryOverviewSummary == null || TxtMemoryOverviewScopes == null)
return;
var app = System.Windows.Application.Current as App;
var memory = app?.MemoryService;
if (memory == null)
{
TxtMemoryOverviewSummary.Text = "메모리 서비스를 사용할 수 없습니다.";
TxtMemoryOverviewScopes.Text = "";
return;
}
var workFolder = _vm.Service.Settings.Llm.WorkFolder;
memory.Load(workFolder);
var docs = memory.InstructionDocuments;
var learnedCount = memory.All.Count;
TxtMemoryOverviewSummary.Text = $"계층형 규칙 {docs.Count}개, 학습 메모리 {learnedCount}개가 현재 컨텍스트에 반영됩니다.";
if (docs.Count == 0)
{
TxtMemoryOverviewScopes.Text = "현재 활성화된 계층형 메모리 파일이 없습니다.";
return;
}
var lines = docs
.Take(6)
.Select(doc =>
{
var priority = doc.Priority > 0 ? $"우선순위 {doc.Priority}" : "우선순위 미정";
var description = string.IsNullOrWhiteSpace(doc.Description) ? "" : $" · {doc.Description}";
var tags = doc.Tags.Count > 0 ? $" · tags: {string.Join(", ", doc.Tags)}" : "";
return $"[{doc.Label}] {priority}{description}{tags}";
})
.ToList();
if (docs.Count > lines.Count)
lines.Add($"외 {docs.Count - lines.Count}개 규칙");
TxtMemoryOverviewScopes.Text = string.Join("\n", lines);
}
// ─── 에이전트 훅 관리 ─────────────────────────────────────────────────
private void AddHookBtn_Click(object sender, MouseButtonEventArgs e)