@memberjunction/ng-dashboards 5.38.0 → 5.40.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 (321) hide show
  1. package/README.md +14 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  31. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  33. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  35. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  37. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  39. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  41. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  43. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  45. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  47. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  49. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  50. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  51. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  53. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  54. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  55. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  57. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  58. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  59. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  61. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  63. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  65. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
  67. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
  69. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  71. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  73. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  74. package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
  75. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
  77. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  78. package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
  79. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  81. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  83. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  85. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
  87. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
  89. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  90. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  91. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  92. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  93. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  94. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
  95. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  96. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
  97. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  98. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
  99. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  100. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
  101. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  102. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
  103. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  104. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
  105. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  106. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  107. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  108. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  109. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  110. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
  111. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  112. package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
  113. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  114. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  115. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  116. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
  117. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  118. package/dist/AI/components/execution-monitoring.component.js +1 -1
  119. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  120. package/dist/AI/components/models/model-management.component.js +209 -208
  121. package/dist/AI/components/models/model-management.component.js.map +1 -1
  122. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  123. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  124. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  125. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  126. package/dist/AI/components/system/system-configuration.component.js +17 -17
  127. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  128. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  129. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  130. package/dist/AI/components/tags/tags-resource.component.js +578 -538
  131. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  132. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  133. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  134. package/dist/AI/components/vectors/vector-management-resource.component.js +331 -303
  135. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  136. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  137. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  138. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  139. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  140. package/dist/AI/services/cache-metrics.d.ts +50 -0
  141. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  142. package/dist/AI/services/cache-metrics.js +43 -0
  143. package/dist/AI/services/cache-metrics.js.map +1 -0
  144. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  145. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  146. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  147. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  148. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  149. package/dist/Actions/components/actions-overview.component.js +141 -141
  150. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  151. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  152. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  153. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  154. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  155. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  156. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  157. package/dist/Admin/admin-data-schema.component.js +2 -2
  158. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  159. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  160. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  161. package/dist/Admin/admin-identity-access.component.js +2 -2
  162. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  163. package/dist/Admin/admin-monitoring.component.js +2 -2
  164. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  165. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  166. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  167. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  168. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  169. package/dist/Communication/communication-logs-resource.component.js +72 -50
  170. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  171. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  172. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  173. package/dist/Communication/communication-providers-resource.component.js +52 -51
  174. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  175. package/dist/Communication/communication-runs-resource.component.js +39 -38
  176. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  177. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  178. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  179. package/dist/Communication/communication-templates-resource.component.js +92 -89
  180. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  181. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  182. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  183. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  184. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  185. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  186. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  187. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  188. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  189. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  190. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  191. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  192. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  193. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  194. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  195. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  196. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  197. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  198. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  199. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  200. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  201. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  202. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  203. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  204. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  205. package/dist/DevTools/app-state-inspector.component.js +18 -17
  206. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  207. package/dist/DevTools/class-registry.component.js +88 -85
  208. package/dist/DevTools/class-registry.component.js.map +1 -1
  209. package/dist/DevTools/event-monitor.component.js +155 -150
  210. package/dist/DevTools/event-monitor.component.js.map +1 -1
  211. package/dist/DevTools/graphql-console.component.js +245 -243
  212. package/dist/DevTools/graphql-console.component.js.map +1 -1
  213. package/dist/DevTools/layout-inspector.component.js +18 -17
  214. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  215. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  216. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  217. package/dist/Home/home-dashboard.component.js +2 -2
  218. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  219. package/dist/Integration/components/activity/activity.component.js +236 -229
  220. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  221. package/dist/Integration/components/connections/connections.component.js +390 -389
  222. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  223. package/dist/Integration/components/overview/overview.component.js +2 -2
  224. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  225. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
  226. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  227. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  228. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  229. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
  230. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  231. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  232. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  233. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  234. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  235. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  236. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  237. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  238. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  239. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  240. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  241. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  242. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  243. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  244. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  245. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  246. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  247. package/dist/KnowledgeHub/index.d.ts +3 -0
  248. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  249. package/dist/KnowledgeHub/index.js +3 -0
  250. package/dist/KnowledgeHub/index.js.map +1 -1
  251. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  252. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  253. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  254. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  255. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  256. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  257. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  258. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  259. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  260. package/dist/MCP/mcp-dashboard.component.js +443 -438
  261. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  262. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  264. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  266. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  267. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  268. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  270. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  271. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  272. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  273. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  274. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  275. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  276. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  277. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  278. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  279. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  280. package/dist/Testing/components/testing-explorer.component.js +436 -427
  281. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  282. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  283. package/dist/Testing/components/testing-runs.component.js +116 -115
  284. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  285. package/dist/Testing/testing-dashboard.component.js +6 -7
  286. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  287. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  288. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  289. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  290. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  291. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  292. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  293. package/dist/ai-dashboards.module.d.ts +57 -35
  294. package/dist/ai-dashboards.module.d.ts.map +1 -1
  295. package/dist/ai-dashboards.module.js +80 -1
  296. package/dist/ai-dashboards.module.js.map +1 -1
  297. package/dist/communication-dashboards.module.d.ts +1 -1
  298. package/dist/communication-dashboards.module.d.ts.map +1 -1
  299. package/dist/communication-dashboards.module.js +7 -1
  300. package/dist/communication-dashboards.module.js.map +1 -1
  301. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  302. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  303. package/dist/data-explorer-dashboards.module.js +5 -14
  304. package/dist/data-explorer-dashboards.module.js.map +1 -1
  305. package/dist/public-api.d.ts +3 -0
  306. package/dist/public-api.d.ts.map +1 -1
  307. package/dist/public-api.js +3 -0
  308. package/dist/public-api.js.map +1 -1
  309. package/dist/testing-dashboards.module.d.ts +4 -5
  310. package/dist/testing-dashboards.module.d.ts.map +1 -1
  311. package/dist/testing-dashboards.module.js +7 -5
  312. package/dist/testing-dashboards.module.js.map +1 -1
  313. package/package.json +57 -54
  314. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  315. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  316. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  317. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  318. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  319. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  320. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  321. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -33,37 +33,41 @@ const _forTrack0 = ($index, $item) => $item.ID;
33
33
  const _forTrack1 = ($index, $item) => $item.server.ID;
34
34
  const _forTrack2 = ($index, $item) => $item.value;
35
35
  const _forTrack3 = ($index, $item) => $item.name;
36
- function MCPDashboardComponent_Case_7_Template(rf, ctx) { if (rf & 1) {
36
+ function MCPDashboardComponent_Case_5_Template(rf, ctx) { if (rf & 1) {
37
37
  const _r1 = i0.ɵɵgetCurrentView();
38
38
  i0.ɵɵelementStart(0, "button", 34);
39
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createServer()); });
39
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createServer()); });
40
40
  i0.ɵɵelement(1, "i", 35);
41
- i0.ɵɵtext(2, " Add Server ");
42
- i0.ɵɵelementEnd();
41
+ i0.ɵɵelementStart(2, "span", 36);
42
+ i0.ɵɵtext(3, "Add Server");
43
+ i0.ɵɵelementEnd()();
43
44
  } }
44
- function MCPDashboardComponent_Case_8_Template(rf, ctx) { if (rf & 1) {
45
+ function MCPDashboardComponent_Case_6_Template(rf, ctx) { if (rf & 1) {
45
46
  const _r3 = i0.ɵɵgetCurrentView();
46
47
  i0.ɵɵelementStart(0, "button", 34);
47
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createConnection()); });
48
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createConnection()); });
48
49
  i0.ɵɵelement(1, "i", 35);
49
- i0.ɵɵtext(2, " Add Connection ");
50
- i0.ɵɵelementEnd();
50
+ i0.ɵɵelementStart(2, "span", 36);
51
+ i0.ɵɵtext(3, "Add Connection");
52
+ i0.ɵɵelementEnd()();
51
53
  } }
52
- function MCPDashboardComponent_Case_9_Template(rf, ctx) { if (rf & 1) {
54
+ function MCPDashboardComponent_Case_7_Template(rf, ctx) { if (rf & 1) {
53
55
  const _r4 = i0.ɵɵgetCurrentView();
54
- i0.ɵɵelementStart(0, "mj-view-toggle", 36);
55
- i0.ɵɵlistener("KeyChange", function MCPDashboardComponent_Case_9_Template_mj_view_toggle_KeyChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode($event)); });
56
- i0.ɵɵelementEnd();
57
- i0.ɵɵelementStart(1, "button", 37);
58
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleScalableMode(!ctx_r1.useScalablePagination)); });
59
- i0.ɵɵelement(2, "i", 38);
60
- i0.ɵɵtext(3);
61
- i0.ɵɵelementEnd();
62
- i0.ɵɵelementStart(4, "button", 34);
63
- i0.ɵɵlistener("click", function MCPDashboardComponent_Case_9_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTestToolDialog()); });
64
- i0.ɵɵelement(5, "i", 39);
65
- i0.ɵɵtext(6, " Test Tool ");
56
+ i0.ɵɵelementStart(0, "mj-view-toggle", 37);
57
+ i0.ɵɵlistener("KeyChange", function MCPDashboardComponent_Case_7_Template_mj_view_toggle_KeyChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode($event)); });
66
58
  i0.ɵɵelementEnd();
59
+ i0.ɵɵelementStart(1, "button", 38);
60
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_7_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleScalableMode(!ctx_r1.useScalablePagination)); });
61
+ i0.ɵɵelement(2, "i", 39);
62
+ i0.ɵɵelementStart(3, "span", 36);
63
+ i0.ɵɵtext(4);
64
+ i0.ɵɵelementEnd()();
65
+ i0.ɵɵelementStart(5, "button", 34);
66
+ i0.ɵɵlistener("click", function MCPDashboardComponent_Case_7_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTestToolDialog()); });
67
+ i0.ɵɵelement(6, "i", 40);
68
+ i0.ɵɵelementStart(7, "span", 36);
69
+ i0.ɵɵtext(8, "Test Tool");
70
+ i0.ɵɵelementEnd()();
67
71
  } if (rf & 2) {
68
72
  const ctx_r1 = i0.ɵɵnextContext();
69
73
  i0.ɵɵproperty("Options", ctx_r1.toolsViewOptions)("ActiveKey", ctx_r1.ToolsViewMode);
@@ -71,13 +75,13 @@ function MCPDashboardComponent_Case_9_Template(rf, ctx) { if (rf & 1) {
71
75
  i0.ɵɵproperty("title", ctx_r1.useScalablePagination ? "Scale mode on: virtual scroll, paginated" : "Enable scale mode for large tool sets");
72
76
  i0.ɵɵadvance();
73
77
  i0.ɵɵclassProp("fa-bolt", ctx_r1.useScalablePagination)("fa-bolt-lightning", !ctx_r1.useScalablePagination);
74
- i0.ɵɵadvance();
75
- i0.ɵɵtextInterpolate1(" Scale: ", ctx_r1.useScalablePagination ? "ON" : "OFF", " ");
78
+ i0.ɵɵadvance(2);
79
+ i0.ɵɵtextInterpolate1("Scale: ", ctx_r1.useScalablePagination ? "ON" : "OFF");
76
80
  } }
77
- function MCPDashboardComponent_Case_10_Template(rf, ctx) { if (rf & 1) {
81
+ function MCPDashboardComponent_Case_8_Template(rf, ctx) { if (rf & 1) {
78
82
  const _r5 = i0.ɵɵgetCurrentView();
79
- i0.ɵɵelementStart(0, "mj-refresh-button", 40);
80
- i0.ɵɵlistener("Clicked", function MCPDashboardComponent_Case_10_Template_mj_refresh_button_Clicked_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadAllData()); });
83
+ i0.ɵɵelementStart(0, "mj-refresh-button", 41);
84
+ i0.ɵɵlistener("Clicked", function MCPDashboardComponent_Case_8_Template_mj_refresh_button_Clicked_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadAllData()); });
81
85
  i0.ɵɵelementEnd();
82
86
  } if (rf & 2) {
83
87
  const ctx_r1 = i0.ɵɵnextContext();
@@ -86,11 +90,11 @@ function MCPDashboardComponent_Case_10_Template(rf, ctx) { if (rf & 1) {
86
90
  function MCPDashboardComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
87
91
  const _r6 = i0.ɵɵgetCurrentView();
88
92
  i0.ɵɵelementStart(0, "div", 30);
89
- i0.ɵɵelement(1, "i", 41);
93
+ i0.ɵɵelement(1, "i", 42);
90
94
  i0.ɵɵtext(2);
91
- i0.ɵɵelementStart(3, "button", 42);
95
+ i0.ɵɵelementStart(3, "button", 43);
92
96
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_15_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ErrorMessage = null); });
93
- i0.ɵɵelement(4, "i", 43);
97
+ i0.ɵɵelement(4, "i", 44);
94
98
  i0.ɵɵelementEnd()();
95
99
  } if (rf & 2) {
96
100
  const ctx_r1 = i0.ɵɵnextContext();
@@ -102,8 +106,8 @@ function MCPDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
102
106
  } }
103
107
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
104
108
  const _r7 = i0.ɵɵgetCurrentView();
105
- i0.ɵɵelementStart(0, "div", 47);
106
- i0.ɵɵelement(1, "i", 48);
109
+ i0.ɵɵelementStart(0, "div", 48);
110
+ i0.ɵɵelement(1, "i", 49);
107
111
  i0.ɵɵelementStart(2, "p");
108
112
  i0.ɵɵtext(3, "No MCP servers configured");
109
113
  i0.ɵɵelementEnd();
@@ -113,7 +117,7 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_1_Template(rf,
113
117
  i0.ɵɵelementEnd()();
114
118
  } }
115
119
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelementStart(0, "p", 62);
120
+ i0.ɵɵelementStart(0, "p", 63);
117
121
  i0.ɵɵtext(1);
118
122
  i0.ɵɵelementEnd();
119
123
  } if (rf & 2) {
@@ -122,10 +126,10 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
122
126
  i0.ɵɵtextInterpolate(server_r9.Description);
123
127
  } }
124
128
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_37_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 65);
129
+ i0.ɵɵelementStart(0, "div", 68)(1, "span", 66);
126
130
  i0.ɵɵtext(2, "URL");
127
131
  i0.ɵɵelementEnd();
128
- i0.ɵɵelementStart(3, "span", 69);
132
+ i0.ɵɵelementStart(3, "span", 70);
129
133
  i0.ɵɵtext(4);
130
134
  i0.ɵɵelementEnd()();
131
135
  } if (rf & 2) {
@@ -134,10 +138,10 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
134
138
  i0.ɵɵtextInterpolate(server_r9.ServerURL);
135
139
  } }
136
140
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelementStart(0, "div", 67)(1, "span", 65);
141
+ i0.ɵɵelementStart(0, "div", 68)(1, "span", 66);
138
142
  i0.ɵɵtext(2, "Command");
139
143
  i0.ɵɵelementEnd();
140
- i0.ɵɵelementStart(3, "span", 70);
144
+ i0.ɵɵelementStart(3, "span", 71);
141
145
  i0.ɵɵtext(4);
142
146
  i0.ɵɵelementEnd()();
143
147
  } if (rf & 2) {
@@ -146,23 +150,23 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
146
150
  i0.ɵɵtextInterpolate(server_r9.Command);
147
151
  } }
148
152
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
149
- i0.ɵɵelementStart(0, "div", 73);
150
- i0.ɵɵelement(1, "i", 75);
153
+ i0.ɵɵelementStart(0, "div", 74);
154
+ i0.ɵɵelement(1, "i", 76);
151
155
  i0.ɵɵtext(2, " No tools discovered yet. Sync a connection to discover tools. ");
152
156
  i0.ɵɵelementEnd();
153
157
  } }
154
158
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
155
159
  const _r10 = i0.ɵɵgetCurrentView();
156
- i0.ɵɵelementStart(0, "div", 76)(1, "div", 77)(2, "span", 78);
160
+ i0.ɵɵelementStart(0, "div", 77)(1, "div", 78)(2, "span", 79);
157
161
  i0.ɵɵtext(3);
158
162
  i0.ɵɵelementEnd();
159
- i0.ɵɵelementStart(4, "span", 79);
160
- i0.ɵɵelement(5, "i", 80);
163
+ i0.ɵɵelementStart(4, "span", 80);
164
+ i0.ɵɵelement(5, "i", 81);
161
165
  i0.ɵɵtext(6);
162
166
  i0.ɵɵelementEnd()();
163
- i0.ɵɵelementStart(7, "button", 81);
167
+ i0.ɵɵelementStart(7, "button", 82);
164
168
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); ctx_r1.runToolFromCard(tool_r11); return i0.ɵɵresetView($event.stopPropagation()); });
165
- i0.ɵɵelement(8, "i", 39);
169
+ i0.ɵɵelement(8, "i", 40);
166
170
  i0.ɵɵelementEnd()();
167
171
  } if (rf & 2) {
168
172
  const tool_r11 = ctx.$implicit;
@@ -173,8 +177,8 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
173
177
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r11), " params ");
174
178
  } }
175
179
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
176
- i0.ɵɵelementStart(0, "div", 74);
177
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 76, _forTrack0);
180
+ i0.ɵɵelementStart(0, "div", 75);
181
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 77, _forTrack0);
178
182
  i0.ɵɵelementEnd();
179
183
  } if (rf & 2) {
180
184
  const server_r9 = i0.ɵɵnextContext(2).$implicit;
@@ -183,12 +187,12 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
183
187
  i0.ɵɵrepeater(ctx_r1.getToolsForServer(server_r9.ID));
184
188
  } }
185
189
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 71);
187
- i0.ɵɵelement(2, "i", 72);
190
+ i0.ɵɵelementStart(0, "div", 69)(1, "div", 72);
191
+ i0.ɵɵelement(2, "i", 73);
188
192
  i0.ɵɵelementStart(3, "span");
189
193
  i0.ɵɵtext(4);
190
194
  i0.ɵɵelementEnd()();
191
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 73)(6, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 74);
195
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 74)(6, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 75);
192
196
  i0.ɵɵelementEnd();
193
197
  } if (rf & 2) {
194
198
  const server_r9 = i0.ɵɵnextContext().$implicit;
@@ -200,61 +204,61 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditi
200
204
  } }
201
205
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
202
206
  const _r8 = i0.ɵɵgetCurrentView();
203
- i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
207
+ i0.ɵɵelementStart(0, "div", 51)(1, "div", 52);
204
208
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerExpand(server_r9)); });
205
- i0.ɵɵelementStart(2, "div", 52);
206
- i0.ɵɵelement(3, "i", 53)(4, "i");
207
- i0.ɵɵelementStart(5, "span", 54);
209
+ i0.ɵɵelementStart(2, "div", 53);
210
+ i0.ɵɵelement(3, "i", 54)(4, "i");
211
+ i0.ɵɵelementStart(5, "span", 55);
208
212
  i0.ɵɵtext(6);
209
213
  i0.ɵɵelementEnd();
210
- i0.ɵɵelementStart(7, "span", 55);
214
+ i0.ɵɵelementStart(7, "span", 56);
211
215
  i0.ɵɵtext(8);
212
216
  i0.ɵɵelementEnd()();
213
- i0.ɵɵelementStart(9, "div", 56);
217
+ i0.ɵɵelementStart(9, "div", 57);
214
218
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template_div_click_9_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
215
- i0.ɵɵelementStart(10, "button", 57);
219
+ i0.ɵɵelementStart(10, "button", 58);
216
220
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template_button_click_10_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editServer(server_r9)); });
217
- i0.ɵɵelement(11, "i", 58);
221
+ i0.ɵɵelement(11, "i", 59);
218
222
  i0.ɵɵelementEnd();
219
- i0.ɵɵelementStart(12, "button", 59);
223
+ i0.ɵɵelementStart(12, "button", 60);
220
224
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template_button_click_12_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteServer(server_r9)); });
221
- i0.ɵɵelement(13, "i", 60);
225
+ i0.ɵɵelement(13, "i", 61);
222
226
  i0.ɵɵelementEnd()()();
223
- i0.ɵɵelementStart(14, "div", 61);
224
- i0.ɵɵconditionalCreate(15, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_15_Template, 2, 1, "p", 62);
225
- i0.ɵɵelementStart(16, "div", 63)(17, "div", 64)(18, "span", 65);
227
+ i0.ɵɵelementStart(14, "div", 62);
228
+ i0.ɵɵconditionalCreate(15, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_15_Template, 2, 1, "p", 63);
229
+ i0.ɵɵelementStart(16, "div", 64)(17, "div", 65)(18, "span", 66);
226
230
  i0.ɵɵtext(19, "Transport");
227
231
  i0.ɵɵelementEnd();
228
- i0.ɵɵelementStart(20, "span", 66);
232
+ i0.ɵɵelementStart(20, "span", 67);
229
233
  i0.ɵɵtext(21);
230
234
  i0.ɵɵelementEnd()();
231
- i0.ɵɵelementStart(22, "div", 64)(23, "span", 65);
235
+ i0.ɵɵelementStart(22, "div", 65)(23, "span", 66);
232
236
  i0.ɵɵtext(24, "Auth");
233
237
  i0.ɵɵelementEnd();
234
- i0.ɵɵelementStart(25, "span", 66);
238
+ i0.ɵɵelementStart(25, "span", 67);
235
239
  i0.ɵɵtext(26);
236
240
  i0.ɵɵelementEnd()();
237
- i0.ɵɵelementStart(27, "div", 64)(28, "span", 65);
241
+ i0.ɵɵelementStart(27, "div", 65)(28, "span", 66);
238
242
  i0.ɵɵtext(29, "Connections");
239
243
  i0.ɵɵelementEnd();
240
- i0.ɵɵelementStart(30, "span", 66);
244
+ i0.ɵɵelementStart(30, "span", 67);
241
245
  i0.ɵɵtext(31);
242
246
  i0.ɵɵelementEnd()();
243
- i0.ɵɵelementStart(32, "div", 64)(33, "span", 65);
247
+ i0.ɵɵelementStart(32, "div", 65)(33, "span", 66);
244
248
  i0.ɵɵtext(34, "Tools");
245
249
  i0.ɵɵelementEnd();
246
- i0.ɵɵelementStart(35, "span", 66);
250
+ i0.ɵɵelementStart(35, "span", 67);
247
251
  i0.ɵɵtext(36);
248
252
  i0.ɵɵelementEnd()();
249
- i0.ɵɵconditionalCreate(37, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_37_Template, 5, 1, "div", 67);
250
- i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 67);
251
- i0.ɵɵelementStart(39, "div", 64)(40, "span", 65);
253
+ i0.ɵɵconditionalCreate(37, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_37_Template, 5, 1, "div", 68);
254
+ i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 68);
255
+ i0.ɵɵelementStart(39, "div", 65)(40, "span", 66);
252
256
  i0.ɵɵtext(41, "Last Sync");
253
257
  i0.ɵɵelementEnd();
254
- i0.ɵɵelementStart(42, "span", 66);
258
+ i0.ɵɵelementStart(42, "span", 67);
255
259
  i0.ɵɵtext(43);
256
260
  i0.ɵɵelementEnd()()()();
257
- i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 68);
261
+ i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 69);
258
262
  i0.ɵɵelementEnd();
259
263
  } if (rf & 2) {
260
264
  const server_r9 = ctx.$implicit;
@@ -290,14 +294,14 @@ function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Templat
290
294
  i0.ɵɵconditional(ctx_r1.isServerExpanded(server_r9) ? 44 : -1);
291
295
  } }
292
296
  function MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
293
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template, 45, 18, "div", 49, _forTrack0);
297
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_For_1_Template, 45, 18, "div", 50, _forTrack0);
294
298
  } if (rf & 2) {
295
299
  const ctx_r1 = i0.ɵɵnextContext(3);
296
300
  i0.ɵɵrepeater(ctx_r1.filteredServers);
297
301
  } }
