@memberjunction/ng-dashboards 3.4.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +102 -339
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts +12 -5
  3. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-configuration.component.js +103 -44
  5. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.d.ts +14 -5
  7. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-editor.component.js +149 -211
  9. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  10. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  11. package/dist/AI/components/agents/agent-filter-panel.component.js +4 -4
  12. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  13. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  14. package/dist/AI/components/charts/performance-heatmap.component.js +4 -6
  15. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  17. package/dist/AI/components/charts/time-series-chart.component.js +6 -7
  18. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  19. package/dist/AI/components/execution-monitoring.component.d.ts +0 -4
  20. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  21. package/dist/AI/components/execution-monitoring.component.js +33 -37
  22. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  23. package/dist/AI/components/models/model-management.component.d.ts +3 -6
  24. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  25. package/dist/AI/components/models/model-management.component.js +34 -27
  26. package/dist/AI/components/models/model-management.component.js.map +1 -1
  27. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  28. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +22 -17
  29. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  30. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -1
  31. package/dist/AI/components/prompts/prompt-filter-panel.component.js +4 -4
  32. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  33. package/dist/AI/components/prompts/prompt-management.component.d.ts +3 -6
  34. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  35. package/dist/AI/components/prompts/prompt-management.component.js +34 -32
  36. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  37. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  38. package/dist/AI/components/prompts/prompt-version-control.component.js +33 -28
  39. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  40. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -1
  41. package/dist/AI/components/system/system-config-filter-panel.component.js +4 -4
  42. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  43. package/dist/AI/components/system/system-configuration.component.d.ts +0 -4
  44. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  45. package/dist/AI/components/system/system-configuration.component.js +26 -27
  46. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  47. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  48. package/dist/AI/components/widgets/kpi-card.component.js +52 -42
  49. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  50. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  51. package/dist/AI/components/widgets/live-execution-widget.component.js +7 -7
  52. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  53. package/dist/APIKeys/api-applications-panel.component.d.ts +0 -2
  54. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  55. package/dist/APIKeys/api-applications-panel.component.js +193 -189
  56. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  57. package/dist/APIKeys/api-key-create-dialog.component.d.ts +0 -2
  58. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  59. package/dist/APIKeys/api-key-create-dialog.component.js +175 -180
  60. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  61. package/dist/APIKeys/api-key-edit-panel.component.d.ts +0 -2
  62. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  63. package/dist/APIKeys/api-key-edit-panel.component.js +231 -225
  64. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  65. package/dist/APIKeys/api-key-list.component.d.ts +0 -2
  66. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  67. package/dist/APIKeys/api-key-list.component.js +113 -114
  68. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  69. package/dist/APIKeys/api-keys-resource.component.d.ts +0 -2
  70. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  71. package/dist/APIKeys/api-keys-resource.component.js +294 -302
  72. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  73. package/dist/APIKeys/api-scopes-panel.component.d.ts +0 -2
  74. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  75. package/dist/APIKeys/api-scopes-panel.component.js +151 -155
  76. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  77. package/dist/APIKeys/api-usage-panel.component.d.ts +0 -2
  78. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
  79. package/dist/APIKeys/api-usage-panel.component.js +237 -234
  80. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  81. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  82. package/dist/Actions/components/actions-list-view.component.js +15 -14
  83. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  84. package/dist/Actions/components/actions-overview.component.d.ts +3 -6
  85. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  86. package/dist/Actions/components/actions-overview.component.js +17 -19
  87. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  88. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  89. package/dist/Actions/components/categories-list-view.component.js +6 -6
  90. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  91. package/dist/Actions/components/code-management.component.d.ts +0 -4
  92. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  93. package/dist/Actions/components/code-management.component.js +3 -9
  94. package/dist/Actions/components/code-management.component.js.map +1 -1
  95. package/dist/Actions/components/entity-integration.component.d.ts +0 -4
  96. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  97. package/dist/Actions/components/entity-integration.component.js +3 -9
  98. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  99. package/dist/Actions/components/execution-monitoring.component.d.ts +3 -6
  100. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  101. package/dist/Actions/components/execution-monitoring.component.js +13 -16
  102. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  103. package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -1
  104. package/dist/Actions/components/executions-list-view.component.js +3 -3
  105. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  106. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -1
  107. package/dist/Actions/components/explorer/action-breadcrumb.component.js +6 -6
  108. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -1
  109. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  110. package/dist/Actions/components/explorer/action-card.component.js +11 -10
  111. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  112. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -4
  113. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  114. package/dist/Actions/components/explorer/action-explorer.component.js +10 -14
  115. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  116. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -1
  117. package/dist/Actions/components/explorer/action-list-item.component.js +8 -8
  118. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -1
  120. package/dist/Actions/components/explorer/action-toolbar.component.js +15 -14
  121. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  122. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -1
  123. package/dist/Actions/components/explorer/action-tree-panel.component.js +11 -10
  124. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  125. package/dist/Actions/components/explorer/index.d.ts +0 -1
  126. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  127. package/dist/Actions/components/explorer/index.js +0 -4
  128. package/dist/Actions/components/explorer/index.js.map +1 -1
  129. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  130. package/dist/Actions/components/explorer/new-action-panel.component.js +10 -10
  131. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  132. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  133. package/dist/Actions/components/explorer/new-category-panel.component.js +8 -8
  134. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  135. package/dist/Actions/components/scheduled-actions.component.d.ts +0 -4
  136. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  137. package/dist/Actions/components/scheduled-actions.component.js +3 -9
  138. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  139. package/dist/Actions/components/security-permissions.component.d.ts +0 -4
  140. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  141. package/dist/Actions/components/security-permissions.component.js +3 -9
  142. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  143. package/dist/Actions/index.d.ts +0 -7
  144. package/dist/Actions/index.d.ts.map +1 -1
  145. package/dist/Actions/index.js +0 -8
  146. package/dist/Actions/index.js.map +1 -1
  147. package/dist/Communication/communication-dashboard.component.d.ts +0 -1
  148. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  149. package/dist/Communication/communication-dashboard.component.js +38 -51
  150. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  151. package/dist/Communication/communication-logs-resource.component.d.ts +0 -4
  152. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  153. package/dist/Communication/communication-logs-resource.component.js +112 -108
  154. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  155. package/dist/Communication/communication-monitor-resource.component.d.ts +0 -4
  156. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  157. package/dist/Communication/communication-monitor-resource.component.js +210 -201
  158. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  159. package/dist/Communication/communication-providers-resource.component.d.ts +0 -4
  160. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  161. package/dist/Communication/communication-providers-resource.component.js +136 -124
  162. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  163. package/dist/Communication/communication-runs-resource.component.d.ts +0 -4
  164. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  165. package/dist/Communication/communication-runs-resource.component.js +91 -88
  166. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  167. package/dist/Communication/communication-templates-resource.component.d.ts +0 -4
  168. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  169. package/dist/Communication/communication-templates-resource.component.js +139 -122
  170. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  171. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +0 -4
  172. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  173. package/dist/ComponentStudio/component-studio-dashboard.component.js +21 -20
  174. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  175. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  176. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +11 -12
  177. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  178. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  179. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +25 -22
  180. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  181. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  182. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +16 -16
  183. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  184. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -1
  185. package/dist/ComponentStudio/components/browser/component-browser.component.js +23 -21
  186. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  187. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -1
  188. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +10 -10
  189. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  190. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
  191. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +13 -13
  192. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  193. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -1
  194. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +7 -7
  195. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  196. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -1
  197. package/dist/ComponentStudio/components/editors/spec-editor.component.js +5 -5
  198. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  199. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -1
  200. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +4 -4
  201. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  202. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  203. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +9 -9
  204. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  205. package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -1
  206. package/dist/ComponentStudio/components/text-import-dialog.component.js +4 -4
  207. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  208. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  209. package/dist/ComponentStudio/components/workspace/component-preview.component.js +10 -9
  210. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  211. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  212. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +4 -4
  213. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  214. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +0 -1
  215. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  216. package/dist/Credentials/components/credentials-audit-resource.component.js +200 -196
  217. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  218. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +0 -1
  219. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  220. package/dist/Credentials/components/credentials-categories-resource.component.js +195 -190
  221. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  222. package/dist/Credentials/components/credentials-list-resource.component.d.ts +0 -1
  223. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  224. package/dist/Credentials/components/credentials-list-resource.component.js +251 -240
  225. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  226. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +0 -1
  227. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  228. package/dist/Credentials/components/credentials-overview-resource.component.js +228 -226
  229. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  230. package/dist/Credentials/components/credentials-types-resource.component.d.ts +0 -1
  231. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  232. package/dist/Credentials/components/credentials-types-resource.component.js +214 -210
  233. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  234. package/dist/Credentials/credentials-dashboard.component.d.ts +0 -1
  235. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
  236. package/dist/Credentials/credentials-dashboard.component.js +31 -44
  237. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  238. package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -1
  239. package/dist/Credentials/pipes/group-by.pipe.js +2 -1
  240. package/dist/Credentials/pipes/group-by.pipe.js.map +1 -1
  241. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -1
  242. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  243. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -80
  244. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  245. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  246. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +46 -45
  247. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  248. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -1
  249. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +7 -7
  250. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -1
  251. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  252. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +15 -15
  253. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  254. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  255. package/dist/DataExplorer/components/view-selector/view-selector.component.js +17 -11
  256. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  257. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -4
  258. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  259. package/dist/DataExplorer/data-explorer-dashboard.component.js +83 -64
  260. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  261. package/dist/DataExplorer/data-explorer-resource.component.d.ts +0 -1
  262. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  263. package/dist/DataExplorer/data-explorer-resource.component.js +3 -6
  264. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  265. package/dist/DataExplorer/index.d.ts +2 -2
  266. package/dist/DataExplorer/index.d.ts.map +1 -1
  267. package/dist/DataExplorer/index.js +2 -2
  268. package/dist/DataExplorer/index.js.map +1 -1
  269. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +0 -1
  270. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  271. package/dist/EntityAdmin/entity-admin-dashboard.component.js +6 -7
  272. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  273. package/dist/Home/home-application.d.ts +109 -27
  274. package/dist/Home/home-application.d.ts.map +1 -1
  275. package/dist/Home/home-application.js +351 -75
  276. package/dist/Home/home-application.js.map +1 -1
  277. package/dist/Home/home-dashboard.component.d.ts +48 -12
  278. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  279. package/dist/Home/home-dashboard.component.js +267 -187
  280. package/dist/Home/home-dashboard.component.js.map +1 -1
  281. package/dist/Lists/components/lists-browse-resource.component.d.ts +0 -1
  282. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  283. package/dist/Lists/components/lists-browse-resource.component.js +761 -685
  284. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  285. package/dist/Lists/components/lists-categories-resource.component.d.ts +0 -1
  286. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  287. package/dist/Lists/components/lists-categories-resource.component.js +340 -316
  288. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  289. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +0 -1
  290. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  291. package/dist/Lists/components/lists-my-lists-resource.component.js +530 -482
  292. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  293. package/dist/Lists/components/lists-operations-resource.component.d.ts +0 -1
  294. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  295. package/dist/Lists/components/lists-operations-resource.component.js +508 -455
  296. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  297. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  298. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +44 -39
  299. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  300. package/dist/Lists/index.d.ts +0 -1
  301. package/dist/Lists/index.d.ts.map +1 -1
  302. package/dist/Lists/index.js +0 -11
  303. package/dist/Lists/index.js.map +1 -1
  304. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +0 -4
  305. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  306. package/dist/MCP/components/mcp-connection-dialog.component.js +33 -39
  307. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  308. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +0 -4
  309. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -1
  310. package/dist/MCP/components/mcp-log-detail-panel.component.js +42 -44
  311. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  312. package/dist/MCP/components/mcp-server-dialog.component.d.ts +3 -4
  313. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
  314. package/dist/MCP/components/mcp-server-dialog.component.js +186 -77
  315. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  316. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +0 -4
  317. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  318. package/dist/MCP/components/mcp-test-tool-dialog.component.js +187 -187
  319. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  320. package/dist/MCP/index.d.ts +5 -5
  321. package/dist/MCP/index.d.ts.map +1 -1
  322. package/dist/MCP/index.js +5 -5
  323. package/dist/MCP/index.js.map +1 -1
  324. package/dist/MCP/mcp-dashboard.component.d.ts +65 -7
  325. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  326. package/dist/MCP/mcp-dashboard.component.js +976 -697
  327. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  328. package/dist/MCP/mcp-filter-panel.component.d.ts +54 -0
  329. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -0
  330. package/dist/MCP/mcp-filter-panel.component.js +288 -0
  331. package/dist/MCP/mcp-filter-panel.component.js.map +1 -0
  332. package/dist/MCP/mcp-resource.component.d.ts +11 -5
  333. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  334. package/dist/MCP/mcp-resource.component.js +8 -9
  335. package/dist/MCP/mcp-resource.component.js.map +1 -1
  336. package/dist/MCP/mcp.module.d.ts +16 -19
  337. package/dist/MCP/mcp.module.d.ts.map +1 -1
  338. package/dist/MCP/mcp.module.js +17 -26
  339. package/dist/MCP/mcp.module.js.map +1 -1
  340. package/dist/MCP/services/mcp-tools.service.d.ts +10 -4
  341. package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -1
  342. package/dist/MCP/services/mcp-tools.service.js +5 -6
  343. package/dist/MCP/services/mcp-tools.service.js.map +1 -1
  344. package/dist/QueryBrowser/query-browser-resource.component.d.ts +0 -1
  345. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  346. package/dist/QueryBrowser/query-browser-resource.component.js +79 -88
  347. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  348. package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -1
  349. package/dist/Scheduling/components/job-slideout.component.js +117 -116
  350. package/dist/Scheduling/components/job-slideout.component.js.map +1 -1
  351. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +0 -4
  352. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  353. package/dist/Scheduling/components/scheduling-activity-resource.component.js +3 -9
  354. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  355. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  356. package/dist/Scheduling/components/scheduling-activity.component.js +134 -134
  357. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  358. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +0 -4
  359. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  360. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -9
  361. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  362. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  363. package/dist/Scheduling/components/scheduling-jobs.component.js +102 -97
  364. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  365. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +0 -4
  366. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  367. package/dist/Scheduling/components/scheduling-overview-resource.component.js +3 -9
  368. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  369. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  370. package/dist/Scheduling/components/scheduling-overview.component.js +127 -122
  371. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  372. package/dist/Scheduling/scheduling-dashboard.component.d.ts +0 -1
  373. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  374. package/dist/Scheduling/scheduling-dashboard.component.js +35 -43
  375. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  376. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +0 -4
  377. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  378. package/dist/SystemDiagnostics/system-diagnostics.component.js +1552 -1534
  379. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  380. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  381. package/dist/Testing/components/testing-analytics-resource.component.js +3 -3
  382. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  383. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  384. package/dist/Testing/components/testing-analytics.component.js +30 -30
  385. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  386. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  387. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +3 -3
  388. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  389. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  390. package/dist/Testing/components/testing-dashboard-tab.component.js +7 -7
  391. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  392. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  393. package/dist/Testing/components/testing-explorer-resource.component.js +3 -3
  394. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  395. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  396. package/dist/Testing/components/testing-explorer.component.js +42 -35
  397. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  398. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  399. package/dist/Testing/components/testing-review-resource.component.js +3 -3
  400. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  401. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  402. package/dist/Testing/components/testing-review.component.js +16 -16
  403. package/dist/Testing/components/testing-review.component.js.map +1 -1
  404. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  405. package/dist/Testing/components/testing-runs-resource.component.js +3 -3
  406. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  407. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  408. package/dist/Testing/components/testing-runs.component.js +15 -15
  409. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  410. package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -1
  411. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +73 -61
  412. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  413. package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -1
  414. package/dist/Testing/components/widgets/suite-tree.component.js +34 -31
  415. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  416. package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -1
  417. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +180 -171
  418. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  419. package/dist/Testing/testing-dashboard.component.d.ts +0 -1
  420. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  421. package/dist/Testing/testing-dashboard.component.js +9 -8
  422. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  423. package/dist/VersionHistory/components/diff-resource.component.d.ts +119 -0
  424. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -0
  425. package/dist/VersionHistory/components/diff-resource.component.js +1162 -0
  426. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -0
  427. package/dist/VersionHistory/components/graph-resource.component.d.ts +67 -0
  428. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -0
  429. package/dist/VersionHistory/components/graph-resource.component.js +521 -0
  430. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -0
  431. package/dist/VersionHistory/components/index.d.ts +5 -0
  432. package/dist/VersionHistory/components/index.d.ts.map +1 -0
  433. package/dist/VersionHistory/components/index.js +5 -0
  434. package/dist/VersionHistory/components/index.js.map +1 -0
  435. package/dist/VersionHistory/components/labels-resource.component.d.ts +89 -0
  436. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -0
  437. package/dist/VersionHistory/components/labels-resource.component.js +968 -0
  438. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -0
  439. package/dist/VersionHistory/components/restore-resource.component.d.ts +40 -0
  440. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -0
  441. package/dist/VersionHistory/components/restore-resource.component.js +472 -0
  442. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -0
  443. package/dist/VersionHistory/index.d.ts +2 -0
  444. package/dist/VersionHistory/index.d.ts.map +1 -0
  445. package/dist/VersionHistory/index.js +2 -0
  446. package/dist/VersionHistory/index.js.map +1 -0
  447. package/dist/module.d.ts +42 -36
  448. package/dist/module.d.ts.map +1 -1
  449. package/dist/module.js +41 -7
  450. package/dist/module.js.map +1 -1
  451. package/dist/public-api.d.ts +20 -19
  452. package/dist/public-api.d.ts.map +1 -1
  453. package/dist/public-api.js +22 -120
  454. package/dist/public-api.js.map +1 -1
  455. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  456. package/dist/shared/pipes/highlight-search.pipe.js +2 -1
  457. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  458. package/package.json +64 -62
@@ -18,7 +18,7 @@ import { Component } from '@angular/core';
18
18
  import { NavigationEnd } from '@angular/router';
19
19
  import { Subject, BehaviorSubject } from 'rxjs';
20
20
  import { takeUntil, debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
21
- import { RunView, Metadata, CompositeKey } from '@memberjunction/core';
21
+ import { RunView, Metadata } from '@memberjunction/core';
22
22
  import { BaseDashboard } from '@memberjunction/ng-shared';
23
23
  import { MCPEngine, UserInfoEngine } from '@memberjunction/core-entities';
24
24
  import { RegisterClass } from '@memberjunction/global';
@@ -28,200 +28,107 @@ import * as i2 from "@memberjunction/ng-shared";
28
28
  import * as i3 from "./services/mcp-tools.service";
29
29
  const _forTrack0 = ($index, $item) => $item.ID;
30
30
  const _forTrack1 = ($index, $item) => $item.server.ID;
31
- function MCPDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "div", 17)(1, "span", 15);
33
- i0.ɵɵtext(2, "Failed (7d)");
34
- i0.ɵɵelementEnd();
35
- i0.ɵɵelementStart(3, "span", 16);
36
- i0.ɵɵtext(4);
37
- i0.ɵɵelementEnd()();
38
- } if (rf & 2) {
39
- const ctx_r0 = i0.ɵɵnextContext();
40
- i0.ɵɵadvance(4);
41
- i0.ɵɵtextInterpolate(ctx_r0.stats.failedExecutions);
42
- } }
43
- function MCPDashboardComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
44
- const _r2 = i0.ɵɵgetCurrentView();
45
- i0.ɵɵelementStart(0, "div", 22);
46
- i0.ɵɵelement(1, "i", 36);
47
- i0.ɵɵtext(2);
48
- i0.ɵɵelementStart(3, "button", 37);
49
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_52_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ErrorMessage = null); });
50
- i0.ɵɵelement(4, "i", 38);
51
- i0.ɵɵelementEnd()();
52
- } if (rf & 2) {
53
- const ctx_r0 = i0.ɵɵnextContext();
54
- i0.ɵɵadvance(2);
55
- i0.ɵɵtextInterpolate1(" ", ctx_r0.ErrorMessage, " ");
31
+ function MCPDashboardComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵtext(0, " Hide Filters ");
56
33
  } }
57
- function MCPDashboardComponent_Case_55_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵtext(0, " MCP Servers ");
34
+ function MCPDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵtext(0, " Show Filters ");
59
36
  } }
60
- function MCPDashboardComponent_Case_56_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵtext(0, " Server Connections ");
62
- } }
63
- function MCPDashboardComponent_Case_57_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵtext(0, " Available Tools ");
65
- } }
66
- function MCPDashboardComponent_Case_58_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵtext(0, " Execution Logs ");
37
+ function MCPDashboardComponent_Case_38_Template(rf, ctx) { if (rf & 1) {
38
+ const _r1 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "button", 31);
40
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createServer()); });
41
+ i0.ɵɵelement(1, "i", 32);
42
+ i0.ɵɵtext(2, " Add Server ");
43
+ i0.ɵɵelementEnd();
68
44
  } }
