@memberjunction/ng-dashboards 5.28.0 → 5.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
  2. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
  3. package/dist/Archiving/components/archive-config-resource.component.js +46 -0
  4. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
  5. package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
  6. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
  7. package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
  8. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
  9. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  10. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  11. package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
  12. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  13. package/dist/MCP/mcp-dashboard.component.js +2471 -679
  14. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  15. package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
  16. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
  17. package/dist/MCP/mcp-filter-panel.component.js +187 -60
  18. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  19. package/dist/MCP/mcp-resource.component.d.ts +0 -9
  20. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  21. package/dist/MCP/mcp-resource.component.js +1 -10
  22. package/dist/MCP/mcp-resource.component.js.map +1 -1
  23. package/dist/MCP/mcp.module.d.ts +7 -6
  24. package/dist/MCP/mcp.module.d.ts.map +1 -1
  25. package/dist/MCP/mcp.module.js +4 -8
  26. package/dist/MCP/mcp.module.js.map +1 -1
  27. package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
  28. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  29. package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
  30. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  31. package/dist/archiving-dashboards.module.d.ts +19 -0
  32. package/dist/archiving-dashboards.module.d.ts.map +1 -0
  33. package/dist/archiving-dashboards.module.js +52 -0
  34. package/dist/archiving-dashboards.module.js.map +1 -0
  35. package/dist/core-dashboards.module.d.ts +3 -2
  36. package/dist/core-dashboards.module.d.ts.map +1 -1
  37. package/dist/core-dashboards.module.js +4 -0
  38. package/dist/core-dashboards.module.js.map +1 -1
  39. package/dist/module.d.ts +13 -12
  40. package/dist/module.d.ts.map +1 -1
  41. package/dist/module.js +7 -0
  42. package/dist/module.js.map +1 -1
  43. package/dist/public-api.d.ts +3 -0
  44. package/dist/public-api.d.ts.map +1 -1
  45. package/dist/public-api.js +4 -0
  46. package/dist/public-api.js.map +1 -1
  47. package/package.json +51 -48
@@ -20,11 +20,20 @@ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
20
20
  import { RunView, Metadata } from '@memberjunction/core';
21
21
  import { BaseDashboard } from '@memberjunction/ng-shared';
22
22
  import { MCPEngine, UserInfoEngine } from '@memberjunction/core-entities';
23
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
23
+ import { CredentialEngine } from '@memberjunction/credentials';
24
+ import { RegisterClass, UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
25
+ import { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';
24
26
  import * as i0 from "@angular/core";
25
27
  import * as i1 from "./services/mcp-tools.service";
28
+ import * as i2 from "@angular/common";
29
+ import * as i3 from "@angular/forms";
30
+ import * as i4 from "@memberjunction/ng-ui-components";
31
+ import * as i5 from "@memberjunction/ng-shared-generic";
26
32
  const _forTrack0 = ($index, $item) => $item.ID;
27
- const _forTrack1 = ($index, $item) => $item.server.ID;
33
+ const _forTrack1 = ($index, $item) => $item.category;
34
+ const _forTrack2 = ($index, $item) => $item.server.ID;
35
+ const _forTrack3 = ($index, $item) => $item.value;
36
+ const _forTrack4 = ($index, $item) => $item.name;
28
37
  function MCPDashboardComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
29
38
  i0.ɵɵtext(0, " Hide Filters ");
30
39
  } }
@@ -32,777 +41,1039 @@ function MCPDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
32
41
  i0.ɵɵtext(0, " Show Filters ");
33
42
  } }
34
43
  function MCPDashboardComponent_Case_38_Template(rf, ctx) { if (rf & 1) {
35
- const _r1 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "button", 31);
37
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createServer()); });
38
- i0.ɵɵelement(1, "i", 32);
44
+ const _r2 = i0.ɵɵgetCurrentView();
45
+ i0.ɵɵelementStart(0, "button", 68);
46
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.createServer()); });
47
+ i0.ɵɵelement(1, "i", 69);
39
48
  i0.ɵɵtext(2, " Add Server ");
40
49
  i0.ɵɵelementEnd();
41
50
  } }
42
51
  function MCPDashboardComponent_Case_39_Template(rf, ctx) { if (rf & 1) {
43
- const _r3 = i0.ɵɵgetCurrentView();
44
- i0.ɵɵelementStart(0, "button", 31);
45
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createConnection()); });
46
- i0.ɵɵelement(1, "i", 32);
52
+ const _r4 = i0.ɵɵgetCurrentView();
53
+ i0.ɵɵelementStart(0, "button", 68);
54
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.createConnection()); });
55
+ i0.ɵɵelement(1, "i", 69);
47
56
  i0.ɵɵtext(2, " Add Connection ");
48
57
  i0.ɵɵelementEnd();
49
58
  } }
50
59
  function MCPDashboardComponent_Case_40_Template(rf, ctx) { if (rf & 1) {
51
- const _r4 = i0.ɵɵgetCurrentView();
52
- i0.ɵɵelementStart(0, "div", 33)(1, "button", 34);
53
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("card")); });
54
- i0.ɵɵelement(2, "i", 35);
60
+ const _r5 = i0.ɵɵgetCurrentView();
61
+ i0.ɵɵelementStart(0, "div", 70)(1, "button", 71);
62
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setToolsViewMode("card")); });
63
+ i0.ɵɵelement(2, "i", 72);
55
64
  i0.ɵɵelementEnd();
56
- i0.ɵɵelementStart(3, "button", 36);
57
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("list")); });
58
- i0.ɵɵelement(4, "i", 37);
65
+ i0.ɵɵelementStart(3, "button", 73);
66
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setToolsViewMode("list")); });
67
+ i0.ɵɵelement(4, "i", 74);
59
68
  i0.ɵɵelementEnd()();
60
- i0.ɵɵelementStart(5, "button", 31);
61
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTestToolDialog()); });
62
- i0.ɵɵelement(6, "i", 38);
69
+ i0.ɵɵelementStart(5, "button", 68);
70
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openTestToolDialog()); });
71
+ i0.ɵɵelement(6, "i", 75);
63
72
  i0.ɵɵtext(7, " Test Tool ");
64
73
  i0.ɵɵelementEnd();
65
74
  } if (rf & 2) {
66
- const ctx_r1 = i0.ɵɵnextContext();
75
+ const ctx_r2 = i0.ɵɵnextContext();
67
76
  i0.ɵɵadvance();
68
- i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "card");
77
+ i0.ɵɵclassProp("active", ctx_r2.ToolsViewMode === "card");
69
78
  i0.ɵɵadvance(2);
70
- i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "list");
79
+ i0.ɵɵclassProp("active", ctx_r2.ToolsViewMode === "list");
71
80
  } }
72
81
  function MCPDashboardComponent_Case_41_Template(rf, ctx) { if (rf & 1) {
73
- const _r5 = i0.ɵɵgetCurrentView();
74
- i0.ɵɵelementStart(0, "button", 39);
75
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_41_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadAllData()); });
76
- i0.ɵɵelement(1, "i", 40);
82
+ const _r6 = i0.ɵɵgetCurrentView();
83
+ i0.ɵɵelementStart(0, "button", 76);
84
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_41_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.loadAllData()); });
85
+ i0.ɵɵelement(1, "i", 77);
77
86
  i0.ɵɵtext(2, " Refresh ");
78
87
  i0.ɵɵelementEnd();
79
88
  } if (rf & 2) {
80
- const ctx_r1 = i0.ɵɵnextContext();
81
- i0.ɵɵproperty("disabled", ctx_r1.IsLoading);
89
+ const ctx_r2 = i0.ɵɵnextContext();
90
+ i0.ɵɵproperty("disabled", ctx_r2.IsLoading);
82
91
  i0.ɵɵadvance();
83
- i0.ɵɵclassProp("fa-spin", ctx_r1.IsLoading);
92
+ i0.ɵɵclassProp("fa-spin", ctx_r2.IsLoading);
84
93
  } }
85
- function MCPDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
86
- const _r6 = i0.ɵɵgetCurrentView();
87
- i0.ɵɵelementStart(0, "div", 24);
88
- i0.ɵɵelement(1, "i", 41);
94
+ function MCPDashboardComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementStart(0, "span", 52);
96
+ i0.ɵɵtext(1);
97
+ i0.ɵɵelementEnd();
98
+ } if (rf & 2) {
99
+ const ctx_r2 = i0.ɵɵnextContext();
100
+ i0.ɵɵadvance();
101
+ i0.ɵɵtextInterpolate(ctx_r2.activeFilterCount());
102
+ } }
103
+ function MCPDashboardComponent_Conditional_58_For_9_Template(rf, ctx) { if (rf & 1) {
104
+ i0.ɵɵelementStart(0, "option", 80);
105
+ i0.ɵɵtext(1);
106
+ i0.ɵɵelementEnd();
107
+ } if (rf & 2) {
108
+ const s_r10 = ctx.$implicit;
109
+ i0.ɵɵproperty("value", s_r10.ID);
110
+ i0.ɵɵadvance();
111
+ i0.ɵɵtextInterpolate(s_r10.Name);
112
+ } }
113
+ function MCPDashboardComponent_Conditional_58_For_19_Template(rf, ctx) { if (rf & 1) {
114
+ i0.ɵɵelementStart(0, "option", 80);
115
+ i0.ɵɵtext(1);
116
+ i0.ɵɵelementEnd();
117
+ } if (rf & 2) {
118
+ const c_r12 = ctx.$implicit;
119
+ i0.ɵɵproperty("value", c_r12.category);
120
+ i0.ɵɵadvance();
121
+ i0.ɵɵtextInterpolate2("", c_r12.category, " (", c_r12.count, ")");
122
+ } }
123
+ function MCPDashboardComponent_Conditional_58_Template(rf, ctx) { if (rf & 1) {
124
+ const _r8 = i0.ɵɵgetCurrentView();
125
+ i0.ɵɵelementStart(0, "div", 54)(1, "label", 55);
126
+ i0.ɵɵelement(2, "i", 38);
127
+ i0.ɵɵtext(3, " Server");
128
+ i0.ɵɵelementEnd();
129
+ i0.ɵɵelementStart(4, "select", 78, 1);
130
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_58_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r8); const fServer_r9 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("toolsServer", fServer_r9.value)); });
131
+ i0.ɵɵelementStart(6, "option", 79);
132
+ i0.ɵɵtext(7, "All Servers");
133
+ i0.ɵɵelementEnd();
134
+ i0.ɵɵrepeaterCreate(8, MCPDashboardComponent_Conditional_58_For_9_Template, 2, 2, "option", 80, _forTrack0);
135
+ i0.ɵɵelementEnd()();
136
+ i0.ɵɵelementStart(10, "div", 54)(11, "label", 55);
137
+ i0.ɵɵelement(12, "i", 81);
138
+ i0.ɵɵtext(13, " Category");
139
+ i0.ɵɵelementEnd();
140
+ i0.ɵɵelementStart(14, "select", 78, 2);
141
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_58_Template_select_change_14_listener() { i0.ɵɵrestoreView(_r8); const fCat_r11 = i0.ɵɵreference(15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("toolsCategory", fCat_r11.value)); });
142
+ i0.ɵɵelementStart(16, "option", 79);
143
+ i0.ɵɵtext(17, "All Categories");
144
+ i0.ɵɵelementEnd();
145
+ i0.ɵɵrepeaterCreate(18, MCPDashboardComponent_Conditional_58_For_19_Template, 2, 3, "option", 80, _forTrack1);
146
+ i0.ɵɵelementEnd()();
147
+ i0.ɵɵelementStart(20, "div", 54)(21, "label", 82)(22, "input", 83, 3);
148
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_58_Template_input_change_22_listener() { i0.ɵɵrestoreView(_r8); const fFav_r13 = i0.ɵɵreference(23); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("favoritesOnly", fFav_r13.checked)); });
149
+ i0.ɵɵelementEnd();
150
+ i0.ɵɵelement(24, "i", 84);
151
+ i0.ɵɵtext(25, " Favorites only ");
152
+ i0.ɵɵelementEnd()();
153
+ i0.ɵɵelementStart(26, "div", 54)(27, "label", 82)(28, "input", 83, 4);
154
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_58_Template_input_change_28_listener() { i0.ɵɵrestoreView(_r8); const fRec_r14 = i0.ɵɵreference(29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("recentOnly", fRec_r14.checked)); });
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵelement(30, "i", 85);
157
+ i0.ɵɵtext(31, " Recently used only ");
158
+ i0.ɵɵelementEnd()();
159
+ } if (rf & 2) {
160
+ const ctx_r2 = i0.ɵɵnextContext();
161
+ i0.ɵɵadvance(4);
162
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.toolsServer ?? "all");
163
+ i0.ɵɵadvance(4);
164
+ i0.ɵɵrepeater(ctx_r2.toolsAvailableServers);
165
+ i0.ɵɵadvance(6);
166
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.toolsCategory ?? "all");
167
+ i0.ɵɵadvance(4);
168
+ i0.ɵɵrepeater(ctx_r2.toolsAvailableCategories);
169
+ i0.ɵɵadvance(4);
170
+ i0.ɵɵproperty("checked", ctx_r2.CurrentFilters.favoritesOnly === true);
171
+ i0.ɵɵadvance(6);
172
+ i0.ɵɵproperty("checked", ctx_r2.CurrentFilters.recentOnly === true);
173
+ } }
174
+ function MCPDashboardComponent_Conditional_59_Template(rf, ctx) { if (rf & 1) {
175
+ const _r15 = i0.ɵɵgetCurrentView();
176
+ i0.ɵɵelementStart(0, "div", 54)(1, "label", 55);
177
+ i0.ɵɵelement(2, "i", 86);
178
+ i0.ɵɵtext(3, " Server Status");
179
+ i0.ɵɵelementEnd();
180
+ i0.ɵɵelementStart(4, "select", 78, 5);
181
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_59_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r15); const fSStatus_r16 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("serverStatus", fSStatus_r16.value)); });
182
+ i0.ɵɵelementStart(6, "option", 79);
183
+ i0.ɵɵtext(7, "All Statuses");
184
+ i0.ɵɵelementEnd();
185
+ i0.ɵɵelementStart(8, "option", 87);
186
+ i0.ɵɵtext(9, "Active");
187
+ i0.ɵɵelementEnd();
188
+ i0.ɵɵelementStart(10, "option", 88);
189
+ i0.ɵɵtext(11, "Inactive");
190
+ i0.ɵɵelementEnd()()();
191
+ } if (rf & 2) {
192
+ const ctx_r2 = i0.ɵɵnextContext();
193
+ i0.ɵɵadvance(4);
194
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.serverStatus);
195
+ } }
196
+ function MCPDashboardComponent_Conditional_60_Template(rf, ctx) { if (rf & 1) {
197
+ const _r17 = i0.ɵɵgetCurrentView();
198
+ i0.ɵɵelementStart(0, "div", 54)(1, "label", 55);
199
+ i0.ɵɵelement(2, "i", 86);
200
+ i0.ɵɵtext(3, " Connection Status");
201
+ i0.ɵɵelementEnd();
202
+ i0.ɵɵelementStart(4, "select", 78, 6);
203
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_60_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r17); const fCStatus_r18 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("connectionStatus", fCStatus_r18.value)); });
204
+ i0.ɵɵelementStart(6, "option", 79);
205
+ i0.ɵɵtext(7, "All Statuses");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(8, "option", 87);
208
+ i0.ɵɵtext(9, "Active");
209
+ i0.ɵɵelementEnd();
210
+ i0.ɵɵelementStart(10, "option", 88);
211
+ i0.ɵɵtext(11, "Inactive");
212
+ i0.ɵɵelementEnd();
213
+ i0.ɵɵelementStart(12, "option", 89);
214
+ i0.ɵɵtext(13, "Error");
215
+ i0.ɵɵelementEnd()()();
216
+ } if (rf & 2) {
217
+ const ctx_r2 = i0.ɵɵnextContext();
218
+ i0.ɵɵadvance(4);
219
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.connectionStatus);
220
+ } }
221
+ function MCPDashboardComponent_Conditional_61_Template(rf, ctx) { if (rf & 1) {
222
+ const _r19 = i0.ɵɵgetCurrentView();
223
+ i0.ɵɵelementStart(0, "div", 54)(1, "label", 55);
224
+ i0.ɵɵelement(2, "i", 86);
225
+ i0.ɵɵtext(3, " Tool Status");
226
+ i0.ɵɵelementEnd();
227
+ i0.ɵɵelementStart(4, "select", 78, 7);
228
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_61_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r19); const fTStatus_r20 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("toolStatus", fTStatus_r20.value)); });
229
+ i0.ɵɵelementStart(6, "option", 79);
230
+ i0.ɵɵtext(7, "All Statuses");
231
+ i0.ɵɵelementEnd();
232
+ i0.ɵɵelementStart(8, "option", 87);
233
+ i0.ɵɵtext(9, "Active");
234
+ i0.ɵɵelementEnd();
235
+ i0.ɵɵelementStart(10, "option", 90);
236
+ i0.ɵɵtext(11, "Deprecated");
237
+ i0.ɵɵelementEnd()()();
238
+ } if (rf & 2) {
239
+ const ctx_r2 = i0.ɵɵnextContext();
240
+ i0.ɵɵadvance(4);
241
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.toolStatus);
242
+ } }
243
+ function MCPDashboardComponent_Conditional_62_Template(rf, ctx) { if (rf & 1) {
244
+ const _r21 = i0.ɵɵgetCurrentView();
245
+ i0.ɵɵelementStart(0, "div", 54)(1, "label", 55);
246
+ i0.ɵɵelement(2, "i", 91);
247
+ i0.ɵɵtext(3, " Log Status");
248
+ i0.ɵɵelementEnd();
249
+ i0.ɵɵelementStart(4, "select", 78, 8);
250
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_62_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r21); const fLStatus_r22 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterFieldChange("logStatus", fLStatus_r22.value)); });
251
+ i0.ɵɵelementStart(6, "option", 79);
252
+ i0.ɵɵtext(7, "All Statuses");
253
+ i0.ɵɵelementEnd();
254
+ i0.ɵɵelementStart(8, "option", 92);
255
+ i0.ɵɵtext(9, "Success");
256
+ i0.ɵɵelementEnd();
257
+ i0.ɵɵelementStart(10, "option", 89);
258
+ i0.ɵɵtext(11, "Error");
259
+ i0.ɵɵelementEnd();
260
+ i0.ɵɵelementStart(12, "option", 93);
261
+ i0.ɵɵtext(13, "Running");
262
+ i0.ɵɵelementEnd()()();
263
+ } if (rf & 2) {
264
+ const ctx_r2 = i0.ɵɵnextContext();
265
+ i0.ɵɵadvance(4);
266
+ i0.ɵɵproperty("value", ctx_r2.CurrentFilters.logStatus);
267
+ } }
268
+ function MCPDashboardComponent_Conditional_69_Template(rf, ctx) { if (rf & 1) {
269
+ const _r23 = i0.ɵɵgetCurrentView();
270
+ i0.ɵɵelementStart(0, "div", 63);
271
+ i0.ɵɵelement(1, "i", 94);
89
272
  i0.ɵɵtext(2);
90
- i0.ɵɵelementStart(3, "button", 42);
91
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_47_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ErrorMessage = null); });
92
- i0.ɵɵelement(4, "i", 43);
273
+ i0.ɵɵelementStart(3, "button", 95);
274
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_69_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ErrorMessage = null); });
275
+ i0.ɵɵelement(4, "i", 96);
93
276
  i0.ɵɵelementEnd()();
94
277
  } if (rf & 2) {
95
- const ctx_r1 = i0.ɵɵnextContext();
278
+ const ctx_r2 = i0.ɵɵnextContext();
96
279
  i0.ɵɵadvance(2);
97
- i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage, " ");
280
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.ErrorMessage, " ");
98
281
  } }
99
- function MCPDashboardComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
100
- i0.ɵɵelement(0, "mj-loading", 26);
282
+ function MCPDashboardComponent_Conditional_71_Template(rf, ctx) { if (rf & 1) {
283
+ i0.ɵɵelement(0, "mj-loading", 65);
101
284
  } }
102
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
103
- const _r7 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "div", 47);
105
- i0.ɵɵelement(1, "i", 11);
285
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
286
+ const _r24 = i0.ɵɵgetCurrentView();
287
+ i0.ɵɵelementStart(0, "div", 100);
288
+ i0.ɵɵelement(1, "i", 38);
106
289
  i0.ɵɵelementStart(2, "p");
107
290
  i0.ɵɵtext(3, "No MCP servers configured");
108
291
  i0.ɵɵelementEnd();
109
- i0.ɵɵelementStart(4, "button", 31);
110
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createServer()); });
292
+ i0.ɵɵelementStart(4, "button", 68);
293
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createServer()); });
111
294
  i0.ɵɵtext(5, " Add Your First Server ");
112
295
  i0.ɵɵelementEnd()();
113
296
  } }
114
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelement(0, "p", 61);
116
- i0.ɵɵpipe(1, "async");
117
- i0.ɵɵpipe(2, "highlightSearch");
297
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
298
+ i0.ɵɵelementStart(0, "p", 114);
299
+ i0.ɵɵtext(1);
300
+ i0.ɵɵelementEnd();
118
301
  } if (rf & 2) {
119
- let tmp_14_0;
120
- const server_r9 = i0.ɵɵnextContext().$implicit;
121
- const ctx_r1 = i0.ɵɵnextContext(4);
122
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, server_r9.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
302
+ const server_r26 = i0.ɵɵnextContext().$implicit;
303
+ i0.ɵɵadvance();
304
+ i0.ɵɵtextInterpolate(server_r26.Description);
123
305
  } }
124
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
306
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_37_Template(rf, ctx) { if (rf & 1) {
307
+ i0.ɵɵelementStart(0, "div", 119)(1, "span", 117);
126
308
  i0.ɵɵtext(2, "URL");
127
309
  i0.ɵɵelementEnd();
128
- i0.ɵɵelementStart(3, "span", 68);
310
+ i0.ɵɵelementStart(3, "span", 121);
129
311
  i0.ɵɵtext(4);
130
312
  i0.ɵɵelementEnd()();
131
313
  } if (rf & 2) {
132
- const server_r9 = i0.ɵɵnextContext().$implicit;
314
+ const server_r26 = i0.ɵɵnextContext().$implicit;
133
315
  i0.ɵɵadvance(4);
134
- i0.ɵɵtextInterpolate(server_r9.ServerURL);
316
+ i0.ɵɵtextInterpolate(server_r26.ServerURL);
135
317
  } }
136
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
318
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
319
+ i0.ɵɵelementStart(0, "div", 119)(1, "span", 117);
138
320
  i0.ɵɵtext(2, "Command");
139
321
  i0.ɵɵelementEnd();
140
- i0.ɵɵelementStart(3, "span", 69);
322
+ i0.ɵɵelementStart(3, "span", 122);
141
323
  i0.ɵɵtext(4);
142
324
  i0.ɵɵelementEnd()();
143
325
  } if (rf & 2) {
144
- const server_r9 = i0.ɵɵnextContext().$implicit;
326
+ const server_r26 = i0.ɵɵnextContext().$implicit;
145
327
  i0.ɵɵadvance(4);
146
- i0.ɵɵtextInterpolate(server_r9.Command);
328
+ i0.ɵɵtextInterpolate(server_r26.Command);
147
329
  } }
148
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template(rf, ctx) { if (rf & 1) {
149
- i0.ɵɵelementStart(0, "div", 71);
150
- i0.ɵɵelement(1, "i", 73);
330
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
331
+ i0.ɵɵelementStart(0, "div", 124);
332
+ i0.ɵɵelement(1, "i", 126);
151
333
  i0.ɵɵtext(2, " No tools discovered yet. Sync a connection to discover tools. ");
152
334
  i0.ɵɵelementEnd();
153
335
  } }
154
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
155
- const _r10 = i0.ɵɵgetCurrentView();
156
- i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
336
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
337
+ const _r27 = i0.ɵɵgetCurrentView();
338
+ i0.ɵɵelementStart(0, "div", 127)(1, "div", 128)(2, "span", 129);
157
339
  i0.ɵɵtext(3);
158
340
  i0.ɵɵelementEnd();
159
- i0.ɵɵelementStart(4, "span", 77);
160
- i0.ɵɵelement(5, "i", 78);
341
+ i0.ɵɵelementStart(4, "span", 130);
342
+ i0.ɵɵelement(5, "i", 131);
161
343
  i0.ɵɵtext(6);
162
344
  i0.ɵɵelementEnd()();
163
- i0.ɵɵelementStart(7, "button", 79);
164
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); ctx_r1.runToolFromCard(tool_r11); return i0.ɵɵresetView($event.stopPropagation()); });
165
- i0.ɵɵelement(8, "i", 38);
345
+ i0.ɵɵelementStart(7, "button", 132);
346
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); ctx_r2.runToolFromCard(tool_r28); return i0.ɵɵresetView($event.stopPropagation()); });
347
+ i0.ɵɵelement(8, "i", 75);
166
348
  i0.ɵɵelementEnd()();
167
349
  } if (rf & 2) {
168
- const tool_r11 = ctx.$implicit;
169
- const ctx_r1 = i0.ɵɵnextContext(7);
350
+ const tool_r28 = ctx.$implicit;
351
+ const ctx_r2 = i0.ɵɵnextContext(7);
170
352
  i0.ɵɵadvance(3);
171
- i0.ɵɵtextInterpolate(tool_r11.ToolTitle || tool_r11.ToolName);
353
+ i0.ɵɵtextInterpolate(tool_r28.ToolTitle || tool_r28.ToolName);
172
354
  i0.ɵɵadvance(3);
173
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r11), " params ");
355
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getParamCount(tool_r28), " params ");
174
356
  } }
175
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template(rf, ctx) { if (rf & 1) {
176
- i0.ɵɵelementStart(0, "div", 72);
177
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
357
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
358
+ i0.ɵɵelementStart(0, "div", 125);
359
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 127, _forTrack0);
178
360
  i0.ɵɵelementEnd();
179
361
  } if (rf & 2) {
180
- const server_r9 = i0.ɵɵnextContext(2).$implicit;
181
- const ctx_r1 = i0.ɵɵnextContext(4);
362
+ const server_r26 = i0.ɵɵnextContext(2).$implicit;
363
+ const ctx_r2 = i0.ɵɵnextContext(4);
182
364
  i0.ɵɵadvance();
183
- i0.ɵɵrepeater(ctx_r1.getToolsForServer(server_r9.ID));
365
+ i0.ɵɵrepeater(ctx_r2.getToolsForServer(server_r26.ID));
184
366
  } }
185
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
187
- i0.ɵɵelement(2, "i", 15);
367
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
368
+ i0.ɵɵelementStart(0, "div", 120)(1, "div", 123);
369
+ i0.ɵɵelement(2, "i", 42);
188
370
  i0.ɵɵelementStart(3, "span");
189
371
  i0.ɵɵtext(4);
190
372
  i0.ɵɵelementEnd()();
191
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template, 3, 0, "div", 72);
373
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 124)(6, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 125);
192
374
  i0.ɵɵelementEnd();
193
375
  } if (rf & 2) {
194
- const server_r9 = i0.ɵɵnextContext().$implicit;
195
- const ctx_r1 = i0.ɵɵnextContext(4);
376
+ const server_r26 = i0.ɵɵnextContext().$implicit;
377
+ const ctx_r2 = i0.ɵɵnextContext(4);
196
378
  i0.ɵɵadvance(4);
197
- i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForServer(server_r9.ID).length, ")");
379
+ i0.ɵɵtextInterpolate1("Available Tools (", ctx_r2.getToolsForServer(server_r26.ID).length, ")");
198
380
  i0.ɵɵadvance();
199
- i0.ɵɵconditional(ctx_r1.getToolsForServer(server_r9.ID).length === 0 ? 5 : 6);
381
+ i0.ɵɵconditional(ctx_r2.getToolsForServer(server_r26.ID).length === 0 ? 5 : 6);
200
382
  } }
201
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
202
- const _r8 = i0.ɵɵgetCurrentView();
203
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
204
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerExpand(server_r9)); });
205
- i0.ɵɵelementStart(2, "div", 51);
206
- i0.ɵɵelement(3, "i", 52)(4, "i")(5, "span", 53);
207
- i0.ɵɵpipe(6, "async");
208
- i0.ɵɵpipe(7, "highlightSearch");
209
- i0.ɵɵelementStart(8, "span", 54);
210
- i0.ɵɵtext(9);
383
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
384
+ const _r25 = i0.ɵɵgetCurrentView();
385
+ i0.ɵɵelementStart(0, "div", 102)(1, "div", 103);
386
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.toggleServerExpand(server_r26)); });
387
+ i0.ɵɵelementStart(2, "div", 104);
388
+ i0.ɵɵelement(3, "i", 105)(4, "i");
389
+ i0.ɵɵelementStart(5, "span", 106);
390
+ i0.ɵɵtext(6);
391
+ i0.ɵɵelementEnd();
392
+ i0.ɵɵelementStart(7, "span", 107);
393
+ i0.ɵɵtext(8);
211
394
  i0.ɵɵelementEnd()();
212
- i0.ɵɵelementStart(10, "div", 55);
213
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
214
- i0.ɵɵelementStart(11, "button", 56);
215
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_11_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editServer(server_r9)); });
216
- i0.ɵɵelement(12, "i", 57);
395
+ i0.ɵɵelementStart(9, "div", 108);
396
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template_div_click_9_listener($event) { i0.ɵɵrestoreView(_r25); return i0.ɵɵresetView($event.stopPropagation()); });
397
+ i0.ɵɵelementStart(10, "button", 109);
398
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template_button_click_10_listener() { const server_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.editServer(server_r26)); });
399
+ i0.ɵɵelement(11, "i", 110);
217
400
  i0.ɵɵelementEnd();
218
- i0.ɵɵelementStart(13, "button", 58);
219
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_13_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteServer(server_r9)); });
220
- i0.ɵɵelement(14, "i", 59);
401
+ i0.ɵɵelementStart(12, "button", 111);
402
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template_button_click_12_listener() { const server_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.deleteServer(server_r26)); });
403
+ i0.ɵɵelement(13, "i", 112);
221
404
  i0.ɵɵelementEnd()()();
222
- i0.ɵɵelementStart(15, "div", 60);
223
- i0.ɵɵconditionalCreate(16, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template, 3, 6, "p", 61);
224
- i0.ɵɵelementStart(17, "div", 62)(18, "div", 63)(19, "span", 64);
225
- i0.ɵɵtext(20, "Transport");
405
+ i0.ɵɵelementStart(14, "div", 113);
406
+ i0.ɵɵconditionalCreate(15, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_15_Template, 2, 1, "p", 114);
407
+ i0.ɵɵelementStart(16, "div", 115)(17, "div", 116)(18, "span", 117);
408
+ i0.ɵɵtext(19, "Transport");
226
409
  i0.ɵɵelementEnd();
227
- i0.ɵɵelementStart(21, "span", 65);
228
- i0.ɵɵtext(22);
410
+ i0.ɵɵelementStart(20, "span", 118);
411
+ i0.ɵɵtext(21);
229
412
  i0.ɵɵelementEnd()();
230
- i0.ɵɵelementStart(23, "div", 63)(24, "span", 64);
231
- i0.ɵɵtext(25, "Auth");
413
+ i0.ɵɵelementStart(22, "div", 116)(23, "span", 117);
414
+ i0.ɵɵtext(24, "Auth");
232
415
  i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(26, "span", 65);
234
- i0.ɵɵtext(27);
416
+ i0.ɵɵelementStart(25, "span", 118);
417
+ i0.ɵɵtext(26);
235
418
  i0.ɵɵelementEnd()();
236
- i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
237
- i0.ɵɵtext(30, "Connections");
419
+ i0.ɵɵelementStart(27, "div", 116)(28, "span", 117);
420
+ i0.ɵɵtext(29, "Connections");
238
421
  i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(31, "span", 65);
240
- i0.ɵɵtext(32);
422
+ i0.ɵɵelementStart(30, "span", 118);
423
+ i0.ɵɵtext(31);
241
424
  i0.ɵɵelementEnd()();
242
- i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
243
- i0.ɵɵtext(35, "Tools");
425
+ i0.ɵɵelementStart(32, "div", 116)(33, "span", 117);
426
+ i0.ɵɵtext(34, "Tools");
244
427
  i0.ɵɵelementEnd();
245
- i0.ɵɵelementStart(36, "span", 65);
246
- i0.ɵɵtext(37);
428
+ i0.ɵɵelementStart(35, "span", 118);
429
+ i0.ɵɵtext(36);
247
430
  i0.ɵɵelementEnd()();
248
- i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 66);
249
- i0.ɵɵconditionalCreate(39, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template, 5, 1, "div", 66);
250
- i0.ɵɵelementStart(40, "div", 63)(41, "span", 64);
251
- i0.ɵɵtext(42, "Last Sync");
431
+ i0.ɵɵconditionalCreate(37, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_37_Template, 5, 1, "div", 119);
432
+ i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 119);
433
+ i0.ɵɵelementStart(39, "div", 116)(40, "span", 117);
434
+ i0.ɵɵtext(41, "Last Sync");
252
435
  i0.ɵɵelementEnd();
253
- i0.ɵɵelementStart(43, "span", 65);
254
- i0.ɵɵtext(44);
436
+ i0.ɵɵelementStart(42, "span", 118);
437
+ i0.ɵɵtext(43);
255
438
  i0.ɵɵelementEnd()()()();
256
- i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template, 7, 2, "div", 67);
439
+ i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 120);
257
440
  i0.ɵɵelementEnd();
