Forge
csharpdeeb25a2
1using System.Text.Json;
2using CascadeIDE.Models.Editor;
3
4namespace CascadeIDE.Features.IdeMcp.Execution;
5
6/// <summary>Поверхность отладки.</summary>
7internal sealed partial class IdeMcpCommandExecutor
8{
9 private void RegisterDebuggerBreakpoints(Action<string, Handler> add)
10 {
11 add(Services.IdeCommands.SetBreakpoint, async (args, ct) =>
12 {
13 if (args is null || string.IsNullOrEmpty(McpCommandJsonArgs.String(args, "file_path")))
14 return "Missing file_path or line";
15 if (!tryParseBreakpointLine(args, out var line, out var lineErr))
16 return lineErr;
17 return await _vm.CompleteMcpSetBreakpointAsync(
18 McpCommandJsonArgs.String(args, "file_path")!,
19 line.Value,
20 McpCommandJsonArgs.String(args, "condition"),
21 ct).ConfigureAwait(false);
22 });
23 add(Services.IdeCommands.RemoveBreakpoint, async (args, ct) =>
24 {
25 var a = _actions;
26 if (args is null || string.IsNullOrEmpty(McpCommandJsonArgs.String(args, "file_path"))) return "Missing file_path or line";
27 if (!tryParseBreakpointLine(args, out var line, out var lineErr))
28 return lineErr;
29 a.RemoveBreakpoint(McpCommandJsonArgs.String(args, "file_path")!, line.Value);
30 return "OK";
31 });
32 }
33
34 private void RegisterPreviewAndConfirmation(Action<string, Handler> add)
35 {
36 add(Services.IdeCommands.ShowPreview, async (args, _) =>
37 {
38 var a = _actions;
39 a.ShowPreview(McpCommandJsonArgs.String(args, "title") ?? "", McpCommandJsonArgs.String(args, "content") ?? "");
40 return await Task.FromResult("OK");
41 });
42 add(Services.IdeCommands.ShowEditorPreview, async (_, _) =>
43 {
44 var a = _actions;
45 a.ShowEditorPreview();
46 return await Task.FromResult("OK");
47 });
48 add(Services.IdeCommands.RequestConfirmation, async (args, ct) =>
49 {
50 var a = _actions;
51 return await a.RequestConfirmationAsync(McpCommandJsonArgs.String(args, "message") ?? "", ct);
52 });
53 }
54
55 private void RegisterDebugUiSurface(Action<string, Handler> add)
56 {
57#if DEBUG
58 add(Services.IdeCommands.AddControl, async (args, _) =>
59 {
60 var a = _actions;
61 return await a.AddControlAsync(McpCommandJsonArgs.String(args, "parent_name") ?? "", McpCommandJsonArgs.String(args, "control_type") ?? "", McpCommandJsonArgs.String(args, "content"), McpCommandJsonArgs.String(args, "name"));
62 });
63#endif
64 }
65
66 private static bool tryParseBreakpointLine(IReadOnlyDictionary<string, JsonElement> args, out LineNumber line, out string error)
67 {
68 line = default;
69 error = "";
70 if (!args.TryGetValue("line", out var el) || el.ValueKind != JsonValueKind.Number || !el.TryGetInt32(out var raw))
71 {
72 error = "Missing or invalid line (ожидается целое число).";
73 return false;
74 }
75
76 if (!LineNumber.TryCreate(raw, out line))
77 {
78 error = $"Invalid line: ожидается ≥ {LineNumber.MinimumOneBasedInclusive}, получено {raw}.";
79 return false;
80 }
81
82 return true;
83 }
84}
View only · write via MCP/CIDE