69
- function MCPDashboardComponent_Case_64_Template(rf, ctx) { if (rf & 1) {
45
+ function MCPDashboardComponent_Case_39_Template(rf, ctx) { if (rf & 1) {
70
46
  const _r3 = i0.ɵɵgetCurrentView();
71
- i0.ɵɵelementStart(0, "select", 39);
72
- i0.ɵɵpipe(1, "async");
73
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_64_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStatusFilterChange("server", $event)); });
74
- i0.ɵɵelementStart(2, "option", 40);
75
- i0.ɵɵtext(3, "All Status");
76
- i0.ɵɵelementEnd();
77
- i0.ɵɵelementStart(4, "option", 41);
78
- i0.ɵɵtext(5, "Active");
79
- i0.ɵɵelementEnd();
80
- i0.ɵɵelementStart(6, "option", 42);
81
- i0.ɵɵtext(7, "Inactive");
82
- i0.ɵɵelementEnd()();
83
- i0.ɵɵelementStart(8, "button", 43);
84
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_64_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createServer()); });
85
- i0.ɵɵelement(9, "i", 44);
86
- i0.ɵɵtext(10, " Add Server ");
47
+ i0.ɵɵelementStart(0, "button", 31);
48
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createConnection()); });
49
+ i0.ɵɵelement(1, "i", 32);
50
+ i0.ɵɵtext(2, " Add Connection ");
87
51
  i0.ɵɵelementEnd();
88
- } if (rf & 2) {
89
- let tmp_1_0;
90
- const ctx_r0 = i0.ɵɵnextContext();
91
- i0.ɵɵproperty("ngModel", (tmp_1_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_1_0.serverStatus);
92
52
  } }
93
- function MCPDashboardComponent_Case_65_Template(rf, ctx) { if (rf & 1) {
53
+ function MCPDashboardComponent_Case_40_Template(rf, ctx) { if (rf & 1) {
94
54
  const _r4 = i0.ɵɵgetCurrentView();
95
- i0.ɵɵelementStart(0, "select", 39);
96
- i0.ɵɵpipe(1, "async");
97
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_65_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStatusFilterChange("connection", $event)); });
98
- i0.ɵɵelementStart(2, "option", 40);
99
- i0.ɵɵtext(3, "All Status");
100
- i0.ɵɵelementEnd();
101
- i0.ɵɵelementStart(4, "option", 41);
102
- i0.ɵɵtext(5, "Active");
103
- i0.ɵɵelementEnd();
104
- i0.ɵɵelementStart(6, "option", 42);
105
- i0.ɵɵtext(7, "Inactive");
55
+ i0.ɵɵelementStart(0, "div", 33)(1, "button", 34);
56
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("card")); });
57
+ i0.ɵɵelement(2, "i", 35);
106
58
  i0.ɵɵelementEnd();
107
- i0.ɵɵelementStart(8, "option", 45);
108
- i0.ɵɵtext(9, "Error");
59
+ i0.ɵɵelementStart(3, "button", 36);
60
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("list")); });
61
+ i0.ɵɵelement(4, "i", 37);
109
62
  i0.ɵɵelementEnd()();
110
- i0.ɵɵelementStart(10, "button", 43);
111
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_65_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createConnection()); });
112
- i0.ɵɵelement(11, "i", 44);
113
- i0.ɵɵtext(12, " Add Connection ");
63
+ i0.ɵɵelementStart(5, "button", 31);
64
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTestToolDialog()); });
65
+ i0.ɵɵelement(6, "i", 38);
66
+ i0.ɵɵtext(7, " Test Tool ");
114
67
  i0.ɵɵelementEnd();
115
68
  } if (rf & 2) {
116
- let tmp_1_0;
117
- const ctx_r0 = i0.ɵɵnextContext();
118
- i0.ɵɵproperty("ngModel", (tmp_1_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_1_0.connectionStatus);
69
+ const ctx_r1 = i0.ɵɵnextContext();
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "card");
72
+ i0.ɵɵadvance(2);
73
+ i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "list");
119
74
  } }
120
- function MCPDashboardComponent_Case_66_Template(rf, ctx) { if (rf & 1) {
75
+ function MCPDashboardComponent_Case_41_Template(rf, ctx) { if (rf & 1) {
121
76
  const _r5 = i0.ɵɵgetCurrentView();
122
- i0.ɵɵelementStart(0, "select", 39);
123
- i0.ɵɵpipe(1, "async");
124
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_66_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStatusFilterChange("tool", $event)); });
125
- i0.ɵɵelementStart(2, "option", 40);
126
- i0.ɵɵtext(3, "All Status");
127
- i0.ɵɵelementEnd();
128
- i0.ɵɵelementStart(4, "option", 41);
129
- i0.ɵɵtext(5, "Active");
130
- i0.ɵɵelementEnd();
131
- i0.ɵɵelementStart(6, "option", 46);
132
- i0.ɵɵtext(7, "Deprecated");
133
- i0.ɵɵelementEnd()();
134
- i0.ɵɵelementStart(8, "div", 47)(9, "button", 48);
135
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsViewMode("card")); });
136
- i0.ɵɵelement(10, "i", 49);
137
- i0.ɵɵelementEnd();
138
- i0.ɵɵelementStart(11, "button", 50);
139
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsViewMode("list")); });
140
- i0.ɵɵelement(12, "i", 51);
141
- i0.ɵɵelementEnd()();
142
- i0.ɵɵelementStart(13, "select", 39);
143
- i0.ɵɵtwoWayListener("ngModelChange", function MCPDashboardComponent_Case_66_Template_select_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.ToolsSortBy, $event) || (ctx_r0.ToolsSortBy = $event); return i0.ɵɵresetView($event); });
144
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_66_Template_select_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsSort($event)); });
145
- i0.ɵɵelementStart(14, "option", 52);
146
- i0.ɵɵtext(15, "Sort by Server");
147
- i0.ɵɵelementEnd();
148
- i0.ɵɵelementStart(16, "option", 53);
149
- i0.ɵɵtext(17, "Sort by Name");
150
- i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(18, "option", 54);
152
- i0.ɵɵtext(19, "Sort by Discovered");
153
- i0.ɵɵelementEnd();
154
- i0.ɵɵelementStart(20, "option", 55);
155
- i0.ɵɵtext(21, "Sort by Last Seen");
156
- i0.ɵɵelementEnd()();
157
- i0.ɵɵelementStart(22, "button", 43);
158
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.openTestToolDialog()); });
159
- i0.ɵɵelement(23, "i", 56);
160
- i0.ɵɵtext(24, " Test Tool ");
77
+ i0.ɵɵelementStart(0, "button", 39);
78
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_41_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadAllData()); });
79
+ i0.ɵɵelement(1, "i", 40);
80
+ i0.ɵɵtext(2, " Refresh ");
161
81
  i0.ɵɵelementEnd();
162
82
  } if (rf & 2) {
163
- let tmp_1_0;
164
- const ctx_r0 = i0.ɵɵnextContext();
165
- i0.ɵɵproperty("ngModel", (tmp_1_0 = i0.ɵɵpipeBind1(1, 6, ctx_r0.filters$)) == null ? null : tmp_1_0.toolStatus);
166
- i0.ɵɵadvance(9);
167
- i0.ɵɵclassProp("active", ctx_r0.ToolsViewMode === "card");
168
- i0.ɵɵadvance(2);
169
- i0.ɵɵclassProp("active", ctx_r0.ToolsViewMode === "list");
170
- i0.ɵɵadvance(2);
171
- i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ToolsSortBy);
83
+ const ctx_r1 = i0.ɵɵnextContext();
84
+ i0.ɵɵproperty("disabled", ctx_r1.IsLoading);
85
+ i0.ɵɵadvance();
86
+ i0.ɵɵclassProp("fa-spin", ctx_r1.IsLoading);
172
87
  } }
173
- function MCPDashboardComponent_Case_67_Template(rf, ctx) { if (rf & 1) {
88
+ function MCPDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
174
89
  const _r6 = i0.ɵɵgetCurrentView();
175
- i0.ɵɵelementStart(0, "select", 39);
176
- i0.ɵɵpipe(1, "async");
177
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_67_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStatusFilterChange("log", $event)); });
178
- i0.ɵɵelementStart(2, "option", 40);
179
- i0.ɵɵtext(3, "All Status");
180
- i0.ɵɵelementEnd();
181
- i0.ɵɵelementStart(4, "option", 57);
182
- i0.ɵɵtext(5, "Success");
183
- i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(6, "option", 45);
185
- i0.ɵɵtext(7, "Error");
186
- i0.ɵɵelementEnd();
187
- i0.ɵɵelementStart(8, "option", 58);
188
- i0.ɵɵtext(9, "Running");
90
+ i0.ɵɵelementStart(0, "div", 24);
91
+ i0.ɵɵelement(1, "i", 41);
92
+ i0.ɵɵtext(2);
93
+ i0.ɵɵelementStart(3, "button", 42);
94
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_47_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ErrorMessage = null); });
95
+ i0.ɵɵelement(4, "i", 43);
189
96
  i0.ɵɵelementEnd()();
190
97
  } if (rf & 2) {
191
- let tmp_1_0;
192
- const ctx_r0 = i0.ɵɵnextContext();
193
- i0.ɵɵproperty("ngModel", (tmp_1_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_1_0.logStatus);
98
+ const ctx_r1 = i0.ɵɵnextContext();
99
+ i0.ɵɵadvance(2);
100
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage, " ");
194
101
  } }
195
- function MCPDashboardComponent_Conditional_69_Template(rf, ctx) { if (rf & 1) {
196
- i0.ɵɵelement(0, "mj-loading", 31);
102
+ function MCPDashboardComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
103
+ i0.ɵɵelement(0, "mj-loading", 26);
197
104
  } }
198
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
105
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
199
106
  const _r7 = i0.ɵɵgetCurrentView();
200
- i0.ɵɵelementStart(0, "div", 62);
201
- i0.ɵɵelement(1, "i", 7);
107
+ i0.ɵɵelementStart(0, "div", 47);
108
+ i0.ɵɵelement(1, "i", 11);
202
109
  i0.ɵɵelementStart(2, "p");
203
110
  i0.ɵɵtext(3, "No MCP servers configured");
204
111
  i0.ɵɵelementEnd();
205
- i0.ɵɵelementStart(4, "button", 43);
206
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createServer()); });
112
+ i0.ɵɵelementStart(4, "button", 31);
113
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createServer()); });
207
114
  i0.ɵɵtext(5, " Add Your First Server ");
208
115
  i0.ɵɵelementEnd()();
209
116
  } }
210
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
211
- i0.ɵɵelement(0, "p", 76);
117
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
118
+ i0.ɵɵelement(0, "p", 61);
212
119
  i0.ɵɵpipe(1, "async");
213
120
  i0.ɵɵpipe(2, "highlightSearch");
214
121
  } if (rf & 2) {
215
122
  let tmp_14_0;
216
123
  const server_r9 = i0.ɵɵnextContext().$implicit;
217
- const ctx_r0 = i0.ɵɵnextContext(4);
218
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, server_r9.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
124
+ const ctx_r1 = i0.ɵɵnextContext(4);
125
+ 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);
219
126
  } }
220
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
221
- i0.ɵɵelementStart(0, "div", 81)(1, "span", 79);
127
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
128
+ i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
222
129
  i0.ɵɵtext(2, "URL");
223
130
  i0.ɵɵelementEnd();
224
- i0.ɵɵelementStart(3, "span", 83);
131
+ i0.ɵɵelementStart(3, "span", 68);
225
132
  i0.ɵɵtext(4);
226
133
  i0.ɵɵelementEnd()();
227
134
  } if (rf & 2) {
@@ -229,11 +136,11 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditi
229
136
  i0.ɵɵadvance(4);
230
137
  i0.ɵɵtextInterpolate(server_r9.ServerURL);
231
138
  } }
232
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_39_Template(rf, ctx) { if (rf & 1) {
233
- i0.ɵɵelementStart(0, "div", 81)(1, "span", 79);
139
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
234
141
  i0.ɵɵtext(2, "Command");
235
142
  i0.ɵɵelementEnd();
236
- i0.ɵɵelementStart(3, "span", 84);
143
+ i0.ɵɵelementStart(3, "span", 69);
237
144
  i0.ɵɵtext(4);
238
145
  i0.ɵɵelementEnd()();
239
146
  } if (rf & 2) {
@@ -241,128 +148,129 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditi
241
148
  i0.ɵɵadvance(4);
242
149
  i0.ɵɵtextInterpolate(server_r9.Command);
243
150
  } }
244
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template(rf, ctx) { if (rf & 1) {
245
- i0.ɵɵelementStart(0, "div", 86);
246
- i0.ɵɵelement(1, "i", 88);
151
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelementStart(0, "div", 71);
153
+ i0.ɵɵelement(1, "i", 73);
247
154
  i0.ɵɵtext(2, " No tools discovered yet. Sync a connection to discover tools. ");
248
155
  i0.ɵɵelementEnd();
249
156
  } }
250
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
157
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
251
158
  const _r10 = i0.ɵɵgetCurrentView();
252
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "span", 91);
159
+ i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
253
160
  i0.ɵɵtext(3);
254
161
  i0.ɵɵelementEnd();
255
- i0.ɵɵelementStart(4, "span", 92);
256
- i0.ɵɵelement(5, "i", 93);
162
+ i0.ɵɵelementStart(4, "span", 77);
163
+ i0.ɵɵelement(5, "i", 78);
257
164
  i0.ɵɵtext(6);
258
165
  i0.ɵɵelementEnd()();
259
- i0.ɵɵelementStart(7, "button", 94);
260
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); ctx_r0.runToolFromCard(tool_r11); return i0.ɵɵresetView($event.stopPropagation()); });
261
- i0.ɵɵelement(8, "i", 56);
166
+ i0.ɵɵelementStart(7, "button", 79);
167
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); ctx_r1.runToolFromCard(tool_r11); return i0.ɵɵresetView($event.stopPropagation()); });
168
+ i0.ɵɵelement(8, "i", 38);
262
169
  i0.ɵɵelementEnd()();
263
170
  } if (rf & 2) {
264
171
  const tool_r11 = ctx.$implicit;
265
- const ctx_r0 = i0.ɵɵnextContext(7);
172
+ const ctx_r1 = i0.ɵɵnextContext(7);
266
173
  i0.ɵɵadvance(3);
267
174
  i0.ɵɵtextInterpolate(tool_r11.ToolTitle || tool_r11.ToolName);
268
175
  i0.ɵɵadvance(3);
269
- i0.ɵɵtextInterpolate1(" ", ctx_r0.getParamCount(tool_r11), " params ");
176
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r11), " params ");
270
177
  } }
271
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template(rf, ctx) { if (rf & 1) {
272
- i0.ɵɵelementStart(0, "div", 87);
273
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template, 9, 2, "div", 89, _forTrack0);
178
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template(rf, ctx) { if (rf & 1) {
179
+ i0.ɵɵelementStart(0, "div", 72);
180
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
274
181
  i0.ɵɵelementEnd();
275
182
  } if (rf & 2) {
276
183
  const server_r9 = i0.ɵɵnextContext(2).$implicit;
277
- const ctx_r0 = i0.ɵɵnextContext(4);
184
+ const ctx_r1 = i0.ɵɵnextContext(4);
278
185
  i0.ɵɵadvance();
279
- i0.ɵɵrepeater(ctx_r0.getToolsForServer(server_r9.ID));
186
+ i0.ɵɵrepeater(ctx_r1.getToolsForServer(server_r9.ID));
280
187
  } }
281
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
282
- i0.ɵɵelementStart(0, "div", 82)(1, "div", 85);
283
- i0.ɵɵelement(2, "i", 11);
188
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
190
+ i0.ɵɵelement(2, "i", 15);
284
191
  i0.ɵɵelementStart(3, "span");
285
192
  i0.ɵɵtext(4);
286
193
  i0.ɵɵelementEnd()();
287
- i0.ɵɵtemplate(5, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template, 3, 0, "div", 86)(6, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template, 3, 0, "div", 87);
194
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template, 3, 0, "div", 72);
288
195
  i0.ɵɵelementEnd();
289
196
  } if (rf & 2) {
290
197
  const server_r9 = i0.ɵɵnextContext().$implicit;
291
- const ctx_r0 = i0.ɵɵnextContext(4);
198
+ const ctx_r1 = i0.ɵɵnextContext(4);
292
199
  i0.ɵɵadvance(4);
293
- i0.ɵɵtextInterpolate1("Available Tools (", ctx_r0.getToolsForServer(server_r9.ID).length, ")");
200
+ i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForServer(server_r9.ID).length, ")");
294
201
  i0.ɵɵadvance();
295
- i0.ɵɵconditional(ctx_r0.getToolsForServer(server_r9.ID).length === 0 ? 5 : 6);
202
+ i0.ɵɵconditional(ctx_r1.getToolsForServer(server_r9.ID).length === 0 ? 5 : 6);
296
203
  } }
297
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
204
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
298
205
  const _r8 = i0.ɵɵgetCurrentView();
299
- i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
300
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleServerExpand(server_r9)); });
301
- i0.ɵɵelementStart(2, "div", 66);
302
- i0.ɵɵelement(3, "i", 67)(4, "i")(5, "span", 68);
206
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
207
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerExpand(server_r9)); });
208
+ i0.ɵɵelementStart(2, "div", 51);
209
+ i0.ɵɵelement(3, "i", 52)(4, "i")(5, "span", 53);
303
210
  i0.ɵɵpipe(6, "async");
304
211
  i0.ɵɵpipe(7, "highlightSearch");
305
- i0.ɵɵelementStart(8, "span", 69);
212
+ i0.ɵɵelementStart(8, "span", 54);
306
213
  i0.ɵɵtext(9);
307
214
  i0.ɵɵelementEnd()();
308
- i0.ɵɵelementStart(10, "div", 70);
309
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
310
- i0.ɵɵelementStart(11, "button", 71);
311
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template_button_click_11_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.editServer(server_r9)); });
312
- i0.ɵɵelement(12, "i", 72);
313
- i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(13, "button", 73);
315
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template_button_click_13_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.deleteServer(server_r9)); });
316
- i0.ɵɵelement(14, "i", 74);
215
+ i0.ɵɵelementStart(10, "div", 55);
216
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
217
+ i0.ɵɵelementStart(11, "button", 56);
218
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_11_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editServer(server_r9)); });
219
+ i0.ɵɵelement(12, "i", 57);
220
+ i0.ɵɵelementEnd();
221
+ i0.ɵɵelementStart(13, "button", 58);
222
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_13_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteServer(server_r9)); });
223
+ i0.ɵɵelement(14, "i", 59);
317
224
  i0.ɵɵelementEnd()()();
318
- i0.ɵɵelementStart(15, "div", 75);
319
- i0.ɵɵtemplate(16, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_16_Template, 3, 6, "p", 76);
320
- i0.ɵɵelementStart(17, "div", 77)(18, "div", 78)(19, "span", 79);
225
+ i0.ɵɵelementStart(15, "div", 60);
226
+ i0.ɵɵconditionalCreate(16, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template, 3, 6, "p", 61);
227
+ i0.ɵɵelementStart(17, "div", 62)(18, "div", 63)(19, "span", 64);
321
228
  i0.ɵɵtext(20, "Transport");
322
229
  i0.ɵɵelementEnd();
323
- i0.ɵɵelementStart(21, "span", 80);
230
+ i0.ɵɵelementStart(21, "span", 65);
324
231
  i0.ɵɵtext(22);
325
232
  i0.ɵɵelementEnd()();
326
- i0.ɵɵelementStart(23, "div", 78)(24, "span", 79);
233
+ i0.ɵɵelementStart(23, "div", 63)(24, "span", 64);
327
234
  i0.ɵɵtext(25, "Auth");
328
235
  i0.ɵɵelementEnd();
329
- i0.ɵɵelementStart(26, "span", 80);
236
+ i0.ɵɵelementStart(26, "span", 65);
330
237
  i0.ɵɵtext(27);
331
238
  i0.ɵɵelementEnd()();
332
- i0.ɵɵelementStart(28, "div", 78)(29, "span", 79);
239
+ i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
333
240
  i0.ɵɵtext(30, "Connections");
334
241
  i0.ɵɵelementEnd();
335
- i0.ɵɵelementStart(31, "span", 80);
242
+ i0.ɵɵelementStart(31, "span", 65);
336
243
  i0.ɵɵtext(32);
337
244
  i0.ɵɵelementEnd()();
338
- i0.ɵɵelementStart(33, "div", 78)(34, "span", 79);
245
+ i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
339
246
  i0.ɵɵtext(35, "Tools");
340
247
  i0.ɵɵelementEnd();
341
- i0.ɵɵelementStart(36, "span", 80);
248
+ i0.ɵɵelementStart(36, "span", 65);
342
249
  i0.ɵɵtext(37);
343
250
  i0.ɵɵelementEnd()();
344
- i0.ɵɵtemplate(38, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 81)(39, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_39_Template, 5, 1, "div", 81);
345
- i0.ɵɵelementStart(40, "div", 78)(41, "span", 79);
251
+ i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 66);
252
+ i0.ɵɵconditionalCreate(39, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template, 5, 1, "div", 66);
253
+ i0.ɵɵelementStart(40, "div", 63)(41, "span", 64);
346
254
  i0.ɵɵtext(42, "Last Sync");
347
255
  i0.ɵɵelementEnd();
348
- i0.ɵɵelementStart(43, "span", 80);
256
+ i0.ɵɵelementStart(43, "span", 65);
349
257
  i0.ɵɵtext(44);
350
258
  i0.ɵɵelementEnd()()()();
351
- i0.ɵɵtemplate(45, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditional_45_Template, 7, 2, "div", 82);
259
+ i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template, 7, 2, "div", 67);
352
260
  i0.ɵɵelementEnd();