258
441
  } if (rf & 2) {
259
- let tmp_16_0;
260
- const server_r9 = ctx.$implicit;
261
- const ctx_r1 = i0.ɵɵnextContext(4);
262
- i0.ɵɵclassProp("expanded", ctx_r1.isServerExpanded(server_r9));
442
+ const server_r26 = ctx.$implicit;
443
+ const ctx_r2 = i0.ɵɵnextContext(4);
444
+ i0.ɵɵclassProp("expanded", ctx_r2.isServerExpanded(server_r26));
263
445
  i0.ɵɵadvance(3);
264
- i0.ɵɵclassProp("rotated", ctx_r1.isServerExpanded(server_r9));
446
+ i0.ɵɵclassProp("rotated", ctx_r2.isServerExpanded(server_r26));
265
447
  i0.ɵɵadvance();
266
- i0.ɵɵclassMap(ctx_r1.getTransportIcon(server_r9.TransportType));
448
+ i0.ɵɵclassMap(ctx_r2.getTransportIcon(server_r26.TransportType));
449
+ i0.ɵɵadvance(2);
450
+ i0.ɵɵtextInterpolate(server_r26.Name);
267
451
  i0.ɵɵadvance();
268
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, server_r9.Name, (tmp_16_0 = i0.ɵɵpipeBind1(6, 18, ctx_r1.filters$)) == null ? null : tmp_16_0.searchTerm), i0.ɵɵsanitizeHtml);
269
- i0.ɵɵadvance(3);
270
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(server_r9.Status));
452
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(server_r26.Status));
271
453
  i0.ɵɵadvance();
272
- i0.ɵɵtextInterpolate1(" ", server_r9.Status, " ");
454
+ i0.ɵɵtextInterpolate1(" ", server_r26.Status, " ");
273
455
  i0.ɵɵadvance(7);
274
- i0.ɵɵconditional(server_r9.Description ? 16 : -1);
456
+ i0.ɵɵconditional(server_r26.Description ? 15 : -1);
275
457
  i0.ɵɵadvance(6);
276
- i0.ɵɵtextInterpolate(server_r9.TransportType);
458
+ i0.ɵɵtextInterpolate(server_r26.TransportType);
277
459
  i0.ɵɵadvance(5);
278
- i0.ɵɵtextInterpolate(server_r9.DefaultAuthType);
460
+ i0.ɵɵtextInterpolate(server_r26.DefaultAuthType);
279
461
  i0.ɵɵadvance(5);
280
- i0.ɵɵtextInterpolate(server_r9.ConnectionCount);
462
+ i0.ɵɵtextInterpolate(server_r26.ConnectionCount);
281
463
  i0.ɵɵadvance(5);
282
- i0.ɵɵtextInterpolate(server_r9.ToolCount);
464
+ i0.ɵɵtextInterpolate(server_r26.ToolCount);
283
465
  i0.ɵɵadvance();
284
- i0.ɵɵconditional(server_r9.ServerURL ? 38 : -1);
466
+ i0.ɵɵconditional(server_r26.ServerURL ? 37 : -1);
285
467
  i0.ɵɵadvance();
286
- i0.ɵɵconditional(server_r9.Command ? 39 : -1);
468
+ i0.ɵɵconditional(server_r26.Command ? 38 : -1);
287
469
  i0.ɵɵadvance(5);
288
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(server_r9.LastSyncAt));
470
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(server_r26.LastSyncAt));
289
471
  i0.ɵɵadvance();
290
- i0.ɵɵconditional(ctx_r1.isServerExpanded(server_r9) ? 45 : -1);
472
+ i0.ɵɵconditional(ctx_r2.isServerExpanded(server_r26) ? 44 : -1);
291
473
  } }
292
- function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
293
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template, 46, 23, "div", 48, _forTrack0);
474
+ function MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
475
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_For_1_Template, 45, 18, "div", 101, _forTrack0);
294
476
  } if (rf & 2) {
295
- const ctx_r1 = i0.ɵɵnextContext(3);
296
- i0.ɵɵrepeater(ctx_r1.filteredServers);
477
+ const ctx_r2 = i0.ɵɵnextContext(3);
478
+ i0.ɵɵrepeater(ctx_r2.filteredServers);
297
479
  } }
298
- function MCPDashboardComponent_Conditional_50_Case_0_Template(rf, ctx) { if (rf & 1) {
299
- i0.ɵɵelementStart(0, "div", 44);
300
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template, 2, 0);
480
+ function MCPDashboardComponent_Conditional_72_Case_0_Template(rf, ctx) { if (rf & 1) {
481
+ i0.ɵɵelementStart(0, "div", 97);
482
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_72_Case_0_Conditional_1_Template, 6, 0, "div", 100)(2, MCPDashboardComponent_Conditional_72_Case_0_Conditional_2_Template, 2, 0);
301
483
  i0.ɵɵelementEnd();
302
484
  } if (rf & 2) {
303
- const ctx_r1 = i0.ɵɵnextContext(2);
485
+ const ctx_r2 = i0.ɵɵnextContext(2);
304
486
  i0.ɵɵadvance();
305
- i0.ɵɵconditional(ctx_r1.filteredServers.length === 0 ? 1 : 2);
487
+ i0.ɵɵconditional(ctx_r2.filteredServers.length === 0 ? 1 : 2);
306
488
  } }
307
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
308
- const _r12 = i0.ɵɵgetCurrentView();
309
- i0.ɵɵelementStart(0, "div", 47);
310
- i0.ɵɵelement(1, "i", 14);
489
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
490
+ const _r29 = i0.ɵɵgetCurrentView();
491
+ i0.ɵɵelementStart(0, "div", 100);
492
+ i0.ɵɵelement(1, "i", 41);
311
493
  i0.ɵɵelementStart(2, "p");
312
494
  i0.ɵɵtext(3, "No connections configured");
313
495
  i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(4, "button", 31);
315
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createConnection()); });
496
+ i0.ɵɵelementStart(4, "button", 68);
497
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createConnection()); });
316
498
  i0.ɵɵtext(5, " Add Your First Connection ");
317
499
  i0.ɵɵelementEnd()();
318
500
  } }
319
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
320
- i0.ɵɵelement(0, "i", 81);
501
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
502
+ i0.ɵɵelement(0, "i", 134);
321
503
  } }
322
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
323
- i0.ɵɵelement(0, "i", 40);
504
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
505
+ i0.ɵɵelement(0, "i", 77);
324
506
  } }
325
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
326
- i0.ɵɵelementStart(0, "div", 82);
327
- i0.ɵɵelement(1, "i", 85);
328
- i0.ɵɵelementStart(2, "span", 86);
507
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
508
+ i0.ɵɵelementStart(0, "div", 135);
509
+ i0.ɵɵelement(1, "i", 138);
510
+ i0.ɵɵelementStart(2, "span", 139);
329
511
  i0.ɵɵtext(3);
330
512
  i0.ɵɵelementEnd()();
331
513
  } if (rf & 2) {
332
- const conn_r14 = i0.ɵɵnextContext().$implicit;
333
- const ctx_r1 = i0.ɵɵnextContext(4);
514
+ const conn_r31 = i0.ɵɵnextContext().$implicit;
515
+ const ctx_r2 = i0.ɵɵnextContext(4);
334
516
  i0.ɵɵadvance(3);
335
- i0.ɵɵtextInterpolate(ctx_r1.getSyncProgressMessage(conn_r14.ID) || "Syncing...");
517
+ i0.ɵɵtextInterpolate(ctx_r2.getSyncProgressMessage(conn_r31.ID) || "Syncing...");
336
518
  } }
337
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
338
- i0.ɵɵelement(0, "i", 88);
519
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
520
+ i0.ɵɵelement(0, "i", 141);
339
521
  i0.ɵɵelementStart(1, "span");
340
522
  i0.ɵɵtext(2);
341
523
  i0.ɵɵelementEnd();
342
524
  } if (rf & 2) {
343
- let tmp_15_0;
344
- const conn_r14 = i0.ɵɵnextContext(2).$implicit;
345
- const ctx_r1 = i0.ɵɵnextContext(4);
525
+ let tmp_16_0;
526
+ const conn_r31 = i0.ɵɵnextContext(2).$implicit;
527
+ const ctx_r2 = i0.ɵɵnextContext(4);
346
528
  i0.ɵɵadvance(2);
347
- i0.ɵɵtextInterpolate3("Synced: ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Added, " added, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Updated, " updated, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Deprecated, " deprecated ");
529
+ i0.ɵɵtextInterpolate3("Synced: ", (tmp_16_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Added, " added, ", (tmp_16_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Updated, " updated, ", (tmp_16_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Deprecated, " deprecated ");
348
530
  } }
349
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
350
- i0.ɵɵelement(0, "i", 89);
531
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
532
+ i0.ɵɵelement(0, "i", 142);
351
533
  i0.ɵɵelementStart(1, "span");
352
534
  i0.ɵɵtext(2);
353
535
  i0.ɵɵelementEnd();
354
536
  } if (rf & 2) {
355
- let tmp_15_0;
356
- const conn_r14 = i0.ɵɵnextContext(2).$implicit;
357
- const ctx_r1 = i0.ɵɵnextContext(4);
537
+ let tmp_16_0;
538
+ const conn_r31 = i0.ɵɵnextContext(2).$implicit;
539
+ const ctx_r2 = i0.ɵɵnextContext(4);
358
540
  i0.ɵɵadvance(2);
359
- i0.ɵɵtextInterpolate((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.ErrorMessage);
541
+ i0.ɵɵtextInterpolate((tmp_16_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.ErrorMessage);
360
542
  } }
361
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
362
- i0.ɵɵelementStart(0, "div", 87);
363
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template, 3, 1);
543
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
544
+ i0.ɵɵelementStart(0, "div", 140);
545
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Conditional_2_Template, 3, 1);
364
546
  i0.ɵɵelementEnd();
365
547
  } if (rf & 2) {
366
- let tmp_14_0;
367
548
  let tmp_15_0;
368
549
  let tmp_16_0;
369
- const conn_r14 = i0.ɵɵnextContext().$implicit;
370
- const ctx_r1 = i0.ɵɵnextContext(4);
371
- i0.ɵɵclassProp("success", (tmp_14_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_14_0.lastResult == null ? null : tmp_14_0.lastResult.Success)("error", !((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Success));
550
+ let tmp_17_0;
551
+ const conn_r31 = i0.ɵɵnextContext().$implicit;
552
+ const ctx_r2 = i0.ɵɵnextContext(4);
553
+ i0.ɵɵclassProp("success", (tmp_15_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Success)("error", !((tmp_16_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Success));
372
554
  i0.ɵɵadvance();
373
- i0.ɵɵconditional(((tmp_16_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Success) ? 1 : 2);
555
+ i0.ɵɵconditional(((tmp_17_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_17_0.lastResult == null ? null : tmp_17_0.lastResult.Success) ? 1 : 2);
374
556
  } }
375
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
376
- i0.ɵɵelement(0, "p", 61);
377
- i0.ɵɵpipe(1, "async");
378
- i0.ɵɵpipe(2, "highlightSearch");
557
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
558
+ i0.ɵɵelementStart(0, "p", 114);
559
+ i0.ɵɵtext(1);
560
+ i0.ɵɵelementEnd();
379
561
  } if (rf & 2) {
380
- let tmp_14_0;
381
- const conn_r14 = i0.ɵɵnextContext().$implicit;
382
- const ctx_r1 = i0.ɵɵnextContext(4);
383
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, conn_r14.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
562
+ const conn_r31 = i0.ɵɵnextContext().$implicit;
563
+ i0.ɵɵadvance();
564
+ i0.ɵɵtextInterpolate(conn_r31.Description);
384
565
  } }
385
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
386
- i0.ɵɵelementStart(0, "div", 84)(1, "span", 64);
566
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
567
+ i0.ɵɵelementStart(0, "div", 137)(1, "span", 117);
387
568
  i0.ɵɵtext(2, "Last Error");
388
569
  i0.ɵɵelementEnd();
389
- i0.ɵɵelementStart(3, "span", 65);
570
+ i0.ɵɵelementStart(3, "span", 118);
390
571
  i0.ɵɵtext(4);
391
572
  i0.ɵɵelementEnd()();
392
573
  } if (rf & 2) {
393
- const conn_r14 = i0.ɵɵnextContext().$implicit;
574
+ const conn_r31 = i0.ɵɵnextContext().$implicit;
394
575
  i0.ɵɵadvance(4);
395
- i0.ɵɵtextInterpolate(conn_r14.LastErrorMessage);
576
+ i0.ɵɵtextInterpolate(conn_r31.LastErrorMessage);
396
577
  } }
397
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
398
- i0.ɵɵelementStart(0, "div", 71);
399
- i0.ɵɵelement(1, "i", 73);
578
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_5_Template(rf, ctx) { if (rf & 1) {
579
+ i0.ɵɵelementStart(0, "div", 124);
580
+ i0.ɵɵelement(1, "i", 126);
400
581
  i0.ɵɵtext(2, " No tools discovered yet. Click the sync button to discover tools. ");
401
582
  i0.ɵɵelementEnd();
402
583
  } }
403
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
404
- const _r15 = i0.ɵɵgetCurrentView();
405
- i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
584
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
585
+ const _r32 = i0.ɵɵgetCurrentView();
586
+ i0.ɵɵelementStart(0, "div", 127)(1, "div", 128)(2, "span", 129);
406
587
  i0.ɵɵtext(3);
407
588
  i0.ɵɵelementEnd();
408
- i0.ɵɵelementStart(4, "span", 77);
409
- i0.ɵɵelement(5, "i", 78);
589
+ i0.ɵɵelementStart(4, "span", 130);
590
+ i0.ɵɵelement(5, "i", 131);
410
591
  i0.ɵɵtext(6);
411
592
  i0.ɵɵelementEnd()();
412
- i0.ɵɵelementStart(7, "button", 90);
413
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r16 = i0.ɵɵrestoreView(_r15).$implicit; const conn_r14 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.runToolFromCard(tool_r16, conn_r14); return i0.ɵɵresetView($event.stopPropagation()); });
414
- i0.ɵɵelement(8, "i", 38);
593
+ i0.ɵɵelementStart(7, "button", 143);
594
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r33 = i0.ɵɵrestoreView(_r32).$implicit; const conn_r31 = i0.ɵɵnextContext(3).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.runToolFromCard(tool_r33, conn_r31); return i0.ɵɵresetView($event.stopPropagation()); });
595
+ i0.ɵɵelement(8, "i", 75);
415
596
  i0.ɵɵelementEnd()();
416
597
  } if (rf & 2) {
417
- const tool_r16 = ctx.$implicit;
418
- const ctx_r1 = i0.ɵɵnextContext(7);
598
+ const tool_r33 = ctx.$implicit;
599
+ const ctx_r2 = i0.ɵɵnextContext(7);
419
600
  i0.ɵɵadvance(3);
420
- i0.ɵɵtextInterpolate(tool_r16.ToolTitle || tool_r16.ToolName);
601
+ i0.ɵɵtextInterpolate(tool_r33.ToolTitle || tool_r33.ToolName);
421
602
  i0.ɵɵadvance(3);
422
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r16), " params ");
603
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getParamCount(tool_r33), " params ");
423
604
  } }
424
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelementStart(0, "div", 72);
426
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
605
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_Template(rf, ctx) { if (rf & 1) {
606
+ i0.ɵɵelementStart(0, "div", 125);
607
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template, 9, 2, "div", 127, _forTrack0);
427
608
  i0.ɵɵelementEnd();
428
609
  } if (rf & 2) {
429
- const conn_r14 = i0.ɵɵnextContext(2).$implicit;
430
- const ctx_r1 = i0.ɵɵnextContext(4);
610
+ const conn_r31 = i0.ɵɵnextContext(2).$implicit;
611
+ const ctx_r2 = i0.ɵɵnextContext(4);
431
612
  i0.ɵɵadvance();
432
- i0.ɵɵrepeater(ctx_r1.getToolsForConnection(conn_r14.ID));
613
+ i0.ɵɵrepeater(ctx_r2.getToolsForConnection(conn_r31.ID));
433
614
  } }
434
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
435
- i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
436
- i0.ɵɵelement(2, "i", 15);
615
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
616
+ i0.ɵɵelementStart(0, "div", 120)(1, "div", 123);
617
+ i0.ɵɵelement(2, "i", 42);
437
618
  i0.ɵɵelementStart(3, "span");
438
619
  i0.ɵɵtext(4);
439
620
  i0.ɵɵelementEnd()();
440
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 72);
621
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_5_Template, 3, 0, "div", 124)(6, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_Template, 3, 0, "div", 125);
441
622
  i0.ɵɵelementEnd();
442
623
  } if (rf & 2) {
443
- const conn_r14 = i0.ɵɵnextContext().$implicit;
444
- const ctx_r1 = i0.ɵɵnextContext(4);
624
+ const conn_r31 = i0.ɵɵnextContext().$implicit;
625
+ const ctx_r2 = i0.ɵɵnextContext(4);
445
626
  i0.ɵɵadvance(4);
446
- i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForConnection(conn_r14.ID).length, ")");
447
- i0.ɵɵadvance();
448
- i0.ɵɵconditional(ctx_r1.getToolsForConnection(conn_r14.ID).length === 0 ? 5 : 6);
449
- } }
450
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
451
- const _r13 = i0.ɵɵgetCurrentView();
452
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
453
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_1_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleConnectionExpand(conn_r14)); });
454
- i0.ɵɵelementStart(2, "div", 51);
455
- i0.ɵɵelement(3, "i", 52)(4, "i", 14)(5, "span", 53);
456
- i0.ɵɵpipe(6, "async");
457
- i0.ɵɵpipe(7, "highlightSearch");
458
- i0.ɵɵelementStart(8, "span", 54);
459
- i0.ɵɵtext(9);
627
+ i0.ɵɵtextInterpolate1("Available Tools (", ctx_r2.getToolsForConnection(conn_r31.ID).length, ")");
628
+ i0.ɵɵadvance();
629
+ i0.ɵɵconditional(ctx_r2.getToolsForConnection(conn_r31.ID).length === 0 ? 5 : 6);
630
+ } }
631
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
632
+ const _r30 = i0.ɵɵgetCurrentView();
633
+ i0.ɵɵelementStart(0, "div", 102)(1, "div", 103);
634
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template_div_click_1_listener() { const conn_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.toggleConnectionExpand(conn_r31)); });
635
+ i0.ɵɵelementStart(2, "div", 104);
636
+ i0.ɵɵelement(3, "i", 105)(4, "i", 41);
637
+ i0.ɵɵelementStart(5, "span", 106);
638
+ i0.ɵɵtext(6);
639
+ i0.ɵɵelementEnd();
640
+ i0.ɵɵelementStart(7, "span", 107);
641
+ i0.ɵɵtext(8);
460
642
  i0.ɵɵelementEnd()();
461
- i0.ɵɵelementStart(10, "div", 55);
462
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
463
- i0.ɵɵelementStart(11, "button", 80);
464
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_11_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.syncConnectionTools(conn_r14)); });
465
- i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 81)(13, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template, 1, 0, "i", 40);
643
+ i0.ɵɵelementStart(9, "div", 108);
644
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template_div_click_9_listener($event) { i0.ɵɵrestoreView(_r30); return i0.ɵɵresetView($event.stopPropagation()); });
645
+ i0.ɵɵelementStart(10, "button", 133);
646
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template_button_click_10_listener() { const conn_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.syncConnectionTools(conn_r31)); });
647
+ i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_11_Template, 1, 0, "i", 134)(12, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 77);
466
648
  i0.ɵɵelementEnd();
467
- i0.ɵɵelementStart(14, "button", 56);
468
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_14_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editConnection(conn_r14)); });
469
- i0.ɵɵelement(15, "i", 57);
649
+ i0.ɵɵelementStart(13, "button", 109);
650
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template_button_click_13_listener() { const conn_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.editConnection(conn_r31)); });
651
+ i0.ɵɵelement(14, "i", 110);
470
652
  i0.ɵɵelementEnd();
471
- i0.ɵɵelementStart(16, "button", 58);
472
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_16_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteConnection(conn_r14)); });
473
- i0.ɵɵelement(17, "i", 59);
653
+ i0.ɵɵelementStart(15, "button", 111);
654
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template_button_click_15_listener() { const conn_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.deleteConnection(conn_r31)); });
655
+ i0.ɵɵelement(16, "i", 112);
474
656
  i0.ɵɵelementEnd()()();
475
- i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template, 4, 1, "div", 82);
476
- i0.ɵɵconditionalCreate(19, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template, 3, 5, "div", 83);
477
- i0.ɵɵelementStart(20, "div", 60);
478
- i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template, 3, 6, "p", 61);
479
- i0.ɵɵelementStart(22, "div", 62)(23, "div", 63)(24, "span", 64);
480
- i0.ɵɵtext(25, "Server");
657
+ i0.ɵɵconditionalCreate(17, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_17_Template, 4, 1, "div", 135);
658
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_18_Template, 3, 5, "div", 136);
659
+ i0.ɵɵelementStart(19, "div", 113);
660
+ i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_20_Template, 2, 1, "p", 114);
661
+ i0.ɵɵelementStart(21, "div", 115)(22, "div", 116)(23, "span", 117);
662
+ i0.ɵɵtext(24, "Server");
481
663
  i0.ɵɵelementEnd();
482
- i0.ɵɵelementStart(26, "span", 65);
483
- i0.ɵɵtext(27);
664
+ i0.ɵɵelementStart(25, "span", 118);
665
+ i0.ɵɵtext(26);
484
666
  i0.ɵɵelementEnd()();
485
- i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
486
- i0.ɵɵtext(30, "Auto Sync");
667
+ i0.ɵɵelementStart(27, "div", 116)(28, "span", 117);
668
+ i0.ɵɵtext(29, "Auto Sync");
487
669
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(31, "span", 65);
489
- i0.ɵɵtext(32);
670
+ i0.ɵɵelementStart(30, "span", 118);
671
+ i0.ɵɵtext(31);
490
672
  i0.ɵɵelementEnd()();
491
- i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
492
- i0.ɵɵtext(35, "Logging");
673
+ i0.ɵɵelementStart(32, "div", 116)(33, "span", 117);
674
+ i0.ɵɵtext(34, "Logging");
493
675
  i0.ɵɵelementEnd();
494
- i0.ɵɵelementStart(36, "span", 65);
495
- i0.ɵɵtext(37);
676
+ i0.ɵɵelementStart(35, "span", 118);
677
+ i0.ɵɵtext(36);
496
678
  i0.ɵɵelementEnd()();
497
- i0.ɵɵelementStart(38, "div", 63)(39, "span", 64);
498
- i0.ɵɵtext(40, "Last Connected");
679
+ i0.ɵɵelementStart(37, "div", 116)(38, "span", 117);
680
+ i0.ɵɵtext(39, "Last Connected");
499
681
  i0.ɵɵelementEnd();
500
- i0.ɵɵelementStart(41, "span", 65);
501
- i0.ɵɵtext(42);
682
+ i0.ɵɵelementStart(40, "span", 118);
683
+ i0.ɵɵtext(41);
502
684
  i0.ɵɵelementEnd()();
503
- i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template, 5, 1, "div", 84);
685
+ i0.ɵɵconditionalCreate(42, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_42_Template, 5, 1, "div", 137);
504
686
  i0.ɵɵelementEnd()();
505
- i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 67);
687
+ i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Conditional_43_Template, 7, 2, "div", 120);
506
688
  i0.ɵɵelementEnd();
507
689
  } if (rf & 2) {
508
- let tmp_15_0;
509
- let tmp_21_0;
510
- const conn_r14 = ctx.$implicit;
511
- const ctx_r1 = i0.ɵɵnextContext(4);
512
- i0.ɵɵclassProp("expanded", ctx_r1.isConnectionExpanded(conn_r14));
690
+ let tmp_22_0;
691
+ const conn_r31 = ctx.$implicit;
692
+ const ctx_r2 = i0.ɵɵnextContext(4);
693
+ i0.ɵɵclassProp("expanded", ctx_r2.isConnectionExpanded(conn_r31));
513
694
  i0.ɵɵadvance(3);
514
- i0.ɵɵclassProp("rotated", ctx_r1.isConnectionExpanded(conn_r14));
515
- i0.ɵɵadvance(2);
516
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, conn_r14.Name, (tmp_15_0 = i0.ɵɵpipeBind1(6, 18, ctx_r1.filters$)) == null ? null : tmp_15_0.searchTerm), i0.ɵɵsanitizeHtml);
695
+ i0.ɵɵclassProp("rotated", ctx_r2.isConnectionExpanded(conn_r31));
517
696
  i0.ɵɵadvance(3);
518
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(conn_r14.Status));
697
+ i0.ɵɵtextInterpolate(conn_r31.Name);
698
+ i0.ɵɵadvance();
699
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(conn_r31.Status));
519
700
  i0.ɵɵadvance();
520
- i0.ɵɵtextInterpolate1(" ", conn_r14.Status, " ");
701
+ i0.ɵɵtextInterpolate1(" ", conn_r31.Status, " ");
521
702
  i0.ɵɵadvance(2);
522
- i0.ɵɵproperty("disabled", ctx_r1.isSyncing(conn_r14.ID));
703
+ i0.ɵɵproperty("disabled", ctx_r2.isSyncing(conn_r31.ID));
523
704
  i0.ɵɵadvance();
524
- i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 12 : 13);
705
+ i0.ɵɵconditional(ctx_r2.isSyncing(conn_r31.ID) ? 11 : 12);
525
706
  i0.ɵɵadvance(6);
526
- i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 18 : -1);
707
+ i0.ɵɵconditional(ctx_r2.isSyncing(conn_r31.ID) ? 17 : -1);
527
708
  i0.ɵɵadvance();
528
- i0.ɵɵconditional(((tmp_21_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_21_0.lastResult) && !ctx_r1.isSyncing(conn_r14.ID) ? 19 : -1);
709
+ i0.ɵɵconditional(((tmp_22_0 = ctx_r2.getSyncState(conn_r31.ID)) == null ? null : tmp_22_0.lastResult) && !ctx_r2.isSyncing(conn_r31.ID) ? 18 : -1);
529
710
  i0.ɵɵadvance(2);
530
- i0.ɵɵconditional(conn_r14.Description ? 21 : -1);
711
+ i0.ɵɵconditional(conn_r31.Description ? 20 : -1);
531
712
  i0.ɵɵadvance(6);
532
- i0.ɵɵtextInterpolate(conn_r14.ServerName);
713
+ i0.ɵɵtextInterpolate(conn_r31.ServerName);
533
714
  i0.ɵɵadvance(5);
534
- i0.ɵɵtextInterpolate(conn_r14.AutoSyncTools ? "Yes" : "No");
715
+ i0.ɵɵtextInterpolate(conn_r31.AutoSyncTools ? "Yes" : "No");
535
716
  i0.ɵɵadvance(5);
536
- i0.ɵɵtextInterpolate(conn_r14.LogToolCalls ? "Enabled" : "Disabled");
717
+ i0.ɵɵtextInterpolate(conn_r31.LogToolCalls ? "Enabled" : "Disabled");
537
718
  i0.ɵɵadvance(5);
538
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(conn_r14.LastConnectedAt));
719
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(conn_r31.LastConnectedAt));
539
720
  i0.ɵɵadvance();
540
- i0.ɵɵconditional(conn_r14.LastErrorMessage ? 43 : -1);
721
+ i0.ɵɵconditional(conn_r31.LastErrorMessage ? 42 : -1);
541
722
  i0.ɵɵadvance();
542
- i0.ɵɵconditional(ctx_r1.isConnectionExpanded(conn_r14) ? 44 : -1);
723
+ i0.ɵɵconditional(ctx_r2.isConnectionExpanded(conn_r31) ? 43 : -1);
543
724
  } }
544
- function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
545
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template, 45, 23, "div", 48, _forTrack0);
725
+ function MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
726
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_For_1_Template, 44, 18, "div", 101, _forTrack0);
546
727
  } if (rf & 2) {
547
- const ctx_r1 = i0.ɵɵnextContext(3);
548
- i0.ɵɵrepeater(ctx_r1.filteredConnections);
728
+ const ctx_r2 = i0.ɵɵnextContext(3);
729
+ i0.ɵɵrepeater(ctx_r2.filteredConnections);
549
730
  } }
550
- function MCPDashboardComponent_Conditional_50_Case_1_Template(rf, ctx) { if (rf & 1) {
551
- i0.ɵɵelementStart(0, "div", 45);
552
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template, 2, 0);
731
+ function MCPDashboardComponent_Conditional_72_Case_1_Template(rf, ctx) { if (rf & 1) {
732
+ i0.ɵɵelementStart(0, "div", 98);
733
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_72_Case_1_Conditional_1_Template, 6, 0, "div", 100)(2, MCPDashboardComponent_Conditional_72_Case_1_Conditional_2_Template, 2, 0);
553
734
  i0.ɵɵelementEnd();
554
735
  } if (rf & 2) {
555
- const ctx_r1 = i0.ɵɵnextContext(2);
736
+ const ctx_r2 = i0.ɵɵnextContext(2);
556
737
  i0.ɵɵadvance();
557
- i0.ɵɵconditional(ctx_r1.filteredConnections.length === 0 ? 1 : 2);
738
+ i0.ɵɵconditional(ctx_r2.filteredConnections.length === 0 ? 1 : 2);
558
739
  } }
559
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
560
- i0.ɵɵelementStart(0, "div", 47);
561
- i0.ɵɵelement(1, "i", 15);
740
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
741
+ i0.ɵɵelementStart(0, "span");
742
+ i0.ɵɵtext(1);
743
+ i0.ɵɵelementEnd();
744
+ } if (rf & 2) {
745
+ const ctx_r2 = i0.ɵɵnextContext(3);
746
+ i0.ɵɵadvance();
747
+ i0.ɵɵtextInterpolate2("\u00B7 Showing ", ctx_r2.pagedTools.length, " of ", ctx_r2.toolsTotalCount);
748
+ } }
749
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_For_10_Template(rf, ctx) { if (rf & 1) {
750
+ const _r36 = i0.ɵɵgetCurrentView();
751
+ i0.ɵɵelementStart(0, "div", 149);
752
+ i0.ɵɵelement(1, "i", 151);
753
+ i0.ɵɵelementStart(2, "div", 152)(3, "div", 153);
754
+ i0.ɵɵtext(4);
755
+ i0.ɵɵelementEnd();
756
+ i0.ɵɵelementStart(5, "div", 154);
757
+ i0.ɵɵtext(6);
758
+ i0.ɵɵelementEnd()();
759
+ i0.ɵɵelementStart(7, "button", 155);
760
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_For_10_Template_button_click_7_listener($event) { const tool_r37 = i0.ɵɵrestoreView(_r36).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.toggleFavorite(tool_r37.ID, $event)); });
761
+ i0.ɵɵelement(8, "i");
762
+ i0.ɵɵelementEnd();
763
+ i0.ɵɵelementStart(9, "span", 156);
764
+ i0.ɵɵtext(10);
765
+ i0.ɵɵelementEnd()();
766
+ } if (rf & 2) {
767
+ const tool_r37 = ctx.$implicit;
768
+ const ctx_r2 = i0.ɵɵnextContext(4);
769
+ i0.ɵɵadvance(4);
770
+ i0.ɵɵtextInterpolate(tool_r37.ToolTitle || tool_r37.ToolName);
771
+ i0.ɵɵadvance(2);
772
+ i0.ɵɵtextInterpolate2("", tool_r37.ServerName, " \u00B7 ", tool_r37.ToolName);
773
+ i0.ɵɵadvance();
774
+ i0.ɵɵstyleProp("color", ctx_r2.isFavorited(tool_r37.ID) ? "var(--mj-status-warning, #f59e0b)" : "var(--mj-text-muted, #bbb)");
775
+ i0.ɵɵproperty("title", ctx_r2.isFavorited(tool_r37.ID) ? "Unfavorite" : "Favorite");
776
+ i0.ɵɵadvance();
777
+ i0.ɵɵclassMap(ctx_r2.isFavorited(tool_r37.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
778
+ i0.ɵɵadvance();
779
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(tool_r37.Status));
780
+ i0.ɵɵadvance();
781
+ i0.ɵɵtextInterpolate(tool_r37.Status);
782
+ } }
783
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_Conditional_11_Template(rf, ctx) { if (rf & 1) {
784
+ i0.ɵɵelementStart(0, "div", 150);
785
+ i0.ɵɵtext(1, "Loading more\u2026");
786
+ i0.ɵɵelementEnd();
787
+ } }
788
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
789
+ const _r35 = i0.ɵɵgetCurrentView();
790
+ i0.ɵɵelementStart(0, "div", 147);
791
+ i0.ɵɵtext(1, " Showing ");
792
+ i0.ɵɵelementStart(2, "strong");
793
+ i0.ɵɵtext(3);
794
+ i0.ɵɵelementEnd();
795
+ i0.ɵɵtext(4, " of ");
796
+ i0.ɵɵelementStart(5, "strong");
797
+ i0.ɵɵtext(6);
798
+ i0.ɵɵelementEnd();
799
+ i0.ɵɵtext(7, " tools ");
800
+ i0.ɵɵelementEnd();
801
+ i0.ɵɵelementStart(8, "div", 148);
802
+ i0.ɵɵlistener("scroll", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_Template_div_scroll_8_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onToolsScrollNative($event)); });
803
+ i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_For_10_Template, 11, 10, "div", 149, _forTrack0);
804
+ i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_Conditional_11_Template, 2, 0, "div", 150);
805
+ i0.ɵɵelementEnd();
806
+ } if (rf & 2) {
807
+ const ctx_r2 = i0.ɵɵnextContext(3);
808
+ i0.ɵɵadvance(3);
809
+ i0.ɵɵtextInterpolate(ctx_r2.visiblePagedTools.length);
810
+ i0.ɵɵadvance(3);
811
+ i0.ɵɵtextInterpolate(ctx_r2.scaleDenominator());
812
+ i0.ɵɵadvance(3);
813
+ i0.ɵɵrepeater(ctx_r2.visiblePagedTools);
814
+ i0.ɵɵadvance(2);
815
+ i0.ɵɵconditional(ctx_r2.toolsLoading ? 11 : -1);
816
+ } }
817
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
818
+ i0.ɵɵelementStart(0, "div", 100);
819
+ i0.ɵɵelement(1, "i", 42);
562
820
  i0.ɵɵelementStart(2, "p");
