코워크·코드 하단 메모리 표기 제거 및 footer 정리\n\n- Cowork/Code 하단 작업 바의 메모리 상태 칩을 항상 숨기도록 조정\n- 메모리 상태 버튼 비노출 시 tooltip과 팝업 진입도 함께 차단\n- README와 DEVELOPMENT 문서에 2026-04-07 03:03 (KST) 기준 변경 이력 반영\n- dotnet build 검증 완료 (경고 0, 오류 0)
Some checks failed
Release Gate / gate (push) Has been cancelled

This commit is contained in:
2026-04-07 09:02:18 +09:00
parent fbaaf19391
commit 6ca067c4a6
3 changed files with 32 additions and 72 deletions

View File

@@ -1455,3 +1455,6 @@ MIT License
- 업데이트: 2026-04-07 02:56 (KST) - 업데이트: 2026-04-07 02:56 (KST)
- AX Agent 내부 설정 개발자 탭의 `워크플로우 시각화`가 숨은 개발자 모드 의존 때문에 실제로 창을 띄우지 않던 문제를 수정했습니다. 이제 토글을 켜면 즉시 워크플로우 분석기 창이 열리고, 끄면 창이 숨겨집니다. - AX Agent 내부 설정 개발자 탭의 `워크플로우 시각화`가 숨은 개발자 모드 의존 때문에 실제로 창을 띄우지 않던 문제를 수정했습니다. 이제 토글을 켜면 즉시 워크플로우 분석기 창이 열리고, 끄면 창이 숨겨집니다.
- 일반 설정에만 남아 있던 `문서 미리보기 자동 표시` 옵션을 AX Agent 내부 설정 공통 탭에도 복원해, Cowork/Code에서 프리뷰 자동 열기 정책을 내부 설정에서 바로 바꿀 수 있게 했습니다. - 일반 설정에만 남아 있던 `문서 미리보기 자동 표시` 옵션을 AX Agent 내부 설정 공통 탭에도 복원해, Cowork/Code에서 프리뷰 자동 열기 정책을 내부 설정에서 바로 바꿀 수 있게 했습니다.
- 업데이트: 2026-04-07 03:03 (KST)
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 숨겼습니다. 이제 footer에는 폴더, 권한, Git 같은 작업 상태만 남고 메모리 관련 표기는 노출되지 않습니다.
- 메모리 상태 버튼이 비노출일 때는 관련 팝업도 열리지 않도록 정리해, 상태 갱신이나 탭 전환 중 다시 나타나는 일이 없게 했습니다.

View File

@@ -5311,3 +5311,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 내부 설정 공통 탭의 자동 프리뷰 콤보 값을 `Llm.AutoPreview`와 동기화하고, 변경 시 바로 저장되도록 `CmbOverlayAutoPreview_SelectionChanged`를 추가했다. - 내부 설정 공통 탭의 자동 프리뷰 콤보 값을 `Llm.AutoPreview`와 동기화하고, 변경 시 바로 저장되도록 `CmbOverlayAutoPreview_SelectionChanged`를 추가했다.
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml)
- AX Agent 내부 설정 공통 탭에 `문서 미리보기` 콤보를 추가해 `자동 표시 / 수동 / 비활성화`를 내부 설정에서 직접 제어할 수 있게 했다. - AX Agent 내부 설정 공통 탭에 `문서 미리보기` 콤보를 추가해 `자동 표시 / 수동 / 비활성화`를 내부 설정에서 직접 제어할 수 있게 했다.
## 2026-04-07 03:03 (KST)
- [ChatWindow.FooterPresentation.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.FooterPresentation.cs)
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 항상 숨기도록 조정했다.
- 메모리 상태 버튼이 비노출일 때는 상태 문자열과 tooltip을 초기화하고, 클릭으로 상세 팝업이 열리지 않게 막아 footer에서 메모리 표기가 다시 노출되지 않도록 정리했다.

View File