353
261
  } if (rf & 2) {
354
262
  let tmp_16_0;
355
263
  const server_r9 = ctx.$implicit;
356
- const ctx_r0 = i0.ɵɵnextContext(4);
357
- i0.ɵɵclassProp("expanded", ctx_r0.isServerExpanded(server_r9));
264
+ const ctx_r1 = i0.ɵɵnextContext(4);
265
+ i0.ɵɵclassProp("expanded", ctx_r1.isServerExpanded(server_r9));
358
266
  i0.ɵɵadvance(3);
359
- i0.ɵɵclassProp("rotated", ctx_r0.isServerExpanded(server_r9));
267
+ i0.ɵɵclassProp("rotated", ctx_r1.isServerExpanded(server_r9));
360
268
  i0.ɵɵadvance();
361
- i0.ɵɵclassMap(ctx_r0.getTransportIcon(server_r9.TransportType));
269
+ i0.ɵɵclassMap(ctx_r1.getTransportIcon(server_r9.TransportType));
362
270
  i0.ɵɵadvance();
363
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, server_r9.Name, (tmp_16_0 = i0.ɵɵpipeBind1(6, 18, ctx_r0.filters$)) == null ? null : tmp_16_0.searchTerm), i0.ɵɵsanitizeHtml);
271
+ i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, server_r9.Name, (tmp_16_0 = i0.ɵɵpipeBind1(6, 18, ctx_r1.filters$)) == null ? null : tmp_16_0.searchTerm), i0.ɵɵsanitizeHtml);
364
272
  i0.ɵɵadvance(3);
365
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(server_r9.Status));
273
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(server_r9.Status));
366
274
  i0.ɵɵadvance();
367
275
  i0.ɵɵtextInterpolate1(" ", server_r9.Status, " ");
368
276
  i0.ɵɵadvance(7);
@@ -380,108 +288,108 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Templat
380
288
  i0.ɵɵadvance();
381
289
  i0.ɵɵconditional(server_r9.Command ? 39 : -1);
382
290
  i0.ɵɵadvance(5);
383
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(server_r9.LastSyncAt));
291
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(server_r9.LastSyncAt));
384
292
  i0.ɵɵadvance();
385
- i0.ɵɵconditional(ctx_r0.isServerExpanded(server_r9) ? 45 : -1);
293
+ i0.ɵɵconditional(ctx_r1.isServerExpanded(server_r9) ? 45 : -1);
386
294
  } }
387
- function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
388
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Template, 46, 23, "div", 63, _forTrack0);
295
+ function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
296
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template, 46, 23, "div", 48, _forTrack0);
389
297
  } if (rf & 2) {
390
- const ctx_r0 = i0.ɵɵnextContext(3);
391
- i0.ɵɵrepeater(ctx_r0.filteredServers);
298
+ const ctx_r1 = i0.ɵɵnextContext(3);
299
+ i0.ɵɵrepeater(ctx_r1.filteredServers);
392
300
  } }
393
- function MCPDashboardComponent_Conditional_70_Case_0_Template(rf, ctx) { if (rf & 1) {
394
- i0.ɵɵelementStart(0, "div", 59);
395
- i0.ɵɵtemplate(1, MCPDashboardComponent_Conditional_70_Case_0_Conditional_1_Template, 6, 0, "div", 62)(2, MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_Template, 2, 0);
301
+ function MCPDashboardComponent_Conditional_50_Case_0_Template(rf, ctx) { if (rf & 1) {
302
+ i0.ɵɵelementStart(0, "div", 44);
303
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template, 2, 0);
396
304
  i0.ɵɵelementEnd();
397
305
  } if (rf & 2) {
398
- const ctx_r0 = i0.ɵɵnextContext(2);
306
+ const ctx_r1 = i0.ɵɵnextContext(2);
399
307
  i0.ɵɵadvance();
400
- i0.ɵɵconditional(ctx_r0.filteredServers.length === 0 ? 1 : 2);
308
+ i0.ɵɵconditional(ctx_r1.filteredServers.length === 0 ? 1 : 2);
401
309
  } }
402
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
310
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
403
311
  const _r12 = i0.ɵɵgetCurrentView();
404
- i0.ɵɵelementStart(0, "div", 62);
405
- i0.ɵɵelement(1, "i", 10);
312
+ i0.ɵɵelementStart(0, "div", 47);
313
+ i0.ɵɵelement(1, "i", 14);
406
314
  i0.ɵɵelementStart(2, "p");
407
315
  i0.ɵɵtext(3, "No connections configured");
408
316
  i0.ɵɵelementEnd();
409
- i0.ɵɵelementStart(4, "button", 43);
410
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createConnection()); });
317
+ i0.ɵɵelementStart(4, "button", 31);
318
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createConnection()); });
411
319
  i0.ɵɵtext(5, " Add Your First Connection ");
412
320
  i0.ɵɵelementEnd()();
413
321
  } }
414
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
415
- i0.ɵɵelement(0, "i", 96);
322
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
323
+ i0.ɵɵelement(0, "i", 81);
416
324
  } }
417
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
418
- i0.ɵɵelement(0, "i", 20);
325
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
326
+ i0.ɵɵelement(0, "i", 40);
419
327
  } }
420
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
421
- i0.ɵɵelementStart(0, "div", 97);
422
- i0.ɵɵelement(1, "i", 100);
423
- i0.ɵɵelementStart(2, "span", 101);
328
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
329
+ i0.ɵɵelementStart(0, "div", 82);
330
+ i0.ɵɵelement(1, "i", 85);
331
+ i0.ɵɵelementStart(2, "span", 86);
424
332
  i0.ɵɵtext(3);
425
333
  i0.ɵɵelementEnd()();
426
334
  } if (rf & 2) {
427
335
  const conn_r14 = i0.ɵɵnextContext().$implicit;
428
- const ctx_r0 = i0.ɵɵnextContext(4);
336
+ const ctx_r1 = i0.ɵɵnextContext(4);
429
337
  i0.ɵɵadvance(3);
430
- i0.ɵɵtextInterpolate(ctx_r0.getSyncProgressMessage(conn_r14.ID) || "Syncing...");
338
+ i0.ɵɵtextInterpolate(ctx_r1.getSyncProgressMessage(conn_r14.ID) || "Syncing...");
431
339
  } }
432
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
433
- i0.ɵɵelement(0, "i", 103);
340
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
341
+ i0.ɵɵelement(0, "i", 88);
434
342
  i0.ɵɵelementStart(1, "span");
435
343
  i0.ɵɵtext(2);
436
344
  i0.ɵɵelementEnd();
437
345
  } if (rf & 2) {
438
346
  let tmp_15_0;
439
347
  const conn_r14 = i0.ɵɵnextContext(2).$implicit;
440
- const ctx_r0 = i0.ɵɵnextContext(4);
348
+ const ctx_r1 = i0.ɵɵnextContext(4);
441
349
  i0.ɵɵadvance(2);
442
- i0.ɵɵtextInterpolate3("Synced: ", (tmp_15_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Added, " added, ", (tmp_15_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Updated, " updated, ", (tmp_15_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Deprecated, " deprecated ");
350
+ i0.ɵɵtextInterpolate3("Synced: ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Added, " added, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Updated, " updated, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Deprecated, " deprecated ");
443
351
  } }
444
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
445
- i0.ɵɵelement(0, "i", 104);
352
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
353
+ i0.ɵɵelement(0, "i", 89);
446
354
  i0.ɵɵelementStart(1, "span");
447
355
  i0.ɵɵtext(2);
448
356
  i0.ɵɵelementEnd();
449
357
  } if (rf & 2) {
450
358
  let tmp_15_0;
451
359
  const conn_r14 = i0.ɵɵnextContext(2).$implicit;
452
- const ctx_r0 = i0.ɵɵnextContext(4);
360
+ const ctx_r1 = i0.ɵɵnextContext(4);
453
361
  i0.ɵɵadvance(2);
454
- i0.ɵɵtextInterpolate((tmp_15_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.ErrorMessage);
362
+ i0.ɵɵtextInterpolate((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.ErrorMessage);
455
363
  } }
456
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
457
- i0.ɵɵelementStart(0, "div", 102);
458
- i0.ɵɵtemplate(1, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template, 3, 1);
364
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
365
+ i0.ɵɵelementStart(0, "div", 87);
366
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template, 3, 1);
459
367
  i0.ɵɵelementEnd();
460
368
  } if (rf & 2) {
461
369
  let tmp_14_0;
462
370
  let tmp_15_0;
463
371
  let tmp_16_0;
464
372
  const conn_r14 = i0.ɵɵnextContext().$implicit;
465
- const ctx_r0 = i0.ɵɵnextContext(4);
466
- i0.ɵɵclassProp("success", (tmp_14_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_14_0.lastResult == null ? null : tmp_14_0.lastResult.Success)("error", !((tmp_15_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Success));
373
+ const ctx_r1 = i0.ɵɵnextContext(4);
374
+ i0.ɵɵclassProp("success", (tmp_14_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_14_0.lastResult == null ? null : tmp_14_0.lastResult.Success)("error", !((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Success));
467
375
  i0.ɵɵadvance();
468
- i0.ɵɵconditional(((tmp_16_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Success) ? 1 : 2);
376
+ i0.ɵɵconditional(((tmp_16_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Success) ? 1 : 2);
469
377
  } }
470
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
471
- i0.ɵɵelement(0, "p", 76);
378
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
379
+ i0.ɵɵelement(0, "p", 61);
472
380
  i0.ɵɵpipe(1, "async");
473
381
  i0.ɵɵpipe(2, "highlightSearch");
474
382
  } if (rf & 2) {
475
383
  let tmp_14_0;
476
384
  const conn_r14 = i0.ɵɵnextContext().$implicit;
477
- const ctx_r0 = i0.ɵɵnextContext(4);
478
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, conn_r14.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
385
+ const ctx_r1 = i0.ɵɵnextContext(4);
386
+ 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);
479
387
  } }
480
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
481
- i0.ɵɵelementStart(0, "div", 99)(1, "span", 79);
388
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
389
+ i0.ɵɵelementStart(0, "div", 84)(1, "span", 64);
482
390
  i0.ɵɵtext(2, "Last Error");
483
391
  i0.ɵɵelementEnd();
484
- i0.ɵɵelementStart(3, "span", 80);
392
+ i0.ɵɵelementStart(3, "span", 65);
485
393
  i0.ɵɵtext(4);
486
394
  i0.ɵɵelementEnd()();
487
395
  } if (rf & 2) {
@@ -489,137 +397,138 @@ function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditi
489
397
  i0.ɵɵadvance(4);
490
398
  i0.ɵɵtextInterpolate(conn_r14.LastErrorMessage);
491
399
  } }
492
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
493
- i0.ɵɵelementStart(0, "div", 86);
494
- i0.ɵɵelement(1, "i", 88);
400
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
401
+ i0.ɵɵelementStart(0, "div", 71);
402
+ i0.ɵɵelement(1, "i", 73);
495
403
  i0.ɵɵtext(2, " No tools discovered yet. Click the sync button to discover tools. ");
496
404
  i0.ɵɵelementEnd();
497
405
  } }
498
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
406
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
499
407
  const _r15 = i0.ɵɵgetCurrentView();
500
- i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "span", 91);
408
+ i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
501
409
  i0.ɵɵtext(3);
502
410
  i0.ɵɵelementEnd();
503
- i0.ɵɵelementStart(4, "span", 92);
504
- i0.ɵɵelement(5, "i", 93);
411
+ i0.ɵɵelementStart(4, "span", 77);
412
+ i0.ɵɵelement(5, "i", 78);
505
413
  i0.ɵɵtext(6);
506
414
  i0.ɵɵelementEnd()();
507
- i0.ɵɵelementStart(7, "button", 105);
508
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r16 = i0.ɵɵrestoreView(_r15).$implicit; const conn_r14 = i0.ɵɵnextContext(3).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); ctx_r0.runToolFromCard(tool_r16, conn_r14); return i0.ɵɵresetView($event.stopPropagation()); });
509
- i0.ɵɵelement(8, "i", 56);
415
+ i0.ɵɵelementStart(7, "button", 90);
416
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r16 = i0.ɵɵrestoreView(_r15).$implicit; const conn_r14 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.runToolFromCard(tool_r16, conn_r14); return i0.ɵɵresetView($event.stopPropagation()); });
417
+ i0.ɵɵelement(8, "i", 38);
510
418
  i0.ɵɵelementEnd()();
511
419
  } if (rf & 2) {
512
420
  const tool_r16 = ctx.$implicit;
513
- const ctx_r0 = i0.ɵɵnextContext(7);
421
+ const ctx_r1 = i0.ɵɵnextContext(7);
514
422
  i0.ɵɵadvance(3);
515
423
  i0.ɵɵtextInterpolate(tool_r16.ToolTitle || tool_r16.ToolName);
516
424
  i0.ɵɵadvance(3);
517
- i0.ɵɵtextInterpolate1(" ", ctx_r0.getParamCount(tool_r16), " params ");
425
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r16), " params ");
518
426
  } }
519
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
520
- i0.ɵɵelementStart(0, "div", 87);
521
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 89, _forTrack0);
427
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
428
+ i0.ɵɵelementStart(0, "div", 72);
429
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
522
430
  i0.ɵɵelementEnd();
523
431
  } if (rf & 2) {
524
432
  const conn_r14 = i0.ɵɵnextContext(2).$implicit;
525
- const ctx_r0 = i0.ɵɵnextContext(4);
433
+ const ctx_r1 = i0.ɵɵnextContext(4);
526
434
  i0.ɵɵadvance();
527
- i0.ɵɵrepeater(ctx_r0.getToolsForConnection(conn_r14.ID));
435
+ i0.ɵɵrepeater(ctx_r1.getToolsForConnection(conn_r14.ID));
528
436
  } }
529
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
530
- i0.ɵɵelementStart(0, "div", 82)(1, "div", 85);
531
- i0.ɵɵelement(2, "i", 11);
437
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
438
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
439
+ i0.ɵɵelement(2, "i", 15);
532
440
  i0.ɵɵelementStart(3, "span");
533
441
  i0.ɵɵtext(4);
534
442
  i0.ɵɵelementEnd()();
535
- i0.ɵɵtemplate(5, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 86)(6, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 87);
443
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 72);
536
444
  i0.ɵɵelementEnd();
537
445
  } if (rf & 2) {
538
446
  const conn_r14 = i0.ɵɵnextContext().$implicit;
539
- const ctx_r0 = i0.ɵɵnextContext(4);
447
+ const ctx_r1 = i0.ɵɵnextContext(4);
540
448
  i0.ɵɵadvance(4);
541
- i0.ɵɵtextInterpolate1("Available Tools (", ctx_r0.getToolsForConnection(conn_r14.ID).length, ")");
449
+ i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForConnection(conn_r14.ID).length, ")");
542
450
  i0.ɵɵadvance();
543
- i0.ɵɵconditional(ctx_r0.getToolsForConnection(conn_r14.ID).length === 0 ? 5 : 6);
451
+ i0.ɵɵconditional(ctx_r1.getToolsForConnection(conn_r14.ID).length === 0 ? 5 : 6);
544
452
  } }
545
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
453
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
546
454
  const _r13 = i0.ɵɵgetCurrentView();
547
- i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
548
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template_div_click_1_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleConnectionExpand(conn_r14)); });
549
- i0.ɵɵelementStart(2, "div", 66);
550
- i0.ɵɵelement(3, "i", 67)(4, "i", 10)(5, "span", 68);
455
+ i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
456
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_1_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleConnectionExpand(conn_r14)); });
457
+ i0.ɵɵelementStart(2, "div", 51);
458
+ i0.ɵɵelement(3, "i", 52)(4, "i", 14)(5, "span", 53);
551
459
  i0.ɵɵpipe(6, "async");
552
460
  i0.ɵɵpipe(7, "highlightSearch");
553
- i0.ɵɵelementStart(8, "span", 69);
461
+ i0.ɵɵelementStart(8, "span", 54);
554
462
  i0.ɵɵtext(9);
555
463
  i0.ɵɵelementEnd()();
556
- i0.ɵɵelementStart(10, "div", 70);
557
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
558
- i0.ɵɵelementStart(11, "button", 95);
559
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template_button_click_11_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.syncConnectionTools(conn_r14)); });
560
- i0.ɵɵtemplate(12, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 96)(13, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_13_Template, 1, 0, "i", 20);
561
- i0.ɵɵelementEnd();
562
- i0.ɵɵelementStart(14, "button", 71);
563
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template_button_click_14_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.editConnection(conn_r14)); });
564
- i0.ɵɵelement(15, "i", 72);
565
- i0.ɵɵelementEnd();
566
- i0.ɵɵelementStart(16, "button", 73);
567
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template_button_click_16_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.deleteConnection(conn_r14)); });
568
- i0.ɵɵelement(17, "i", 74);
464
+ i0.ɵɵelementStart(10, "div", 55);
465
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
466
+ i0.ɵɵelementStart(11, "button", 80);
467
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_11_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.syncConnectionTools(conn_r14)); });
468
+ i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 81)(13, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template, 1, 0, "i", 40);
469
+ i0.ɵɵelementEnd();
470
+ i0.ɵɵelementStart(14, "button", 56);
471
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_14_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editConnection(conn_r14)); });
472
+ i0.ɵɵelement(15, "i", 57);
473
+ i0.ɵɵelementEnd();
474
+ i0.ɵɵelementStart(16, "button", 58);
475
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_16_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteConnection(conn_r14)); });
476
+ i0.ɵɵelement(17, "i", 59);
569
477
  i0.ɵɵelementEnd()()();
570
- i0.ɵɵtemplate(18, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_18_Template, 4, 1, "div", 97)(19, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_19_Template, 3, 5, "div", 98);
571
- i0.ɵɵelementStart(20, "div", 75);
572
- i0.ɵɵtemplate(21, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_21_Template, 3, 6, "p", 76);
573
- i0.ɵɵelementStart(22, "div", 77)(23, "div", 78)(24, "span", 79);
478
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template, 4, 1, "div", 82);
479
+ i0.ɵɵconditionalCreate(19, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template, 3, 5, "div", 83);
480
+ i0.ɵɵelementStart(20, "div", 60);
481
+ i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template, 3, 6, "p", 61);
482
+ i0.ɵɵelementStart(22, "div", 62)(23, "div", 63)(24, "span", 64);
574
483
  i0.ɵɵtext(25, "Server");
575
484
  i0.ɵɵelementEnd();
576
- i0.ɵɵelementStart(26, "span", 80);
485
+ i0.ɵɵelementStart(26, "span", 65);
577
486
  i0.ɵɵtext(27);
578
487
  i0.ɵɵelementEnd()();
579
- i0.ɵɵelementStart(28, "div", 78)(29, "span", 79);
488
+ i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
580
489
  i0.ɵɵtext(30, "Auto Sync");
581
490
  i0.ɵɵelementEnd();
582
- i0.ɵɵelementStart(31, "span", 80);
491
+ i0.ɵɵelementStart(31, "span", 65);
583
492
  i0.ɵɵtext(32);
584
493
  i0.ɵɵelementEnd()();
585
- i0.ɵɵelementStart(33, "div", 78)(34, "span", 79);
494
+ i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
586
495
  i0.ɵɵtext(35, "Logging");
587
496
  i0.ɵɵelementEnd();
588
- i0.ɵɵelementStart(36, "span", 80);
497
+ i0.ɵɵelementStart(36, "span", 65);
589
498
  i0.ɵɵtext(37);
590
499
  i0.ɵɵelementEnd()();
591
- i0.ɵɵelementStart(38, "div", 78)(39, "span", 79);
500
+ i0.ɵɵelementStart(38, "div", 63)(39, "span", 64);
592
501
  i0.ɵɵtext(40, "Last Connected");
593
502
  i0.ɵɵelementEnd();
594
- i0.ɵɵelementStart(41, "span", 80);
503
+ i0.ɵɵelementStart(41, "span", 65);
595
504
  i0.ɵɵtext(42);
596
505
  i0.ɵɵelementEnd()();
597
- i0.ɵɵtemplate(43, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_43_Template, 5, 1, "div", 99);
506
+ i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template, 5, 1, "div", 84);
598
507
  i0.ɵɵelementEnd()();
599
- i0.ɵɵtemplate(44, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 82);
508
+ i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 67);
600
509
  i0.ɵɵelementEnd();
601
510
  } if (rf & 2) {
602
511
  let tmp_15_0;
603
512
  let tmp_21_0;
604
513
  const conn_r14 = ctx.$implicit;
605
- const ctx_r0 = i0.ɵɵnextContext(4);
606
- i0.ɵɵclassProp("expanded", ctx_r0.isConnectionExpanded(conn_r14));
514
+ const ctx_r1 = i0.ɵɵnextContext(4);
515
+ i0.ɵɵclassProp("expanded", ctx_r1.isConnectionExpanded(conn_r14));
607
516
  i0.ɵɵadvance(3);
608
- i0.ɵɵclassProp("rotated", ctx_r0.isConnectionExpanded(conn_r14));
517
+ i0.ɵɵclassProp("rotated", ctx_r1.isConnectionExpanded(conn_r14));
609
518
  i0.ɵɵadvance(2);
610
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, conn_r14.Name, (tmp_15_0 = i0.ɵɵpipeBind1(6, 18, ctx_r0.filters$)) == null ? null : tmp_15_0.searchTerm), i0.ɵɵsanitizeHtml);
519
+ 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);
611
520
  i0.ɵɵadvance(3);
612
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(conn_r14.Status));
521
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(conn_r14.Status));
613
522
  i0.ɵɵadvance();
614
523
  i0.ɵɵtextInterpolate1(" ", conn_r14.Status, " ");
615
524
  i0.ɵɵadvance(2);
616
- i0.ɵɵproperty("disabled", ctx_r0.isSyncing(conn_r14.ID));
525
+ i0.ɵɵproperty("disabled", ctx_r1.isSyncing(conn_r14.ID));
617
526
  i0.ɵɵadvance();