563
821
  i0.ɵɵtext(3, "No tools discovered yet");
564
822
  i0.ɵɵelementEnd();
565
- i0.ɵɵelementStart(4, "span", 92);
823
+ i0.ɵɵelementStart(4, "span", 157);
566
824
  i0.ɵɵtext(5, "Tools are discovered when connections sync with MCP servers");
567
825
  i0.ɵɵelementEnd()();
568
826
  } }
569
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
570
- i0.ɵɵelement(0, "p", 111);
571
- i0.ɵɵpipe(1, "async");
572
- i0.ɵɵpipe(2, "highlightSearch");
827
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
828
+ i0.ɵɵelementStart(0, "p", 175);
829
+ i0.ɵɵtext(1);
830
+ i0.ɵɵelementEnd();
573
831
  } if (rf & 2) {
574
- let tmp_26_0;
575
- const tool_r20 = i0.ɵɵnextContext().$implicit;
576
- const ctx_r1 = i0.ɵɵnextContext(7);
577
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, tool_r20.ToolDescription, (tmp_26_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
832
+ const tool_r41 = i0.ɵɵnextContext().$implicit;
833
+ i0.ɵɵadvance();
834
+ i0.ɵɵtextInterpolate(tool_r41.ToolDescription);
578
835
  } }
579
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template(rf, ctx) { if (rf & 1) {
580
- i0.ɵɵelementStart(0, "div", 120)(1, "span", 117);
836
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Conditional_21_Template(rf, ctx) { if (rf & 1) {
837
+ i0.ɵɵelementStart(0, "div", 184)(1, "span", 181);
581
838
  i0.ɵɵtext(2, "Input Schema:");
582
839
  i0.ɵɵelementEnd();
583
- i0.ɵɵelementStart(3, "pre", 121);
840
+ i0.ɵɵelementStart(3, "pre", 185);
584
841
  i0.ɵɵtext(4);
585
842
  i0.ɵɵelementEnd()();
586
843
  } if (rf & 2) {
587
- const tool_r20 = i0.ɵɵnextContext(2).$implicit;
588
- const ctx_r1 = i0.ɵɵnextContext(7);
844
+ const tool_r41 = i0.ɵɵnextContext(2).$implicit;
845
+ const ctx_r2 = i0.ɵɵnextContext(7);
589
846
  i0.ɵɵadvance(4);
590
- i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r20));
847
+ i0.ɵɵtextInterpolate(ctx_r2.getFormattedInputSchema(tool_r41));
591
848
  } }
592
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
593
- i0.ɵɵelementStart(0, "div", 115)(1, "div", 116)(2, "span", 117);
849
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
850
+ i0.ɵɵelementStart(0, "div", 179)(1, "div", 180)(2, "span", 181);
594
851
  i0.ɵɵtext(3, "Tool Name:");
595
852
  i0.ɵɵelementEnd();
596
- i0.ɵɵelementStart(4, "span", 118);
853
+ i0.ɵɵelementStart(4, "span", 182);
597
854
  i0.ɵɵtext(5);
598
855
  i0.ɵɵelementEnd()();
599
- i0.ɵɵelementStart(6, "div", 116)(7, "span", 117);
856
+ i0.ɵɵelementStart(6, "div", 180)(7, "span", 181);
600
857
  i0.ɵɵtext(8, "Parameters:");
601
858
  i0.ɵɵelementEnd();
602
- i0.ɵɵelementStart(9, "span", 119);
859
+ i0.ɵɵelementStart(9, "span", 183);
603
860
  i0.ɵɵtext(10);
604
861
  i0.ɵɵelementEnd()();
605
- i0.ɵɵelementStart(11, "div", 116)(12, "span", 117);
862
+ i0.ɵɵelementStart(11, "div", 180)(12, "span", 181);
606
863
  i0.ɵɵtext(13, "Discovered:");
607
864
  i0.ɵɵelementEnd();
608
- i0.ɵɵelementStart(14, "span", 119);
865
+ i0.ɵɵelementStart(14, "span", 183);
609
866
  i0.ɵɵtext(15);
610
867
  i0.ɵɵelementEnd()();
611
- i0.ɵɵelementStart(16, "div", 116)(17, "span", 117);
868
+ i0.ɵɵelementStart(16, "div", 180)(17, "span", 181);
612
869
  i0.ɵɵtext(18, "Last Seen:");
613
870
  i0.ɵɵelementEnd();
614
- i0.ɵɵelementStart(19, "span", 119);
871
+ i0.ɵɵelementStart(19, "span", 183);
615
872
  i0.ɵɵtext(20);
616
873
  i0.ɵɵelementEnd()();
617
- i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template, 5, 1, "div", 120);
874
+ i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Conditional_21_Template, 5, 1, "div", 184);
618
875
  i0.ɵɵelementEnd();
619
876
  } if (rf & 2) {
620
- const tool_r20 = i0.ɵɵnextContext().$implicit;
621
- const ctx_r1 = i0.ɵɵnextContext(7);
877
+ const tool_r41 = i0.ɵɵnextContext().$implicit;
878
+ const ctx_r2 = i0.ɵɵnextContext(7);
622
879
  i0.ɵɵadvance(5);
623
- i0.ɵɵtextInterpolate(tool_r20.ToolName);
880
+ i0.ɵɵtextInterpolate(tool_r41.ToolName);
624
881
  i0.ɵɵadvance(5);
625
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getParamCount(tool_r20), " total, ", ctx_r1.getRequiredParamCount(tool_r20), " required ");
882
+ i0.ɵɵtextInterpolate2(" ", ctx_r2.getParamCount(tool_r41), " total, ", ctx_r2.getRequiredParamCount(tool_r41), " required ");
626
883
  i0.ɵɵadvance(5);
627
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.DiscoveredAt));
884
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r41.DiscoveredAt));
628
885
  i0.ɵɵadvance(5);
629
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.LastSeenAt));
886
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r41.LastSeenAt));
630
887
  i0.ɵɵadvance();
631
- i0.ɵɵconditional(tool_r20.InputSchema ? 21 : -1);
888
+ i0.ɵɵconditional(tool_r41.InputSchema ? 21 : -1);
632
889
  } }
633
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
634
- const _r19 = i0.ɵɵgetCurrentView();
635
- i0.ɵɵelementStart(0, "div", 106)(1, "div", 107);
636
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
637
- i0.ɵɵelementStart(2, "div", 108);
638
- i0.ɵɵelement(3, "i", 15)(4, "span", 53);
639
- i0.ɵɵpipe(5, "async");
640
- i0.ɵɵpipe(6, "highlightSearch");
641
- i0.ɵɵelementEnd();
642
- i0.ɵɵelementStart(7, "div", 109)(8, "span", 110);
643
- i0.ɵɵelement(9, "i", 78);
644
- i0.ɵɵtext(10);
890
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
891
+ const _r40 = i0.ɵɵgetCurrentView();
892
+ i0.ɵɵelementStart(0, "div", 170)(1, "div", 171);
893
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.toggleToolExpand(tool_r41)); });
894
+ i0.ɵɵelementStart(2, "div", 172);
895
+ i0.ɵɵelement(3, "i", 42);
896
+ i0.ɵɵelementStart(4, "span", 106);
897
+ i0.ɵɵtext(5);
898
+ i0.ɵɵelementEnd()();
899
+ i0.ɵɵelementStart(6, "div", 173)(7, "span", 174);
900
+ i0.ɵɵelement(8, "i", 131);
901
+ i0.ɵɵtext(9);
645
902
  i0.ɵɵelementEnd();
646
- i0.ɵɵelementStart(11, "span", 100);
647
- i0.ɵɵtext(12);
903
+ i0.ɵɵelementStart(10, "span", 156);
904
+ i0.ɵɵtext(11);
648
905
  i0.ɵɵelementEnd()()();
649
- i0.ɵɵconditionalCreate(13, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template, 3, 6, "p", 111);
650
- i0.ɵɵelementStart(14, "div", 112)(15, "button", 79);
651
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_15_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r20)); });
652
- i0.ɵɵelement(16, "i", 38);
653
- i0.ɵɵtext(17, " Test ");
654
- i0.ɵɵelementEnd();
655
- i0.ɵɵelementStart(18, "button", 113);
656
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_18_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
657
- i0.ɵɵelement(19, "i", 114);
658
- i0.ɵɵtext(20);
906
+ i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_12_Template, 2, 1, "p", 175);
907
+ i0.ɵɵelementStart(13, "div", 176)(14, "button", 155);
908
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_14_listener($event) { const tool_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.toggleFavorite(tool_r41.ID, $event)); });
909
+ i0.ɵɵelement(15, "i");
910
+ i0.ɵɵelementEnd();
911
+ i0.ɵɵelementStart(16, "button", 132);
912
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_16_listener() { const tool_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.openTestToolDialog(tool_r41)); });
913
+ i0.ɵɵelement(17, "i", 75);
914
+ i0.ɵɵtext(18, " Test ");
915
+ i0.ɵɵelementEnd();
916
+ i0.ɵɵelementStart(19, "button", 177);
917
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_19_listener() { const tool_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.toggleToolExpand(tool_r41)); });
918
+ i0.ɵɵelement(20, "i", 178);
919
+ i0.ɵɵtext(21);
659
920
  i0.ɵɵelementEnd()();
660
- i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template, 22, 6, "div", 115);
921
+ i0.ɵɵconditionalCreate(22, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Template, 22, 6, "div", 179);
661
922
  i0.ɵɵelementEnd();
662
923
  } if (rf & 2) {
663
- let tmp_26_0;
664
- const tool_r20 = ctx.$implicit;
665
- const ctx_r1 = i0.ɵɵnextContext(7);
666
- i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r20));
924
+ const tool_r41 = ctx.$implicit;
925
+ const ctx_r2 = i0.ɵɵnextContext(7);
926
+ i0.ɵɵclassProp("expanded", ctx_r2.isToolExpanded(tool_r41));
927
+ i0.ɵɵadvance(5);
928
+ i0.ɵɵtextInterpolate(tool_r41.ToolTitle || tool_r41.ToolName);
667
929
  i0.ɵɵadvance(4);
668
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 15, tool_r20.ToolTitle || tool_r20.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 13, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
669
- i0.ɵɵadvance(6);
670
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r20), " ");
930
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getParamCount(tool_r41), " ");
671
931
  i0.ɵɵadvance();
672
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r20.Status));
932
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(tool_r41.Status));
673
933
  i0.ɵɵadvance();
674
- i0.ɵɵtextInterpolate1(" ", tool_r20.Status, " ");
934
+ i0.ɵɵtextInterpolate1(" ", tool_r41.Status, " ");
675
935
  i0.ɵɵadvance();
676
- i0.ɵɵconditional(tool_r20.ToolDescription ? 13 : -1);
677
- i0.ɵɵadvance(6);
678
- i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r20))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r20));
936
+ i0.ɵɵconditional(tool_r41.ToolDescription ? 12 : -1);
937
+ i0.ɵɵadvance(2);
938
+ i0.ɵɵstyleProp("color", ctx_r2.isFavorited(tool_r41.ID) ? "var(--mj-status-warning, #f59e0b)" : "var(--mj-text-muted, #bbb)");
939
+ i0.ɵɵproperty("title", ctx_r2.isFavorited(tool_r41.ID) ? "Unfavorite" : "Favorite");
679
940
  i0.ɵɵadvance();
680
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isToolExpanded(tool_r20) ? "Less" : "More", " ");
941
+ i0.ɵɵclassMap(ctx_r2.isFavorited(tool_r41.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
942
+ i0.ɵɵadvance(5);
943
+ i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.isToolExpanded(tool_r41))("fa-chevron-up", ctx_r2.isToolExpanded(tool_r41));
944
+ i0.ɵɵadvance();
945
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.isToolExpanded(tool_r41) ? "Less" : "More", " ");
681
946
  i0.ɵɵadvance();
682
- i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r20) ? 21 : -1);
947
+ i0.ɵɵconditional(ctx_r2.isToolExpanded(tool_r41) ? 22 : -1);
683
948
  } }
684
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
685
- i0.ɵɵelementStart(0, "div", 103);
686
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template, 22, 18, "div", 105, _forTrack0);
949
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
950
+ i0.ɵɵelementStart(0, "div", 167);
951
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_For_2_Template, 23, 18, "div", 169, _forTrack0);
687
952
  i0.ɵɵelementEnd();
688
953
  } if (rf & 2) {
689
- const group_r18 = i0.ɵɵnextContext(2).$implicit;
954
+ const group_r39 = i0.ɵɵnextContext(2).$implicit;
690
955
  i0.ɵɵadvance();
691
- i0.ɵɵrepeater(group_r18.tools);
956
+ i0.ɵɵrepeater(group_r39.tools);
692
957
  } }
693
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template(rf, ctx) { if (rf & 1) {
694
- i0.ɵɵelementStart(0, "span", 125);
958
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_6_Template(rf, ctx) { if (rf & 1) {
959
+ i0.ɵɵelementStart(0, "span", 188);
695
960
  i0.ɵɵtext(1);
696
961
  i0.ɵɵelementEnd();
697
962
  } if (rf & 2) {
698
- const tool_r22 = i0.ɵɵnextContext().$implicit;
963
+ const tool_r43 = i0.ɵɵnextContext().$implicit;
699
964
  i0.ɵɵadvance();
700
- i0.ɵɵtextInterpolate(tool_r22.ToolName);
965
+ i0.ɵɵtextInterpolate(tool_r43.ToolName);
701
966
  } }
702
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
703
- i0.ɵɵelementStart(0, "div", 135)(1, "span", 117);
967
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
968
+ i0.ɵɵelementStart(0, "div", 199)(1, "span", 181);
704
969
  i0.ɵɵtext(2, "Input Schema:");
705
970
  i0.ɵɵelementEnd();
706
- i0.ɵɵelementStart(3, "pre", 121);
971
+ i0.ɵɵelementStart(3, "pre", 185);
707
972
  i0.ɵɵtext(4);
708
973
  i0.ɵɵelementEnd()();
709
974
  } if (rf & 2) {
710
- const tool_r22 = i0.ɵɵnextContext(2).$implicit;
711
- const ctx_r1 = i0.ɵɵnextContext(7);
975
+ const tool_r43 = i0.ɵɵnextContext(2).$implicit;
976
+ const ctx_r2 = i0.ɵɵnextContext(7);
712
977
  i0.ɵɵadvance(4);
713
- i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r22));
978
+ i0.ɵɵtextInterpolate(ctx_r2.getFormattedInputSchema(tool_r43));
714
979
  } }
715
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
716
- i0.ɵɵelementStart(0, "tr", 131)(1, "td", 132)(2, "div", 133)(3, "div", 134)(4, "span", 117);
980
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
981
+ i0.ɵɵelementStart(0, "tr", 195)(1, "td", 196)(2, "div", 197)(3, "div", 198)(4, "span", 181);
717
982
  i0.ɵɵtext(5, "Tool Name:");
718
983
  i0.ɵɵelementEnd();
719
- i0.ɵɵelementStart(6, "span", 118);
984
+ i0.ɵɵelementStart(6, "span", 182);
720
985
  i0.ɵɵtext(7);
721
986
  i0.ɵɵelementEnd()();
722
- i0.ɵɵelementStart(8, "div", 134)(9, "span", 117);
987
+ i0.ɵɵelementStart(8, "div", 198)(9, "span", 181);
723
988
  i0.ɵɵtext(10, "Discovered:");
724
989
  i0.ɵɵelementEnd();
725
- i0.ɵɵelementStart(11, "span", 119);
990
+ i0.ɵɵelementStart(11, "span", 183);
726
991
  i0.ɵɵtext(12);
727
992
  i0.ɵɵelementEnd()();
728
- i0.ɵɵelementStart(13, "div", 134)(14, "span", 117);
993
+ i0.ɵɵelementStart(13, "div", 198)(14, "span", 181);
729
994
  i0.ɵɵtext(15, "Required Params:");
730
995
  i0.ɵɵelementEnd();
731
- i0.ɵɵelementStart(16, "span", 119);
996
+ i0.ɵɵelementStart(16, "span", 183);
732
997
  i0.ɵɵtext(17);
733
998
  i0.ɵɵelementEnd()();
734
- i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 135);
999
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 199);
735
1000
  i0.ɵɵelementEnd()()();
736
1001
  } if (rf & 2) {
737
- const tool_r22 = i0.ɵɵnextContext().$implicit;
738
- const ctx_r1 = i0.ɵɵnextContext(7);
1002
+ const tool_r43 = i0.ɵɵnextContext().$implicit;
1003
+ const ctx_r2 = i0.ɵɵnextContext(7);
739
1004
  i0.ɵɵadvance(7);
740
- i0.ɵɵtextInterpolate(tool_r22.ToolName);
1005
+ i0.ɵɵtextInterpolate(tool_r43.ToolName);
741
1006
  i0.ɵɵadvance(5);
742
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.DiscoveredAt));
1007
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r43.DiscoveredAt));
743
1008
  i0.ɵɵadvance(5);
744
- i0.ɵɵtextInterpolate(ctx_r1.getRequiredParamCount(tool_r22));
1009
+ i0.ɵɵtextInterpolate(ctx_r2.getRequiredParamCount(tool_r43));
745
1010
  i0.ɵɵadvance();
746
- i0.ɵɵconditional(tool_r22.InputSchema ? 18 : -1);
1011
+ i0.ɵɵconditional(tool_r43.InputSchema ? 18 : -1);
747
1012
  } }
748
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
749
- const _r21 = i0.ɵɵgetCurrentView();
750
- i0.ɵɵelementStart(0, "tr")(1, "td", 122);
751
- i0.ɵɵelement(2, "i", 15);
752
- i0.ɵɵelementStart(3, "div", 123);
753
- i0.ɵɵelement(4, "span", 124);
754
- i0.ɵɵpipe(5, "async");
755
- i0.ɵɵpipe(6, "highlightSearch");
756
- i0.ɵɵconditionalCreate(7, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template, 2, 1, "span", 125);
757
- i0.ɵɵelementEnd()();
758
- i0.ɵɵelement(8, "td", 126);
759
- i0.ɵɵpipe(9, "async");
760
- i0.ɵɵpipe(10, "highlightSearch");
761
- i0.ɵɵelementStart(11, "td")(12, "span", 127);
762
- i0.ɵɵtext(13);
1013
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
1014
+ const _r42 = i0.ɵɵgetCurrentView();
1015
+ i0.ɵɵelementStart(0, "tr")(1, "td", 186);
1016
+ i0.ɵɵelement(2, "i", 42);
1017
+ i0.ɵɵelementStart(3, "div", 187)(4, "span", 172);
1018
+ i0.ɵɵtext(5);
1019
+ i0.ɵɵelementEnd();
1020
+ i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_6_Template, 2, 1, "span", 188);
763
1021
  i0.ɵɵelementEnd()();
764
- i0.ɵɵelementStart(14, "td")(15, "span", 100);
765
- i0.ɵɵtext(16);
1022
+ i0.ɵɵelementStart(7, "td", 189);
1023
+ i0.ɵɵtext(8);
1024
+ i0.ɵɵelementEnd();
1025
+ i0.ɵɵelementStart(9, "td")(10, "span", 190);
1026
+ i0.ɵɵtext(11);
766
1027
  i0.ɵɵelementEnd()();
767
- i0.ɵɵelementStart(17, "td");
768
- i0.ɵɵtext(18);
1028
+ i0.ɵɵelementStart(12, "td")(13, "span", 156);
1029
+ i0.ɵɵtext(14);
1030
+ i0.ɵɵelementEnd()();
1031
+ i0.ɵɵelementStart(15, "td");
1032
+ i0.ɵɵtext(16);
769
1033
  i0.ɵɵelementEnd();
770
- i0.ɵɵelementStart(19, "td", 128)(20, "button", 129);
771
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r22)); });
772
- i0.ɵɵelement(21, "i", 38);
1034
+ i0.ɵɵelementStart(17, "td", 191)(18, "button", 192);
1035
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_18_listener($event) { const tool_r43 = i0.ɵɵrestoreView(_r42).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.toggleFavorite(tool_r43.ID, $event)); });
1036
+ i0.ɵɵelement(19, "i");
773
1037
  i0.ɵɵelementEnd();
774
- i0.ɵɵelementStart(22, "button", 130);
775
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r22)); });
776
- i0.ɵɵelement(23, "i", 114);
1038
+ i0.ɵɵelementStart(20, "button", 193);
1039
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r43 = i0.ɵɵrestoreView(_r42).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.openTestToolDialog(tool_r43)); });
1040
+ i0.ɵɵelement(21, "i", 75);
1041
+ i0.ɵɵelementEnd();
1042
+ i0.ɵɵelementStart(22, "button", 194);
1043
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r43 = i0.ɵɵrestoreView(_r42).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.toggleToolExpand(tool_r43)); });
1044
+ i0.ɵɵelement(23, "i", 178);
777
1045
  i0.ɵɵelementEnd()()();
778
- i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 131);
1046
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 195);
779
1047
  } if (rf & 2) {
780
- let tmp_26_0;
781
- let tmp_28_0;
782
- const tool_r22 = ctx.$implicit;
783
- const ctx_r1 = i0.ɵɵnextContext(7);
784
- i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r22));
785
- i0.ɵɵadvance(4);
786
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 16, tool_r22.ToolTitle || tool_r22.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 14, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
787
- i0.ɵɵadvance(3);
788
- i0.ɵɵconditional(tool_r22.ToolTitle ? 7 : -1);
789
- i0.ɵɵadvance();
790
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(10, 21, tool_r22.ToolDescription || "-", (tmp_28_0 = i0.ɵɵpipeBind1(9, 19, ctx_r1.filters$)) == null ? null : tmp_28_0.searchTerm), i0.ɵɵsanitizeHtml);
1048
+ const tool_r43 = ctx.$implicit;
1049
+ const ctx_r2 = i0.ɵɵnextContext(7);
1050
+ i0.ɵɵclassProp("expanded", ctx_r2.isToolExpanded(tool_r43));
791
1051
  i0.ɵɵadvance(5);
792
- i0.ɵɵtextInterpolate(ctx_r1.getParamCount(tool_r22));
1052
+ i0.ɵɵtextInterpolate(tool_r43.ToolTitle || tool_r43.ToolName);
1053
+ i0.ɵɵadvance();
1054
+ i0.ɵɵconditional(tool_r43.ToolTitle ? 6 : -1);
793
1055
  i0.ɵɵadvance(2);
794
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r22.Status));
1056
+ i0.ɵɵtextInterpolate(tool_r43.ToolDescription || "-");
1057
+ i0.ɵɵadvance(3);
1058
+ i0.ɵɵtextInterpolate(ctx_r2.getParamCount(tool_r43));
1059
+ i0.ɵɵadvance(2);
1060
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(tool_r43.Status));
795
1061
  i0.ɵɵadvance();
796
- i0.ɵɵtextInterpolate1(" ", tool_r22.Status, " ");
1062
+ i0.ɵɵtextInterpolate1(" ", tool_r43.Status, " ");
797
1063
  i0.ɵɵadvance(2);
798
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.LastSeenAt));
799
- i0.ɵɵadvance(5);
800
- i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r22))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r22));
1064
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r43.LastSeenAt));
1065
+ i0.ɵɵadvance(2);
1066
+ i0.ɵɵstyleProp("color", ctx_r2.isFavorited(tool_r43.ID) ? "var(--mj-status-warning, #f59e0b)" : "var(--mj-text-muted, #bbb)");
1067
+ i0.ɵɵproperty("title", ctx_r2.isFavorited(tool_r43.ID) ? "Unfavorite" : "Favorite");
801
1068
  i0.ɵɵadvance();
802
- i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r22) ? 24 : -1);
1069
+ i0.ɵɵclassMap(ctx_r2.isFavorited(tool_r43.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
1070
+ i0.ɵɵadvance(4);
1071
+ i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.isToolExpanded(tool_r43))("fa-chevron-up", ctx_r2.isToolExpanded(tool_r43));
1072
+ i0.ɵɵadvance();
1073
+ i0.ɵɵconditional(ctx_r2.isToolExpanded(tool_r43) ? 24 : -1);
803
1074
  } }
804
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
805
- i0.ɵɵelementStart(0, "div", 104)(1, "table")(2, "thead")(3, "tr")(4, "th");
1075
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1076
+ i0.ɵɵelementStart(0, "div", 168)(1, "table")(2, "thead")(3, "tr")(4, "th");
806
1077
  i0.ɵɵtext(5, "Tool");
807
1078
  i0.ɵɵelementEnd();
808
1079
  i0.ɵɵelementStart(6, "th");
@@ -821,110 +1092,123 @@ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditi
821
1092
  i0.ɵɵtext(15, "Actions");
822
1093
  i0.ɵɵelementEnd()()();
823
1094
  i0.ɵɵelementStart(16, "tbody");
824
- i0.ɵɵrepeaterCreate(17, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template, 25, 24, null, null, _forTrack0);
1095
+ i0.ɵɵrepeaterCreate(17, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_For_18_Template, 25, 19, null, null, _forTrack0);
825
1096
  i0.ɵɵelementEnd()()();
826
1097
  } if (rf & 2) {
827
- const group_r18 = i0.ɵɵnextContext(2).$implicit;
1098
+ const group_r39 = i0.ɵɵnextContext(2).$implicit;
828
1099
  i0.ɵɵadvance(17);
829
- i0.ɵɵrepeater(group_r18.tools);
1100
+ i0.ɵɵrepeater(group_r39.tools);
830
1101
  } }
831
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
832
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 103)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 104);
1102
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1103
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 167)(1, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 168);
833
1104
  } if (rf & 2) {
834
- const ctx_r1 = i0.ɵɵnextContext(5);
835
- i0.ɵɵconditional(ctx_r1.ToolsViewMode === "card" ? 0 : 1);
1105
+ const ctx_r2 = i0.ɵɵnextContext(5);
1106
+ i0.ɵɵconditional(ctx_r2.ToolsViewMode === "card" ? 0 : 1);
836
1107
  } }
837
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
838
- const _r17 = i0.ɵɵgetCurrentView();
839
- i0.ɵɵelementStart(0, "div", 94)(1, "div", 95);
840
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_1_listener() { const group_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerGroup(group_r18)); });
841
- i0.ɵɵelementStart(2, "div", 96);
842
- i0.ɵɵelement(3, "i", 97)(4, "i");
843
- i0.ɵɵelementStart(5, "span", 98);
1108
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
1109
+ const _r38 = i0.ɵɵgetCurrentView();
1110
+ i0.ɵɵelementStart(0, "div", 159)(1, "div", 160);
1111
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Template_div_click_1_listener() { const group_r39 = i0.ɵɵrestoreView(_r38).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.toggleServerGroup(group_r39)); });
1112
+ i0.ɵɵelementStart(2, "div", 161);
1113
+ i0.ɵɵelement(3, "i", 162)(4, "i");
1114
+ i0.ɵɵelementStart(5, "span", 163);
844
1115
  i0.ɵɵtext(6);
845
1116
  i0.ɵɵelementEnd();
846
- i0.ɵɵelementStart(7, "span", 99);
1117
+ i0.ɵɵelementStart(7, "span", 164);
847
1118
  i0.ɵɵtext(8);
848
1119
  i0.ɵɵelementEnd();
849
- i0.ɵɵelementStart(9, "span", 100);
1120
+ i0.ɵɵelementStart(9, "span", 156);
850
1121
  i0.ɵɵtext(10);
851
1122
  i0.ɵɵelementEnd()();
852
- i0.ɵɵelementStart(11, "div", 101);
853
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
854
- i0.ɵɵelementStart(12, "button", 102);
855
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(undefined, undefined)); });
856
- i0.ɵɵelement(13, "i", 38);
1123
+ i0.ɵɵelementStart(11, "div", 165);
1124
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r38); return i0.ɵɵresetView($event.stopPropagation()); });
1125
+ i0.ɵɵelementStart(12, "button", 166);
1126
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r38); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.openTestToolDialog(undefined, undefined)); });
1127
+ i0.ɵɵelement(13, "i", 75);
857
1128
  i0.ɵɵelementEnd()()();
858
- i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template, 2, 1);
1129
+ i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Conditional_14_Template, 2, 1);
859
1130
  i0.ɵɵelementEnd();
860
1131
  } if (rf & 2) {
861
- const group_r18 = ctx.$implicit;
862
- const ctx_r1 = i0.ɵɵnextContext(4);
863
- i0.ɵɵclassProp("collapsed", !group_r18.expanded);
1132
+ const group_r39 = ctx.$implicit;
1133
+ const ctx_r2 = i0.ɵɵnextContext(4);
1134
+ i0.ɵɵclassProp("collapsed", !group_r39.expanded);
864
1135
  i0.ɵɵadvance(3);
865
- i0.ɵɵclassProp("expanded", group_r18.expanded);
1136
+ i0.ɵɵclassProp("expanded", group_r39.expanded);
866
1137
  i0.ɵɵadvance();
867
- i0.ɵɵclassMap(ctx_r1.getTransportIcon(group_r18.server.TransportType));
1138
+ i0.ɵɵclassMap(ctx_r2.getTransportIcon(group_r39.server.TransportType));
868
1139
  i0.ɵɵadvance(2);
869
- i0.ɵɵtextInterpolate(group_r18.server.Name);
1140
+ i0.ɵɵtextInterpolate(group_r39.server.Name);
870
1141
  i0.ɵɵadvance(2);
871
- i0.ɵɵtextInterpolate1("", group_r18.tools.length, " tools");
1142
+ i0.ɵɵtextInterpolate1("", ctx_r2.getServerToolCount(group_r39.server.ID), " tools");
872
1143
  i0.ɵɵadvance();
873
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(group_r18.server.Status));
1144
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(group_r39.server.Status));
874
1145
  i0.ɵɵadvance();
875
- i0.ɵɵtextInterpolate1(" ", group_r18.server.Status, " ");
1146
+ i0.ɵɵtextInterpolate1(" ", group_r39.server.Status, " ");
876
1147
  i0.ɵɵadvance(4);
877
- i0.ɵɵconditional(group_r18.expanded ? 14 : -1);
1148
+ i0.ɵɵconditional(group_r39.expanded ? 14 : -1);
878
1149
  } }
879
- function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
880
- i0.ɵɵelementStart(0, "div", 91);
881
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template, 15, 11, "div", 93, _forTrack1);
1150
+ function MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1151
+ i0.ɵɵelementStart(0, "div", 146);
1152
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_For_2_Template, 15, 11, "div", 158, _forTrack2);
882
1153
  i0.ɵɵelementEnd();
883
1154
  } if (rf & 2) {
884
- const ctx_r1 = i0.ɵɵnextContext(3);
1155
+ const ctx_r2 = i0.ɵɵnextContext(3);
885
1156
  i0.ɵɵadvance();
886
- i0.ɵɵrepeater(ctx_r1.ServerGroups);
1157
+ i0.ɵɵrepeater(ctx_r2.ServerGroups);
887
1158
  } }
888
- function MCPDashboardComponent_Conditional_50_Case_2_Template(rf, ctx) { if (rf & 1) {
889
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template, 6, 0, "div", 47)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template, 3, 0, "div", 91);
1159
+ function MCPDashboardComponent_Conditional_72_Case_2_Template(rf, ctx) { if (rf & 1) {
1160
+ const _r34 = i0.ɵɵgetCurrentView();
1161
+ i0.ɵɵelementStart(0, "div", 144)(1, "label", 145)(2, "input", 83);
1162
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_72_Case_2_Template_input_change_2_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleScalableMode($event.target.checked)); });
1163
+ i0.ɵɵelementEnd();
1164
+ i0.ɵɵtext(3, " Scale mode (virtual scroll, paginated) ");
1165
+ i0.ɵɵelementEnd();
1166
+ i0.ɵɵconditionalCreate(4, MCPDashboardComponent_Conditional_72_Case_2_Conditional_4_Template, 2, 2, "span");
1167
+ i0.ɵɵelementEnd();
1168
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_72_Case_2_Conditional_5_Template, 12, 3)(6, MCPDashboardComponent_Conditional_72_Case_2_Conditional_6_Template, 6, 0, "div", 100)(7, MCPDashboardComponent_Conditional_72_Case_2_Conditional_7_Template, 3, 0, "div", 146);
890
1169
  } if (rf & 2) {
891
- const ctx_r1 = i0.ɵɵnextContext(2);
892
- i0.ɵɵconditional(ctx_r1.ServerGroups.length === 0 ? 0 : 1);
1170
+ const ctx_r2 = i0.ɵɵnextContext(2);
1171
+ i0.ɵɵadvance(2);
1172
+ i0.ɵɵproperty("checked", ctx_r2.useScalablePagination);
1173
+ i0.ɵɵadvance(2);
1174
+ i0.ɵɵconditional(ctx_r2.useScalablePagination ? 4 : -1);
1175
+ i0.ɵɵadvance();
1176
+ i0.ɵɵconditional(ctx_r2.useScalablePagination ? 5 : ctx_r2.ServerGroups.length === 0 ? 6 : 7);
893
1177
  } }
894
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
895
- i0.ɵɵelementStart(0, "div", 47);
896
- i0.ɵɵelement(1, "i", 16);
1178
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1179
+ i0.ɵɵelementStart(0, "div", 100);
1180
+ i0.ɵɵelement(1, "i", 43);
897
1181
  i0.ɵɵelementStart(2, "p");