298
302
  function MCPDashboardComponent_Conditional_17_Case_0_Template(rf, ctx) { if (rf & 1) {
299
- i0.ɵɵelementStart(0, "div", 44);
300
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_0_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_Template, 2, 0);
303
+ i0.ɵɵelementStart(0, "div", 45);
304
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_0_Conditional_1_Template, 6, 0, "div", 48)(2, MCPDashboardComponent_Conditional_17_Case_0_Conditional_2_Template, 2, 0);
301
305
  i0.ɵɵelementEnd();
302
306
  } if (rf & 2) {
303
307
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -306,8 +310,8 @@ function MCPDashboardComponent_Conditional_17_Case_0_Template(rf, ctx) { if (rf
306
310
  } }
307
311
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
308
312
  const _r12 = i0.ɵɵgetCurrentView();
309
- i0.ɵɵelementStart(0, "div", 47);
310
- i0.ɵɵelement(1, "i", 82);
313
+ i0.ɵɵelementStart(0, "div", 48);
314
+ i0.ɵɵelement(1, "i", 83);
311
315
  i0.ɵɵelementStart(2, "p");
312
316
  i0.ɵɵtext(3, "No connections configured");
313
317
  i0.ɵɵelementEnd();
@@ -317,15 +321,15 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_1_Template(rf,
317
321
  i0.ɵɵelementEnd()();
318
322
  } }
319
323
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
320
- i0.ɵɵelement(0, "i", 84);
324
+ i0.ɵɵelement(0, "i", 85);
321
325
  } }
322
326
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
323
- i0.ɵɵelement(0, "i", 85);
327
+ i0.ɵɵelement(0, "i", 86);
324
328
  } }
325
329
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
326
- i0.ɵɵelementStart(0, "div", 86);
327
- i0.ɵɵelement(1, "i", 89);
328
- i0.ɵɵelementStart(2, "span", 90);
330
+ i0.ɵɵelementStart(0, "div", 87);
331
+ i0.ɵɵelement(1, "i", 90);
332
+ i0.ɵɵelementStart(2, "span", 91);
329
333
  i0.ɵɵtext(3);
330
334
  i0.ɵɵelementEnd()();
331
335
  } if (rf & 2) {
@@ -335,7 +339,7 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
335
339
  i0.ɵɵtextInterpolate(ctx_r1.getSyncProgressMessage(conn_r14.ID) || "Syncing...");
336
340
  } }
337
341
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
338
- i0.ɵɵelement(0, "i", 92);
342
+ i0.ɵɵelement(0, "i", 93);
339
343
  i0.ɵɵelementStart(1, "span");
340
344
  i0.ɵɵtext(2);
341
345
  i0.ɵɵelementEnd();
@@ -347,7 +351,7 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
347
351
  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 ");
348
352
  } }
349
353
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
350
- i0.ɵɵelement(0, "i", 93);
354
+ i0.ɵɵelement(0, "i", 94);
351
355
  i0.ɵɵelementStart(1, "span");
352
356
  i0.ɵɵtext(2);
353
357
  i0.ɵɵelementEnd();
@@ -359,7 +363,7 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
359
363
  i0.ɵɵtextInterpolate((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.ErrorMessage);
360
364
  } }
361
365
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
362
- i0.ɵɵelementStart(0, "div", 91);
366
+ i0.ɵɵelementStart(0, "div", 92);
363
367
  i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Conditional_2_Template, 3, 1);
364
368
  i0.ɵɵelementEnd();
365
369
  } if (rf & 2) {
@@ -373,7 +377,7 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
373
377
  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);
374
378
  } }
375
379
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
376
- i0.ɵɵelementStart(0, "p", 62);
380
+ i0.ɵɵelementStart(0, "p", 63);
377
381
  i0.ɵɵtext(1);
378
382
  i0.ɵɵelementEnd();
379
383
  } if (rf & 2) {
@@ -382,10 +386,10 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
382
386
  i0.ɵɵtextInterpolate(conn_r14.Description);
383
387
  } }
384
388
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
385
- i0.ɵɵelementStart(0, "div", 88)(1, "span", 65);
389
+ i0.ɵɵelementStart(0, "div", 89)(1, "span", 66);
386
390
  i0.ɵɵtext(2, "Last Error");
387
391
  i0.ɵɵelementEnd();
388
- i0.ɵɵelementStart(3, "span", 66);
392
+ i0.ɵɵelementStart(3, "span", 67);
389
393
  i0.ɵɵtext(4);
390
394
  i0.ɵɵelementEnd()();
391
395
  } if (rf & 2) {
@@ -394,23 +398,23 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
394
398
  i0.ɵɵtextInterpolate(conn_r14.LastErrorMessage);
395
399
  } }
396
400
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_5_Template(rf, ctx) { if (rf & 1) {
397
- i0.ɵɵelementStart(0, "div", 73);
398
- i0.ɵɵelement(1, "i", 75);
401
+ i0.ɵɵelementStart(0, "div", 74);
402
+ i0.ɵɵelement(1, "i", 76);
399
403
  i0.ɵɵtext(2, " No tools discovered yet. Click the sync button to discover tools. ");
400
404
  i0.ɵɵelementEnd();
401
405
  } }
402
406
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
403
407
  const _r15 = i0.ɵɵgetCurrentView();
404
- i0.ɵɵelementStart(0, "div", 76)(1, "div", 77)(2, "span", 78);
408
+ i0.ɵɵelementStart(0, "div", 77)(1, "div", 78)(2, "span", 79);
405
409
  i0.ɵɵtext(3);
406
410
  i0.ɵɵelementEnd();
407
- i0.ɵɵelementStart(4, "span", 79);
408
- i0.ɵɵelement(5, "i", 80);
411
+ i0.ɵɵelementStart(4, "span", 80);
412
+ i0.ɵɵelement(5, "i", 81);
409
413
  i0.ɵɵtext(6);
410
414
  i0.ɵɵelementEnd()();
411
- i0.ɵɵelementStart(7, "button", 94);
415
+ i0.ɵɵelementStart(7, "button", 95);
412
416
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_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()); });
413
- i0.ɵɵelement(8, "i", 39);
417
+ i0.ɵɵelement(8, "i", 40);
414
418
  i0.ɵɵelementEnd()();
415
419
  } if (rf & 2) {
416
420
  const tool_r16 = ctx.$implicit;
@@ -421,8 +425,8 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
421
425
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r16), " params ");
422
426
  } }
423
427
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_Template(rf, ctx) { if (rf & 1) {
424
- i0.ɵɵelementStart(0, "div", 74);
425
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template, 9, 2, "div", 76, _forTrack0);
428
+ i0.ɵɵelementStart(0, "div", 75);
429
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_For_2_Template, 9, 2, "div", 77, _forTrack0);
426
430
  i0.ɵɵelementEnd();
427
431
  } if (rf & 2) {
428
432
  const conn_r14 = i0.ɵɵnextContext(2).$implicit;
@@ -431,12 +435,12 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
431
435
  i0.ɵɵrepeater(ctx_r1.getToolsForConnection(conn_r14.ID));
432
436
  } }
433
437
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
434
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 71);
435
- i0.ɵɵelement(2, "i", 72);
438
+ i0.ɵɵelementStart(0, "div", 69)(1, "div", 72);
439
+ i0.ɵɵelement(2, "i", 73);
436
440
  i0.ɵɵelementStart(3, "span");
437
441
  i0.ɵɵtext(4);
438
442
  i0.ɵɵelementEnd()();
439
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_5_Template, 3, 0, "div", 73)(6, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_Template, 3, 0, "div", 74);
443
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_5_Template, 3, 0, "div", 74)(6, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Conditional_6_Template, 3, 0, "div", 75);
440
444
  i0.ɵɵelementEnd();
441
445
  } if (rf & 2) {
442
446
  const conn_r14 = i0.ɵɵnextContext().$implicit;
@@ -448,61 +452,61 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditi
448
452
  } }
449
453
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
450
454
  const _r13 = i0.ɵɵgetCurrentView();
451
- i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
455
+ i0.ɵɵelementStart(0, "div", 51)(1, "div", 52);
452
456
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_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)); });
453
- i0.ɵɵelementStart(2, "div", 52);
454
- i0.ɵɵelement(3, "i", 53)(4, "i", 82);
455
- i0.ɵɵelementStart(5, "span", 54);
457
+ i0.ɵɵelementStart(2, "div", 53);
458
+ i0.ɵɵelement(3, "i", 54)(4, "i", 83);
459
+ i0.ɵɵelementStart(5, "span", 55);
456
460
  i0.ɵɵtext(6);
457
461
  i0.ɵɵelementEnd();
458
- i0.ɵɵelementStart(7, "span", 55);
462
+ i0.ɵɵelementStart(7, "span", 56);
459
463
  i0.ɵɵtext(8);
460
464
  i0.ɵɵelementEnd()();
461
- i0.ɵɵelementStart(9, "div", 56);
465
+ i0.ɵɵelementStart(9, "div", 57);
462
466
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template_div_click_9_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
463
- i0.ɵɵelementStart(10, "button", 83);
467
+ i0.ɵɵelementStart(10, "button", 84);
464
468
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template_button_click_10_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.syncConnectionTools(conn_r14)); });
465
- i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_11_Template, 1, 0, "i", 84)(12, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 85);
469
+ i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_11_Template, 1, 0, "i", 85)(12, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 86);
466
470
  i0.ɵɵelementEnd();
467
- i0.ɵɵelementStart(13, "button", 57);
471
+ i0.ɵɵelementStart(13, "button", 58);
468
472
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template_button_click_13_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editConnection(conn_r14)); });
469
- i0.ɵɵelement(14, "i", 58);
473
+ i0.ɵɵelement(14, "i", 59);
470
474
  i0.ɵɵelementEnd();
471
- i0.ɵɵelementStart(15, "button", 59);
475
+ i0.ɵɵelementStart(15, "button", 60);
472
476
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template_button_click_15_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteConnection(conn_r14)); });
473
- i0.ɵɵelement(16, "i", 60);
477
+ i0.ɵɵelement(16, "i", 61);
474
478
  i0.ɵɵelementEnd()()();
475
- i0.ɵɵconditionalCreate(17, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_17_Template, 4, 1, "div", 86);
476
- i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Template, 3, 5, "div", 87);
477
- i0.ɵɵelementStart(19, "div", 61);
478
- i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_20_Template, 2, 1, "p", 62);
479
- i0.ɵɵelementStart(21, "div", 63)(22, "div", 64)(23, "span", 65);
479
+ i0.ɵɵconditionalCreate(17, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_17_Template, 4, 1, "div", 87);
480
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_18_Template, 3, 5, "div", 88);
481
+ i0.ɵɵelementStart(19, "div", 62);
482
+ i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_20_Template, 2, 1, "p", 63);
483
+ i0.ɵɵelementStart(21, "div", 64)(22, "div", 65)(23, "span", 66);
480
484
  i0.ɵɵtext(24, "Server");
481
485
  i0.ɵɵelementEnd();
482
- i0.ɵɵelementStart(25, "span", 66);
486
+ i0.ɵɵelementStart(25, "span", 67);
483
487
  i0.ɵɵtext(26);
484
488
  i0.ɵɵelementEnd()();
485
- i0.ɵɵelementStart(27, "div", 64)(28, "span", 65);
489
+ i0.ɵɵelementStart(27, "div", 65)(28, "span", 66);
486
490
  i0.ɵɵtext(29, "Auto Sync");
487
491
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(30, "span", 66);
492
+ i0.ɵɵelementStart(30, "span", 67);
489
493
  i0.ɵɵtext(31);
490
494
  i0.ɵɵelementEnd()();
491
- i0.ɵɵelementStart(32, "div", 64)(33, "span", 65);
495
+ i0.ɵɵelementStart(32, "div", 65)(33, "span", 66);
492
496
  i0.ɵɵtext(34, "Logging");
493
497
  i0.ɵɵelementEnd();
494
- i0.ɵɵelementStart(35, "span", 66);
498
+ i0.ɵɵelementStart(35, "span", 67);
495
499
  i0.ɵɵtext(36);
496
500
  i0.ɵɵelementEnd()();
497
- i0.ɵɵelementStart(37, "div", 64)(38, "span", 65);
501
+ i0.ɵɵelementStart(37, "div", 65)(38, "span", 66);
498
502
  i0.ɵɵtext(39, "Last Connected");
499
503
  i0.ɵɵelementEnd();
500
- i0.ɵɵelementStart(40, "span", 66);
504
+ i0.ɵɵelementStart(40, "span", 67);
501
505
  i0.ɵɵtext(41);
502
506
  i0.ɵɵelementEnd()();
503
- i0.ɵɵconditionalCreate(42, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_42_Template, 5, 1, "div", 88);
507
+ i0.ɵɵconditionalCreate(42, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_42_Template, 5, 1, "div", 89);
504
508
  i0.ɵɵelementEnd()();
505
- i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Template, 7, 2, "div", 68);
509
+ i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Conditional_43_Template, 7, 2, "div", 69);
506
510
  i0.ɵɵelementEnd();
507
511
  } if (rf & 2) {
508
512
  let tmp_21_0;
@@ -541,14 +545,14 @@ function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Templat
541
545
  i0.ɵɵconditional(ctx_r1.isConnectionExpanded(conn_r14) ? 43 : -1);
542
546
  } }
543
547
  function MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
544
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template, 44, 18, "div", 49, _forTrack0);
548
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_For_1_Template, 44, 18, "div", 50, _forTrack0);
545
549
  } if (rf & 2) {
546
550
  const ctx_r1 = i0.ɵɵnextContext(3);
547
551
  i0.ɵɵrepeater(ctx_r1.filteredConnections);
548
552
  } }
549
553
  function MCPDashboardComponent_Conditional_17_Case_1_Template(rf, ctx) { if (rf & 1) {
550
- i0.ɵɵelementStart(0, "div", 45);
551
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_1_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_Template, 2, 0);
554
+ i0.ɵɵelementStart(0, "div", 46);
555
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_1_Conditional_1_Template, 6, 0, "div", 48)(2, MCPDashboardComponent_Conditional_17_Case_1_Conditional_2_Template, 2, 0);
552
556
  i0.ɵɵelementEnd();
553
557
  } if (rf & 2) {
554
558
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -557,19 +561,19 @@ function MCPDashboardComponent_Conditional_17_Case_1_Template(rf, ctx) { if (rf
557
561
  } }
558
562
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_For_10_Template(rf, ctx) { if (rf & 1) {
559
563
  const _r18 = i0.ɵɵgetCurrentView();
560
- i0.ɵɵelementStart(0, "div", 98);
561
- i0.ɵɵelement(1, "i", 100);
562
- i0.ɵɵelementStart(2, "div", 101)(3, "div", 102);
564
+ i0.ɵɵelementStart(0, "div", 99);
565
+ i0.ɵɵelement(1, "i", 101);
566
+ i0.ɵɵelementStart(2, "div", 102)(3, "div", 103);
563
567
  i0.ɵɵtext(4);
564
568
  i0.ɵɵelementEnd();
565
- i0.ɵɵelementStart(5, "div", 103);
569
+ i0.ɵɵelementStart(5, "div", 104);
566
570
  i0.ɵɵtext(6);
567
571
  i0.ɵɵelementEnd()();
568
- i0.ɵɵelementStart(7, "button", 104);
572
+ i0.ɵɵelementStart(7, "button", 105);
569
573
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_For_10_Template_button_click_7_listener($event) { const tool_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleFavorite(tool_r19.ID, $event)); });
570
574
  i0.ɵɵelement(8, "i");
571
575
  i0.ɵɵelementEnd();
572
- i0.ɵɵelementStart(9, "span", 105);
576
+ i0.ɵɵelementStart(9, "span", 106);
573
577
  i0.ɵɵtext(10);
574
578
  i0.ɵɵelementEnd()();
575
579
  } if (rf & 2) {
@@ -590,13 +594,13 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_For_10_Templa
590
594
  i0.ɵɵtextInterpolate(tool_r19.Status);
591
595
  } }
592
596
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
593
- i0.ɵɵelementStart(0, "div", 99);
597
+ i0.ɵɵelementStart(0, "div", 100);
594
598
  i0.ɵɵtext(1, "Loading more\u2026");
595
599
  i0.ɵɵelementEnd();
596
600
  } }
597
601
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
598
602
  const _r17 = i0.ɵɵgetCurrentView();
599
- i0.ɵɵelementStart(0, "div", 96);
603
+ i0.ɵɵelementStart(0, "div", 97);
600
604
  i0.ɵɵtext(1, " Showing ");
601
605
  i0.ɵɵelementStart(2, "strong");
602
606
  i0.ɵɵtext(3);
@@ -607,10 +611,10 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template(rf,
607
611
  i0.ɵɵelementEnd();
608
612
  i0.ɵɵtext(7, " tools ");
609
613
  i0.ɵɵelementEnd();
610
- i0.ɵɵelementStart(8, "div", 97);
614
+ i0.ɵɵelementStart(8, "div", 98);
611
615
  i0.ɵɵlistener("scroll", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template_div_scroll_8_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onToolsScrollNative($event)); });
612
- i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_For_10_Template, 11, 10, "div", 98, _forTrack0);
613
- i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Conditional_11_Template, 2, 0, "div", 99);
616
+ i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_For_10_Template, 11, 10, "div", 99, _forTrack0);
617
+ i0.ɵɵconditionalCreate(11, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Conditional_11_Template, 2, 0, "div", 100);
614
618
  i0.ɵɵelementEnd();
615
619
  } if (rf & 2) {
616
620
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -624,17 +628,17 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template(rf,
624
628
  i0.ɵɵconditional(ctx_r1.toolsLoading ? 11 : -1);
625
629
  } }
626
630
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
627
- i0.ɵɵelementStart(0, "div", 47);
628
- i0.ɵɵelement(1, "i", 72);
631
+ i0.ɵɵelementStart(0, "div", 48);
632
+ i0.ɵɵelement(1, "i", 73);
629
633
  i0.ɵɵelementStart(2, "p");
630
634
  i0.ɵɵtext(3, "No tools discovered yet");
631
635
  i0.ɵɵelementEnd();
632
- i0.ɵɵelementStart(4, "span", 106);
636
+ i0.ɵɵelementStart(4, "span", 107);
633
637
  i0.ɵɵtext(5, "Tools are discovered when connections sync with MCP servers");
634
638
  i0.ɵɵelementEnd()();
635
639
  } }
636
640
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
637
- i0.ɵɵelementStart(0, "p", 124);
641
+ i0.ɵɵelementStart(0, "p", 125);
638
642
  i0.ɵɵtext(1);
639
643
  i0.ɵɵelementEnd();
640
644
  } if (rf & 2) {
@@ -643,10 +647,10 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
643
647
  i0.ɵɵtextInterpolate(tool_r23.ToolDescription);
644
648
  } }
645
649
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Conditional_21_Template(rf, ctx) { if (rf & 1) {
646
- i0.ɵɵelementStart(0, "div", 132)(1, "span", 129);
650
+ i0.ɵɵelementStart(0, "div", 133)(1, "span", 130);
647
651
  i0.ɵɵtext(2, "Input Schema:");
648
652
  i0.ɵɵelementEnd();
649
- i0.ɵɵelementStart(3, "pre", 133);
653
+ i0.ɵɵelementStart(3, "pre", 134);
650
654
  i0.ɵɵtext(4);
651
655
  i0.ɵɵelementEnd()();
652
656
  } if (rf & 2) {
@@ -656,31 +660,31 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
656
660
  i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r23));
657
661
  } }
658
662
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
659
- i0.ɵɵelementStart(0, "div", 127)(1, "div", 128)(2, "span", 129);
663
+ i0.ɵɵelementStart(0, "div", 128)(1, "div", 129)(2, "span", 130);
660
664
  i0.ɵɵtext(3, "Tool Name:");
661
665
  i0.ɵɵelementEnd();
662
- i0.ɵɵelementStart(4, "span", 130);
666
+ i0.ɵɵelementStart(4, "span", 131);
663
667
  i0.ɵɵtext(5);
664
668
  i0.ɵɵelementEnd()();
665
- i0.ɵɵelementStart(6, "div", 128)(7, "span", 129);
669
+ i0.ɵɵelementStart(6, "div", 129)(7, "span", 130);
666
670
  i0.ɵɵtext(8, "Parameters:");
667
671
  i0.ɵɵelementEnd();
668
- i0.ɵɵelementStart(9, "span", 131);
672
+ i0.ɵɵelementStart(9, "span", 132);
669
673
  i0.ɵɵtext(10);
670
674
  i0.ɵɵelementEnd()();
671
- i0.ɵɵelementStart(11, "div", 128)(12, "span", 129);
675
+ i0.ɵɵelementStart(11, "div", 129)(12, "span", 130);
672
676
  i0.ɵɵtext(13, "Discovered:");
673
677
  i0.ɵɵelementEnd();
674
- i0.ɵɵelementStart(14, "span", 131);
678
+ i0.ɵɵelementStart(14, "span", 132);
675
679
  i0.ɵɵtext(15);
676
680
  i0.ɵɵelementEnd()();
677
- i0.ɵɵelementStart(16, "div", 128)(17, "span", 129);
681
+ i0.ɵɵelementStart(16, "div", 129)(17, "span", 130);
678
682
  i0.ɵɵtext(18, "Last Seen:");
679
683
  i0.ɵɵelementEnd();
680
- i0.ɵɵelementStart(19, "span", 131);
684
+ i0.ɵɵelementStart(19, "span", 132);
681
685
  i0.ɵɵtext(20);
682
686
  i0.ɵɵelementEnd()();
683
- i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Conditional_21_Template, 5, 1, "div", 132);
687
+ i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Conditional_21_Template, 5, 1, "div", 133);
684
688
  i0.ɵɵelementEnd();
685
689
  } if (rf & 2) {
686
690
  const tool_r23 = i0.ɵɵnextContext().$implicit;
@@ -698,36 +702,36 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
698
702
  } }
699
703
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
700
704
  const _r22 = i0.ɵɵgetCurrentView();
701
- i0.ɵɵelementStart(0, "div", 119)(1, "div", 120);
705
+ i0.ɵɵelementStart(0, "div", 120)(1, "div", 121);
702
706
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r23)); });
703
- i0.ɵɵelementStart(2, "div", 121);
704
- i0.ɵɵelement(3, "i", 72);
705
- i0.ɵɵelementStart(4, "span", 54);
707
+ i0.ɵɵelementStart(2, "div", 122);
708
+ i0.ɵɵelement(3, "i", 73);
709
+ i0.ɵɵelementStart(4, "span", 55);
706
710
  i0.ɵɵtext(5);
707
711
  i0.ɵɵelementEnd()();
708
- i0.ɵɵelementStart(6, "div", 122)(7, "span", 123);
709
- i0.ɵɵelement(8, "i", 80);
712
+ i0.ɵɵelementStart(6, "div", 123)(7, "span", 124);
713
+ i0.ɵɵelement(8, "i", 81);
710
714
  i0.ɵɵtext(9);
711
715
  i0.ɵɵelementEnd();
712
- i0.ɵɵelementStart(10, "span", 105);
716
+ i0.ɵɵelementStart(10, "span", 106);
713
717
  i0.ɵɵtext(11);
714
718
  i0.ɵɵelementEnd()()();
715
- i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_12_Template, 2, 1, "p", 124);
716
- i0.ɵɵelementStart(13, "div", 125)(14, "button", 104);
719
+ i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_12_Template, 2, 1, "p", 125);
720
+ i0.ɵɵelementStart(13, "div", 126)(14, "button", 105);
717
721
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_14_listener($event) { const tool_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleFavorite(tool_r23.ID, $event)); });
718
722
  i0.ɵɵelement(15, "i");
