트레이 AX Agent 우선 진입과 설정 반영 fan-out 보강
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
- 트레이 우클릭 메뉴 상단에 AX Copilot 버전 헤더를 추가 - 트레이 좌클릭 시 AI 기능 활성화 상태에서는 AX Agent 창을 우선 열도록 변경 - 메인 설정 저장 완료 후 열린 AX Agent 창이 테마, 모델, 권한, 데이터 활용, 하단 composer 라벨을 즉시 다시 반영하도록 fan-out 경로 추가 - DraftQueue kind 분류를 message/command/steering/direct/followup 기준으로 보강하고 전송 버튼은 일반 메시지 전송 경로를 사용하도록 정리 - README.md, docs/DEVELOPMENT.md, docs/AGENT_ROADMAP.md 이력 갱신 검증 - 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:
@@ -458,6 +458,11 @@ public partial class App : System.Windows.Application
|
||||
|
||||
private void SetupTrayIcon(PluginHost pluginHost, SettingsService settings)
|
||||
{
|
||||
var version = typeof(App).Assembly.GetName().Version;
|
||||
var versionText = version == null
|
||||
? "AX Copilot v.0.0.0"
|
||||
: $"AX Copilot v.{version.Major}.{version.Minor}.{version.Build}";
|
||||
|
||||
_trayIcon = new NotifyIcon
|
||||
{
|
||||
Text = "AX Copilot",
|
||||
@@ -468,6 +473,7 @@ public partial class App : System.Windows.Application
|
||||
// ─── WPF 커스텀 트레이 메뉴 구성 ──────────────────────────────────
|
||||
_trayMenu = new Views.TrayMenuWindow();
|
||||
_trayMenu
|
||||
.AddHeader(versionText)
|
||||
.AddItem("\uE7C5", "AX Commander 호출하기", () =>
|
||||
Dispatcher.Invoke(() => _launcher?.Show()))
|
||||
.AddItem("\uE8BD", "AX Agent 대화하기", () =>
|
||||
@@ -522,7 +528,15 @@ public partial class App : System.Windows.Application
|
||||
_trayIcon.MouseClick += (_, e) =>
|
||||
{
|
||||
if (e.Button == System.Windows.Forms.MouseButtons.Left)
|
||||
Dispatcher.Invoke(() => _launcher?.Show());
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (settings.Settings.AiEnabled)
|
||||
OpenAiChat();
|
||||
else
|
||||
_launcher?.Show();
|
||||
});
|
||||
}
|
||||
else if (e.Button == System.Windows.Forms.MouseButtons.Right)
|
||||
Dispatcher.Invoke(() => _trayMenu?.ShowWithUpdate());
|
||||
};
|
||||
@@ -752,6 +766,7 @@ public partial class App : System.Windows.Application
|
||||
_settings.Settings.ScreenCapture.GlobalHotkeyEnabled);
|
||||
}
|
||||
_worktimeReminder?.RestartTimer();
|
||||
_chatWindow?.RefreshFromSavedSettings();
|
||||
};
|
||||
|
||||
_settingsWindow.Show();
|
||||
|
||||
@@ -5161,7 +5161,7 @@ public partial class ChatWindow : Window
|
||||
}
|
||||
|
||||
private void BtnSend_Click(object sender, RoutedEventArgs e)
|
||||
=> QueueComposerDraft(priority: "now", explicitKind: "direct", startImmediatelyWhenIdle: true);
|
||||
=> QueueComposerDraft(priority: "now", explicitKind: null, startImmediatelyWhenIdle: true);
|
||||
|
||||
private void InputBox_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
@@ -13942,6 +13942,23 @@ public partial class ChatWindow : Window
|
||||
}, DispatcherPriority.Input);
|
||||
}
|
||||
|
||||
public void RefreshFromSavedSettings()
|
||||
{
|
||||
Dispatcher.BeginInvoke(() =>
|
||||
{
|
||||
ApplyAgentThemeResources();
|
||||
LoadConversationSettings();
|
||||
UpdatePermissionUI();
|
||||
UpdateDataUsageUI();
|
||||
UpdateModelLabel();
|
||||
RefreshInlineSettingsPanel();
|
||||
RefreshOverlaySettingsPanel();
|
||||
RefreshContextUsageVisual();
|
||||
UpdateTabUI();
|
||||
BuildBottomBar();
|
||||
}, DispatcherPriority.Input);
|
||||
}
|
||||
|
||||
private void BtnOverlaySettingsClose_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ApplyOverlaySettingsChanges(showToast: false, closeOverlay: true);
|
||||
@@ -17055,12 +17072,23 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
|
||||
|
||||
private static string InferDraftKind(string text, string? explicitKind = null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(explicitKind))
|
||||
return explicitKind.Trim().ToLowerInvariant();
|
||||
|
||||
var trimmed = text?.Trim() ?? "";
|
||||
var requestedKind = explicitKind?.Trim().ToLowerInvariant();
|
||||
|
||||
if (requestedKind is "followup" or "steering")
|
||||
return requestedKind;
|
||||
|
||||
if (trimmed.StartsWith("/", StringComparison.OrdinalIgnoreCase))
|
||||
return "command";
|
||||
|
||||
if (requestedKind is "direct" or "message")
|
||||
return requestedKind;
|
||||
|
||||
if (trimmed.StartsWith("steer:", StringComparison.OrdinalIgnoreCase) ||
|
||||
trimmed.StartsWith("@steer ", StringComparison.OrdinalIgnoreCase) ||
|
||||
trimmed.StartsWith("조정:", StringComparison.OrdinalIgnoreCase))
|
||||
return "steering";
|
||||
|
||||
return "message";
|
||||
}
|
||||
|
||||
@@ -17111,6 +17139,8 @@ private static (string icon, string label, string bgHex, string fgHex) GetDecisi
|
||||
{
|
||||
"command" => "명령이 대기열에 추가되었습니다.",
|
||||
"direct" => "직접 실행 요청이 대기열에 추가되었습니다.",
|
||||
"steering" => "조정 요청이 대기열에 추가되었습니다.",
|
||||
"followup" => "후속 작업이 대기열에 추가되었습니다.",
|
||||
_ => "메시지가 대기열에 추가되었습니다.",
|
||||
};
|
||||
ShowToast(toast);
|
||||
|
||||
@@ -40,6 +40,22 @@ public partial class TrayMenuWindow : Window
|
||||
|
||||
// ─── 아이템 빌더 API ─────────────────────────────────────────────────
|
||||
|
||||
/// <summary>일반 메뉴 항목을 추가합니다.</summary>
|
||||
public TrayMenuWindow AddHeader(string text)
|
||||
{
|
||||
var label = new TextBlock
|
||||
{
|
||||
Text = text,
|
||||
FontSize = 12,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Margin = new Thickness(12, 2, 12, 6),
|
||||
};
|
||||
label.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText");
|
||||
MenuPanel.Children.Add(label);
|
||||
AddSeparator();
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>일반 메뉴 항목을 추가합니다.</summary>
|
||||
public TrayMenuWindow AddItem(string glyph, string text, Action onClick)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user