898
1182
  i0.ɵɵtext(3, "No recent execution logs");
899
1183
  i0.ɵɵelementEnd();
900
- i0.ɵɵelementStart(4, "span", 92);
1184
+ i0.ɵɵelementStart(4, "span", 157);
901
1185
  i0.ɵɵtext(5, "Logs appear when tools are executed via MCP connections");
902
1186
  i0.ɵɵelementEnd()();
903
1187
  } }
904
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
905
- i0.ɵɵelement(0, "i", 88);
1188
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
1189
+ i0.ɵɵelement(0, "i", 141);
906
1190
  } }
907
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
908
- i0.ɵɵelement(0, "i", 140);
1191
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
1192
+ i0.ɵɵelement(0, "i", 204);
909
1193
  } }
910
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
911
- i0.ɵɵelement(0, "i", 141);
1194
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
1195
+ i0.ɵɵelement(0, "i", 205);
912
1196
  } }
913
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
914
- i0.ɵɵelement(0, "i", 142);
1197
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
1198
+ i0.ɵɵelement(0, "i", 206);
915
1199
  } }
916
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
917
- const _r24 = i0.ɵɵgetCurrentView();
918
- i0.ɵɵelementStart(0, "tr", 139);
919
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onLogClick(log_r25)); });
920
- i0.ɵɵelementStart(1, "td")(2, "span", 54);
921
- i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 88)(4, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 140)(5, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 141)(6, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 142);
1200
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
1201
+ const _r45 = i0.ɵɵgetCurrentView();
1202
+ i0.ɵɵelementStart(0, "tr", 203);
1203
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r46 = i0.ɵɵrestoreView(_r45).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onLogClick(log_r46)); });
1204
+ i0.ɵɵelementStart(1, "td")(2, "span", 107);
1205
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 141)(4, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 204)(5, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 205)(6, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 206);
922
1206
  i0.ɵɵtext(7);
923
1207
  i0.ɵɵelementEnd()();
924
- i0.ɵɵelementStart(8, "td", 98);
1208
+ i0.ɵɵelementStart(8, "td", 163);
925
1209
  i0.ɵɵtext(9);
926
1210
  i0.ɵɵelementEnd();
927
- i0.ɵɵelementStart(10, "td", 143);
1211
+ i0.ɵɵelementStart(10, "td", 207);
928
1212
  i0.ɵɵtext(11);
929
1213
  i0.ɵɵelementEnd();
930
1214
  i0.ɵɵelementStart(12, "td");
@@ -936,164 +1220,931 @@ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Templa
936
1220
  i0.ɵɵelementStart(16, "td");
937
1221
  i0.ɵɵtext(17);
938
1222
  i0.ɵɵelementEnd();
939
- i0.ɵɵelementStart(18, "td", 144);
1223
+ i0.ɵɵelementStart(18, "td", 208);
940
1224
  i0.ɵɵtext(19);
941
1225
  i0.ɵɵelementEnd();
942
- i0.ɵɵelementStart(20, "td", 145);
943
- i0.ɵɵelement(21, "i", 146);
1226
+ i0.ɵɵelementStart(20, "td", 209);
1227
+ i0.ɵɵelement(21, "i", 210);
944
1228
  i0.ɵɵelementEnd()();
945
1229
  } if (rf & 2) {
946
- let tmp_15_0;
947
- const log_r25 = ctx.$implicit;
948
- const ctx_r1 = i0.ɵɵnextContext(4);
949
- i0.ɵɵclassProp("error-row", log_r25.Status === "Error");
1230
+ let tmp_16_0;
1231
+ const log_r46 = ctx.$implicit;
1232
+ const ctx_r2 = i0.ɵɵnextContext(4);
1233
+ i0.ɵɵclassProp("error-row", log_r46.Status === "Error");
950
1234
  i0.ɵɵadvance(2);
951
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r25.Status));
1235
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(log_r46.Status));
952
1236
  i0.ɵɵadvance();
953
- i0.ɵɵconditional((tmp_15_0 = log_r25.Status) === "Success" ? 3 : tmp_15_0 === "Error" ? 4 : tmp_15_0 === "Running" ? 5 : 6);
1237
+ i0.ɵɵconditional((tmp_16_0 = log_r46.Status) === "Success" ? 3 : tmp_16_0 === "Error" ? 4 : tmp_16_0 === "Running" ? 5 : 6);
954
1238
  i0.ɵɵadvance(4);
955
- i0.ɵɵtextInterpolate1(" ", log_r25.Status || "Unknown", " ");
1239
+ i0.ɵɵtextInterpolate1(" ", log_r46.Status || "Unknown", " ");
956
1240
  i0.ɵɵadvance(2);
957
- i0.ɵɵtextInterpolate(log_r25.ServerName);
1241
+ i0.ɵɵtextInterpolate(log_r46.ServerName);
958
1242
  i0.ɵɵadvance(2);
959
- i0.ɵɵtextInterpolate(log_r25.ToolName);
1243
+ i0.ɵɵtextInterpolate(log_r46.ToolName);
960
1244
  i0.ɵɵadvance(2);
961
- i0.ɵɵtextInterpolate(log_r25.ConnectionName);
1245
+ i0.ɵɵtextInterpolate(log_r46.ConnectionName);
962
1246
  i0.ɵɵadvance(2);
963
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r25.StartedAt));
1247
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(log_r46.StartedAt));
964
1248
  i0.ɵɵadvance(2);
965
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r25.DurationMs));
1249
+ i0.ɵɵtextInterpolate(ctx_r2.formatDuration(log_r46.DurationMs));
966
1250
  i0.ɵɵadvance();
967
- i0.ɵɵproperty("title", log_r25.ErrorMessage || "");
1251
+ i0.ɵɵproperty("title", log_r46.ErrorMessage || "");
968
1252
  i0.ɵɵadvance();
969
- i0.ɵɵtextInterpolate1(" ", log_r25.ErrorMessage || "-", " ");
1253
+ i0.ɵɵtextInterpolate1(" ", log_r46.ErrorMessage || "-", " ");
970
1254
  } }
971
- function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
972
- const _r23 = i0.ɵɵgetCurrentView();
973
- i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 136);
974
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("status")); });
1255
+ function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1256
+ const _r44 = i0.ɵɵgetCurrentView();
1257
+ i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 200);
1258
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("status")); });
975
1259
  i0.ɵɵtext(4, " Status ");
976
- i0.ɵɵelement(5, "i", 137);
1260
+ i0.ɵɵelement(5, "i", 201);
977
1261
  i0.ɵɵelementEnd();
978
- i0.ɵɵelementStart(6, "th", 136);
979
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("server")); });
1262
+ i0.ɵɵelementStart(6, "th", 200);
1263
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("server")); });
980
1264
  i0.ɵɵtext(7, " Server ");
981
- i0.ɵɵelement(8, "i", 137);
1265
+ i0.ɵɵelement(8, "i", 201);
982
1266
  i0.ɵɵelementEnd();
983
- i0.ɵɵelementStart(9, "th", 136);
984
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("tool")); });
1267
+ i0.ɵɵelementStart(9, "th", 200);
1268
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("tool")); });
985
1269
  i0.ɵɵtext(10, " Tool ");
986
- i0.ɵɵelement(11, "i", 137);
1270
+ i0.ɵɵelement(11, "i", 201);
987
1271
  i0.ɵɵelementEnd();
988
- i0.ɵɵelementStart(12, "th", 136);
989
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("connection")); });
1272
+ i0.ɵɵelementStart(12, "th", 200);
1273
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("connection")); });
990
1274
  i0.ɵɵtext(13, " Connection ");
991
- i0.ɵɵelement(14, "i", 137);
1275
+ i0.ɵɵelement(14, "i", 201);
992
1276
  i0.ɵɵelementEnd();
993
- i0.ɵɵelementStart(15, "th", 136);
994
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("started")); });
1277
+ i0.ɵɵelementStart(15, "th", 200);
1278
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("started")); });
995
1279
  i0.ɵɵtext(16, " Started ");
996
- i0.ɵɵelement(17, "i", 137);
1280
+ i0.ɵɵelement(17, "i", 201);
997
1281
  i0.ɵɵelementEnd();
998
- i0.ɵɵelementStart(18, "th", 136);
999
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("duration")); });
1282
+ i0.ɵɵelementStart(18, "th", 200);
1283
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("duration")); });
1000
1284
  i0.ɵɵtext(19, " Duration ");
1001
- i0.ɵɵelement(20, "i", 137);
1285
+ i0.ɵɵelement(20, "i", 201);
1002
1286
  i0.ɵɵelementEnd();
1003
- i0.ɵɵelementStart(21, "th", 136);
1004
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("error")); });
1287
+ i0.ɵɵelementStart(21, "th", 200);
1288
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r44); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onLogSortColumn("error")); });
1005
1289
  i0.ɵɵtext(22, " Error ");
1006
- i0.ɵɵelement(23, "i", 137);
1290
+ i0.ɵɵelement(23, "i", 201);
1007
1291
  i0.ɵɵelementEnd();
1008
1292
  i0.ɵɵelement(24, "th");
1009
1293
  i0.ɵɵelementEnd()();
1010
1294
  i0.ɵɵelementStart(25, "tbody");
1011
- i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 138, _forTrack0);
1295
+ i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 202, _forTrack0);
1012
1296
  i0.ɵɵelementEnd()();
1013
1297
  } if (rf & 2) {
1014
- const ctx_r1 = i0.ɵɵnextContext(3);
1298
+ const ctx_r2 = i0.ɵɵnextContext(3);
1015
1299
  i0.ɵɵadvance(3);
1016
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("status"));
1300
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("status"));
1017
1301
  i0.ɵɵadvance(2);
1018
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "status" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "status" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "status");
1302
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "status" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "status" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "status");
1019
1303
  i0.ɵɵadvance();
1020
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("server"));
1304
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("server"));
1021
1305
  i0.ɵɵadvance(2);
1022
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "server" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "server" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "server");
1306
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "server" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "server" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "server");
1023
1307
  i0.ɵɵadvance();
1024
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("tool"));
1308
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("tool"));
1025
1309
  i0.ɵɵadvance(2);
1026
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "tool" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "tool" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "tool");
1310
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "tool" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "tool" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "tool");
1027
1311
  i0.ɵɵadvance();
1028
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("connection"));
1312
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("connection"));
1029
1313
  i0.ɵɵadvance(2);
1030
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "connection" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "connection" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "connection");
1314
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "connection" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "connection" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "connection");
1031
1315
  i0.ɵɵadvance();
1032
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("started"));
1316
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("started"));
1033
1317
  i0.ɵɵadvance(2);
1034
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "started" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "started" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "started");
1318
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "started" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "started" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "started");
1035
1319
  i0.ɵɵadvance();
1036
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("duration"));
1320
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("duration"));
1037
1321
  i0.ɵɵadvance(2);
1038
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "duration" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "duration" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "duration");
1322
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "duration" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "duration" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "duration");
1039
1323
  i0.ɵɵadvance();
1040
- i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("error"));
1324
+ i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("error"));
1041
1325
  i0.ɵɵadvance(2);
1042
- i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "error" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "error" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "error");
1326
+ i0.ɵɵclassProp("fa-sort-up", ctx_r2.LogsSortColumn === "error" && ctx_r2.LogsSortAscending)("fa-sort-down", ctx_r2.LogsSortColumn === "error" && !ctx_r2.LogsSortAscending)("fa-sort", ctx_r2.LogsSortColumn !== "error");
1043
1327
  i0.ɵɵadvance(3);
1044
- i0.ɵɵrepeater(ctx_r1.filteredLogs);
1328
+ i0.ɵɵrepeater(ctx_r2.filteredLogs);
1045
1329
  } }
1046
- function MCPDashboardComponent_Conditional_50_Case_3_Template(rf, ctx) { if (rf & 1) {
1047
- i0.ɵɵelementStart(0, "div", 46);
1048
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template, 28, 49, "table");
1330
+ function MCPDashboardComponent_Conditional_72_Case_3_Template(rf, ctx) { if (rf & 1) {
1331
+ i0.ɵɵelementStart(0, "div", 99);
1332
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_72_Case_3_Conditional_1_Template, 6, 0, "div", 100)(2, MCPDashboardComponent_Conditional_72_Case_3_Conditional_2_Template, 28, 49, "table");
1049
1333
  i0.ɵɵelementEnd();
1050
1334
  } if (rf & 2) {
1051
- const ctx_r1 = i0.ɵɵnextContext(2);
1335
+ const ctx_r2 = i0.ɵɵnextContext(2);
1052
1336
  i0.ɵɵadvance();
1053
- i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 1 : 2);
1337
+ i0.ɵɵconditional(ctx_r2.filteredLogs.length === 0 ? 1 : 2);
1338
+ } }
1339
+ function MCPDashboardComponent_Conditional_72_Template(rf, ctx) { if (rf & 1) {
1340
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_72_Case_0_Template, 3, 1, "div", 97)(1, MCPDashboardComponent_Conditional_72_Case_1_Template, 3, 1, "div", 98)(2, MCPDashboardComponent_Conditional_72_Case_2_Template, 8, 3)(3, MCPDashboardComponent_Conditional_72_Case_3_Template, 3, 1, "div", 99);
1341
+ } if (rf & 2) {
1342
+ let tmp_2_0;
1343
+ const ctx_r2 = i0.ɵɵnextContext();
1344
+ i0.ɵɵconditional((tmp_2_0 = ctx_r2.ActiveTab) === "servers" ? 0 : tmp_2_0 === "connections" ? 1 : tmp_2_0 === "tools" ? 2 : tmp_2_0 === "logs" ? 3 : -1);
1054
1345
  } }
1055
- function MCPDashboardComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
1056
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Template, 3, 1, "div", 44)(1, MCPDashboardComponent_Conditional_50_Case_1_Template, 3, 1, "div", 45)(2, MCPDashboardComponent_Conditional_50_Case_2_Template, 2, 1)(3, MCPDashboardComponent_Conditional_50_Case_3_Template, 3, 1, "div", 46);
1346
+ function MCPDashboardComponent_Conditional_73_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1347
+ i0.ɵɵelementStart(0, "div", 217);
1348
+ i0.ɵɵelement(1, "i", 94);
1349
+ i0.ɵɵtext(2);
1350
+ i0.ɵɵelementEnd();
1351
+ } if (rf & 2) {
1352
+ const ctx_r2 = i0.ɵɵnextContext(2);
1353
+ i0.ɵɵadvance(2);
1354
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.ServerFormError, " ");
1355
+ } }
1356
+ function MCPDashboardComponent_Conditional_73_For_29_Template(rf, ctx) { if (rf & 1) {
1357
+ i0.ɵɵelementStart(0, "option", 80);
1358
+ i0.ɵɵtext(1);
1359
+ i0.ɵɵelementEnd();
1360
+ } if (rf & 2) {
1361
+ const t_r51 = ctx.$implicit;
1362
+ i0.ɵɵproperty("value", t_r51.value);
1363
+ i0.ɵɵadvance();
1364
+ i0.ɵɵtextInterpolate(t_r51.label);
1365
+ } }
1366
+ function MCPDashboardComponent_Conditional_73_Conditional_30_Template(rf, ctx) { if (rf & 1) {
1367
+ const _r52 = i0.ɵɵgetCurrentView();
1368
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 219);
1369
+ i0.ɵɵtext(2, "Server URL ");
1370
+ i0.ɵɵelementStart(3, "span", 220);
1371
+ i0.ɵɵtext(4, "*");
1372
+ i0.ɵɵelementEnd()();
1373
+ i0.ɵɵelementStart(5, "input", 226, 14);
1374
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_73_Conditional_30_Template_input_input_5_listener() { i0.ɵɵrestoreView(_r52); const sfUrl_r53 = i0.ɵɵreference(6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ServerForm.ServerURL = sfUrl_r53.value); });
1375
+ i0.ɵɵelementEnd()();
1376
+ } if (rf & 2) {
1377
+ const ctx_r2 = i0.ɵɵnextContext(2);
1378
+ i0.ɵɵadvance(5);
1379
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.ServerURL);
1380
+ } }
1381
+ function MCPDashboardComponent_Conditional_73_Conditional_31_Template(rf, ctx) { if (rf & 1) {
1382
+ const _r54 = i0.ɵɵgetCurrentView();
1383
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 219);
1384
+ i0.ɵɵtext(2, "Command ");
1385
+ i0.ɵɵelementStart(3, "span", 220);
1386
+ i0.ɵɵtext(4, "*");
1387
+ i0.ɵɵelementEnd()();
1388
+ i0.ɵɵelementStart(5, "input", 227, 15);
1389
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_73_Conditional_31_Template_input_input_5_listener() { i0.ɵɵrestoreView(_r54); const sfCmd_r55 = i0.ɵɵreference(6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ServerForm.Command = sfCmd_r55.value); });
1390
+ i0.ɵɵelementEnd()();
1391
+ } if (rf & 2) {
1392
+ const ctx_r2 = i0.ɵɵnextContext(2);
1393
+ i0.ɵɵadvance(5);
1394
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.Command);
1395
+ } }
1396
+ function MCPDashboardComponent_Conditional_73_For_38_Template(rf, ctx) { if (rf & 1) {
1397
+ i0.ɵɵelementStart(0, "option", 80);
1398
+ i0.ɵɵtext(1);
1399
+ i0.ɵɵelementEnd();
1400
+ } if (rf & 2) {
1401
+ const a_r57 = ctx.$implicit;
1402
+ i0.ɵɵproperty("value", a_r57.value);
1403
+ i0.ɵɵadvance();
1404
+ i0.ɵɵtextInterpolate(a_r57.label);
1405
+ } }
1406
+ function MCPDashboardComponent_Conditional_73_Conditional_50_Template(rf, ctx) { if (rf & 1) {
1407
+ i0.ɵɵelement(0, "i", 205);
1408
+ } }
1409
+ function MCPDashboardComponent_Conditional_73_Template(rf, ctx) { if (rf & 1) {
1410
+ const _r47 = i0.ɵɵgetCurrentView();
1411
+ i0.ɵɵelementStart(0, "div", 211);
1412
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_73_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r47); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelServerForm()); });
1413
+ i0.ɵɵelementStart(1, "div", 212);
1414
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_73_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r47); return i0.ɵɵresetView($event.stopPropagation()); });
1415
+ i0.ɵɵelementStart(2, "div", 213)(3, "h2", 214);
1416
+ i0.ɵɵtext(4);
1417
+ i0.ɵɵelementEnd();
1418
+ i0.ɵɵelementStart(5, "button", 215);
1419
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_73_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r47); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelServerForm()); });
1420
+ i0.ɵɵelement(6, "i", 96);
1421
+ i0.ɵɵelementEnd()();
1422
+ i0.ɵɵelementStart(7, "div", 216);
1423
+ i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_73_Conditional_8_Template, 3, 1, "div", 217);
1424
+ i0.ɵɵelementStart(9, "div", 218)(10, "label", 219);
1425
+ i0.ɵɵtext(11, "Name ");
1426
+ i0.ɵɵelementStart(12, "span", 220);
1427
+ i0.ɵɵtext(13, "*");
1428
+ i0.ɵɵelementEnd()();
1429
+ i0.ɵɵelementStart(14, "input", 221, 9);
1430
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_73_Template_input_input_14_listener() { i0.ɵɵrestoreView(_r47); const sfName_r48 = i0.ɵɵreference(15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ServerForm.Name = sfName_r48.value); });
1431
+ i0.ɵɵelementEnd()();
1432
+ i0.ɵɵelementStart(16, "div", 218)(17, "label", 219);
1433
+ i0.ɵɵtext(18, "Description");
1434
+ i0.ɵɵelementEnd();
1435
+ i0.ɵɵelementStart(19, "textarea", 222, 10);
1436
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_73_Template_textarea_input_19_listener() { i0.ɵɵrestoreView(_r47); const sfDesc_r49 = i0.ɵɵreference(20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ServerForm.Description = sfDesc_r49.value); });
1437
+ i0.ɵɵelementEnd()();
1438
+ i0.ɵɵelementStart(21, "div", 218)(22, "label", 219);
1439
+ i0.ɵɵtext(23, "Transport Type ");
1440
+ i0.ɵɵelementStart(24, "span", 220);
1441
+ i0.ɵɵtext(25, "*");
1442
+ i0.ɵɵelementEnd()();
1443
+ i0.ɵɵelementStart(26, "select", 78, 11);
1444
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_73_Template_select_change_26_listener() { i0.ɵɵrestoreView(_r47); const sfTransport_r50 = i0.ɵɵreference(27); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ServerForm.TransportType = sfTransport_r50.value); });
1445
+ i0.ɵɵrepeaterCreate(28, MCPDashboardComponent_Conditional_73_For_29_Template, 2, 2, "option", 80, _forTrack3);
1446
+ i0.ɵɵelementEnd()();
1447
+ i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_73_Conditional_30_Template, 7, 1, "div", 218);
1448
+ i0.ɵɵconditionalCreate(31, MCPDashboardComponent_Conditional_73_Conditional_31_Template, 7, 1, "div", 218);
1449
+ i0.ɵɵelementStart(32, "div", 218)(33, "label", 219);
1450
+ i0.ɵɵtext(34, "Default Auth Type");
1451
+ i0.ɵɵelementEnd();
1452
+ i0.ɵɵelementStart(35, "select", 78, 12);
1453
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_73_Template_select_change_35_listener() { i0.ɵɵrestoreView(_r47); const sfAuth_r56 = i0.ɵɵreference(36); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ServerForm.DefaultAuthType = sfAuth_r56.value); });
1454
+ i0.ɵɵrepeaterCreate(37, MCPDashboardComponent_Conditional_73_For_38_Template, 2, 2, "option", 80, _forTrack3);
1455
+ i0.ɵɵelementEnd()();
1456
+ i0.ɵɵelementStart(39, "div", 218)(40, "label", 219);
1457
+ i0.ɵɵtext(41, "Status");
1458
+ i0.ɵɵelementEnd();
1459
+ i0.ɵɵelementStart(42, "select", 78, 13);
1460
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_73_Template_select_change_42_listener() { i0.ɵɵrestoreView(_r47); const sfStatus_r58 = i0.ɵɵreference(43); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ServerForm.Status = sfStatus_r58.value); });
1461
+ i0.ɵɵelementStart(44, "option", 87);
1462
+ i0.ɵɵtext(45, "Active");
1463
+ i0.ɵɵelementEnd();
1464
+ i0.ɵɵelementStart(46, "option", 88);
1465
+ i0.ɵɵtext(47, "Inactive");
1466
+ i0.ɵɵelementEnd()()()();
1467
+ i0.ɵɵelementStart(48, "div", 223)(49, "button", 224);
1468
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_73_Template_button_click_49_listener() { i0.ɵɵrestoreView(_r47); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.saveServerForm()); });
1469
+ i0.ɵɵconditionalCreate(50, MCPDashboardComponent_Conditional_73_Conditional_50_Template, 1, 0, "i", 205);
1470
+ i0.ɵɵtext(51);
1471
+ i0.ɵɵelementEnd();
1472
+ i0.ɵɵelementStart(52, "button", 225);
1473
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_73_Template_button_click_52_listener() { i0.ɵɵrestoreView(_r47); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelServerForm()); });
1474
+ i0.ɵɵtext(53, "Cancel");
1475
+ i0.ɵɵelementEnd()()()();
1476
+ } if (rf & 2) {
1477
+ const ctx_r2 = i0.ɵɵnextContext();
1478
+ i0.ɵɵadvance(4);
1479
+ i0.ɵɵtextInterpolate(ctx_r2.EditingServer ? "Edit MCP Server" : "Add MCP Server");
1480
+ i0.ɵɵadvance(4);
1481
+ i0.ɵɵconditional(ctx_r2.ServerFormError ? 8 : -1);
1482
+ i0.ɵɵadvance(6);
1483
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.Name);
1484
+ i0.ɵɵadvance(5);
1485
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.Description);
1486
+ i0.ɵɵadvance(7);
1487
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.TransportType);
1488
+ i0.ɵɵadvance(2);
1489
+ i0.ɵɵrepeater(ctx_r2.TransportTypes);
1490
+ i0.ɵɵadvance(2);
1491
+ i0.ɵɵconditional(ctx_r2.ServerForm.TransportType === "StreamableHTTP" || ctx_r2.ServerForm.TransportType === "SSE" || ctx_r2.ServerForm.TransportType === "WebSocket" ? 30 : -1);
1492
+ i0.ɵɵadvance();
1493
+ i0.ɵɵconditional(ctx_r2.ServerForm.TransportType === "Stdio" ? 31 : -1);
1494
+ i0.ɵɵadvance(4);
1495
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.DefaultAuthType);
1496
+ i0.ɵɵadvance(2);
1497
+ i0.ɵɵrepeater(ctx_r2.AuthTypes);
1498
+ i0.ɵɵadvance(5);
1499
+ i0.ɵɵproperty("value", ctx_r2.ServerForm.Status);
1500
+ i0.ɵɵadvance(7);
1501
+ i0.ɵɵproperty("disabled", ctx_r2.ServerFormSaving);
1502
+ i0.ɵɵadvance();
1503
+ i0.ɵɵconditional(ctx_r2.ServerFormSaving ? 50 : -1);
1504
+ i0.ɵɵadvance();
1505
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.EditingServer ? "Update" : "Create", " ");
1506
+ } }
1507
+ function MCPDashboardComponent_Conditional_74_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1508
+ i0.ɵɵelementStart(0, "div", 217);
1509
+ i0.ɵɵelement(1, "i", 94);
1510
+ i0.ɵɵtext(2);
1511
+ i0.ɵɵelementEnd();
1512
+ } if (rf & 2) {
1513
+ const ctx_r2 = i0.ɵɵnextContext(2);
1514
+ i0.ɵɵadvance(2);
1515
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.ConnectionFormError, " ");
1516
+ } }
1517
+ function MCPDashboardComponent_Conditional_74_For_19_Template(rf, ctx) { if (rf & 1) {
1518
+ i0.ɵɵelementStart(0, "option", 80);
1519
+ i0.ɵɵtext(1);
1520
+ i0.ɵɵelementEnd();
1521
+ } if (rf & 2) {
1522
+ const s_r61 = ctx.$implicit;
1523
+ i0.ɵɵproperty("value", s_r61.ID);
1524
+ i0.ɵɵadvance();
1525
+ i0.ɵɵtextInterpolate(s_r61.Name);
1526
+ } }
1527
+ function MCPDashboardComponent_Conditional_74_Conditional_45_Template(rf, ctx) { if (rf & 1) {
1528
+ i0.ɵɵelement(0, "i", 205);
1529
+ } }
1530
+ function MCPDashboardComponent_Conditional_74_Template(rf, ctx) { if (rf & 1) {
1531
+ const _r59 = i0.ɵɵgetCurrentView();
1532
+ i0.ɵɵelementStart(0, "div", 211);
1533
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_74_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r59); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelConnectionForm()); });
1534
+ i0.ɵɵelementStart(1, "div", 228);
1535
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_74_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r59); return i0.ɵɵresetView($event.stopPropagation()); });
1536
+ i0.ɵɵelementStart(2, "div", 213)(3, "h2", 214);
1537
+ i0.ɵɵtext(4, "Add Connection");
1538
+ i0.ɵɵelementEnd();
1539
+ i0.ɵɵelementStart(5, "button", 215);
1540
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_74_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r59); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelConnectionForm()); });
1541
+ i0.ɵɵelement(6, "i", 96);
1542
+ i0.ɵɵelementEnd()();
1543
+ i0.ɵɵelementStart(7, "div", 216);
1544
+ i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_74_Conditional_8_Template, 3, 1, "div", 217);
1545
+ i0.ɵɵelementStart(9, "div", 218)(10, "label", 219);
1546
+ i0.ɵɵtext(11, "Server ");
1547
+ i0.ɵɵelementStart(12, "span", 220);
1548
+ i0.ɵɵtext(13, "*");
1549
+ i0.ɵɵelementEnd()();
1550
+ i0.ɵɵelementStart(14, "select", 78, 16);
1551
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_74_Template_select_change_14_listener() { i0.ɵɵrestoreView(_r59); const cfServer_r60 = i0.ɵɵreference(15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ConnectionForm.MCPServerID = cfServer_r60.value); });
1552
+ i0.ɵɵelementStart(16, "option", 229);
1553
+ i0.ɵɵtext(17, "\u2014 select server \u2014");
1554
+ i0.ɵɵelementEnd();
1555
+ i0.ɵɵrepeaterCreate(18, MCPDashboardComponent_Conditional_74_For_19_Template, 2, 2, "option", 80, _forTrack0);
1556
+ i0.ɵɵelementEnd()();
1557
+ i0.ɵɵelementStart(20, "div", 218)(21, "label", 219);
1558
+ i0.ɵɵtext(22, "Name ");
1559
+ i0.ɵɵelementStart(23, "span", 220);
1560
+ i0.ɵɵtext(24, "*");
1561
+ i0.ɵɵelementEnd()();
1562
+ i0.ɵɵelementStart(25, "input", 230, 17);
1563
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_74_Template_input_input_25_listener() { i0.ɵɵrestoreView(_r59); const cfName_r62 = i0.ɵɵreference(26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ConnectionForm.Name = cfName_r62.value); });
1564
+ i0.ɵɵelementEnd()();
1565
+ i0.ɵɵelementStart(27, "div", 218)(28, "label", 219);
1566
+ i0.ɵɵtext(29, "Bearer Token");
1567
+ i0.ɵɵelementEnd();
1568
+ i0.ɵɵelementStart(30, "input", 231, 18);
1569
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_74_Template_input_input_30_listener() { i0.ɵɵrestoreView(_r59); const cfToken_r63 = i0.ɵɵreference(31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ConnectionForm.BearerToken = cfToken_r63.value); });
1570
+ i0.ɵɵelementEnd();
1571
+ i0.ɵɵelementStart(32, "span", 53);
1572
+ i0.ɵɵtext(33, "Will be stored as a Credential and linked to this connection");
1573
+ i0.ɵɵelementEnd()();
1574
+ i0.ɵɵelementStart(34, "div", 218)(35, "label", 219);
1575
+ i0.ɵɵtext(36, "Status");
1576
+ i0.ɵɵelementEnd();
1577
+ i0.ɵɵelementStart(37, "select", 78, 19);
1578
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_74_Template_select_change_37_listener() { i0.ɵɵrestoreView(_r59); const cfStatus_r64 = i0.ɵɵreference(38); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ConnectionForm.Status = cfStatus_r64.value); });
1579
+ i0.ɵɵelementStart(39, "option", 87);
1580
+ i0.ɵɵtext(40, "Active");
1581
+ i0.ɵɵelementEnd();
1582
+ i0.ɵɵelementStart(41, "option", 88);
1583
+ i0.ɵɵtext(42, "Inactive");
1584
+ i0.ɵɵelementEnd()()()();
1585
+ i0.ɵɵelementStart(43, "div", 223)(44, "button", 224);
1586
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_74_Template_button_click_44_listener() { i0.ɵɵrestoreView(_r59); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.saveConnectionForm()); });
1587
+ i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_74_Conditional_45_Template, 1, 0, "i", 205);
1588
+ i0.ɵɵtext(46, " Create ");
1589
+ i0.ɵɵelementEnd();
1590
+ i0.ɵɵelementStart(47, "button", 225);
1591
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_74_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r59); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelConnectionForm()); });
1592
+ i0.ɵɵtext(48, "Cancel");
1593
+ i0.ɵɵelementEnd()()()();
1594
+ } if (rf & 2) {
1595
+ const ctx_r2 = i0.ɵɵnextContext();
1596
+ i0.ɵɵadvance(8);
1597
+ i0.ɵɵconditional(ctx_r2.ConnectionFormError ? 8 : -1);
1598
+ i0.ɵɵadvance(6);
1599
+ i0.ɵɵproperty("value", ctx_r2.ConnectionForm.MCPServerID);
1600
+ i0.ɵɵadvance(4);
1601
+ i0.ɵɵrepeater(ctx_r2.servers);
1602
+ i0.ɵɵadvance(7);
1603
+ i0.ɵɵproperty("value", ctx_r2.ConnectionForm.Name);
1604
+ i0.ɵɵadvance(5);
1605
+ i0.ɵɵproperty("value", ctx_r2.ConnectionForm.BearerToken);
1606
+ i0.ɵɵadvance(7);
1607
+ i0.ɵɵproperty("value", ctx_r2.ConnectionForm.Status);
1608
+ i0.ɵɵadvance(7);
1609
+ i0.ɵɵproperty("disabled", ctx_r2.ConnectionFormSaving);
1610
+ i0.ɵɵadvance();
1611
+ i0.ɵɵconditional(ctx_r2.ConnectionFormSaving ? 45 : -1);
1612
+ } }
1613
+ function MCPDashboardComponent_Conditional_75_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1614
+ i0.ɵɵelementStart(0, "span", 233);
1615
+ i0.ɵɵtext(1);
1616
+ i0.ɵɵelementEnd();
1617
+ } if (rf & 2) {
1618
+ const ctx_r2 = i0.ɵɵnextContext(2);
1619
+ i0.ɵɵadvance();
1620
+ i0.ɵɵtextInterpolate1("\u2014 ", (ctx_r2.TestSelectedTool == null ? null : ctx_r2.TestSelectedTool.ToolTitle) || (ctx_r2.TestSelectedTool == null ? null : ctx_r2.TestSelectedTool.ToolName));
1621
+ } }
1622
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_10_Template(rf, ctx) { if (rf & 1) {
1623
+ i0.ɵɵelementStart(0, "option", 238);
1624
+ i0.ɵɵtext(1);
1625
+ i0.ɵɵelementEnd();
1626
+ } if (rf & 2) {
1627
+ const s_r68 = ctx.$implicit;
1628
+ const ctx_r2 = i0.ɵɵnextContext(3);
1629
+ i0.ɵɵproperty("value", s_r68.ID)("selected", ctx_r2.TestToolServerID === s_r68.ID);
1630
+ i0.ɵɵadvance();
1631
+ i0.ɵɵtextInterpolate(s_r68.Name);
1632
+ } }
1633
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_21_Template(rf, ctx) { if (rf & 1) {
1634
+ i0.ɵɵelementStart(0, "option", 238);
1635
+ i0.ɵɵtext(1);
1636
+ i0.ɵɵelementEnd();
1637
+ } if (rf & 2) {
1638
+ const c_r70 = ctx.$implicit;
1639
+ const ctx_r2 = i0.ɵɵnextContext(3);
1640
+ i0.ɵɵproperty("value", c_r70.ID)("selected", ctx_r2.TestToolConnectionID === c_r70.ID);
1641
+ i0.ɵɵadvance();
1642
+ i0.ɵɵtextInterpolate(c_r70.Name);
1643
+ } }
1644
+ function MCPDashboardComponent_Conditional_75_Conditional_20_Conditional_30_Template(rf, ctx) { if (rf & 1) {
1645
+ i0.ɵɵelementStart(0, "div", 150);
1646
+ i0.ɵɵtext(1, "No tools match.");
1647
+ i0.ɵɵelementEnd();
1648
+ } }
1649
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1650
+ i0.ɵɵelementStart(0, "span", 243);
1651
+ i0.ɵɵtext(1, "Recent");
1652
+ i0.ɵɵelementEnd();
1653
+ } }
1654
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1655
+ i0.ɵɵelementStart(0, "div", 245);
1656
+ i0.ɵɵtext(1);
1657
+ i0.ɵɵelementEnd();
1658
+ } if (rf & 2) {
1659
+ const t_r73 = i0.ɵɵnextContext().$implicit;
1660
+ i0.ɵɵadvance();
1661
+ i0.ɵɵtextInterpolate(t_r73.ToolName);
1662
+ } }
1663
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1664
+ i0.ɵɵelement(0, "i", 246);
1665
+ } }
1666
+ function MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Template(rf, ctx) { if (rf & 1) {
1667
+ const _r72 = i0.ɵɵgetCurrentView();
1668
+ i0.ɵɵelementStart(0, "div", 242);
1669
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Template_div_click_0_listener() { const t_r73 = i0.ɵɵrestoreView(_r72).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.pickTestTool(t_r73.ID)); });
1670
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_1_Template, 2, 0, "span", 243);
1671
+ i0.ɵɵelementStart(2, "div", 152)(3, "div", 244);
1672
+ i0.ɵɵtext(4);
1673
+ i0.ɵɵelementEnd();
1674
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_5_Template, 2, 1, "div", 245);
1675
+ i0.ɵɵelementEnd();
1676
+ i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Conditional_6_Template, 1, 0, "i", 246);
1677
+ i0.ɵɵelementEnd();
1678
+ } if (rf & 2) {
1679
+ const t_r73 = ctx.$implicit;
1680
+ const ctx_r2 = i0.ɵɵnextContext(3);
1681
+ i0.ɵɵstyleProp("background", ctx_r2.TestToolID === t_r73.ID ? "color-mix(in srgb, var(--mj-brand-primary,#264FAF) 12%, var(--mj-bg-surface,#fff))" : null);
1682
+ i0.ɵɵadvance();
1683
+ i0.ɵɵconditional(ctx_r2.isRecentTestTool(t_r73.ID) ? 1 : -1);
1684
+ i0.ɵɵadvance(3);
1685
+ i0.ɵɵtextInterpolate(t_r73.ToolTitle || t_r73.ToolName);
1686
+ i0.ɵɵadvance();
1687
+ i0.ɵɵconditional(t_r73.ToolTitle && t_r73.ToolName !== t_r73.ToolTitle ? 5 : -1);
1688
+ i0.ɵɵadvance();
1689
+ i0.ɵɵconditional(ctx_r2.TestToolID === t_r73.ID ? 6 : -1);
1690
+ } }
1691
+ function MCPDashboardComponent_Conditional_75_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1692
+ const _r66 = i0.ɵɵgetCurrentView();
1693
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 219);
1694
+ i0.ɵɵtext(2, "Server ");
1695
+ i0.ɵɵelementStart(3, "span", 220);
1696
+ i0.ɵɵtext(4, "*");
1697
+ i0.ɵɵelementEnd()();
1698
+ i0.ɵɵelementStart(5, "select", 237, 20);
1699
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_75_Conditional_20_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r66); const tSrv_r67 = i0.ɵɵreference(6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTestServerChange(tSrv_r67.value)); });
1700
+ i0.ɵɵelementStart(7, "option", 229);
1701
+ i0.ɵɵtext(8, "\u2014 select server \u2014");
1702
+ i0.ɵɵelementEnd();
1703
+ i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_75_Conditional_20_For_10_Template, 2, 3, "option", 238, _forTrack0);
1704
+ i0.ɵɵelementEnd()();
1705
+ i0.ɵɵelementStart(11, "div", 218)(12, "label", 219);
1706
+ i0.ɵɵtext(13, "Connection ");
1707
+ i0.ɵɵelementStart(14, "span", 220);
1708
+ i0.ɵɵtext(15, "*");
1709
+ i0.ɵɵelementEnd()();
1710
+ i0.ɵɵelementStart(16, "select", 237, 21);
1711
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_75_Conditional_20_Template_select_change_16_listener() { i0.ɵɵrestoreView(_r66); const tConn_r69 = i0.ɵɵreference(17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTestConnectionChange(tConn_r69.value)); });
1712
+ i0.ɵɵelementStart(18, "option", 229);
1713
+ i0.ɵɵtext(19, "\u2014 select connection \u2014");
1714
+ i0.ɵɵelementEnd();
1715
+ i0.ɵɵrepeaterCreate(20, MCPDashboardComponent_Conditional_75_Conditional_20_For_21_Template, 2, 3, "option", 238, _forTrack0);
1716
+ i0.ɵɵelementEnd()();
1717
+ i0.ɵɵelementStart(22, "div", 218)(23, "label", 219);
1718
+ i0.ɵɵtext(24, "Tool ");
1719
+ i0.ɵɵelementStart(25, "span", 220);
1720
+ i0.ɵɵtext(26, "*");
1721
+ i0.ɵɵelementEnd()();
1722
+ i0.ɵɵelementStart(27, "input", 239, 22);
1723
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_75_Conditional_20_Template_input_input_27_listener() { i0.ɵɵrestoreView(_r66); const tSearch_r71 = i0.ɵɵreference(28); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTestToolSearchChange(tSearch_r71.value)); });
1724
+ i0.ɵɵelementEnd();
1725
+ i0.ɵɵelementStart(29, "div", 240);
1726
+ i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_75_Conditional_20_Conditional_30_Template, 2, 0, "div", 150);
1727
+ i0.ɵɵrepeaterCreate(31, MCPDashboardComponent_Conditional_75_Conditional_20_For_32_Template, 7, 6, "div", 241, _forTrack0);
1728
+ i0.ɵɵelementEnd()();
1729
+ } if (rf & 2) {
1730
+ const ctx_r2 = i0.ɵɵnextContext(2);
1731
+ i0.ɵɵadvance(9);
1732
+ i0.ɵɵrepeater(ctx_r2.servers);
1733
+ i0.ɵɵadvance(7);
1734
+ i0.ɵɵattribute("disabled", !ctx_r2.TestToolServerID ? true : null);
1735
+ i0.ɵɵadvance(4);
1736
+ i0.ɵɵrepeater(ctx_r2.TestFilteredConnections);
1737
+ i0.ɵɵadvance(7);
1738
+ i0.ɵɵproperty("value", ctx_r2.TestToolSearch);
1739
+ i0.ɵɵattribute("disabled", !ctx_r2.TestToolServerID ? true : null);
1740
+ i0.ɵɵadvance(3);
1741
+ i0.ɵɵconditional(ctx_r2.TestComboboxTools.length === 0 ? 30 : -1);
1742
+ i0.ɵɵadvance();
1743
+ i0.ɵɵrepeater(ctx_r2.TestComboboxTools);
1744
+ } }
1745
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
1746
+ i0.ɵɵelementStart(0, "div", 247);
1747
+ i0.ɵɵelement(1, "i", 248);
1748
+ i0.ɵɵelementStart(2, "p");
1749
+ i0.ɵɵtext(3, "This tool requires no parameters.");
1750
+ i0.ɵɵelementEnd()();
1751
+ } }
1752
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1753
+ i0.ɵɵelementStart(0, "span", 220);
1754
+ i0.ɵɵtext(1, "*");
1755
+ i0.ɵɵelementEnd();
1756
+ } }
1757
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1758
+ i0.ɵɵelementStart(0, "p", 249);
1759
+ i0.ɵɵtext(1);
1760
+ i0.ɵɵelementEnd();
1761
+ } if (rf & 2) {
1762
+ const p_r74 = i0.ɵɵnextContext().$implicit;
1763
+ i0.ɵɵadvance();
1764
+ i0.ɵɵtextInterpolate(p_r74.description);
1765
+ } }
1766
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_5_For_5_Template(rf, ctx) { if (rf & 1) {
1767
+ i0.ɵɵelementStart(0, "option", 80);
1768
+ i0.ɵɵtext(1);
1769
+ i0.ɵɵelementEnd();
1770
+ } if (rf & 2) {
1771
+ const v_r77 = ctx.$implicit;
1772
+ i0.ɵɵproperty("value", v_r77);
1773
+ i0.ɵɵadvance();
1774
+ i0.ɵɵtextInterpolate(v_r77);
1775
+ } }
1776
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1777
+ const _r75 = i0.ɵɵgetCurrentView();
1778
+ i0.ɵɵelementStart(0, "select", 237, 23);
1779
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_5_Template_select_change_0_listener() { i0.ɵɵrestoreView(_r75); const enumEl_r76 = i0.ɵɵreference(1); const p_r74 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.testSetParam(p_r74.name, enumEl_r76.value)); });
1780
+ i0.ɵɵelementStart(2, "option", 229);
1781
+ i0.ɵɵtext(3, "\u2014 select \u2014");
1782
+ i0.ɵɵelementEnd();
1783
+ i0.ɵɵrepeaterCreate(4, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_5_For_5_Template, 2, 2, "option", 80, i0.ɵɵrepeaterTrackByIndex);
1784
+ i0.ɵɵelementEnd();
1785
+ } if (rf & 2) {
1786
+ const p_r74 = i0.ɵɵnextContext().$implicit;
1787
+ i0.ɵɵadvance(4);
1788
+ i0.ɵɵrepeater(p_r74.enumValues);
1789
+ } }
1790
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1791
+ const _r78 = i0.ɵɵgetCurrentView();
1792
+ i0.ɵɵelementStart(0, "select", 237, 24);
1793
+ i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_6_Template_select_change_0_listener() { i0.ɵɵrestoreView(_r78); const boolEl_r79 = i0.ɵɵreference(1); const p_r74 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.testSetParam(p_r74.name, boolEl_r79.value)); });
1794
+ i0.ɵɵelementStart(2, "option", 253);
1795
+ i0.ɵɵtext(3, "false");
1796
+ i0.ɵɵelementEnd();
1797
+ i0.ɵɵelementStart(4, "option", 254);
1798
+ i0.ɵɵtext(5, "true");
1799
+ i0.ɵɵelementEnd()();
1800
+ } }
1801
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1802
+ const _r80 = i0.ɵɵgetCurrentView();
1803
+ i0.ɵɵelementStart(0, "textarea", 255, 25);
1804
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_7_Template_textarea_input_0_listener() { i0.ɵɵrestoreView(_r80); const jsonEl_r81 = i0.ɵɵreference(1); const p_r74 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.testSetParam(p_r74.name, jsonEl_r81.value)); });
1805
+ i0.ɵɵelementEnd();
1806
+ } if (rf & 2) {
1807
+ const p_r74 = i0.ɵɵnextContext().$implicit;
1808
+ i0.ɵɵproperty("placeholder", "Enter JSON " + p_r74.type + "...");
1809
+ } }
1810
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1811
+ const _r82 = i0.ɵɵgetCurrentView();
1812
+ i0.ɵɵelementStart(0, "input", 256, 26);
1813
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_8_Template_input_input_0_listener() { i0.ɵɵrestoreView(_r82); const strEl_r83 = i0.ɵɵreference(1); const p_r74 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.testSetParam(p_r74.name, strEl_r83.value)); });
1814
+ i0.ɵɵelementEnd();
1815
+ } if (rf & 2) {
1816
+ const p_r74 = i0.ɵɵnextContext().$implicit;
1817
+ i0.ɵɵproperty("placeholder", p_r74.description || "Enter value...");
1818
+ } }
1819
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Template(rf, ctx) { if (rf & 1) {
1820
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 219);
1821
+ i0.ɵɵtext(2);
1822
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_3_Template, 2, 0, "span", 220);
1823
+ i0.ɵɵelementEnd();
1824
+ i0.ɵɵconditionalCreate(4, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_4_Template, 2, 1, "p", 249);
1825
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_5_Template, 6, 0, "select", 250)(6, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_6_Template, 6, 0, "select", 250)(7, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_7_Template, 2, 1, "textarea", 251)(8, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Conditional_8_Template, 2, 1, "input", 252);
1826
+ i0.ɵɵelementEnd();
1827
+ } if (rf & 2) {
1828
+ const p_r74 = ctx.$implicit;
1829
+ i0.ɵɵadvance(2);
1830
+ i0.ɵɵtextInterpolate1(" ", p_r74.name, " ");
1831
+ i0.ɵɵadvance();
1832
+ i0.ɵɵconditional(p_r74.required ? 3 : -1);
1833
+ i0.ɵɵadvance();
1834
+ i0.ɵɵconditional(p_r74.description ? 4 : -1);
1835
+ i0.ɵɵadvance();
1836
+ i0.ɵɵconditional(p_r74.enumValues.length > 0 ? 5 : p_r74.type === "boolean" ? 6 : p_r74.type === "array" || p_r74.type === "object" ? 7 : 8);
1837
+ } }
1838
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1839
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_For_1_Template, 9, 4, "div", 218, _forTrack4);
1840
+ } if (rf & 2) {
1841
+ const ctx_r2 = i0.ɵɵnextContext(3);
1842
+ i0.ɵɵrepeater(ctx_r2.TestParamConfigs);
1843
+ } }
1844
+ function MCPDashboardComponent_Conditional_75_Conditional_21_Template(rf, ctx) { if (rf & 1) {
1845
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_0_Template, 4, 0, "div", 247)(1, MCPDashboardComponent_Conditional_75_Conditional_21_Conditional_1_Template, 2, 0);
1846
+ } if (rf & 2) {
1847
+ const ctx_r2 = i0.ɵɵnextContext(2);
1848
+ i0.ɵɵconditional(ctx_r2.TestParamConfigs.length === 0 ? 0 : 1);
1849
+ } }
1850
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1851
+ i0.ɵɵelementStart(0, "span", 259);
1852
+ i0.ɵɵtext(1);
1853
+ i0.ɵɵelementEnd();
1854
+ } if (rf & 2) {
1855
+ const ctx_r2 = i0.ɵɵnextContext(4);
1856
+ i0.ɵɵadvance();
1857
+ i0.ɵɵtextInterpolate1("", ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.DurationMs, "ms");
1858
+ } }
1859
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_0_Template(rf, ctx) { if (rf & 1) {
1860
+ i0.ɵɵelementStart(0, "div", 257);
1861
+ i0.ɵɵelement(1, "i", 141);
1862
+ i0.ɵɵtext(2, " Execution Successful ");
1863
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_0_Conditional_3_Template, 2, 1, "span", 259);
1864
+ i0.ɵɵelementEnd();
1865
+ } if (rf & 2) {
1866
+ const ctx_r2 = i0.ɵɵnextContext(3);
1867
+ i0.ɵɵadvance(3);
1868
+ i0.ɵɵconditional((ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.DurationMs) ? 3 : -1);
1869
+ } }
1870
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1871
+ i0.ɵɵelementStart(0, "div", 258);
1872
+ i0.ɵɵelement(1, "i", 204);
1873
+ i0.ɵɵtext(2, " Execution Failed ");
1874
+ i0.ɵɵelementEnd();
1875
+ } }
1876
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1877
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 260);
1878
+ i0.ɵɵtext(2, "Error");
1879
+ i0.ɵɵelementEnd();
1880
+ i0.ɵɵelementStart(3, "pre", 261);
1881
+ i0.ɵɵtext(4);
1882
+ i0.ɵɵelementEnd()();
1883
+ } if (rf & 2) {
1884
+ const ctx_r2 = i0.ɵɵnextContext(3);
1885
+ i0.ɵɵadvance(4);
1886
+ i0.ɵɵtextInterpolate(ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.ErrorMessage);
1887
+ } }
1888
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1889
+ i0.ɵɵelementStart(0, "div")(1, "label", 260);
1890
+ i0.ɵɵtext(2, "Result");
1891
+ i0.ɵɵelementEnd();
1892
+ i0.ɵɵelementStart(3, "pre", 262);
1893
+ i0.ɵɵtext(4);
1894
+ i0.ɵɵelementEnd()();
1895
+ } if (rf & 2) {
1896
+ const ctx_r2 = i0.ɵɵnextContext(3);
1897
+ i0.ɵɵadvance(4);
1898
+ i0.ɵɵtextInterpolate(ctx_r2.formatTestResult(ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.Result));
1899
+ } }
1900
+ function MCPDashboardComponent_Conditional_75_Conditional_22_Template(rf, ctx) { if (rf & 1) {
1901
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_0_Template, 4, 1, "div", 257)(1, MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_1_Template, 3, 0, "div", 258);
1902
+ i0.ɵɵconditionalCreate(2, MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_2_Template, 5, 1, "div", 218);
1903
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_75_Conditional_22_Conditional_3_Template, 5, 1, "div");
1904
+ } if (rf & 2) {
1905
+ const ctx_r2 = i0.ɵɵnextContext(2);
1906
+ i0.ɵɵconditional((ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.Success) ? 0 : 1);
1907
+ i0.ɵɵadvance(2);
1908
+ i0.ɵɵconditional((ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.ErrorMessage) ? 2 : -1);
1909
+ i0.ɵɵadvance();
1910
+ i0.ɵɵconditional((ctx_r2.TestExecutionResult == null ? null : ctx_r2.TestExecutionResult.Result) ? 3 : -1);
1911
+ } }
1912
+ function MCPDashboardComponent_Conditional_75_Conditional_24_Template(rf, ctx) { if (rf & 1) {
1913
+ const _r84 = i0.ɵɵgetCurrentView();
1914
+ i0.ɵɵelementStart(0, "button", 224);
1915
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_24_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r84); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testProceedToConfig()); });
1916
+ i0.ɵɵtext(1, "Next ");
1917
+ i0.ɵɵelement(2, "i", 263);
1918
+ i0.ɵɵelementEnd();
1919
+ i0.ɵɵelementStart(3, "button", 225);
1920
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_24_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r84); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testCloseDialog()); });
1921
+ i0.ɵɵtext(4, "Cancel");
1922
+ i0.ɵɵelementEnd();
1923
+ } if (rf & 2) {
1924
+ const ctx_r2 = i0.ɵɵnextContext(2);
1925
+ i0.ɵɵproperty("disabled", !ctx_r2.TestCanProceed);
1926
+ } }
1927
+ function MCPDashboardComponent_Conditional_75_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1928
+ i0.ɵɵelement(0, "i", 205);
1929
+ i0.ɵɵtext(1, " Executing... ");
1930
+ } }
1931
+ function MCPDashboardComponent_Conditional_75_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1932
+ i0.ɵɵelement(0, "i", 75);
1933
+ i0.ɵɵtext(1, " Execute ");
1934
+ } }
1935
+ function MCPDashboardComponent_Conditional_75_Conditional_25_Template(rf, ctx) { if (rf & 1) {
1936
+ const _r85 = i0.ɵɵgetCurrentView();
1937
+ i0.ɵɵelementStart(0, "button", 224);
1938
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_25_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r85); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testExecuteTool()); });
1939
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_75_Conditional_25_Conditional_1_Template, 2, 0)(2, MCPDashboardComponent_Conditional_75_Conditional_25_Conditional_2_Template, 2, 0);
1940
+ i0.ɵɵelementEnd();
1941
+ i0.ɵɵelementStart(3, "button", 225);
1942
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r85); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testGoBack()); });
1943
+ i0.ɵɵelement(4, "i", 264);
1944
+ i0.ɵɵtext(5, " Back");
1945
+ i0.ɵɵelementEnd();
1946
+ } if (rf & 2) {
1947
+ const ctx_r2 = i0.ɵɵnextContext(2);
1948
+ i0.ɵɵproperty("disabled", !ctx_r2.TestIsValid || ctx_r2.TestIsExecuting);
1949
+ i0.ɵɵadvance();
1950
+ i0.ɵɵconditional(ctx_r2.TestIsExecuting ? 1 : 2);
1951
+ } }
1952
+ function MCPDashboardComponent_Conditional_75_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1953
+ const _r86 = i0.ɵɵgetCurrentView();
1954
+ i0.ɵɵelementStart(0, "button", 68);
1955
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_26_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r86); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testRunAgain()); });
1956
+ i0.ɵɵelement(1, "i", 265);
1957
+ i0.ɵɵtext(2, " Run Again");
1958
+ i0.ɵɵelementEnd();
1959
+ i0.ɵɵelementStart(3, "button", 225);
1960
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_26_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r86); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testGoBack()); });
1961
+ i0.ɵɵtext(4, "Edit Params");
1962
+ i0.ɵɵelementEnd();
1963
+ i0.ɵɵelementStart(5, "button", 225);
1964
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Conditional_26_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r86); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.testCloseDialog()); });
1965
+ i0.ɵɵtext(6, "Close");
1966
+ i0.ɵɵelementEnd();
1967
+ } }
1968
+ function MCPDashboardComponent_Conditional_75_Template(rf, ctx) { if (rf & 1) {
1969
+ const _r65 = i0.ɵɵgetCurrentView();
1970
+ i0.ɵɵelementStart(0, "div", 211);
1971
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r65); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.testCloseDialog()); });
1972
+ i0.ɵɵelementStart(1, "div", 232);
1973
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r65); return i0.ɵɵresetView($event.stopPropagation()); });
1974
+ i0.ɵɵelementStart(2, "div", 213)(3, "h2", 214);
1975
+ i0.ɵɵtext(4, " Test MCP Tool ");
1976
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_75_Conditional_5_Template, 2, 1, "span", 233);
1977
+ i0.ɵɵelementEnd();
1978
+ i0.ɵɵelementStart(6, "button", 215);
1979
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_75_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r65); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.testCloseDialog()); });
1980
+ i0.ɵɵelement(7, "i", 96);
1981
+ i0.ɵɵelementEnd()();
1982
+ i0.ɵɵelementStart(8, "div", 234)(9, "span", 235);
1983
+ i0.ɵɵtext(10, "1. Select");
1984
+ i0.ɵɵelementEnd();
1985
+ i0.ɵɵelementStart(11, "span", 236);
1986
+ i0.ɵɵtext(12, "\u203A");
1987
+ i0.ɵɵelementEnd();
1988
+ i0.ɵɵelementStart(13, "span", 235);
1989
+ i0.ɵɵtext(14, "2. Configure");
1990
+ i0.ɵɵelementEnd();
1991
+ i0.ɵɵelementStart(15, "span", 236);
1992
+ i0.ɵɵtext(16, "\u203A");
1993
+ i0.ɵɵelementEnd();
1994
+ i0.ɵɵelementStart(17, "span", 235);
1995
+ i0.ɵɵtext(18, "3. Results");
1996
+ i0.ɵɵelementEnd()();
1997
+ i0.ɵɵelementStart(19, "div", 216);
1998
+ i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_75_Conditional_20_Template, 33, 4)(21, MCPDashboardComponent_Conditional_75_Conditional_21_Template, 2, 1)(22, MCPDashboardComponent_Conditional_75_Conditional_22_Template, 4, 3);
1999
+ i0.ɵɵelementEnd();
2000
+ i0.ɵɵelementStart(23, "div", 223);
2001
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_75_Conditional_24_Template, 5, 1)(25, MCPDashboardComponent_Conditional_75_Conditional_25_Template, 6, 2)(26, MCPDashboardComponent_Conditional_75_Conditional_26_Template, 7, 0);
2002
+ i0.ɵɵelementEnd()()();
2003
+ } if (rf & 2) {
2004
+ const ctx_r2 = i0.ɵɵnextContext();
2005
+ i0.ɵɵadvance(5);
2006
+ i0.ɵɵconditional(ctx_r2.TestStep !== "select" ? 5 : -1);
2007
+ i0.ɵɵadvance(4);
2008
+ i0.ɵɵstyleProp("color", ctx_r2.TestStep === "select" ? "var(--mj-brand-primary,#264FAF)" : "var(--mj-text-muted,#888)");
2009
+ i0.ɵɵadvance(4);
2010
+ i0.ɵɵstyleProp("color", ctx_r2.TestStep === "configure" ? "var(--mj-brand-primary,#264FAF)" : "var(--mj-text-muted,#888)");
2011
+ i0.ɵɵadvance(4);
2012
+ i0.ɵɵstyleProp("color", ctx_r2.TestStep === "results" ? "var(--mj-brand-primary,#264FAF)" : "var(--mj-text-muted,#888)");
2013
+ i0.ɵɵadvance(3);
2014
+ i0.ɵɵconditional(ctx_r2.TestStep === "select" ? 20 : ctx_r2.TestStep === "configure" ? 21 : 22);
2015
+ i0.ɵɵadvance(4);
2016
+ i0.ɵɵconditional(ctx_r2.TestStep === "select" ? 24 : ctx_r2.TestStep === "configure" ? 25 : 26);
2017
+ } }
2018
+ function MCPDashboardComponent_Conditional_76_Conditional_14_Template(rf, ctx) { if (rf & 1) {
2019
+ i0.ɵɵelementStart(0, "span", 272);
2020
+ i0.ɵɵtext(1, "\u00B7");
2021
+ i0.ɵɵelementEnd();
2022
+ i0.ɵɵelementStart(2, "span");
2023
+ i0.ɵɵtext(3);
2024
+ i0.ɵɵelementEnd();
2025
+ } if (rf & 2) {
2026
+ const ctx_r2 = i0.ɵɵnextContext(2);
2027
+ i0.ɵɵadvance(3);
2028
+ i0.ɵɵtextInterpolate(ctx_r2.formatDuration(ctx_r2.SelectedLog.DurationMs));
2029
+ } }
2030
+ function MCPDashboardComponent_Conditional_76_Conditional_23_Template(rf, ctx) { if (rf & 1) {
2031
+ i0.ɵɵelementStart(0, "div", 278);
2032
+ i0.ɵɵtext(1);
2033
+ i0.ɵɵelementEnd();
2034
+ } if (rf & 2) {
2035
+ const ctx_r2 = i0.ɵɵnextContext(2);
2036
+ i0.ɵɵadvance();
2037
+ i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.ServerName);
2038
+ } }
2039
+ function MCPDashboardComponent_Conditional_76_Conditional_24_Template(rf, ctx) { if (rf & 1) {
2040
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 280);
2041
+ i0.ɵɵtext(2, "Input Arguments");
2042
+ i0.ɵɵelementEnd();
2043
+ i0.ɵɵelementStart(3, "pre", 281);
2044
+ i0.ɵɵtext(4);
2045
+ i0.ɵɵelementEnd()();
1057
2046
  } if (rf & 2) {
1058
- let tmp_1_0;
1059
- const ctx_r1 = i0.ɵɵnextContext();
1060
- i0.ɵɵconditional((tmp_1_0 = ctx_r1.ActiveTab) === "servers" ? 0 : tmp_1_0 === "connections" ? 1 : tmp_1_0 === "tools" ? 2 : tmp_1_0 === "logs" ? 3 : -1);
2047
+ const ctx_r2 = i0.ɵɵnextContext(2);
2048
+ i0.ɵɵadvance(4);
2049
+ i0.ɵɵtextInterpolate(ctx_r2.formatLogJson(ctx_r2.SelectedLog.InputArgs));
1061
2050
  } }
1062
- function MCPDashboardComponent_Conditional_51_Template(rf, ctx) { if (rf & 1) {
1063
- const _r26 = i0.ɵɵgetCurrentView();
1064
- i0.ɵɵelementStart(0, "mj-mcp-server-dialog", 147);
1065
- i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_51_Template_mj_mcp_server_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onServerDialogClose($event)); });
2051
+ function MCPDashboardComponent_Conditional_76_Conditional_25_Template(rf, ctx) { if (rf & 1) {
2052
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 280);
2053
+ i0.ɵɵtext(2, "Result");
1066
2054
  i0.ɵɵelementEnd();
2055
+ i0.ɵɵelementStart(3, "pre", 282);
2056
+ i0.ɵɵtext(4);
2057
+ i0.ɵɵelementEnd()();
1067
2058
  } if (rf & 2) {
1068
- const ctx_r1 = i0.ɵɵnextContext();
1069
- i0.ɵɵproperty("server", ctx_r1.EditingServer)("visible", ctx_r1.ShowServerDialog);
2059
+ const ctx_r2 = i0.ɵɵnextContext(2);
2060
+ i0.ɵɵadvance(4);
2061
+ i0.ɵɵtextInterpolate(ctx_r2.formatLogJson(ctx_r2.SelectedLog.Result));
1070
2062
  } }
1071
- function MCPDashboardComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
1072
- const _r27 = i0.ɵɵgetCurrentView();
1073
- i0.ɵɵelementStart(0, "mj-mcp-connection-dialog", 148);
1074
- i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_52_Template_mj_mcp_connection_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onConnectionDialogClose($event)); });
2063
+ function MCPDashboardComponent_Conditional_76_Conditional_26_Template(rf, ctx) { if (rf & 1) {
2064
+ i0.ɵɵelementStart(0, "div", 218)(1, "label", 283);
2065
+ i0.ɵɵtext(2, "Error");
1075
2066
  i0.ɵɵelementEnd();
2067
+ i0.ɵɵelementStart(3, "pre", 284);
2068
+ i0.ɵɵtext(4);
2069
+ i0.ɵɵelementEnd()();
1076
2070
  } if (rf & 2) {
1077
- const ctx_r1 = i0.ɵɵnextContext();
1078
- i0.ɵɵproperty("connection", ctx_r1.EditingConnection)("servers", ctx_r1.servers)("visible", ctx_r1.ShowConnectionDialog);
2071
+ const ctx_r2 = i0.ɵɵnextContext(2);
2072
+ i0.ɵɵadvance(4);
2073
+ i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.ErrorMessage);
1079
2074
  } }
1080
- function MCPDashboardComponent_Conditional_53_Template(rf, ctx) { if (rf & 1) {
1081
- const _r28 = i0.ɵɵgetCurrentView();
1082
- i0.ɵɵelementStart(0, "mj-mcp-test-tool-dialog", 149);
1083
- i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_53_Template_mj_mcp_test_tool_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestToolDialogClose()); });
2075
+ function MCPDashboardComponent_Conditional_76_Conditional_28_Template(rf, ctx) { if (rf & 1) {
2076
+ const _r88 = i0.ɵɵgetCurrentView();
2077
+ i0.ɵɵelementStart(0, "button", 68);
2078
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_76_Conditional_28_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r88); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onRunAgainFromLog({ toolId: ctx_r2.SelectedLog.ToolID, connectionId: ctx_r2.SelectedLog.ConnectionID })); });
2079
+ i0.ɵɵelement(1, "i", 265);
2080
+ i0.ɵɵtext(2, " Run Again");
1084
2081
  i0.ɵɵelementEnd();
1085
- } if (rf & 2) {
1086
- const ctx_r1 = i0.ɵɵnextContext();
1087
- i0.ɵɵproperty("Visible", ctx_r1.ShowTestToolDialog)("Servers", ctx_r1.servers)("Connections", ctx_r1.connections)("Tools", ctx_r1.tools)("SelectedServerID", ctx_r1.TestToolServerID)("SelectedConnectionID", ctx_r1.TestToolConnectionID)("SelectedToolID", ctx_r1.TestToolID);
1088
2082
  } }
1089
- function MCPDashboardComponent_Conditional_54_Template(rf, ctx) { if (rf & 1) {
1090
- const _r29 = i0.ɵɵgetCurrentView();
1091
- i0.ɵɵelementStart(0, "mj-mcp-log-detail-panel", 150);
1092
- i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_Close_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); })("RunAgain", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_RunAgain_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRunAgainFromLog($event)); });
2083
+ function MCPDashboardComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
2084
+ const _r87 = i0.ɵɵgetCurrentView();
2085
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 266);
2086
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_76_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r87); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onLogDetailClose()); });
2087
+ i0.ɵɵelementEnd();
2088
+ i0.ɵɵelementStart(2, "div", 267)(3, "div", 268)(4, "div")(5, "h3", 269);
2089
+ i0.ɵɵtext(6);
2090
+ i0.ɵɵelementEnd();
2091
+ i0.ɵɵelementStart(7, "div", 270)(8, "span", 271);
2092
+ i0.ɵɵtext(9);
2093
+ i0.ɵɵelementEnd();
2094
+ i0.ɵɵelementStart(10, "span", 272);
2095
+ i0.ɵɵtext(11, "\u00B7");
1093
2096
  i0.ɵɵelementEnd();