719
723
  i0.ɵɵelementEnd();
720
- i0.ɵɵelementStart(16, "button", 81);
724
+ i0.ɵɵelementStart(16, "button", 82);
721
725
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_16_listener() { const tool_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r23)); });
722
- i0.ɵɵelement(17, "i", 39);
726
+ i0.ɵɵelement(17, "i", 40);
723
727
  i0.ɵɵtext(18, " Test ");
724
728
  i0.ɵɵelementEnd();
725
- i0.ɵɵelementStart(19, "button", 126);
729
+ i0.ɵɵelementStart(19, "button", 127);
726
730
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_19_listener() { const tool_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r23)); });
727
- i0.ɵɵelement(20, "i", 38);
731
+ i0.ɵɵelement(20, "i", 39);
728
732
  i0.ɵɵtext(21);
729
733
  i0.ɵɵelementEnd()();
730
- i0.ɵɵconditionalCreate(22, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Template, 22, 6, "div", 127);
734
+ i0.ɵɵconditionalCreate(22, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Conditional_22_Template, 22, 6, "div", 128);
731
735
  i0.ɵɵelementEnd();
732
736
  } if (rf & 2) {
733
737
  const tool_r23 = ctx.$implicit;
@@ -756,8 +760,8 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
756
760
  i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r23) ? 22 : -1);
757
761
  } }
758
762
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
759
- i0.ɵɵelementStart(0, "div", 116);
760
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template, 23, 18, "div", 118, _forTrack0);
763
+ i0.ɵɵelementStart(0, "div", 117);
764
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_For_2_Template, 23, 18, "div", 119, _forTrack0);
761
765
  i0.ɵɵelementEnd();
762
766
  } if (rf & 2) {
763
767
  const group_r21 = i0.ɵɵnextContext(2).$implicit;
@@ -765,7 +769,7 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
765
769
  i0.ɵɵrepeater(group_r21.tools);
766
770
  } }
767
771
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_6_Template(rf, ctx) { if (rf & 1) {
768
- i0.ɵɵelementStart(0, "span", 136);
772
+ i0.ɵɵelementStart(0, "span", 137);
769
773
  i0.ɵɵtext(1);
770
774
  i0.ɵɵelementEnd();
771
775
  } if (rf & 2) {
@@ -774,10 +778,10 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
774
778
  i0.ɵɵtextInterpolate(tool_r25.ToolName);
775
779
  } }
776
780
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
777
- i0.ɵɵelementStart(0, "div", 147)(1, "span", 129);
781
+ i0.ɵɵelementStart(0, "div", 148)(1, "span", 130);
778
782
  i0.ɵɵtext(2, "Input Schema:");
779
783
  i0.ɵɵelementEnd();
780
- i0.ɵɵelementStart(3, "pre", 133);
784
+ i0.ɵɵelementStart(3, "pre", 134);
781
785
  i0.ɵɵtext(4);
782
786
  i0.ɵɵelementEnd()();
783
787
  } if (rf & 2) {
@@ -787,25 +791,25 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
787
791
  i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r25));
788
792
  } }
789
793
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
790
- i0.ɵɵelementStart(0, "tr", 143)(1, "td", 144)(2, "div", 145)(3, "div", 146)(4, "span", 129);
794
+ i0.ɵɵelementStart(0, "tr", 144)(1, "td", 145)(2, "div", 146)(3, "div", 147)(4, "span", 130);
791
795
  i0.ɵɵtext(5, "Tool Name:");
792
796
  i0.ɵɵelementEnd();
793
- i0.ɵɵelementStart(6, "span", 130);
797
+ i0.ɵɵelementStart(6, "span", 131);
794
798
  i0.ɵɵtext(7);
795
799
  i0.ɵɵelementEnd()();
796
- i0.ɵɵelementStart(8, "div", 146)(9, "span", 129);
800
+ i0.ɵɵelementStart(8, "div", 147)(9, "span", 130);
797
801
  i0.ɵɵtext(10, "Discovered:");
798
802
  i0.ɵɵelementEnd();
799
- i0.ɵɵelementStart(11, "span", 131);
803
+ i0.ɵɵelementStart(11, "span", 132);
800
804
  i0.ɵɵtext(12);
801
805
  i0.ɵɵelementEnd()();
802
- i0.ɵɵelementStart(13, "div", 146)(14, "span", 129);
806
+ i0.ɵɵelementStart(13, "div", 147)(14, "span", 130);
803
807
  i0.ɵɵtext(15, "Required Params:");
804
808
  i0.ɵɵelementEnd();
805
- i0.ɵɵelementStart(16, "span", 131);
809
+ i0.ɵɵelementStart(16, "span", 132);
806
810
  i0.ɵɵtext(17);
807
811
  i0.ɵɵelementEnd()();
808
- i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 147);
812
+ i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 148);
809
813
  i0.ɵɵelementEnd()()();
810
814
  } if (rf & 2) {
811
815
  const tool_r25 = i0.ɵɵnextContext().$implicit;
@@ -821,38 +825,38 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
821
825
  } }
822
826
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
823
827
  const _r24 = i0.ɵɵgetCurrentView();
824
- i0.ɵɵelementStart(0, "tr")(1, "td", 134);
825
- i0.ɵɵelement(2, "i", 72);
826
- i0.ɵɵelementStart(3, "div", 135)(4, "span", 121);
828
+ i0.ɵɵelementStart(0, "tr")(1, "td", 135);
829
+ i0.ɵɵelement(2, "i", 73);
830
+ i0.ɵɵelementStart(3, "div", 136)(4, "span", 122);
827
831
  i0.ɵɵtext(5);
828
832
  i0.ɵɵelementEnd();
829
- i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_6_Template, 2, 1, "span", 136);
833
+ i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_6_Template, 2, 1, "span", 137);
830
834
  i0.ɵɵelementEnd()();
831
- i0.ɵɵelementStart(7, "td", 137);
835
+ i0.ɵɵelementStart(7, "td", 138);
832
836
  i0.ɵɵtext(8);
833
837
  i0.ɵɵelementEnd();
834
- i0.ɵɵelementStart(9, "td")(10, "span", 138);
838
+ i0.ɵɵelementStart(9, "td")(10, "span", 139);
835
839
  i0.ɵɵtext(11);
836
840
  i0.ɵɵelementEnd()();
837
- i0.ɵɵelementStart(12, "td")(13, "span", 105);
841
+ i0.ɵɵelementStart(12, "td")(13, "span", 106);
838
842
  i0.ɵɵtext(14);
839
843
  i0.ɵɵelementEnd()();
840
844
  i0.ɵɵelementStart(15, "td");
841
845
  i0.ɵɵtext(16);
842
846
  i0.ɵɵelementEnd();
843
- i0.ɵɵelementStart(17, "td", 139)(18, "button", 140);
847
+ i0.ɵɵelementStart(17, "td", 140)(18, "button", 141);
844
848
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_18_listener($event) { const tool_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleFavorite(tool_r25.ID, $event)); });
845
849
  i0.ɵɵelement(19, "i");
846
850
  i0.ɵɵelementEnd();
847
- i0.ɵɵelementStart(20, "button", 141);
851
+ i0.ɵɵelementStart(20, "button", 142);
848
852
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r25)); });
849
- i0.ɵɵelement(21, "i", 39);
853
+ i0.ɵɵelement(21, "i", 40);
850
854
  i0.ɵɵelementEnd();
851
- i0.ɵɵelementStart(22, "button", 142);
855
+ i0.ɵɵelementStart(22, "button", 143);
852
856
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r25)); });
853
- i0.ɵɵelement(23, "i", 38);
857
+ i0.ɵɵelement(23, "i", 39);
854
858
  i0.ɵɵelementEnd()()();
855
- i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 143);
859
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 144);
856
860
  } if (rf & 2) {
857
861
  const tool_r25 = ctx.$implicit;
858
862
  const ctx_r1 = i0.ɵɵnextContext(7);
@@ -882,7 +886,7 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
882
886
  i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r25) ? 24 : -1);
883
887
  } }
884
888
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
885
- i0.ɵɵelementStart(0, "div", 117)(1, "table")(2, "thead")(3, "tr")(4, "th");
889
+ i0.ɵɵelementStart(0, "div", 118)(1, "table")(2, "thead")(3, "tr")(4, "th");
886
890
  i0.ɵɵtext(5, "Tool");
887
891
  i0.ɵɵelementEnd();
888
892
  i0.ɵɵelementStart(6, "th");
@@ -909,31 +913,31 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditi
909
913
  i0.ɵɵrepeater(group_r21.tools);
910
914
  } }
911
915
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
912
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 116)(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 117);
916
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 117)(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 118);
913
917
  } if (rf & 2) {
914
918
  const ctx_r1 = i0.ɵɵnextContext(5);
915
919
  i0.ɵɵconditional(ctx_r1.ToolsViewMode === "card" ? 0 : 1);
916
920
  } }
917
921
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
918
922
  const _r20 = i0.ɵɵgetCurrentView();
919
- i0.ɵɵelementStart(0, "div", 108)(1, "div", 109);
923
+ i0.ɵɵelementStart(0, "div", 109)(1, "div", 110);
920
924
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template_div_click_1_listener() { const group_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerGroup(group_r21)); });
921
- i0.ɵɵelementStart(2, "div", 110);
922
- i0.ɵɵelement(3, "i", 111)(4, "i");
923
- i0.ɵɵelementStart(5, "span", 112);
925
+ i0.ɵɵelementStart(2, "div", 111);
926
+ i0.ɵɵelement(3, "i", 112)(4, "i");
927
+ i0.ɵɵelementStart(5, "span", 113);
924
928
  i0.ɵɵtext(6);
925
929
  i0.ɵɵelementEnd();
926
- i0.ɵɵelementStart(7, "span", 113);
930
+ i0.ɵɵelementStart(7, "span", 114);
927
931
  i0.ɵɵtext(8);
928
932
  i0.ɵɵelementEnd();
929
- i0.ɵɵelementStart(9, "span", 105);
933
+ i0.ɵɵelementStart(9, "span", 106);
930
934
  i0.ɵɵtext(10);
931
935
  i0.ɵɵelementEnd()();
932
- i0.ɵɵelementStart(11, "div", 114);
936
+ i0.ɵɵelementStart(11, "div", 115);
933
937
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r20); return i0.ɵɵresetView($event.stopPropagation()); });
934
- i0.ɵɵelementStart(12, "button", 115);
938
+ i0.ɵɵelementStart(12, "button", 116);
935
939
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(undefined, undefined)); });
936
- i0.ɵɵelement(13, "i", 39);
940
+ i0.ɵɵelement(13, "i", 40);
937
941
  i0.ɵɵelementEnd()()();
938
942
  i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Conditional_14_Template, 2, 1);
939
943
  i0.ɵɵelementEnd();
@@ -957,8 +961,8 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Templat
957
961
  i0.ɵɵconditional(group_r21.expanded ? 14 : -1);
958
962
  } }
959
963
  function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
960
- i0.ɵɵelementStart(0, "div", 95);
961
- i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template, 15, 11, "div", 107, _forTrack1);
964
+ i0.ɵɵelementStart(0, "div", 96);
965
+ i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_For_2_Template, 15, 11, "div", 108, _forTrack1);
962
966
  i0.ɵɵelementEnd();
963
967
  } if (rf & 2) {
964
968
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -966,45 +970,45 @@ function MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_Template(rf,
966
970
  i0.ɵɵrepeater(ctx_r1.ServerGroups);
967
971
  } }
968
972
  function MCPDashboardComponent_Conditional_17_Case_2_Template(rf, ctx) { if (rf & 1) {
969
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template, 12, 3)(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_Template, 3, 0, "div", 95);
973
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_2_Conditional_0_Template, 12, 3)(1, MCPDashboardComponent_Conditional_17_Case_2_Conditional_1_Template, 6, 0, "div", 48)(2, MCPDashboardComponent_Conditional_17_Case_2_Conditional_2_Template, 3, 0, "div", 96);
970
974
  } if (rf & 2) {
971
975
  const ctx_r1 = i0.ɵɵnextContext(2);
972
976
  i0.ɵɵconditional(ctx_r1.useScalablePagination ? 0 : ctx_r1.ServerGroups.length === 0 ? 1 : 2);
973
977
  } }
974
978
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
975
- i0.ɵɵelementStart(0, "div", 47);
976
- i0.ɵɵelement(1, "i", 148);
979
+ i0.ɵɵelementStart(0, "div", 48);
980
+ i0.ɵɵelement(1, "i", 149);
977
981
  i0.ɵɵelementStart(2, "p");
978
982
  i0.ɵɵtext(3, "No recent execution logs");
979
983
  i0.ɵɵelementEnd();
980
- i0.ɵɵelementStart(4, "span", 106);
984
+ i0.ɵɵelementStart(4, "span", 107);
981
985
  i0.ɵɵtext(5, "Logs appear when tools are executed via MCP connections");
982
986
  i0.ɵɵelementEnd()();
983
987
  } }
984
988
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
985
- i0.ɵɵelement(0, "i", 92);
989
+ i0.ɵɵelement(0, "i", 93);
986
990
  } }
987
991
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
988
- i0.ɵɵelement(0, "i", 153);
992
+ i0.ɵɵelement(0, "i", 154);
989
993
  } }
990
994
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
991
- i0.ɵɵelement(0, "i", 154);
995
+ i0.ɵɵelement(0, "i", 155);
992
996
  } }
993
997
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
994
- i0.ɵɵelement(0, "i", 155);
998
+ i0.ɵɵelement(0, "i", 156);
995
999
  } }
996
1000
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
997
1001
  const _r27 = i0.ɵɵgetCurrentView();
998
- i0.ɵɵelementStart(0, "tr", 152);
1002
+ i0.ɵɵelementStart(0, "tr", 153);
999
1003
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onLogClick(log_r28)); });
1000
- i0.ɵɵelementStart(1, "td")(2, "span", 55);
1001
- i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 92)(4, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 153)(5, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 154)(6, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 155);
1004
+ i0.ɵɵelementStart(1, "td")(2, "span", 56);
1005
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 93)(4, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 154)(5, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 155)(6, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 156);
1002
1006
  i0.ɵɵtext(7);
1003
1007
  i0.ɵɵelementEnd()();
1004
- i0.ɵɵelementStart(8, "td", 112);
1008
+ i0.ɵɵelementStart(8, "td", 113);
1005
1009
  i0.ɵɵtext(9);
1006
1010
  i0.ɵɵelementEnd();
1007
- i0.ɵɵelementStart(10, "td", 156);
1011
+ i0.ɵɵelementStart(10, "td", 157);
1008
1012
  i0.ɵɵtext(11);
1009
1013
  i0.ɵɵelementEnd();
1010
1014
  i0.ɵɵelementStart(12, "td");
@@ -1016,11 +1020,11 @@ function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Templa
1016
1020
  i0.ɵɵelementStart(16, "td");
1017
1021
  i0.ɵɵtext(17);
1018
1022
  i0.ɵɵelementEnd();
1019
- i0.ɵɵelementStart(18, "td", 157);
1023
+ i0.ɵɵelementStart(18, "td", 158);
1020
1024
  i0.ɵɵtext(19);
1021
1025
  i0.ɵɵelementEnd();
1022
- i0.ɵɵelementStart(20, "td", 158);
1023
- i0.ɵɵelement(21, "i", 159);
1026
+ i0.ɵɵelementStart(20, "td", 159);
1027
+ i0.ɵɵelement(21, "i", 160);
1024
1028
  i0.ɵɵelementEnd()();
1025
1029
  } if (rf & 2) {
1026
1030
  let tmp_15_0;
@@ -1050,45 +1054,45 @@ function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Templa
1050
1054
  } }
1051
1055
  function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1052
1056
  const _r26 = i0.ɵɵgetCurrentView();
1053
- i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 149);
1057
+ i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 150);
1054
1058
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("status")); });
1055
1059
  i0.ɵɵtext(4, " Status ");
1056
- i0.ɵɵelement(5, "i", 150);
1060
+ i0.ɵɵelement(5, "i", 151);
1057
1061
  i0.ɵɵelementEnd();
1058
- i0.ɵɵelementStart(6, "th", 149);
1062
+ i0.ɵɵelementStart(6, "th", 150);
1059
1063
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("server")); });
1060
1064
  i0.ɵɵtext(7, " Server ");
1061
- i0.ɵɵelement(8, "i", 150);
1065
+ i0.ɵɵelement(8, "i", 151);
1062
1066
  i0.ɵɵelementEnd();
1063
- i0.ɵɵelementStart(9, "th", 149);
1067
+ i0.ɵɵelementStart(9, "th", 150);
1064
1068
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("tool")); });
1065
1069
  i0.ɵɵtext(10, " Tool ");
1066
- i0.ɵɵelement(11, "i", 150);
1070
+ i0.ɵɵelement(11, "i", 151);
1067
1071
  i0.ɵɵelementEnd();
1068
- i0.ɵɵelementStart(12, "th", 149);
1072
+ i0.ɵɵelementStart(12, "th", 150);
1069
1073
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("connection")); });
1070
1074
  i0.ɵɵtext(13, " Connection ");
1071
- i0.ɵɵelement(14, "i", 150);
1075
+ i0.ɵɵelement(14, "i", 151);
1072
1076
  i0.ɵɵelementEnd();
1073
- i0.ɵɵelementStart(15, "th", 149);
1077
+ i0.ɵɵelementStart(15, "th", 150);
1074
1078
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("started")); });
1075
1079
  i0.ɵɵtext(16, " Started ");
1076
- i0.ɵɵelement(17, "i", 150);
1080
+ i0.ɵɵelement(17, "i", 151);
1077
1081
  i0.ɵɵelementEnd();
1078
- i0.ɵɵelementStart(18, "th", 149);
1082
+ i0.ɵɵelementStart(18, "th", 150);
1079
1083
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("duration")); });
1080
1084
  i0.ɵɵtext(19, " Duration ");
1081
- i0.ɵɵelement(20, "i", 150);
1085
+ i0.ɵɵelement(20, "i", 151);
1082
1086
  i0.ɵɵelementEnd();
1083
- i0.ɵɵelementStart(21, "th", 149);
1087
+ i0.ɵɵelementStart(21, "th", 150);
1084
1088
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("error")); });
1085
1089
  i0.ɵɵtext(22, " Error ");
1086
- i0.ɵɵelement(23, "i", 150);
1090
+ i0.ɵɵelement(23, "i", 151);
1087
1091
  i0.ɵɵelementEnd();
1088
1092
  i0.ɵɵelement(24, "th");
1089
1093
  i0.ɵɵelementEnd()();
1090
1094
  i0.ɵɵelementStart(25, "tbody");
1091
- i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 151, _forTrack0);
1095
+ i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 152, _forTrack0);
1092
1096
  i0.ɵɵelementEnd()();
1093
1097
  } if (rf & 2) {
1094
1098
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1124,8 +1128,8 @@ function MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template(rf,
1124
1128
  i0.ɵɵrepeater(ctx_r1.filteredLogs);
1125
1129
  } }
1126
1130
  function MCPDashboardComponent_Conditional_17_Case_3_Template(rf, ctx) { if (rf & 1) {
1127
- i0.ɵɵelementStart(0, "div", 46);
1128
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_3_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template, 28, 49, "table");
1131
+ i0.ɵɵelementStart(0, "div", 47);
1132
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_17_Case_3_Conditional_1_Template, 6, 0, "div", 48)(2, MCPDashboardComponent_Conditional_17_Case_3_Conditional_2_Template, 28, 49, "table");
1129
1133
  i0.ɵɵelementEnd();
1130
1134
  } if (rf & 2) {
1131
1135
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1133,15 +1137,15 @@ function MCPDashboardComponent_Conditional_17_Case_3_Template(rf, ctx) { if (rf
1133
1137
  i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 1 : 2);
1134
1138
  } }
1135
1139
  function MCPDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
1136
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_0_Template, 3, 1, "div", 44)(1, MCPDashboardComponent_Conditional_17_Case_1_Template, 3, 1, "div", 45)(2, MCPDashboardComponent_Conditional_17_Case_2_Template, 3, 1)(3, MCPDashboardComponent_Conditional_17_Case_3_Template, 3, 1, "div", 46);
1140
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_17_Case_0_Template, 3, 1, "div", 45)(1, MCPDashboardComponent_Conditional_17_Case_1_Template, 3, 1, "div", 46)(2, MCPDashboardComponent_Conditional_17_Case_2_Template, 3, 1)(3, MCPDashboardComponent_Conditional_17_Case_3_Template, 3, 1, "div", 47);
1137
1141
  } if (rf & 2) {
1138
1142
  let tmp_1_0;
1139
1143
  const ctx_r1 = i0.ɵɵnextContext();
1140
1144
  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);
1141
1145
  } }
1142
1146
  function MCPDashboardComponent_Conditional_18_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1143
- i0.ɵɵelementStart(0, "div", 166);
1144
- i0.ɵɵelement(1, "i", 41);
1147
+ i0.ɵɵelementStart(0, "div", 167);
1148
+ i0.ɵɵelement(1, "i", 42);
1145
1149
  i0.ɵɵtext(2);
1146
1150
  i0.ɵɵelementEnd();
1147
1151
  } if (rf & 2) {
@@ -1150,7 +1154,7 @@ function MCPDashboardComponent_Conditional_18_Conditional_8_Template(rf, ctx) {
1150
1154
  i0.ɵɵtextInterpolate1(" ", ctx_r1.ServerFormError, " ");
1151
1155
  } }
1152
1156
  function MCPDashboardComponent_Conditional_18_For_29_Template(rf, ctx) { if (rf & 1) {
1153
- i0.ɵɵelementStart(0, "option", 173);
1157
+ i0.ɵɵelementStart(0, "option", 174);
1154
1158
  i0.ɵɵtext(1);
1155
1159
  i0.ɵɵelementEnd();
1156
1160
  } if (rf & 2) {
@@ -1161,12 +1165,12 @@ function MCPDashboardComponent_Conditional_18_For_29_Template(rf, ctx) { if (rf
1161
1165
  } }
1162
1166
  function MCPDashboardComponent_Conditional_18_Conditional_30_Template(rf, ctx) { if (rf & 1) {
1163
1167
  const _r34 = i0.ɵɵgetCurrentView();
1164
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 168);
1168
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 169);
1165
1169
  i0.ɵɵtext(2, "Server URL ");
1166
- i0.ɵɵelementStart(3, "span", 169);
1170
+ i0.ɵɵelementStart(3, "span", 170);
1167
1171
  i0.ɵɵtext(4, "*");
1168
1172
  i0.ɵɵelementEnd()();
1169
- i0.ɵɵelementStart(5, "input", 179, 5);
1173
+ i0.ɵɵelementStart(5, "input", 180, 5);
1170
1174
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_18_Conditional_30_Template_input_input_5_listener() { i0.ɵɵrestoreView(_r34); const sfUrl_r35 = i0.ɵɵreference(6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ServerForm.ServerURL = sfUrl_r35.value); });
1171
1175
  i0.ɵɵelementEnd()();
1172
1176
  } if (rf & 2) {
@@ -1176,12 +1180,12 @@ function MCPDashboardComponent_Conditional_18_Conditional_30_Template(rf, ctx) {
1176
1180
  } }
1177
1181
  function MCPDashboardComponent_Conditional_18_Conditional_31_Template(rf, ctx) { if (rf & 1) {
1178
1182
  const _r36 = i0.ɵɵgetCurrentView();
1179
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 168);
1183
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 169);
1180
1184
  i0.ɵɵtext(2, "Command ");
1181
- i0.ɵɵelementStart(3, "span", 169);
1185
+ i0.ɵɵelementStart(3, "span", 170);
1182
1186
  i0.ɵɵtext(4, "*");