618
- i0.ɵɵconditional(ctx_r0.isSyncing(conn_r14.ID) ? 12 : 13);
527
+ i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 12 : 13);
619
528
  i0.ɵɵadvance(6);
620
- i0.ɵɵconditional(ctx_r0.isSyncing(conn_r14.ID) ? 18 : -1);
529
+ i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 18 : -1);
621
530
  i0.ɵɵadvance();
622
- i0.ɵɵconditional(((tmp_21_0 = ctx_r0.getSyncState(conn_r14.ID)) == null ? null : tmp_21_0.lastResult) && !ctx_r0.isSyncing(conn_r14.ID) ? 19 : -1);
531
+ i0.ɵɵconditional(((tmp_21_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_21_0.lastResult) && !ctx_r1.isSyncing(conn_r14.ID) ? 19 : -1);
623
532
  i0.ɵɵadvance(2);
624
533
  i0.ɵɵconditional(conn_r14.Description ? 21 : -1);
625
534
  i0.ɵɵadvance(6);
@@ -629,163 +538,163 @@ function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Templat
629
538
  i0.ɵɵadvance(5);
630
539
  i0.ɵɵtextInterpolate(conn_r14.LogToolCalls ? "Enabled" : "Disabled");
631
540
  i0.ɵɵadvance(5);
632
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(conn_r14.LastConnectedAt));
541
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(conn_r14.LastConnectedAt));
633
542
  i0.ɵɵadvance();
634
543
  i0.ɵɵconditional(conn_r14.LastErrorMessage ? 43 : -1);
635
544
  i0.ɵɵadvance();
636
- i0.ɵɵconditional(ctx_r0.isConnectionExpanded(conn_r14) ? 44 : -1);
545
+ i0.ɵɵconditional(ctx_r1.isConnectionExpanded(conn_r14) ? 44 : -1);
637
546
  } }
638
- function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
639
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Template, 45, 23, "div", 63, _forTrack0);
547
+ function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
548
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template, 45, 23, "div", 48, _forTrack0);
640
549
  } if (rf & 2) {
641
- const ctx_r0 = i0.ɵɵnextContext(3);
642
- i0.ɵɵrepeater(ctx_r0.filteredConnections);
550
+ const ctx_r1 = i0.ɵɵnextContext(3);
551
+ i0.ɵɵrepeater(ctx_r1.filteredConnections);
643
552
  } }
644
- function MCPDashboardComponent_Conditional_70_Case_1_Template(rf, ctx) { if (rf & 1) {
645
- i0.ɵɵelementStart(0, "div", 60);
646
- i0.ɵɵtemplate(1, MCPDashboardComponent_Conditional_70_Case_1_Conditional_1_Template, 6, 0, "div", 62)(2, MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_Template, 2, 0);
553
+ function MCPDashboardComponent_Conditional_50_Case_1_Template(rf, ctx) { if (rf & 1) {
554
+ i0.ɵɵelementStart(0, "div", 45);
555
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template, 2, 0);
647
556
  i0.ɵɵelementEnd();
648
557
  } if (rf & 2) {
649
- const ctx_r0 = i0.ɵɵnextContext(2);
558
+ const ctx_r1 = i0.ɵɵnextContext(2);
650
559
  i0.ɵɵadvance();
651
- i0.ɵɵconditional(ctx_r0.filteredConnections.length === 0 ? 1 : 2);
560
+ i0.ɵɵconditional(ctx_r1.filteredConnections.length === 0 ? 1 : 2);
652
561
  } }
653
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
654
- i0.ɵɵelementStart(0, "div", 62);
655
- i0.ɵɵelement(1, "i", 11);
562
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
563
+ i0.ɵɵelementStart(0, "div", 47);
564
+ i0.ɵɵelement(1, "i", 15);
656
565
  i0.ɵɵelementStart(2, "p");
657
566
  i0.ɵɵtext(3, "No tools discovered yet");
658
567
  i0.ɵɵelementEnd();
659
- i0.ɵɵelementStart(4, "span", 107);
568
+ i0.ɵɵelementStart(4, "span", 92);
660
569
  i0.ɵɵtext(5, "Tools are discovered when connections sync with MCP servers");
661
570
  i0.ɵɵelementEnd()();
662
571
  } }
663
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
664
- i0.ɵɵelement(0, "p", 126);
572
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelement(0, "p", 111);
665
574
  i0.ɵɵpipe(1, "async");
666
575
  i0.ɵɵpipe(2, "highlightSearch");
667
576
  } if (rf & 2) {
668
577
  let tmp_26_0;
669
578
  const tool_r20 = i0.ɵɵnextContext().$implicit;
670
- const ctx_r0 = i0.ɵɵnextContext(7);
671
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, tool_r20.ToolDescription, (tmp_26_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
579
+ const ctx_r1 = i0.ɵɵnextContext(7);
580
+ 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);
672
581
  } }
673
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template(rf, ctx) { if (rf & 1) {
674
- i0.ɵɵelementStart(0, "div", 135)(1, "span", 132);
582
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template(rf, ctx) { if (rf & 1) {
583
+ i0.ɵɵelementStart(0, "div", 120)(1, "span", 117);
675
584
  i0.ɵɵtext(2, "Input Schema:");
676
585
  i0.ɵɵelementEnd();
677
- i0.ɵɵelementStart(3, "pre", 136);
586
+ i0.ɵɵelementStart(3, "pre", 121);
678
587
  i0.ɵɵtext(4);
679
588
  i0.ɵɵelementEnd()();
680
589
  } if (rf & 2) {
681
590
  const tool_r20 = i0.ɵɵnextContext(2).$implicit;
682
- const ctx_r0 = i0.ɵɵnextContext(7);
591
+ const ctx_r1 = i0.ɵɵnextContext(7);
683
592
  i0.ɵɵadvance(4);
684
- i0.ɵɵtextInterpolate(ctx_r0.getFormattedInputSchema(tool_r20));
593
+ i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r20));
685
594
  } }
686
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
687
- i0.ɵɵelementStart(0, "div", 130)(1, "div", 131)(2, "span", 132);
595
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
596
+ i0.ɵɵelementStart(0, "div", 115)(1, "div", 116)(2, "span", 117);
688
597
  i0.ɵɵtext(3, "Tool Name:");
689
598
  i0.ɵɵelementEnd();
690
- i0.ɵɵelementStart(4, "span", 133);
599
+ i0.ɵɵelementStart(4, "span", 118);
691
600
  i0.ɵɵtext(5);
692
601
  i0.ɵɵelementEnd()();
693
- i0.ɵɵelementStart(6, "div", 131)(7, "span", 132);
602
+ i0.ɵɵelementStart(6, "div", 116)(7, "span", 117);
694
603
  i0.ɵɵtext(8, "Parameters:");
695
604
  i0.ɵɵelementEnd();
696
- i0.ɵɵelementStart(9, "span", 134);
605
+ i0.ɵɵelementStart(9, "span", 119);
697
606
  i0.ɵɵtext(10);
698
607
  i0.ɵɵelementEnd()();
699
- i0.ɵɵelementStart(11, "div", 131)(12, "span", 132);
608
+ i0.ɵɵelementStart(11, "div", 116)(12, "span", 117);
700
609
  i0.ɵɵtext(13, "Discovered:");
701
610
  i0.ɵɵelementEnd();
702
- i0.ɵɵelementStart(14, "span", 134);
611
+ i0.ɵɵelementStart(14, "span", 119);
703
612
  i0.ɵɵtext(15);
704
613
  i0.ɵɵelementEnd()();
705
- i0.ɵɵelementStart(16, "div", 131)(17, "span", 132);
614
+ i0.ɵɵelementStart(16, "div", 116)(17, "span", 117);
706
615
  i0.ɵɵtext(18, "Last Seen:");
707
616
  i0.ɵɵelementEnd();
708
- i0.ɵɵelementStart(19, "span", 134);
617
+ i0.ɵɵelementStart(19, "span", 119);
709
618
  i0.ɵɵtext(20);
710
619
  i0.ɵɵelementEnd()();
711
- i0.ɵɵtemplate(21, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template, 5, 1, "div", 135);
620
+ i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template, 5, 1, "div", 120);
712
621
  i0.ɵɵelementEnd();
713
622
  } if (rf & 2) {
714
623
  const tool_r20 = i0.ɵɵnextContext().$implicit;
715
- const ctx_r0 = i0.ɵɵnextContext(7);
624
+ const ctx_r1 = i0.ɵɵnextContext(7);
716
625
  i0.ɵɵadvance(5);
717
626
  i0.ɵɵtextInterpolate(tool_r20.ToolName);
718
627
  i0.ɵɵadvance(5);
719
- i0.ɵɵtextInterpolate2(" ", ctx_r0.getParamCount(tool_r20), " total, ", ctx_r0.getRequiredParamCount(tool_r20), " required ");
628
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getParamCount(tool_r20), " total, ", ctx_r1.getRequiredParamCount(tool_r20), " required ");
720
629
  i0.ɵɵadvance(5);
721
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(tool_r20.DiscoveredAt));
630
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.DiscoveredAt));
722
631
  i0.ɵɵadvance(5);
723
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(tool_r20.LastSeenAt));
632
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.LastSeenAt));
724
633
  i0.ɵɵadvance();
725
634
  i0.ɵɵconditional(tool_r20.InputSchema ? 21 : -1);
726
635
  } }
727
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
636
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
728
637
  const _r19 = i0.ɵɵgetCurrentView();
729
- i0.ɵɵelementStart(0, "div", 121)(1, "div", 122);
730
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r0.toggleToolExpand(tool_r20)); });
731
- i0.ɵɵelementStart(2, "div", 123);
732
- i0.ɵɵelement(3, "i", 11)(4, "span", 68);
638
+ i0.ɵɵelementStart(0, "div", 106)(1, "div", 107);
639
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
640
+ i0.ɵɵelementStart(2, "div", 108);
641
+ i0.ɵɵelement(3, "i", 15)(4, "span", 53);
733
642
  i0.ɵɵpipe(5, "async");
734
643
  i0.ɵɵpipe(6, "highlightSearch");
735
644
  i0.ɵɵelementEnd();
736
- i0.ɵɵelementStart(7, "div", 124)(8, "span", 125);
737
- i0.ɵɵelement(9, "i", 93);
645
+ i0.ɵɵelementStart(7, "div", 109)(8, "span", 110);
646
+ i0.ɵɵelement(9, "i", 78);
738
647
  i0.ɵɵtext(10);
739
648
  i0.ɵɵelementEnd();
740
- i0.ɵɵelementStart(11, "span", 115);
649
+ i0.ɵɵelementStart(11, "span", 100);
741
650
  i0.ɵɵtext(12);
742
651
  i0.ɵɵelementEnd()()();
743
- i0.ɵɵtemplate(13, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template, 3, 6, "p", 126);
744
- i0.ɵɵelementStart(14, "div", 127)(15, "button", 94);
745
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_15_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r0.openTestToolDialog(tool_r20)); });
746
- i0.ɵɵelement(16, "i", 56);
652
+ i0.ɵɵconditionalCreate(13, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template, 3, 6, "p", 111);
653
+ i0.ɵɵelementStart(14, "div", 112)(15, "button", 79);
654
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_15_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r20)); });
655
+ i0.ɵɵelement(16, "i", 38);
747
656
  i0.ɵɵtext(17, " Test ");
748
657
  i0.ɵɵelementEnd();
749
- i0.ɵɵelementStart(18, "button", 128);
750
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_18_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r0.toggleToolExpand(tool_r20)); });
751
- i0.ɵɵelement(19, "i", 129);
658
+ i0.ɵɵelementStart(18, "button", 113);
659
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_18_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
660
+ i0.ɵɵelement(19, "i", 114);
752
661
  i0.ɵɵtext(20);
753
662
  i0.ɵɵelementEnd()();
754
- i0.ɵɵtemplate(21, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template, 22, 6, "div", 130);
663
+ i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template, 22, 6, "div", 115);
755
664
  i0.ɵɵelementEnd();
756
665
  } if (rf & 2) {
757
666
  let tmp_26_0;
758
667
  const tool_r20 = ctx.$implicit;
759
- const ctx_r0 = i0.ɵɵnextContext(7);
760
- i0.ɵɵclassProp("expanded", ctx_r0.isToolExpanded(tool_r20));
668
+ const ctx_r1 = i0.ɵɵnextContext(7);
669
+ i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r20));
761
670
  i0.ɵɵadvance(4);
762
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 15, tool_r20.ToolTitle || tool_r20.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 13, ctx_r0.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
671
+ i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 15, tool_r20.ToolTitle || tool_r20.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 13, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
763
672
  i0.ɵɵadvance(6);
764
- i0.ɵɵtextInterpolate1(" ", ctx_r0.getParamCount(tool_r20), " ");
673
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r20), " ");
765
674
  i0.ɵɵadvance();
766
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(tool_r20.Status));
675
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r20.Status));
767
676
  i0.ɵɵadvance();
768
677
  i0.ɵɵtextInterpolate1(" ", tool_r20.Status, " ");
769
678
  i0.ɵɵadvance();
770
679
  i0.ɵɵconditional(tool_r20.ToolDescription ? 13 : -1);
771
680
  i0.ɵɵadvance(6);
772
- i0.ɵɵclassProp("fa-chevron-down", !ctx_r0.isToolExpanded(tool_r20))("fa-chevron-up", ctx_r0.isToolExpanded(tool_r20));
681
+ i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r20))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r20));
773
682
  i0.ɵɵadvance();
774
- i0.ɵɵtextInterpolate1(" ", ctx_r0.isToolExpanded(tool_r20) ? "Less" : "More", " ");
683
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isToolExpanded(tool_r20) ? "Less" : "More", " ");
775
684
  i0.ɵɵadvance();
776
- i0.ɵɵconditional(ctx_r0.isToolExpanded(tool_r20) ? 21 : -1);
685
+ i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r20) ? 21 : -1);
777
686
  } }
778
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
779
- i0.ɵɵelementStart(0, "div", 118);
780
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template, 22, 18, "div", 120, _forTrack0);
687
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
688
+ i0.ɵɵelementStart(0, "div", 103);
689
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template, 22, 18, "div", 105, _forTrack0);
781
690
  i0.ɵɵelementEnd();
782
691
  } if (rf & 2) {
783
692
  const group_r18 = i0.ɵɵnextContext(2).$implicit;
784
693
  i0.ɵɵadvance();
785
694
  i0.ɵɵrepeater(group_r18.tools);
786
695
  } }
787
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template(rf, ctx) { if (rf & 1) {
788
- i0.ɵɵelementStart(0, "span", 140);
696
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template(rf, ctx) { if (rf & 1) {
697
+ i0.ɵɵelementStart(0, "span", 125);
789
698
  i0.ɵɵtext(1);
790
699
  i0.ɵɵelementEnd();
791
700
  } if (rf & 2) {
@@ -793,110 +702,110 @@ function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditi
793
702
  i0.ɵɵadvance();
794
703
  i0.ɵɵtextInterpolate(tool_r22.ToolName);
795
704
  } }
796
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
797
- i0.ɵɵelementStart(0, "div", 150)(1, "span", 132);
705
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
706
+ i0.ɵɵelementStart(0, "div", 135)(1, "span", 117);
798
707
  i0.ɵɵtext(2, "Input Schema:");
799
708
  i0.ɵɵelementEnd();
800
- i0.ɵɵelementStart(3, "pre", 136);
709
+ i0.ɵɵelementStart(3, "pre", 121);
801
710
  i0.ɵɵtext(4);
802
711
  i0.ɵɵelementEnd()();
803
712
  } if (rf & 2) {
804
713
  const tool_r22 = i0.ɵɵnextContext(2).$implicit;
805
- const ctx_r0 = i0.ɵɵnextContext(7);
714
+ const ctx_r1 = i0.ɵɵnextContext(7);
806
715
  i0.ɵɵadvance(4);
807
- i0.ɵɵtextInterpolate(ctx_r0.getFormattedInputSchema(tool_r22));
716
+ i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r22));
808
717
  } }
809
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
810
- i0.ɵɵelementStart(0, "tr", 146)(1, "td", 147)(2, "div", 148)(3, "div", 149)(4, "span", 132);
718
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
719
+ i0.ɵɵelementStart(0, "tr", 131)(1, "td", 132)(2, "div", 133)(3, "div", 134)(4, "span", 117);
811
720
  i0.ɵɵtext(5, "Tool Name:");
812
721
  i0.ɵɵelementEnd();
813
- i0.ɵɵelementStart(6, "span", 133);
722
+ i0.ɵɵelementStart(6, "span", 118);
814
723
  i0.ɵɵtext(7);
815
724
  i0.ɵɵelementEnd()();
816
- i0.ɵɵelementStart(8, "div", 149)(9, "span", 132);
725
+ i0.ɵɵelementStart(8, "div", 134)(9, "span", 117);
817
726
  i0.ɵɵtext(10, "Discovered:");
818
727
  i0.ɵɵelementEnd();
819
- i0.ɵɵelementStart(11, "span", 134);
728
+ i0.ɵɵelementStart(11, "span", 119);
820
729
  i0.ɵɵtext(12);
821
730
  i0.ɵɵelementEnd()();
822
- i0.ɵɵelementStart(13, "div", 149)(14, "span", 132);
731
+ i0.ɵɵelementStart(13, "div", 134)(14, "span", 117);
823
732
  i0.ɵɵtext(15, "Required Params:");
824
733
  i0.ɵɵelementEnd();
825
- i0.ɵɵelementStart(16, "span", 134);
734
+ i0.ɵɵelementStart(16, "span", 119);
826
735
  i0.ɵɵtext(17);
827
736
  i0.ɵɵelementEnd()();
828
- i0.ɵɵtemplate(18, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 150);
737
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 135);
829
738
  i0.ɵɵelementEnd()()();
830
739
  } if (rf & 2) {
831
740
  const tool_r22 = i0.ɵɵnextContext().$implicit;
832
- const ctx_r0 = i0.ɵɵnextContext(7);
741
+ const ctx_r1 = i0.ɵɵnextContext(7);
833
742
  i0.ɵɵadvance(7);
834
743
  i0.ɵɵtextInterpolate(tool_r22.ToolName);
835
744
  i0.ɵɵadvance(5);
836
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(tool_r22.DiscoveredAt));
745
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.DiscoveredAt));
837
746
  i0.ɵɵadvance(5);
838
- i0.ɵɵtextInterpolate(ctx_r0.getRequiredParamCount(tool_r22));
747
+ i0.ɵɵtextInterpolate(ctx_r1.getRequiredParamCount(tool_r22));
839
748
  i0.ɵɵadvance();
840
749
  i0.ɵɵconditional(tool_r22.InputSchema ? 18 : -1);
841
750
  } }
842
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
751
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
843
752
  const _r21 = i0.ɵɵgetCurrentView();
844
- i0.ɵɵelementStart(0, "tr")(1, "td", 137);
845
- i0.ɵɵelement(2, "i", 11);
846
- i0.ɵɵelementStart(3, "div", 138);
847
- i0.ɵɵelement(4, "span", 139);
753
+ i0.ɵɵelementStart(0, "tr")(1, "td", 122);
754
+ i0.ɵɵelement(2, "i", 15);
755
+ i0.ɵɵelementStart(3, "div", 123);
756
+ i0.ɵɵelement(4, "span", 124);
848
757
  i0.ɵɵpipe(5, "async");
849
758
  i0.ɵɵpipe(6, "highlightSearch");
850
- i0.ɵɵtemplate(7, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template, 2, 1, "span", 140);
759
+ 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);
851
760
  i0.ɵɵelementEnd()();
852
- i0.ɵɵelement(8, "td", 141);
761
+ i0.ɵɵelement(8, "td", 126);
853
762
  i0.ɵɵpipe(9, "async");
854
763
  i0.ɵɵpipe(10, "highlightSearch");
855
- i0.ɵɵelementStart(11, "td")(12, "span", 142);
764
+ i0.ɵɵelementStart(11, "td")(12, "span", 127);
856
765
  i0.ɵɵtext(13);
857
766
  i0.ɵɵelementEnd()();
858
- i0.ɵɵelementStart(14, "td")(15, "span", 115);
767
+ i0.ɵɵelementStart(14, "td")(15, "span", 100);
859
768
  i0.ɵɵtext(16);
860
769
  i0.ɵɵelementEnd()();
861
770
  i0.ɵɵelementStart(17, "td");
862
771
  i0.ɵɵtext(18);
863
772
  i0.ɵɵelementEnd();
864
- i0.ɵɵelementStart(19, "td", 143)(20, "button", 144);
865
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r0.openTestToolDialog(tool_r22)); });
866
- i0.ɵɵelement(21, "i", 56);
773
+ i0.ɵɵelementStart(19, "td", 128)(20, "button", 129);
774
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r22)); });
775
+ i0.ɵɵelement(21, "i", 38);
867
776
  i0.ɵɵelementEnd();
868
- i0.ɵɵelementStart(22, "button", 145);
869
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r0 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r0.toggleToolExpand(tool_r22)); });
870
- i0.ɵɵelement(23, "i", 129);
777
+ i0.ɵɵelementStart(22, "button", 130);
778
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r22)); });
779
+ i0.ɵɵelement(23, "i", 114);
871
780
  i0.ɵɵelementEnd()()();
872
- i0.ɵɵtemplate(24, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 146);
781
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 131);
873
782
  } if (rf & 2) {
874
783
  let tmp_26_0;
875
784
  let tmp_28_0;
876
785
  const tool_r22 = ctx.$implicit;
877
- const ctx_r0 = i0.ɵɵnextContext(7);
878
- i0.ɵɵclassProp("expanded", ctx_r0.isToolExpanded(tool_r22));
786
+ const ctx_r1 = i0.ɵɵnextContext(7);
787
+ i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r22));
879
788
  i0.ɵɵadvance(4);