@@ -25,7 +25,7 @@ public partial class ChatWindow
? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다." ? "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 필요하면 작업 폴더 파일도 함께 참고합니다."
: "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.", : "문서 작성, 데이터 분석, 파일 작업을 요청하세요. 작업 폴더를 선택하면 관련 파일도 함께 참고합니다.",
"Code" => hasFolder "Code" => hasFolder
? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드를 참고하고, 상단 저장소 배너로 브랜치와 변경 상태 함께 니다." ? "코드 수정, 원인 분석, 빌드·테스트를 요청하세요. 작업 폴더 코드를 참고하고 저장소 상태 함께 보여줍니다."
: "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.", : "작업 폴더를 선택한 뒤 코드 수정, 원인 분석, 빌드·테스트를 요청하세요.",
_ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.", _ => "질문, 요약, 초안 작성, 아이디어 정리를 요청하세요.",
}; };
@@ -47,9 +47,9 @@ public partial class ChatWindow
return preset.Description.Trim(); return preset.Description.Trim();
if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase)) if (string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase))
return "선택 작업 유형에 맞 문서·데이터·파일 작업 흐름으로 이어집니다."; return "선택 작업 유형에 맞 문서·데이터·파일 작업 흐름으로 이어집니다.";
return "선택 대화 주제에 맞 응답 방향과 초안 흐름으로 이어집니다."; return "선택 대화 주제에 맞 응답 방향과 초안 흐름이 정리됩니다.";
} }
private void UpdateFolderBar() private void UpdateFolderBar()
@@ -85,7 +85,13 @@ public partial class ChatWindow
UpdateMemoryStatusUi(); UpdateMemoryStatusUi();
RefreshContextUsageVisual(); RefreshContextUsageVisual();
ScheduleGitBranchRefresh(); ScheduleGitBranchRefresh();
UpdateGitBranchUi(_currentGitBranchName, GitBranchFilesText?.Text ?? "", GitBranchAddedText?.Text ?? "", GitBranchDeletedText?.Text ?? "", _currentGitTooltip ?? "", BtnGitBranch?.Visibility ?? Visibility.Collapsed); UpdateGitBranchUi(
_currentGitBranchName,
GitBranchFilesText?.Text ?? "",
GitBranchAddedText?.Text ?? "",
GitBranchDeletedText?.Text ?? "",
_currentGitTooltip ?? "",
BtnGitBranch?.Visibility ?? Visibility.Collapsed);
} }
private void UpdateDataUsageUI() private void UpdateDataUsageUI()
@@ -98,54 +104,10 @@ public partial class ChatWindow
if (BtnMemoryStatus == null || MemoryStatusLabel == null) if (BtnMemoryStatus == null || MemoryStatusLabel == null)
return; return;
if (_activeTab == "Chat")
{
BtnMemoryStatus.Visibility = Visibility.Collapsed; BtnMemoryStatus.Visibility = Visibility.Collapsed;
MemoryStatusSeparator.Visibility = Visibility.Collapsed; MemoryStatusSeparator.Visibility = Visibility.Collapsed;
return; MemoryStatusLabel.Text = "메모리 없음";
} BtnMemoryStatus.ToolTip = null;
var app = System.Windows.Application.Current as App;
var memory = app?.MemoryService;
if (memory == null || !_settings.Settings.Llm.EnableAgentMemory)
{
MemoryStatusLabel.Text = "메모리 꺼짐";
BtnMemoryStatus.ToolTip = "에이전트 메모리가 비활성화되어 있습니다.";
BtnMemoryStatus.Visibility = Visibility.Visible;
MemoryStatusSeparator.Visibility = Visibility.Visible;
return;
}
var workFolder = GetCurrentWorkFolder();
memory.Load(workFolder);
var docs = memory.InstructionDocuments;
var learned = memory.All.Count;
MemoryStatusLabel.Text = docs.Count > 0 || learned > 0
? $"메모리 {docs.Count} · 학습 {learned}"
: "메모리 없음";
var lines = docs
.Take(4)
.Select(doc =>
{
var priority = doc.Priority > 0 ? $"우선순위 {doc.Priority}" : "우선순위 미정";
var description = string.IsNullOrWhiteSpace(doc.Description) ? "" : $" · {doc.Description}";
return $"[{doc.Label}] {priority}{description}";
})
.ToList();
if (docs.Count > lines.Count)
lines.Add($"외 {docs.Count - lines.Count}개 규칙");
var includePolicy = _settings.Settings.Llm.AllowExternalMemoryIncludes
? "외부 include 허용"
: "외부 include 차단";
BtnMemoryStatus.ToolTip = lines.Count == 0
? $"계층형 규칙이 없습니다.\n학습 메모리 {learned}개\n{includePolicy}"
: $"계층형 규칙 {docs.Count}개 · 학습 메모리 {learned}개\n{string.Join("\n", lines)}\n{includePolicy}";
BtnMemoryStatus.Visibility = Visibility.Visible;
MemoryStatusSeparator.Visibility = Visibility.Visible;
} }
private void BtnMemoryStatus_Click(object sender, RoutedEventArgs e) private void BtnMemoryStatus_Click(object sender, RoutedEventArgs e)
@@ -153,6 +115,9 @@ public partial class ChatWindow
if (BtnMemoryStatus == null) if (BtnMemoryStatus == null)
return; return;
if (BtnMemoryStatus.Visibility != Visibility.Visible)
return;
_memoryStatusPopup?.SetCurrentValue(Popup.IsOpenProperty, false); _memoryStatusPopup?.SetCurrentValue(Popup.IsOpenProperty, false);
var app = System.Windows.Application.Current as App; var app = System.Windows.Application.Current as App;
@@ -164,9 +129,7 @@ public partial class ChatWindow
memory.Load(workFolder); memory.Load(workFolder);
var docs = memory.InstructionDocuments; var docs = memory.InstructionDocuments;
var learned = memory.All.Count; var learned = memory.All.Count;
var includePolicy = _settings.Settings.Llm.AllowExternalMemoryIncludes var includePolicy = _settings.Settings.Llm.AllowExternalMemoryIncludes ? "외부 include 허용" : "외부 include 차단";
? "외부 include 허용"
: "외부 include 차단";
var auditEnabled = _settings.Settings.Llm.EnableAuditLog; var auditEnabled = _settings.Settings.Llm.EnableAuditLog;
var recentIncludeEntries = AuditLogService.LoadRecent("MemoryInclude", maxCount: 5, daysBack: 3); var recentIncludeEntries = AuditLogService.LoadRecent("MemoryInclude", maxCount: 5, daysBack: 3);
@@ -236,7 +199,7 @@ public partial class ChatWindow
{ {
panel.Children.Add(new TextBlock panel.Children.Add(new TextBlock
{ {
Text = "감사 로그가 꺼져 있어 include 이력 기록지 않습니다.", Text = "감사 로그가 꺼져 있어 include 이력 기록지 않습니다.",
FontSize = 11, FontSize = 11,
Foreground = secondaryText, Foreground = secondaryText,
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
@@ -247,7 +210,7 @@ public partial class ChatWindow
{ {
panel.Children.Add(new TextBlock panel.Children.Add(new TextBlock
{ {
Text = "최근 3일 include 감사 기록이 없습니다.", Text = "최근 3일 include 감사 기록이 없습니다.",
FontSize = 11, FontSize = 11,
Foreground = secondaryText, Foreground = secondaryText,
Margin = new Thickness(8, 0, 8, 6), Margin = new Thickness(8, 0, 8, 6),
@@ -282,9 +245,7 @@ public partial class ChatWindow
return path; return path;
var directory = Path.GetDirectoryName(path); var directory = Path.GetDirectoryName(path);
return string.IsNullOrWhiteSpace(directory) return string.IsNullOrWhiteSpace(directory) ? fileName : $"{fileName} · {directory}";
? fileName
: $"{fileName} · {directory}";
} }
catch catch
{ {
@@ -330,12 +291,7 @@ public partial class ChatWindow
}); });
} }
return new Border return new Border { Background = Brushes.Transparent, CornerRadius = new CornerRadius(8), Child = stack };
{
Background = Brushes.Transparent,
CornerRadius = new CornerRadius(8),
Child = stack,
};
} }
private Border BuildMemoryPopupAuditRow(AuditEntry entry, Brush primaryText, Brush secondaryText, Brush okBrush, Brush warnBrush, Brush dangerBrush) private Border BuildMemoryPopupAuditRow(AuditEntry entry, Brush primaryText, Brush secondaryText, Brush okBrush, Brush warnBrush, Brush dangerBrush)
@@ -369,12 +325,7 @@ public partial class ChatWindow
Margin = new Thickness(0, 2, 0, 0), Margin = new Thickness(0, 2, 0, 0),
}); });
return new Border return new Border { Background = Brushes.Transparent, CornerRadius = new CornerRadius(8), Child = stack };
{
Background = Brushes.Transparent,
CornerRadius = new CornerRadius(8),
Child = stack,
};
} }
private string? BuildMemoryContextEvidenceText() private string? BuildMemoryContextEvidenceText()