1183
1187
  i0.ɵɵelementEnd()();
1184
- i0.ɵɵelementStart(5, "input", 180, 6);
1188
+ i0.ɵɵelementStart(5, "input", 181, 6);
1185
1189
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_18_Conditional_31_Template_input_input_5_listener() { i0.ɵɵrestoreView(_r36); const sfCmd_r37 = i0.ɵɵreference(6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ServerForm.Command = sfCmd_r37.value); });
1186
1190
  i0.ɵɵelementEnd()();
1187
1191
  } if (rf & 2) {
@@ -1190,7 +1194,7 @@ function MCPDashboardComponent_Conditional_18_Conditional_31_Template(rf, ctx) {
1190
1194
  i0.ɵɵproperty("value", ctx_r1.ServerForm.Command);
1191
1195
  } }
1192
1196
  function MCPDashboardComponent_Conditional_18_For_38_Template(rf, ctx) { if (rf & 1) {
1193
- i0.ɵɵelementStart(0, "option", 173);
1197
+ i0.ɵɵelementStart(0, "option", 174);
1194
1198
  i0.ɵɵtext(1);
1195
1199
  i0.ɵɵelementEnd();
1196
1200
  } if (rf & 2) {
@@ -1200,72 +1204,72 @@ function MCPDashboardComponent_Conditional_18_For_38_Template(rf, ctx) { if (rf
1200
1204
  i0.ɵɵtextInterpolate(a_r39.label);
1201
1205
  } }
1202
1206
  function MCPDashboardComponent_Conditional_18_Conditional_50_Template(rf, ctx) { if (rf & 1) {
1203
- i0.ɵɵelement(0, "i", 154);
1207
+ i0.ɵɵelement(0, "i", 155);
1204
1208
  } }
1205
1209
  function MCPDashboardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1206
1210
  const _r29 = i0.ɵɵgetCurrentView();
1207
- i0.ɵɵelementStart(0, "div", 160);
1211
+ i0.ɵɵelementStart(0, "div", 161);
1208
1212
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_18_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelServerForm()); });
1209
- i0.ɵɵelementStart(1, "div", 161);
1213
+ i0.ɵɵelementStart(1, "div", 162);
1210
1214
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_18_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r29); return i0.ɵɵresetView($event.stopPropagation()); });
1211
- i0.ɵɵelementStart(2, "div", 162)(3, "h2", 163);
1215
+ i0.ɵɵelementStart(2, "div", 163)(3, "h2", 164);
1212
1216
  i0.ɵɵtext(4);
1213
1217
  i0.ɵɵelementEnd();
1214
- i0.ɵɵelementStart(5, "button", 164);
1218
+ i0.ɵɵelementStart(5, "button", 165);
1215
1219
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_18_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelServerForm()); });
1216
- i0.ɵɵelement(6, "i", 43);
1220
+ i0.ɵɵelement(6, "i", 44);
1217
1221
  i0.ɵɵelementEnd()();
1218
- i0.ɵɵelementStart(7, "div", 165);
1219
- i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_18_Conditional_8_Template, 3, 1, "div", 166);
1220
- i0.ɵɵelementStart(9, "div", 167)(10, "label", 168);
1222
+ i0.ɵɵelementStart(7, "div", 166);
1223
+ i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_18_Conditional_8_Template, 3, 1, "div", 167);
1224
+ i0.ɵɵelementStart(9, "div", 168)(10, "label", 169);
1221
1225
  i0.ɵɵtext(11, "Name ");
1222
- i0.ɵɵelementStart(12, "span", 169);
1226
+ i0.ɵɵelementStart(12, "span", 170);
1223
1227
  i0.ɵɵtext(13, "*");
1224
1228
  i0.ɵɵelementEnd()();
1225
- i0.ɵɵelementStart(14, "input", 170, 0);
1229
+ i0.ɵɵelementStart(14, "input", 171, 0);
1226
1230
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_18_Template_input_input_14_listener() { i0.ɵɵrestoreView(_r29); const sfName_r30 = i0.ɵɵreference(15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ServerForm.Name = sfName_r30.value); });
1227
1231
  i0.ɵɵelementEnd()();
1228
- i0.ɵɵelementStart(16, "div", 167)(17, "label", 168);
1232
+ i0.ɵɵelementStart(16, "div", 168)(17, "label", 169);
1229
1233
  i0.ɵɵtext(18, "Description");
1230
1234
  i0.ɵɵelementEnd();
1231
- i0.ɵɵelementStart(19, "textarea", 171, 1);
1235
+ i0.ɵɵelementStart(19, "textarea", 172, 1);
1232
1236
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_18_Template_textarea_input_19_listener() { i0.ɵɵrestoreView(_r29); const sfDesc_r31 = i0.ɵɵreference(20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ServerForm.Description = sfDesc_r31.value); });
1233
1237
  i0.ɵɵelementEnd()();
1234
- i0.ɵɵelementStart(21, "div", 167)(22, "label", 168);
1238
+ i0.ɵɵelementStart(21, "div", 168)(22, "label", 169);
1235
1239
  i0.ɵɵtext(23, "Transport Type ");
1236
- i0.ɵɵelementStart(24, "span", 169);
1240
+ i0.ɵɵelementStart(24, "span", 170);
1237
1241
  i0.ɵɵtext(25, "*");
1238
1242
  i0.ɵɵelementEnd()();
1239
- i0.ɵɵelementStart(26, "select", 172, 2);
1243
+ i0.ɵɵelementStart(26, "select", 173, 2);
1240
1244
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_18_Template_select_change_26_listener() { i0.ɵɵrestoreView(_r29); const sfTransport_r32 = i0.ɵɵreference(27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ServerForm.TransportType = sfTransport_r32.value); });
1241
- i0.ɵɵrepeaterCreate(28, MCPDashboardComponent_Conditional_18_For_29_Template, 2, 2, "option", 173, _forTrack2);
1245
+ i0.ɵɵrepeaterCreate(28, MCPDashboardComponent_Conditional_18_For_29_Template, 2, 2, "option", 174, _forTrack2);
1242
1246
  i0.ɵɵelementEnd()();
1243
- i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_18_Conditional_30_Template, 7, 1, "div", 167);
1244
- i0.ɵɵconditionalCreate(31, MCPDashboardComponent_Conditional_18_Conditional_31_Template, 7, 1, "div", 167);
1245
- i0.ɵɵelementStart(32, "div", 167)(33, "label", 168);
1247
+ i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_18_Conditional_30_Template, 7, 1, "div", 168);
1248
+ i0.ɵɵconditionalCreate(31, MCPDashboardComponent_Conditional_18_Conditional_31_Template, 7, 1, "div", 168);
1249
+ i0.ɵɵelementStart(32, "div", 168)(33, "label", 169);
1246
1250
  i0.ɵɵtext(34, "Default Auth Type");
1247
1251
  i0.ɵɵelementEnd();
1248
- i0.ɵɵelementStart(35, "select", 172, 3);
1252
+ i0.ɵɵelementStart(35, "select", 173, 3);
1249
1253
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_18_Template_select_change_35_listener() { i0.ɵɵrestoreView(_r29); const sfAuth_r38 = i0.ɵɵreference(36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ServerForm.DefaultAuthType = sfAuth_r38.value); });
1250
- i0.ɵɵrepeaterCreate(37, MCPDashboardComponent_Conditional_18_For_38_Template, 2, 2, "option", 173, _forTrack2);
1254
+ i0.ɵɵrepeaterCreate(37, MCPDashboardComponent_Conditional_18_For_38_Template, 2, 2, "option", 174, _forTrack2);
1251
1255
  i0.ɵɵelementEnd()();
1252
- i0.ɵɵelementStart(39, "div", 167)(40, "label", 168);
1256
+ i0.ɵɵelementStart(39, "div", 168)(40, "label", 169);
1253
1257
  i0.ɵɵtext(41, "Status");
1254
1258
  i0.ɵɵelementEnd();
1255
- i0.ɵɵelementStart(42, "select", 172, 4);
1259
+ i0.ɵɵelementStart(42, "select", 173, 4);
1256
1260
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_18_Template_select_change_42_listener() { i0.ɵɵrestoreView(_r29); const sfStatus_r40 = i0.ɵɵreference(43); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ServerForm.Status = sfStatus_r40.value); });
1257
- i0.ɵɵelementStart(44, "option", 174);
1261
+ i0.ɵɵelementStart(44, "option", 175);
1258
1262
  i0.ɵɵtext(45, "Active");
1259
1263
  i0.ɵɵelementEnd();
1260
- i0.ɵɵelementStart(46, "option", 175);
1264
+ i0.ɵɵelementStart(46, "option", 176);
1261
1265
  i0.ɵɵtext(47, "Inactive");
1262
1266
  i0.ɵɵelementEnd()()()();
1263
- i0.ɵɵelementStart(48, "div", 176)(49, "button", 177);
1267
+ i0.ɵɵelementStart(48, "div", 177)(49, "button", 178);
1264
1268
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_18_Template_button_click_49_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.saveServerForm()); });
1265
- i0.ɵɵconditionalCreate(50, MCPDashboardComponent_Conditional_18_Conditional_50_Template, 1, 0, "i", 154);
1269
+ i0.ɵɵconditionalCreate(50, MCPDashboardComponent_Conditional_18_Conditional_50_Template, 1, 0, "i", 155);
1266
1270
  i0.ɵɵtext(51);
1267
1271
  i0.ɵɵelementEnd();
1268
- i0.ɵɵelementStart(52, "button", 178);
1272
+ i0.ɵɵelementStart(52, "button", 179);
1269
1273
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_18_Template_button_click_52_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelServerForm()); });
1270
1274
  i0.ɵɵtext(53, "Cancel");
1271
1275
  i0.ɵɵelementEnd()()()();
@@ -1301,8 +1305,8 @@ function MCPDashboardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1301
1305
  i0.ɵɵtextInterpolate1(" ", ctx_r1.EditingServer ? "Update" : "Create", " ");
1302
1306
  } }
1303
1307
  function MCPDashboardComponent_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1304
- i0.ɵɵelementStart(0, "div", 166);
1305
- i0.ɵɵelement(1, "i", 41);
1308
+ i0.ɵɵelementStart(0, "div", 167);
1309
+ i0.ɵɵelement(1, "i", 42);
1306
1310
  i0.ɵɵtext(2);
1307
1311
  i0.ɵɵelementEnd();
1308
1312
  } if (rf & 2) {
@@ -1311,7 +1315,7 @@ function MCPDashboardComponent_Conditional_19_Conditional_8_Template(rf, ctx) {
1311
1315
  i0.ɵɵtextInterpolate1(" ", ctx_r1.ConnectionFormError, " ");
1312
1316
  } }
1313
1317
  function MCPDashboardComponent_Conditional_19_For_19_Template(rf, ctx) { if (rf & 1) {
1314
- i0.ɵɵelementStart(0, "option", 173);
1318
+ i0.ɵɵelementStart(0, "option", 174);
1315
1319
  i0.ɵɵtext(1);
1316
1320
  i0.ɵɵelementEnd();
1317
1321
  } if (rf & 2) {
@@ -1321,69 +1325,69 @@ function MCPDashboardComponent_Conditional_19_For_19_Template(rf, ctx) { if (rf
1321
1325
  i0.ɵɵtextInterpolate(s_r43.Name);
1322
1326
  } }
1323
1327
  function MCPDashboardComponent_Conditional_19_Conditional_45_Template(rf, ctx) { if (rf & 1) {
1324
- i0.ɵɵelement(0, "i", 154);
1328
+ i0.ɵɵelement(0, "i", 155);
1325
1329
  } }
1326
1330
  function MCPDashboardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1327
1331
  const _r41 = i0.ɵɵgetCurrentView();
1328
- i0.ɵɵelementStart(0, "div", 160);
1332
+ i0.ɵɵelementStart(0, "div", 161);
1329
1333
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_19_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelConnectionForm()); });
1330
- i0.ɵɵelementStart(1, "div", 181);
1334
+ i0.ɵɵelementStart(1, "div", 182);
1331
1335
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_19_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r41); return i0.ɵɵresetView($event.stopPropagation()); });
1332
- i0.ɵɵelementStart(2, "div", 162)(3, "h2", 163);
1336
+ i0.ɵɵelementStart(2, "div", 163)(3, "h2", 164);
1333
1337
  i0.ɵɵtext(4, "Add Connection");
1334
1338
  i0.ɵɵelementEnd();
1335
- i0.ɵɵelementStart(5, "button", 164);
1339
+ i0.ɵɵelementStart(5, "button", 165);
1336
1340
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_19_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelConnectionForm()); });
1337
- i0.ɵɵelement(6, "i", 43);
1341
+ i0.ɵɵelement(6, "i", 44);
1338
1342
  i0.ɵɵelementEnd()();
1339
- i0.ɵɵelementStart(7, "div", 165);
1340
- i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_19_Conditional_8_Template, 3, 1, "div", 166);
1341
- i0.ɵɵelementStart(9, "div", 167)(10, "label", 168);
1343
+ i0.ɵɵelementStart(7, "div", 166);
1344
+ i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_19_Conditional_8_Template, 3, 1, "div", 167);
1345
+ i0.ɵɵelementStart(9, "div", 168)(10, "label", 169);
1342
1346
  i0.ɵɵtext(11, "Server ");
1343
- i0.ɵɵelementStart(12, "span", 169);
1347
+ i0.ɵɵelementStart(12, "span", 170);
1344
1348
  i0.ɵɵtext(13, "*");
1345
1349
  i0.ɵɵelementEnd()();
1346
- i0.ɵɵelementStart(14, "select", 172, 7);
1350
+ i0.ɵɵelementStart(14, "select", 173, 7);
1347
1351
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_19_Template_select_change_14_listener() { i0.ɵɵrestoreView(_r41); const cfServer_r42 = i0.ɵɵreference(15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConnectionForm.MCPServerID = cfServer_r42.value); });
1348
- i0.ɵɵelementStart(16, "option", 182);
1352
+ i0.ɵɵelementStart(16, "option", 183);
1349
1353
  i0.ɵɵtext(17, "\u2014 select server \u2014");
1350
1354
  i0.ɵɵelementEnd();
1351
- i0.ɵɵrepeaterCreate(18, MCPDashboardComponent_Conditional_19_For_19_Template, 2, 2, "option", 173, _forTrack0);
1355
+ i0.ɵɵrepeaterCreate(18, MCPDashboardComponent_Conditional_19_For_19_Template, 2, 2, "option", 174, _forTrack0);
1352
1356
  i0.ɵɵelementEnd()();
1353
- i0.ɵɵelementStart(20, "div", 167)(21, "label", 168);
1357
+ i0.ɵɵelementStart(20, "div", 168)(21, "label", 169);
1354
1358
  i0.ɵɵtext(22, "Name ");
1355
- i0.ɵɵelementStart(23, "span", 169);
1359
+ i0.ɵɵelementStart(23, "span", 170);
1356
1360
  i0.ɵɵtext(24, "*");
1357
1361
  i0.ɵɵelementEnd()();
1358
- i0.ɵɵelementStart(25, "input", 183, 8);
1362
+ i0.ɵɵelementStart(25, "input", 184, 8);
1359
1363
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_19_Template_input_input_25_listener() { i0.ɵɵrestoreView(_r41); const cfName_r44 = i0.ɵɵreference(26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConnectionForm.Name = cfName_r44.value); });
1360
1364
  i0.ɵɵelementEnd()();
1361
- i0.ɵɵelementStart(27, "div", 167)(28, "label", 168);
1365
+ i0.ɵɵelementStart(27, "div", 168)(28, "label", 169);
1362
1366
  i0.ɵɵtext(29, "Bearer Token");
1363
1367
  i0.ɵɵelementEnd();
1364
- i0.ɵɵelementStart(30, "input", 184, 9);
1368
+ i0.ɵɵelementStart(30, "input", 185, 9);
1365
1369
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_19_Template_input_input_30_listener() { i0.ɵɵrestoreView(_r41); const cfToken_r45 = i0.ɵɵreference(31); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConnectionForm.BearerToken = cfToken_r45.value); });
1366
1370
  i0.ɵɵelementEnd();
1367
- i0.ɵɵelementStart(32, "span", 185);
1371
+ i0.ɵɵelementStart(32, "span", 186);
1368
1372
  i0.ɵɵtext(33, "Will be stored as a Credential and linked to this connection");
1369
1373
  i0.ɵɵelementEnd()();
1370
- i0.ɵɵelementStart(34, "div", 167)(35, "label", 168);
1374
+ i0.ɵɵelementStart(34, "div", 168)(35, "label", 169);
1371
1375
  i0.ɵɵtext(36, "Status");
1372
1376
  i0.ɵɵelementEnd();
1373
- i0.ɵɵelementStart(37, "select", 172, 10);
1377
+ i0.ɵɵelementStart(37, "select", 173, 10);
1374
1378
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_19_Template_select_change_37_listener() { i0.ɵɵrestoreView(_r41); const cfStatus_r46 = i0.ɵɵreference(38); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ConnectionForm.Status = cfStatus_r46.value); });
1375
- i0.ɵɵelementStart(39, "option", 174);
1379
+ i0.ɵɵelementStart(39, "option", 175);
1376
1380
  i0.ɵɵtext(40, "Active");
1377
1381
  i0.ɵɵelementEnd();
1378
- i0.ɵɵelementStart(41, "option", 175);
1382
+ i0.ɵɵelementStart(41, "option", 176);
1379
1383
  i0.ɵɵtext(42, "Inactive");
1380
1384
  i0.ɵɵelementEnd()()()();
1381
- i0.ɵɵelementStart(43, "div", 176)(44, "button", 177);
1385
+ i0.ɵɵelementStart(43, "div", 177)(44, "button", 178);
1382
1386
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_19_Template_button_click_44_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.saveConnectionForm()); });
1383
- i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_19_Conditional_45_Template, 1, 0, "i", 154);
1387
+ i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_19_Conditional_45_Template, 1, 0, "i", 155);
1384
1388
  i0.ɵɵtext(46, " Create ");
1385
1389
  i0.ɵɵelementEnd();
1386
- i0.ɵɵelementStart(47, "button", 178);
1390
+ i0.ɵɵelementStart(47, "button", 179);
1387
1391
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_19_Template_button_click_47_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelConnectionForm()); });
1388
1392
  i0.ɵɵtext(48, "Cancel");
1389
1393
  i0.ɵɵelementEnd()()()();
@@ -1407,7 +1411,7 @@ function MCPDashboardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1407
1411
  i0.ɵɵconditional(ctx_r1.ConnectionFormSaving ? 45 : -1);
1408
1412
  } }
1409
1413
  function MCPDashboardComponent_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1410
- i0.ɵɵelementStart(0, "span", 187);
1414
+ i0.ɵɵelementStart(0, "span", 188);
1411
1415
  i0.ɵɵtext(1);
1412
1416
  i0.ɵɵelementEnd();
1413
1417
  } if (rf & 2) {
@@ -1416,7 +1420,7 @@ function MCPDashboardComponent_Conditional_20_Conditional_5_Template(rf, ctx) {
1416
1420
  i0.ɵɵtextInterpolate1("\u2014 ", (ctx_r1.TestSelectedTool == null ? null : ctx_r1.TestSelectedTool.ToolTitle) || (ctx_r1.TestSelectedTool == null ? null : ctx_r1.TestSelectedTool.ToolName));
1417
1421
  } }
1418
1422
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_10_Template(rf, ctx) { if (rf & 1) {
1419
- i0.ɵɵelementStart(0, "option", 192);
1423
+ i0.ɵɵelementStart(0, "option", 193);
1420
1424
  i0.ɵɵtext(1);
1421
1425
  i0.ɵɵelementEnd();
1422
1426
  } if (rf & 2) {
@@ -1427,7 +1431,7 @@ function MCPDashboardComponent_Conditional_20_Conditional_20_For_10_Template(rf,
1427
1431
  i0.ɵɵtextInterpolate(s_r50.Name);
1428
1432
  } }
1429
1433
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_21_Template(rf, ctx) { if (rf & 1) {
1430
- i0.ɵɵelementStart(0, "option", 192);
1434
+ i0.ɵɵelementStart(0, "option", 193);
1431
1435
  i0.ɵɵtext(1);
1432
1436
  i0.ɵɵelementEnd();
1433
1437
  } if (rf & 2) {
@@ -1438,17 +1442,17 @@ function MCPDashboardComponent_Conditional_20_Conditional_20_For_21_Template(rf,
1438
1442
  i0.ɵɵtextInterpolate(c_r52.Name);
1439
1443
  } }
1440
1444
  function MCPDashboardComponent_Conditional_20_Conditional_20_Conditional_30_Template(rf, ctx) { if (rf & 1) {
1441
- i0.ɵɵelementStart(0, "div", 99);
1445
+ i0.ɵɵelementStart(0, "div", 100);
1442
1446
  i0.ɵɵtext(1, "No tools match.");
1443
1447
  i0.ɵɵelementEnd();
1444
1448
  } }
1445
1449
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1446
- i0.ɵɵelementStart(0, "span", 197);
1450
+ i0.ɵɵelementStart(0, "span", 198);
1447
1451
  i0.ɵɵtext(1, "Recent");
1448
1452
  i0.ɵɵelementEnd();
1449
1453
  } }
1450
1454
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1451
- i0.ɵɵelementStart(0, "div", 199);
1455
+ i0.ɵɵelementStart(0, "div", 200);
1452
1456
  i0.ɵɵtext(1);
1453
1457
  i0.ɵɵelementEnd();
1454
1458
  } if (rf & 2) {
@@ -1457,19 +1461,19 @@ function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_
1457
1461
  i0.ɵɵtextInterpolate(t_r55.ToolName);
1458
1462
  } }
1459
1463
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1460
- i0.ɵɵelement(0, "i", 200);
1464
+ i0.ɵɵelement(0, "i", 201);
1461
1465
  } }
1462
1466
  function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Template(rf, ctx) { if (rf & 1) {
1463
1467
  const _r54 = i0.ɵɵgetCurrentView();
1464
- i0.ɵɵelementStart(0, "div", 196);
1468
+ i0.ɵɵelementStart(0, "div", 197);
1465
1469
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Template_div_click_0_listener() { const t_r55 = i0.ɵɵrestoreView(_r54).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pickTestTool(t_r55.ID)); });
1466
- i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_1_Template, 2, 0, "span", 197);
1467
- i0.ɵɵelementStart(2, "div", 101)(3, "div", 198);
1470
+ i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_1_Template, 2, 0, "span", 198);
1471
+ i0.ɵɵelementStart(2, "div", 102)(3, "div", 199);
1468
1472
  i0.ɵɵtext(4);
1469
1473
  i0.ɵɵelementEnd();
1470
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_5_Template, 2, 1, "div", 199);
1474
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_5_Template, 2, 1, "div", 200);
1471
1475
  i0.ɵɵelementEnd();
1472
- i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_6_Template, 1, 0, "i", 200);
1476
+ i0.ɵɵconditionalCreate(6, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Conditional_6_Template, 1, 0, "i", 201);
1473
1477
  i0.ɵɵelementEnd();
1474
1478
  } if (rf & 2) {
1475
1479
  const t_r55 = ctx.$implicit;
@@ -1486,41 +1490,41 @@ function MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Template(rf,
1486
1490
  } }
1487
1491
  function MCPDashboardComponent_Conditional_20_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1488
1492
  const _r48 = i0.ɵɵgetCurrentView();
1489
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 168);
1493
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 169);
1490
1494
  i0.ɵɵtext(2, "Server ");
1491
- i0.ɵɵelementStart(3, "span", 169);
1495
+ i0.ɵɵelementStart(3, "span", 170);
1492
1496
  i0.ɵɵtext(4, "*");
1493
1497
  i0.ɵɵelementEnd()();
1494
- i0.ɵɵelementStart(5, "select", 191, 11);
1498
+ i0.ɵɵelementStart(5, "select", 192, 11);
1495
1499
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_20_Conditional_20_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r48); const tSrv_r49 = i0.ɵɵreference(6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTestServerChange(tSrv_r49.value)); });
1496
- i0.ɵɵelementStart(7, "option", 182);
1500
+ i0.ɵɵelementStart(7, "option", 183);
1497
1501
  i0.ɵɵtext(8, "\u2014 select server \u2014");
1498
1502
  i0.ɵɵelementEnd();
1499
- i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_20_Conditional_20_For_10_Template, 2, 3, "option", 192, _forTrack0);
1503
+ i0.ɵɵrepeaterCreate(9, MCPDashboardComponent_Conditional_20_Conditional_20_For_10_Template, 2, 3, "option", 193, _forTrack0);
1500
1504
  i0.ɵɵelementEnd()();
1501
- i0.ɵɵelementStart(11, "div", 167)(12, "label", 168);
1505
+ i0.ɵɵelementStart(11, "div", 168)(12, "label", 169);
1502
1506
  i0.ɵɵtext(13, "Connection ");
1503
- i0.ɵɵelementStart(14, "span", 169);
1507
+ i0.ɵɵelementStart(14, "span", 170);
1504
1508
  i0.ɵɵtext(15, "*");
1505
1509
  i0.ɵɵelementEnd()();
1506
- i0.ɵɵelementStart(16, "select", 191, 12);
1510
+ i0.ɵɵelementStart(16, "select", 192, 12);
1507
1511
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_20_Conditional_20_Template_select_change_16_listener() { i0.ɵɵrestoreView(_r48); const tConn_r51 = i0.ɵɵreference(17); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTestConnectionChange(tConn_r51.value)); });
1508
- i0.ɵɵelementStart(18, "option", 182);
1512
+ i0.ɵɵelementStart(18, "option", 183);
1509
1513
  i0.ɵɵtext(19, "\u2014 select connection \u2014");
1510
1514
  i0.ɵɵelementEnd();
1511
- i0.ɵɵrepeaterCreate(20, MCPDashboardComponent_Conditional_20_Conditional_20_For_21_Template, 2, 3, "option", 192, _forTrack0);
1515
+ i0.ɵɵrepeaterCreate(20, MCPDashboardComponent_Conditional_20_Conditional_20_For_21_Template, 2, 3, "option", 193, _forTrack0);
1512
1516
  i0.ɵɵelementEnd()();
1513
- i0.ɵɵelementStart(22, "div", 167)(23, "label", 168);
1517
+ i0.ɵɵelementStart(22, "div", 168)(23, "label", 169);
1514
1518
  i0.ɵɵtext(24, "Tool ");
1515
- i0.ɵɵelementStart(25, "span", 169);
1519
+ i0.ɵɵelementStart(25, "span", 170);
1516
1520
  i0.ɵɵtext(26, "*");
1517
1521
  i0.ɵɵelementEnd()();
1518
- i0.ɵɵelementStart(27, "input", 193, 13);
1522
+ i0.ɵɵelementStart(27, "input", 194, 13);
1519
1523
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_20_Conditional_20_Template_input_input_27_listener() { i0.ɵɵrestoreView(_r48); const tSearch_r53 = i0.ɵɵreference(28); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTestToolSearchChange(tSearch_r53.value)); });
1520
1524
  i0.ɵɵelementEnd();
1521
- i0.ɵɵelementStart(29, "div", 194);
1522
- i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_20_Conditional_20_Conditional_30_Template, 2, 0, "div", 99);
1523
- i0.ɵɵrepeaterCreate(31, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Template, 7, 6, "div", 195, _forTrack0);
1525
+ i0.ɵɵelementStart(29, "div", 195);
1526
+ i0.ɵɵconditionalCreate(30, MCPDashboardComponent_Conditional_20_Conditional_20_Conditional_30_Template, 2, 0, "div", 100);
1527
+ i0.ɵɵrepeaterCreate(31, MCPDashboardComponent_Conditional_20_Conditional_20_For_32_Template, 7, 6, "div", 196, _forTrack0);
1524
1528
  i0.ɵɵelementEnd()();
1525
1529
  } if (rf & 2) {
1526
1530
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1539,19 +1543,19 @@ function MCPDashboardComponent_Conditional_20_Conditional_20_Template(rf, ctx) {
1539
1543
  i0.ɵɵrepeater(ctx_r1.TestComboboxTools);
1540
1544
  } }
1541
1545
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
1542
- i0.ɵɵelementStart(0, "div", 201);
1543
- i0.ɵɵelement(1, "i", 202);
1546
+ i0.ɵɵelementStart(0, "div", 202);
1547
+ i0.ɵɵelement(1, "i", 203);
1544
1548
  i0.ɵɵelementStart(2, "p");
1545
1549
  i0.ɵɵtext(3, "This tool requires no parameters.");
1546
1550
  i0.ɵɵelementEnd()();
1547
1551
  } }
1548
1552
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1549
- i0.ɵɵelementStart(0, "span", 169);
1553
+ i0.ɵɵelementStart(0, "span", 170);
1550
1554
  i0.ɵɵtext(1, "*");
1551
1555
  i0.ɵɵelementEnd();
1552
1556
  } }
1553
1557
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1554
- i0.ɵɵelementStart(0, "p", 203);
1558
+ i0.ɵɵelementStart(0, "p", 204);
1555
1559
  i0.ɵɵtext(1);
1556
1560
  i0.ɵɵelementEnd();
1557
1561
  } if (rf & 2) {
@@ -1560,7 +1564,7 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1560
1564
  i0.ɵɵtextInterpolate(p_r56.description);
1561
1565
  } }
1562
1566
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_For_5_Template(rf, ctx) { if (rf & 1) {
1563
- i0.ɵɵelementStart(0, "option", 173);
1567
+ i0.ɵɵelementStart(0, "option", 174);
1564
1568
  i0.ɵɵtext(1);
1565
1569
  i0.ɵɵelementEnd();
1566
1570
  } if (rf & 2) {
@@ -1571,12 +1575,12 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1571
1575
  } }
1572
1576
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1573
1577
  const _r57 = i0.ɵɵgetCurrentView();
1574
- i0.ɵɵelementStart(0, "select", 191, 14);
1578
+ i0.ɵɵelementStart(0, "select", 192, 14);
1575
1579
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_Template_select_change_0_listener() { i0.ɵɵrestoreView(_r57); const enumEl_r58 = i0.ɵɵreference(1); const p_r56 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testSetParam(p_r56.name, enumEl_r58.value)); });
1576
- i0.ɵɵelementStart(2, "option", 182);
1580
+ i0.ɵɵelementStart(2, "option", 183);
1577
1581
  i0.ɵɵtext(3, "\u2014 select \u2014");
1578
1582
  i0.ɵɵelementEnd();
1579
- i0.ɵɵrepeaterCreate(4, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_For_5_Template, 2, 2, "option", 173, i0.ɵɵrepeaterTrackByIndex);
1583
+ i0.ɵɵrepeaterCreate(4, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_For_5_Template, 2, 2, "option", 174, i0.ɵɵrepeaterTrackByIndex);
1580
1584
  i0.ɵɵelementEnd();
1581
1585
  } if (rf & 2) {
1582
1586
  const p_r56 = i0.ɵɵnextContext().$implicit;
@@ -1585,18 +1589,18 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1585
1589
  } }
1586
1590
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1587
1591
  const _r60 = i0.ɵɵgetCurrentView();
1588
- i0.ɵɵelementStart(0, "select", 191, 15);
1592
+ i0.ɵɵelementStart(0, "select", 192, 15);
1589
1593
  i0.ɵɵlistener("change", function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_6_Template_select_change_0_listener() { i0.ɵɵrestoreView(_r60); const boolEl_r61 = i0.ɵɵreference(1); const p_r56 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testSetParam(p_r56.name, boolEl_r61.value)); });
1590
- i0.ɵɵelementStart(2, "option", 207);
1594
+ i0.ɵɵelementStart(2, "option", 208);
1591
1595
  i0.ɵɵtext(3, "false");
1592
1596
  i0.ɵɵelementEnd();
1593
- i0.ɵɵelementStart(4, "option", 208);
1597
+ i0.ɵɵelementStart(4, "option", 209);
1594
1598
  i0.ɵɵtext(5, "true");
1595
1599
  i0.ɵɵelementEnd()();
1596
1600
  } }
1597
1601
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1598
1602
  const _r62 = i0.ɵɵgetCurrentView();
1599
- i0.ɵɵelementStart(0, "textarea", 209, 16);
1603
+ i0.ɵɵelementStart(0, "textarea", 210, 16);
1600
1604
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_7_Template_textarea_input_0_listener() { i0.ɵɵrestoreView(_r62); const jsonEl_r63 = i0.ɵɵreference(1); const p_r56 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testSetParam(p_r56.name, jsonEl_r63.value)); });
1601
1605
  i0.ɵɵelementEnd();
1602
1606
  } if (rf & 2) {
@@ -1605,7 +1609,7 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1605
1609
  } }
1606
1610
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1607
1611
  const _r64 = i0.ɵɵgetCurrentView();
1608
- i0.ɵɵelementStart(0, "input", 210, 17);
1612
+ i0.ɵɵelementStart(0, "input", 211, 17);
1609
1613
  i0.ɵɵlistener("input", function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_8_Template_input_input_0_listener() { i0.ɵɵrestoreView(_r64); const strEl_r65 = i0.ɵɵreference(1); const p_r56 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.testSetParam(p_r56.name, strEl_r65.value)); });
1610
1614
  i0.ɵɵelementEnd();
1611
1615
  } if (rf & 2) {
@@ -1613,12 +1617,12 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1613
1617
  i0.ɵɵproperty("placeholder", p_r56.description || "Enter value...");
1614
1618
  } }
1615
1619
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Template(rf, ctx) { if (rf & 1) {
1616
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 168);
1620
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 169);
1617
1621
  i0.ɵɵtext(2);
1618
- i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_3_Template, 2, 0, "span", 169);
1622
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_3_Template, 2, 0, "span", 170);
1619
1623
  i0.ɵɵelementEnd();
1620
- i0.ɵɵconditionalCreate(4, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_4_Template, 2, 1, "p", 203);
1621
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_Template, 6, 0, "select", 204)(6, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_6_Template, 6, 0, "select", 204)(7, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_7_Template, 2, 1, "textarea", 205)(8, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_8_Template, 2, 1, "input", 206);
1624
+ i0.ɵɵconditionalCreate(4, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_4_Template, 2, 1, "p", 204);
1625
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_5_Template, 6, 0, "select", 205)(6, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_6_Template, 6, 0, "select", 205)(7, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_7_Template, 2, 1, "textarea", 206)(8, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Conditional_8_Template, 2, 1, "input", 207);
1622
1626
  i0.ɵɵelementEnd();
1623
1627
  } if (rf & 2) {
1624
1628
  const p_r56 = ctx.$implicit;
@@ -1632,19 +1636,19 @@ function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1
1632
1636
  i0.ɵɵconditional(p_r56.enumValues.length > 0 ? 5 : p_r56.type === "boolean" ? 6 : p_r56.type === "array" || p_r56.type === "object" ? 7 : 8);
1633
1637
  } }
1634
1638
  function MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1635
- i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Template, 9, 4, "div", 167, _forTrack3);
1639
+ i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_For_1_Template, 9, 4, "div", 168, _forTrack3);
1636
1640
  } if (rf & 2) {
1637
1641
  const ctx_r1 = i0.ɵɵnextContext(3);
1638
1642
  i0.ɵɵrepeater(ctx_r1.TestParamConfigs);
1639
1643
  } }
1640
1644
  function MCPDashboardComponent_Conditional_20_Conditional_21_Template(rf, ctx) { if (rf & 1) {
1641
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_0_Template, 4, 0, "div", 201)(1, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_Template, 2, 0);
1645
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_0_Template, 4, 0, "div", 202)(1, MCPDashboardComponent_Conditional_20_Conditional_21_Conditional_1_Template, 2, 0);
1642
1646
  } if (rf & 2) {
1643
1647
  const ctx_r1 = i0.ɵɵnextContext(2);
1644
1648
  i0.ɵɵconditional(ctx_r1.TestParamConfigs.length === 0 ? 0 : 1);
1645
1649
  } }
1646
1650
  function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1647
- i0.ɵɵelementStart(0, "span", 213);
1651
+ i0.ɵɵelementStart(0, "span", 214);
1648
1652
  i0.ɵɵtext(1);
1649
1653
  i0.ɵɵelementEnd();
1650
1654
  } if (rf & 2) {
@@ -1653,10 +1657,10 @@ function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Condi
1653
1657
  i0.ɵɵtextInterpolate1("", ctx_r1.TestExecutionResult == null ? null : ctx_r1.TestExecutionResult.DurationMs, "ms");
1654
1658
  } }
1655
1659
  function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Template(rf, ctx) { if (rf & 1) {
1656
- i0.ɵɵelementStart(0, "div", 211);
1657
- i0.ɵɵelement(1, "i", 92);
1660
+ i0.ɵɵelementStart(0, "div", 212);
1661
+ i0.ɵɵelement(1, "i", 93);
1658
1662
  i0.ɵɵtext(2, " Execution Successful ");
1659
- i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Conditional_3_Template, 2, 1, "span", 213);
1663
+ i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Conditional_3_Template, 2, 1, "span", 214);
1660
1664
  i0.ɵɵelementEnd();
1661
1665
  } if (rf & 2) {
1662
1666
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -1664,16 +1668,16 @@ function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Templ
1664
1668
  i0.ɵɵconditional((ctx_r1.TestExecutionResult == null ? null : ctx_r1.TestExecutionResult.DurationMs) ? 3 : -1);
1665
1669
  } }
1666
1670
  function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1667
- i0.ɵɵelementStart(0, "div", 212);
1668
- i0.ɵɵelement(1, "i", 153);
1671
+ i0.ɵɵelementStart(0, "div", 213);
1672
+ i0.ɵɵelement(1, "i", 154);
1669
1673
  i0.ɵɵtext(2, " Execution Failed ");
1670
1674
  i0.ɵɵelementEnd();
1671
1675
  } }
1672
1676
  function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1673
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 214);
1677
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 215);
1674
1678
  i0.ɵɵtext(2, "Error");
1675
1679
  i0.ɵɵelementEnd();
1676
- i0.ɵɵelementStart(3, "pre", 215);
1680
+ i0.ɵɵelementStart(3, "pre", 216);
1677
1681
  i0.ɵɵtext(4);
1678
1682
  i0.ɵɵelementEnd()();
1679
1683
  } if (rf & 2) {
@@ -1682,10 +1686,10 @@ function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_2_Templ
1682
1686
  i0.ɵɵtextInterpolate(ctx_r1.TestExecutionResult == null ? null : ctx_r1.TestExecutionResult.ErrorMessage);
1683
1687
  } }
1684
1688
  function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
1685
- i0.ɵɵelementStart(0, "div")(1, "label", 214);
1689
+ i0.ɵɵelementStart(0, "div")(1, "label", 215);
1686
1690
  i0.ɵɵtext(2, "Result");
1687
1691
  i0.ɵɵelementEnd();
1688
- i0.ɵɵelementStart(3, "pre", 216);
1692
+ i0.ɵɵelementStart(3, "pre", 217);
1689
1693
  i0.ɵɵtext(4);
1690
1694
  i0.ɵɵelementEnd()();
1691
1695
  } if (rf & 2) {
@@ -1694,8 +1698,8 @@ function MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_3_Templ
1694
1698
  i0.ɵɵtextInterpolate(ctx_r1.formatTestResult(ctx_r1.TestExecutionResult == null ? null : ctx_r1.TestExecutionResult.Result));
1695
1699
  } }
1696
1700
  function MCPDashboardComponent_Conditional_20_Conditional_22_Template(rf, ctx) { if (rf & 1) {
1697
- i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Template, 4, 1, "div", 211)(1, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_1_Template, 3, 0, "div", 212);
1698
- i0.ɵɵconditionalCreate(2, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_2_Template, 5, 1, "div", 167);
1701
+ i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_0_Template, 4, 1, "div", 212)(1, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_1_Template, 3, 0, "div", 213);
1702
+ i0.ɵɵconditionalCreate(2, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_2_Template, 5, 1, "div", 168);
1699
1703
  i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_20_Conditional_22_Conditional_3_Template, 5, 1, "div");
1700
1704
  } if (rf & 2) {
1701
1705
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -1707,12 +1711,12 @@ function MCPDashboardComponent_Conditional_20_Conditional_22_Template(rf, ctx) {
1707
1711
  } }
1708
1712
  function MCPDashboardComponent_Conditional_20_Conditional_24_Template(rf, ctx) { if (rf & 1) {
1709
1713
  const _r66 = i0.ɵɵgetCurrentView();
1710
- i0.ɵɵelementStart(0, "button", 177);
1714
+ i0.ɵɵelementStart(0, "button", 178);
1711
1715
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_24_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r66); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testProceedToConfig()); });
1712
1716
  i0.ɵɵtext(1, "Next ");
1713
- i0.ɵɵelement(2, "i", 217);
1717
+ i0.ɵɵelement(2, "i", 218);
1714
1718
  i0.ɵɵelementEnd();
1715
- i0.ɵɵelementStart(3, "button", 178);
1719
+ i0.ɵɵelementStart(3, "button", 179);
1716
1720
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_24_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r66); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testCloseDialog()); });
1717
1721
  i0.ɵɵtext(4, "Cancel");
1718
1722
  i0.ɵɵelementEnd();
@@ -1721,22 +1725,22 @@ function MCPDashboardComponent_Conditional_20_Conditional_24_Template(rf, ctx) {
1721
1725
  i0.ɵɵproperty("disabled", !ctx_r1.TestCanProceed);
1722
1726
  } }
1723
1727
  function MCPDashboardComponent_Conditional_20_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
1724
- i0.ɵɵelement(0, "i", 154);
1728
+ i0.ɵɵelement(0, "i", 155);
1725
1729
  i0.ɵɵtext(1, " Executing... ");
1726
1730
  } }
1727
1731
  function MCPDashboardComponent_Conditional_20_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
1728
- i0.ɵɵelement(0, "i", 39);
1732
+ i0.ɵɵelement(0, "i", 40);
1729
1733
  i0.ɵɵtext(1, " Execute ");
1730
1734
  } }
1731
1735
  function MCPDashboardComponent_Conditional_20_Conditional_25_Template(rf, ctx) { if (rf & 1) {
1732
1736
  const _r67 = i0.ɵɵgetCurrentView();
1733
- i0.ɵɵelementStart(0, "button", 177);
1737
+ i0.ɵɵelementStart(0, "button", 178);
1734
1738
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_25_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r67); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testExecuteTool()); });
1735
1739
  i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_20_Conditional_25_Conditional_1_Template, 2, 0)(2, MCPDashboardComponent_Conditional_20_Conditional_25_Conditional_2_Template, 2, 0);
1736
1740
  i0.ɵɵelementEnd();
1737
- i0.ɵɵelementStart(3, "button", 178);
1741
+ i0.ɵɵelementStart(3, "button", 179);
1738
1742
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r67); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testGoBack()); });
1739
- i0.ɵɵelement(4, "i", 218);
1743
+ i0.ɵɵelement(4, "i", 219);
1740
1744
  i0.ɵɵtext(5, " Back");
1741
1745
  i0.ɵɵelementEnd();
1742
1746
  } if (rf & 2) {
@@ -1747,53 +1751,53 @@ function MCPDashboardComponent_Conditional_20_Conditional_25_Template(rf, ctx) {
1747
1751
  } }
1748
1752
  function MCPDashboardComponent_Conditional_20_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1749
1753
  const _r68 = i0.ɵɵgetCurrentView();
1750
- i0.ɵɵelementStart(0, "button", 219);
1754
+ i0.ɵɵelementStart(0, "button", 220);
1751
1755
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_26_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r68); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testRunAgain()); });
1752
- i0.ɵɵelement(1, "i", 220);
1756
+ i0.ɵɵelement(1, "i", 221);
1753
1757
  i0.ɵɵtext(2, " Run Again");
1754
1758
  i0.ɵɵelementEnd();
1755
- i0.ɵɵelementStart(3, "button", 178);
1759
+ i0.ɵɵelementStart(3, "button", 179);
1756
1760
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_26_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r68); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testGoBack()); });
1757
1761
  i0.ɵɵtext(4, "Edit Params");
1758
1762
  i0.ɵɵelementEnd();
1759
- i0.ɵɵelementStart(5, "button", 178);
1763
+ i0.ɵɵelementStart(5, "button", 179);
1760
1764
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Conditional_26_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r68); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.testCloseDialog()); });
1761
1765
  i0.ɵɵtext(6, "Close");
1762
1766
  i0.ɵɵelementEnd();
1763
1767
  } }
1764
1768
  function MCPDashboardComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1765
1769
  const _r47 = i0.ɵɵgetCurrentView();
1766
- i0.ɵɵelementStart(0, "div", 160);
1770
+ i0.ɵɵelementStart(0, "div", 161);
1767
1771
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r47); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.testCloseDialog()); });
1768
- i0.ɵɵelementStart(1, "div", 186);
1772
+ i0.ɵɵelementStart(1, "div", 187);
1769
1773
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r47); return i0.ɵɵresetView($event.stopPropagation()); });
1770
- i0.ɵɵelementStart(2, "div", 162)(3, "h2", 163);
1774
+ i0.ɵɵelementStart(2, "div", 163)(3, "h2", 164);
1771
1775
  i0.ɵɵtext(4, " Test MCP Tool ");
1772
- i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_5_Template, 2, 1, "span", 187);
1776
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_20_Conditional_5_Template, 2, 1, "span", 188);
1773
1777
  i0.ɵɵelementEnd();
1774
- i0.ɵɵelementStart(6, "button", 164);
1778
+ i0.ɵɵelementStart(6, "button", 165);
1775
1779
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_20_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r47); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.testCloseDialog()); });
1776
- i0.ɵɵelement(7, "i", 43);
1780
+ i0.ɵɵelement(7, "i", 44);
1777
1781
  i0.ɵɵelementEnd()();
1778
- i0.ɵɵelementStart(8, "div", 188)(9, "span", 189);
1782
+ i0.ɵɵelementStart(8, "div", 189)(9, "span", 190);
1779
1783
  i0.ɵɵtext(10, "1. Select");
1780
1784
  i0.ɵɵelementEnd();
1781
- i0.ɵɵelementStart(11, "span", 190);
1785
+ i0.ɵɵelementStart(11, "span", 191);
1782
1786
  i0.ɵɵtext(12, "\u203A");
1783
1787
  i0.ɵɵelementEnd();
1784
- i0.ɵɵelementStart(13, "span", 189);
1788
+ i0.ɵɵelementStart(13, "span", 190);
1785
1789
  i0.ɵɵtext(14, "2. Configure");
1786
1790
  i0.ɵɵelementEnd();
1787
- i0.ɵɵelementStart(15, "span", 190);
1791
+ i0.ɵɵelementStart(15, "span", 191);
1788
1792
  i0.ɵɵtext(16, "\u203A");
1789
1793
  i0.ɵɵelementEnd();
1790
- i0.ɵɵelementStart(17, "span", 189);
1794
+ i0.ɵɵelementStart(17, "span", 190);
1791
1795
  i0.ɵɵtext(18, "3. Results");
1792
1796
  i0.ɵɵelementEnd()();