880
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 16, tool_r22.ToolTitle || tool_r22.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 14, ctx_r0.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
789
+ 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);
881
790
  i0.ɵɵadvance(3);
882
791
  i0.ɵɵconditional(tool_r22.ToolTitle ? 7 : -1);
883
792
  i0.ɵɵadvance();
884
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(10, 21, tool_r22.ToolDescription || "-", (tmp_28_0 = i0.ɵɵpipeBind1(9, 19, ctx_r0.filters$)) == null ? null : tmp_28_0.searchTerm), i0.ɵɵsanitizeHtml);
793
+ 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);
885
794
  i0.ɵɵadvance(5);
886
- i0.ɵɵtextInterpolate(ctx_r0.getParamCount(tool_r22));
795
+ i0.ɵɵtextInterpolate(ctx_r1.getParamCount(tool_r22));
887
796
  i0.ɵɵadvance(2);
888
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(tool_r22.Status));
797
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r22.Status));
889
798
  i0.ɵɵadvance();
890
799
  i0.ɵɵtextInterpolate1(" ", tool_r22.Status, " ");
891
800
  i0.ɵɵadvance(2);
892
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(tool_r22.LastSeenAt));
801
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.LastSeenAt));
893
802
  i0.ɵɵadvance(5);
894
- i0.ɵɵclassProp("fa-chevron-down", !ctx_r0.isToolExpanded(tool_r22))("fa-chevron-up", ctx_r0.isToolExpanded(tool_r22));
803
+ i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r22))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r22));
895
804
  i0.ɵɵadvance();
896
- i0.ɵɵconditional(ctx_r0.isToolExpanded(tool_r22) ? 24 : -1);
805
+ i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r22) ? 24 : -1);
897
806
  } }
898
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
899
- i0.ɵɵelementStart(0, "div", 119)(1, "table")(2, "thead")(3, "tr")(4, "th");
807
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
808
+ i0.ɵɵelementStart(0, "div", 104)(1, "table")(2, "thead")(3, "tr")(4, "th");
900
809
  i0.ɵɵtext(5, "Tool");
901
810
  i0.ɵɵelementEnd();
902
811
  i0.ɵɵelementStart(6, "th");
@@ -915,110 +824,110 @@ function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditi
915
824
  i0.ɵɵtext(15, "Actions");
916
825
  i0.ɵɵelementEnd()()();
917
826
  i0.ɵɵelementStart(16, "tbody");
918
- i0.ɵɵrepeaterCreate(17, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template, 25, 24, null, null, _forTrack0);
827
+ i0.ɵɵrepeaterCreate(17, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template, 25, 24, null, null, _forTrack0);
919
828
  i0.ɵɵelementEnd()()();
920
829
  } if (rf & 2) {
921
830
  const group_r18 = i0.ɵɵnextContext(2).$implicit;
922
831
  i0.ɵɵadvance(17);
923
832
  i0.ɵɵrepeater(group_r18.tools);
924
833
  } }
925
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
926
- i0.ɵɵtemplate(0, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 118)(1, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 119);
834
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
835
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 103)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 104);
927
836
  } if (rf & 2) {
928
- const ctx_r0 = i0.ɵɵnextContext(5);
929
- i0.ɵɵconditional(ctx_r0.ToolsViewMode === "card" ? 0 : 1);
837
+ const ctx_r1 = i0.ɵɵnextContext(5);
838
+ i0.ɵɵconditional(ctx_r1.ToolsViewMode === "card" ? 0 : 1);
930
839
  } }
931
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
840
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
932
841
  const _r17 = i0.ɵɵgetCurrentView();
933
- i0.ɵɵelementStart(0, "div", 109)(1, "div", 110);
934
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Template_div_click_1_listener() { const group_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleServerGroup(group_r18)); });
935
- i0.ɵɵelementStart(2, "div", 111);
936
- i0.ɵɵelement(3, "i", 112)(4, "i");
937
- i0.ɵɵelementStart(5, "span", 113);
842
+ i0.ɵɵelementStart(0, "div", 94)(1, "div", 95);
843
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_1_listener() { const group_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerGroup(group_r18)); });
844
+ i0.ɵɵelementStart(2, "div", 96);
845
+ i0.ɵɵelement(3, "i", 97)(4, "i");
846
+ i0.ɵɵelementStart(5, "span", 98);
938
847
  i0.ɵɵtext(6);
939
848
  i0.ɵɵelementEnd();
940
- i0.ɵɵelementStart(7, "span", 114);
849
+ i0.ɵɵelementStart(7, "span", 99);
941
850
  i0.ɵɵtext(8);
942
851
  i0.ɵɵelementEnd();
943
- i0.ɵɵelementStart(9, "span", 115);
852
+ i0.ɵɵelementStart(9, "span", 100);
944
853
  i0.ɵɵtext(10);
945
854
  i0.ɵɵelementEnd()();
946
- i0.ɵɵelementStart(11, "div", 116);
947
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
948
- i0.ɵɵelementStart(12, "button", 117);
949
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.openTestToolDialog(undefined, undefined)); });
950
- i0.ɵɵelement(13, "i", 56);
855
+ i0.ɵɵelementStart(11, "div", 101);
856
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
857
+ i0.ɵɵelementStart(12, "button", 102);
858
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(undefined, undefined)); });
859
+ i0.ɵɵelement(13, "i", 38);
951
860
  i0.ɵɵelementEnd()()();
952
- i0.ɵɵtemplate(14, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditional_14_Template, 2, 1);
861
+ i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template, 2, 1);
953
862
  i0.ɵɵelementEnd();
954
863
  } if (rf & 2) {
955
864
  const group_r18 = ctx.$implicit;
956
- const ctx_r0 = i0.ɵɵnextContext(4);
865
+ const ctx_r1 = i0.ɵɵnextContext(4);
957
866
  i0.ɵɵclassProp("collapsed", !group_r18.expanded);
958
867
  i0.ɵɵadvance(3);
959
868
  i0.ɵɵclassProp("expanded", group_r18.expanded);
960
869
  i0.ɵɵadvance();
961
- i0.ɵɵclassMap(ctx_r0.getTransportIcon(group_r18.server.TransportType));
870
+ i0.ɵɵclassMap(ctx_r1.getTransportIcon(group_r18.server.TransportType));
962
871
  i0.ɵɵadvance(2);
963
872
  i0.ɵɵtextInterpolate(group_r18.server.Name);
964
873
  i0.ɵɵadvance(2);
965
874
  i0.ɵɵtextInterpolate1("", group_r18.tools.length, " tools");
966
875
  i0.ɵɵadvance();
967
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(group_r18.server.Status));
876
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(group_r18.server.Status));
968
877
  i0.ɵɵadvance();
969
878
  i0.ɵɵtextInterpolate1(" ", group_r18.server.Status, " ");
970
879
  i0.ɵɵadvance(4);
971
880
  i0.ɵɵconditional(group_r18.expanded ? 14 : -1);
972
881
  } }
973
- function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
974
- i0.ɵɵelementStart(0, "div", 106);
975
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Template, 15, 11, "div", 108, _forTrack1);
882
+ function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
883
+ i0.ɵɵelementStart(0, "div", 91);
884
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template, 15, 11, "div", 93, _forTrack1);
976
885
  i0.ɵɵelementEnd();
977
886
  } if (rf & 2) {
978
- const ctx_r0 = i0.ɵɵnextContext(3);
887
+ const ctx_r1 = i0.ɵɵnextContext(3);
979
888
  i0.ɵɵadvance();
980
- i0.ɵɵrepeater(ctx_r0.ServerGroups);
889
+ i0.ɵɵrepeater(ctx_r1.ServerGroups);
981
890
  } }
982
- function MCPDashboardComponent_Conditional_70_Case_2_Template(rf, ctx) { if (rf & 1) {
983
- i0.ɵɵtemplate(0, MCPDashboardComponent_Conditional_70_Case_2_Conditional_0_Template, 6, 0, "div", 62)(1, MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_Template, 3, 0, "div", 106);
891
+ function MCPDashboardComponent_Conditional_50_Case_2_Template(rf, ctx) { if (rf & 1) {
892
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template, 6, 0, "div", 47)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template, 3, 0, "div", 91);
984
893
  } if (rf & 2) {
985
- const ctx_r0 = i0.ɵɵnextContext(2);
986
- i0.ɵɵconditional(ctx_r0.ServerGroups.length === 0 ? 0 : 1);
894
+ const ctx_r1 = i0.ɵɵnextContext(2);
895
+ i0.ɵɵconditional(ctx_r1.ServerGroups.length === 0 ? 0 : 1);
987
896
  } }
988
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
989
- i0.ɵɵelementStart(0, "div", 62);
990
- i0.ɵɵelement(1, "i", 12);
897
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
898
+ i0.ɵɵelementStart(0, "div", 47);
899
+ i0.ɵɵelement(1, "i", 16);
991
900
  i0.ɵɵelementStart(2, "p");
992
901
  i0.ɵɵtext(3, "No recent execution logs");
993
902
  i0.ɵɵelementEnd();
994
- i0.ɵɵelementStart(4, "span", 107);
903
+ i0.ɵɵelementStart(4, "span", 92);
995
904
  i0.ɵɵtext(5, "Logs appear when tools are executed via MCP connections");
996
905
  i0.ɵɵelementEnd()();
997
906
  } }
998
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
999
- i0.ɵɵelement(0, "i", 103);
907
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
908
+ i0.ɵɵelement(0, "i", 88);
1000
909
  } }
1001
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
1002
- i0.ɵɵelement(0, "i", 155);
910
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
911
+ i0.ɵɵelement(0, "i", 140);
1003
912
  } }
1004
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
1005
- i0.ɵɵelement(0, "i", 156);
913
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
914
+ i0.ɵɵelement(0, "i", 141);
1006
915
  } }
1007
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
1008
- i0.ɵɵelement(0, "i", 157);
916
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
917
+ i0.ɵɵelement(0, "i", 142);
1009
918
  } }
1010
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
919
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
1011
920
  const _r24 = i0.ɵɵgetCurrentView();
1012
- i0.ɵɵelementStart(0, "tr", 154);
1013
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.onLogClick(log_r25)); });
1014
- i0.ɵɵelementStart(1, "td")(2, "span", 69);
1015
- i0.ɵɵtemplate(3, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 103)(4, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 155)(5, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 156)(6, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 157);
921
+ i0.ɵɵelementStart(0, "tr", 139);
922
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onLogClick(log_r25)); });
923
+ i0.ɵɵelementStart(1, "td")(2, "span", 54);
924
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 88)(4, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 140)(5, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 141)(6, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 142);
1016
925
  i0.ɵɵtext(7);
1017
926
  i0.ɵɵelementEnd()();
1018
- i0.ɵɵelementStart(8, "td", 113);
927
+ i0.ɵɵelementStart(8, "td", 98);
1019
928
  i0.ɵɵtext(9);
1020
929
  i0.ɵɵelementEnd();
1021
- i0.ɵɵelementStart(10, "td", 158);
930
+ i0.ɵɵelementStart(10, "td", 143);
1022
931
  i0.ɵɵtext(11);
1023
932
  i0.ɵɵelementEnd();
1024
933
  i0.ɵɵelementStart(12, "td");
@@ -1030,19 +939,19 @@ function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Templa
1030
939
  i0.ɵɵelementStart(16, "td");
1031
940
  i0.ɵɵtext(17);
1032
941
  i0.ɵɵelementEnd();
1033
- i0.ɵɵelementStart(18, "td", 159);
942
+ i0.ɵɵelementStart(18, "td", 144);
1034
943
  i0.ɵɵtext(19);
1035
944
  i0.ɵɵelementEnd();
1036
- i0.ɵɵelementStart(20, "td", 160);
1037
- i0.ɵɵelement(21, "i", 161);
945
+ i0.ɵɵelementStart(20, "td", 145);
946
+ i0.ɵɵelement(21, "i", 146);
1038
947
  i0.ɵɵelementEnd()();
1039
948
  } if (rf & 2) {
1040
949
  let tmp_15_0;
1041
950
  const log_r25 = ctx.$implicit;
1042
- const ctx_r0 = i0.ɵɵnextContext(4);
951
+ const ctx_r1 = i0.ɵɵnextContext(4);
1043
952
  i0.ɵɵclassProp("error-row", log_r25.Status === "Error");
1044
953
  i0.ɵɵadvance(2);
1045
- i0.ɵɵproperty("ngClass", ctx_r0.getStatusClass(log_r25.Status));
954
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r25.Status));
1046
955
  i0.ɵɵadvance();
1047
956
  i0.ɵɵconditional((tmp_15_0 = log_r25.Status) === "Success" ? 3 : tmp_15_0 === "Error" ? 4 : tmp_15_0 === "Running" ? 5 : 6);
1048
957
  i0.ɵɵadvance(4);
@@ -1054,140 +963,140 @@ function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Templa
1054
963
  i0.ɵɵadvance(2);
1055
964
  i0.ɵɵtextInterpolate(log_r25.ConnectionName);
1056
965
  i0.ɵɵadvance(2);
1057
- i0.ɵɵtextInterpolate(ctx_r0.formatDate(log_r25.StartedAt));
966
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r25.StartedAt));
1058
967
  i0.ɵɵadvance(2);
1059
- i0.ɵɵtextInterpolate(ctx_r0.formatDuration(log_r25.DurationMs));
968
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r25.DurationMs));
1060
969
  i0.ɵɵadvance();
1061
970
  i0.ɵɵproperty("title", log_r25.ErrorMessage || "");
1062
971
  i0.ɵɵadvance();
1063
972
  i0.ɵɵtextInterpolate1(" ", log_r25.ErrorMessage || "-", " ");
1064
973
  } }
1065
- function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
974
+ function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1066
975
  const _r23 = i0.ɵɵgetCurrentView();
1067
- i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 151);
1068
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("status")); });
976
+ i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 136);
977
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("status")); });
1069
978
  i0.ɵɵtext(4, " Status ");
1070
- i0.ɵɵelement(5, "i", 152);
979
+ i0.ɵɵelement(5, "i", 137);
1071
980
  i0.ɵɵelementEnd();
1072
- i0.ɵɵelementStart(6, "th", 151);
1073
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("server")); });
981
+ i0.ɵɵelementStart(6, "th", 136);
982
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("server")); });
1074
983
  i0.ɵɵtext(7, " Server ");
1075
- i0.ɵɵelement(8, "i", 152);
984
+ i0.ɵɵelement(8, "i", 137);
1076
985
  i0.ɵɵelementEnd();
1077
- i0.ɵɵelementStart(9, "th", 151);
1078
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("tool")); });
986
+ i0.ɵɵelementStart(9, "th", 136);
987
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("tool")); });
1079
988
  i0.ɵɵtext(10, " Tool ");
1080
- i0.ɵɵelement(11, "i", 152);
989
+ i0.ɵɵelement(11, "i", 137);
1081
990
  i0.ɵɵelementEnd();
1082
- i0.ɵɵelementStart(12, "th", 151);
1083
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("connection")); });
991
+ i0.ɵɵelementStart(12, "th", 136);
992
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("connection")); });
1084
993
  i0.ɵɵtext(13, " Connection ");
1085
- i0.ɵɵelement(14, "i", 152);
994
+ i0.ɵɵelement(14, "i", 137);
1086
995
  i0.ɵɵelementEnd();
1087
- i0.ɵɵelementStart(15, "th", 151);
1088
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("started")); });
996
+ i0.ɵɵelementStart(15, "th", 136);
997
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("started")); });
1089
998
  i0.ɵɵtext(16, " Started ");
1090
- i0.ɵɵelement(17, "i", 152);
999
+ i0.ɵɵelement(17, "i", 137);
1091
1000
  i0.ɵɵelementEnd();
1092
- i0.ɵɵelementStart(18, "th", 151);
1093
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("duration")); });
1001
+ i0.ɵɵelementStart(18, "th", 136);
1002
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("duration")); });
1094
1003
  i0.ɵɵtext(19, " Duration ");
1095
- i0.ɵɵelement(20, "i", 152);
1004
+ i0.ɵɵelement(20, "i", 137);
1096
1005
  i0.ɵɵelementEnd();
1097
- i0.ɵɵelementStart(21, "th", 151);
1098
- i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r23); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onLogSortColumn("error")); });
1006
+ i0.ɵɵelementStart(21, "th", 136);
1007
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("error")); });
1099
1008
  i0.ɵɵtext(22, " Error ");
1100
- i0.ɵɵelement(23, "i", 152);
1009
+ i0.ɵɵelement(23, "i", 137);
1101
1010
  i0.ɵɵelementEnd();
1102
1011
  i0.ɵɵelement(24, "th");
1103
1012
  i0.ɵɵelementEnd()();
1104
1013
  i0.ɵɵelementStart(25, "tbody");
1105
- i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 153, _forTrack0);
1014
+ i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 138, _forTrack0);
1106
1015
  i0.ɵɵelementEnd()();
1107
1016
  } if (rf & 2) {
1108
- const ctx_r0 = i0.ɵɵnextContext(3);
1017
+ const ctx_r1 = i0.ɵɵnextContext(3);
1109
1018
  i0.ɵɵadvance(3);
1110
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("status"));
1019
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("status"));
1111
1020
  i0.ɵɵadvance(2);
1112
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "status" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "status" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "status");
1021
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "status" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "status" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "status");
1113
1022
  i0.ɵɵadvance();
1114
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("server"));
1023
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("server"));
1115
1024
  i0.ɵɵadvance(2);
1116
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "server" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "server" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "server");
1025
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "server" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "server" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "server");
1117
1026
  i0.ɵɵadvance();
1118
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("tool"));
1027
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("tool"));
1119
1028
  i0.ɵɵadvance(2);
1120
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "tool" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "tool" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "tool");
1029
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "tool" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "tool" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "tool");
1121
1030
  i0.ɵɵadvance();
1122
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("connection"));
1031
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("connection"));
1123
1032
  i0.ɵɵadvance(2);
1124
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "connection" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "connection" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "connection");
1033
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "connection" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "connection" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "connection");
1125
1034
  i0.ɵɵadvance();
1126
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("started"));
1035
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("started"));
1127
1036
  i0.ɵɵadvance(2);
1128
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "started" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "started" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "started");
1037
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "started" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "started" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "started");
1129
1038
  i0.ɵɵadvance();
1130
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("duration"));
1039
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("duration"));
1131
1040
  i0.ɵɵadvance(2);
1132
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "duration" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "duration" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "duration");
1041
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "duration" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "duration" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "duration");
1133
1042
  i0.ɵɵadvance();
1134
- i0.ɵɵproperty("ngClass", ctx_r0.getLogSortClass("error"));
1043
+ i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("error"));
1135
1044
  i0.ɵɵadvance(2);
1136
- i0.ɵɵclassProp("fa-sort-up", ctx_r0.LogsSortColumn === "error" && ctx_r0.LogsSortAscending)("fa-sort-down", ctx_r0.LogsSortColumn === "error" && !ctx_r0.LogsSortAscending)("fa-sort", ctx_r0.LogsSortColumn !== "error");
1045
+ i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "error" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "error" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "error");
1137
1046
  i0.ɵɵadvance(3);
1138
- i0.ɵɵrepeater(ctx_r0.filteredLogs);
1047
+ i0.ɵɵrepeater(ctx_r1.filteredLogs);
1139
1048
  } }
1140
- function MCPDashboardComponent_Conditional_70_Case_3_Template(rf, ctx) { if (rf & 1) {
1141
- i0.ɵɵelementStart(0, "div", 61);
1142
- i0.ɵɵtemplate(1, MCPDashboardComponent_Conditional_70_Case_3_Conditional_1_Template, 6, 0, "div", 62)(2, MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_Template, 28, 49, "table");
1049
+ function MCPDashboardComponent_Conditional_50_Case_3_Template(rf, ctx) { if (rf & 1) {
1050
+ i0.ɵɵelementStart(0, "div", 46);
1051
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template, 28, 49, "table");
1143
1052
  i0.ɵɵelementEnd();
1144
1053
  } if (rf & 2) {
1145
- const ctx_r0 = i0.ɵɵnextContext(2);
1054
+ const ctx_r1 = i0.ɵɵnextContext(2);
1146
1055
  i0.ɵɵadvance();
1147
- i0.ɵɵconditional(ctx_r0.filteredLogs.length === 0 ? 1 : 2);
1056
+ i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 1 : 2);
1148
1057
  } }
1149
- function MCPDashboardComponent_Conditional_70_Template(rf, ctx) { if (rf & 1) {
1150
- i0.ɵɵtemplate(0, MCPDashboardComponent_Conditional_70_Case_0_Template, 3, 1, "div", 59)(1, MCPDashboardComponent_Conditional_70_Case_1_Template, 3, 1, "div", 60)(2, MCPDashboardComponent_Conditional_70_Case_2_Template, 2, 1)(3, MCPDashboardComponent_Conditional_70_Case_3_Template, 3, 1, "div", 61);
1058
+ function MCPDashboardComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
1059
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Template, 3, 1, "div", 44)(1, MCPDashboardComponent_Conditional_50_Case_1_Template, 3, 1, "div", 45)(2, MCPDashboardComponent_Conditional_50_Case_2_Template, 2, 1)(3, MCPDashboardComponent_Conditional_50_Case_3_Template, 3, 1, "div", 46);
1151
1060
  } if (rf & 2) {
1152
1061
  let tmp_1_0;
1153
- const ctx_r0 = i0.ɵɵnextContext();
1154
- i0.ɵɵconditional((tmp_1_0 = ctx_r0.ActiveTab) === "servers" ? 0 : tmp_1_0 === "connections" ? 1 : tmp_1_0 === "tools" ? 2 : tmp_1_0 === "logs" ? 3 : -1);
1062
+ const ctx_r1 = i0.ɵɵnextContext();
1063
+ i0.ɵɵconditional((tmp_1_0 = ctx_r1.ActiveTab) === "servers" ? 0 : tmp_1_0 === "connections" ? 1 : tmp_1_0 === "tools" ? 2 : tmp_1_0 === "logs" ? 3 : -1);
1155
1064
  } }
1156
- function MCPDashboardComponent_Conditional_71_Template(rf, ctx) { if (rf & 1) {
1065
+ function MCPDashboardComponent_Conditional_51_Template(rf, ctx) { if (rf & 1) {
1157
1066
  const _r26 = i0.ɵɵgetCurrentView();
1158
- i0.ɵɵelementStart(0, "mj-mcp-server-dialog", 162);
1159
- i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_71_Template_mj_mcp_server_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onServerDialogClose($event)); });
1067
+ i0.ɵɵelementStart(0, "mj-mcp-server-dialog", 147);
1068
+ 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)); });
1160
1069
  i0.ɵɵelementEnd();
1161
1070
  } if (rf & 2) {
1162
- const ctx_r0 = i0.ɵɵnextContext();
1163
- i0.ɵɵproperty("server", ctx_r0.EditingServer)("visible", ctx_r0.ShowServerDialog);
1071
+ const ctx_r1 = i0.ɵɵnextContext();
1072
+ i0.ɵɵproperty("server", ctx_r1.EditingServer)("visible", ctx_r1.ShowServerDialog);
1164
1073
  } }
1165
- function MCPDashboardComponent_Conditional_72_Template(rf, ctx) { if (rf & 1) {
1074
+ function MCPDashboardComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
1166
1075
  const _r27 = i0.ɵɵgetCurrentView();
1167
- i0.ɵɵelementStart(0, "mj-mcp-connection-dialog", 163);
1168
- i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_72_Template_mj_mcp_connection_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onConnectionDialogClose($event)); });
1076
+ i0.ɵɵelementStart(0, "mj-mcp-connection-dialog", 148);
1077
+ 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)); });
1169
1078
  i0.ɵɵelementEnd();
1170
1079
  } if (rf & 2) {
1171
- const ctx_r0 = i0.ɵɵnextContext();
1172
- i0.ɵɵproperty("connection", ctx_r0.EditingConnection)("servers", ctx_r0.servers)("visible", ctx_r0.ShowConnectionDialog);
1080
+ const ctx_r1 = i0.ɵɵnextContext();
1081
+ i0.ɵɵproperty("connection", ctx_r1.EditingConnection)("servers", ctx_r1.servers)("visible", ctx_r1.ShowConnectionDialog);
1173
1082
  } }
1174
- function MCPDashboardComponent_Conditional_73_Template(rf, ctx) { if (rf & 1) {
1083
+ function MCPDashboardComponent_Conditional_53_Template(rf, ctx) { if (rf & 1) {
1175
1084
  const _r28 = i0.ɵɵgetCurrentView();
1176
- i0.ɵɵelementStart(0, "mj-mcp-test-tool-dialog", 164);
1177
- i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_73_Template_mj_mcp_test_tool_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onTestToolDialogClose()); });
1085
+ i0.ɵɵelementStart(0, "mj-mcp-test-tool-dialog", 149);
1086
+ i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_53_Template_mj_mcp_test_tool_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestToolDialogClose()); });
1178
1087
  i0.ɵɵelementEnd();
1179
1088
  } if (rf & 2) {
1180
- const ctx_r0 = i0.ɵɵnextContext();
1181
- i0.ɵɵproperty("Visible", ctx_r0.ShowTestToolDialog)("Servers", ctx_r0.servers)("Connections", ctx_r0.connections)("Tools", ctx_r0.tools)("SelectedServerID", ctx_r0.TestToolServerID)("SelectedConnectionID", ctx_r0.TestToolConnectionID)("SelectedToolID", ctx_r0.TestToolID);
1089
+ const ctx_r1 = i0.ɵɵnextContext();
1090
+ 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);
1182
1091
  } }
1183
- function MCPDashboardComponent_Conditional_74_Template(rf, ctx) { if (rf & 1) {
1092
+ function MCPDashboardComponent_Conditional_54_Template(rf, ctx) { if (rf & 1) {
1184
1093
  const _r29 = i0.ɵɵgetCurrentView();
1185
- i0.ɵɵelementStart(0, "mj-mcp-log-detail-panel", 165);
1186
- i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_74_Template_mj_mcp_log_detail_panel_Close_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onLogDetailClose()); })("RunAgain", function MCPDashboardComponent_Conditional_74_Template_mj_mcp_log_detail_panel_RunAgain_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onRunAgainFromLog($event)); });
1094
+ i0.ɵɵelementStart(0, "mj-mcp-log-detail-panel", 150);
1095
+ i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_Close_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); })("RunAgain", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_RunAgain_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRunAgainFromLog($event)); });
1187
1096
  i0.ɵɵelementEnd();
1188
1097
  } if (rf & 2) {
1189
- const ctx_r0 = i0.ɵɵnextContext();
1190
- i0.ɵɵproperty("Visible", ctx_r0.ShowLogDetailPanel)("Log", ctx_r0.SelectedLog);
1098
+ const ctx_r1 = i0.ɵɵnextContext();
1099
+ i0.ɵɵproperty("Visible", ctx_r1.ShowLogDetailPanel)("Log", ctx_r1.SelectedLog);
1191
1100
  } }
1192
1101
  /**
1193
1102
  * MCP Management Dashboard Component
@@ -1201,6 +1110,7 @@ function MCPDashboardComponent_Conditional_74_Template(rf, ctx) { if (rf & 1) {
1201
1110
  let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1202
1111
  cdr;
1203
1112
  router;
1113
+ route;
1204
1114
  navigationService;
1205
1115
  mcpToolsService;
1206
1116
  // ========================================
@@ -1270,14 +1180,17 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1270
1180
  // Sync state
1271
1181
  SyncStates = new Map();
1272
1182
  syncSubscriptions = new Map();
1183
+ // Filter panel state
1184
+ FilterPanelVisible = true;
1273
1185
  // ========================================
1274
1186
  // Lifecycle
1275
1187
  // ========================================
1276
1188
  destroy$ = new Subject();
1277
- constructor(cdr, router, navigationService, mcpToolsService) {
1189
+ constructor(cdr, router, route, navigationService, mcpToolsService) {
1278
1190
  super();
1279
1191
  this.cdr = cdr;
1280
1192
  this.router = router;
1193
+ this.route = route;
1281
1194
  this.navigationService = navigationService;
1282
1195
  this.mcpToolsService = mcpToolsService;
1283
1196
  // Set up debounced settings persistence
@@ -1287,6 +1200,8 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1287
1200
  }
1288
1201
  async ngOnInit() {
1289
1202
  await super.ngOnInit();
1203
+ // Check for OAuth completion redirect
1204
+ this.checkOAuthCompletion();
1290
1205
  // Load saved user preferences first
1291
1206
  this.loadUserPreferences();
1292
1207
  // Parse initial URL state
@@ -1402,6 +1317,10 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1402
1317
  toolStatus: prefs.toolStatus || 'all',
1403
1318
  logStatus: prefs.logStatus || 'all'
1404
1319
  });
1320
+ // Apply filter panel visibility
1321
+ if (prefs.filterPanelVisible !== undefined) {
1322
+ this.FilterPanelVisible = prefs.filterPanelVisible;
1323
+ }
1405
1324
  }
1406
1325
  /**
1407
1326
  * Get current preferences as an object for saving
@@ -1418,7 +1337,8 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1418
1337
  serverStatus: currentFilters.serverStatus,
1419
1338
  connectionStatus: currentFilters.connectionStatus,
1420
1339
  toolStatus: currentFilters.toolStatus,
1421
- logStatus: currentFilters.logStatus
1340
+ logStatus: currentFilters.logStatus,
1341
+ filterPanelVisible: this.FilterPanelVisible
1422
1342
  };
1423
1343
  }
1424
1344
  /**
@@ -1500,16 +1420,19 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1500
1420
  /**
1501
1421
  * Loads all dashboard data using MCPEngine for cached entities
1502
1422
  * and RunView for execution logs (historical data loaded on-demand)
1423
+ * @param forceRefresh - If true, forces MCPEngine to reload from database (use after sync operations)
1503
1424
  */
1504
- async loadAllData() {
1425
+ async loadAllData(forceRefresh = false) {
1505
1426
  this.IsLoading = true;
1506
1427
  this.ErrorMessage = null;
1507
1428
  this.cdr.detectChanges();
1508
1429
  try {
1509
1430
  // Initialize MCPEngine and load execution logs in parallel
1431
+ // forceRefresh=true is needed after sync operations since backend changes
1432
+ // won't trigger local BaseEntity events
1510
1433
  const rv = new RunView();
1511
1434
  const [, logsResult] = await Promise.all([
1512
- MCPEngine.Instance.Config(false),
1435
+ MCPEngine.Instance.Config(forceRefresh),
1513
1436
  rv.RunView({
1514
1437
  EntityName: 'MJ: MCP Tool Execution Logs',
1515
1438
  ExtraFilter: `StartedAt >= DATEADD(day, -7, GETUTCDATE())`,
@@ -1530,7 +1453,14 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1530
1453
  Status: s.Status,
1531
1454
  RateLimitPerMinute: s.RateLimitPerMinute,
1532
1455
  RateLimitPerHour: s.RateLimitPerHour,
1533
- LastSyncAt: s.LastSyncAt
1456
+ LastSyncAt: s.LastSyncAt,
1457
+ // OAuth configuration fields
1458
+ OAuthIssuerURL: s.OAuthIssuerURL,
1459
+ OAuthScopes: s.OAuthScopes,
1460
+ OAuthMetadataCacheTTLMinutes: s.OAuthMetadataCacheTTLMinutes,
1461
+ OAuthClientID: s.OAuthClientID,
1462
+ OAuthClientSecretEncrypted: s.OAuthClientSecretEncrypted,
1463
+ OAuthRequirePKCE: s.OAuthRequirePKCE
1534
1464
  }));
1535
1465
  this.connections = MCPEngine.Instance.Connections.map(c => ({
1536
1466
  ID: c.ID,
@@ -1739,6 +1669,64 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1739
1669
  this.saveUserPreferencesDebounced();
1740
1670
  }
1741
1671
  // ========================================
1672
+ // Filter Panel
1673
+ // ========================================
1674
+ /**
1675
+ * Toggle filter panel visibility
1676
+ */
1677
+ toggleFilterPanel() {
1678
+ this.FilterPanelVisible = !this.FilterPanelVisible;
1679
+ this.saveUserPreferencesDebounced();
1680
+ this.cdr.detectChanges();
1681
+ }
1682
+ /**
1683
+ * Handle filter changes from the filter panel component
1684
+ */
1685
+ onFiltersChange(filters) {
1686
+ this.filters$.next(filters);
1687
+ this.saveUserPreferencesDebounced();
1688
+ }
1689
+ /**
1690
+ * Get the current filtered count based on active tab
1691
+ */
1692
+ get CurrentFilteredCount() {
1693
+ switch (this.ActiveTab) {
1694
+ case 'servers':
1695
+ return this.filteredServers.length;
1696
+ case 'connections':
1697
+ return this.filteredConnections.length;
1698
+ case 'tools':
1699
+ return this.filteredTools.length;
1700
+ case 'logs':
1701
+ return this.filteredLogs.length;
1702
+ default:
1703
+ return 0;
1704
+ }
1705
+ }
1706
+ /**
1707
+ * Get the total count based on active tab
1708
+ */
1709
+ get CurrentTotalCount() {
1710
+ switch (this.ActiveTab) {
1711
+ case 'servers':
1712
+ return this.servers.length;
1713
+ case 'connections':
1714
+ return this.connections.length;
1715
+ case 'tools':
1716
+ return this.tools.length;
1717
+ case 'logs':
1718
+ return this.executionLogs.length;
1719
+ default:
1720
+ return 0;
1721
+ }
1722
+ }
1723
+ /**
1724
+ * Get current filters value (non-observable)
1725
+ */
1726
+ get CurrentFilters() {
1727
+ return this.filters$.value;
1728
+ }
1729
+ // ========================================
1742
1730
  // Tab Navigation
1743
1731
  // ========================================
1744
1732
  /**
@@ -1765,23 +1753,225 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1765
1753
  this.cdr.detectChanges();
1766
1754
  }
1767
1755
  async deleteServer(server) {
1768
- if (!confirm(`Are you sure you want to delete server "${server.Name}"?`)) {
1769
- return;
1756
+ // Check for related connections first
1757
+ const relatedConnections = this.connections.filter((c) => c.MCPServerID === server.ID);
1758
+ const relatedTools = this.tools.filter((t) => t.MCPServerID === server.ID);
1759
+ if (relatedConnections.length > 0 || relatedTools.length > 0) {
1760
+ const parts = [];
1761
+ if (relatedConnections.length > 0) {
1762
+ parts.push(`${relatedConnections.length} connection(s)`);
1763
+ }
1764
+ if (relatedTools.length > 0) {
1765
+ parts.push(`${relatedTools.length} tool(s)`);
1766
+ }
1767
+ if (!confirm(`Server "${server.Name}" has ${parts.join(' and ')}.\n\n` +
1768
+ `All related records will be deleted. Are you sure you want to proceed?`)) {
1769
+ return;
1770
+ }
1771
+ // Delete related connections first (which will cascade to connection tools/permissions)
1772
+ for (const conn of relatedConnections) {
1773
+ try {
1774
+ await this.deleteConnectionInternal(conn.ID);
1775
+ }
1776
+ catch (error) {
1777
+ this.ErrorMessage = `Failed to delete related connection "${conn.Name}": ${error instanceof Error ? error.message : String(error)}`;
1778
+ this.cdr.detectChanges();
1779
+ return;
1780
+ }
1781
+ }
1782
+ // Delete related tools
1783
+ for (const tool of relatedTools) {
1784
+ try {
1785
+ await this.deleteToolInternal(tool.ID);
1786
+ }
1787
+ catch (error) {
1788
+ this.ErrorMessage = `Failed to delete related tool "${tool.ToolName}": ${error instanceof Error ? error.message : String(error)}`;
1789
+ this.cdr.detectChanges();
1790
+ return;
1791
+ }
1792
+ }
1793
+ }
1794
+ else {
1795
+ if (!confirm(`Are you sure you want to delete server "${server.Name}"?`)) {
1796
+ return;
1797
+ }
1770
1798
  }
1771
1799
  try {
1772
1800
  const md = new Metadata();
1773
1801
  const entity = await md.GetEntityObject('MJ: MCP Servers');
1774
- const loaded = await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: server.ID }]));
1775
- if (loaded) {
1776
- await entity.Delete();
1777
- await this.loadAllData();
1802
+ const loaded = await entity.Load(server.ID);
1803
+ if (!loaded) {
1804
+ this.ErrorMessage = `Server not found: ${server.Name}`;
1805
+ this.cdr.detectChanges();
1806
+ return;
1807
+ }
1808
+ const deleted = await entity.Delete();
1809
+ if (!deleted) {
1810
+ const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Unknown error';
1811
+ this.ErrorMessage = `Failed to delete server: ${errorMsg}`;
1812
+ this.cdr.detectChanges();
1813
+ return;
1778
1814
  }
1815
+ await this.loadAllData();
1779
1816
  }
1780
1817
  catch (error) {
1781
1818
  this.ErrorMessage = `Failed to delete server: ${error instanceof Error ? error.message : String(error)}`;
1782
1819
  this.cdr.detectChanges();
1783
1820
  }
1784
1821
  }
1822
+ /**
1823
+ * Internal helper to delete a tool by ID without confirmation
1824
+ */
1825
+ async deleteToolInternal(toolId) {
1826
+ const md = new Metadata();
1827
+ const entity = await md.GetEntityObject('MJ: MCP Server Tools');
1828
+ const loaded = await entity.Load(toolId);
1829
+ if (!loaded) {
1830
+ throw new Error(`Tool not found`);
1831
+ }
1832
+ const deleted = await entity.Delete();
1833
+ if (!deleted) {
1834
+ const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';
1835
+ throw new Error(errorMsg);
1836
+ }
1837
+ }
1838
+ /**
1839
+ * Internal helper to delete a connection by ID without confirmation.
1840
+ * Handles deletion of all related records that don't have ON DELETE CASCADE:
1841
+ * - MCP Tool Execution Logs
1842
+ * - OAuth Authorization States
1843
+ * - OAuth Client Registrations
1844
+ * - OAuth Tokens
1845
+ */
1846
+ async deleteConnectionInternal(connectionId) {
1847
+ console.log(`[MCPDashboard] deleteConnectionInternal called for connectionId: ${connectionId}`);
1848
+ const rv = new RunView();
1849
+ const md = new Metadata();
1850
+ // Delete execution logs for this connection
1851
+ console.log('[MCPDashboard] Deleting execution logs...');
1852
+ const logsResult = await rv.RunView({
1853
+ EntityName: 'MJ: MCP Tool Execution Logs',
1854
+ ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
1855
+ Fields: ['ID'],
1856
+ ResultType: 'simple'
1857
+ });
1858
+ if (logsResult.Success && logsResult.Results) {
1859
+ console.log(`[MCPDashboard] Found ${logsResult.Results.length} execution logs to delete`);
1860
+ for (const log of logsResult.Results) {
1861
+ console.log(`[MCPDashboard] Loading execution log ${log.ID}...`);
1862
+ const logEntity = await md.GetEntityObject('MJ: MCP Tool Execution Logs');
1863
+ const loaded = await logEntity.Load(log.ID);
1864
+ console.log(`[MCPDashboard] Load result for execution log ${log.ID}: ${loaded}`);
1865
+ if (loaded) {
1866
+ const deleted = await logEntity.Delete();
1867
+ if (!deleted) {
1868
+ console.error(`[MCPDashboard] Failed to delete execution log ${log.ID}:`, logEntity.LatestResult);
1869
+ throw new Error(`Failed to delete execution log: ${logEntity.LatestResult?.Message || 'Unknown error'}`);
1870
+ }
1871
+ console.log(`[MCPDashboard] Deleted execution log ${log.ID}`);
1872
+ }
1873
+ else {
1874
+ console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);
1875
+ }
1876
+ }
1877
+ }
1878
+ // Delete OAuth Authorization States for this connection
1879
+ console.log('[MCPDashboard] Deleting OAuth Authorization States...');
1880
+ const authStatesResult = await rv.RunView({
1881
+ EntityName: 'MJ: O Auth Authorization States',
1882
+ ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
1883
+ Fields: ['ID'],
1884
+ ResultType: 'simple'
1885
+ });
1886
+ if (authStatesResult.Success && authStatesResult.Results) {
1887
+ console.log(`[MCPDashboard] Found ${authStatesResult.Results.length} OAuth Authorization States to delete`);
1888
+ for (const state of authStatesResult.Results) {
1889
+ console.log(`[MCPDashboard] Loading OAuth Authorization State ${state.ID}...`);
1890
+ const stateEntity = await md.GetEntityObject('MJ: O Auth Authorization States');
1891
+ const loaded = await stateEntity.Load(state.ID);
1892
+ console.log(`[MCPDashboard] Load result for OAuth Authorization State ${state.ID}: ${loaded}`);
1893
+ if (loaded) {
1894
+ const deleted = await stateEntity.Delete();
1895
+ if (!deleted) {
1896
+ console.error(`[MCPDashboard] Failed to delete OAuth Authorization State ${state.ID}:`, stateEntity.LatestResult);
1897
+ throw new Error(`Failed to delete OAuth Authorization State: ${stateEntity.LatestResult?.Message || 'Unknown error'}`);
1898
+ }
1899
+ console.log(`[MCPDashboard] Deleted OAuth Authorization State ${state.ID}`);
1900
+ }
1901
+ else {
1902
+ console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);
1903
+ }
1904
+ }
1905
+ }
1906
+ // Delete OAuth Client Registrations for this connection
1907
+ console.log('[MCPDashboard] Deleting OAuth Client Registrations...');
1908
+ const clientRegsResult = await rv.RunView({
1909
+ EntityName: 'MJ: O Auth Client Registrations',
1910
+ ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
1911
+ Fields: ['ID'],
1912
+ ResultType: 'simple'
1913
+ });
1914
+ if (clientRegsResult.Success && clientRegsResult.Results) {
1915
+ console.log(`[MCPDashboard] Found ${clientRegsResult.Results.length} OAuth Client Registrations to delete`);
1916
+ for (const reg of clientRegsResult.Results) {
1917
+ console.log(`[MCPDashboard] Loading OAuth Client Registration ${reg.ID}...`);
1918
+ const regEntity = await md.GetEntityObject('MJ: O Auth Client Registrations');
1919
+ const loaded = await regEntity.Load(reg.ID);
1920
+ console.log(`[MCPDashboard] Load result for OAuth Client Registration ${reg.ID}: ${loaded}`);
1921
+ if (loaded) {
1922
+ const deleted = await regEntity.Delete();
1923
+ if (!deleted) {
1924
+ console.error(`[MCPDashboard] Failed to delete OAuth Client Registration ${reg.ID}:`, regEntity.LatestResult);
1925
+ throw new Error(`Failed to delete OAuth Client Registration: ${regEntity.LatestResult?.Message || 'Unknown error'}`);
1926
+ }
1927
+ console.log(`[MCPDashboard] Deleted OAuth Client Registration ${reg.ID}`);
1928
+ }
1929
+ else {
1930
+ console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);
1931
+ }
1932
+ }
1933
+ }
1934
+ // Delete OAuth Tokens for this connection
1935
+ console.log('[MCPDashboard] Deleting OAuth Tokens...');
1936
+ const tokensResult = await rv.RunView({
1937
+ EntityName: 'MJ: O Auth Tokens',
1938
+ ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
1939
+ Fields: ['ID'],
1940
+ ResultType: 'simple'
1941
+ });
1942
+ if (tokensResult.Success && tokensResult.Results) {
1943
+ console.log(`[MCPDashboard] Found ${tokensResult.Results.length} OAuth Tokens to delete`);
1944
+ for (const token of tokensResult.Results) {
1945
+ console.log(`[MCPDashboard] Loading OAuth Token ${token.ID}...`);
1946
+ const tokenEntity = await md.GetEntityObject('MJ: O Auth Tokens');
1947
+ const loaded = await tokenEntity.Load(token.ID);
1948
+ console.log(`[MCPDashboard] Load result for OAuth Token ${token.ID}: ${loaded}`);
1949
+ if (loaded) {
1950
+ const deleted = await tokenEntity.Delete();
1951
+ if (!deleted) {
1952
+ console.error(`[MCPDashboard] Failed to delete OAuth Token ${token.ID}:`, tokenEntity.LatestResult);
1953
+ throw new Error(`Failed to delete OAuth Token: ${tokenEntity.LatestResult?.Message || 'Unknown error'}`);
1954
+ }
1955
+ console.log(`[MCPDashboard] Deleted OAuth Token ${token.ID}`);
1956
+ }
1957
+ else {
1958
+ console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);
1959
+ }
1960
+ }
1961
+ }
1962
+ // Now delete the connection itself
1963
+ console.log('[MCPDashboard] All related records deleted. Now deleting the connection itself...');
1964
+ const entity = await md.GetEntityObject('MJ: MCP Server Connections');
1965
+ const loaded = await entity.Load(connectionId);
1966
+ if (!loaded) {
1967
+ throw new Error(`Connection not found`);
1968
+ }
1969
+ const deleted = await entity.Delete();
1970
+ if (!deleted) {
1971
+ const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';
1972
+ throw new Error(errorMsg);
1973
+ }
1974
+ }
1785
1975
  async onServerDialogClose(result) {
1786
1976
  this.ShowServerDialog = false;
1787
1977
  this.EditingServer = null;
@@ -1804,18 +1994,24 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
1804
1994
  this.cdr.detectChanges();
1805
1995
  }
1806
1996
  async deleteConnection(connection) {
1807
- if (!confirm(`Are you sure you want to delete connection "${connection.Name}"?`)) {
1808
- return;
1997
+ // Check for related execution logs
1998
+ const relatedLogs = this.executionLogs.filter(l => l.ConnectionID === connection.ID);
1999
+ if (relatedLogs.length > 0) {
2000
+ if (!confirm(`Connection "${connection.Name}" has ${relatedLogs.length} execution log(s).\n\n` +
2001
+ `All related logs will be deleted. Are you sure you want to proceed?`)) {
2002
+ return;
2003
+ }
1809
2004
  }
1810
- try {
1811
- const md = new Metadata();
1812
- const entity = await md.GetEntityObject('MJ: MCP Server Connections');
1813
- const loaded = await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: connection.ID }]));
1814
- if (loaded) {
1815
- await entity.Delete();
1816
- await this.loadAllData();
2005
+ else {
2006
+ if (!confirm(`Are you sure you want to delete connection "${connection.Name}"?`)) {
2007
+ return;
1817
2008
  }
1818
2009
  }
2010
+ try {
2011
+ // Use the internal method which handles deleting related records
2012
+ await this.deleteConnectionInternal(connection.ID);
2013
+ await this.loadAllData();
2014
+ }
1819
2015
  catch (error) {
1820
2016
  this.ErrorMessage = `Failed to delete connection: ${error instanceof Error ? error.message : String(error)}`;
1821
2017
  this.cdr.detectChanges();
@@ -2044,8 +2240,15 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2044
2240
  try {
2045
2241
  const result = await this.mcpToolsService.syncTools(connectionId);
2046
2242
  if (result.Success) {
2047
- // Reload data to show updated tools
2048
- await this.loadAllData();
2243
+ // Force refresh to show updated tools - backend changes don't trigger local events
2244
+ await this.loadAllData(true);
2245
+ }
2246
+ else if (result.RequiresOAuth || result.RequiresReauthorization) {
2247
+ // OAuth authorization is required - initiate fresh OAuth flow with frontend callback
2248
+ // Note: We ignore result.AuthorizationUrl because it was built with the server's callback URL
2249
+ // We need to initiate a fresh flow that uses the frontend callback URL
2250
+ console.log(`[MCPDashboard] OAuth ${result.RequiresReauthorization ? 're-' : ''}authorization required, initiating frontend OAuth flow...`);
2251
+ await this.initiateOAuthFlow(connectionId);
2049
2252
  }
2050
2253
  else {
2051
2254
  this.ErrorMessage = `Sync failed: ${result.ErrorMessage}`;
@@ -2078,6 +2281,116 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2078
2281
  return state.progress.message;
2079
2282
  }
2080
2283
  // ========================================
2284
+ // OAuth Operations
2285
+ // ========================================
2286
+ /**
2287
+ * Checks for OAuth completion by looking for query params set by the OAuth callback
2288
+ */
2289
+ checkOAuthCompletion() {
2290
+ const params = this.route.snapshot.queryParams;
2291
+ if (params['oauth'] === 'success') {
2292
+ // OAuth completed successfully
2293
+ const connectionId = params['connectionId'];
2294
+ console.log(`[MCPDashboard] OAuth authorization completed for connection: ${connectionId}`);
2295
+ // Show success notification
2296
+ this.showSuccessNotification('OAuth authorization completed successfully');
2297
+ // Clear the query params without triggering a full navigation
2298
+ this.router.navigate([], {
2299
+ relativeTo: this.route,
2300
+ queryParams: {},
2301
+ queryParamsHandling: 'merge',
2302
+ replaceUrl: true
2303
+ });
2304
+ // Refresh data to pick up new OAuth state
2305
+ this.loadAllData(true);
2306
+ }
2307
+ else if (params['oauth'] === 'error') {
2308
+ // OAuth failed
2309
+ const errorCode = params['error'] || 'unknown_error';
2310
+ const errorMessage = params['error_description'] || 'Authorization failed';
2311
+ console.error(`[MCPDashboard] OAuth authorization failed: ${errorCode} - ${errorMessage}`);
2312
+ // Show error message
2313
+ this.ErrorMessage = `OAuth authorization failed: ${errorMessage}`;
2314
+ // Clear the query params
2315
+ this.router.navigate([], {
2316
+ relativeTo: this.route,
2317
+ queryParams: {},
2318
+ queryParamsHandling: 'merge',
2319
+ replaceUrl: true
2320
+ });
2321
+ }
2322
+ }
2323
+ /**
2324
+ * Shows a success notification (temporary)
2325
+ */
2326
+ showSuccessNotification(message) {
2327
+ // For now, use a simple console log and clear any error message
2328
+ console.log(`[MCPDashboard] Success: ${message}`);
2329
+ this.ErrorMessage = null;
2330
+ // TODO: Implement proper toast/notification system
2331
+ }
2332
+ /**
2333
+ * Initiates OAuth authorization flow for a connection.
2334
+ * Stores the current URL and redirects directly to the OAuth provider.
2335
+ * Always uses the frontend callback URL so the OAuth redirect comes back to MJExplorer.
2336
+ *
2337
+ * @param connectionId - The MCP connection ID requiring OAuth
2338
+ */
2339
+ async initiateOAuthFlow(connectionId) {
2340
+ // Store current URL for return after OAuth completion
2341
+ // Store both full URL and path-only version for cross-origin scenarios
2342
+ const currentUrl = window.location.href;
2343
+ const currentPath = window.location.pathname + window.location.search;
2344
+ // Store in both localStorage and sessionStorage for redundancy
2345
+ localStorage.setItem('oauth_return_url', currentUrl);
2346
+ localStorage.setItem('oauth_return_path', currentPath);
2347
+ sessionStorage.setItem('oauth_return_url', currentUrl);
2348
+ sessionStorage.setItem('oauth_return_path', currentPath);
2349
+ console.log('[MCPDashboard] Stored OAuth return URL:', currentUrl);
2350
+ console.log('[MCPDashboard] Stored OAuth return path:', currentPath);
2351
+ // Initiate OAuth via GraphQL to get the URL with frontend callback
2352
+ const result = await this.initiateMCPOAuth(connectionId);
2353
+ if (result.Success && result.AuthorizationUrl) {
2354
+ console.log('[MCPDashboard] Redirecting to OAuth provider:', result.AuthorizationUrl);
2355
+ window.location.href = result.AuthorizationUrl;
2356
+ }
2357
+ else {
2358
+ this.ErrorMessage = result.ErrorMessage || 'Failed to initiate OAuth authorization';
2359
+ this.cdr.detectChanges();
2360
+ }
2361
+ }
2362
+ /**
2363
+ * Calls the InitiateMCPOAuth mutation with frontend callback URL
2364
+ */
2365
+ async initiateMCPOAuth(connectionId) {
2366
+ try {
2367
+ const { GraphQLDataProvider, gql } = await import('@memberjunction/graphql-dataprovider');
2368
+ const mutation = gql `
2369
+ mutation InitiateMCPOAuth($input: InitiateMCPOAuthInput!) {
2370
+ InitiateMCPOAuth(input: $input) {
2371
+ Success
2372
+ ErrorMessage
2373
+ AuthorizationUrl
2374
+ StateParameter
2375
+ }
2376
+ }
2377
+ `;
2378
+ // Use the frontend callback URL so we handle the OAuth redirect
2379
+ const frontendCallbackUrl = `${window.location.origin}/oauth/callback`;
2380
+ const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {
2381
+ input: {
2382
+ ConnectionID: connectionId,
2383
+ FrontendCallbackUrl: frontendCallbackUrl
2384
+ }
2385
+ });
2386
+ return result?.InitiateMCPOAuth || { Success: false, ErrorMessage: 'No result returned' };
2387
+ }
2388
+ catch (error) {
2389
+ const message = error instanceof Error ? error.message : String(error);
2390
+ return { Success: false, ErrorMessage: message };
2391
+ }
2392
+ }
2393
+ // ========================================
2081
2394
  // Utility Methods
2082
2395
  // ========================================
2083
2396
  getStatusClass(status) {
@@ -2330,95 +2643,79 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2330
2643
  this.ShowTestToolDialog = true;
2331
2644
  this.cdr.detectChanges();
2332
2645
  }
2333
- static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i3.MCPToolsService)); };
2334
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 75, vars: 35, consts: [[1, "mcp-dashboard"], [1, "sidebar"], [1, "sidebar-header"], [1, "fa-solid", "fa-plug-circle-bolt"], [1, "sidebar-title"], [1, "sidebar-nav"], [1, "nav-item", 3, "click"], [1, "fa-solid", "fa-server"], [1, "nav-label"], [1, "nav-badge"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-wrench"], [1, "fa-solid", "fa-list-check"], [1, "sidebar-stats"], [1, "stat-row"], [1, "stat-label"], [1, "stat-value"], [1, "stat-row", "error"], [1, "sidebar-footer"], ["kendoButton", "", "fillMode", "flat", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], [1, "main-content"], [1, "error-banner"], [1, "content-header"], [1, "content-title"], [1, "header-actions"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search...", 3, "ngModelChange", "ngModel"], [1, "status-filter", 3, "ngModel"], [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"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "status-filter", 3, "ngModelChange", "ngModel"], ["value", "all"], ["value", "Active"], ["value", "Inactive"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["value", "Error"], ["value", "Deprecated"], [1, "view-toggle"], ["kendoButton", "", "fillMode", "flat", "title", "Card View", 3, "click"], [1, "fa-solid", "fa-grip"], ["kendoButton", "", "fillMode", "flat", "title", "List View", 3, "click"], [1, "fa-solid", "fa-list"], ["value", "server"], ["value", "name"], ["value", "discovered"], ["value", "lastSeen"], [1, "fa-solid", "fa-play"], ["value", "Success"], ["value", "Running"], [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"], ["kendoButton", "", "fillMode", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test this tool", 3, "click"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test", 3, "click"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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) {
2335
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
2336
- i0.ɵɵelement(3, "i", 3);
2337
- i0.ɵɵelementStart(4, "span", 4);
2338
- i0.ɵɵtext(5, "MCP");
2339
- i0.ɵɵelementEnd()();
2340
- i0.ɵɵelementStart(6, "nav", 5)(7, "button", 6);
2341
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_7_listener() { return ctx.setActiveTab("servers"); });
2342
- i0.ɵɵelement(8, "i", 7);
2343
- i0.ɵɵelementStart(9, "span", 8);
2344
- i0.ɵɵtext(10, "Servers");
2646
+ static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i3.MCPToolsService)); };
2647
+ 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"], ["kendoButton", "", "themeColor", "primary"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "themeColor", "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"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test this tool", 3, "click"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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"], ["kendoButton", "", "fillMode", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test", 3, "click"], ["kendoButton", "", "fillMode", "flat", "size", "small", "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) {
2648
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
2649
+ i0.ɵɵelement(4, "i", 4);
2650
+ i0.ɵɵtext(5, " MCP Dashboard ");
2345
2651
  i0.ɵɵelementEnd();
2346
- i0.ɵɵelementStart(11, "span", 9);
2347
- i0.ɵɵtext(12);
2348
- i0.ɵɵelementEnd()();
2349
- i0.ɵɵelementStart(13, "button", 6);
2350
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_13_listener() { return ctx.setActiveTab("connections"); });
2351
- i0.ɵɵelement(14, "i", 10);
2352
- i0.ɵɵelementStart(15, "span", 8);
2353
- i0.ɵɵtext(16, "Connections");
2652
+ i0.ɵɵelementStart(6, "button", 5);
2653
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_6_listener() { return ctx.toggleFilterPanel(); });
2654
+ i0.ɵɵelement(7, "i", 6);
2655
+ i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_8_Template, 1, 0)(9, MCPDashboardComponent_Conditional_9_Template, 1, 0);
2354
2656
  i0.ɵɵelementEnd();
2355
- i0.ɵɵelementStart(17, "span", 9);
2356
- i0.ɵɵtext(18);
2657
+ i0.ɵɵelementStart(10, "span", 7);
2658
+ i0.ɵɵtext(11);
2357
2659
  i0.ɵɵelementEnd()();
2358
- i0.ɵɵelementStart(19, "button", 6);
2359
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_19_listener() { return ctx.setActiveTab("tools"); });
2360
- i0.ɵɵelement(20, "i", 11);
2361
- i0.ɵɵelementStart(21, "span", 8);
2362
- i0.ɵɵtext(22, "Tools");
2660
+ i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "button", 10);
2661
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_14_listener() { return ctx.setActiveTab("servers"); });
2662
+ i0.ɵɵelement(15, "i", 11);
2663
+ i0.ɵɵelementStart(16, "span", 12);
2664
+ i0.ɵɵtext(17, "Servers");
2363
2665
  i0.ɵɵelementEnd();
2364
- i0.ɵɵelementStart(23, "span", 9);
2365
- i0.ɵɵtext(24);
2666
+ i0.ɵɵelementStart(18, "span", 13);
2667
+ i0.ɵɵtext(19);
2366
2668
  i0.ɵɵelementEnd()();
2367
- i0.ɵɵelementStart(25, "button", 6);
2368
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_25_listener() { return ctx.setActiveTab("logs"); });
2369
- i0.ɵɵelement(26, "i", 12);
2370
- i0.ɵɵelementStart(27, "span", 8);
2371
- i0.ɵɵtext(28, "Logs");
2669
+ i0.ɵɵelementStart(20, "button", 10);
2670
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_20_listener() { return ctx.setActiveTab("connections"); });
2671
+ i0.ɵɵelement(21, "i", 14);
2672
+ i0.ɵɵelementStart(22, "span", 12);
2673
+ i0.ɵɵtext(23, "Connections");
2372
2674
  i0.ɵɵelementEnd();
2373
- i0.ɵɵelementStart(29, "span", 9);
2374
- i0.ɵɵtext(30);
2375
- i0.ɵɵelementEnd()()();
2376
- i0.ɵɵelementStart(31, "div", 13)(32, "div", 14)(33, "span", 15);
2377
- i0.ɵɵtext(34, "Active Servers");
2378
- i0.ɵɵelementEnd();
2379
- i0.ɵɵelementStart(35, "span", 16);
2380
- i0.ɵɵtext(36);
2675
+ i0.ɵɵelementStart(24, "span", 13);
2676
+ i0.ɵɵtext(25);
2381
2677
  i0.ɵɵelementEnd()();
2382
- i0.ɵɵelementStart(37, "div", 14)(38, "span", 15);
2383
- i0.ɵɵtext(39, "Active Connections");
2678
+ i0.ɵɵelementStart(26, "button", 10);
2679
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_26_listener() { return ctx.setActiveTab("tools"); });
2680
+ i0.ɵɵelement(27, "i", 15);
2681
+ i0.ɵɵelementStart(28, "span", 12);
2682
+ i0.ɵɵtext(29, "Tools");
2384
2683
  i0.ɵɵelementEnd();
2385
- i0.ɵɵelementStart(40, "span", 16);
2386
- i0.ɵɵtext(41);
2684
+ i0.ɵɵelementStart(30, "span", 13);
2685
+ i0.ɵɵtext(31);
2387
2686
  i0.ɵɵelementEnd()();
2388
- i0.ɵɵelementStart(42, "div", 14)(43, "span", 15);
2389
- i0.ɵɵtext(44, "Active Tools");
2687
+ i0.ɵɵelementStart(32, "button", 10);
2688
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_32_listener() { return ctx.setActiveTab("logs"); });
2689
+ i0.ɵɵelement(33, "i", 16);
2690
+ i0.ɵɵelementStart(34, "span", 12);
2691
+ i0.ɵɵtext(35, "Logs");
2390
2692
  i0.ɵɵelementEnd();
2391
- i0.ɵɵelementStart(45, "span", 16);
2392
- i0.ɵɵtext(46);
2693
+ i0.ɵɵelementStart(36, "span", 13);
2694
+ i0.ɵɵtext(37);
2695
+ i0.ɵɵelementEnd()()();
2696
+ i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Case_38_Template, 3, 0, "button", 17)(39, MCPDashboardComponent_Case_39_Template, 3, 0, "button", 17)(40, MCPDashboardComponent_Case_40_Template, 8, 4)(41, MCPDashboardComponent_Case_41_Template, 3, 3, "button", 18);
2393
2697
  i0.ɵɵelementEnd()();
2394
- i0.ɵɵtemplate(47, MCPDashboardComponent_Conditional_47_Template, 5, 1, "div", 17);
2698
+ i0.ɵɵelementStart(42, "div", 19)(43, "div", 20)(44, "mj-mcp-filter-panel", 21);
2699
+ i0.ɵɵlistener("filtersChange", function MCPDashboardComponent_Template_mj_mcp_filter_panel_filtersChange_44_listener($event) { return ctx.onFiltersChange($event); })("closePanel", function MCPDashboardComponent_Template_mj_mcp_filter_panel_closePanel_44_listener() { return ctx.toggleFilterPanel(); });
2395
2700
  i0.ɵɵelementEnd();
2396
- i0.ɵɵelementStart(48, "div", 18)(49, "button", 19);
2397
- i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_49_listener() { return ctx.loadAllData(); });
2398
- i0.ɵɵelement(50, "i", 20);
2399
- i0.ɵɵelementEnd()()();
2400
- i0.ɵɵelementStart(51, "div", 21);
2401
- i0.ɵɵtemplate(52, MCPDashboardComponent_Conditional_52_Template, 5, 1, "div", 22);
2402
- i0.ɵɵelementStart(53, "div", 23)(54, "h2", 24);
2403
- i0.ɵɵtemplate(55, MCPDashboardComponent_Case_55_Template, 1, 0)(56, MCPDashboardComponent_Case_56_Template, 1, 0)(57, MCPDashboardComponent_Case_57_Template, 1, 0)(58, MCPDashboardComponent_Case_58_Template, 1, 0);
2701
+ i0.ɵɵelement(45, "div", 22);
2404
2702
  i0.ɵɵelementEnd();
