AX Agent 레거시 plan 도구와 상태 배지 노출을 추가 정리
Some checks failed
Release Gate / gate (push) Has been cancelled

- code 탭에서 enter_plan_mode/exit_plan_mode 도구를 항상 비활성화해 레거시 설정값이 런타임을 흔들지 않도록 정리

- queue/재시도 대기만 남은 상태에서는 RuntimeActivityBadge와 상단 strip이 기본 노출되지 않게 조정

- idle Cowork/Code 헤더 소음을 줄이도록 ChatWindow 상태 표시 조건을 추가 보정

- README와 DEVELOPMENT 문서에 2026-04-05 20:48 (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-05 17:55:01 +09:00
parent 51a398d269
commit 6b645ccbb7
5 changed files with 22 additions and 25 deletions

View File

@@ -942,6 +942,15 @@ ow + toggle 시각 언어로 통일했습니다.
- 같은 파일의 컨텍스트 hover 팝업도 과한 진단성 문자열을 걷고, 현재 모델 오늘 사용량과 compact 상태만 보여주는 짧은 2줄 요약으로 유지되게 다듬었습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 20:34 (KST)
- Cowork/Code 상단 활동 배지도 더 조용하게 만들었습니다. [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 `UpdateTaskSummaryIndicators()` 는 이제 실제 진행 중 대화나 활성 작업이 있을 때만 `RuntimeActivityBadge` 를 보이게 합니다. idle 상태에서는 상단 보조 메타가 남아 있지 않습니다.
- 같은 파일의 `UpdateAgentProgressBar(...)` 에 남아 있던 미사용 debug 체크 변수도 제거해 상태 갱신 경로를 조금 더 단순화했습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 20:40 (KST)
- `claw-code` 기준으로 남아 있던 plan 도구 레거시도 더 잘랐습니다. [AgentTabSettingsResolver.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentTabSettingsResolver.cs) 는 이제 저장값과 무관하게 `enter_plan_mode`, `exit_plan_mode` 를 항상 비활성 목록에 넣습니다. plan mode 도구는 완전 레거시 호환 영역으로만 남고 실제 code 실행 경로에는 개입하지 않습니다.
- [AppStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/AppStateService.cs) 의 운영 상태 요약도 더 `claw-code`처럼 조용하게 맞췄습니다. 기본 `RuntimeActivityBadge` 와 상단 strip 은 이제 실제 실행/권한 대기/백그라운드 작업이 있을 때만 살아나며, 단순 queue/재시도 대기만으로는 기본 헤더를 흔들지 않습니다.
- 이번 정리 후 추정 parity 는 `core engine 92% / main transcript UI 97% / Cowork·Code runtime UX 97% / internal settings 92% / overall 96%` 정도로 재평가했습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 20:48 (KST)
---

View File

@@ -4710,3 +4710,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 이번 묶음 후 추정 parity는 `core engine 91% / main transcript UI 97% / Cowork·Code runtime UX 97% / internal settings 92% / overall 96%` 정도로 재평가했습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 20:34 (KST)
- `claw-code` 기준의 레거시 plan 도구 경로도 더 정리했습니다. [AgentTabSettingsResolver.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AgentTabSettingsResolver.cs) 는 이제 persisted 설정과 무관하게 `enter_plan_mode`, `exit_plan_mode` 를 항상 비활성 목록에 포함합니다. 숨겨진 설정값이 code 실행 경로에 다시 영향을 주지 않게 한 변경입니다.
- [AppStateService.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/AppStateService.cs) 의 `GetOperationalStatus(...)` 도 기본 노출을 더 줄였습니다. queue/재시도 대기만 남은 상태로는 `RuntimeActivityBadge` 와 상단 strip 을 켜지 않고, 실제 실행/권한 대기/백그라운드 작업만 기본 헤더 메타를 살리도록 맞췄습니다.
- 이번 묶음 후 추정 parity 는 `core engine 92% / main transcript UI 97% / Cowork·Code runtime UX 97% / internal settings 92% / overall 96%` 정도로 재평가했습니다.
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
- 업데이트: 2026-04-05 20:48 (KST)

View File

@@ -21,11 +21,10 @@ internal static class AgentTabSettingsResolver
public static IEnumerable<string> EnumerateCodeTabDisabledTools(CodeSettings code)
{
if (!code.EnablePlanModeTools)
{
yield return "enter_plan_mode";
yield return "exit_plan_mode";
}
// Plan mode tools are legacy compatibility only and stay disabled
// regardless of any persisted value.
yield return "enter_plan_mode";
yield return "exit_plan_mode";
if (!code.EnableWorktreeTools)
{

View File

@@ -544,9 +544,7 @@ public sealed class AppStateService
var latestDeniedPermission = GetLatestDeniedPermission();
var showRuntimeBadge = taskSummary.HasActiveTasks
|| queueSummary.QueuedCount > 0
|| queueSummary.RunningCount > 0
|| queueSummary.BlockedCount > 0
|| taskSummary.PendingPermissionCount > 0
|| backgroundSummary.ActiveCount > 0;
var runtimeLabel = taskSummary.PendingPermissionCount > 0
@@ -582,20 +580,6 @@ public sealed class AppStateService
stripKind = "failed_run";
stripText = $"최근 실패 {FormatDate(taskSummary.LatestFailedRun.UpdatedAt)}";
}
else if (queueSummary.RunningCount > 0 || queueSummary.QueuedCount > 0)
{
stripKind = "queue";
stripText = queueSummary.RunningCount > 0
? $"큐 실행 중 {queueSummary.RunningCount} · 다음 {Truncate(queueSummary.NextItem?.Text, 24)}"
: $"대기열 {queueSummary.QueuedCount} · 다음 {Truncate(queueSummary.NextItem?.Text, 24)}";
}
else if (queueSummary.BlockedCount > 0)
{
stripKind = "queue_blocked";
stripText = queueSummary.NextReadyAt.HasValue
? $"재시도 대기 {queueSummary.BlockedCount} · {FormatDate(queueSummary.NextReadyAt.Value)}"
: $"재시도 대기 {queueSummary.BlockedCount}";
}
else if (backgroundSummary.ActiveCount > 0)
{
stripKind = "background";

View File

@@ -9275,9 +9275,11 @@ public partial class ChatWindow : Window
private void UpdateTaskSummaryIndicators()
{
var status = _appState.GetOperationalStatus(_activeTab);
var hasLiveRuntimeActivity = !string.Equals(_activeTab, "Chat", StringComparison.OrdinalIgnoreCase)
&& (_runningConversationCount > 0 || _appState.ActiveTasks.Count > 0);
if (RuntimeActivityBadge != null)
RuntimeActivityBadge.Visibility = status.ShowRuntimeBadge
RuntimeActivityBadge.Visibility = status.ShowRuntimeBadge && hasLiveRuntimeActivity
? Visibility.Visible
: Visibility.Collapsed;
@@ -17913,8 +17915,6 @@ public partial class ChatWindow : Window
private void UpdateAgentProgressBar(AgentEvent evt)
{
var isDebugLogLevel = string.Equals(_settings.Settings.Llm.AgentLogLevel, "debug", StringComparison.OrdinalIgnoreCase);
switch (evt.Type)
{
case AgentEventType.Planning when evt.Steps is { Count: > 0 }: