@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.
- package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-config-resource.component.js +46 -0
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
- package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2471 -679
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.js +187 -60
- package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +0 -9
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -10
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +7 -6
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +4 -8
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +19 -0
- package/dist/archiving-dashboards.module.d.ts.map +1 -0
- package/dist/archiving-dashboards.module.js +52 -0
- package/dist/archiving-dashboards.module.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +3 -2
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +4 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- 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 {
|
|
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.
|
|
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
|
|
36
|
-
i0.ɵɵelementStart(0, "button",
|
|
37
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
38
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
44
|
-
i0.ɵɵelementStart(0, "button",
|
|
45
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
46
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
52
|
-
i0.ɵɵelementStart(0, "div",
|
|
53
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
54
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
57
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_3_listener() { i0.ɵɵrestoreView(
|
|
58
|
-
i0.ɵɵelement(4, "i",
|
|
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",
|
|
61
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_5_listener() { i0.ɵɵrestoreView(
|
|
62
|
-
i0.ɵɵelement(6, "i",
|
|
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
|
|
75
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
67
76
|
i0.ɵɵadvance();
|
|
68
|
-
i0.ɵɵclassProp("active",
|
|
77
|
+
i0.ɵɵclassProp("active", ctx_r2.ToolsViewMode === "card");
|
|
69
78
|
i0.ɵɵadvance(2);
|
|
70
|
-
i0.ɵɵclassProp("active",
|
|
79
|
+
i0.ɵɵclassProp("active", ctx_r2.ToolsViewMode === "list");
|
|
71
80
|
} }
|
|
72
81
|
function MCPDashboardComponent_Case_41_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
-
const
|
|
74
|
-
i0.ɵɵelementStart(0, "button",
|
|
75
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_41_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
76
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
81
|
-
i0.ɵɵproperty("disabled",
|
|
89
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
90
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsLoading);
|
|
82
91
|
i0.ɵɵadvance();
|
|
83
|
-
i0.ɵɵclassProp("fa-spin",
|
|
92
|
+
i0.ɵɵclassProp("fa-spin", ctx_r2.IsLoading);
|
|
84
93
|
} }
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
i0.ɵɵ
|
|
88
|
-
i0.ɵɵ
|
|
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",
|
|
91
|
-
i0.ɵɵlistener("click", function
|
|
92
|
-
i0.ɵɵelement(4, "i",
|
|
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
|
|
278
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
96
279
|
i0.ɵɵadvance(2);
|
|
97
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
280
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.ErrorMessage, " ");
|
|
98
281
|
} }
|
|
99
|
-
function
|
|
100
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
282
|
+
function MCPDashboardComponent_Conditional_71_Template(rf, ctx) { if (rf & 1) {
|
|
283
|
+
i0.ɵɵelement(0, "mj-loading", 65);
|
|
101
284
|
} }
|
|
102
|
-
function
|
|
103
|
-
const
|
|
104
|
-
i0.ɵɵelementStart(0, "div",
|
|
105
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
110
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
115
|
-
i0.ɵɵ
|
|
116
|
-
i0.ɵɵ
|
|
117
|
-
i0.ɵɵ
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
|
125
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
310
|
+
i0.ɵɵelementStart(3, "span", 121);
|
|
129
311
|
i0.ɵɵtext(4);
|
|
130
312
|
i0.ɵɵelementEnd()();
|
|
131
313
|
} if (rf & 2) {
|
|
132
|
-
const
|
|
314
|
+
const server_r26 = i0.ɵɵnextContext().$implicit;
|
|
133
315
|
i0.ɵɵadvance(4);
|
|
134
|
-
i0.ɵɵtextInterpolate(
|
|
316
|
+
i0.ɵɵtextInterpolate(server_r26.ServerURL);
|
|
135
317
|
} }
|
|
136
|
-
function
|
|
137
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
322
|
+
i0.ɵɵelementStart(3, "span", 122);
|
|
141
323
|
i0.ɵɵtext(4);
|
|
142
324
|
i0.ɵɵelementEnd()();
|
|
143
325
|
} if (rf & 2) {
|
|
144
|
-
const
|
|
326
|
+
const server_r26 = i0.ɵɵnextContext().$implicit;
|
|
145
327
|
i0.ɵɵadvance(4);
|
|
146
|
-
i0.ɵɵtextInterpolate(
|
|
328
|
+
i0.ɵɵtextInterpolate(server_r26.Command);
|
|
147
329
|
} }
|
|
148
|
-
function
|
|
149
|
-
i0.ɵɵelementStart(0, "div",
|
|
150
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
155
|
-
const
|
|
156
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
160
|
-
i0.ɵɵelement(5, "i",
|
|
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",
|
|
164
|
-
i0.ɵɵlistener("click", function
|
|
165
|
-
i0.ɵɵelement(8, "i",
|
|
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
|
|
169
|
-
const
|
|
350
|
+
const tool_r28 = ctx.$implicit;
|
|
351
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
170
352
|
i0.ɵɵadvance(3);
|
|
171
|
-
i0.ɵɵtextInterpolate(
|
|
353
|
+
i0.ɵɵtextInterpolate(tool_r28.ToolTitle || tool_r28.ToolName);
|
|
172
354
|
i0.ɵɵadvance(3);
|
|
173
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
355
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.getParamCount(tool_r28), " params ");
|
|
174
356
|
} }
|
|
175
|
-
function
|
|
176
|
-
i0.ɵɵelementStart(0, "div",
|
|
177
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
181
|
-
const
|
|
362
|
+
const server_r26 = i0.ɵɵnextContext(2).$implicit;
|
|
363
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
182
364
|
i0.ɵɵadvance();
|
|
183
|
-
i0.ɵɵrepeater(
|
|
365
|
+
i0.ɵɵrepeater(ctx_r2.getToolsForServer(server_r26.ID));
|
|
184
366
|
} }
|
|
185
|
-
function
|
|
186
|
-
i0.ɵɵelementStart(0, "div",
|
|
187
|
-
i0.ɵɵelement(2, "i",
|
|
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,
|
|
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
|
|
195
|
-
const
|
|
376
|
+
const server_r26 = i0.ɵɵnextContext().$implicit;
|
|
377
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
196
378
|
i0.ɵɵadvance(4);
|
|
197
|
-
i0.ɵɵtextInterpolate1("Available Tools (",
|
|
379
|
+
i0.ɵɵtextInterpolate1("Available Tools (", ctx_r2.getToolsForServer(server_r26.ID).length, ")");
|
|
198
380
|
i0.ɵɵadvance();
|
|
199
|
-
i0.ɵɵconditional(
|
|
381
|
+
i0.ɵɵconditional(ctx_r2.getToolsForServer(server_r26.ID).length === 0 ? 5 : 6);
|
|
200
382
|
} }
|
|
201
|
-
function
|
|
202
|
-
const
|
|
203
|
-
i0.ɵɵelementStart(0, "div",
|
|
204
|
-
i0.ɵɵlistener("click", function
|
|
205
|
-
i0.ɵɵelementStart(2, "div",
|
|
206
|
-
i0.ɵɵelement(3, "i",
|
|
207
|
-
i0.ɵɵ
|
|
208
|
-
i0.ɵɵ
|
|
209
|
-
i0.ɵɵ
|
|
210
|
-
i0.ɵɵ
|
|
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(
|
|
213
|
-
i0.ɵɵlistener("click", function
|
|
214
|
-
i0.ɵɵelementStart(
|
|
215
|
-
i0.ɵɵlistener("click", function
|
|
216
|
-
i0.ɵɵelement(
|
|
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(
|
|
219
|
-
i0.ɵɵlistener("click", function
|
|
220
|
-
i0.ɵɵelement(
|
|
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(
|
|
223
|
-
i0.ɵɵconditionalCreate(
|
|
224
|
-
i0.ɵɵelementStart(
|
|
225
|
-
i0.ɵɵtext(
|
|
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(
|
|
228
|
-
i0.ɵɵtext(
|
|
410
|
+
i0.ɵɵelementStart(20, "span", 118);
|
|
411
|
+
i0.ɵɵtext(21);
|
|
229
412
|
i0.ɵɵelementEnd()();
|
|
230
|
-
i0.ɵɵelementStart(
|
|
231
|
-
i0.ɵɵtext(
|
|
413
|
+
i0.ɵɵelementStart(22, "div", 116)(23, "span", 117);
|
|
414
|
+
i0.ɵɵtext(24, "Auth");
|
|
232
415
|
i0.ɵɵelementEnd();
|
|
233
|
-
i0.ɵɵelementStart(
|
|
234
|
-
i0.ɵɵtext(
|
|
416
|
+
i0.ɵɵelementStart(25, "span", 118);
|
|
417
|
+
i0.ɵɵtext(26);
|
|
235
418
|
i0.ɵɵelementEnd()();
|
|
236
|
-
i0.ɵɵelementStart(
|
|
237
|
-
i0.ɵɵtext(
|
|
419
|
+
i0.ɵɵelementStart(27, "div", 116)(28, "span", 117);
|
|
420
|
+
i0.ɵɵtext(29, "Connections");
|
|
238
421
|
i0.ɵɵelementEnd();
|
|
239
|
-
i0.ɵɵelementStart(
|
|
240
|
-
i0.ɵɵtext(
|
|
422
|
+
i0.ɵɵelementStart(30, "span", 118);
|
|
423
|
+
i0.ɵɵtext(31);
|
|
241
424
|
i0.ɵɵelementEnd()();
|
|
242
|
-
i0.ɵɵelementStart(
|
|
243
|
-
i0.ɵɵtext(
|
|
425
|
+
i0.ɵɵelementStart(32, "div", 116)(33, "span", 117);
|
|
426
|
+
i0.ɵɵtext(34, "Tools");
|
|
244
427
|
i0.ɵɵelementEnd();
|
|
245
|
-
i0.ɵɵelementStart(
|
|
246
|
-
i0.ɵɵtext(
|
|
428
|
+
i0.ɵɵelementStart(35, "span", 118);
|
|
429
|
+
i0.ɵɵtext(36);
|
|
247
430
|
i0.ɵɵelementEnd()();
|
|
248
|
-
i0.ɵɵconditionalCreate(
|
|
249
|
-
i0.ɵɵconditionalCreate(
|
|
250
|
-
i0.ɵɵelementStart(
|
|
251
|
-
i0.ɵɵtext(
|
|
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(
|
|
254
|
-
i0.ɵɵtext(
|
|
436
|
+
i0.ɵɵelementStart(42, "span", 118);
|
|
437
|
+
i0.ɵɵtext(43);
|
|
255
438
|
i0.ɵɵelementEnd()()()();
|
|
256
|
-
i0.ɵɵconditionalCreate(
|
|
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
|
-
|
|
260
|
-
const
|
|
261
|
-
|
|
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",
|
|
446
|
+
i0.ɵɵclassProp("rotated", ctx_r2.isServerExpanded(server_r26));
|
|
265
447
|
i0.ɵɵadvance();
|
|
266
|
-
i0.ɵɵclassMap(
|
|
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("
|
|
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(" ",
|
|
454
|
+
i0.ɵɵtextInterpolate1(" ", server_r26.Status, " ");
|
|
273
455
|
i0.ɵɵadvance(7);
|
|
274
|
-
i0.ɵɵconditional(
|
|
456
|
+
i0.ɵɵconditional(server_r26.Description ? 15 : -1);
|
|
275
457
|
i0.ɵɵadvance(6);
|
|
276
|
-
i0.ɵɵtextInterpolate(
|
|
458
|
+
i0.ɵɵtextInterpolate(server_r26.TransportType);
|
|
277
459
|
i0.ɵɵadvance(5);
|
|
278
|
-
i0.ɵɵtextInterpolate(
|
|
460
|
+
i0.ɵɵtextInterpolate(server_r26.DefaultAuthType);
|
|
279
461
|
i0.ɵɵadvance(5);
|
|
280
|
-
i0.ɵɵtextInterpolate(
|
|
462
|
+
i0.ɵɵtextInterpolate(server_r26.ConnectionCount);
|
|
281
463
|
i0.ɵɵadvance(5);
|
|
282
|
-
i0.ɵɵtextInterpolate(
|
|
464
|
+
i0.ɵɵtextInterpolate(server_r26.ToolCount);
|
|
283
465
|
i0.ɵɵadvance();
|
|
284
|
-
i0.ɵɵconditional(
|
|
466
|
+
i0.ɵɵconditional(server_r26.ServerURL ? 37 : -1);
|
|
285
467
|
i0.ɵɵadvance();
|
|
286
|
-
i0.ɵɵconditional(
|
|
468
|
+
i0.ɵɵconditional(server_r26.Command ? 38 : -1);
|
|
287
469
|
i0.ɵɵadvance(5);
|
|
288
|
-
i0.ɵɵtextInterpolate(
|
|
470
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(server_r26.LastSyncAt));
|
|
289
471
|
i0.ɵɵadvance();
|
|
290
|
-
i0.ɵɵconditional(
|
|
472
|
+
i0.ɵɵconditional(ctx_r2.isServerExpanded(server_r26) ? 44 : -1);
|
|
291
473
|
} }
|
|
292
|
-
function
|
|
293
|
-
i0.ɵɵrepeaterCreate(0,
|
|
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
|
|
296
|
-
i0.ɵɵrepeater(
|
|
477
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
478
|
+
i0.ɵɵrepeater(ctx_r2.filteredServers);
|
|
297
479
|
} }
|
|
298
|
-
function
|
|
299
|
-
i0.ɵɵelementStart(0, "div",
|
|
300
|
-
i0.ɵɵconditionalCreate(1,
|
|
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
|
|
485
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
304
486
|
i0.ɵɵadvance();
|
|
305
|
-
i0.ɵɵconditional(
|
|
487
|
+
i0.ɵɵconditional(ctx_r2.filteredServers.length === 0 ? 1 : 2);
|
|
306
488
|
} }
|
|
307
|
-
function
|
|
308
|
-
const
|
|
309
|
-
i0.ɵɵelementStart(0, "div",
|
|
310
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
315
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
320
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
323
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
326
|
-
i0.ɵɵelementStart(0, "div",
|
|
327
|
-
i0.ɵɵelement(1, "i",
|
|
328
|
-
i0.ɵɵelementStart(2, "span",
|
|
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
|
|
333
|
-
const
|
|
514
|
+
const conn_r31 = i0.ɵɵnextContext().$implicit;
|
|
515
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
334
516
|
i0.ɵɵadvance(3);
|
|
335
|
-
i0.ɵɵtextInterpolate(
|
|
517
|
+
i0.ɵɵtextInterpolate(ctx_r2.getSyncProgressMessage(conn_r31.ID) || "Syncing...");
|
|
336
518
|
} }
|
|
337
|
-
function
|
|
338
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
344
|
-
const
|
|
345
|
-
const
|
|
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: ", (
|
|
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
|
|
350
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
356
|
-
const
|
|
357
|
-
const
|
|
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((
|
|
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
|
|
362
|
-
i0.ɵɵelementStart(0, "div",
|
|
363
|
-
i0.ɵɵconditionalCreate(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
|
-
|
|
370
|
-
const
|
|
371
|
-
|
|
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(((
|
|
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
|
|
376
|
-
i0.ɵɵ
|
|
377
|
-
i0.ɵɵ
|
|
378
|
-
i0.ɵɵ
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
|
386
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
570
|
+
i0.ɵɵelementStart(3, "span", 118);
|
|
390
571
|
i0.ɵɵtext(4);
|
|
391
572
|
i0.ɵɵelementEnd()();
|
|
392
573
|
} if (rf & 2) {
|
|
393
|
-
const
|
|
574
|
+
const conn_r31 = i0.ɵɵnextContext().$implicit;
|
|
394
575
|
i0.ɵɵadvance(4);
|
|
395
|
-
i0.ɵɵtextInterpolate(
|
|
576
|
+
i0.ɵɵtextInterpolate(conn_r31.LastErrorMessage);
|
|
396
577
|
} }
|
|
397
|
-
function
|
|
398
|
-
i0.ɵɵelementStart(0, "div",
|
|
399
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
404
|
-
const
|
|
405
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
409
|
-
i0.ɵɵelement(5, "i",
|
|
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",
|
|
413
|
-
i0.ɵɵlistener("click", function
|
|
414
|
-
i0.ɵɵelement(8, "i",
|
|
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
|
|
418
|
-
const
|
|
598
|
+
const tool_r33 = ctx.$implicit;
|
|
599
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
419
600
|
i0.ɵɵadvance(3);
|
|
420
|
-
i0.ɵɵtextInterpolate(
|
|
601
|
+
i0.ɵɵtextInterpolate(tool_r33.ToolTitle || tool_r33.ToolName);
|
|
421
602
|
i0.ɵɵadvance(3);
|
|
422
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
603
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.getParamCount(tool_r33), " params ");
|
|
423
604
|
} }
|
|
424
|
-
function
|
|
425
|
-
i0.ɵɵelementStart(0, "div",
|
|
426
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
430
|
-
const
|
|
610
|
+
const conn_r31 = i0.ɵɵnextContext(2).$implicit;
|
|
611
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
431
612
|
i0.ɵɵadvance();
|
|
432
|
-
i0.ɵɵrepeater(
|
|
613
|
+
i0.ɵɵrepeater(ctx_r2.getToolsForConnection(conn_r31.ID));
|
|
433
614
|
} }
|
|
434
|
-
function
|
|
435
|
-
i0.ɵɵelementStart(0, "div",
|
|
436
|
-
i0.ɵɵelement(2, "i",
|
|
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,
|
|
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
|
|
444
|
-
const
|
|
624
|
+
const conn_r31 = i0.ɵɵnextContext().$implicit;
|
|
625
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
445
626
|
i0.ɵɵadvance(4);
|
|
446
|
-
i0.ɵɵtextInterpolate1("Available Tools (",
|
|
447
|
-
i0.ɵɵadvance();
|
|
448
|
-
i0.ɵɵconditional(
|
|
449
|
-
} }
|
|
450
|
-
function
|
|
451
|
-
const
|
|
452
|
-
i0.ɵɵelementStart(0, "div",
|
|
453
|
-
i0.ɵɵlistener("click", function
|
|
454
|
-
i0.ɵɵelementStart(2, "div",
|
|
455
|
-
i0.ɵɵelement(3, "i",
|
|
456
|
-
i0.ɵɵ
|
|
457
|
-
i0.ɵɵ
|
|
458
|
-
i0.ɵɵ
|
|
459
|
-
i0.ɵɵ
|
|
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(
|
|
462
|
-
i0.ɵɵlistener("click", function
|
|
463
|
-
i0.ɵɵelementStart(
|
|
464
|
-
i0.ɵɵlistener("click", function
|
|
465
|
-
i0.ɵɵconditionalCreate(
|
|
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(
|
|
468
|
-
i0.ɵɵlistener("click", function
|
|
469
|
-
i0.ɵɵelement(
|
|
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(
|
|
472
|
-
i0.ɵɵlistener("click", function
|
|
473
|
-
i0.ɵɵelement(
|
|
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(
|
|
476
|
-
i0.ɵɵconditionalCreate(
|
|
477
|
-
i0.ɵɵelementStart(
|
|
478
|
-
i0.ɵɵconditionalCreate(
|
|
479
|
-
i0.ɵɵelementStart(
|
|
480
|
-
i0.ɵɵtext(
|
|
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(
|
|
483
|
-
i0.ɵɵtext(
|
|
664
|
+
i0.ɵɵelementStart(25, "span", 118);
|
|
665
|
+
i0.ɵɵtext(26);
|
|
484
666
|
i0.ɵɵelementEnd()();
|
|
485
|
-
i0.ɵɵelementStart(
|
|
486
|
-
i0.ɵɵtext(
|
|
667
|
+
i0.ɵɵelementStart(27, "div", 116)(28, "span", 117);
|
|
668
|
+
i0.ɵɵtext(29, "Auto Sync");
|
|
487
669
|
i0.ɵɵelementEnd();
|
|
488
|
-
i0.ɵɵelementStart(
|
|
489
|
-
i0.ɵɵtext(
|
|
670
|
+
i0.ɵɵelementStart(30, "span", 118);
|
|
671
|
+
i0.ɵɵtext(31);
|
|
490
672
|
i0.ɵɵelementEnd()();
|
|
491
|
-
i0.ɵɵelementStart(
|
|
492
|
-
i0.ɵɵtext(
|
|
673
|
+
i0.ɵɵelementStart(32, "div", 116)(33, "span", 117);
|
|
674
|
+
i0.ɵɵtext(34, "Logging");
|
|
493
675
|
i0.ɵɵelementEnd();
|
|
494
|
-
i0.ɵɵelementStart(
|
|
495
|
-
i0.ɵɵtext(
|
|
676
|
+
i0.ɵɵelementStart(35, "span", 118);
|
|
677
|
+
i0.ɵɵtext(36);
|
|
496
678
|
i0.ɵɵelementEnd()();
|
|
497
|
-
i0.ɵɵelementStart(
|
|
498
|
-
i0.ɵɵtext(
|
|
679
|
+
i0.ɵɵelementStart(37, "div", 116)(38, "span", 117);
|
|
680
|
+
i0.ɵɵtext(39, "Last Connected");
|
|
499
681
|
i0.ɵɵelementEnd();
|
|
500
|
-
i0.ɵɵelementStart(
|
|
501
|
-
i0.ɵɵtext(
|
|
682
|
+
i0.ɵɵelementStart(40, "span", 118);
|
|
683
|
+
i0.ɵɵtext(41);
|
|
502
684
|
i0.ɵɵelementEnd()();
|
|
503
|
-
i0.ɵɵconditionalCreate(
|
|
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(
|
|
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
|
|
509
|
-
|
|
510
|
-
const
|
|
511
|
-
|
|
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",
|
|
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.ɵɵ
|
|
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(" ",
|
|
701
|
+
i0.ɵɵtextInterpolate1(" ", conn_r31.Status, " ");
|
|
521
702
|
i0.ɵɵadvance(2);
|
|
522
|
-
i0.ɵɵproperty("disabled",
|
|
703
|
+
i0.ɵɵproperty("disabled", ctx_r2.isSyncing(conn_r31.ID));
|
|
523
704
|
i0.ɵɵadvance();
|
|
524
|
-
i0.ɵɵconditional(
|
|
705
|
+
i0.ɵɵconditional(ctx_r2.isSyncing(conn_r31.ID) ? 11 : 12);
|
|
525
706
|
i0.ɵɵadvance(6);
|
|
526
|
-
i0.ɵɵconditional(
|
|
707
|
+
i0.ɵɵconditional(ctx_r2.isSyncing(conn_r31.ID) ? 17 : -1);
|
|
527
708
|
i0.ɵɵadvance();
|
|
528
|
-
i0.ɵɵconditional(((
|
|
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(
|
|
711
|
+
i0.ɵɵconditional(conn_r31.Description ? 20 : -1);
|
|
531
712
|
i0.ɵɵadvance(6);
|
|
532
|
-
i0.ɵɵtextInterpolate(
|
|
713
|
+
i0.ɵɵtextInterpolate(conn_r31.ServerName);
|
|
533
714
|
i0.ɵɵadvance(5);
|
|
534
|
-
i0.ɵɵtextInterpolate(
|
|
715
|
+
i0.ɵɵtextInterpolate(conn_r31.AutoSyncTools ? "Yes" : "No");
|
|
535
716
|
i0.ɵɵadvance(5);
|
|
536
|
-
i0.ɵɵtextInterpolate(
|
|
717
|
+
i0.ɵɵtextInterpolate(conn_r31.LogToolCalls ? "Enabled" : "Disabled");
|
|
537
718
|
i0.ɵɵadvance(5);
|
|
538
|
-
i0.ɵɵtextInterpolate(
|
|
719
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(conn_r31.LastConnectedAt));
|
|
539
720
|
i0.ɵɵadvance();
|
|
540
|
-
i0.ɵɵconditional(
|
|
721
|
+
i0.ɵɵconditional(conn_r31.LastErrorMessage ? 42 : -1);
|
|
541
722
|
i0.ɵɵadvance();
|
|
542
|
-
i0.ɵɵconditional(
|
|
723
|
+
i0.ɵɵconditional(ctx_r2.isConnectionExpanded(conn_r31) ? 43 : -1);
|
|
543
724
|
} }
|
|
544
|
-
function
|
|
545
|
-
i0.ɵɵrepeaterCreate(0,
|
|
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
|
|
548
|
-
i0.ɵɵrepeater(
|
|
728
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
729
|
+
i0.ɵɵrepeater(ctx_r2.filteredConnections);
|
|
549
730
|
} }
|
|
550
|
-
function
|
|
551
|
-
i0.ɵɵelementStart(0, "div",
|
|
552
|
-
i0.ɵɵconditionalCreate(1,
|
|
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
|
|
736
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
556
737
|
i0.ɵɵadvance();
|
|
557
|
-
i0.ɵɵconditional(
|
|
738
|
+
i0.ɵɵconditional(ctx_r2.filteredConnections.length === 0 ? 1 : 2);
|
|
558
739
|
} }
|
|
559
|
-
function
|
|
560
|
-
i0.ɵɵelementStart(0, "
|
|
561
|
-
i0.ɵɵ
|
|
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",
|
|
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
|
|
570
|
-
i0.ɵɵ
|
|
571
|
-
i0.ɵɵ
|
|
572
|
-
i0.ɵɵ
|
|
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
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
|
580
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
840
|
+
i0.ɵɵelementStart(3, "pre", 185);
|
|
584
841
|
i0.ɵɵtext(4);
|
|
585
842
|
i0.ɵɵelementEnd()();
|
|
586
843
|
} if (rf & 2) {
|
|
587
|
-
const
|
|
588
|
-
const
|
|
844
|
+
const tool_r41 = i0.ɵɵnextContext(2).$implicit;
|
|
845
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
589
846
|
i0.ɵɵadvance(4);
|
|
590
|
-
i0.ɵɵtextInterpolate(
|
|
847
|
+
i0.ɵɵtextInterpolate(ctx_r2.getFormattedInputSchema(tool_r41));
|
|
591
848
|
} }
|
|
592
|
-
function
|
|
593
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
853
|
+
i0.ɵɵelementStart(4, "span", 182);
|
|
597
854
|
i0.ɵɵtext(5);
|
|
598
855
|
i0.ɵɵelementEnd()();
|
|
599
|
-
i0.ɵɵelementStart(6, "div",
|
|
856
|
+
i0.ɵɵelementStart(6, "div", 180)(7, "span", 181);
|
|
600
857
|
i0.ɵɵtext(8, "Parameters:");
|
|
601
858
|
i0.ɵɵelementEnd();
|
|
602
|
-
i0.ɵɵelementStart(9, "span",
|
|
859
|
+
i0.ɵɵelementStart(9, "span", 183);
|
|
603
860
|
i0.ɵɵtext(10);
|
|
604
861
|
i0.ɵɵelementEnd()();
|
|
605
|
-
i0.ɵɵelementStart(11, "div",
|
|
862
|
+
i0.ɵɵelementStart(11, "div", 180)(12, "span", 181);
|
|
606
863
|
i0.ɵɵtext(13, "Discovered:");
|
|
607
864
|
i0.ɵɵelementEnd();
|
|
608
|
-
i0.ɵɵelementStart(14, "span",
|
|
865
|
+
i0.ɵɵelementStart(14, "span", 183);
|
|
609
866
|
i0.ɵɵtext(15);
|
|
610
867
|
i0.ɵɵelementEnd()();
|
|
611
|
-
i0.ɵɵelementStart(16, "div",
|
|
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",
|
|
871
|
+
i0.ɵɵelementStart(19, "span", 183);
|
|
615
872
|
i0.ɵɵtext(20);
|
|
616
873
|
i0.ɵɵelementEnd()();
|
|
617
|
-
i0.ɵɵconditionalCreate(21,
|
|
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
|
|
621
|
-
const
|
|
877
|
+
const tool_r41 = i0.ɵɵnextContext().$implicit;
|
|
878
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
622
879
|
i0.ɵɵadvance(5);
|
|
623
|
-
i0.ɵɵtextInterpolate(
|
|
880
|
+
i0.ɵɵtextInterpolate(tool_r41.ToolName);
|
|
624
881
|
i0.ɵɵadvance(5);
|
|
625
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
882
|
+
i0.ɵɵtextInterpolate2(" ", ctx_r2.getParamCount(tool_r41), " total, ", ctx_r2.getRequiredParamCount(tool_r41), " required ");
|
|
626
883
|
i0.ɵɵadvance(5);
|
|
627
|
-
i0.ɵɵtextInterpolate(
|
|
884
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r41.DiscoveredAt));
|
|
628
885
|
i0.ɵɵadvance(5);
|
|
629
|
-
i0.ɵɵtextInterpolate(
|
|
886
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r41.LastSeenAt));
|
|
630
887
|
i0.ɵɵadvance();
|
|
631
|
-
i0.ɵɵconditional(
|
|
888
|
+
i0.ɵɵconditional(tool_r41.InputSchema ? 21 : -1);
|
|
632
889
|
} }
|
|
633
|
-
function
|
|
634
|
-
const
|
|
635
|
-
i0.ɵɵelementStart(0, "div",
|
|
636
|
-
i0.ɵɵlistener("click", function
|
|
637
|
-
i0.ɵɵelementStart(2, "div",
|
|
638
|
-
i0.ɵɵelement(3, "i",
|
|
639
|
-
i0.ɵɵ
|
|
640
|
-
i0.ɵɵ
|
|
641
|
-
i0.ɵɵelementEnd();
|
|
642
|
-
i0.ɵɵelementStart(
|
|
643
|
-
i0.ɵɵelement(
|
|
644
|
-
i0.ɵɵtext(
|
|
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(
|
|
647
|
-
i0.ɵɵtext(
|
|
903
|
+
i0.ɵɵelementStart(10, "span", 156);
|
|
904
|
+
i0.ɵɵtext(11);
|
|
648
905
|
i0.ɵɵelementEnd()()();
|
|
649
|
-
i0.ɵɵconditionalCreate(
|
|
650
|
-
i0.ɵɵelementStart(
|
|
651
|
-
i0.ɵɵlistener("click", function
|
|
652
|
-
i0.ɵɵelement(
|
|
653
|
-
i0.ɵɵ
|
|
654
|
-
i0.ɵɵ
|
|
655
|
-
i0.ɵɵ
|
|
656
|
-
i0.ɵɵ
|
|
657
|
-
i0.ɵɵ
|
|
658
|
-
i0.ɵɵ
|
|
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(
|
|
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
|
-
|
|
664
|
-
const
|
|
665
|
-
|
|
666
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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",
|
|
932
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(tool_r41.Status));
|
|
673
933
|
i0.ɵɵadvance();
|
|
674
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
934
|
+
i0.ɵɵtextInterpolate1(" ", tool_r41.Status, " ");
|
|
675
935
|
i0.ɵɵadvance();
|
|
676
|
-
i0.ɵɵconditional(
|
|
677
|
-
i0.ɵɵadvance(
|
|
678
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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(
|
|
947
|
+
i0.ɵɵconditional(ctx_r2.isToolExpanded(tool_r41) ? 22 : -1);
|
|
683
948
|
} }
|
|
684
|
-
function
|
|
685
|
-
i0.ɵɵelementStart(0, "div",
|
|
686
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
954
|
+
const group_r39 = i0.ɵɵnextContext(2).$implicit;
|
|
690
955
|
i0.ɵɵadvance();
|
|
691
|
-
i0.ɵɵrepeater(
|
|
956
|
+
i0.ɵɵrepeater(group_r39.tools);
|
|
692
957
|
} }
|
|
693
|
-
function
|
|
694
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
963
|
+
const tool_r43 = i0.ɵɵnextContext().$implicit;
|
|
699
964
|
i0.ɵɵadvance();
|
|
700
|
-
i0.ɵɵtextInterpolate(
|
|
965
|
+
i0.ɵɵtextInterpolate(tool_r43.ToolName);
|
|
701
966
|
} }
|
|
702
|
-
function
|
|
703
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
971
|
+
i0.ɵɵelementStart(3, "pre", 185);
|
|
707
972
|
i0.ɵɵtext(4);
|
|
708
973
|
i0.ɵɵelementEnd()();
|
|
709
974
|
} if (rf & 2) {
|
|
710
|
-
const
|
|
711
|
-
const
|
|
975
|
+
const tool_r43 = i0.ɵɵnextContext(2).$implicit;
|
|
976
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
712
977
|
i0.ɵɵadvance(4);
|
|
713
|
-
i0.ɵɵtextInterpolate(
|
|
978
|
+
i0.ɵɵtextInterpolate(ctx_r2.getFormattedInputSchema(tool_r43));
|
|
714
979
|
} }
|
|
715
|
-
function
|
|
716
|
-
i0.ɵɵelementStart(0, "tr",
|
|
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",
|
|
984
|
+
i0.ɵɵelementStart(6, "span", 182);
|
|
720
985
|
i0.ɵɵtext(7);
|
|
721
986
|
i0.ɵɵelementEnd()();
|
|
722
|
-
i0.ɵɵelementStart(8, "div",
|
|
987
|
+
i0.ɵɵelementStart(8, "div", 198)(9, "span", 181);
|
|
723
988
|
i0.ɵɵtext(10, "Discovered:");
|
|
724
989
|
i0.ɵɵelementEnd();
|
|
725
|
-
i0.ɵɵelementStart(11, "span",
|
|
990
|
+
i0.ɵɵelementStart(11, "span", 183);
|
|
726
991
|
i0.ɵɵtext(12);
|
|
727
992
|
i0.ɵɵelementEnd()();
|
|
728
|
-
i0.ɵɵelementStart(13, "div",
|
|
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",
|
|
996
|
+
i0.ɵɵelementStart(16, "span", 183);
|
|
732
997
|
i0.ɵɵtext(17);
|
|
733
998
|
i0.ɵɵelementEnd()();
|
|
734
|
-
i0.ɵɵconditionalCreate(18,
|
|
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
|
|
738
|
-
const
|
|
1002
|
+
const tool_r43 = i0.ɵɵnextContext().$implicit;
|
|
1003
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
739
1004
|
i0.ɵɵadvance(7);
|
|
740
|
-
i0.ɵɵtextInterpolate(
|
|
1005
|
+
i0.ɵɵtextInterpolate(tool_r43.ToolName);
|
|
741
1006
|
i0.ɵɵadvance(5);
|
|
742
|
-
i0.ɵɵtextInterpolate(
|
|
1007
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(tool_r43.DiscoveredAt));
|
|
743
1008
|
i0.ɵɵadvance(5);
|
|
744
|
-
i0.ɵɵtextInterpolate(
|
|
1009
|
+
i0.ɵɵtextInterpolate(ctx_r2.getRequiredParamCount(tool_r43));
|
|
745
1010
|
i0.ɵɵadvance();
|
|
746
|
-
i0.ɵɵconditional(
|
|
1011
|
+
i0.ɵɵconditional(tool_r43.InputSchema ? 18 : -1);
|
|
747
1012
|
} }
|
|
748
|
-
function
|
|
749
|
-
const
|
|
750
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
751
|
-
i0.ɵɵelement(2, "i",
|
|
752
|
-
i0.ɵɵelementStart(3, "div",
|
|
753
|
-
i0.ɵɵ
|
|
754
|
-
i0.ɵɵ
|
|
755
|
-
i0.ɵɵ
|
|
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(
|
|
765
|
-
i0.ɵɵtext(
|
|
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(
|
|
768
|
-
i0.ɵɵtext(
|
|
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(
|
|
771
|
-
i0.ɵɵlistener("click", function
|
|
772
|
-
i0.ɵɵelement(
|
|
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(
|
|
775
|
-
i0.ɵɵlistener("click", function
|
|
776
|
-
i0.ɵɵelement(
|
|
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,
|
|
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
|
-
|
|
781
|
-
|
|
782
|
-
|
|
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(
|
|
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.ɵɵ
|
|
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(" ",
|
|
1062
|
+
i0.ɵɵtextInterpolate1(" ", tool_r43.Status, " ");
|
|
797
1063
|
i0.ɵɵadvance(2);
|
|
798
|
-
i0.ɵɵtextInterpolate(
|
|
799
|
-
i0.ɵɵadvance(
|
|
800
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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
|
|
805
|
-
i0.ɵɵelementStart(0, "div",
|
|
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,
|
|
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
|
|
1098
|
+
const group_r39 = i0.ɵɵnextContext(2).$implicit;
|
|
828
1099
|
i0.ɵɵadvance(17);
|
|
829
|
-
i0.ɵɵrepeater(
|
|
1100
|
+
i0.ɵɵrepeater(group_r39.tools);
|
|
830
1101
|
} }
|
|
831
|
-
function
|
|
832
|
-
i0.ɵɵconditionalCreate(0,
|
|
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
|
|
835
|
-
i0.ɵɵconditional(
|
|
1105
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
1106
|
+
i0.ɵɵconditional(ctx_r2.ToolsViewMode === "card" ? 0 : 1);
|
|
836
1107
|
} }
|
|
837
|
-
function
|
|
838
|
-
const
|
|
839
|
-
i0.ɵɵelementStart(0, "div",
|
|
840
|
-
i0.ɵɵlistener("click", function
|
|
841
|
-
i0.ɵɵelementStart(2, "div",
|
|
842
|
-
i0.ɵɵelement(3, "i",
|
|
843
|
-
i0.ɵɵelementStart(5, "span",
|
|
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",
|
|
1117
|
+
i0.ɵɵelementStart(7, "span", 164);
|
|
847
1118
|
i0.ɵɵtext(8);
|
|
848
1119
|
i0.ɵɵelementEnd();
|
|
849
|
-
i0.ɵɵelementStart(9, "span",
|
|
1120
|
+
i0.ɵɵelementStart(9, "span", 156);
|
|
850
1121
|
i0.ɵɵtext(10);
|
|
851
1122
|
i0.ɵɵelementEnd()();
|
|
852
|
-
i0.ɵɵelementStart(11, "div",
|
|
853
|
-
i0.ɵɵlistener("click", function
|
|
854
|
-
i0.ɵɵelementStart(12, "button",
|
|
855
|
-
i0.ɵɵlistener("click", function
|
|
856
|
-
i0.ɵɵelement(13, "i",
|
|
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,
|
|
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
|
|
862
|
-
const
|
|
863
|
-
i0.ɵɵclassProp("collapsed", !
|
|
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",
|
|
1136
|
+
i0.ɵɵclassProp("expanded", group_r39.expanded);
|
|
866
1137
|
i0.ɵɵadvance();
|
|
867
|
-
i0.ɵɵclassMap(
|
|
1138
|
+
i0.ɵɵclassMap(ctx_r2.getTransportIcon(group_r39.server.TransportType));
|
|
868
1139
|
i0.ɵɵadvance(2);
|
|
869
|
-
i0.ɵɵtextInterpolate(
|
|
1140
|
+
i0.ɵɵtextInterpolate(group_r39.server.Name);
|
|
870
1141
|
i0.ɵɵadvance(2);
|
|
871
|
-
i0.ɵɵtextInterpolate1("",
|
|
1142
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.getServerToolCount(group_r39.server.ID), " tools");
|
|
872
1143
|
i0.ɵɵadvance();
|
|
873
|
-
i0.ɵɵproperty("ngClass",
|
|
1144
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(group_r39.server.Status));
|
|
874
1145
|
i0.ɵɵadvance();
|
|
875
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
1146
|
+
i0.ɵɵtextInterpolate1(" ", group_r39.server.Status, " ");
|
|
876
1147
|
i0.ɵɵadvance(4);
|
|
877
|
-
i0.ɵɵconditional(
|
|
1148
|
+
i0.ɵɵconditional(group_r39.expanded ? 14 : -1);
|
|
878
1149
|
} }
|
|
879
|
-
function
|
|
880
|
-
i0.ɵɵelementStart(0, "div",
|
|
881
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
1155
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
885
1156
|
i0.ɵɵadvance();
|
|
886
|
-
i0.ɵɵrepeater(
|
|
1157
|
+
i0.ɵɵrepeater(ctx_r2.ServerGroups);
|
|
887
1158
|
} }
|
|
888
|
-
function
|
|
889
|
-
|
|
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
|
|
892
|
-
i0.ɵɵ
|
|
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
|
|
895
|
-
i0.ɵɵelementStart(0, "div",
|
|
896
|
-
i0.ɵɵelement(1, "i",
|
|
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",
|
|
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
|
|
905
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
908
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
911
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
914
|
-
i0.ɵɵelement(0, "i",
|
|
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
|
|
917
|
-
const
|
|
918
|
-
i0.ɵɵelementStart(0, "tr",
|
|
919
|
-
i0.ɵɵlistener("click", function
|
|
920
|
-
i0.ɵɵelementStart(1, "td")(2, "span",
|
|
921
|
-
i0.ɵɵconditionalCreate(3,
|
|
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",
|
|
1208
|
+
i0.ɵɵelementStart(8, "td", 163);
|
|
925
1209
|
i0.ɵɵtext(9);
|
|
926
1210
|
i0.ɵɵelementEnd();
|
|
927
|
-
i0.ɵɵelementStart(10, "td",
|
|
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",
|
|
1223
|
+
i0.ɵɵelementStart(18, "td", 208);
|
|
940
1224
|
i0.ɵɵtext(19);
|
|
941
1225
|
i0.ɵɵelementEnd();
|
|
942
|
-
i0.ɵɵelementStart(20, "td",
|
|
943
|
-
i0.ɵɵelement(21, "i",
|
|
1226
|
+
i0.ɵɵelementStart(20, "td", 209);
|
|
1227
|
+
i0.ɵɵelement(21, "i", 210);
|
|
944
1228
|
i0.ɵɵelementEnd()();
|
|
945
1229
|
} if (rf & 2) {
|
|
946
|
-
let
|
|
947
|
-
const
|
|
948
|
-
const
|
|
949
|
-
i0.ɵɵclassProp("error-row",
|
|
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",
|
|
1235
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(log_r46.Status));
|
|
952
1236
|
i0.ɵɵadvance();
|
|
953
|
-
i0.ɵɵconditional((
|
|
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(" ",
|
|
1239
|
+
i0.ɵɵtextInterpolate1(" ", log_r46.Status || "Unknown", " ");
|
|
956
1240
|
i0.ɵɵadvance(2);
|
|
957
|
-
i0.ɵɵtextInterpolate(
|
|
1241
|
+
i0.ɵɵtextInterpolate(log_r46.ServerName);
|
|
958
1242
|
i0.ɵɵadvance(2);
|
|
959
|
-
i0.ɵɵtextInterpolate(
|
|
1243
|
+
i0.ɵɵtextInterpolate(log_r46.ToolName);
|
|
960
1244
|
i0.ɵɵadvance(2);
|
|
961
|
-
i0.ɵɵtextInterpolate(
|
|
1245
|
+
i0.ɵɵtextInterpolate(log_r46.ConnectionName);
|
|
962
1246
|
i0.ɵɵadvance(2);
|
|
963
|
-
i0.ɵɵtextInterpolate(
|
|
1247
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDate(log_r46.StartedAt));
|
|
964
1248
|
i0.ɵɵadvance(2);
|
|
965
|
-
i0.ɵɵtextInterpolate(
|
|
1249
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatDuration(log_r46.DurationMs));
|
|
966
1250
|
i0.ɵɵadvance();
|
|
967
|
-
i0.ɵɵproperty("title",
|
|
1251
|
+
i0.ɵɵproperty("title", log_r46.ErrorMessage || "");
|
|
968
1252
|
i0.ɵɵadvance();
|
|
969
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
1253
|
+
i0.ɵɵtextInterpolate1(" ", log_r46.ErrorMessage || "-", " ");
|
|
970
1254
|
} }
|
|
971
|
-
function
|
|
972
|
-
const
|
|
973
|
-
i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th",
|
|
974
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1260
|
+
i0.ɵɵelement(5, "i", 201);
|
|
977
1261
|
i0.ɵɵelementEnd();
|
|
978
|
-
i0.ɵɵelementStart(6, "th",
|
|
979
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1265
|
+
i0.ɵɵelement(8, "i", 201);
|
|
982
1266
|
i0.ɵɵelementEnd();
|
|
983
|
-
i0.ɵɵelementStart(9, "th",
|
|
984
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1270
|
+
i0.ɵɵelement(11, "i", 201);
|
|
987
1271
|
i0.ɵɵelementEnd();
|
|
988
|
-
i0.ɵɵelementStart(12, "th",
|
|
989
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1275
|
+
i0.ɵɵelement(14, "i", 201);
|
|
992
1276
|
i0.ɵɵelementEnd();
|
|
993
|
-
i0.ɵɵelementStart(15, "th",
|
|
994
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1280
|
+
i0.ɵɵelement(17, "i", 201);
|
|
997
1281
|
i0.ɵɵelementEnd();
|
|
998
|
-
i0.ɵɵelementStart(18, "th",
|
|
999
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
1285
|
+
i0.ɵɵelement(20, "i", 201);
|
|
1002
1286
|
i0.ɵɵelementEnd();
|
|
1003
|
-
i0.ɵɵelementStart(21, "th",
|
|
1004
|
-
i0.ɵɵlistener("click", function
|
|
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",
|
|
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,
|
|
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
|
|
1298
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
1015
1299
|
i0.ɵɵadvance(3);
|
|
1016
|
-
i0.ɵɵproperty("ngClass",
|
|
1300
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("status"));
|
|
1017
1301
|
i0.ɵɵadvance(2);
|
|
1018
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1304
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("server"));
|
|
1021
1305
|
i0.ɵɵadvance(2);
|
|
1022
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1308
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("tool"));
|
|
1025
1309
|
i0.ɵɵadvance(2);
|
|
1026
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1312
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("connection"));
|
|
1029
1313
|
i0.ɵɵadvance(2);
|
|
1030
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1316
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("started"));
|
|
1033
1317
|
i0.ɵɵadvance(2);
|
|
1034
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1320
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("duration"));
|
|
1037
1321
|
i0.ɵɵadvance(2);
|
|
1038
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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",
|
|
1324
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getLogSortClass("error"));
|
|
1041
1325
|
i0.ɵɵadvance(2);
|
|
1042
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
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(
|
|
1328
|
+
i0.ɵɵrepeater(ctx_r2.filteredLogs);
|
|
1045
1329
|
} }
|
|
1046
|
-
function
|
|
1047
|
-
i0.ɵɵelementStart(0, "div",
|
|
1048
|
-
i0.ɵɵconditionalCreate(1,
|
|
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
|
|
1335
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
1052
1336
|
i0.ɵɵadvance();
|
|
1053
|
-
i0.ɵɵconditional(
|
|
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
|
|
1056
|
-
i0.ɵɵ
|
|
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
|
-
|
|
1059
|
-
|
|
1060
|
-
i0.ɵɵ
|
|
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
|
|
1063
|
-
|
|
1064
|
-
i0.ɵɵ
|
|
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
|
|
1069
|
-
i0.ɵɵ
|
|
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
|
|
1072
|
-
|
|
1073
|
-
i0.ɵɵ
|
|
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
|
|
1078
|
-
i0.ɵɵ
|
|
2071
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
2072
|
+
i0.ɵɵadvance(4);
|
|
2073
|
+
i0.ɵɵtextInterpolate(ctx_r2.SelectedLog.ErrorMessage);
|
|
1079
2074
|
} }
|
|
1080
|
-
function
|
|
1081
|
-
const
|
|
1082
|
-
i0.ɵɵelementStart(0, "
|
|
1083
|
-
i0.ɵɵlistener("
|
|
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
|
|
1090
|
-
const
|
|
1091
|
-
i0.ɵɵelementStart(0, "
|
|
1092
|
-
i0.ɵɵlistener("
|
|
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
|
|
1096
|
-
i0.ɵɵ
|
|
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
|
-
//
|
|
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
|
-
|
|
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:
|
|
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.
|
|
2105
|
-
|
|
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
|
-
|
|
2568
|
-
i0.ɵɵ
|
|
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",
|
|
2572
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_6_listener() { return ctx.toggleFilterPanel(); });
|
|
2573
|
-
i0.ɵɵelement(7, "i",
|
|
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",
|
|
4332
|
+
i0.ɵɵelementStart(10, "span", 34);
|
|
2577
4333
|
i0.ɵɵtext(11);
|
|
2578
4334
|
i0.ɵɵelementEnd()();
|
|
2579
|
-
i0.ɵɵelementStart(12, "div",
|
|
2580
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_14_listener() { return ctx.setActiveTab("servers"); });
|
|
2581
|
-
i0.ɵɵelement(15, "i",
|
|
2582
|
-
i0.ɵɵelementStart(16, "span",
|
|
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",
|
|
4341
|
+
i0.ɵɵelementStart(18, "span", 40);
|
|
2586
4342
|
i0.ɵɵtext(19);
|
|
2587
4343
|
i0.ɵɵelementEnd()();
|
|
2588
|
-
i0.ɵɵelementStart(20, "button",
|
|
2589
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_20_listener() { return ctx.setActiveTab("connections"); });
|
|
2590
|
-
i0.ɵɵelement(21, "i",
|
|
2591
|
-
i0.ɵɵelementStart(22, "span",
|
|
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",
|
|
4350
|
+
i0.ɵɵelementStart(24, "span", 40);
|
|
2595
4351
|
i0.ɵɵtext(25);
|
|
2596
4352
|
i0.ɵɵelementEnd()();
|
|
2597
|
-
i0.ɵɵelementStart(26, "button",
|
|
2598
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_26_listener() { return ctx.setActiveTab("tools"); });
|
|
2599
|
-
i0.ɵɵelement(27, "i",
|
|
2600
|
-
i0.ɵɵelementStart(28, "span",
|
|
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",
|
|
4359
|
+
i0.ɵɵelementStart(30, "span", 40);
|
|
2604
4360
|
i0.ɵɵtext(31);
|
|
2605
4361
|
i0.ɵɵelementEnd()();
|
|
2606
|
-
i0.ɵɵelementStart(32, "button",
|
|
2607
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_32_listener() { return ctx.setActiveTab("logs"); });
|
|
2608
|
-
i0.ɵɵelement(33, "i",
|
|
2609
|
-
i0.ɵɵelementStart(34, "span",
|
|
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",
|
|
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",
|
|
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",
|
|
2618
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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(
|
|
2623
|
-
i0.ɵɵconditionalCreate(
|
|
2624
|
-
i0.ɵɵelementStart(
|
|
2625
|
-
i0.ɵɵconditionalCreate(
|
|
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(
|
|
2628
|
-
i0.ɵɵconditionalCreate(
|
|
2629
|
-
i0.ɵɵconditionalCreate(
|
|
2630
|
-
i0.ɵɵconditionalCreate(
|
|
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
|
|
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((
|
|
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.ɵɵ
|
|
2661
|
-
i0.ɵɵadvance(
|
|
2662
|
-
i0.ɵɵconditional(ctx.
|
|
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 ?
|
|
4456
|
+
i0.ɵɵconditional(ctx.IsLoading ? 71 : 72);
|
|
2665
4457
|
i0.ɵɵadvance(2);
|
|
2666
|
-
i0.ɵɵconditional(ctx.ShowServerDialog ?
|
|
4458
|
+
i0.ɵɵconditional(ctx.ShowServerDialog ? 73 : -1);
|
|
2667
4459
|
i0.ɵɵadvance();
|
|
2668
|
-
i0.ɵɵconditional(ctx.ShowConnectionDialog ?
|
|
4460
|
+
i0.ɵɵconditional(ctx.ShowConnectionDialog ? 74 : -1);
|
|
2669
4461
|
i0.ɵɵadvance();
|
|
2670
|
-
i0.ɵɵconditional(ctx.ShowTestToolDialog ?
|
|
4462
|
+
i0.ɵɵconditional(ctx.ShowTestToolDialog ? 75 : -1);
|
|
2671
4463
|
i0.ɵɵadvance();
|
|
2672
|
-
i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ?
|
|
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:
|
|
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
|