1793
- i0.ɵɵelementStart(19, "div", 165);
1797
+ i0.ɵɵelementStart(19, "div", 166);
1794
1798
  i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_20_Conditional_20_Template, 33, 4)(21, MCPDashboardComponent_Conditional_20_Conditional_21_Template, 2, 1)(22, MCPDashboardComponent_Conditional_20_Conditional_22_Template, 4, 3);
1795
1799
  i0.ɵɵelementEnd();
1796
- i0.ɵɵelementStart(23, "div", 176);
1800
+ i0.ɵɵelementStart(23, "div", 177);
1797
1801
  i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_20_Conditional_24_Template, 5, 1)(25, MCPDashboardComponent_Conditional_20_Conditional_25_Template, 6, 2)(26, MCPDashboardComponent_Conditional_20_Conditional_26_Template, 7, 0);
1798
1802
  i0.ɵɵelementEnd()()();
1799
1803
  } if (rf & 2) {
@@ -1812,7 +1816,7 @@ function MCPDashboardComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
1812
1816
  i0.ɵɵconditional(ctx_r1.TestStep === "select" ? 24 : ctx_r1.TestStep === "configure" ? 25 : 26);
1813
1817
  } }
1814
1818
  function MCPDashboardComponent_Conditional_21_Conditional_14_Template(rf, ctx) { if (rf & 1) {
1815
- i0.ɵɵelementStart(0, "span", 227);
1819
+ i0.ɵɵelementStart(0, "span", 228);
1816
1820
  i0.ɵɵtext(1, "\u00B7");
1817
1821
  i0.ɵɵelementEnd();
1818
1822
  i0.ɵɵelementStart(2, "span");
@@ -1824,7 +1828,7 @@ function MCPDashboardComponent_Conditional_21_Conditional_14_Template(rf, ctx) {
1824
1828
  i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.SelectedLog.DurationMs));
1825
1829
  } }
1826
1830
  function MCPDashboardComponent_Conditional_21_Conditional_23_Template(rf, ctx) { if (rf & 1) {
1827
- i0.ɵɵelementStart(0, "div", 233);
1831
+ i0.ɵɵelementStart(0, "div", 234);
1828
1832
  i0.ɵɵtext(1);
1829
1833
  i0.ɵɵelementEnd();
1830
1834
  } if (rf & 2) {
@@ -1833,10 +1837,10 @@ function MCPDashboardComponent_Conditional_21_Conditional_23_Template(rf, ctx) {
1833
1837
  i0.ɵɵtextInterpolate(ctx_r1.SelectedLog.ServerName);
1834
1838
  } }
1835
1839
  function MCPDashboardComponent_Conditional_21_Conditional_24_Template(rf, ctx) { if (rf & 1) {
1836
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 236);
1840
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 237);
1837
1841
  i0.ɵɵtext(2, "Input Arguments");
1838
1842
  i0.ɵɵelementEnd();
1839
- i0.ɵɵelementStart(3, "pre", 237);
1843
+ i0.ɵɵelementStart(3, "pre", 238);
1840
1844
  i0.ɵɵtext(4);
1841
1845
  i0.ɵɵelementEnd()();
1842
1846
  } if (rf & 2) {
@@ -1845,10 +1849,10 @@ function MCPDashboardComponent_Conditional_21_Conditional_24_Template(rf, ctx) {
1845
1849
  i0.ɵɵtextInterpolate(ctx_r1.formatLogJson(ctx_r1.SelectedLog.InputArgs));
1846
1850
  } }
1847
1851
  function MCPDashboardComponent_Conditional_21_Conditional_25_Template(rf, ctx) { if (rf & 1) {
1848
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 236);
1852
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 237);
1849
1853
  i0.ɵɵtext(2, "Result");
1850
1854
  i0.ɵɵelementEnd();
1851
- i0.ɵɵelementStart(3, "pre", 238);
1855
+ i0.ɵɵelementStart(3, "pre", 239);
1852
1856
  i0.ɵɵtext(4);
1853
1857
  i0.ɵɵelementEnd()();
1854
1858
  } if (rf & 2) {
@@ -1857,10 +1861,10 @@ function MCPDashboardComponent_Conditional_21_Conditional_25_Template(rf, ctx) {
1857
1861
  i0.ɵɵtextInterpolate(ctx_r1.formatLogJson(ctx_r1.SelectedLog.Result));
1858
1862
  } }
1859
1863
  function MCPDashboardComponent_Conditional_21_Conditional_26_Template(rf, ctx) { if (rf & 1) {
1860
- i0.ɵɵelementStart(0, "div", 167)(1, "label", 239);
1864
+ i0.ɵɵelementStart(0, "div", 168)(1, "label", 240);
1861
1865
  i0.ɵɵtext(2, "Error");
1862
1866
  i0.ɵɵelementEnd();
1863
- i0.ɵɵelementStart(3, "pre", 240);
1867
+ i0.ɵɵelementStart(3, "pre", 241);
1864
1868
  i0.ɵɵtext(4);
1865
1869
  i0.ɵɵelementEnd()();
1866
1870
  } if (rf & 2) {
@@ -1870,24 +1874,24 @@ function MCPDashboardComponent_Conditional_21_Conditional_26_Template(rf, ctx) {
1870
1874
  } }
1871
1875
  function MCPDashboardComponent_Conditional_21_Conditional_28_Template(rf, ctx) { if (rf & 1) {
1872
1876
  const _r70 = i0.ɵɵgetCurrentView();
1873
- i0.ɵɵelementStart(0, "button", 219);
1877
+ i0.ɵɵelementStart(0, "button", 220);
1874
1878
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_21_Conditional_28_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r70); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onRunAgainFromLog({ toolId: ctx_r1.SelectedLog.ToolID, connectionId: ctx_r1.SelectedLog.ConnectionID })); });
1875
- i0.ɵɵelement(1, "i", 220);
1879
+ i0.ɵɵelement(1, "i", 221);
1876
1880
  i0.ɵɵtext(2, " Run Again");
1877
1881
  i0.ɵɵelementEnd();
1878
1882
  } }
1879
1883
  function MCPDashboardComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
1880
1884
  const _r69 = i0.ɵɵgetCurrentView();
1881
- i0.ɵɵelementStart(0, "div", 33)(1, "div", 221);
1885
+ i0.ɵɵelementStart(0, "div", 33)(1, "div", 222);
1882
1886
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_21_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r69); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); });
1883
1887
  i0.ɵɵelementEnd();
1884
- i0.ɵɵelementStart(2, "div", 222)(3, "div", 223)(4, "div")(5, "h3", 224);
1888
+ i0.ɵɵelementStart(2, "div", 223)(3, "div", 224)(4, "div")(5, "h3", 225);
1885
1889
  i0.ɵɵtext(6);
1886
1890
  i0.ɵɵelementEnd();
1887
- i0.ɵɵelementStart(7, "div", 225)(8, "span", 226);
1891
+ i0.ɵɵelementStart(7, "div", 226)(8, "span", 227);
1888
1892
  i0.ɵɵtext(9);
1889
1893
  i0.ɵɵelementEnd();
1890
- i0.ɵɵelementStart(10, "span", 227);
1894
+ i0.ɵɵelementStart(10, "span", 228);
1891
1895
  i0.ɵɵtext(11, "\u00B7");
1892
1896
  i0.ɵɵelementEnd();
1893
1897
  i0.ɵɵelementStart(12, "span");
@@ -1895,25 +1899,25 @@ function MCPDashboardComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
1895
1899
  i0.ɵɵelementEnd();
1896
1900
  i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_21_Conditional_14_Template, 4, 1);
1897
1901
  i0.ɵɵelementEnd()();
1898
- i0.ɵɵelementStart(15, "button", 228);
1902
+ i0.ɵɵelementStart(15, "button", 229);
1899
1903
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_21_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r69); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); });
1900
- i0.ɵɵelement(16, "i", 229);
1904
+ i0.ɵɵelement(16, "i", 230);
1901
1905
  i0.ɵɵelementEnd()();
1902
- i0.ɵɵelementStart(17, "div", 230)(18, "div", 167)(19, "div", 231);
1906
+ i0.ɵɵelementStart(17, "div", 231)(18, "div", 168)(19, "div", 232);
1903
1907
  i0.ɵɵtext(20, "Connection");
1904
1908
  i0.ɵɵelementEnd();
1905
- i0.ɵɵelementStart(21, "div", 232);
1909
+ i0.ɵɵelementStart(21, "div", 233);
1906
1910
  i0.ɵɵtext(22);
1907
1911
  i0.ɵɵelementEnd();
1908
- i0.ɵɵconditionalCreate(23, MCPDashboardComponent_Conditional_21_Conditional_23_Template, 2, 1, "div", 233);
1912
+ i0.ɵɵconditionalCreate(23, MCPDashboardComponent_Conditional_21_Conditional_23_Template, 2, 1, "div", 234);
1909
1913
  i0.ɵɵelementEnd();
1910
- i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_21_Conditional_24_Template, 5, 1, "div", 167);
1911
- i0.ɵɵconditionalCreate(25, MCPDashboardComponent_Conditional_21_Conditional_25_Template, 5, 1, "div", 167);
1912
- i0.ɵɵconditionalCreate(26, MCPDashboardComponent_Conditional_21_Conditional_26_Template, 5, 1, "div", 167);
1914
+ i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_21_Conditional_24_Template, 5, 1, "div", 168);
1915
+ i0.ɵɵconditionalCreate(25, MCPDashboardComponent_Conditional_21_Conditional_25_Template, 5, 1, "div", 168);
1916
+ i0.ɵɵconditionalCreate(26, MCPDashboardComponent_Conditional_21_Conditional_26_Template, 5, 1, "div", 168);
1913
1917
  i0.ɵɵelementEnd();
1914
- i0.ɵɵelementStart(27, "div", 234);
1915
- i0.ɵɵconditionalCreate(28, MCPDashboardComponent_Conditional_21_Conditional_28_Template, 3, 0, "button", 235);
1916
- i0.ɵɵelementStart(29, "button", 178);
1918
+ i0.ɵɵelementStart(27, "div", 235);
1919
+ i0.ɵɵconditionalCreate(28, MCPDashboardComponent_Conditional_21_Conditional_28_Template, 3, 0, "button", 236);
1920
+ i0.ɵɵelementStart(29, "button", 179);
1917
1921
  i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_21_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r69); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); });
1918
1922
  i0.ɵɵtext(30, "Close");
1919
1923
  i0.ɵɵelementEnd()()()();
@@ -4290,23 +4294,24 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
4290
4294
  this.cdr.detectChanges();
4291
4295
  }
4292
4296
  static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MCPToolsService)); };
4293
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 22, vars: 17, consts: [["sfName", ""], ["sfDesc", ""], ["sfTransport", ""], ["sfAuth", ""], ["sfStatus", ""], ["sfUrl", ""], ["sfCmd", ""], ["cfServer", ""], ["cfName", ""], ["cfToken", ""], ["cfStatus", ""], ["tSrv", ""], ["tConn", ""], ["tSearch", ""], ["enumEl", ""], ["boolEl", ""], ["jsonEl", ""], ["strEl", ""], ["Title", "MCP Dashboard", "Icon", "fa-solid fa-plug-circle-bolt"], ["meta", ""], ["Label", "items", 3, "Count", "Total"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], ["mjButton", "", "variant", "primary", "size", "sm"], [3, "Loading"], ["toolbar", ""], [3, "TabChange", "Tabs", "ActiveKey"], ["Placeholder", "Search\u2026", 3, "ValueChange", "Value"], [3, "Flex"], [1, "error-banner"], ["text", "Loading MCP data..."], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "pointer-events", "none"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "title"], [1, "fa-solid"], [1, "fa-solid", "fa-play"], [3, "Clicked", "Loading"], [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, "fa-solid", "fa-server"], [1, "data-card", 3, "expanded"], [1, "data-card"], [1, "card-header", "clickable", 3, "click"], [1, "card-title"], [1, "fa-solid", "fa-chevron-right", "expand-arrow"], [1, "name"], [1, "status-badge", 3, "ngClass"], [1, "card-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "flat", "title", "Delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "card-body"], [1, "description"], [1, "details-grid"], [1, "detail"], [1, "label"], [1, "value"], [1, "detail", "full-width"], [1, "expanded-tools-section"], [1, "value", "url"], [1, "value", "command"], [1, "tools-section-header"], [1, "fa-solid", "fa-wrench"], [1, "no-tools-message"], [1, "tools-mini-list"], [1, "fa-solid", "fa-info-circle"], [1, "tool-mini-card"], [1, "tool-mini-info"], [1, "tool-mini-name"], [1, "tool-mini-params"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool", 3, "click"], [1, "fa-solid", "fa-link"], ["mjButton", "", "variant", "flat", "title", "Sync Tools", 3, "click", "disabled"], [1, "fa-solid", "fa-sync", "fa-spin"], [1, "fa-solid", "fa-sync"], [1, "sync-progress-banner"], [1, "sync-result-banner", 3, "success", "error"], [1, "detail", "full-width", "error"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "sync-message"], [1, "sync-result-banner"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool with this connection", 3, "click"], [1, "tools-container"], [2, "padding", "8px 12px", "font-size", "0.8rem", "color", "var(--mj-text-secondary,#475569)", "background", "var(--mj-bg-surface-card,#f8f9fa)", "border-radius", "4px", "margin-bottom", "6px"], [2, "height", "calc(100vh - 260px)", "width", "100%", "overflow-y", "auto", "border", "1px solid var(--mj-border-subtle,#eee)", "border-radius", "4px", 3, "scroll"], [2, "display", "flex", "align-items", "center", "gap", "12px", "padding", "12px 14px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", "height", "72px", "box-sizing", "border-box"], [2, "padding", "12px", "text-align", "center", "font-size", "0.8rem", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-wrench", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "flex", "1", "min-width", "0"], [2, "font-weight", "500", "font-size", "0.875rem", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "1rem", 3, "click", "title"], [1, "status-badge", "small", 3, "ngClass"], [1, "hint"], [1, "server-group", 3, "collapsed"], [1, "server-group"], [1, "server-group-header", 3, "click"], [1, "server-info"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "server-name"], [1, "tool-count"], [1, "server-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Test a tool", 3, "click"], [1, "tools-grid"], [1, "tools-list"], [1, "tool-card", 3, "expanded"], [1, "tool-card"], [1, "tool-card-header", 3, "click"], [1, "tool-title"], [1, "tool-meta"], ["title", "Parameters", 1, "param-badge"], [1, "tool-description"], [1, "tool-card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "tool-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value", "mono"], [1, "detail-value"], [1, "detail-row", "full"], [1, "schema-preview"], [1, "tool-name-cell"], [1, "tool-name-info"], [1, "tool-code"], [1, "description-cell"], [1, "param-count"], [1, "actions-cell"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "0.95rem", "margin-right", "4px", 3, "click", "title"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Details", 3, "click"], [1, "detail-row-expanded"], ["colspan", "6"], [1, "inline-details"], [1, "detail-section"], [1, "detail-section", "full"], [1, "fa-solid", "fa-list-check"], [1, "sortable", 3, "click", "ngClass"], [1, "sort-icon", "fa-solid"], ["title", "Click for details", 1, "clickable-row", 3, "error-row"], ["title", "Click for details", 1, "clickable-row", 3, "click"], [1, "fa-solid", "fa-times-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-question-circle"], [1, "tool-name"], [1, "error-message", 3, "title"], [1, "action-cell"], [1, "fa-solid", "fa-chevron-right"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center", 3, "click"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "600px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "display", "flex", "align-items", "center", "justify-content", "space-between", "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "margin", "0", "font-size", "1.125rem", "font-weight", "600", "color", "var(--mj-text-primary,#333)"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "width", "32px", "height", "32px", "border", "none", "background", "none", "cursor", "pointer", "color", "var(--mj-text-muted,#888)", "border-radius", "4px", 3, "click"], [2, "flex", "1", "overflow-y", "auto", "padding", "20px", "color", "var(--mj-text-primary,#333)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "10px 14px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)", "font-size", "0.875rem"], [2, "margin-bottom", "16px"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "color", "var(--mj-text-primary,#333)", "margin-bottom", "4px"], [2, "color", "var(--mj-status-error,#e53e3e)"], ["placeholder", "e.g., GitHub MCP Server", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Optional description", "rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change", "value"], [3, "value"], ["value", "Active"], ["value", "Inactive"], [2, "display", "flex", "align-items", "center", "gap", "8px", "padding", "16px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click"], ["placeholder", "https://api.example.com/mcp", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "e.g., npx", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "560px", "max-width", "90vw", "max-height", "90vh", 3, "click"], ["value", ""], ["placeholder", "e.g., Zapier Connection", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Paste bearer token here", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "value"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "640px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "font-size", "0.875rem", "font-weight", "400", "color", "var(--mj-text-muted,#888)", "margin-left", "8px"], [2, "display", "flex", "gap", "0", "padding", "10px 20px", "background", "var(--mj-bg-surface-card,#f9f9f9)", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "font-size", "0.8rem", "font-weight", "500"], [2, "margin", "0 8px", "color", "var(--mj-text-muted,#888)"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change"], [3, "value", "selected"], ["type", "text", "placeholder", "Search tools\u2026 (Recently used appear first)", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "margin-bottom", "6px", 3, "input", "value"], [2, "max-height", "220px", "overflow-y", "auto", "border", "1px solid var(--mj-border-default,#e0e0e0)", "border-radius", "4px", "background", "var(--mj-bg-surface,#fff)"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "background"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "click"], [2, "font-size", "0.65rem", "background", "var(--mj-brand-primary,#264FAF)", "color", "#fff", "padding", "1px 6px", "border-radius", "8px", "font-weight", "600"], [2, "font-size", "0.85rem", "font-weight", "500", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.7rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [1, "fa-solid", "fa-check", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "text-align", "center", "padding", "24px", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-check-circle", 2, "font-size", "2rem", "margin-bottom", "8px", "display", "block"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin", "0 0 4px 0"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "placeholder"], ["value", "false"], ["value", "true"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "placeholder"], [2, "background", "var(--mj-status-success-bg,#f0fff4)", "border", "1px solid var(--mj-status-success-border,#9ae6b4)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-success-text,#276749)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)"], [2, "float", "right", "font-size", "0.75rem"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "4px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "300px", "margin", "0"], [1, "fa-solid", "fa-arrow-right"], [1, "fa-solid", "fa-arrow-left"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-redo"], [2, "position", "absolute", "inset", "0", "background", "rgba(0,0,0,0.35)", "pointer-events", "auto", 3, "click"], [2, "position", "absolute", "top", "0", "right", "0", "height", "100%", "width", "560px", "max-width", "95vw", "background", "var(--mj-bg-surface,#fff)", "box-shadow", "-4px 0 20px rgba(0,0,0,0.15)", "display", "flex", "flex-direction", "column", "pointer-events", "auto"], [2, "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "align-items", "center", "justify-content", "space-between"], [2, "margin", "0", "font-size", "1rem", "font-weight", "600"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "4px"], [2, "font-weight", "600"], [2, "margin", "0 8px"], ["mjButton", "", "aria-label", "Close", 3, "click"], [1, "fa-solid", "fa-xmark"], [2, "flex", "1", "overflow-y", "auto", "padding", "16px 20px"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-bottom", "4px"], [2, "font-size", "0.875rem"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "2px"], [2, "padding", "12px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "gap", "8px", "justify-content", "flex-start"], ["mjButton", "", "variant", "primary"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "240px", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "360px", "margin", "0"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px", "color", "var(--mj-status-error-text,#c53030)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0", "color", "var(--mj-status-error-text,#c53030)"]], template: function MCPDashboardComponent_Template(rf, ctx) { if (rf & 1) {
4297
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 22, vars: 17, consts: [["sfName", ""], ["sfDesc", ""], ["sfTransport", ""], ["sfAuth", ""], ["sfStatus", ""], ["sfUrl", ""], ["sfCmd", ""], ["cfServer", ""], ["cfName", ""], ["cfToken", ""], ["cfStatus", ""], ["tSrv", ""], ["tConn", ""], ["tSearch", ""], ["enumEl", ""], ["boolEl", ""], ["jsonEl", ""], ["strEl", ""], ["Title", "MCP Dashboard", "Icon", "fa-solid fa-plug-circle-bolt"], ["meta", ""], ["Label", "items", 3, "Count", "Total"], ["actions", ""], ["mjButton", "", "variant", "primary", "size", "sm"], [3, "Loading"], ["toolbar", ""], [3, "TabChange", "Tabs", "ActiveKey"], ["Placeholder", "Search\u2026", 3, "ValueChange", "Value"], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "Flex"], [1, "error-banner"], ["text", "Loading MCP data..."], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "pointer-events", "none"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "action-btn-label"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "title"], [1, "fa-solid"], [1, "fa-solid", "fa-play"], [3, "Clicked", "Loading"], [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, "fa-solid", "fa-server"], [1, "data-card", 3, "expanded"], [1, "data-card"], [1, "card-header", "clickable", 3, "click"], [1, "card-title"], [1, "fa-solid", "fa-chevron-right", "expand-arrow"], [1, "name"], [1, "status-badge", 3, "ngClass"], [1, "card-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "flat", "title", "Delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "card-body"], [1, "description"], [1, "details-grid"], [1, "detail"], [1, "label"], [1, "value"], [1, "detail", "full-width"], [1, "expanded-tools-section"], [1, "value", "url"], [1, "value", "command"], [1, "tools-section-header"], [1, "fa-solid", "fa-wrench"], [1, "no-tools-message"], [1, "tools-mini-list"], [1, "fa-solid", "fa-info-circle"], [1, "tool-mini-card"], [1, "tool-mini-info"], [1, "tool-mini-name"], [1, "tool-mini-params"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool", 3, "click"], [1, "fa-solid", "fa-link"], ["mjButton", "", "variant", "flat", "title", "Sync Tools", 3, "click", "disabled"], [1, "fa-solid", "fa-sync", "fa-spin"], [1, "fa-solid", "fa-sync"], [1, "sync-progress-banner"], [1, "sync-result-banner", 3, "success", "error"], [1, "detail", "full-width", "error"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "sync-message"], [1, "sync-result-banner"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test this tool with this connection", 3, "click"], [1, "tools-container"], [2, "padding", "8px 12px", "font-size", "0.8rem", "color", "var(--mj-text-secondary,#475569)", "background", "var(--mj-bg-surface-card,#f8f9fa)", "border-radius", "4px", "margin-bottom", "6px"], [2, "height", "calc(100vh - 260px)", "width", "100%", "overflow-y", "auto", "border", "1px solid var(--mj-border-subtle,#eee)", "border-radius", "4px", 3, "scroll"], [2, "display", "flex", "align-items", "center", "gap", "12px", "padding", "12px 14px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", "height", "72px", "box-sizing", "border-box"], [2, "padding", "12px", "text-align", "center", "font-size", "0.8rem", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-wrench", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "flex", "1", "min-width", "0"], [2, "font-weight", "500", "font-size", "0.875rem", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "1rem", 3, "click", "title"], [1, "status-badge", "small", 3, "ngClass"], [1, "hint"], [1, "server-group", 3, "collapsed"], [1, "server-group"], [1, "server-group-header", 3, "click"], [1, "server-info"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "server-name"], [1, "tool-count"], [1, "server-actions", 3, "click"], ["mjButton", "", "variant", "flat", "title", "Test a tool", 3, "click"], [1, "tools-grid"], [1, "tools-list"], [1, "tool-card", 3, "expanded"], [1, "tool-card"], [1, "tool-card-header", 3, "click"], [1, "tool-title"], [1, "tool-meta"], ["title", "Parameters", 1, "param-badge"], [1, "tool-description"], [1, "tool-card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View details", 3, "click"], [1, "tool-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value", "mono"], [1, "detail-value"], [1, "detail-row", "full"], [1, "schema-preview"], [1, "tool-name-cell"], [1, "tool-name-info"], [1, "tool-code"], [1, "description-cell"], [1, "param-count"], [1, "actions-cell"], ["type", "button", 2, "background", "transparent", "border", "none", "cursor", "pointer", "padding", "4px", "font-size", "0.95rem", "margin-right", "4px", 3, "click", "title"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Test", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Details", 3, "click"], [1, "detail-row-expanded"], ["colspan", "6"], [1, "inline-details"], [1, "detail-section"], [1, "detail-section", "full"], [1, "fa-solid", "fa-list-check"], [1, "sortable", 3, "click", "ngClass"], [1, "sort-icon", "fa-solid"], ["title", "Click for details", 1, "clickable-row", 3, "error-row"], ["title", "Click for details", 1, "clickable-row", 3, "click"], [1, "fa-solid", "fa-times-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-question-circle"], [1, "tool-name"], [1, "error-message", 3, "title"], [1, "action-cell"], [1, "fa-solid", "fa-chevron-right"], [2, "position", "fixed", "inset", "0", "z-index", "10000", "background", "rgba(0,0,0,0.5)", "display", "flex", "align-items", "center", "justify-content", "center", 3, "click"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "600px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "display", "flex", "align-items", "center", "justify-content", "space-between", "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "margin", "0", "font-size", "1.125rem", "font-weight", "600", "color", "var(--mj-text-primary,#333)"], [2, "display", "flex", "align-items", "center", "justify-content", "center", "width", "32px", "height", "32px", "border", "none", "background", "none", "cursor", "pointer", "color", "var(--mj-text-muted,#888)", "border-radius", "4px", 3, "click"], [2, "flex", "1", "overflow-y", "auto", "padding", "20px", "color", "var(--mj-text-primary,#333)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "10px 14px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)", "font-size", "0.875rem"], [2, "margin-bottom", "16px"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "color", "var(--mj-text-primary,#333)", "margin-bottom", "4px"], [2, "color", "var(--mj-status-error,#e53e3e)"], ["placeholder", "e.g., GitHub MCP Server", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Optional description", "rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change", "value"], [3, "value"], ["value", "Active"], ["value", "Inactive"], [2, "display", "flex", "align-items", "center", "gap", "8px", "padding", "16px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click"], ["placeholder", "https://api.example.com/mcp", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "e.g., npx", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "560px", "max-width", "90vw", "max-height", "90vh", 3, "click"], ["value", ""], ["placeholder", "e.g., Zapier Connection", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "value"], ["placeholder", "Paste bearer token here", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "value"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)"], [2, "display", "flex", "flex-direction", "column", "background", "var(--mj-bg-surface,#fff)", "border-radius", "8px", "box-shadow", "0 20px 60px rgba(0,0,0,0.3)", "overflow", "hidden", "width", "640px", "max-width", "90vw", "max-height", "90vh", 3, "click"], [2, "font-size", "0.875rem", "font-weight", "400", "color", "var(--mj-text-muted,#888)", "margin-left", "8px"], [2, "display", "flex", "gap", "0", "padding", "10px 20px", "background", "var(--mj-bg-surface-card,#f9f9f9)", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "flex-shrink", "0"], [2, "font-size", "0.8rem", "font-weight", "500"], [2, "margin", "0 8px", "color", "var(--mj-text-muted,#888)"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "change"], [3, "value", "selected"], ["type", "text", "placeholder", "Search tools\u2026 (Recently used appear first)", 1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", "margin-bottom", "6px", 3, "input", "value"], [2, "max-height", "220px", "overflow-y", "auto", "border", "1px solid var(--mj-border-default,#e0e0e0)", "border-radius", "4px", "background", "var(--mj-bg-surface,#fff)"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "background"], [2, "padding", "8px 12px", "cursor", "pointer", "display", "flex", "align-items", "center", "gap", "8px", "border-bottom", "1px solid var(--mj-border-subtle,#eee)", 3, "click"], [2, "font-size", "0.65rem", "background", "var(--mj-brand-primary,#264FAF)", "color", "#fff", "padding", "1px 6px", "border-radius", "8px", "font-weight", "600"], [2, "font-size", "0.85rem", "font-weight", "500", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [2, "font-size", "0.7rem", "color", "var(--mj-text-muted,#888)", "overflow", "hidden", "text-overflow", "ellipsis", "white-space", "nowrap"], [1, "fa-solid", "fa-check", 2, "color", "var(--mj-brand-primary,#264FAF)"], [2, "text-align", "center", "padding", "24px", "color", "var(--mj-text-muted,#888)"], [1, "fa-solid", "fa-check-circle", 2, "font-size", "2rem", "margin-bottom", "8px", "display", "block"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin", "0 0 4px 0"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "placeholder"], ["value", "false"], ["value", "true"], ["rows", "3", 1, "mj-textarea", 2, "width", "100%", "box-sizing", "border-box", "font-family", "monospace", "font-size", "0.8rem", 3, "input", "placeholder"], [1, "mj-input", 2, "width", "100%", "box-sizing", "border-box", 3, "input", "placeholder"], [2, "background", "var(--mj-status-success-bg,#f0fff4)", "border", "1px solid var(--mj-status-success-border,#9ae6b4)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-success-text,#276749)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "6px", "padding", "12px 16px", "margin-bottom", "16px", "color", "var(--mj-status-error-text,#c53030)"], [2, "float", "right", "font-size", "0.75rem"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "4px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.8rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "300px", "margin", "0"], [1, "fa-solid", "fa-arrow-right"], [1, "fa-solid", "fa-arrow-left"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-redo"], [2, "position", "absolute", "inset", "0", "background", "rgba(0,0,0,0.35)", "pointer-events", "auto", 3, "click"], [2, "position", "absolute", "top", "0", "right", "0", "height", "100%", "width", "560px", "max-width", "95vw", "background", "var(--mj-bg-surface,#fff)", "box-shadow", "-4px 0 20px rgba(0,0,0,0.15)", "display", "flex", "flex-direction", "column", "pointer-events", "auto"], [2, "padding", "16px 20px", "border-bottom", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "align-items", "center", "justify-content", "space-between"], [2, "margin", "0", "font-size", "1rem", "font-weight", "600"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "4px"], [2, "font-weight", "600"], [2, "margin", "0 8px"], ["mjButton", "", "aria-label", "Close", 3, "click"], [1, "fa-solid", "fa-xmark"], [2, "flex", "1", "overflow-y", "auto", "padding", "16px 20px"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-bottom", "4px"], [2, "font-size", "0.875rem"], [2, "font-size", "0.75rem", "color", "var(--mj-text-muted,#888)", "margin-top", "2px"], [2, "padding", "12px 20px", "border-top", "1px solid var(--mj-border-default,#e0e0e0)", "display", "flex", "gap", "8px", "justify-content", "flex-start"], ["mjButton", "", "variant", "primary"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "240px", "margin", "0"], [2, "background", "var(--mj-bg-surface-sunken,#f0f0f0)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "overflow-y", "auto", "max-height", "360px", "margin", "0"], [2, "display", "block", "font-size", "0.875rem", "font-weight", "500", "margin-bottom", "6px", "color", "var(--mj-status-error-text,#c53030)"], [2, "background", "var(--mj-status-error-bg,#fff5f5)", "border", "1px solid var(--mj-status-error-border,#feb2b2)", "border-radius", "4px", "padding", "12px", "font-size", "0.75rem", "white-space", "pre-wrap", "word-break", "break-all", "margin", "0", "color", "var(--mj-status-error-text,#c53030)"]], template: function MCPDashboardComponent_Template(rf, ctx) { if (rf & 1) {
4294
4298
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 18)(2, "div", 19);
4295
4299
  i0.ɵɵelement(3, "mj-stat-badge", 20);
4296
4300
  i0.ɵɵelementEnd();
4297
- i0.ɵɵelementStart(4, "div", 21)(5, "mj-filter-popover", 22);
4298
- i0.ɵɵlistener("ClearAllRequested", function MCPDashboardComponent_Template_mj_filter_popover_ClearAllRequested_5_listener() { return ctx.resetPopoverFilters(); });
4299
- i0.ɵɵelementStart(6, "mj-filter-panel", 23);
4300
- i0.ɵɵlistener("ValuesChange", function MCPDashboardComponent_Template_mj_filter_panel_ValuesChange_6_listener($event) { return ctx.onFilterValuesChange($event); })("Reset", function MCPDashboardComponent_Template_mj_filter_panel_Reset_6_listener() { return ctx.resetPopoverFilters(); });
4301
- i0.ɵɵelementEnd()();
4302
- i0.ɵɵconditionalCreate(7, MCPDashboardComponent_Case_7_Template, 3, 0, "button", 24)(8, MCPDashboardComponent_Case_8_Template, 3, 0, "button", 24)(9, MCPDashboardComponent_Case_9_Template, 7, 8)(10, MCPDashboardComponent_Case_10_Template, 1, 1, "mj-refresh-button", 25);
4301
+ i0.ɵɵelementStart(4, "div", 21);
4302
+ i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Case_5_Template, 4, 0, "button", 22)(6, MCPDashboardComponent_Case_6_Template, 4, 0, "button", 22)(7, MCPDashboardComponent_Case_7_Template, 9, 8)(8, MCPDashboardComponent_Case_8_Template, 1, 1, "mj-refresh-button", 23);
4303
+ i0.ɵɵelementEnd();
4304
+ i0.ɵɵelementStart(9, "div", 24)(10, "mj-tab-nav", 25);
4305
+ i0.ɵɵlistener("TabChange", function MCPDashboardComponent_Template_mj_tab_nav_TabChange_10_listener($event) { return ctx.setActiveTab($event); });
4303
4306
  i0.ɵɵelementEnd();