2097
+ i0.ɵɵelementStart(12, "span");
2098
+ i0.ɵɵtext(13);
2099
+ i0.ɵɵelementEnd();
2100
+ i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_76_Conditional_14_Template, 4, 1);
2101
+ i0.ɵɵelementEnd()();
2102
+ i0.ɵɵelementStart(15, "button", 273);
2103
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_76_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r87); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onLogDetailClose()); });
2104
+ i0.ɵɵelement(16, "i", 274);
2105
+ i0.ɵɵelementEnd()();
2106
+ i0.ɵɵelementStart(17, "div", 275)(18, "div", 218)(19, "div", 276);
2107
+ i0.ɵɵtext(20, "Connection");
2108
+ i0.ɵɵelementEnd();
2109
+ i0.ɵɵelementStart(21, "div", 277);
2110
+ i0.ɵɵtext(22);
2111
+ i0.ɵɵelementEnd();
2112
+ i0.ɵɵconditionalCreate(23, MCPDashboardComponent_Conditional_76_Conditional_23_Template, 2, 1, "div", 278);
2113
+ i0.ɵɵelementEnd();
2114
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_76_Conditional_24_Template, 5, 1, "div", 218);
2115
+ i0.ɵɵconditionalCreate(25, MCPDashboardComponent_Conditional_76_Conditional_25_Template, 5, 1, "div", 218);
2116
+ i0.ɵɵconditionalCreate(26, MCPDashboardComponent_Conditional_76_Conditional_26_Template, 5, 1, "div", 218);
2117
+ i0.ɵɵelementEnd();
2118
+ i0.ɵɵelementStart(27, "div", 279);
2119
+ i0.ɵɵconditionalCreate(28, MCPDashboardComponent_Conditional_76_Conditional_28_Template, 3, 0, "button", 44);
2120
+ i0.ɵɵelementStart(29, "button", 225);
2121
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_76_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r87); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onLogDetailClose()); });
2122
+ i0.ɵɵtext(30, "Close");
2123
+ i0.ɵɵelementEnd()()()();
1094
2124
  } if (rf & 2) {
1095
- const ctx_r1 = i0.ɵɵnextContext();
1096
- i0.ɵɵproperty("Visible", ctx_r1.ShowLogDetailPanel)("Log", ctx_r1.SelectedLog);
2125
+ const ctx_r2 = i0.ɵɵnextContext();
2126
+ i0.ɵɵadvance(6);
2127
+ i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.ToolName);
2128
+ i0.ɵɵadvance(2);
2129
+ i0.ɵɵclassMap(ctx_r2.SelectedLog.Status === "Success" ? "status-success" : ctx_r2.SelectedLog.Status === "Error" ? "status-error" : "status-running");
2130
+ i0.ɵɵadvance();
2131
+ i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.Status);
2132
+ i0.ɵɵadvance(4);
2133
+ i0.ɵɵtextInterpolate(ctx_r2.formatDate(ctx_r2.SelectedLog.StartedAt));
2134
+ i0.ɵɵadvance();
2135
+ i0.ɵɵconditional(ctx_r2.SelectedLog.DurationMs != null ? 14 : -1);
2136
+ i0.ɵɵadvance(8);
2137
+ i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.ConnectionName || ctx_r2.SelectedLog.ConnectionID);
2138
+ i0.ɵɵadvance();
2139
+ i0.ɵɵconditional(ctx_r2.SelectedLog.ServerName ? 23 : -1);
2140
+ i0.ɵɵadvance();
2141
+ i0.ɵɵconditional(ctx_r2.SelectedLog.InputArgs ? 24 : -1);
2142
+ i0.ɵɵadvance();
2143
+ i0.ɵɵconditional(ctx_r2.SelectedLog.Result ? 25 : -1);
2144
+ i0.ɵɵadvance();
2145
+ i0.ɵɵconditional(ctx_r2.SelectedLog.ErrorMessage ? 26 : -1);
2146
+ i0.ɵɵadvance(2);
2147
+ i0.ɵɵconditional(ctx_r2.SelectedLog.ToolID ? 28 : -1);
1097
2148
  } }
1098
2149
  /**
1099
2150
  * MCP Management Dashboard Component
@@ -1123,6 +2174,26 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1123
2174
  filteredConnections = [];
1124
2175
  filteredTools = [];
1125
2176
  filteredLogs = [];
2177
+ /** Part 3.2 — paginated tools (scales to thousands). Appended as user scrolls. */
2178
+ pagedTools = [];
2179
+ toolsTotalCount = 0;
2180
+ toolsLoading = false;
2181
+ toolsSkip = 0;
2182
+ toolsPageSize = 50;
2183
+ useScalablePagination = false;
2184
+ /** Part 3.6 — favorited tool IDs for the current user. */
2185
+ favoritedToolIDs = new Set();
2186
+ /** Part 3.5 — Test dialog search string for tool combobox-style filter */
2187
+ TestToolSearch = '';
2188
+ /** Part 3.3 — derived data for the filter panel */
2189
+ toolsAvailableServers = [];
2190
+ toolsAvailableCategories = [];
2191
+ /** Part 3.4 — tool counts from GetMCPToolCounts (global, respects search) */
2192
+ toolsGlobalCount = 0;
2193
+ /** Per-server tool count map used for "(N tools)" badge on group headers */
2194
+ toolCountByServer = {};
2195
+ /** Part 3.4 — auto-collapse threshold for server groups */
2196
+ AUTO_COLLAPSE_THRESHOLD = 100;
1126
2197
  stats = {
1127
2198
  totalServers: 0,
1128
2199
  activeServers: 0,
@@ -1149,10 +2220,47 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1149
2220
  ShowTestToolDialog = false;
1150
2221
  EditingServer = null;
1151
2222
  EditingConnection = null;
1152
- // Test tool dialog pre-selection
2223
+ // Inline server form state (avoids sub-component DI issues)
2224
+ ServerForm = {
2225
+ Name: '', Description: '', TransportType: 'StreamableHTTP',
2226
+ ServerURL: '', Command: '', DefaultAuthType: 'None', Status: 'Active',
2227
+ RateLimitPerMinute: null,
2228
+ RateLimitPerHour: null,
2229
+ RequestTimeoutMs: 60000
2230
+ };
2231
+ ServerFormSaving = false;
2232
+ ServerFormError = null;
2233
+ TransportTypes = [
2234
+ { value: 'StreamableHTTP', label: 'Streamable HTTP' },
2235
+ { value: 'SSE', label: 'Server-Sent Events' },
2236
+ { value: 'Stdio', label: 'Standard I/O' },
2237
+ { value: 'WebSocket', label: 'WebSocket' }
2238
+ ];
2239
+ AuthTypes = [
2240
+ { value: 'None', label: 'None' },
2241
+ { value: 'Bearer', label: 'Bearer Token' },
2242
+ { value: 'APIKey', label: 'API Key' },
2243
+ { value: 'OAuth2', label: 'OAuth 2.0' },
2244
+ { value: 'Basic', label: 'Basic Auth' }
2245
+ ];
2246
+ // Inline connection form state
2247
+ ConnectionForm = {
2248
+ MCPServerID: '', Name: '', Description: '', BearerToken: '', Status: 'Active'
2249
+ };
2250
+ ConnectionFormSaving = false;
2251
+ ConnectionFormError = null;
2252
+ // Inline test tool form state
2253
+ TestStep = 'select';
1153
2254
  TestToolServerID = null;
1154
2255
  TestToolConnectionID = null;
1155
2256
  TestToolID = null;
2257
+ TestFilteredConnections = [];
2258
+ TestFilteredTools = [];
2259
+ TestSelectedTool = null;
2260
+ TestParamConfigs = [];
2261
+ TestParamValues = {};
2262
+ TestIsExecuting = false;
2263
+ TestExecutionResult = null;
1156
2264
  // Log detail panel state
1157
2265
  ShowLogDetailPanel = false;
1158
2266
  SelectedLog = null;
@@ -1399,6 +2507,7 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1399
2507
  Description: c.Description,
1400
2508
  Status: c.Status,
1401
2509
  CompanyID: c.CompanyID,
2510
+ CredentialID: c.CredentialID ?? null,
1402
2511
  AutoSyncTools: c.AutoSyncTools,
1403
2512
  LogToolCalls: c.LogToolCalls,
1404
2513
  LastConnectedAt: c.LastConnectedAt,
@@ -1426,8 +2535,13 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1426
2535
  this.enrichLogData();
1427
2536
  // Calculate stats
1428
2537
  this.calculateStats();
2538
+ // Populate filter dropdowns from loaded data (needed even outside Scale mode)
2539
+ this.toolsAvailableServers = this.servers.map(s => ({ ID: s.ID, Name: s.Name }));
2540
+ this.toolsAvailableCategories = this.computeCategoriesFromTools();
1429
2541
  // Apply filters
1430
2542
  this.applyFilters();
2543
+ // Load user's favorites (Part 3.6) — fire and forget
2544
+ this.loadFavorites();
1431
2545
  }
1432
2546
  catch (error) {
1433
2547
  this.ErrorMessage = `Failed to load data: ${error instanceof Error ? error.message : String(error)}`;
@@ -1552,14 +2666,20 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1552
2666
  const matchesStatus = filters.connectionStatus === 'all' || c.Status === filters.connectionStatus;
1553
2667
  return matchesSearch && matchesStatus;
1554
2668
  });
1555
- // Filter tools
2669
+ // Filter tools (legacy grouped view — now also honors Server / Category / Favorites-only filters)
1556
2670
  this.filteredTools = this.tools.filter(t => {
1557
2671
  const matchesSearch = !search ||
1558
2672
  t.ToolName.toLowerCase().includes(search) ||
1559
2673
  (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||
1560
2674
  (t.ToolDescription?.toLowerCase().includes(search) ?? false);
1561
2675
  const matchesStatus = filters.toolStatus === 'all' || t.Status === filters.toolStatus;
1562
- return matchesSearch && matchesStatus;
2676
+ const matchesServer = !filters.toolsServer || filters.toolsServer === 'all' ||
2677
+ UUIDsEqual(t.MCPServerID, filters.toolsServer);
2678
+ const cat = t.ToolName.indexOf('_') > 0 ? t.ToolName.substring(0, t.ToolName.indexOf('_')) : t.ToolName;
2679
+ const matchesCategory = !filters.toolsCategory || filters.toolsCategory === 'all' || cat === filters.toolsCategory;
2680
+ const matchesFavorite = !filters.favoritesOnly || this.isFavorited(t.ID);
2681
+ const matchesRecent = !filters.recentOnly || this.recentToolIDSet().has(NormalizeUUID(t.ID));
2682
+ return matchesSearch && matchesStatus && matchesServer && matchesCategory && matchesFavorite && matchesRecent;
1563
2683
  });
1564
2684
  // Build server groups for the tools tab
1565
2685
  this.buildServerGroups();
@@ -1615,6 +2735,65 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1615
2735
  onFiltersChange(filters) {
1616
2736
  this.filters$.next(filters);
1617
2737
  this.saveUserPreferencesDebounced();
2738
+ // Part 3.3/3.4 — when Tools tab is active in scale mode, reload the paginated list + counts
2739
+ if (this.ActiveTab === 'tools' && this.useScalablePagination) {
2740
+ this.loadToolsPage(true);
2741
+ this.loadToolCounts();
2742
+ }
2743
+ }
2744
+ /** Inlined filter panel — single-field update helper */
2745
+ onFilterFieldChange(field, value) {
2746
+ const updated = { ...this.filters$.value, [field]: value };
2747
+ this.onFiltersChange(updated);
2748
+ }
2749
+ /** Count of non-default filter dimensions, used for "Filters (N)" badge */
2750
+ activeFilterCount() {
2751
+ const f = this.filters$.value;
2752
+ let n = 0;
2753
+ if (f.searchTerm)
2754
+ n++;
2755
+ if (f.serverStatus && f.serverStatus !== 'all')
2756
+ n++;
2757
+ if (f.connectionStatus && f.connectionStatus !== 'all')
2758
+ n++;
2759
+ if (f.toolStatus && f.toolStatus !== 'all')
2760
+ n++;
2761
+ if (f.logStatus && f.logStatus !== 'all')
2762
+ n++;
2763
+ if (f.toolsServer && f.toolsServer !== 'all')
2764
+ n++;
2765
+ if (f.toolsCategory && f.toolsCategory !== 'all')
2766
+ n++;
2767
+ if (f.favoritesOnly)
2768
+ n++;
2769
+ if (f.recentOnly)
2770
+ n++;
2771
+ return n;
2772
+ }
2773
+ /** Derive category list (snake_case prefix) + counts from the currently loaded tools. */
2774
+ computeCategoriesFromTools() {
2775
+ const counts = new Map();
2776
+ for (const t of this.tools) {
2777
+ const idx = t.ToolName.indexOf('_');
2778
+ const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;
2779
+ counts.set(cat, (counts.get(cat) ?? 0) + 1);
2780
+ }
2781
+ return Array.from(counts.entries())
2782
+ .map(([category, count]) => ({ category, count }))
2783
+ .sort((a, b) => a.category.localeCompare(b.category));
2784
+ }
2785
+ resetAllFilters() {
2786
+ this.onFiltersChange({
2787
+ searchTerm: '',
2788
+ serverStatus: 'all',
2789
+ connectionStatus: 'all',
2790
+ toolStatus: 'all',
2791
+ logStatus: 'all',
2792
+ toolsServer: 'all',
2793
+ toolsCategory: 'all',
2794
+ favoritesOnly: false,
2795
+ recentOnly: false
2796
+ });
1618
2797
  }
1619
2798
  /**
1620
2799
  * Get the current filtered count based on active tab
@@ -1674,11 +2853,26 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1674
2853
  // ========================================
1675
2854
  createServer() {
1676
2855
  this.EditingServer = null;
2856
+ this.ServerForm = { Name: '', Description: '', TransportType: 'StreamableHTTP', ServerURL: '', Command: '', DefaultAuthType: 'None', Status: 'Active', RateLimitPerMinute: null, RateLimitPerHour: null, RequestTimeoutMs: 60000 };
2857
+ this.ServerFormError = null;
1677
2858
  this.ShowServerDialog = true;
1678
2859
  this.cdr.detectChanges();
1679
2860
  }
1680
2861
  editServer(server) {
1681
2862
  this.EditingServer = server;
2863
+ this.ServerForm = {
2864
+ Name: server.Name,
2865
+ Description: server.Description ?? '',
2866
+ TransportType: server.TransportType,
2867
+ ServerURL: server.ServerURL ?? '',
2868
+ Command: server.Command ?? '',
2869
+ DefaultAuthType: server.DefaultAuthType,
2870
+ Status: server.Status,
2871
+ RateLimitPerMinute: server.RateLimitPerMinute,
2872
+ RateLimitPerHour: server.RateLimitPerHour,
2873
+ RequestTimeoutMs: 60000
2874
+ };
2875
+ this.ServerFormError = null;
1682
2876
  this.ShowServerDialog = true;
1683
2877
  this.cdr.detectChanges();
1684
2878
  }
@@ -1910,14 +3104,134 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1910
3104
  }
1911
3105
  this.cdr.detectChanges();
1912
3106
  }
3107
+ cancelServerForm() {
3108
+ this.ShowServerDialog = false;
3109
+ this.ServerFormError = null;
3110
+ this.cdr.detectChanges();
3111
+ }
3112
+ async saveServerForm() {
3113
+ if (!this.ServerForm.Name?.trim()) {
3114
+ this.ServerFormError = 'Name is required';
3115
+ this.cdr.detectChanges();
3116
+ return;
3117
+ }
3118
+ if ((this.ServerForm.TransportType === 'StreamableHTTP' || this.ServerForm.TransportType === 'SSE' || this.ServerForm.TransportType === 'WebSocket') && !this.ServerForm.ServerURL?.trim()) {
3119
+ this.ServerFormError = 'Server URL is required for this transport type';
3120
+ this.cdr.detectChanges();
3121
+ return;
3122
+ }
3123
+ this.ServerFormSaving = true;
3124
+ this.ServerFormError = null;
3125
+ this.cdr.detectChanges();
3126
+ try {
3127
+ const md = new Metadata();
3128
+ const entity = await md.GetEntityObject('MJ: MCP Servers');
3129
+ if (this.EditingServer?.ID) {
3130
+ await entity.Load(this.EditingServer.ID);
3131
+ }
3132
+ else {
3133
+ entity.NewRecord();
3134
+ }
3135
+ entity.Name = this.ServerForm.Name.trim();
3136
+ entity.Description = this.ServerForm.Description?.trim() || null;
3137
+ entity.TransportType = this.ServerForm.TransportType;
3138
+ entity.ServerURL = this.ServerForm.ServerURL?.trim() || null;
3139
+ entity.Command = this.ServerForm.Command?.trim() || null;
3140
+ entity.DefaultAuthType = this.ServerForm.DefaultAuthType;
3141
+ entity.Status = this.ServerForm.Status;
3142
+ entity.RateLimitPerMinute = this.ServerForm.RateLimitPerMinute ?? null;
3143
+ entity.RateLimitPerHour = this.ServerForm.RateLimitPerHour ?? null;
3144
+ entity.RequestTimeoutMs = this.ServerForm.RequestTimeoutMs ?? 60000;
3145
+ const saved = await entity.Save();
3146
+ if (!saved) {
3147
+ throw new Error(entity.LatestResult?.CompleteMessage ?? 'Save failed');
3148
+ }
3149
+ this.ShowServerDialog = false;
3150
+ await this.loadAllData();
3151
+ }
3152
+ catch (err) {
3153
+ this.ServerFormError = err instanceof Error ? err.message : String(err);
3154
+ }
3155
+ finally {
3156
+ this.ServerFormSaving = false;
3157
+ this.cdr.detectChanges();
3158
+ }
3159
+ }
1913
3160
  // ========================================
1914
3161
  // Connection Operations
1915
3162
  // ========================================
1916
3163
  createConnection() {
1917
3164
  this.EditingConnection = null;
3165
+ this.ConnectionForm = { MCPServerID: this.servers[0]?.ID ?? '', Name: '', Description: '', BearerToken: '', Status: 'Active' };
3166
+ this.ConnectionFormError = null;
1918
3167
  this.ShowConnectionDialog = true;
1919
3168
  this.cdr.detectChanges();
1920
3169
  }
3170
+ cancelConnectionForm() {
3171
+ this.ShowConnectionDialog = false;
3172
+ this.ConnectionFormError = null;
3173
+ this.cdr.detectChanges();
3174
+ }
3175
+ async saveConnectionForm() {
3176
+ if (!this.ConnectionForm.MCPServerID) {
3177
+ this.ConnectionFormError = 'Please select a server';
3178
+ this.cdr.detectChanges();
3179
+ return;
3180
+ }
3181
+ if (!this.ConnectionForm.Name?.trim()) {
3182
+ this.ConnectionFormError = 'Name is required';
3183
+ this.cdr.detectChanges();
3184
+ return;
3185
+ }
3186
+ this.ConnectionFormSaving = true;
3187
+ this.ConnectionFormError = null;
3188
+ this.cdr.detectChanges();
3189
+ try {
3190
+ const md = new Metadata();
3191
+ let credentialID = null;
3192
+ // If a bearer token was provided, create a Credential record for it
3193
+ if (this.ConnectionForm.BearerToken?.trim()) {
3194
+ await CredentialEngine.Instance.Config();
3195
+ const credType = CredentialEngine.Instance.CredentialTypes
3196
+ .find(t => /bearer|api/i.test(t.Name));
3197
+ const credTypeID = credType?.ID ?? null;
3198
+ if (credTypeID) {
3199
+ const cred = await md.GetEntityObject('MJ: Credentials');
3200
+ cred.NewRecord();
3201
+ cred.CredentialTypeID = credTypeID;
3202
+ cred.Name = `${this.ConnectionForm.Name.trim()} Token`;
3203
+ cred.Values = JSON.stringify({ apiKey: this.ConnectionForm.BearerToken.trim() });
3204
+ const credSaved = await cred.Save();
3205
+ if (!credSaved)
3206
+ throw new Error(cred.LatestResult?.CompleteMessage ?? 'Failed to save credential');
3207
+ credentialID = cred.ID;
3208
+ }
3209
+ }
3210
+ const entity = await md.GetEntityObject('MJ: MCP Server Connections');
3211
+ entity.NewRecord();
3212
+ entity.MCPServerID = this.ConnectionForm.MCPServerID;
3213
+ entity.Name = this.ConnectionForm.Name.trim();
3214
+ entity.Description = this.ConnectionForm.Description?.trim() || null;
3215
+ entity.Status = this.ConnectionForm.Status;
3216
+ entity.CredentialID = credentialID;
3217
+ entity.AutoSyncTools = true;
3218
+ entity.LogToolCalls = true;
3219
+ entity.LogInputParameters = true;
3220
+ entity.LogOutputContent = true;
3221
+ const saved = await entity.Save();
3222
+ if (!saved)
3223
+ throw new Error(entity.LatestResult?.CompleteMessage ?? 'Save failed');
3224
+ this.ShowConnectionDialog = false;
3225
+ await this.loadAllData();
3226
+ }
3227
+ catch (err) {
3228
+ this.ConnectionFormError = err instanceof Error ? err.message : String(err);
3229
+ }
3230
+ finally {
3231
+ this.ConnectionFormSaving = false;
3232
+ this.cdr.detectChanges();
3233
+ }
3234
+ }
1921
3235
  editConnection(connection) {
1922
3236
  this.EditingConnection = connection;
1923
3237
  this.ShowConnectionDialog = true;
@@ -2027,10 +3341,12 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2027
3341
  if (tools.length > 0) {
2028
3342
  // Sort tools within group
2029
3343
  this.sortTools(tools);
3344
+ // Part 3.4 — auto-collapse groups exceeding the threshold
3345
+ const startExpanded = tools.length <= this.AUTO_COLLAPSE_THRESHOLD;
2030
3346
  this.ServerGroups.push({
2031
3347
  server,
2032
3348
  tools,
2033
- expanded: true // Start expanded
3349
+ expanded: startExpanded
2034
3350
  });
2035
3351
  }
2036
3352
  }
@@ -2094,6 +3410,9 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2094
3410
  else {
2095
3411
  this.TestToolConnectionID = null;
2096
3412
  }
3413
+ this.TestStep = 'select';
3414
+ this.TestExecutionResult = null;
3415
+ this.testUpdateFilteredLists();
2097
3416
  this.ShowTestToolDialog = true;
2098
3417
  this.cdr.detectChanges();
2099
3418
  }
@@ -2101,12 +3420,448 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2101
3420
  * Close Test Tool dialog
2102
3421
  */
2103
3422
  onTestToolDialogClose() {
2104
- this.ShowTestToolDialog = false;
2105
- this.TestToolServerID = null;
3423
+ this.testCloseDialog();
3424
+ }
3425
+ // ========================================
3426
+ // Inline Test Tool Methods
3427
+ // ========================================
3428
+ testUpdateFilteredLists() {
3429
+ if (this.TestToolServerID) {
3430
+ this.TestFilteredConnections = this.connections.filter(c => UUIDsEqual(c.MCPServerID, this.TestToolServerID) && c.Status === 'Active');
3431
+ this.TestFilteredTools = this.tools.filter(t => UUIDsEqual(t.MCPServerID, this.TestToolServerID) && t.Status === 'Active');
3432
+ if (this.TestFilteredConnections.length > 0 && !this.TestToolConnectionID) {
3433
+ this.TestToolConnectionID = this.TestFilteredConnections[0].ID;
3434
+ }
3435
+ }
3436
+ else {
3437
+ this.TestFilteredConnections = [];
3438
+ this.TestFilteredTools = [];
3439
+ }
3440
+ }
3441
+ onTestServerChange(value) {
3442
+ this.TestToolServerID = value || null;
2106
3443
  this.TestToolConnectionID = null;
2107
3444
  this.TestToolID = null;
3445
+ this.testUpdateFilteredLists();
3446
+ this.cdr.detectChanges();
3447
+ }
3448
+ onTestConnectionChange(value) {
3449
+ this.TestToolConnectionID = value || null;
3450
+ }
3451
+ onTestToolSelectChange(value) {
3452
+ this.TestToolID = value || null;
3453
+ }
3454
+ get TestCanProceed() {
3455
+ return !!this.TestToolServerID && !!this.TestToolConnectionID && !!this.TestToolID;
3456
+ }
3457
+ testProceedToConfig() {
3458
+ if (!this.TestCanProceed)
3459
+ return;
3460
+ this.TestSelectedTool = this.tools.find(t => UUIDsEqual(t.ID, this.TestToolID)) ?? null;
3461
+ if (!this.TestSelectedTool)
3462
+ return;
3463
+ this.testParseSchema();
3464
+ this.TestStep = 'configure';
3465
+ this.cdr.detectChanges();
3466
+ }
3467
+ testParseSchema() {
3468
+ this.TestParamConfigs = [];
3469
+ this.TestParamValues = {};
3470
+ if (!this.TestSelectedTool?.InputSchema)
3471
+ return;
3472
+ try {
3473
+ const schema = JSON.parse(this.TestSelectedTool.InputSchema);
3474
+ const required = schema.required ?? [];
3475
+ for (const [name, prop] of Object.entries(schema.properties ?? {})) {
3476
+ const rawType = prop.type;
3477
+ const type = Array.isArray(rawType)
3478
+ ? (rawType.filter(t => t !== 'null')[0] ?? 'string')
3479
+ : (rawType ?? 'string');
3480
+ this.TestParamConfigs.push({
3481
+ name, type, description: prop.description ?? '',
3482
+ required: required.includes(name), enumValues: prop.enum ?? []
3483
+ });
3484
+ this.TestParamValues[name] = '';
3485
+ }
3486
+ this.TestParamConfigs.sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));
3487
+ }
3488
+ catch (e) {
3489
+ console.error('Failed to parse tool schema', e);
3490
+ }
3491
+ }
3492
+ testSetParam(name, value) {
3493
+ this.TestParamValues[name] = value;
3494
+ }
3495
+ get TestIsValid() {
3496
+ return this.TestParamConfigs.filter(p => p.required).every(p => !!this.TestParamValues[p.name]);
3497
+ }
3498
+ async testExecuteTool() {
3499
+ if (!this.TestIsValid || !this.TestToolConnectionID || !this.TestToolID)
3500
+ return;
3501
+ this.TestIsExecuting = true;
3502
+ this.cdr.detectChanges();
3503
+ const inputArgs = {};
3504
+ for (const [k, v] of Object.entries(this.TestParamValues)) {
3505
+ if (v !== '')
3506
+ inputArgs[k] = v;
3507
+ }
3508
+ const mutation = gql `
3509
+ mutation ExecuteMCPTool($input: ExecuteMCPToolInput!) {
3510
+ ExecuteMCPTool(input: $input) { Success ErrorMessage Result DurationMs }
3511
+ }
3512
+ `;
3513
+ try {
3514
+ const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {
3515
+ input: {
3516
+ ConnectionID: this.TestToolConnectionID,
3517
+ ToolID: this.TestToolID,
3518
+ ToolName: this.TestSelectedTool?.ToolName,
3519
+ InputArgs: JSON.stringify(inputArgs)
3520
+ }
3521
+ });
3522
+ this.TestExecutionResult = result?.ExecuteMCPTool ?? { Success: false, ErrorMessage: 'No result returned' };
3523
+ }
3524
+ catch (e) {
3525
+ this.TestExecutionResult = { Success: false, ErrorMessage: e instanceof Error ? e.message : String(e) };
3526
+ }
3527
+ finally {
3528
+ this.TestIsExecuting = false;
3529
+ this.TestStep = 'results';
3530
+ this.cdr.detectChanges();
3531
+ }
3532
+ }
3533
+ testGoBack() {
3534
+ this.TestStep = this.TestStep === 'results' ? 'configure' : 'select';
3535
+ this.cdr.detectChanges();
3536
+ }
3537
+ testRunAgain() {
3538
+ this.TestExecutionResult = null;
3539
+ this.TestStep = 'configure';
3540
+ this.cdr.detectChanges();
3541
+ }
3542
+ testCloseDialog() {
3543
+ this.ShowTestToolDialog = false;
3544
+ this.TestStep = 'select';
3545
+ this.TestSelectedTool = null;
3546
+ this.TestParamConfigs = [];
3547
+ this.TestParamValues = {};
3548
+ this.TestExecutionResult = null;
3549
+ this.cdr.detectChanges();
3550
+ }
3551
+ formatTestResult(result) {
3552
+ if (result == null)
3553
+ return '';
3554
+ if (typeof result === 'string')
3555
+ return result;
3556
+ try {
3557
+ return JSON.stringify(result, null, 2);
3558
+ }
3559
+ catch {
3560
+ return String(result);
3561
+ }
3562
+ }
3563
+ /**
3564
+ * Part 3.2 — loads a page of tools via the paginated resolver.
3565
+ * Uses the same GraphQLDataProvider + gql pattern as testExecuteTool above.
3566
+ */
3567
+ async loadToolsPage(reset = true) {
3568
+ if (this.toolsLoading)
3569
+ return;
3570
+ this.toolsLoading = true;
3571
+ if (reset) {
3572
+ this.toolsSkip = 0;
3573
+ this.pagedTools = [];
3574
+ }
3575
+ try {
3576
+ const filters = this.filters$.value;
3577
+ const query = gql `
3578
+ query GetMCPToolsPage($skip: Int!, $take: Int!, $searchText: String, $serverID: String, $category: String) {
3579
+ GetMCPToolsPage(skip: $skip, take: $take, searchText: $searchText, serverID: $serverID, category: $category) {
3580
+ items { ID MCPServerID ToolName ToolTitle ToolDescription Status ServerName }
3581
+ totalCount
3582
+ hasMore
3583
+ }
3584
+ }
3585
+ `;
3586
+ const result = await GraphQLDataProvider.Instance.ExecuteGQL(query, {
3587
+ skip: this.toolsSkip,
3588
+ take: this.toolsPageSize,
3589
+ searchText: filters.searchTerm || null,
3590
+ serverID: (filters.toolsServer && filters.toolsServer !== 'all') ? filters.toolsServer : null,
3591
+ category: (filters.toolsCategory && filters.toolsCategory !== 'all') ? filters.toolsCategory : null
3592
+ });
3593
+ const page = result?.GetMCPToolsPage;
3594
+ if (page) {
3595
+ this.pagedTools = reset ? page.items : [...this.pagedTools, ...page.items];
3596
+ this.toolsTotalCount = page.totalCount;
3597
+ this.toolsSkip = this.pagedTools.length;
3598
+ }
3599
+ }
3600
+ catch (e) {
3601
+ console.error('[MCPDashboard] loadToolsPage failed:', e);
3602
+ }
3603
+ finally {
3604
+ this.toolsLoading = false;
3605
+ this.cdr.detectChanges();
3606
+ }
3607
+ }
3608
+ onToolsScrolledIndexChange(index) {
3609
+ if (!this.useScalablePagination || this.toolsLoading)
3610
+ return;
3611
+ if (this.pagedTools.length >= this.toolsTotalCount)
3612
+ return;
3613
+ if (index + 20 >= this.pagedTools.length) {
3614
+ this.loadToolsPage(false);
3615
+ }
3616
+ }
3617
+ /** Native-scroll infinite-load: triggers next page when user nears the bottom */
3618
+ onToolsScrollNative(event) {
3619
+ if (!this.useScalablePagination || this.toolsLoading)
3620
+ return;
3621
+ if (this.pagedTools.length >= this.toolsTotalCount)
3622
+ return;
3623
+ const el = event.target;
3624
+ if (el.scrollTop + el.clientHeight >= el.scrollHeight - 200) {
3625
+ this.loadToolsPage(false);
3626
+ }
3627
+ }
3628
+ toggleScalableMode(enabled) {
3629
+ this.useScalablePagination = enabled;
3630
+ if (enabled && this.pagedTools.length === 0) {
3631
+ this.loadToolsPage(true);
3632
+ this.loadToolCounts();
3633
+ }
3634
+ this.cdr.detectChanges();
3635
+ }
3636
+ /**
3637
+ * Part 3.4 — fetch global + per-server + per-category counts (used for badges
3638
+ * and to populate the category filter dropdown). Respects current search filter.
3639
+ */
3640
+ async loadToolCounts() {
3641
+ try {
3642
+ const filters = this.filters$.value;
3643
+ const query = gql `
3644
+ query GetMCPToolCounts($serverID: String, $searchText: String) {
3645
+ GetMCPToolCounts(serverID: $serverID, searchText: $searchText) {
3646
+ totalCount
3647
+ countByServer { serverID serverName count }
3648
+ countByCategory { category count }
3649
+ }
3650
+ }
3651
+ `;
3652
+ const result = await GraphQLDataProvider.Instance.ExecuteGQL(query, {
3653
+ serverID: (filters.toolsServer && filters.toolsServer !== 'all') ? filters.toolsServer : null,
3654
+ searchText: filters.searchTerm || null
3655
+ });
3656
+ const counts = result?.GetMCPToolCounts;
3657
+ if (counts) {
3658
+ this.toolsGlobalCount = counts.totalCount;
3659
+ this.toolCountByServer = {};
3660
+ (counts.countByServer || []).forEach((r) => {
3661
+ this.toolCountByServer[r.serverID] = r.count;
3662
+ });
3663
+ this.toolsAvailableCategories = (counts.countByCategory || [])
3664
+ .filter((c) => c.category && c.category.length > 0)
3665
+ .sort((a, b) => a.category.localeCompare(b.category));
3666
+ // Available servers derived from the servers list (already loaded)
3667
+ this.toolsAvailableServers = this.servers.map(s => ({ ID: s.ID, Name: s.Name }));
3668
+ this.cdr.detectChanges();
3669
+ }
3670
+ }
3671
+ catch (e) {
3672
+ console.warn('[MCPDashboard] loadToolCounts failed:', e);
3673
+ }
3674
+ }
3675
+ /** Part 3.4 — returns tool count for a server (falls back to ServerGroups length for legacy view) */
3676
+ getServerToolCount(serverID) {
3677
+ return this.toolCountByServer[serverID] ?? this.tools.filter(t => UUIDsEqual(t.MCPServerID, serverID)).length;
3678
+ }
3679
+ trackPagedTool(_index, tool) {
3680
+ return tool.ID;
3681
+ }
3682
+ /** Part 3.6 — Scale mode display. When a client-side filter (Favorites/Recently-used) is active,
3683
+ * bypass server pagination and filter the fully-loaded local `this.tools` list so the filter
3684
+ * considers ALL tools, not just the current 50-row page. */
3685
+ get visiblePagedTools() {
3686
+ const f = this.filters$.value;
3687
+ if (f.favoritesOnly || f.recentOnly) {
3688
+ const search = (f.searchTerm || '').toLowerCase();
3689
+ const recent = f.recentOnly ? this.recentToolIDSet() : null;
3690
+ return this.tools
3691
+ .filter(t => {
3692
+ if (f.favoritesOnly && !this.isFavorited(t.ID))
3693
+ return false;
3694
+ if (recent && !recent.has(NormalizeUUID(t.ID)))
3695
+ return false;
3696
+ if (f.toolsServer && f.toolsServer !== 'all' && !UUIDsEqual(t.MCPServerID, f.toolsServer))
3697
+ return false;
3698
+ if (f.toolsCategory && f.toolsCategory !== 'all') {
3699
+ const idx = t.ToolName.indexOf('_');
3700
+ const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;
3701
+ if (cat !== f.toolsCategory)
3702
+ return false;
3703
+ }
3704
+ if (search && !(t.ToolName.toLowerCase().includes(search) ||
3705
+ (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||
3706
+ (t.ToolDescription?.toLowerCase().includes(search) ?? false)))
3707
+ return false;
3708
+ return true;
3709
+ })
3710
+ .map(t => ({
3711
+ ID: t.ID,
3712
+ MCPServerID: t.MCPServerID,
3713
+ ToolName: t.ToolName,
3714
+ ToolTitle: t.ToolTitle ?? null,
3715
+ ToolDescription: t.ToolDescription ?? null,
3716
+ Status: t.Status,
3717
+ ServerName: t.ServerName ?? null
3718
+ }));
3719
+ }
3720
+ return this.pagedTools;
3721
+ }
3722
+ /** Scale-mode denominator. In bypass-pagination mode (favorites/recent filters), the user
3723
+ * sees the fully filtered local list, so the "of N" reflects that filtered total.
3724
+ * Otherwise we show the server-side total for the current query. */
3725
+ scaleDenominator() {
3726
+ const f = this.filters$.value;
3727
+ if (f.favoritesOnly || f.recentOnly) {
3728
+ return this.visiblePagedTools.length;
3729
+ }
3730
+ return this.toolsTotalCount;
3731
+ }
3732
+ /** Part 3.5 — recently used tool IDs derived from execution logs (dedup, max 5) */
3733
+ get TestRecentToolIDs() {
3734
+ const seen = new Set();
3735
+ const out = [];
3736
+ for (const log of this.executionLogs) {
3737
+ if (!log.ToolID)
3738
+ continue;
3739
+ if (seen.has(log.ToolID))
3740
+ continue;
3741
+ seen.add(log.ToolID);
3742
+ out.push(log.ToolID);
3743
+ if (out.length >= 5)
3744
+ break;
3745
+ }
3746
+ return out;
3747
+ }
3748
+ /** Part 3.5 — Test dialog combobox: filtered tools with recent-first ordering */
3749
+ get TestComboboxTools() {
3750
+ const term = this.TestToolSearch.trim().toLowerCase();
3751
+ const base = this.TestFilteredTools.filter(t => !term ||
3752
+ t.ToolName.toLowerCase().includes(term) ||
3753
+ (t.ToolTitle && t.ToolTitle.toLowerCase().includes(term)) ||
3754
+ (t.ToolDescription && t.ToolDescription.toLowerCase().includes(term)));
3755
+ const recentSet = new Set(this.TestRecentToolIDs);
3756
+ const recent = base.filter(t => recentSet.has(t.ID));
3757
+ const rest = base.filter(t => !recentSet.has(t.ID));
3758
+ return [...recent, ...rest];
3759
+ }
3760
+ isRecentTestTool(toolID) {
3761
+ return this.TestRecentToolIDs.includes(toolID);
3762
+ }
3763
+ onTestToolSearchChange(value) {
3764
+ this.TestToolSearch = value;
3765
+ this.cdr.detectChanges();
3766
+ }
3767
+ pickTestTool(toolID) {
3768
+ this.TestToolID = toolID;
2108
3769
  this.cdr.detectChanges();
2109
3770
  }
3771
+ /**
3772
+ * Part 3.6 — load the current user's favorited tool IDs.
3773
+ */
3774
+ async loadFavorites() {
3775
+ try {
3776
+ const md = new Metadata();
3777
+ const currentUserID = md.CurrentUser?.ID;
3778
+ if (!currentUserID)
3779
+ return;
3780
+ // MCPEngine caches MCP: Tool Favorites via BaseEngine CacheLocal — Config() is
3781
+ // idempotent, and the cache auto-invalidates on Save/Delete via BaseEntity events,
3782
+ // so repeat loads hit the Global Object Store with no DB round-trip.
3783
+ await MCPEngine.Instance.Config();
3784
+ const userFavorites = MCPEngine.Instance.GetFavoritesByUser(currentUserID);
3785
+ this.favoritedToolIDs = new Set(userFavorites.map(f => NormalizeUUID(f.MCPServerToolID)));
3786
+ this.cdr.detectChanges();
3787
+ }
3788
+ catch (e) {
3789
+ console.warn('[MCPDashboard] loadFavorites failed:', e);
3790
+ }
3791
+ }
3792
+ isFavorited(toolID) {
3793
+ return this.favoritedToolIDs.has(NormalizeUUID(toolID));
3794
+ }
3795
+ /** Part 3.3 — set of tool IDs seen in recent execution logs (last N unique). */
3796
+ recentToolIDSet() {
3797
+ const out = new Set();
3798
+ for (const log of this.executionLogs) {
3799
+ if (log.ToolID)
3800
+ out.add(NormalizeUUID(log.ToolID));
3801
+ }
3802
+ return out;
3803
+ }
3804
+ async toggleFavorite(toolID, event) {
3805
+ if (event)
3806
+ event.stopPropagation();
3807
+ const md = new Metadata();
3808
+ const currentUserID = md.CurrentUser?.ID;
3809
+ if (!currentUserID) {
3810
+ console.warn('[MCPDashboard] toggleFavorite: no current user');
3811
+ return;
3812
+ }
3813
+ const normalizedID = NormalizeUUID(toolID);
3814
+ const isFav = this.favoritedToolIDs.has(normalizedID);
3815
+ try {
3816
+ if (isFav) {
3817
+ // Find the existing favorite in MCPEngine's cache and Delete via the entity —
3818
+ // BaseEngine's event-driven cache sync will drop it from _Favorites automatically.
3819
+ await MCPEngine.Instance.Config();
3820
+ const entity = MCPEngine.Instance.GetFavoriteByUserAndTool(currentUserID, toolID);
3821
+ if (!entity) {
3822
+ // Cache says it's missing but UI thought it was favorited — drop from the
3823
+ // local Set so the UI reconciles.
3824
+ this.favoritedToolIDs.delete(normalizedID);
3825
+ }
3826
+ else {
3827
+ const deleted = await entity.Delete();
3828
+ if (!deleted) {
3829
+ console.warn('[MCPDashboard] Delete favorite failed:', entity.LatestResult?.CompleteMessage);
3830
+ return;
3831
+ }
3832
+ this.favoritedToolIDs.delete(normalizedID);
3833
+ }
3834
+ }
3835
+ else {
3836
+ const entity = await md.GetEntityObject('MJ: MCP Tool Favorites');
3837
+ entity.NewRecord();
3838
+ entity.UserID = currentUserID;
3839
+ entity.MCPServerToolID = toolID;
3840
+ const saved = await entity.Save();
3841
+ if (!saved) {
3842
+ console.warn('[MCPDashboard] Save favorite failed:', entity.LatestResult?.CompleteMessage);
3843
+ return;
3844
+ }
3845
+ this.favoritedToolIDs.add(normalizedID);
3846
+ }
3847
+ // Force a new Set instance so Angular change detection picks it up
3848
+ this.favoritedToolIDs = new Set(this.favoritedToolIDs);
3849
+ this.cdr.detectChanges();
3850
+ }
3851
+ catch (e) {
3852
+ console.error('[MCPDashboard] toggleFavorite failed:', e);
3853
+ }
3854
+ }
3855
+ formatLogJson(value) {
3856
+ if (!value)
3857
+ return '';
3858
+ try {
3859
+ return JSON.stringify(JSON.parse(value), null, 2);
3860
+ }
3861
+ catch {
3862
+ return value;
3863
+ }
3864
+ }
2110
3865
  /**
2111
3866
  * Parse and return input schema as formatted JSON
2112
3867
  */
@@ -2563,73 +4318,96 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2563
4318
  this.cdr.detectChanges();
2564
4319
  }
