코워크 탭 전환 시 처리 상태 오염과 자동 취소 수정\n\n- 탭 전환과 대화 재개 시 실행 중 작업을 즉시 취소하던 흐름 제거\n- 실행 소유 탭에서만 정지/일시정지 버튼과 라이브 진행 힌트가 보이도록 정리\n- README와 DEVELOPMENT 문서에 2026-04-07 03:13 (KST) 기준 변경 이력 반영\n- dotnet build 검증 완료 (경고 0, 오류 0)
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
This commit is contained in:
@@ -1458,3 +1458,6 @@ MIT License
|
|||||||
- 업데이트: 2026-04-07 03:03 (KST)
|
- 업데이트: 2026-04-07 03:03 (KST)
|
||||||
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 숨겼습니다. 이제 footer에는 폴더, 권한, Git 같은 작업 상태만 남고 메모리 관련 표기는 노출되지 않습니다.
|
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 숨겼습니다. 이제 footer에는 폴더, 권한, Git 같은 작업 상태만 남고 메모리 관련 표기는 노출되지 않습니다.
|
||||||
- 메모리 상태 버튼이 비노출일 때는 관련 팝업도 열리지 않도록 정리해, 상태 갱신이나 탭 전환 중 다시 나타나는 일이 없게 했습니다.
|
- 메모리 상태 버튼이 비노출일 때는 관련 팝업도 열리지 않도록 정리해, 상태 갱신이나 탭 전환 중 다시 나타나는 일이 없게 했습니다.
|
||||||
|
- 업데이트: 2026-04-07 03:13 (KST)
|
||||||
|
- Cowork/Code 실행 중 탭을 바꿀 때 작업을 즉시 취소하던 흐름을 제거했습니다. 이제 실행은 시작한 탭에서 계속 진행되고, 다른 탭으로 이동해도 작업이 사용자 취소처럼 끝나지 않습니다.
|
||||||
|
- 라이브 진행 힌트는 실행을 시작한 탭에서만 보이도록 조정해, Cowork 작업 중 Code 탭으로 이동했을 때 Code 쪽 transcript에 `처리 중...`이 따라 보이던 상태 오염을 막았습니다.
|
||||||
|
|||||||
@@ -5317,3 +5317,10 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
- [ChatWindow.FooterPresentation.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.FooterPresentation.cs)
|
- [ChatWindow.FooterPresentation.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.FooterPresentation.cs)
|
||||||
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 항상 숨기도록 조정했다.
|
- Cowork/Code 하단 작업 바의 메모리 상태 칩을 항상 숨기도록 조정했다.
|
||||||
- 메모리 상태 버튼이 비노출일 때는 상태 문자열과 tooltip을 초기화하고, 클릭으로 상세 팝업이 열리지 않게 막아 footer에서 메모리 표기가 다시 노출되지 않도록 정리했다.
|
- 메모리 상태 버튼이 비노출일 때는 상태 문자열과 tooltip을 초기화하고, 클릭으로 상세 팝업이 열리지 않게 막아 footer에서 메모리 표기가 다시 노출되지 않도록 정리했다.
|
||||||
|
|
||||||
|
## 2026-04-07 03:13 (KST)
|
||||||
|
|
||||||
|
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)
|
||||||
|
- Chat/Cowork/Code 탭 전환 시 실행 중 작업을 즉시 취소하던 `StopStreamingIfActive()` 호출을 제거했다. 이제 Cowork/Code 작업은 시작한 탭 기준으로 백그라운드에서 계속 진행된다.
|
||||||
|
- 실행 중 컨트롤 표시를 `RefreshStreamingControlsForActiveTab()`로 분리해, 현재 탭이 실행 소유 탭일 때만 정지/일시정지 버튼이 보이고 다른 탭에서는 일반 입력 상태처럼 보이도록 정리했다.
|
||||||
|
- 라이브 진행 힌트는 `_streamRunTab`과 현재 활성 탭이 일치할 때만 transcript에 렌더되도록 바꿔, Cowork 작업 중 Code 탭으로 이동했을 때 Code 탭에도 `처리 중...`이 따라 보이던 문제를 막았다.
|
||||||
|
|||||||
@@ -1202,12 +1202,14 @@ public partial class ChatWindow : Window
|
|||||||
_cursorTimer.Stop();
|
_cursorTimer.Stop();
|
||||||
_elapsedTimer.Stop();
|
_elapsedTimer.Stop();
|
||||||
_typingTimer.Stop();
|
_typingTimer.Stop();
|
||||||
|
StopLiveAgentProgressHints();
|
||||||
StopRainbowGlow();
|
StopRainbowGlow();
|
||||||
HideStickyProgress();
|
HideStickyProgress();
|
||||||
_activeStreamText = null;
|
_activeStreamText = null;
|
||||||
_elapsedLabel = null;
|
_elapsedLabel = null;
|
||||||
_cachedStreamContent = "";
|
_cachedStreamContent = "";
|
||||||
_isStreaming = false;
|
_isStreaming = false;
|
||||||
|
_streamRunTab = null;
|
||||||
BtnSend.IsEnabled = true;
|
BtnSend.IsEnabled = true;
|
||||||
BtnStop.Visibility = Visibility.Collapsed;
|
BtnStop.Visibility = Visibility.Collapsed;
|
||||||
BtnPause.Visibility = Visibility.Collapsed;
|
BtnPause.Visibility = Visibility.Collapsed;
|
||||||
@@ -1218,10 +1220,32 @@ public partial class ChatWindow : Window
|
|||||||
SetStatusIdle();
|
SetStatusIdle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RefreshStreamingControlsForActiveTab()
|
||||||
|
{
|
||||||
|
if (!_isStreaming)
|
||||||
|
{
|
||||||
|
BtnSend.IsEnabled = true;
|
||||||
|
BtnSend.Visibility = Visibility.Visible;
|
||||||
|
BtnStop.Visibility = Visibility.Collapsed;
|
||||||
|
BtnPause.Visibility = Visibility.Collapsed;
|
||||||
|
PauseIcon.Text = "\uE769";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var runTab = string.IsNullOrWhiteSpace(_streamRunTab) ? _activeTab : _streamRunTab!;
|
||||||
|
var isOwningTab = string.Equals(runTab, _activeTab, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
BtnSend.IsEnabled = !isOwningTab;
|
||||||
|
BtnSend.Visibility = isOwningTab ? Visibility.Collapsed : Visibility.Visible;
|
||||||
|
BtnStop.Visibility = isOwningTab ? Visibility.Visible : Visibility.Collapsed;
|
||||||
|
BtnPause.Visibility = isOwningTab && (runTab == "Cowork" || runTab == "Code")
|
||||||
|
? Visibility.Visible
|
||||||
|
: Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
private void TabChat_Checked(object sender, RoutedEventArgs e)
|
private void TabChat_Checked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (_activeTab == "Chat") return;
|
if (_activeTab == "Chat") return;
|
||||||
StopStreamingIfActive();
|
|
||||||
SaveCurrentTabConversationId();
|
SaveCurrentTabConversationId();
|
||||||
PersistPerTabUiState();
|
PersistPerTabUiState();
|
||||||
_activeTab = "Chat";
|
_activeTab = "Chat";
|
||||||
@@ -1232,7 +1256,6 @@ public partial class ChatWindow : Window
|
|||||||
private void TabCowork_Checked(object sender, RoutedEventArgs e)
|
private void TabCowork_Checked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (_activeTab == "Cowork") return;
|
if (_activeTab == "Cowork") return;
|
||||||
StopStreamingIfActive();
|
|
||||||
SaveCurrentTabConversationId();
|
SaveCurrentTabConversationId();
|
||||||
PersistPerTabUiState();
|
PersistPerTabUiState();
|
||||||
_activeTab = "Cowork";
|
_activeTab = "Cowork";
|
||||||
@@ -1243,7 +1266,6 @@ public partial class ChatWindow : Window
|
|||||||
private void TabCode_Checked(object sender, RoutedEventArgs e)
|
private void TabCode_Checked(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (_activeTab == "Code") return;
|
if (_activeTab == "Code") return;
|
||||||
StopStreamingIfActive();
|
|
||||||
SaveCurrentTabConversationId();
|
SaveCurrentTabConversationId();
|
||||||
PersistPerTabUiState();
|
PersistPerTabUiState();
|
||||||
_activeTab = "Code";
|
_activeTab = "Code";
|
||||||
@@ -1282,6 +1304,7 @@ public partial class ChatWindow : Window
|
|||||||
ApplyAgentThemeResources();
|
ApplyAgentThemeResources();
|
||||||
ApplyExpressionLevelUi();
|
ApplyExpressionLevelUi();
|
||||||
ApplySidebarStateForActiveTab(animated: false);
|
ApplySidebarStateForActiveTab(animated: false);
|
||||||
|
RefreshStreamingControlsForActiveTab();
|
||||||
if (CurrentTabTitle != null)
|
if (CurrentTabTitle != null)
|
||||||
{
|
{
|
||||||
CurrentTabTitle.Text = _activeTab switch
|
CurrentTabTitle.Text = _activeTab switch
|
||||||
@@ -6458,7 +6481,8 @@ public partial class ChatWindow : Window
|
|||||||
OutputTokens = outputTokens,
|
OutputTokens = outputTokens,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (MessagePanel != null)
|
var runTab = string.IsNullOrWhiteSpace(_streamRunTab) ? _activeTab : _streamRunTab!;
|
||||||
|
if (MessagePanel != null && string.Equals(runTab, _activeTab, StringComparison.OrdinalIgnoreCase))
|
||||||
RenderMessages(preserveViewport: true);
|
RenderMessages(preserveViewport: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6467,6 +6491,10 @@ public partial class ChatWindow : Window
|
|||||||
if (_liveAgentProgressHint == null)
|
if (_liveAgentProgressHint == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
var runTab = string.IsNullOrWhiteSpace(_streamRunTab) ? _activeTab : _streamRunTab!;
|
||||||
|
if (!string.Equals(runTab, _activeTab, StringComparison.OrdinalIgnoreCase))
|
||||||
|
return null;
|
||||||
|
|
||||||
return new AgentEvent
|
return new AgentEvent
|
||||||
{
|
{
|
||||||
Timestamp = _liveAgentProgressHint.Timestamp,
|
Timestamp = _liveAgentProgressHint.Timestamp,
|
||||||
@@ -13341,7 +13369,6 @@ public partial class ChatWindow : Window
|
|||||||
var targetTab = NormalizeTabName(conv.Tab);
|
var targetTab = NormalizeTabName(conv.Tab);
|
||||||
if (!string.Equals(_activeTab, targetTab, StringComparison.OrdinalIgnoreCase))
|
if (!string.Equals(_activeTab, targetTab, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
StopStreamingIfActive();
|
|
||||||
SaveCurrentTabConversationId();
|
SaveCurrentTabConversationId();
|
||||||
PersistPerTabUiState();
|
PersistPerTabUiState();
|
||||||
_activeTab = targetTab;
|
_activeTab = targetTab;
|
||||||
|
|||||||
Reference in New Issue
Block a user