Forge
csharpdeeb25a2
1using System.Text.Json;
2using System.Text.Json.Nodes;
3
4namespace CascadeIDE.Tests;
5
6/// <summary>
7/// Узкий детерминированный срез <c>get_cockpit_surface</c> для golden-сравнения (ADR 0052):
8/// без <c>ui_mode</c>, строки <c>presentation</c>, вторичного shell и полей, зависящих от топологии презентации
9/// и intent (колонки main, список инструментов) — они меняются с <c>display.screens.topology</c> и настройками.
10/// </summary>
11public static class AgentContractCockpitContractSlice
12{
13 private static readonly JsonSerializerOptions Compact = new() { WriteIndented = false };
14
15 /// <summary>
16 /// Из полного JSON CDS оставляет <c>schema_version</c> и укороченный <c>topology</c> (без колонки MFD в main),
17 /// без <c>instruments</c> — форма элементов проверяется в тестах сериализации CDS.
18 /// </summary>
19 public static string ToStableSliceJson(string cockpitSurfaceJson)
20 {
21 var root = JsonNode.Parse(cockpitSurfaceJson)!.AsObject();
22 var topo = root["topology"]?.AsObject();
23 JsonObject? topoSlice = null;
24 if (topo is not null)
25 {
26 topoSlice = new JsonObject();
27 foreach (var p in topo)
28 {
29 if (p.Key == "mfd_column_visible_in_main")
30 continue;
31 topoSlice[p.Key] = p.Value?.DeepClone();
32 }
33 }
34
35 var slice = new JsonObject
36 {
37 ["schema_version"] = root["schema_version"]?.DeepClone(),
38 ["topology"] = topoSlice,
39 };
40
41 return slice.ToJsonString(Compact);
42 }
43}
44
View only · write via MCP/CIDE