2565
4320
  static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MCPToolsService)); };
2566
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 55, vars: 30, consts: [[1, "mcp-dashboard"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [1, "fa-solid", "fa-plug-circle-bolt"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls"], [1, "tab-nav"], ["type", "button", 1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-server"], [1, "tab-label"], [1, "tab-badge"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-wrench"], [1, "fa-solid", "fa-list-check"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "disabled"], [1, "main-content"], [1, "filter-panel-container"], [3, "filtersChange", "closePanel", "filters", "activeTab", "totalCount", "filteredCount"], [1, "resize-handle"], [1, "content-area"], [1, "error-banner"], [1, "content-body"], ["text", "Loading MCP data..."], [3, "server", "visible"], [3, "connection", "servers", "visible"], [3, "Visible", "Servers", "Connections", "Tools", "SelectedServerID", "SelectedConnectionID", "SelectedToolID"], [3, "Visible", "Log"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-toggle"], ["type", "button", "title", "Card View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "fa-solid", "fa-play"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "data-grid", "servers-grid"], [1, "data-grid", "connections-grid"], [1, "data-table"], [1, "empty-state"], [1, "data-card", 3, "expanded"], [1, "data-card"], [1, "card-header", "clickable", 3, "click"], [1, "card-title"], [1, "fa-solid", "fa-chevron-right", "expand-arrow"], [1, "name", 3, "innerHTML"], [1, "status-badge", 3, "ngClass"], [1, "card-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "flat", "title", "Delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "card-body"], [1, "description", 3, "innerHTML"], [1, "details-grid"], [1, "detail"], [1, "label"], [1, "value"], [1, "detail", "full-width"], [1, "expanded-tools-section"], [1, "value", "url"], [1, "value", "command"], [1, "tools-section-header"], [1, "no-tools-message"], [1, "tools-mini-list"], [1, "fa-solid", "fa-info-circle"], [1, "tool-mini-card"], [1, "tool-mini-info"], [1, "tool-mini-name"], [1, "tool-mini-params"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Sync Tools", 3, "click", "disabled"], [1, "fa-solid", "fa-sync", "fa-spin"], [1, "sync-progress-banner"], [1, "sync-result-banner", 3, "success", "error"], [1, "detail", "full-width", "error"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "sync-message"], [1, "sync-result-banner"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool with this connection", 3, "click"], [1, "tools-container"], [1, "hint"], [1, "server-group", 3, "collapsed"], [1, "server-group"], [1, "server-group-header", 3, "click"], [1, "server-info"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "server-name"], [1, "tool-count"], [1, "status-badge", "small", 3, "ngClass"], [1, "server-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Test a tool", 3, "click"], [1, "tools-grid"], [1, "tools-list"], [1, "tool-card", 3, "expanded"], [1, "tool-card"], [1, "tool-card-header", 3, "click"], [1, "tool-title"], [1, "tool-meta"], ["title", "Parameters", 1, "param-badge"], [1, "tool-description", 3, "innerHTML"], [1, "tool-card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "fa-solid"], [1, "tool-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value", "mono"], [1, "detail-value"], [1, "detail-row", "full"], [1, "schema-preview"], [1, "tool-name-cell"], [1, "tool-name-info"], [1, "tool-title", 3, "innerHTML"], [1, "tool-code"], [1, "description-cell", 3, "innerHTML"], [1, "param-count"], [1, "actions-cell"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Details", 3, "click"], [1, "detail-row-expanded"], ["colspan", "6"], [1, "inline-details"], [1, "detail-section"], [1, "detail-section", "full"], [1, "sortable", 3, "click", "ngClass"], [1, "sort-icon", "fa-solid"], ["title", "Click for details", 1, "clickable-row", 3, "error-row"], ["title", "Click for details", 1, "clickable-row", 3, "click"], [1, "fa-solid", "fa-times-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-question-circle"], [1, "tool-name"], [1, "error-message", 3, "title"], [1, "action-cell"], [1, "fa-solid", "fa-chevron-right"], [3, "close", "server", "visible"], [3, "close", "connection", "servers", "visible"], [3, "Close", "Visible", "Servers", "Connections", "Tools", "SelectedServerID", "SelectedConnectionID", "SelectedToolID"], [3, "Close", "RunAgain", "Visible", "Log"]], template: function MCPDashboardComponent_Template(rf, ctx) { if (rf & 1) {
2567
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
2568
- i0.ɵɵelement(4, "i", 4);
4321
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 77, vars: 35, consts: [["fSearch", ""], ["fServer", ""], ["fCat", ""], ["fFav", ""], ["fRec", ""], ["fSStatus", ""], ["fCStatus", ""], ["fTStatus", ""], ["fLStatus", ""], ["sfName", ""], ["sfDesc", ""], ["sfTransport", ""], ["sfAuth", ""], ["sfStatus", ""], ["sfUrl", ""], ["sfCmd", ""], ["cfServer", ""], ["cfName", ""], ["cfToken", ""], ["cfStatus", ""], ["tSrv", ""], ["tConn", ""], ["tSearch", ""], ["enumEl", ""], ["boolEl", ""], ["jsonEl", ""], ["strEl", ""], [1, "mcp-dashboard"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [1, "fa-solid", "fa-plug-circle-bolt"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls"], [1, "tab-nav"], ["type", "button", 1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-server"], [1, "tab-label"], [1, "tab-badge"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-wrench"], [1, "fa-solid", "fa-list-check"], ["mjButton", "", "variant", "primary"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "disabled"], [1, "main-content"], [1, "filter-panel-container"], [2, "padding", "12px", "border-right", "1px solid var(--mj-border-default,#e0e0e0)", "height", "100%", "box-sizing", "border-box", "overflow-y", "auto", "background", "var(--mj-bg-surface,#fff)", "min-width", "240px"], [2, "display", "flex", "align-items", "center", "justify-content", "space-between", "margin-bottom", "12px"], [2, "display", "flex", "align-items", "center", "gap", "6px"], [2, "margin", "0", "font-size", "0.95rem", "font-weight", "600"], [2, "padding", "2px 8px", "background", "var(--mj-brand-primary,#264FAF)", "color", "#fff", "border-radius", "10px", "font-size", "0.7rem", "font-weight", "600"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)"], [2, "margin-bottom", "12px"], [2, "display", "block", "font-size", "0.75rem", "color", "var(--mj-text-secondary,#475569)", "margin-bottom", "4px"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search\u2026", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [2, "margin-top", "16px"], ["mjButton", "", "variant", "flat", 2, "width", "100%", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "resize-handle"], [1, "content-area"], [1, "error-banner"], [1, "content-body"], ["text", "Loading MCP data..."], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "pointer-events", "none"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-toggle"], ["type", "button", "title", "Card View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "fa-solid", "fa-play"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change", "value"], ["value", "all"], [3, "value"], [1, "fa-solid", "fa-tags"], [2, "display", "flex", "align-items", "center", "gap", "6px", "cursor", "pointer", "font-size", "0.85rem"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-star", 2, "color", "var(--mj-status-warning,#f59e0b)"], [1, "fa-solid", "fa-clock-rotate-left", 2, "color", "var(--mj-brand-primary,#264FAF)"], [1, "fa-solid", "fa-toggle-on"], ["value", "Active"], ["value", "Inactive"], ["value", "Error"], ["value", "Deprecated"], [1, "fa-solid", "fa-circle-check"], ["value", "Success"], ["value", "Running"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "data-grid", "servers-grid"], [1, "data-grid", "connections-grid"], [1, "data-table"], [1, "empty-state"], [1, "data-card", 3, "expanded"], [1, "data-card"], [1, "card-header", "clickable", 3, "click"], [1, "card-title"], [1, "fa-solid", "fa-chevron-right", "expand-arrow"], [1, "name"], [1, "status-badge", 3, "ngClass"], [1, "card-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "flat", "title", "Delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "card-body"], [1, "description"], [1, "details-grid"], [1, "detail"], [1, "label"], [1, "value"], [1, "detail", "full-width"], [1, "expanded-tools-section"], [1, "value", "url"], [1, "value", "command"], [1, "tools-section-header"], [1, "no-tools-message"], [1, "tools-mini-list"], [1, "fa-solid", "fa-info-circle"], [1, "tool-mini-card"], [1, "tool-mini-info"], [1, "tool-mini-name"], [1, "tool-mini-params"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Sync Tools", 3, "click", "disabled"], [1, "fa-solid", "fa-sync", "fa-spin"], [1, "sync-progress-banner"], [1, "sync-result-banner", 3, "success", "error"], [1, "detail", "full-width", "error"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "sync-message"], [1, "sync-result-banner"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool with this connection", 3, "click"], [2, "display", "flex", "justify-content", "flex-end", "align-items", "center", "gap", "8px", "padding", "4px 0", "font-size", "0.8rem", "color", "var(--mj-text-muted,#888)"], [2, "display", "flex", "align-items", "center", "gap", "6px", "cursor", "pointer"], [1, "tools-container"], [2, "padding", "8px 12px", "font-size", "0.8rem", "color", "var(--mj-text-secondary,#475569)", "background", "var(--mj-bg-surface-card,#f8f9fa)", "border-radius", "4px", "margin-bottom", "6px"], [2, "height", "calc(100vh - 260px)", "width", "100%", "overflow-y", "auto", "border", "1px solid var(--mj-border-subtle,#eee)", "border-radius", "4px", 3, "scroll"], [2, "display", "flex", "align-items", "center", "gap", "12px", "padding", "12px 14px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", "height", "72px", "box-sizing", "border-box"], [2, "padding", "12px", "text-align", "center", "font-size", "0.8rem", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-wrench", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "flex", "1", "min-width", "0"], [2, "font-weight", "500", "font-size", "0.875rem", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "1rem", 3, "click", "title"], [1, "status-badge", "small", 3, "ngClass"], [1, "hint"], [1, "server-group", 3, "collapsed"], [1, "server-group"], [1, "server-group-header", 3, "click"], [1, "server-info"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "server-name"], [1, "tool-count"], [1, "server-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Test a tool", 3, "click"], [1, "tools-grid"], [1, "tools-list"], [1, "tool-card", 3, "expanded"], [1, "tool-card"], [1, "tool-card-header", 3, "click"], [1, "tool-title"], [1, "tool-meta"], ["title", "Parameters", 1, "param-badge"], [1, "tool-description"], [1, "tool-card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "fa-solid"], [1, "tool-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value", "mono"], [1, "detail-value"], [1, "detail-row", "full"], [1, "schema-preview"], [1, "tool-name-cell"], [1, "tool-name-info"], [1, "tool-code"], [1, "description-cell"], [1, "param-count"], [1, "actions-cell"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "0.95rem", "margin-right", "4px", 3, "click", "title"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Details", 3, "click"], [1, "detail-row-expanded"], ["colspan", "6"], [1, "inline-details"], [1, "detail-section"], [1, "detail-section", "full"], [1, "sortable", 3, "click", "ngClass"], [1, "sort-icon", "fa-solid"], ["title", "Click for details", 1, "clickable-row", 3, "error-row"], ["title", "Click for details", 1, "clickable-row", 3, "click"], [1, "fa-solid", "fa-times-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-question-circle"], [1, "tool-name"], [1, "error-message", 3, "title"], [1, "action-cell"], [1, "fa-solid", "fa-chevron-right"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center", 3, "click"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "600px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "display", "flex", "align-items", "center", "justify-content", "space-between", "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "margin", "0", "font-size", "1.125rem", "font-weight", "600", "color", "var(--mj-text-primary,#333)"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "width", "32px", "height", "32px", "border", "none", "background", "none", "cursor", "pointer", "color", "var(--mj-text-muted,#888)", "border-radius", "4px", 3, "click"], [2, "flex", "1", "overflow-y", "auto", "padding", "20px", "color", "var(--mj-text-primary,#333)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "10px 14px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)", "font-size", "0.875rem"], [2, "margin-bottom", "16px"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "color", "var(--mj-text-primary,#333)", "margin-bottom", "4px"], [2, "color", "var(--mj-status-error,#e53e3e)"], ["placeholder", "e.g., GitHub MCP Server", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Optional description", "rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [2, "display", "flex", "align-items", "center", "gap", "8px", "padding", "16px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click"], ["placeholder", "https://api.example.com/mcp", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "e.g., npx", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "560px", "max-width", "90vw", "max-height", "90vh", 3, "click"], ["value", ""], ["placeholder", "e.g., Zapier Connection", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Paste bearer token here", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "value"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "640px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "font-size", "0.875rem", "font-weight", "400", "color", "var(--mj-text-muted,#888)", "margin-left", "8px"], [2, "display", "flex", "gap", "0", "padding", "10px 20px", "background", "var(--mj-bg-surface-card,#f9f9f9)", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "font-size", "0.8rem", "font-weight", "500"], [2, "margin", "0 8px", "color", "var(--mj-text-muted,#888)"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change"], [3, "value", "selected"], ["type", "text", "placeholder", "Search tools\u2026 (Recently used appear first)", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "margin-bottom", "6px", 3, "input", "value"], [2, "max-height", "220px", "overflow-y", "auto", "border", "1px solid var(--mj-border-default,#e0e0e0)", "border-radius", "4px", "background", "var(--mj-bg-surface,#fff)"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "background"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "click"], [2, "font-size", "0.65rem", "background", "var(--mj-brand-primary,#264FAF)", "color", "#fff", "padding", "1px 6px", "border-radius", "8px", "font-weight", "600"], [2, "font-size", "0.85rem", "font-weight", "500", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.7rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [1, "fa-solid", "fa-check", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "text-align", "center", "padding", "24px", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-check-circle", 2, "font-size", "2rem", "margin-bottom", "8px", "display", "block"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin", "0 0 4px 0"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "placeholder"], ["value", "false"], ["value", "true"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "placeholder"], [2, "background", "var(--mj-status-success-bg,#f0fff4)", "border", "1px solid var(--mj-status-success-border,#9ae6b4)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-success-text,#276749)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)"], [2, "float", "right", "font-size", "0.75rem"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "4px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "300px", "margin", "0"], [1, "fa-solid", "fa-arrow-right"], [1, "fa-solid", "fa-arrow-left"], [1, "fa-solid", "fa-redo"], [2, "position", "absolute", "inset", "0", "background", "rgba(0,0,0,0.35)", "pointer-events", "auto", 3, "click"], [2, "position", "absolute", "top", "0", "right", "0", "height", "100%", "width", "560px", "max-width", "95vw", "background", "var(--mj-bg-surface,#fff)", "box-shadow", "-4px 0 20px rgba(0,0,0,0.15)", "display", "flex", "flex-direction", "column", "pointer-events", "auto"], [2, "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "align-items", "center", "justify-content", "space-between"], [2, "margin", "0", "font-size", "1rem", "font-weight", "600"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "4px"], [2, "font-weight", "600"], [2, "margin", "0 8px"], ["mjButton", "", "aria-label", "Close", 3, "click"], [1, "fa-solid", "fa-xmark"], [2, "flex", "1", "overflow-y", "auto", "padding", "16px 20px"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-bottom", "4px"], [2, "font-size", "0.875rem"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "2px"], [2, "padding", "12px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "gap", "8px", "justify-content", "flex-start"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "240px", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "360px", "margin", "0"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px", "color", "var(--mj-status-error-text,#c53030)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0", "color", "var(--mj-status-error-text,#c53030)"]], template: function MCPDashboardComponent_Template(rf, ctx) { if (rf & 1) {
4322
+ const _r1 = i0.ɵɵgetCurrentView();
4323
+ i0.ɵɵelementStart(0, "div", 27)(1, "div", 28)(2, "div", 29)(3, "h2", 30);
4324
+ i0.ɵɵelement(4, "i", 31);
2569
4325
  i0.ɵɵtext(5, " MCP Dashboard ");
2570
4326
  i0.ɵɵelementEnd();
2571
- i0.ɵɵelementStart(6, "button", 5);
2572
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_6_listener() { return ctx.toggleFilterPanel(); });
2573
- i0.ɵɵelement(7, "i", 6);
4327
+ i0.ɵɵelementStart(6, "button", 32);
4328
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleFilterPanel()); });
4329
+ i0.ɵɵelement(7, "i", 33);
2574
4330
  i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_8_Template, 1, 0)(9, MCPDashboardComponent_Conditional_9_Template, 1, 0);
2575
4331
  i0.ɵɵelementEnd();
2576
- i0.ɵɵelementStart(10, "span", 7);
4332
+ i0.ɵɵelementStart(10, "span", 34);
2577
4333
  i0.ɵɵtext(11);
2578
4334
  i0.ɵɵelementEnd()();
2579
- i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "button", 10);
2580
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_14_listener() { return ctx.setActiveTab("servers"); });
2581
- i0.ɵɵelement(15, "i", 11);
2582
- i0.ɵɵelementStart(16, "span", 12);
4335
+ i0.ɵɵelementStart(12, "div", 35)(13, "div", 36)(14, "button", 37);
4336
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setActiveTab("servers")); });
4337
+ i0.ɵɵelement(15, "i", 38);
4338
+ i0.ɵɵelementStart(16, "span", 39);
2583
4339
  i0.ɵɵtext(17, "Servers");
2584
4340
  i0.ɵɵelementEnd();
2585
- i0.ɵɵelementStart(18, "span", 13);
4341
+ i0.ɵɵelementStart(18, "span", 40);
2586
4342
  i0.ɵɵtext(19);
2587
4343
  i0.ɵɵelementEnd()();
2588
- i0.ɵɵelementStart(20, "button", 10);
2589
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_20_listener() { return ctx.setActiveTab("connections"); });
2590
- i0.ɵɵelement(21, "i", 14);
2591
- i0.ɵɵelementStart(22, "span", 12);
4344
+ i0.ɵɵelementStart(20, "button", 37);
4345
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setActiveTab("connections")); });
4346
+ i0.ɵɵelement(21, "i", 41);
4347
+ i0.ɵɵelementStart(22, "span", 39);
2592
4348
  i0.ɵɵtext(23, "Connections");
2593
4349
  i0.ɵɵelementEnd();
2594
- i0.ɵɵelementStart(24, "span", 13);
4350
+ i0.ɵɵelementStart(24, "span", 40);
2595
4351
  i0.ɵɵtext(25);
2596
4352
  i0.ɵɵelementEnd()();
2597
- i0.ɵɵelementStart(26, "button", 10);
2598
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_26_listener() { return ctx.setActiveTab("tools"); });
2599
- i0.ɵɵelement(27, "i", 15);
2600
- i0.ɵɵelementStart(28, "span", 12);
4353
+ i0.ɵɵelementStart(26, "button", 37);
4354
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setActiveTab("tools")); });
4355
+ i0.ɵɵelement(27, "i", 42);
4356
+ i0.ɵɵelementStart(28, "span", 39);
2601
4357
  i0.ɵɵtext(29, "Tools");
2602
4358
  i0.ɵɵelementEnd();
2603
- i0.ɵɵelementStart(30, "span", 13);
4359
+ i0.ɵɵelementStart(30, "span", 40);
2604
4360
  i0.ɵɵtext(31);
2605
4361
  i0.ɵɵelementEnd()();
2606
- i0.ɵɵelementStart(32, "button", 10);
2607
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_32_listener() { return ctx.setActiveTab("logs"); });
2608
- i0.ɵɵelement(33, "i", 16);
2609
- i0.ɵɵelementStart(34, "span", 12);
4362
+ i0.ɵɵelementStart(32, "button", 37);
4363
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setActiveTab("logs")); });
4364
+ i0.ɵɵelement(33, "i", 43);
4365
+ i0.ɵɵelementStart(34, "span", 39);
2610
4366
  i0.ɵɵtext(35, "Logs");
2611
4367
  i0.ɵɵelementEnd();
2612
- i0.ɵɵelementStart(36, "span", 13);
4368
+ i0.ɵɵelementStart(36, "span", 40);
2613
4369
  i0.ɵɵtext(37);
2614
4370
  i0.ɵɵelementEnd()()();
2615
- i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Case_38_Template, 3, 0, "button", 17)(39, MCPDashboardComponent_Case_39_Template, 3, 0, "button", 17)(40, MCPDashboardComponent_Case_40_Template, 8, 4)(41, MCPDashboardComponent_Case_41_Template, 3, 3, "button", 18);
4371
+ i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Case_38_Template, 3, 0, "button", 44)(39, MCPDashboardComponent_Case_39_Template, 3, 0, "button", 44)(40, MCPDashboardComponent_Case_40_Template, 8, 4)(41, MCPDashboardComponent_Case_41_Template, 3, 3, "button", 45);
2616
4372
  i0.ɵɵelementEnd()();
2617
- i0.ɵɵelementStart(42, "div", 19)(43, "div", 20)(44, "mj-mcp-filter-panel", 21);
2618
- i0.ɵɵlistener("filtersChange", function MCPDashboardComponent_Template_mj_mcp_filter_panel_filtersChange_44_listener($event) { return ctx.onFiltersChange($event); })("closePanel", function MCPDashboardComponent_Template_mj_mcp_filter_panel_closePanel_44_listener() { return ctx.toggleFilterPanel(); });
4373
+ i0.ɵɵelementStart(42, "div", 46)(43, "div", 47)(44, "div", 48)(45, "div", 49)(46, "div", 50)(47, "h3", 51);
4374
+ i0.ɵɵtext(48, "MCP Filters");
2619
4375
  i0.ɵɵelementEnd();
2620
- i0.ɵɵelement(45, "div", 22);
4376
+ i0.ɵɵconditionalCreate(49, MCPDashboardComponent_Conditional_49_Template, 2, 1, "span", 52);
4377
+ i0.ɵɵelementEnd();
4378
+ i0.ɵɵelementStart(50, "div", 53);
4379
+ i0.ɵɵtext(51);
4380
+ i0.ɵɵelementEnd()();
4381
+ i0.ɵɵelementStart(52, "div", 54)(53, "label", 55);
4382
+ i0.ɵɵelement(54, "i", 56);
4383
+ i0.ɵɵtext(55, " Search");
4384
+ i0.ɵɵelementEnd();
4385
+ i0.ɵɵelementStart(56, "input", 57, 0);
4386
+ i0.ɵɵlistener("input", function MCPDashboardComponent_Template_input_input_56_listener() { i0.ɵɵrestoreView(_r1); const fSearch_r7 = i0.ɵɵreference(57); return i0.ɵɵresetView(ctx.onFilterFieldChange("searchTerm", fSearch_r7.value)); });
4387
+ i0.ɵɵelementEnd()();
4388
+ i0.ɵɵconditionalCreate(58, MCPDashboardComponent_Conditional_58_Template, 32, 4);
4389
+ i0.ɵɵconditionalCreate(59, MCPDashboardComponent_Conditional_59_Template, 12, 1, "div", 54);
4390
+ i0.ɵɵconditionalCreate(60, MCPDashboardComponent_Conditional_60_Template, 14, 1, "div", 54);
4391
+ i0.ɵɵconditionalCreate(61, MCPDashboardComponent_Conditional_61_Template, 12, 1, "div", 54);
4392
+ i0.ɵɵconditionalCreate(62, MCPDashboardComponent_Conditional_62_Template, 14, 1, "div", 54);
4393
+ i0.ɵɵelementStart(63, "div", 58)(64, "button", 59);
4394
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.resetAllFilters()); });
4395
+ i0.ɵɵelement(65, "i", 60);
4396
+ i0.ɵɵtext(66, " Reset Filters ");
4397
+ i0.ɵɵelementEnd()()();
4398
+ i0.ɵɵelement(67, "div", 61);
2621
4399
  i0.ɵɵelementEnd();
2622
- i0.ɵɵelementStart(46, "div", 23);
2623
- i0.ɵɵconditionalCreate(47, MCPDashboardComponent_Conditional_47_Template, 5, 1, "div", 24);
2624
- i0.ɵɵelementStart(48, "div", 25);
2625
- i0.ɵɵconditionalCreate(49, MCPDashboardComponent_Conditional_49_Template, 1, 0, "mj-loading", 26)(50, MCPDashboardComponent_Conditional_50_Template, 4, 1);
4400
+ i0.ɵɵelementStart(68, "div", 62);
4401
+ i0.ɵɵconditionalCreate(69, MCPDashboardComponent_Conditional_69_Template, 5, 1, "div", 63);
4402
+ i0.ɵɵelementStart(70, "div", 64);
4403
+ i0.ɵɵconditionalCreate(71, MCPDashboardComponent_Conditional_71_Template, 1, 0, "mj-loading", 65)(72, MCPDashboardComponent_Conditional_72_Template, 4, 1);
2626
4404
  i0.ɵɵelementEnd()()()();
