모델 프로파일 기반 Cowork/Code 루프와 진행 UX 고도화 반영

- 등록 모델 실행 프로파일을 검증 게이트, 문서 fallback, post-tool verification까지 확장 적용

- Cowork/Code 진행 카드에 계획/도구/검증/압축/폴백/재시도 단계 메타를 추가해 대기 상태 가시성 강화

- OpenAI/vLLM tool 요청에 병렬 도구 호출 힌트를 추가하고 회귀 프롬프트 문서를 프로파일 기준으로 전면 정리

- 검증: 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-08 13:41:57 +09:00
parent b391dfdfb3
commit a2c952879d
552 changed files with 8094 additions and 13595 deletions

View File

@@ -13,14 +13,18 @@ public partial class LauncherWindow
internal void StartWidgetUpdates()
{
PerformanceMonitorService.Instance.StartPolling();
SyncWidgetPollingState();
PomodoroService.Instance.StateChanged -= OnPomoStateChanged;
PomodoroService.Instance.StateChanged += OnPomoStateChanged;
_vm.UpdateWidgets();
UpdateWidgetVisibility();
UpdateBatteryWidget();
_ = RefreshWeatherAsync();
RefreshVisibleWidgets(forceWeatherRefresh: true);
if (!ShouldRunWidgetTimer())
{
_widgetTimer?.Stop();
return;
}
if (_widgetTimer == null)
{
@@ -30,11 +34,19 @@ public partial class LauncherWindow
};
_widgetTimer.Tick += (_, _) =>
{
_vm.UpdateWidgets();
UpdateWidgetVisibility();
if (_vm.Widget_PerfText.Length > 0 && _widgetBatteryTick++ % 30 == 0)
if (!ShouldRunWidgetTimer())
{
_widgetTimer?.Stop();
SyncWidgetPollingState();
UpdateWidgetVisibility();
return;
}
SyncWidgetPollingState();
RefreshVisibleWidgets(forceWeatherRefresh: false);
if (ShouldShowBatteryWidget() && _widgetBatteryTick++ % 30 == 0)
UpdateBatteryWidget();
if (_widgetWeatherTick++ % 120 == 0)
if (ShouldShowWeatherWidget() && _widgetWeatherTick++ % 120 == 0)
_ = RefreshWeatherAsync();
};
}
@@ -54,12 +66,64 @@ public partial class LauncherWindow
{
Dispatcher.InvokeAsync(() =>
{
_vm.UpdateWidgets();
RefreshVisibleWidgets(forceWeatherRefresh: false);
UpdatePomoWidgetStyle();
UpdateWidgetVisibility();
});
}
private void RefreshVisibleWidgets(bool forceWeatherRefresh)
{
var launcher = CurrentApp?.SettingsService?.Settings?.Launcher;
if (launcher == null)
return;
_vm.UpdateWidgets(
includePerf: launcher.ShowWidgetPerf,
includePomo: launcher.ShowWidgetPomo,
includeNote: launcher.ShowWidgetNote,
includeCalendar: launcher.ShowWidgetCalendar,
includeServerStatus: false);
UpdateWidgetVisibility();
if (ShouldShowBatteryWidget())
UpdateBatteryWidget();
if (forceWeatherRefresh && ShouldShowWeatherWidget())
_ = RefreshWeatherAsync();
}
private void SyncWidgetPollingState()
{
if (ShouldShowPerfWidget())
PerformanceMonitorService.Instance.StartPolling();
else
PerformanceMonitorService.Instance.StopPolling();
}
private bool ShouldRunWidgetTimer()
{
var launcher = CurrentApp?.SettingsService?.Settings?.Launcher;
if (launcher == null)
return false;
return launcher.ShowWidgetPerf
|| launcher.ShowWidgetPomo
|| launcher.ShowWidgetNote
|| launcher.ShowWidgetWeather
|| launcher.ShowWidgetCalendar
|| launcher.ShowWidgetBattery;
}
private bool ShouldShowPerfWidget()
=> CurrentApp?.SettingsService?.Settings?.Launcher?.ShowWidgetPerf ?? false;
private bool ShouldShowWeatherWidget()
=> CurrentApp?.SettingsService?.Settings?.Launcher?.ShowWidgetWeather ?? false;
private bool ShouldShowBatteryWidget()
=> (CurrentApp?.SettingsService?.Settings?.Launcher?.ShowWidgetBattery ?? false) && _vm.Widget_BatteryVisible;
private void UpdatePomoWidgetStyle()
{
if (WgtPomo == null)
@@ -100,6 +164,10 @@ public partial class LauncherWindow
if (WidgetBar != null)
WidgetBar.Visibility = hasAny ? Visibility.Visible : Visibility.Collapsed;
SyncWidgetPollingState();
if (!hasAny)
_widgetTimer?.Stop();
}
private void WgtPerf_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)