4304
- i0.ɵɵelementStart(11, "div", 26)(12, "mj-tab-nav", 27);
4305
- i0.ɵɵlistener("TabChange", function MCPDashboardComponent_Template_mj_tab_nav_TabChange_12_listener($event) { return ctx.setActiveTab($event); });
4307
+ i0.ɵɵelementStart(11, "mj-page-search", 26);
4308
+ i0.ɵɵlistener("ValueChange", function MCPDashboardComponent_Template_mj_page_search_ValueChange_11_listener($event) { return ctx.onSearchTermChange($event); });
4306
4309
  i0.ɵɵelementEnd();
4307
- i0.ɵɵelementStart(13, "mj-page-search", 28);
4308
- i0.ɵɵlistener("ValueChange", function MCPDashboardComponent_Template_mj_page_search_ValueChange_13_listener($event) { return ctx.onSearchTermChange($event); });
4309
- i0.ɵɵelementEnd()()();
4310
+ i0.ɵɵelementStart(12, "mj-filter-popover", 27);
4311
+ i0.ɵɵlistener("ClearAllRequested", function MCPDashboardComponent_Template_mj_filter_popover_ClearAllRequested_12_listener() { return ctx.resetPopoverFilters(); });
4312
+ i0.ɵɵelementStart(13, "mj-filter-panel", 28);
4313
+ i0.ɵɵlistener("ValuesChange", function MCPDashboardComponent_Template_mj_filter_panel_ValuesChange_13_listener($event) { return ctx.onFilterValuesChange($event); })("Reset", function MCPDashboardComponent_Template_mj_filter_panel_Reset_13_listener() { return ctx.resetPopoverFilters(); });
4314
+ i0.ɵɵelementEnd()()()();
4310
4315
  i0.ɵɵelementStart(14, "mj-page-body", 29);
4311
4316
  i0.ɵɵconditionalCreate(15, MCPDashboardComponent_Conditional_15_Template, 5, 1, "div", 30);
4312
4317
  i0.ɵɵconditionalCreate(16, MCPDashboardComponent_Conditional_16_Template, 1, 0, "mj-loading", 31)(17, MCPDashboardComponent_Conditional_17_Template, 4, 1);
@@ -4316,20 +4321,20 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
4316
4321
  i0.ɵɵconditionalCreate(20, MCPDashboardComponent_Conditional_20_Template, 27, 9, "div", 32);
4317
4322
  i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_21_Template, 31, 12, "div", 33);