2627
- i0.ɵɵconditionalCreate(51, MCPDashboardComponent_Conditional_51_Template, 1, 2, "mj-mcp-server-dialog", 27);
2628
- i0.ɵɵconditionalCreate(52, MCPDashboardComponent_Conditional_52_Template, 1, 3, "mj-mcp-connection-dialog", 28);
2629
- i0.ɵɵconditionalCreate(53, MCPDashboardComponent_Conditional_53_Template, 1, 7, "mj-mcp-test-tool-dialog", 29);
2630
- i0.ɵɵconditionalCreate(54, MCPDashboardComponent_Conditional_54_Template, 1, 2, "mj-mcp-log-detail-panel", 30);
4405
+ i0.ɵɵconditionalCreate(73, MCPDashboardComponent_Conditional_73_Template, 54, 12, "div", 66);
4406
+ i0.ɵɵconditionalCreate(74, MCPDashboardComponent_Conditional_74_Template, 49, 7, "div", 66);
4407
+ i0.ɵɵconditionalCreate(75, MCPDashboardComponent_Conditional_75_Template, 27, 9, "div", 66);
4408
+ i0.ɵɵconditionalCreate(76, MCPDashboardComponent_Conditional_76_Template, 31, 12, "div", 67);
2631
4409
  } if (rf & 2) {
2632
- let tmp_11_0;
4410
+ let tmp_12_0;
2633
4411
  i0.ɵɵadvance(8);
2634
4412
  i0.ɵɵconditional(ctx.FilterPanelVisible ? 8 : 9);
2635
4413
  i0.ɵɵadvance(3);
@@ -2653,24 +4431,38 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2653
4431
  i0.ɵɵadvance();
2654
4432
  i0.ɵɵtextInterpolate(ctx.executionLogs.length);
2655
4433
  i0.ɵɵadvance();
2656
- i0.ɵɵconditional((tmp_11_0 = ctx.ActiveTab) === "servers" ? 38 : tmp_11_0 === "connections" ? 39 : tmp_11_0 === "tools" ? 40 : tmp_11_0 === "logs" ? 41 : -1);
4434
+ i0.ɵɵconditional((tmp_12_0 = ctx.ActiveTab) === "servers" ? 38 : tmp_12_0 === "connections" ? 39 : tmp_12_0 === "tools" ? 40 : tmp_12_0 === "logs" ? 41 : -1);
2657
4435
  i0.ɵɵadvance(5);
2658
4436
  i0.ɵɵclassProp("hidden", !ctx.FilterPanelVisible);
4437
+ i0.ɵɵadvance(6);
4438
+ i0.ɵɵconditional(ctx.activeFilterCount() > 0 ? 49 : -1);
4439
+ i0.ɵɵadvance(2);
4440
+ i0.ɵɵtextInterpolate2("", ctx.CurrentFilteredCount, " / ", ctx.CurrentTotalCount);
4441
+ i0.ɵɵadvance(5);
4442
+ i0.ɵɵproperty("value", ctx.CurrentFilters.searchTerm);
4443
+ i0.ɵɵadvance(2);
4444
+ i0.ɵɵconditional(ctx.ActiveTab === "tools" ? 58 : -1);
2659
4445
  i0.ɵɵadvance();
2660
- i0.ɵɵproperty("filters", ctx.CurrentFilters)("activeTab", ctx.ActiveTab)("totalCount", ctx.CurrentTotalCount)("filteredCount", ctx.CurrentFilteredCount);
2661
- i0.ɵɵadvance(3);
2662
- i0.ɵɵconditional(ctx.ErrorMessage ? 47 : -1);
4446
+ i0.ɵɵconditional(ctx.ActiveTab === "servers" ? 59 : -1);
4447
+ i0.ɵɵadvance();
4448
+ i0.ɵɵconditional(ctx.ActiveTab === "connections" ? 60 : -1);
4449
+ i0.ɵɵadvance();
4450
+ i0.ɵɵconditional(ctx.ActiveTab === "tools" ? 61 : -1);
4451
+ i0.ɵɵadvance();
4452
+ i0.ɵɵconditional(ctx.ActiveTab === "logs" ? 62 : -1);
4453
+ i0.ɵɵadvance(7);
4454
+ i0.ɵɵconditional(ctx.ErrorMessage ? 69 : -1);
2663
4455
  i0.ɵɵadvance(2);
2664
- i0.ɵɵconditional(ctx.IsLoading ? 49 : 50);
4456
+ i0.ɵɵconditional(ctx.IsLoading ? 71 : 72);
2665
4457
  i0.ɵɵadvance(2);
2666
- i0.ɵɵconditional(ctx.ShowServerDialog ? 51 : -1);
4458
+ i0.ɵɵconditional(ctx.ShowServerDialog ? 73 : -1);
2667
4459
  i0.ɵɵadvance();
2668
- i0.ɵɵconditional(ctx.ShowConnectionDialog ? 52 : -1);
4460
+ i0.ɵɵconditional(ctx.ShowConnectionDialog ? 74 : -1);
2669
4461
  i0.ɵɵadvance();
2670
- i0.ɵɵconditional(ctx.ShowTestToolDialog ? 53 : -1);
4462
+ i0.ɵɵconditional(ctx.ShowTestToolDialog ? 75 : -1);
2671
4463
  i0.ɵɵadvance();
2672
- i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ? 54 : -1);
2673
- } }, styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n\n\n\n\n.dashboard-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 20px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.item-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 4px 10px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n color: var(--mj-text-primary);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: var(--mj-border-default);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.tab-badge.has-errors[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n\n\n.main-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.filter-panel-container[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle[_ngcontent-%COMP%]:active {\n background: var(--mj-brand-primary);\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n\n\n\n\n\n\n\n.data-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.card-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.card-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 8px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.card-body[_ngcontent-%COMP%] .description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail.error[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail[_ngcontent-%COMP%] .value.url[_ngcontent-%COMP%], \n.detail[_ngcontent-%COMP%] .value.command[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n\n\n.sync-progress-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] .sync-message[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.sync-result-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.error-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n.data-table[_ngcontent-%COMP%] th.sorted-asc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] th.sorted-desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-color-neutral-0);\n}\n\n\n\n\n\n.tools-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed[_ngcontent-%COMP%] .server-group-header[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.server-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.server-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n\n\n\n\n.tools-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-description[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row[_ngcontent-%COMP%] {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row.full[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.tools-list[_ngcontent-%COMP%] {\n overflow: auto;\n}\n\n.tools-list[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.tools-list[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s ease;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-code[_ngcontent-%COMP%] {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n\n\n.detail-row-expanded[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section.full[_ngcontent-%COMP%] {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n}\n\n\n\n\n\n@media (max-width: 900px) {\n .mcp-dashboard[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav[_ngcontent-%COMP%] {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats[_ngcontent-%COMP%] {\n display: none;\n }\n\n .sidebar-footer[_ngcontent-%COMP%] {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .search-box[_ngcontent-%COMP%] {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .search-box[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n\n\n.clickable-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.action-cell[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n}\n\n\n\n\n\n.card-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.data-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n\n\n.tools-mini-list[_ngcontent-%COMP%] {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
4464
+ i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ? 76 : -1);
4465
+ } }, dependencies: [i2.NgClass, i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i4.MJButtonDirective, i5.LoadingComponent], styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n\n\n\n\n.dashboard-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 20px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.item-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 4px 10px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n color: var(--mj-text-primary);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: var(--mj-border-default);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.tab-badge.has-errors[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n\n\n.main-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.filter-panel-container[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle[_ngcontent-%COMP%]:active {\n background: var(--mj-brand-primary);\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n\n\n\n\n\n\n\n.data-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.card-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.card-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 8px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.card-body[_ngcontent-%COMP%] .description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail.error[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail[_ngcontent-%COMP%] .value.url[_ngcontent-%COMP%], \n.detail[_ngcontent-%COMP%] .value.command[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n\n\n.sync-progress-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] .sync-message[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.sync-result-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.error-row[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n.data-table[_ngcontent-%COMP%] th.sorted-asc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] th.sorted-desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-color-neutral-0);\n}\n\n\n\n\n\n.tools-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed[_ngcontent-%COMP%] .server-group-header[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.server-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.server-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n\n\n\n\n.tools-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-description[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row[_ngcontent-%COMP%] {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row.full[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.tools-list[_ngcontent-%COMP%] {\n overflow: auto;\n}\n\n.tools-list[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.tools-list[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s ease;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-code[_ngcontent-%COMP%] {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n\n\n.detail-row-expanded[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section.full[_ngcontent-%COMP%] {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n}\n\n\n\n\n\n@media (max-width: 900px) {\n .mcp-dashboard[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav[_ngcontent-%COMP%] {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats[_ngcontent-%COMP%] {\n display: none;\n }\n\n .sidebar-footer[_ngcontent-%COMP%] {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .search-box[_ngcontent-%COMP%] {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .search-box[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n\n\n.clickable-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.action-cell[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n}\n\n\n\n\n\n.card-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.data-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n\n\n.tools-mini-list[_ngcontent-%COMP%] {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
2674
4466
  };
2675
4467
  MCPDashboardComponent = __decorate([
2676
4468
  RegisterClass(BaseDashboard, 'MCPDashboard')
@@ -2678,7 +4470,7 @@ MCPDashboardComponent = __decorate([
2678
4470
  export { MCPDashboardComponent };
2679
4471
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPDashboardComponent, [{
2680
4472
  type: Component,
2681
- args: [{ standalone: false, selector: 'mj-mcp-dashboard', template: "<div class=\"mcp-dashboard\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n MCP Dashboard\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (FilterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ CurrentFilteredCount }} of {{ CurrentTotalCount }} items</span>\n </div>\n\n <div class=\"header-controls\">\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'servers'\"\n (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"tab-label\">Servers</span>\n <span class=\"tab-badge\">{{ servers.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'connections'\"\n (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"tab-label\">Connections</span>\n <span class=\"tab-badge\">{{ connections.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'tools'\"\n (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"tab-label\">Tools</span>\n <span class=\"tab-badge\">{{ tools.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'logs'\"\n (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"tab-label\">Logs</span>\n <span class=\"tab-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </div>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <button mjButton variant=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button mjButton variant=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n Refresh\n </button>\n }\n }\n </div>\n </div>\n\n <!-- Main Content with Filter Panel -->\n <div class=\"main-content\">\n <!-- Filter Panel (Left) -->\n <div class=\"filter-panel-container\" [class.hidden]=\"!FilterPanelVisible\">\n <mj-mcp-filter-panel\n [filters]=\"CurrentFilters\"\n [activeTab]=\"ActiveTab\"\n [totalCount]=\"CurrentTotalCount\"\n [filteredCount]=\"CurrentFilteredCount\"\n (filtersChange)=\"onFiltersChange($event)\"\n (closePanel)=\"toggleFilterPanel()\">\n </mj-mcp-filter-panel>\n <!-- Resize Handle -->\n <div class=\"resize-handle\"></div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\" [innerHTML]=\"server.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\" [innerHTML]=\"server.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\" [innerHTML]=\"conn.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\" [innerHTML]=\"conn.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ group.tools.length }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\" [innerHTML]=\"tool.ToolDescription | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"tool-card-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\" [innerHTML]=\"(tool.ToolDescription || '-') | highlightSearch:(filters$ | async)?.searchTerm\">\n </td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Server Dialog -->\n@if (ShowServerDialog) {\n <mj-mcp-server-dialog\n [server]=\"EditingServer\"\n [visible]=\"ShowServerDialog\"\n (close)=\"onServerDialogClose($event)\">\n </mj-mcp-server-dialog>\n}\n\n<!-- Connection Dialog -->\n@if (ShowConnectionDialog) {\n <mj-mcp-connection-dialog\n [connection]=\"EditingConnection\"\n [servers]=\"servers\"\n [visible]=\"ShowConnectionDialog\"\n (close)=\"onConnectionDialogClose($event)\">\n </mj-mcp-connection-dialog>\n}\n\n<!-- Test Tool Dialog -->\n@if (ShowTestToolDialog) {\n <mj-mcp-test-tool-dialog\n [Visible]=\"ShowTestToolDialog\"\n [Servers]=\"servers\"\n [Connections]=\"connections\"\n [Tools]=\"tools\"\n [SelectedServerID]=\"TestToolServerID\"\n [SelectedConnectionID]=\"TestToolConnectionID\"\n [SelectedToolID]=\"TestToolID\"\n (Close)=\"onTestToolDialogClose()\">\n </mj-mcp-test-tool-dialog>\n}\n\n<!-- Log Detail Panel -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <mj-mcp-log-detail-panel\n [Visible]=\"ShowLogDetailPanel\"\n [Log]=\"SelectedLog\"\n (Close)=\"onLogDetailClose()\"\n (RunAgain)=\"onRunAgainFromLog($event)\">\n </mj-mcp-log-detail-panel>\n}\n", styles: ["/* MCP Dashboard - Header + Filter Panel Layout */\n.mcp-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n/* ========================================\n Dashboard Header\n ======================================== */\n.dashboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dashboard-title i {\n color: var(--mj-brand-primary);\n font-size: 20px;\n}\n\n.filter-toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn i {\n font-size: 12px;\n}\n\n.item-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 4px 10px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.tab-btn:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n color: var(--mj-text-primary);\n}\n\n.tab-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn i {\n font-size: 14px;\n}\n\n.tab-label {\n font-weight: 500;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: var(--mj-border-default);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.tab-btn.active .tab-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.tab-badge.has-errors {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* ========================================\n Main Content Area (with Filter Panel)\n ======================================== */\n.main-content {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Filter Panel Container */\n.filter-panel-container {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n/* Resize Handle */\n.resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle:active {\n background: var(--mj-brand-primary);\n}\n\n/* Content Area */\n.content-area {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Content Body */\n.content-body {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-brand-primary);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: var(--mj-status-error);\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success i {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error i {\n color: var(--mj-status-error);\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-brand-primary);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: var(--mj-text-disabled);\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state i {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle button {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-color-neutral-0);\n}\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list tbody tr.expanded {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row .action-cell {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-brand-primary);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: var(--mj-text-disabled);\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
4473
+ args: [{ standalone: false, selector: 'mj-mcp-dashboard', template: "<div class=\"mcp-dashboard\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n MCP Dashboard\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (FilterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ CurrentFilteredCount }} of {{ CurrentTotalCount }} items</span>\n </div>\n\n <div class=\"header-controls\">\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'servers'\"\n (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"tab-label\">Servers</span>\n <span class=\"tab-badge\">{{ servers.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'connections'\"\n (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"tab-label\">Connections</span>\n <span class=\"tab-badge\">{{ connections.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'tools'\"\n (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"tab-label\">Tools</span>\n <span class=\"tab-badge\">{{ tools.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'logs'\"\n (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"tab-label\">Logs</span>\n <span class=\"tab-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </div>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <button mjButton variant=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button mjButton variant=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n Refresh\n </button>\n }\n }\n </div>\n </div>\n\n <!-- Main Content with Filter Panel -->\n <div class=\"main-content\">\n <!-- Filter Panel (Left) \u2014 INLINED to avoid module-resolution failures in dynamic component -->\n <div class=\"filter-panel-container\" [class.hidden]=\"!FilterPanelVisible\">\n <div style=\"padding:12px;border-right:1px solid var(--mj-border-default,#e0e0e0);height:100%;box-sizing:border-box;overflow-y:auto;background:var(--mj-bg-surface,#fff);min-width:240px\">\n <!-- Header -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;margin-bottom:12px\">\n <div style=\"display:flex;align-items:center;gap:6px\">\n <h3 style=\"margin:0;font-size:0.95rem;font-weight:600\">MCP Filters</h3>\n @if (activeFilterCount() > 0) {\n <span style=\"padding:2px 8px;background:var(--mj-brand-primary,#264FAF);color:#fff;border-radius:10px;font-size:0.7rem;font-weight:600\">{{ activeFilterCount() }}</span>\n }\n </div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">{{ CurrentFilteredCount }} / {{ CurrentTotalCount }}</div>\n </div>\n\n <!-- Search -->\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-search\"></i> Search</label>\n <input #fSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.searchTerm\" (input)=\"onFilterFieldChange('searchTerm', fSearch.value)\" placeholder=\"Search\u2026\" />\n </div>\n\n <!-- Tool tab filters -->\n @if (ActiveTab === 'tools') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-server\"></i> Server</label>\n <select #fServer class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolsServer ?? 'all'\" (change)=\"onFilterFieldChange('toolsServer', fServer.value)\">\n <option value=\"all\">All Servers</option>\n @for (s of toolsAvailableServers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-tags\"></i> Category</label>\n <select #fCat class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolsCategory ?? 'all'\" (change)=\"onFilterFieldChange('toolsCategory', fCat.value)\">\n <option value=\"all\">All Categories</option>\n @for (c of toolsAvailableCategories; track c.category) {\n <option [value]=\"c.category\">{{ c.category }} ({{ c.count }})</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer;font-size:0.85rem\">\n <input #fFav type=\"checkbox\" [checked]=\"CurrentFilters.favoritesOnly === true\" (change)=\"onFilterFieldChange('favoritesOnly', fFav.checked)\" />\n <i class=\"fa-solid fa-star\" style=\"color:var(--mj-status-warning,#f59e0b)\"></i>\n Favorites only\n </label>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer;font-size:0.85rem\">\n <input #fRec type=\"checkbox\" [checked]=\"CurrentFilters.recentOnly === true\" (change)=\"onFilterFieldChange('recentOnly', fRec.checked)\" />\n <i class=\"fa-solid fa-clock-rotate-left\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n Recently used only\n </label>\n </div>\n }\n\n <!-- Tab-specific status filter -->\n @if (ActiveTab === 'servers') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Server Status</label>\n <select #fSStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.serverStatus\" (change)=\"onFilterFieldChange('serverStatus', fSStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'connections') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Connection Status</label>\n <select #fCStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.connectionStatus\" (change)=\"onFilterFieldChange('connectionStatus', fCStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n <option value=\"Error\">Error</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'tools') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Tool Status</label>\n <select #fTStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolStatus\" (change)=\"onFilterFieldChange('toolStatus', fTStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Deprecated\">Deprecated</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'logs') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-circle-check\"></i> Log Status</label>\n <select #fLStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.logStatus\" (change)=\"onFilterFieldChange('logStatus', fLStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Error\">Error</option>\n <option value=\"Running\">Running</option>\n </select>\n </div>\n }\n\n <!-- Reset -->\n <div style=\"margin-top:16px\">\n <button mjButton variant=\"flat\" style=\"width:100%\" (click)=\"resetAllFilters()\">\n <i class=\"fa-solid fa-undo\"></i> Reset Filters\n </button>\n </div>\n </div>\n <div class=\"resize-handle\"></div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\">{{ server.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\">{{ server.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\">{{ conn.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\">{{ conn.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n <!-- Scale-mode toggle (Part 3.2): flip to virtual-scrolled paginated list for 1000s of tools -->\n <div style=\"display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:4px 0;font-size:0.8rem;color:var(--mj-text-muted,#888)\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer\">\n <input type=\"checkbox\" [checked]=\"useScalablePagination\" (change)=\"toggleScalableMode($any($event.target).checked)\" />\n Scale mode (virtual scroll, paginated)\n </label>\n @if (useScalablePagination) {\n <span>\u00B7 Showing {{ pagedTools.length }} of {{ toolsTotalCount }}</span>\n }\n </div>\n @if (useScalablePagination) {\n <div style=\"padding:8px 12px;font-size:0.8rem;color:var(--mj-text-secondary,#475569);background:var(--mj-bg-surface-card,#f8f9fa);border-radius:4px;margin-bottom:6px\">\n Showing <strong>{{ visiblePagedTools.length }}</strong> of <strong>{{ scaleDenominator() }}</strong> tools\n </div>\n <div style=\"height:calc(100vh - 260px);width:100%;overflow-y:auto;border:1px solid var(--mj-border-subtle,#eee);border-radius:4px\" (scroll)=\"onToolsScrollNative($event)\">\n @for (tool of visiblePagedTools; track tool.ID) {\n <div style=\"display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--mj-border-subtle,#eee);height:72px;box-sizing:border-box\">\n <i class=\"fa-solid fa-wrench\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-weight:500;font-size:0.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ToolTitle || tool.ToolName }}</div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ServerName }} \u00B7 {{ tool.ToolName }}</div>\n </div>\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">{{ tool.Status }}</span>\n </div>\n }\n @if (toolsLoading) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">Loading more\u2026</div>\n }\n </div>\n } @else if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ getServerToolCount(group.server.ID) }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\">{{ tool.ToolDescription }}</p>\n }\n <div class=\"tool-card-actions\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\">{{ tool.ToolTitle || tool.ToolName }}</span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\">{{ tool.ToolDescription || '-' }}</td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:0.95rem;margin-right:4px\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Server Dialog (inline \u2014 avoids sub-component DI issues) -->\n@if (ShowServerDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelServerForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:600px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">{{ EditingServer ? 'Edit MCP Server' : 'Add MCP Server' }}</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelServerForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ServerFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ServerFormError }}\n </div>\n }\n <!-- Name -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfName class=\"mj-input\" placeholder=\"e.g., GitHub MCP Server\" [value]=\"ServerForm.Name\" (input)=\"ServerForm.Name = sfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <!-- Description -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Description</label>\n <textarea #sfDesc class=\"mj-textarea\" placeholder=\"Optional description\" [value]=\"ServerForm.Description\" (input)=\"ServerForm.Description = sfDesc.value\" rows=\"3\" style=\"width:100%;box-sizing:border-box\"></textarea>\n </div>\n <!-- Transport Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Transport Type <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #sfTransport class=\"mj-input\" [value]=\"ServerForm.TransportType\" (change)=\"ServerForm.TransportType = sfTransport.value\" style=\"width:100%;box-sizing:border-box\">\n @for (t of TransportTypes; track t.value) {\n <option [value]=\"t.value\">{{ t.label }}</option>\n }\n </select>\n </div>\n <!-- Server URL (for HTTP-based transports) -->\n @if (ServerForm.TransportType === 'StreamableHTTP' || ServerForm.TransportType === 'SSE' || ServerForm.TransportType === 'WebSocket') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server URL <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfUrl class=\"mj-input\" placeholder=\"https://api.example.com/mcp\" [value]=\"ServerForm.ServerURL\" (input)=\"ServerForm.ServerURL = sfUrl.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Command (for Stdio) -->\n @if (ServerForm.TransportType === 'Stdio') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Command <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfCmd class=\"mj-input\" placeholder=\"e.g., npx\" [value]=\"ServerForm.Command\" (input)=\"ServerForm.Command = sfCmd.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Auth Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Default Auth Type</label>\n <select #sfAuth class=\"mj-input\" [value]=\"ServerForm.DefaultAuthType\" (change)=\"ServerForm.DefaultAuthType = sfAuth.value\" style=\"width:100%;box-sizing:border-box\">\n @for (a of AuthTypes; track a.value) {\n <option [value]=\"a.value\">{{ a.label }}</option>\n }\n </select>\n </div>\n <!-- Status -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #sfStatus class=\"mj-input\" [value]=\"ServerForm.Status\" (change)=\"ServerForm.Status = sfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveServerForm()\" [disabled]=\"ServerFormSaving\">\n @if (ServerFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n {{ EditingServer ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancelServerForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Connection Dialog (inline) -->\n@if (ShowConnectionDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelConnectionForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:560px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">Add Connection</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelConnectionForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ConnectionFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ConnectionFormError }}\n </div>\n }\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #cfServer class=\"mj-input\" [value]=\"ConnectionForm.MCPServerID\" (change)=\"ConnectionForm.MCPServerID = cfServer.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #cfName class=\"mj-input\" placeholder=\"e.g., Zapier Connection\" [value]=\"ConnectionForm.Name\" (input)=\"ConnectionForm.Name = cfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Bearer Token</label>\n <input #cfToken class=\"mj-input\" placeholder=\"Paste bearer token here\" [value]=\"ConnectionForm.BearerToken\" (input)=\"ConnectionForm.BearerToken = cfToken.value\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" />\n <span style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">Will be stored as a Credential and linked to this connection</span>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #cfStatus class=\"mj-input\" [value]=\"ConnectionForm.Status\" (change)=\"ConnectionForm.Status = cfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveConnectionForm()\" [disabled]=\"ConnectionFormSaving\">\n @if (ConnectionFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n Create\n </button>\n <button mjButton (click)=\"cancelConnectionForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Test Tool Dialog (inline) -->\n@if (ShowTestToolDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"testCloseDialog()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:640px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">\n Test MCP Tool\n @if (TestStep !== 'select') {\n <span style=\"font-size:0.875rem;font-weight:400;color:var(--mj-text-muted,#888);margin-left:8px\">\u2014 {{ TestSelectedTool?.ToolTitle || TestSelectedTool?.ToolName }}</span>\n }\n </h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"testCloseDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Step indicator -->\n <div style=\"display:flex;gap:0;padding:10px 20px;background:var(--mj-bg-surface-card,#f9f9f9);border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='select' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">1. Select</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='configure' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">2. Configure</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='results' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">3. Results</span>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (TestStep === 'select') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tSrv class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"onTestServerChange(tSrv.value)\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\" [selected]=\"TestToolServerID === s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Connection <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tConn class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [attr.disabled]=\"!TestToolServerID ? true : null\" (change)=\"onTestConnectionChange(tConn.value)\">\n <option value=\"\">\u2014 select connection \u2014</option>\n @for (c of TestFilteredConnections; track c.ID) {\n <option [value]=\"c.ID\" [selected]=\"TestToolConnectionID === c.ID\">{{ c.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Tool <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #tSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box;margin-bottom:6px\" placeholder=\"Search tools\u2026 (Recently used appear first)\" [value]=\"TestToolSearch\" (input)=\"onTestToolSearchChange(tSearch.value)\" [attr.disabled]=\"!TestToolServerID ? true : null\" />\n <div style=\"max-height:220px;overflow-y:auto;border:1px solid var(--mj-border-default,#e0e0e0);border-radius:4px;background:var(--mj-bg-surface,#fff)\">\n @if (TestComboboxTools.length === 0) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">No tools match.</div>\n }\n @for (t of TestComboboxTools; track t.ID) {\n <div (click)=\"pickTestTool(t.ID)\" style=\"padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--mj-border-subtle,#eee)\" [style.background]=\"TestToolID === t.ID ? 'color-mix(in srgb, var(--mj-brand-primary,#264FAF) 12%, var(--mj-bg-surface,#fff))' : null\">\n @if (isRecentTestTool(t.ID)) {\n <span style=\"font-size:0.65rem;background:var(--mj-brand-primary,#264FAF);color:#fff;padding:1px 6px;border-radius:8px;font-weight:600\">Recent</span>\n }\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-size:0.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolTitle || t.ToolName }}</div>\n @if (t.ToolTitle && t.ToolName !== t.ToolTitle) {\n <div style=\"font-size:0.7rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolName }}</div>\n }\n </div>\n @if (TestToolID === t.ID) {\n <i class=\"fa-solid fa-check\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n }\n </div>\n }\n </div>\n </div>\n } @else if (TestStep === 'configure') {\n @if (TestParamConfigs.length === 0) {\n <div style=\"text-align:center;padding:24px;color:var(--mj-text-muted,#888)\">\n <i class=\"fa-solid fa-check-circle\" style=\"font-size:2rem;margin-bottom:8px;display:block\"></i>\n <p>This tool requires no parameters.</p>\n </div>\n } @else {\n @for (p of TestParamConfigs; track p.name) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">\n {{ p.name }} @if (p.required) { <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span> }\n </label>\n @if (p.description) {\n <p style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin:0 0 4px 0\">{{ p.description }}</p>\n }\n @if (p.enumValues.length > 0) {\n <select #enumEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, enumEl.value)\">\n <option value=\"\">\u2014 select \u2014</option>\n @for (v of p.enumValues; track $index) { <option [value]=\"$any(v)\">{{ $any(v) }}</option> }\n </select>\n } @else if (p.type === 'boolean') {\n <select #boolEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, boolEl.value)\">\n <option value=\"false\">false</option>\n <option value=\"true\">true</option>\n </select>\n } @else if (p.type === 'array' || p.type === 'object') {\n <textarea #jsonEl class=\"mj-textarea\" rows=\"3\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" (input)=\"testSetParam(p.name, jsonEl.value)\" [placeholder]=\"'Enter JSON ' + p.type + '...'\"></textarea>\n } @else {\n <input #strEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (input)=\"testSetParam(p.name, strEl.value)\" [placeholder]=\"p.description || 'Enter value...'\" />\n }\n </div>\n }\n }\n } @else {\n @if (TestExecutionResult?.Success) {\n <div style=\"background:var(--mj-status-success-bg,#f0fff4);border:1px solid var(--mj-status-success-border,#9ae6b4);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-success-text,#276749)\">\n <i class=\"fa-solid fa-check-circle\"></i> Execution Successful\n @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }\n </div>\n } @else {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030)\">\n <i class=\"fa-solid fa-times-circle\"></i> Execution Failed\n </div>\n }\n @if (TestExecutionResult?.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Error</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;margin:0\">{{ TestExecutionResult?.ErrorMessage }}</pre>\n </div>\n }\n @if (TestExecutionResult?.Result) {\n <div>\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:300px;margin:0\">{{ formatTestResult(TestExecutionResult?.Result) }}</pre>\n </div>\n }\n }\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n @if (TestStep === 'select') {\n <button mjButton variant=\"primary\" (click)=\"testProceedToConfig()\" [disabled]=\"!TestCanProceed\">Next <i class=\"fa-solid fa-arrow-right\"></i></button>\n <button mjButton (click)=\"testCloseDialog()\">Cancel</button>\n } @else if (TestStep === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"testExecuteTool()\" [disabled]=\"!TestIsValid || TestIsExecuting\">\n @if (TestIsExecuting) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Executing... } @else { <i class=\"fa-solid fa-play\"></i> Execute }\n </button>\n <button mjButton (click)=\"testGoBack()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n } @else {\n <button mjButton variant=\"primary\" (click)=\"testRunAgain()\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n <button mjButton (click)=\"testGoBack()\">Edit Params</button>\n <button mjButton (click)=\"testCloseDialog()\">Close</button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Log Detail Panel (inlined) -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <div style=\"position:fixed;inset:0;z-index:10000;pointer-events:none\">\n <div style=\"position:absolute;inset:0;background:rgba(0,0,0,0.35);pointer-events:auto\" (click)=\"onLogDetailClose()\"></div>\n <div style=\"position:absolute;top:0;right:0;height:100%;width:560px;max-width:95vw;background:var(--mj-bg-surface,#fff);box-shadow:-4px 0 20px rgba(0,0,0,0.15);display:flex;flex-direction:column;pointer-events:auto\">\n <div style=\"padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);display:flex;align-items:center;justify-content:space-between\">\n <div>\n <h3 style=\"margin:0;font-size:1rem;font-weight:600\">{{ SelectedLog.ToolName }}</h3>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:4px\">\n <span [class]=\"SelectedLog.Status === 'Success' ? 'status-success' : SelectedLog.Status === 'Error' ? 'status-error' : 'status-running'\" style=\"font-weight:600\">{{ SelectedLog.Status }}</span>\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDate(SelectedLog.StartedAt) }}</span>\n @if (SelectedLog.DurationMs != null) {\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDuration(SelectedLog.DurationMs) }}</span>\n }\n </div>\n </div>\n <button mjButton (click)=\"onLogDetailClose()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:16px 20px\">\n <div style=\"margin-bottom:16px\">\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-bottom:4px\">Connection</div>\n <div style=\"font-size:0.875rem\">{{ SelectedLog.ConnectionName || SelectedLog.ConnectionID }}</div>\n @if (SelectedLog.ServerName) {\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:2px\">{{ SelectedLog.ServerName }}</div>\n }\n </div>\n @if (SelectedLog.InputArgs) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Input Arguments</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:240px;margin:0\">{{ formatLogJson(SelectedLog.InputArgs) }}</pre>\n </div>\n }\n @if (SelectedLog.Result) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:360px;margin:0\">{{ formatLogJson(SelectedLog.Result) }}</pre>\n </div>\n }\n @if (SelectedLog.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px;color:var(--mj-status-error-text,#c53030)\">Error</label>\n <pre style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;margin:0;color:var(--mj-status-error-text,#c53030)\">{{ SelectedLog.ErrorMessage }}</pre>\n </div>\n }\n </div>\n <div style=\"padding:12px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);display:flex;gap:8px;justify-content:flex-start\">\n @if (SelectedLog.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgainFromLog({ toolId: SelectedLog.ToolID!, connectionId: SelectedLog.ConnectionID })\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n }\n <button mjButton (click)=\"onLogDetailClose()\">Close</button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* MCP Dashboard - Header + Filter Panel Layout */\n.mcp-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n/* ========================================\n Dashboard Header\n ======================================== */\n.dashboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.dashboard-title i {\n color: var(--mj-brand-primary);\n font-size: 20px;\n}\n\n.filter-toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.filter-toggle-btn i {\n font-size: 12px;\n}\n\n.item-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n padding: 4px 10px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.tab-btn:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n color: var(--mj-text-primary);\n}\n\n.tab-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn i {\n font-size: 14px;\n}\n\n.tab-label {\n font-weight: 500;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: var(--mj-border-default);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.tab-btn.active .tab-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.tab-badge.has-errors {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* ========================================\n Main Content Area (with Filter Panel)\n ======================================== */\n.main-content {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Filter Panel Container */\n.filter-panel-container {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n/* Resize Handle */\n.resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle:active {\n background: var(--mj-brand-primary);\n}\n\n/* Content Area */\n.content-area {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Content Body */\n.content-body {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-brand-primary);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: var(--mj-status-error);\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success i {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error i {\n color: var(--mj-status-error);\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-brand-primary);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: var(--mj-text-disabled);\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state i {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle button {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle button.active {\n background: var(--mj-brand-primary);\n color: var(--mj-color-neutral-0);\n}\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list tbody tr.expanded {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row .action-cell {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-brand-primary);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: var(--mj-text-disabled);\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
2682
4474
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MCPToolsService }], null); })();
2683
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 194 }); })();
4475
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 230 }); })();
2684
4476
  //# sourceMappingURL=mcp-dashboard.component.js.map