AX Agent 오류 수정: - AgentSettingsPanel.xaml에 <UserControl.Resources> 추가 - ToggleSwitch 스타일 자체 정의 (SettingsWindow 리소스 미접근 문제 해결) - 원인: XamlParseException — 'ToggleSwitch' 리소스 찾을 수 없음 (CS 로그 확인) PerformanceMonitorService.cs (신규, 138줄): - GetSystemTimes P/Invoke → CPU% (이전/현재 샘플 델타 계산) - GlobalMemoryStatusEx P/Invoke → RAM% + "6.1/16GB" 형식 텍스트 - DriveInfo → C: 드라이브 사용률/용량 텍스트 - 2초 폴링, StartPolling/StopPolling 제어 PomodoroService.cs (신규, 179줄): - 집중(25분)/휴식(5분) 타이머, 상태: Idle/Focus/Break - pomodoro.json 영속성 (경과 시간 자동 보정) - StateChanged 이벤트 → 위젯 실시간 갱신 ServerStatusService.cs (신규, 124줄): - Ollama(/api/version), LLM API, 첫 번째 MCP 서버 15초 주기 핑 - HttpClient 1.5초 타임아웃, StatusChanged 이벤트 PomoHandler.cs (신규, 130줄): - pomo prefix: 상태보기/start/break/stop/reset - PomodoroService 직접 연동 LauncherViewModel.Widgets.cs (신규, 81줄): - Widget_PerfText, Widget_PomoText, Widget_PomoRunning - Widget_NoteText, Widget_OllamaOnline, Widget_LlmOnline, Widget_McpOnline - UpdateWidgets() — 5틱마다 메모 건수 갱신 (파일 I/O 최소화) LauncherWindow.Widgets.cs (신규, 143줄): - IsVisibleChanged 이벤트로 위젯 자동 시작/중지 - DispatcherTimer 1초마다 UpdateWidgets + 서버 상태 dot 색상 직접 갱신 - 위젯 클릭 → 해당 prefix 자동 입력 (perf→info, pomo→pomo, note→note, server→port) LauncherWindow.xaml: - RowDefinition 6개 → 7개 - Row 6: 위젯 바 (시스템모니터/뽀모도로/메모/서버 4열) 빌드: 경고 0, 오류 0
82 lines
3.7 KiB
C#
82 lines
3.7 KiB
C#
using AxCopilot.Handlers;
|
|
using AxCopilot.Services;
|
|
|
|
namespace AxCopilot.ViewModels;
|
|
|
|
/// <summary>
|
|
/// Phase L3-9: 런처 하단 미니 위젯 데이터 바인딩 프로퍼티.
|
|
/// LauncherWindow.Widgets.cs의 타이머에서 UpdateWidgets()를 호출합니다.
|
|
/// </summary>
|
|
public partial class LauncherViewModel
|
|
{
|
|
// ─── 시스템 모니터 ────────────────────────────────────────────────────────
|
|
|
|
/// <summary>위젯 텍스트 예: "CPU 34% RAM 62% C:42%"</summary>
|
|
public string Widget_PerfText
|
|
{
|
|
get
|
|
{
|
|
var p = PerformanceMonitorService.Instance;
|
|
return $"CPU {p.CpuPercent:F0}% RAM {p.RamPercent:F0}% {p.DiskCText}";
|
|
}
|
|
}
|
|
|
|
// ─── 뽀모도로 ─────────────────────────────────────────────────────────────
|
|
|
|
/// <summary>위젯 텍스트 예: "집중 18:42" / "휴식 04:58" / "대기 25:00"</summary>
|
|
public string Widget_PomoText
|
|
{
|
|
get
|
|
{
|
|
var p = PomodoroService.Instance;
|
|
var rem = p.Remaining;
|
|
var timeStr = $"{(int)rem.TotalMinutes:D2}:{rem.Seconds:D2}";
|
|
return p.Mode switch
|
|
{
|
|
PomodoroMode.Focus => $"집중 {timeStr}",
|
|
PomodoroMode.Break => $"휴식 {timeStr}",
|
|
_ => $"대기 {timeStr}",
|
|
};
|
|
}
|
|
}
|
|
|
|
/// <summary>뽀모도로 실행 중이면 true → 위젯 색상 강조에 사용</summary>
|
|
public bool Widget_PomoRunning => PomodoroService.Instance.IsRunning;
|
|
|
|
// ─── 빠른 메모 ────────────────────────────────────────────────────────────
|
|
|
|
private int _noteCount;
|
|
|
|
/// <summary>위젯 텍스트 예: "메모 3건" / "메모 없음"</summary>
|
|
public string Widget_NoteText => _noteCount > 0 ? $"메모 {_noteCount}건" : "메모 없음";
|
|
|
|
// ─── 서버 상태 ────────────────────────────────────────────────────────────
|
|
|
|
public bool Widget_OllamaOnline => ServerStatusService.Instance.OllamaOnline;
|
|
public bool Widget_LlmOnline => ServerStatusService.Instance.LlmOnline;
|
|
public bool Widget_McpOnline => ServerStatusService.Instance.McpOnline;
|
|
public string Widget_McpName => ServerStatusService.Instance.McpName;
|
|
|
|
// ─── 갱신 메서드 ──────────────────────────────────────────────────────────
|
|
|
|
/// <summary>1초마다 LauncherWindow.Widgets.cs에서 호출 — UI 바인딩 갱신.</summary>
|
|
public void UpdateWidgets()
|
|
{
|
|
// 메모 건수 갱신 (파일 I/O 최소화: 5회마다 1회만)
|
|
_widgetRefreshTick++;
|
|
if (_widgetRefreshTick % 5 == 0)
|
|
_noteCount = NoteHandler.GetNoteCount();
|
|
|
|
OnPropertyChanged(nameof(Widget_PerfText));
|
|
OnPropertyChanged(nameof(Widget_PomoText));
|
|
OnPropertyChanged(nameof(Widget_PomoRunning));
|
|
OnPropertyChanged(nameof(Widget_NoteText));
|
|
OnPropertyChanged(nameof(Widget_OllamaOnline));
|
|
OnPropertyChanged(nameof(Widget_LlmOnline));
|
|
OnPropertyChanged(nameof(Widget_McpOnline));
|
|
OnPropertyChanged(nameof(Widget_McpName));
|
|
}
|
|
|
|
private int _widgetRefreshTick;
|
|
}
|