4318
4323
  } if (rf & 2) {
4319
- let tmp_6_0;
4324
+ let tmp_2_0;
4320
4325
  i0.ɵɵadvance(3);
4321
4326
  i0.ɵɵproperty("Count", ctx.CurrentFilteredCount)("Total", ctx.CurrentTotalCount);
4322
4327
  i0.ɵɵadvance(2);
4323
- i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
4324
- i0.ɵɵadvance();
4325
- i0.ɵɵproperty("Fields", ctx.mcpFilterFields)("Values", ctx.mcpFilterValues);
4326
- i0.ɵɵadvance();
4327
- i0.ɵɵconditional((tmp_6_0 = ctx.ActiveTab) === "servers" ? 7 : tmp_6_0 === "connections" ? 8 : tmp_6_0 === "tools" ? 9 : tmp_6_0 === "logs" ? 10 : -1);
4328
+ i0.ɵɵconditional((tmp_2_0 = ctx.ActiveTab) === "servers" ? 5 : tmp_2_0 === "connections" ? 6 : tmp_2_0 === "tools" ? 7 : tmp_2_0 === "logs" ? 8 : -1);
4328
4329
  i0.ɵɵadvance(5);
4329
4330
  i0.ɵɵproperty("Tabs", ctx.mcpTabs)("ActiveKey", ctx.ActiveTab);
4330
4331
  i0.ɵɵadvance();
4331
4332
  i0.ɵɵproperty("Value", ctx.CurrentFilters.searchTerm);
4332
4333
  i0.ɵɵadvance();
4334
+ i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
4335
+ i0.ɵɵadvance();
4336
+ i0.ɵɵproperty("Fields", ctx.mcpFilterFields)("Values", ctx.mcpFilterValues);
4337
+ i0.ɵɵadvance();
4333
4338
  i0.ɵɵproperty("Flex", true);
4334
4339
  i0.ɵɵadvance();
4335
4340
  i0.ɵɵconditional(ctx.ErrorMessage ? 15 : -1);
@@ -4351,7 +4356,7 @@ MCPDashboardComponent = __decorate([
4351
4356
  export { MCPDashboardComponent };
4352
4357
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPDashboardComponent, [{
4353
4358
  type: Component,
4354
- args: [{ standalone: false, selector: 'mj-mcp-dashboard', template: "<mj-page-layout>\n <!-- Header -->\n <mj-page-header\n Title=\"MCP Dashboard\"\n Icon=\"fa-solid fa-plug-circle-bolt\">\n <div meta>\n <mj-stat-badge [Count]=\"CurrentFilteredCount\" [Total]=\"CurrentTotalCount\" Label=\"items\"></mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"mcpFilterFields\"\n [Values]=\"mcpFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <mj-view-toggle\n [Options]=\"toolsViewOptions\"\n [ActiveKey]=\"ToolsViewMode\"\n (KeyChange)=\"setToolsViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\"\n (click)=\"toggleScalableMode(!useScalablePagination)\"\n [title]=\"useScalablePagination ? 'Scale mode on: virtual scroll, paginated' : 'Enable scale mode for large tool sets'\">\n <i class=\"fa-solid\" [class.fa-bolt]=\"useScalablePagination\" [class.fa-bolt-lightning]=\"!useScalablePagination\"></i>\n Scale: {{ useScalablePagination ? 'ON' : 'OFF' }}\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadAllData()\"></mj-refresh-button>\n }\n }\n </div>\n <div toolbar>\n <!-- Tab Navigation -->\n <mj-tab-nav\n [Tabs]=\"mcpTabs\"\n [ActiveKey]=\"ActiveTab\"\n (TabChange)=\"setActiveTab($any($event))\">\n </mj-tab-nav>\n <mj-page-search\n Placeholder=\"Search\u2026\"\n [Value]=\"CurrentFilters.searchTerm\"\n (ValueChange)=\"onSearchTermChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <!-- Main Content -->\n <mj-page-body [Flex]=\"true\">\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 @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\">{{ server.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\">{{ server.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\">{{ conn.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\">{{ conn.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (useScalablePagination) {\n <div style=\"padding:8px 12px;font-size:0.8rem;color:var(--mj-text-secondary,#475569);background:var(--mj-bg-surface-card,#f8f9fa);border-radius:4px;margin-bottom:6px\">\n Showing <strong>{{ visiblePagedTools.length }}</strong> of <strong>{{ scaleDenominator() }}</strong> tools\n </div>\n <div style=\"height:calc(100vh - 260px);width:100%;overflow-y:auto;border:1px solid var(--mj-border-subtle,#eee);border-radius:4px\" (scroll)=\"onToolsScrollNative($event)\">\n @for (tool of visiblePagedTools; track tool.ID) {\n <div style=\"display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--mj-border-subtle,#eee);height:72px;box-sizing:border-box\">\n <i class=\"fa-solid fa-wrench\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-weight:500;font-size:0.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ToolTitle || tool.ToolName }}</div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ServerName }} \u00B7 {{ tool.ToolName }}</div>\n </div>\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">{{ tool.Status }}</span>\n </div>\n }\n @if (toolsLoading) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">Loading more\u2026</div>\n }\n </div>\n } @else if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ getServerToolCount(group.server.ID) }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\">{{ tool.ToolDescription }}</p>\n }\n <div class=\"tool-card-actions\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\">{{ tool.ToolTitle || tool.ToolName }}</span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\">{{ tool.ToolDescription || '-' }}</td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:0.95rem;margin-right:4px\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </mj-page-body>\n</mj-page-layout>\n\n<!-- Server Dialog (inline \u2014 avoids sub-component DI issues) -->\n@if (ShowServerDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelServerForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:600px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">{{ EditingServer ? 'Edit MCP Server' : 'Add MCP Server' }}</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelServerForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ServerFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ServerFormError }}\n </div>\n }\n <!-- Name -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfName class=\"mj-input\" placeholder=\"e.g., GitHub MCP Server\" [value]=\"ServerForm.Name\" (input)=\"ServerForm.Name = sfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <!-- Description -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Description</label>\n <textarea #sfDesc class=\"mj-textarea\" placeholder=\"Optional description\" [value]=\"ServerForm.Description\" (input)=\"ServerForm.Description = sfDesc.value\" rows=\"3\" style=\"width:100%;box-sizing:border-box\"></textarea>\n </div>\n <!-- Transport Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Transport Type <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #sfTransport class=\"mj-input\" [value]=\"ServerForm.TransportType\" (change)=\"ServerForm.TransportType = sfTransport.value\" style=\"width:100%;box-sizing:border-box\">\n @for (t of TransportTypes; track t.value) {\n <option [value]=\"t.value\">{{ t.label }}</option>\n }\n </select>\n </div>\n <!-- Server URL (for HTTP-based transports) -->\n @if (ServerForm.TransportType === 'StreamableHTTP' || ServerForm.TransportType === 'SSE' || ServerForm.TransportType === 'WebSocket') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server URL <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfUrl class=\"mj-input\" placeholder=\"https://api.example.com/mcp\" [value]=\"ServerForm.ServerURL\" (input)=\"ServerForm.ServerURL = sfUrl.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Command (for Stdio) -->\n @if (ServerForm.TransportType === 'Stdio') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Command <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfCmd class=\"mj-input\" placeholder=\"e.g., npx\" [value]=\"ServerForm.Command\" (input)=\"ServerForm.Command = sfCmd.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Auth Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Default Auth Type</label>\n <select #sfAuth class=\"mj-input\" [value]=\"ServerForm.DefaultAuthType\" (change)=\"ServerForm.DefaultAuthType = sfAuth.value\" style=\"width:100%;box-sizing:border-box\">\n @for (a of AuthTypes; track a.value) {\n <option [value]=\"a.value\">{{ a.label }}</option>\n }\n </select>\n </div>\n <!-- Status -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #sfStatus class=\"mj-input\" [value]=\"ServerForm.Status\" (change)=\"ServerForm.Status = sfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveServerForm()\" [disabled]=\"ServerFormSaving\">\n @if (ServerFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n {{ EditingServer ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancelServerForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Connection Dialog (inline) -->\n@if (ShowConnectionDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelConnectionForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:560px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">Add Connection</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelConnectionForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ConnectionFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ConnectionFormError }}\n </div>\n }\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #cfServer class=\"mj-input\" [value]=\"ConnectionForm.MCPServerID\" (change)=\"ConnectionForm.MCPServerID = cfServer.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #cfName class=\"mj-input\" placeholder=\"e.g., Zapier Connection\" [value]=\"ConnectionForm.Name\" (input)=\"ConnectionForm.Name = cfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Bearer Token</label>\n <input #cfToken class=\"mj-input\" placeholder=\"Paste bearer token here\" [value]=\"ConnectionForm.BearerToken\" (input)=\"ConnectionForm.BearerToken = cfToken.value\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" />\n <span style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">Will be stored as a Credential and linked to this connection</span>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #cfStatus class=\"mj-input\" [value]=\"ConnectionForm.Status\" (change)=\"ConnectionForm.Status = cfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveConnectionForm()\" [disabled]=\"ConnectionFormSaving\">\n @if (ConnectionFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n Create\n </button>\n <button mjButton (click)=\"cancelConnectionForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Test Tool Dialog (inline) -->\n@if (ShowTestToolDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"testCloseDialog()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:640px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">\n Test MCP Tool\n @if (TestStep !== 'select') {\n <span style=\"font-size:0.875rem;font-weight:400;color:var(--mj-text-muted,#888);margin-left:8px\">\u2014 {{ TestSelectedTool?.ToolTitle || TestSelectedTool?.ToolName }}</span>\n }\n </h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"testCloseDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Step indicator -->\n <div style=\"display:flex;gap:0;padding:10px 20px;background:var(--mj-bg-surface-card,#f9f9f9);border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='select' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">1. Select</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='configure' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">2. Configure</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='results' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">3. Results</span>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (TestStep === 'select') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tSrv class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"onTestServerChange(tSrv.value)\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\" [selected]=\"TestToolServerID === s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Connection <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tConn class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [attr.disabled]=\"!TestToolServerID ? true : null\" (change)=\"onTestConnectionChange(tConn.value)\">\n <option value=\"\">\u2014 select connection \u2014</option>\n @for (c of TestFilteredConnections; track c.ID) {\n <option [value]=\"c.ID\" [selected]=\"TestToolConnectionID === c.ID\">{{ c.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Tool <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #tSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box;margin-bottom:6px\" placeholder=\"Search tools\u2026 (Recently used appear first)\" [value]=\"TestToolSearch\" (input)=\"onTestToolSearchChange(tSearch.value)\" [attr.disabled]=\"!TestToolServerID ? true : null\" />\n <div style=\"max-height:220px;overflow-y:auto;border:1px solid var(--mj-border-default,#e0e0e0);border-radius:4px;background:var(--mj-bg-surface,#fff)\">\n @if (TestComboboxTools.length === 0) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">No tools match.</div>\n }\n @for (t of TestComboboxTools; track t.ID) {\n <div (click)=\"pickTestTool(t.ID)\" style=\"padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--mj-border-subtle,#eee)\" [style.background]=\"TestToolID === t.ID ? 'color-mix(in srgb, var(--mj-brand-primary,#264FAF) 12%, var(--mj-bg-surface,#fff))' : null\">\n @if (isRecentTestTool(t.ID)) {\n <span style=\"font-size:0.65rem;background:var(--mj-brand-primary,#264FAF);color:#fff;padding:1px 6px;border-radius:8px;font-weight:600\">Recent</span>\n }\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-size:0.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolTitle || t.ToolName }}</div>\n @if (t.ToolTitle && t.ToolName !== t.ToolTitle) {\n <div style=\"font-size:0.7rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolName }}</div>\n }\n </div>\n @if (TestToolID === t.ID) {\n <i class=\"fa-solid fa-check\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n }\n </div>\n }\n </div>\n </div>\n } @else if (TestStep === 'configure') {\n @if (TestParamConfigs.length === 0) {\n <div style=\"text-align:center;padding:24px;color:var(--mj-text-muted,#888)\">\n <i class=\"fa-solid fa-check-circle\" style=\"font-size:2rem;margin-bottom:8px;display:block\"></i>\n <p>This tool requires no parameters.</p>\n </div>\n } @else {\n @for (p of TestParamConfigs; track p.name) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">\n {{ p.name }} @if (p.required) { <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span> }\n </label>\n @if (p.description) {\n <p style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin:0 0 4px 0\">{{ p.description }}</p>\n }\n @if (p.enumValues.length > 0) {\n <select #enumEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, enumEl.value)\">\n <option value=\"\">\u2014 select \u2014</option>\n @for (v of p.enumValues; track $index) { <option [value]=\"$any(v)\">{{ $any(v) }}</option> }\n </select>\n } @else if (p.type === 'boolean') {\n <select #boolEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, boolEl.value)\">\n <option value=\"false\">false</option>\n <option value=\"true\">true</option>\n </select>\n } @else if (p.type === 'array' || p.type === 'object') {\n <textarea #jsonEl class=\"mj-textarea\" rows=\"3\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" (input)=\"testSetParam(p.name, jsonEl.value)\" [placeholder]=\"'Enter JSON ' + p.type + '...'\"></textarea>\n } @else {\n <input #strEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (input)=\"testSetParam(p.name, strEl.value)\" [placeholder]=\"p.description || 'Enter value...'\" />\n }\n </div>\n }\n }\n } @else {\n @if (TestExecutionResult?.Success) {\n <div style=\"background:var(--mj-status-success-bg,#f0fff4);border:1px solid var(--mj-status-success-border,#9ae6b4);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-success-text,#276749)\">\n <i class=\"fa-solid fa-check-circle\"></i> Execution Successful\n @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }\n </div>\n } @else {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030)\">\n <i class=\"fa-solid fa-times-circle\"></i> Execution Failed\n </div>\n }\n @if (TestExecutionResult?.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Error</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;margin:0\">{{ TestExecutionResult?.ErrorMessage }}</pre>\n </div>\n }\n @if (TestExecutionResult?.Result) {\n <div>\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:300px;margin:0\">{{ formatTestResult(TestExecutionResult?.Result) }}</pre>\n </div>\n }\n }\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n @if (TestStep === 'select') {\n <button mjButton variant=\"primary\" (click)=\"testProceedToConfig()\" [disabled]=\"!TestCanProceed\">Next <i class=\"fa-solid fa-arrow-right\"></i></button>\n <button mjButton (click)=\"testCloseDialog()\">Cancel</button>\n } @else if (TestStep === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"testExecuteTool()\" [disabled]=\"!TestIsValid || TestIsExecuting\">\n @if (TestIsExecuting) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Executing... } @else { <i class=\"fa-solid fa-play\"></i> Execute }\n </button>\n <button mjButton (click)=\"testGoBack()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n } @else {\n <button mjButton variant=\"primary\" (click)=\"testRunAgain()\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n <button mjButton (click)=\"testGoBack()\">Edit Params</button>\n <button mjButton (click)=\"testCloseDialog()\">Close</button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Log Detail Panel (inlined) -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <div style=\"position:fixed;inset:0;z-index:10000;pointer-events:none\">\n <div style=\"position:absolute;inset:0;background:rgba(0,0,0,0.35);pointer-events:auto\" (click)=\"onLogDetailClose()\"></div>\n <div style=\"position:absolute;top:0;right:0;height:100%;width:560px;max-width:95vw;background:var(--mj-bg-surface,#fff);box-shadow:-4px 0 20px rgba(0,0,0,0.15);display:flex;flex-direction:column;pointer-events:auto\">\n <div style=\"padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);display:flex;align-items:center;justify-content:space-between\">\n <div>\n <h3 style=\"margin:0;font-size:1rem;font-weight:600\">{{ SelectedLog.ToolName }}</h3>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:4px\">\n <span [class]=\"SelectedLog.Status === 'Success' ? 'status-success' : SelectedLog.Status === 'Error' ? 'status-error' : 'status-running'\" style=\"font-weight:600\">{{ SelectedLog.Status }}</span>\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDate(SelectedLog.StartedAt) }}</span>\n @if (SelectedLog.DurationMs != null) {\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDuration(SelectedLog.DurationMs) }}</span>\n }\n </div>\n </div>\n <button mjButton (click)=\"onLogDetailClose()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:16px 20px\">\n <div style=\"margin-bottom:16px\">\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-bottom:4px\">Connection</div>\n <div style=\"font-size:0.875rem\">{{ SelectedLog.ConnectionName || SelectedLog.ConnectionID }}</div>\n @if (SelectedLog.ServerName) {\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:2px\">{{ SelectedLog.ServerName }}</div>\n }\n </div>\n @if (SelectedLog.InputArgs) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Input Arguments</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:240px;margin:0\">{{ formatLogJson(SelectedLog.InputArgs) }}</pre>\n </div>\n }\n @if (SelectedLog.Result) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:360px;margin:0\">{{ formatLogJson(SelectedLog.Result) }}</pre>\n </div>\n }\n @if (SelectedLog.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px;color:var(--mj-status-error-text,#c53030)\">Error</label>\n <pre style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;margin:0;color:var(--mj-status-error-text,#c53030)\">{{ SelectedLog.ErrorMessage }}</pre>\n </div>\n }\n </div>\n <div style=\"padding:12px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);display:flex;gap:8px;justify-content:flex-start\">\n @if (SelectedLog.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgainFromLog({ toolId: SelectedLog.ToolID!, connectionId: SelectedLog.ConnectionID })\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n }\n <button mjButton (click)=\"onLogDetailClose()\">Close</button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* MCP Dashboard - Header + Filter Panel Layout (outer shell now provided by <mj-page-layout>) */\n\n/* Tab navigation now provided by <mj-tab-nav>. */\n\n/* ========================================\n Main Content Area\n ======================================== */\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 0 0 16px 0;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-brand-primary);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: var(--mj-status-error);\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success i {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error i {\n color: var(--mj-status-error);\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-brand-primary);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: var(--mj-text-disabled);\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state i {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View mode toggle now provided by <mj-view-toggle>.\n ======================================== */\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list tbody tr.expanded {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row .action-cell {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-brand-primary);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: var(--mj-text-disabled);\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
4359
+ args: [{ standalone: false, selector: 'mj-mcp-dashboard', template: "<mj-page-layout>\n <!-- Header -->\n <mj-page-header\n Title=\"MCP Dashboard\"\n Icon=\"fa-solid fa-plug-circle-bolt\">\n <div meta>\n <mj-stat-badge [Count]=\"CurrentFilteredCount\" [Total]=\"CurrentTotalCount\" Label=\"items\"></mj-stat-badge>\n </div>\n <div actions>\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Server</span>\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Connection</span>\n </button>\n }\n @case ('tools') {\n <mj-view-toggle\n [Options]=\"toolsViewOptions\"\n [ActiveKey]=\"ToolsViewMode\"\n (KeyChange)=\"setToolsViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\"\n (click)=\"toggleScalableMode(!useScalablePagination)\"\n [title]=\"useScalablePagination ? 'Scale mode on: virtual scroll, paginated' : 'Enable scale mode for large tool sets'\">\n <i class=\"fa-solid\" [class.fa-bolt]=\"useScalablePagination\" [class.fa-bolt-lightning]=\"!useScalablePagination\"></i>\n <span class=\"action-btn-label\">Scale: {{ useScalablePagination ? 'ON' : 'OFF' }}</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n <span class=\"action-btn-label\">Test Tool</span>\n </button>\n }\n @case ('logs') {\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadAllData()\"></mj-refresh-button>\n }\n }\n </div>\n <div toolbar>\n <!-- Tab Navigation -->\n <mj-tab-nav\n [Tabs]=\"mcpTabs\"\n [ActiveKey]=\"ActiveTab\"\n (TabChange)=\"setActiveTab($any($event))\">\n </mj-tab-nav>\n <mj-page-search\n Placeholder=\"Search\u2026\"\n [Value]=\"CurrentFilters.searchTerm\"\n (ValueChange)=\"onSearchTermChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"mcpFilterFields\"\n [Values]=\"mcpFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n </mj-page-header>\n\n <!-- Main Content -->\n <mj-page-body [Flex]=\"true\">\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 @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\">{{ server.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\">{{ server.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\">{{ conn.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\">{{ conn.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (useScalablePagination) {\n <div style=\"padding:8px 12px;font-size:0.8rem;color:var(--mj-text-secondary,#475569);background:var(--mj-bg-surface-card,#f8f9fa);border-radius:4px;margin-bottom:6px\">\n Showing <strong>{{ visiblePagedTools.length }}</strong> of <strong>{{ scaleDenominator() }}</strong> tools\n </div>\n <div style=\"height:calc(100vh - 260px);width:100%;overflow-y:auto;border:1px solid var(--mj-border-subtle,#eee);border-radius:4px\" (scroll)=\"onToolsScrollNative($event)\">\n @for (tool of visiblePagedTools; track tool.ID) {\n <div style=\"display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--mj-border-subtle,#eee);height:72px;box-sizing:border-box\">\n <i class=\"fa-solid fa-wrench\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-weight:500;font-size:0.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ToolTitle || tool.ToolName }}</div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ServerName }} \u00B7 {{ tool.ToolName }}</div>\n </div>\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">{{ tool.Status }}</span>\n </div>\n }\n @if (toolsLoading) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">Loading more\u2026</div>\n }\n </div>\n } @else if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ getServerToolCount(group.server.ID) }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\">{{ tool.ToolDescription }}</p>\n }\n <div class=\"tool-card-actions\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\">{{ tool.ToolTitle || tool.ToolName }}</span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\">{{ tool.ToolDescription || '-' }}</td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:0.95rem;margin-right:4px\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </mj-page-body>\n</mj-page-layout>\n\n<!-- Server Dialog (inline \u2014 avoids sub-component DI issues) -->\n@if (ShowServerDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelServerForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:600px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">{{ EditingServer ? 'Edit MCP Server' : 'Add MCP Server' }}</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelServerForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ServerFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ServerFormError }}\n </div>\n }\n <!-- Name -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfName class=\"mj-input\" placeholder=\"e.g., GitHub MCP Server\" [value]=\"ServerForm.Name\" (input)=\"ServerForm.Name = sfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <!-- Description -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Description</label>\n <textarea #sfDesc class=\"mj-textarea\" placeholder=\"Optional description\" [value]=\"ServerForm.Description\" (input)=\"ServerForm.Description = sfDesc.value\" rows=\"3\" style=\"width:100%;box-sizing:border-box\"></textarea>\n </div>\n <!-- Transport Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Transport Type <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #sfTransport class=\"mj-input\" [value]=\"ServerForm.TransportType\" (change)=\"ServerForm.TransportType = sfTransport.value\" style=\"width:100%;box-sizing:border-box\">\n @for (t of TransportTypes; track t.value) {\n <option [value]=\"t.value\">{{ t.label }}</option>\n }\n </select>\n </div>\n <!-- Server URL (for HTTP-based transports) -->\n @if (ServerForm.TransportType === 'StreamableHTTP' || ServerForm.TransportType === 'SSE' || ServerForm.TransportType === 'WebSocket') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server URL <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfUrl class=\"mj-input\" placeholder=\"https://api.example.com/mcp\" [value]=\"ServerForm.ServerURL\" (input)=\"ServerForm.ServerURL = sfUrl.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Command (for Stdio) -->\n @if (ServerForm.TransportType === 'Stdio') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Command <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfCmd class=\"mj-input\" placeholder=\"e.g., npx\" [value]=\"ServerForm.Command\" (input)=\"ServerForm.Command = sfCmd.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Auth Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Default Auth Type</label>\n <select #sfAuth class=\"mj-input\" [value]=\"ServerForm.DefaultAuthType\" (change)=\"ServerForm.DefaultAuthType = sfAuth.value\" style=\"width:100%;box-sizing:border-box\">\n @for (a of AuthTypes; track a.value) {\n <option [value]=\"a.value\">{{ a.label }}</option>\n }\n </select>\n </div>\n <!-- Status -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #sfStatus class=\"mj-input\" [value]=\"ServerForm.Status\" (change)=\"ServerForm.Status = sfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveServerForm()\" [disabled]=\"ServerFormSaving\">\n @if (ServerFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n {{ EditingServer ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancelServerForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Connection Dialog (inline) -->\n@if (ShowConnectionDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelConnectionForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:560px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">Add Connection</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelConnectionForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ConnectionFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ConnectionFormError }}\n </div>\n }\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #cfServer class=\"mj-input\" [value]=\"ConnectionForm.MCPServerID\" (change)=\"ConnectionForm.MCPServerID = cfServer.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #cfName class=\"mj-input\" placeholder=\"e.g., Zapier Connection\" [value]=\"ConnectionForm.Name\" (input)=\"ConnectionForm.Name = cfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Bearer Token</label>\n <input #cfToken class=\"mj-input\" placeholder=\"Paste bearer token here\" [value]=\"ConnectionForm.BearerToken\" (input)=\"ConnectionForm.BearerToken = cfToken.value\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" />\n <span style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">Will be stored as a Credential and linked to this connection</span>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #cfStatus class=\"mj-input\" [value]=\"ConnectionForm.Status\" (change)=\"ConnectionForm.Status = cfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveConnectionForm()\" [disabled]=\"ConnectionFormSaving\">\n @if (ConnectionFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n Create\n </button>\n <button mjButton (click)=\"cancelConnectionForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Test Tool Dialog (inline) -->\n@if (ShowTestToolDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"testCloseDialog()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:640px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">\n Test MCP Tool\n @if (TestStep !== 'select') {\n <span style=\"font-size:0.875rem;font-weight:400;color:var(--mj-text-muted,#888);margin-left:8px\">\u2014 {{ TestSelectedTool?.ToolTitle || TestSelectedTool?.ToolName }}</span>\n }\n </h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"testCloseDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Step indicator -->\n <div style=\"display:flex;gap:0;padding:10px 20px;background:var(--mj-bg-surface-card,#f9f9f9);border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='select' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">1. Select</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='configure' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">2. Configure</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">\u203A</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='results' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">3. Results</span>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (TestStep === 'select') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tSrv class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"onTestServerChange(tSrv.value)\">\n <option value=\"\">\u2014 select server \u2014</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\" [selected]=\"TestToolServerID === s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Connection <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tConn class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [attr.disabled]=\"!TestToolServerID ? true : null\" (change)=\"onTestConnectionChange(tConn.value)\">\n <option value=\"\">\u2014 select connection \u2014</option>\n @for (c of TestFilteredConnections; track c.ID) {\n <option [value]=\"c.ID\" [selected]=\"TestToolConnectionID === c.ID\">{{ c.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Tool <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #tSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box;margin-bottom:6px\" placeholder=\"Search tools\u2026 (Recently used appear first)\" [value]=\"TestToolSearch\" (input)=\"onTestToolSearchChange(tSearch.value)\" [attr.disabled]=\"!TestToolServerID ? true : null\" />\n <div style=\"max-height:220px;overflow-y:auto;border:1px solid var(--mj-border-default,#e0e0e0);border-radius:4px;background:var(--mj-bg-surface,#fff)\">\n @if (TestComboboxTools.length === 0) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">No tools match.</div>\n }\n @for (t of TestComboboxTools; track t.ID) {\n <div (click)=\"pickTestTool(t.ID)\" style=\"padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--mj-border-subtle,#eee)\" [style.background]=\"TestToolID === t.ID ? 'color-mix(in srgb, var(--mj-brand-primary,#264FAF) 12%, var(--mj-bg-surface,#fff))' : null\">\n @if (isRecentTestTool(t.ID)) {\n <span style=\"font-size:0.65rem;background:var(--mj-brand-primary,#264FAF);color:#fff;padding:1px 6px;border-radius:8px;font-weight:600\">Recent</span>\n }\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-size:0.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolTitle || t.ToolName }}</div>\n @if (t.ToolTitle && t.ToolName !== t.ToolTitle) {\n <div style=\"font-size:0.7rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolName }}</div>\n }\n </div>\n @if (TestToolID === t.ID) {\n <i class=\"fa-solid fa-check\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n }\n </div>\n }\n </div>\n </div>\n } @else if (TestStep === 'configure') {\n @if (TestParamConfigs.length === 0) {\n <div style=\"text-align:center;padding:24px;color:var(--mj-text-muted,#888)\">\n <i class=\"fa-solid fa-check-circle\" style=\"font-size:2rem;margin-bottom:8px;display:block\"></i>\n <p>This tool requires no parameters.</p>\n </div>\n } @else {\n @for (p of TestParamConfigs; track p.name) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">\n {{ p.name }} @if (p.required) { <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span> }\n </label>\n @if (p.description) {\n <p style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin:0 0 4px 0\">{{ p.description }}</p>\n }\n @if (p.enumValues.length > 0) {\n <select #enumEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, enumEl.value)\">\n <option value=\"\">\u2014 select \u2014</option>\n @for (v of p.enumValues; track $index) { <option [value]=\"$any(v)\">{{ $any(v) }}</option> }\n </select>\n } @else if (p.type === 'boolean') {\n <select #boolEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, boolEl.value)\">\n <option value=\"false\">false</option>\n <option value=\"true\">true</option>\n </select>\n } @else if (p.type === 'array' || p.type === 'object') {\n <textarea #jsonEl class=\"mj-textarea\" rows=\"3\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" (input)=\"testSetParam(p.name, jsonEl.value)\" [placeholder]=\"'Enter JSON ' + p.type + '...'\"></textarea>\n } @else {\n <input #strEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (input)=\"testSetParam(p.name, strEl.value)\" [placeholder]=\"p.description || 'Enter value...'\" />\n }\n </div>\n }\n }\n } @else {\n @if (TestExecutionResult?.Success) {\n <div style=\"background:var(--mj-status-success-bg,#f0fff4);border:1px solid var(--mj-status-success-border,#9ae6b4);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-success-text,#276749)\">\n <i class=\"fa-solid fa-check-circle\"></i> Execution Successful\n @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }\n </div>\n } @else {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030)\">\n <i class=\"fa-solid fa-times-circle\"></i> Execution Failed\n </div>\n }\n @if (TestExecutionResult?.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Error</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;margin:0\">{{ TestExecutionResult?.ErrorMessage }}</pre>\n </div>\n }\n @if (TestExecutionResult?.Result) {\n <div>\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:300px;margin:0\">{{ formatTestResult(TestExecutionResult?.Result) }}</pre>\n </div>\n }\n }\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n @if (TestStep === 'select') {\n <button mjButton variant=\"primary\" (click)=\"testProceedToConfig()\" [disabled]=\"!TestCanProceed\">Next <i class=\"fa-solid fa-arrow-right\"></i></button>\n <button mjButton (click)=\"testCloseDialog()\">Cancel</button>\n } @else if (TestStep === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"testExecuteTool()\" [disabled]=\"!TestIsValid || TestIsExecuting\">\n @if (TestIsExecuting) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Executing... } @else { <i class=\"fa-solid fa-play\"></i> Execute }\n </button>\n <button mjButton (click)=\"testGoBack()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n } @else {\n <button mjButton variant=\"primary\" (click)=\"testRunAgain()\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n <button mjButton (click)=\"testGoBack()\">Edit Params</button>\n <button mjButton (click)=\"testCloseDialog()\">Close</button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Log Detail Panel (inlined) -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <div style=\"position:fixed;inset:0;z-index:10000;pointer-events:none\">\n <div style=\"position:absolute;inset:0;background:rgba(0,0,0,0.35);pointer-events:auto\" (click)=\"onLogDetailClose()\"></div>\n <div style=\"position:absolute;top:0;right:0;height:100%;width:560px;max-width:95vw;background:var(--mj-bg-surface,#fff);box-shadow:-4px 0 20px rgba(0,0,0,0.15);display:flex;flex-direction:column;pointer-events:auto\">\n <div style=\"padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);display:flex;align-items:center;justify-content:space-between\">\n <div>\n <h3 style=\"margin:0;font-size:1rem;font-weight:600\">{{ SelectedLog.ToolName }}</h3>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:4px\">\n <span [class]=\"SelectedLog.Status === 'Success' ? 'status-success' : SelectedLog.Status === 'Error' ? 'status-error' : 'status-running'\" style=\"font-weight:600\">{{ SelectedLog.Status }}</span>\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDate(SelectedLog.StartedAt) }}</span>\n @if (SelectedLog.DurationMs != null) {\n <span style=\"margin:0 8px\">\u00B7</span>\n <span>{{ formatDuration(SelectedLog.DurationMs) }}</span>\n }\n </div>\n </div>\n <button mjButton (click)=\"onLogDetailClose()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:16px 20px\">\n <div style=\"margin-bottom:16px\">\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-bottom:4px\">Connection</div>\n <div style=\"font-size:0.875rem\">{{ SelectedLog.ConnectionName || SelectedLog.ConnectionID }}</div>\n @if (SelectedLog.ServerName) {\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:2px\">{{ SelectedLog.ServerName }}</div>\n }\n </div>\n @if (SelectedLog.InputArgs) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Input Arguments</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:240px;margin:0\">{{ formatLogJson(SelectedLog.InputArgs) }}</pre>\n </div>\n }\n @if (SelectedLog.Result) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:360px;margin:0\">{{ formatLogJson(SelectedLog.Result) }}</pre>\n </div>\n }\n @if (SelectedLog.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px;color:var(--mj-status-error-text,#c53030)\">Error</label>\n <pre style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;margin:0;color:var(--mj-status-error-text,#c53030)\">{{ SelectedLog.ErrorMessage }}</pre>\n </div>\n }\n </div>\n <div style=\"padding:12px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);display:flex;gap:8px;justify-content:flex-start\">\n @if (SelectedLog.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgainFromLog({ toolId: SelectedLog.ToolID!, connectionId: SelectedLog.ConnectionID })\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n }\n <button mjButton (click)=\"onLogDetailClose()\">Close</button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* MCP Dashboard - Header + Filter Panel Layout (outer shell now provided by <mj-page-layout>) */\n\n/* Tab navigation now provided by <mj-tab-nav>. */\n\n/* ========================================\n Main Content Area\n ======================================== */\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 0 0 16px 0;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n color: var(--mj-status-error);\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-status-error);\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-brand-primary);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: var(--mj-status-error);\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-inactive {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-deprecated {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-unknown {\n background: color-mix(in srgb, var(--mj-text-disabled) 10%, var(--mj-bg-surface));\n color: var(--mj-text-disabled);\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: var(--mj-brand-primary);\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n color: var(--mj-color-success-700);\n}\n\n.sync-result-banner.success i {\n color: var(--mj-status-success);\n}\n\n.sync-result-banner.error {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.sync-result-banner.error i {\n color: var(--mj-status-error);\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-brand-primary);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-status-error);\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: var(--mj-text-disabled);\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-brand-primary);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.empty-state i {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View mode toggle now provided by <mj-view-toggle>.\n ======================================== */\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-disabled);\n font-weight: 600;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.tools-list tbody tr.expanded {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed var(--mj-border-default);\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-primary);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid var(--mj-border-default);\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid var(--mj-border-default);\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent) !important;\n}\n\n.clickable-row .action-cell {\n color: var(--mj-border-strong);\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-brand-primary);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-arrow {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: var(--mj-text-disabled);\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, transparent);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
4355
4360
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MCPToolsService }], null); })();
4356
4361
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 230 }); })();
4357
4362
  //# sourceMappingURL=mcp-dashboard.component.js.map