2405
- i0.ɵɵelementStart(59, "div", 25)(60, "div", 26);
2406
- i0.ɵɵelement(61, "i", 27);
2407
- i0.ɵɵelementStart(62, "input", 28);
2408
- i0.ɵɵpipe(63, "async");
2409
- i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Template_input_ngModelChange_62_listener($event) { return ctx.onSearchChange($event); });
2410
- i0.ɵɵelementEnd()();
2411
- i0.ɵɵtemplate(64, MCPDashboardComponent_Case_64_Template, 11, 3)(65, MCPDashboardComponent_Case_65_Template, 13, 3)(66, MCPDashboardComponent_Case_66_Template, 25, 8)(67, MCPDashboardComponent_Case_67_Template, 10, 3, "select", 29);
2412
- i0.ɵɵelementEnd()();
2413
- i0.ɵɵelementStart(68, "div", 30);
2414
- i0.ɵɵtemplate(69, MCPDashboardComponent_Conditional_69_Template, 1, 0, "mj-loading", 31)(70, MCPDashboardComponent_Conditional_70_Template, 4, 1);
2415
- i0.ɵɵelementEnd()()();
2416
- i0.ɵɵtemplate(71, MCPDashboardComponent_Conditional_71_Template, 1, 2, "mj-mcp-server-dialog", 32)(72, MCPDashboardComponent_Conditional_72_Template, 1, 3, "mj-mcp-connection-dialog", 33)(73, MCPDashboardComponent_Conditional_73_Template, 1, 7, "mj-mcp-test-tool-dialog", 34)(74, MCPDashboardComponent_Conditional_74_Template, 1, 2, "mj-mcp-log-detail-panel", 35);
2703
+ i0.ɵɵelementStart(46, "div", 23);
2704
+ i0.ɵɵconditionalCreate(47, MCPDashboardComponent_Conditional_47_Template, 5, 1, "div", 24);
2705
+ i0.ɵɵelementStart(48, "div", 25);
2706
+ i0.ɵɵconditionalCreate(49, MCPDashboardComponent_Conditional_49_Template, 1, 0, "mj-loading", 26)(50, MCPDashboardComponent_Conditional_50_Template, 4, 1);
2707
+ i0.ɵɵelementEnd()()()();
2708
+ i0.ɵɵconditionalCreate(51, MCPDashboardComponent_Conditional_51_Template, 1, 2, "mj-mcp-server-dialog", 27);
2709
+ i0.ɵɵconditionalCreate(52, MCPDashboardComponent_Conditional_52_Template, 1, 3, "mj-mcp-connection-dialog", 28);
2710
+ i0.ɵɵconditionalCreate(53, MCPDashboardComponent_Conditional_53_Template, 1, 7, "mj-mcp-test-tool-dialog", 29);
2711
+ i0.ɵɵconditionalCreate(54, MCPDashboardComponent_Conditional_54_Template, 1, 2, "mj-mcp-log-detail-panel", 30);
2417
2712
  } if (rf & 2) {
2418
- let tmp_16_0;
2419
- let tmp_17_0;
2420
- let tmp_18_0;
2421
- i0.ɵɵadvance(7);
2713
+ let tmp_11_0;
2714
+ i0.ɵɵadvance(8);
2715
+ i0.ɵɵconditional(ctx.FilterPanelVisible ? 8 : 9);
2716
+ i0.ɵɵadvance(3);
2717
+ i0.ɵɵtextInterpolate2("", ctx.CurrentFilteredCount, " of ", ctx.CurrentTotalCount, " items");
2718
+ i0.ɵɵadvance(3);
2422
2719
  i0.ɵɵclassProp("active", ctx.ActiveTab === "servers");
2423
2720
  i0.ɵɵadvance(5);
2424
2721
  i0.ɵɵtextInterpolate(ctx.servers.length);
@@ -2436,37 +2733,25 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
2436
2733
  i0.ɵɵclassProp("has-errors", ctx.stats.failedExecutions > 0);
2437
2734
  i0.ɵɵadvance();
2438
2735
  i0.ɵɵtextInterpolate(ctx.executionLogs.length);
2439
- i0.ɵɵadvance(6);
2440
- i0.ɵɵtextInterpolate2("", ctx.stats.activeServers, "/", ctx.stats.totalServers, "");
2441
- i0.ɵɵadvance(5);
2442
- i0.ɵɵtextInterpolate2("", ctx.stats.activeConnections, "/", ctx.stats.totalConnections, "");
2443
- i0.ɵɵadvance(5);
2444
- i0.ɵɵtextInterpolate2("", ctx.stats.activeTools, "/", ctx.stats.totalTools, "");
2445
2736
  i0.ɵɵadvance();
2446
- i0.ɵɵconditional(ctx.stats.failedExecutions > 0 ? 47 : -1);
2447
- i0.ɵɵadvance(2);
2448
- i0.ɵɵproperty("disabled", ctx.IsLoading);
2737
+ i0.ɵɵconditional((tmp_11_0 = ctx.ActiveTab) === "servers" ? 38 : tmp_11_0 === "connections" ? 39 : tmp_11_0 === "tools" ? 40 : tmp_11_0 === "logs" ? 41 : -1);
2738
+ i0.ɵɵadvance(5);
2739
+ i0.ɵɵclassProp("hidden", !ctx.FilterPanelVisible);
2449
2740
  i0.ɵɵadvance();
2450
- i0.ɵɵclassProp("fa-spin", ctx.IsLoading);
2451
- i0.ɵɵadvance(2);
2452
- i0.ɵɵconditional(ctx.ErrorMessage ? 52 : -1);
2741
+ i0.ɵɵproperty("filters", ctx.CurrentFilters)("activeTab", ctx.ActiveTab)("totalCount", ctx.CurrentTotalCount)("filteredCount", ctx.CurrentFilteredCount);
2453
2742
  i0.ɵɵadvance(3);
2454
- i0.ɵɵconditional((tmp_16_0 = ctx.ActiveTab) === "servers" ? 55 : tmp_16_0 === "connections" ? 56 : tmp_16_0 === "tools" ? 57 : tmp_16_0 === "logs" ? 58 : -1);
2455
- i0.ɵɵadvance(7);
2456
- i0.ɵɵproperty("ngModel", (tmp_17_0 = i0.ɵɵpipeBind1(63, 33, ctx.filters$)) == null ? null : tmp_17_0.searchTerm);
2743
+ i0.ɵɵconditional(ctx.ErrorMessage ? 47 : -1);
2457
2744
  i0.ɵɵadvance(2);
2458
- i0.ɵɵconditional((tmp_18_0 = ctx.ActiveTab) === "servers" ? 64 : tmp_18_0 === "connections" ? 65 : tmp_18_0 === "tools" ? 66 : tmp_18_0 === "logs" ? 67 : -1);
2459
- i0.ɵɵadvance(5);
2460
- i0.ɵɵconditional(ctx.IsLoading ? 69 : 70);
2745
+ i0.ɵɵconditional(ctx.IsLoading ? 49 : 50);
2461
2746
  i0.ɵɵadvance(2);
2462
- i0.ɵɵconditional(ctx.ShowServerDialog ? 71 : -1);
2747
+ i0.ɵɵconditional(ctx.ShowServerDialog ? 51 : -1);
2463
2748
  i0.ɵɵadvance();
2464
- i0.ɵɵconditional(ctx.ShowConnectionDialog ? 72 : -1);
2749
+ i0.ɵɵconditional(ctx.ShowConnectionDialog ? 52 : -1);
2465
2750
  i0.ɵɵadvance();
2466
- i0.ɵɵconditional(ctx.ShowTestToolDialog ? 73 : -1);
2751
+ i0.ɵɵconditional(ctx.ShowTestToolDialog ? 53 : -1);
2467
2752
  i0.ɵɵadvance();
2468
- i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ? 74 : -1);
2469
- } }, styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 220px;\n min-width: 220px;\n background: white;\n border-right: 1px solid #e0e0e0;\n box-shadow: 2px 0 4px rgba(0, 0, 0, 0.04);\n}\n\n.sidebar-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 16px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.sidebar-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n\n\n.sidebar-nav[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n flex: 1;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 4px;\n background: none;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n text-align: left;\n width: 100%;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.08);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.12);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n font-size: 16px;\n}\n\n.nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.nav-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.nav-item.active[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.nav-badge.has-errors[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n}\n\n\n\n.sidebar-stats[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n}\n\n.stat-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.stat-row[_ngcontent-%COMP%] .stat-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.stat-row[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.stat-row.error[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.sidebar-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 12px;\n border-top: 1px solid #e0e0e0;\n}\n\n\n\n\n\n.main-content[_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-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.search-box[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f5f5;\n border-radius: 6px;\n min-width: 200px;\n}\n\n.search-box[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: none;\n outline: none;\n font-size: 14px;\n}\n\n.status-filter[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\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: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\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: #c62828;\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 #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\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: #fafafa;\n border-bottom: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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-color, #666);\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: #f44336;\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-color, #333);\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: #f5f5f5;\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: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\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: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\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: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\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 #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #f5f5f5;\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: rgba(244, 67, 54, 0.05);\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-primary-color, #2196f3);\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: #f44336;\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\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: #f0f0f0;\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: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: #999;\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-primary-color, #2196f3);\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: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #e0e0e0;\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-color, #333);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid #e0e0e0;\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-primary-color, #2196f3);\n color: white;\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: white;\n border: 1px solid #e0e0e0;\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: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\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: #999;\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-color, #333);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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 #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\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-primary-color, #2196f3);\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-color, #333);\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: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\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-color, #666);\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 #f0f0f0;\n background: #fafafa;\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\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-color, #666);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\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 #f0f0f0;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #fafafa;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.04);\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-primary-color, #2196f3);\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-color, #333);\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-color, #666);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\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: #fafafa;\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 #e0e0e0;\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-color, #666);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\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 #e0e0e0;\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\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 #e0e0e0;\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: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\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: #f0f0f0;\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\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-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\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-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\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-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\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: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\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-color, #333);\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-color, #666);\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: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
2753
+ i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ? 54 : -1);
2754
+ } }, styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\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: white;\n border-bottom: 1px solid #e0e0e0;\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-color, #333);\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\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: #f5f5f5;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e8e8e8;\n border-color: #d0d0d0;\n color: var(--mj-text-color, #333);\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-color, #666);\n padding: 4px 10px;\n background: #f5f5f5;\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: #f5f5f5;\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-color, #666);\n transition: all 0.2s ease;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.7);\n color: var(--mj-text-color, #333);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: var(--mj-primary-color, #2196f3);\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: #e0e0e0;\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.tab-btn.active[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.15);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tab-badge.has-errors[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\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: white;\n border-right: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\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: #c62828;\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 #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\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: #fafafa;\n border-bottom: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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-color, #666);\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: #f44336;\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-color, #333);\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: #f5f5f5;\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: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\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: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\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: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\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 #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #f5f5f5;\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: rgba(244, 67, 54, 0.05);\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-primary-color, #2196f3);\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: #f44336;\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\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: #f0f0f0;\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: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: #999;\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-primary-color, #2196f3);\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: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #e0e0e0;\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-color, #333);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid #e0e0e0;\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-primary-color, #2196f3);\n color: white;\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: white;\n border: 1px solid #e0e0e0;\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: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\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: #999;\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-color, #333);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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 #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\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-primary-color, #2196f3);\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-color, #333);\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: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\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-color, #666);\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 #f0f0f0;\n background: #fafafa;\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\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-color, #666);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\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 #f0f0f0;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #fafafa;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.04);\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-primary-color, #2196f3);\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-color, #333);\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-color, #666);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\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: #fafafa;\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 #e0e0e0;\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-color, #666);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\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 #e0e0e0;\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\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 #e0e0e0;\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: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\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: #f0f0f0;\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\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-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\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-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\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-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\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: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\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-color, #333);\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-color, #666);\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: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
2470
2755
  };
2471
2756
  MCPDashboardComponent = __decorate([
2472
2757
  RegisterClass(BaseDashboard, 'MCPDashboard')
@@ -2474,13 +2759,7 @@ MCPDashboardComponent = __decorate([
2474
2759
  export { MCPDashboardComponent };
2475
2760
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPDashboardComponent, [{
2476
2761
  type: Component,
2477
- args: [{ selector: 'mj-mcp-dashboard', template: "<div class=\"mcp-dashboard\">\n <!-- Left Sidebar Navigation -->\n <div class=\"sidebar\">\n <div class=\"sidebar-header\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n <span class=\"sidebar-title\">MCP</span>\n </div>\n\n <nav class=\"sidebar-nav\">\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'servers'\" (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"nav-label\">Servers</span>\n <span class=\"nav-badge\">{{ servers.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'connections'\" (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"nav-label\">Connections</span>\n <span class=\"nav-badge\">{{ connections.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'tools'\" (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"nav-label\">Tools</span>\n <span class=\"nav-badge\">{{ tools.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'logs'\" (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"nav-label\">Logs</span>\n <span class=\"nav-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </nav>\n\n <!-- Sidebar Stats Summary -->\n <div class=\"sidebar-stats\">\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Servers</span>\n <span class=\"stat-value\">{{ stats.activeServers }}/{{ stats.totalServers }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Connections</span>\n <span class=\"stat-value\">{{ stats.activeConnections }}/{{ stats.totalConnections }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Tools</span>\n <span class=\"stat-value\">{{ stats.activeTools }}/{{ stats.totalTools }}</span>\n </div>\n @if (stats.failedExecutions > 0) {\n <div class=\"stat-row error\">\n <span class=\"stat-label\">Failed (7d)</span>\n <span class=\"stat-value\">{{ stats.failedExecutions }}</span>\n </div>\n }\n </div>\n\n <div class=\"sidebar-footer\">\n <button kendoButton fillMode=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\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 Header with Search and Filters -->\n <div class=\"content-header\">\n <h2 class=\"content-title\">\n @switch (ActiveTab) {\n @case ('servers') { MCP Servers }\n @case ('connections') { Server Connections }\n @case ('tools') { Available Tools }\n @case ('logs') { Execution Logs }\n }\n </h2>\n\n <div class=\"header-actions\">\n <!-- Search -->\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search...\"\n [ngModel]=\"(filters$ | async)?.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\">\n </div>\n\n <!-- Status Filter -->\n @switch (ActiveTab) {\n @case ('servers') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.serverStatus\"\n (ngModelChange)=\"onStatusFilterChange('server', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.connectionStatus\"\n (ngModelChange)=\"onStatusFilterChange('connection', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n <option value=\"Error\">Error</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.toolStatus\"\n (ngModelChange)=\"onStatusFilterChange('tool', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Deprecated\">Deprecated</option>\n </select>\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button kendoButton\n fillMode=\"flat\"\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 kendoButton\n fillMode=\"flat\"\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 <!-- Sort Dropdown -->\n <select class=\"status-filter\"\n [(ngModel)]=\"ToolsSortBy\"\n (ngModelChange)=\"setToolsSort($event)\">\n <option value=\"server\">Sort by Server</option>\n <option value=\"name\">Sort by Name</option>\n <option value=\"discovered\">Sort by Discovered</option>\n <option value=\"lastSeen\">Sort by Last Seen</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.logStatus\"\n (ngModelChange)=\"onStatusFilterChange('log', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Success\">Success</option>\n <option value=\"Error\">Error</option>\n <option value=\"Running\">Running</option>\n </select>\n }\n }\n </div>\n </div>\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 kendoButton themeColor=\"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 kendoButton fillMode=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"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 kendoButton\n fillMode=\"flat\"\n size=\"small\"\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 kendoButton themeColor=\"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 kendoButton\n fillMode=\"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 kendoButton fillMode=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"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 kendoButton\n fillMode=\"flat\"\n size=\"small\"\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 kendoButton fillMode=\"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 kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (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 kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (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\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 - Left Sidebar Layout */\n.mcp-dashboard {\n display: flex;\n flex-direction: row;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n/* ========================================\n Left Sidebar\n ======================================== */\n.sidebar {\n display: flex;\n flex-direction: column;\n width: 220px;\n min-width: 220px;\n background: white;\n border-right: 1px solid #e0e0e0;\n box-shadow: 2px 0 4px rgba(0, 0, 0, 0.04);\n}\n\n.sidebar-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 16px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.sidebar-header i {\n font-size: 24px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n.sidebar-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n/* Sidebar Navigation */\n.sidebar-nav {\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n flex: 1;\n}\n\n.nav-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 4px;\n background: none;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n text-align: left;\n width: 100%;\n}\n\n.nav-item:hover {\n background: rgba(33, 150, 243, 0.08);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item.active {\n background: rgba(33, 150, 243, 0.12);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item i {\n width: 20px;\n text-align: center;\n font-size: 16px;\n}\n\n.nav-label {\n flex: 1;\n}\n\n.nav-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.nav-item.active .nav-badge {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.nav-badge.has-errors {\n background: #f44336;\n color: white;\n}\n\n/* Sidebar Stats */\n.sidebar-stats {\n padding: 16px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n}\n\n.stat-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.stat-row .stat-label {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.stat-row .stat-value {\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.stat-row.error .stat-value {\n color: #f44336;\n}\n\n/* Sidebar Footer */\n.sidebar-footer {\n display: flex;\n justify-content: center;\n padding: 12px;\n border-top: 1px solid #e0e0e0;\n}\n\n/* ========================================\n Main Content Area\n ======================================== */\n.main-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Content Header */\n.content-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.content-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Search Box */\n.search-box {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f5f5;\n border-radius: 6px;\n min-width: 200px;\n}\n\n.search-box i {\n color: #999;\n}\n\n.search-box input {\n flex: 1;\n border: none;\n background: none;\n outline: none;\n font-size: 14px;\n}\n\n.status-filter {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\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: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\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 #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\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: #fafafa;\n border-bottom: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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-color, #666);\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: #f44336;\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\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: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\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: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: #2196f3;\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: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success i {\n color: #4caf50;\n}\n\n.sync-result-banner.error {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error i {\n color: #f44336;\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\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 #e0e0e0;\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #f5f5f5;\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: rgba(244, 67, 54, 0.05);\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-primary-color, #2196f3);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary-color, #666);\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: #f0f0f0;\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: #999;\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-primary-color, #2196f3);\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: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state i {\n font-size: 48px;\n color: #e0e0e0;\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-color, #333);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid #e0e0e0;\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-primary-color, #2196f3);\n color: white;\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: white;\n border: 1px solid #e0e0e0;\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: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\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: #999;\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-color, #333);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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 #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\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-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\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: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\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-color, #666);\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 #f0f0f0;\n background: #fafafa;\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\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-color, #666);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\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 #f0f0f0;\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #fafafa;\n}\n\n.tools-list tbody tr.expanded {\n background: rgba(33, 150, 243, 0.04);\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-primary-color, #2196f3);\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-color, #333);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\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: #fafafa;\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\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-color, #666);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-color, #333);\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 #e0e0e0;\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\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 #e0e0e0;\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: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row .action-cell {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-primary-color, #2196f3);\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: #f0f0f0;\n}\n\n.expand-arrow {\n font-size: 12px;\n color: #999;\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-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\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-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\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-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: #999;\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: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\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-color, #333);\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-color, #666);\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: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
2478
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.Router }, { type: i2.NavigationService }, { type: i3.MCPToolsService }], null); })();
2479
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 175 }); })();
2480
- /**
2481
- * Tree-shaking prevention function
2482
- */
2483
- export function LoadMCPDashboard() {
2484
- // Ensures the component is not tree-shaken
2485
- }
2762
+ 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 kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button kendoButton themeColor=\"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 kendoButton themeColor=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button kendoButton fillMode=\"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 kendoButton themeColor=\"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 kendoButton fillMode=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"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 kendoButton\n fillMode=\"flat\"\n size=\"small\"\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 kendoButton themeColor=\"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 kendoButton\n fillMode=\"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 kendoButton fillMode=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"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 kendoButton\n fillMode=\"flat\"\n size=\"small\"\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 kendoButton fillMode=\"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 kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (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 kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (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-background-color, #f5f5f5);\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: white;\n border-bottom: 1px solid #e0e0e0;\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-color, #333);\n}\n\n.dashboard-title i {\n color: var(--mj-primary-color, #2196f3);\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: #f5f5f5;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn:hover {\n background: #e8e8e8;\n border-color: #d0d0d0;\n color: var(--mj-text-color, #333);\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-color, #666);\n padding: 4px 10px;\n background: #f5f5f5;\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: #f5f5f5;\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-color, #666);\n transition: all 0.2s ease;\n}\n\n.tab-btn:hover {\n background: rgba(255, 255, 255, 0.7);\n color: var(--mj-text-color, #333);\n}\n\n.tab-btn.active {\n background: white;\n color: var(--mj-primary-color, #2196f3);\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: #e0e0e0;\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.tab-btn.active .tab-badge {\n background: rgba(33, 150, 243, 0.15);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tab-badge.has-errors {\n background: #f44336;\n color: white;\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: white;\n border-right: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\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 #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\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: #fafafa;\n border-bottom: 1px solid #e0e0e0;\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-primary-color, #2196f3);\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-color, #666);\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: #f44336;\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\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: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\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: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: #2196f3;\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: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success i {\n color: #4caf50;\n}\n\n.sync-result-banner.error {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error i {\n color: #f44336;\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\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 #e0e0e0;\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #f5f5f5;\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: rgba(244, 67, 54, 0.05);\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-primary-color, #2196f3);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary-color, #666);\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: #f0f0f0;\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: #999;\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-primary-color, #2196f3);\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: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state i {\n font-size: 48px;\n color: #e0e0e0;\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-color, #333);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid #e0e0e0;\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-primary-color, #2196f3);\n color: white;\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: white;\n border: 1px solid #e0e0e0;\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: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\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: #999;\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-color, #333);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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 #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\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-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\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: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\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-color, #666);\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 #f0f0f0;\n background: #fafafa;\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\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-color, #666);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\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 #f0f0f0;\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\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: #fafafa;\n}\n\n.tools-list tbody tr.expanded {\n background: rgba(33, 150, 243, 0.04);\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-primary-color, #2196f3);\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-color, #333);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\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: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\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: #fafafa;\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\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-color, #666);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-color, #333);\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 #e0e0e0;\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\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 #e0e0e0;\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: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row .action-cell {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-primary-color, #2196f3);\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: #f0f0f0;\n}\n\n.expand-arrow {\n font-size: 12px;\n color: #999;\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-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\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-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\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-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: #999;\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: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\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-color, #333);\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-color, #666);\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: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
2763
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.NavigationService }, { type: i3.MCPToolsService }], null); })();
2764
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 195 }); })();
2486
2765
  //# sourceMappingURL=mcp-dashboard.component.js.map