| 1 | using System.Text.Json; |
| 2 | using CascadeIDE.Features.IdeMcp.Application; |
| 3 | using CascadeIDE.Models; |
| 4 | using static CascadeIDE.Services.IdeCommands; |
| 5 | |
| 6 | namespace CascadeIDE.Features.IdeMcp.Execution; |
| 7 | |
| 8 | /// <summary>MCP-хендлеры вывода и фокуса: ping, перезапуск MCP-клиентов, фокус редактора, снимок окна.</summary> |
| 9 | internal sealed partial class IdeMcpCommandExecutor |
| 10 | { |
| 11 | private void RegisterOutputAndFocus(Action<string, Handler> add) |
| 12 | { |
| 13 | add(IdePing, async (_, _) => await Task.FromResult(IdeMcpHostOrchestrator.PingJson())); |
| 14 | add(IdeRestartMcpClients, async (_, ct) => await _vm.RestartMcpClientsForAgentAsync(ct)); |
| 15 | |
| 16 | add(FocusEditor, async (_, _) => |
| 17 | { |
| 18 | _actions.FocusEditor(); |
| 19 | return await Task.FromResult("OK"); |
| 20 | }); |
| 21 | |
| 22 | Handler captureWindow = async (args, _) => |
| 23 | { |
| 24 | if (_vm.CaptureWindowForMcpAsync is null) |
| 25 | return "Error: главное окно не привязано к VM (внутренний снимок недоступен)."; |
| 26 | var ws = McpCommandJsonArgs.String(args, "workspace_path"); |
| 27 | var rel = McpCommandJsonArgs.String(args, "output_path"); |
| 28 | var scope = McpCommandJsonArgs.String(args, "scope"); |
| 29 | return await _vm.CaptureWindowForMcpAsync(ws, rel, scope).ConfigureAwait(false); |
| 30 | }; |
| 31 | add(CaptureWindow, captureWindow); |
| 32 | } |
| 33 | } |
| 34 | |