@memberjunction/ng-dashboards 3.3.0 → 3.4.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 (382) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +24 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +198 -111
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/models/model-management.component.d.ts +23 -0
  6. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  7. package/dist/AI/components/models/model-management.component.js +189 -83
  8. package/dist/AI/components/models/model-management.component.js.map +1 -1
  9. package/dist/AI/components/prompts/prompt-management.component.d.ts +23 -0
  10. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +135 -30
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/APIKeys/api-applications-panel.component.d.ts +5 -3
  14. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.js +50 -51
  16. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  17. package/dist/APIKeys/api-key-create-dialog.component.d.ts +4 -3
  18. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  19. package/dist/APIKeys/api-key-create-dialog.component.js +119 -94
  20. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.d.ts +1 -1
  22. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  23. package/dist/APIKeys/api-key-edit-panel.component.js +100 -87
  24. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  25. package/dist/APIKeys/api-key-list.component.d.ts +2 -1
  26. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  27. package/dist/APIKeys/api-key-list.component.js +24 -20
  28. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  29. package/dist/APIKeys/api-keys-resource.component.d.ts +6 -4
  30. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  31. package/dist/APIKeys/api-keys-resource.component.js +42 -57
  32. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  33. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts +22 -0
  34. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -0
  35. package/dist/Actions/components/explorer/action-breadcrumb.component.js +139 -0
  36. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -0
  37. package/dist/Actions/components/explorer/action-card.component.d.ts +39 -0
  38. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -0
  39. package/dist/Actions/components/explorer/action-card.component.js +410 -0
  40. package/dist/Actions/components/explorer/action-card.component.js.map +1 -0
  41. package/dist/Actions/components/explorer/action-explorer.component.d.ts +62 -0
  42. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -0
  43. package/dist/Actions/components/explorer/action-explorer.component.js +527 -0
  44. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -0
  45. package/dist/Actions/components/explorer/action-list-item.component.d.ts +24 -0
  46. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -0
  47. package/dist/Actions/components/explorer/action-list-item.component.js +210 -0
  48. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -0
  49. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +63 -0
  50. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -0
  51. package/dist/Actions/components/explorer/action-toolbar.component.js +483 -0
  52. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -0
  53. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +57 -0
  54. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -0
  55. package/dist/Actions/components/explorer/action-tree-panel.component.js +454 -0
  56. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -0
  57. package/dist/Actions/components/explorer/index.d.ts +10 -0
  58. package/dist/Actions/components/explorer/index.d.ts.map +1 -0
  59. package/dist/Actions/components/explorer/index.js +14 -0
  60. package/dist/Actions/components/explorer/index.js.map +1 -0
  61. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +49 -0
  62. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -0
  63. package/dist/Actions/components/explorer/new-action-panel.component.js +359 -0
  64. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -0
  65. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +37 -0
  66. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -0
  67. package/dist/Actions/components/explorer/new-category-panel.component.js +282 -0
  68. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -0
  69. package/dist/Actions/index.d.ts +3 -0
  70. package/dist/Actions/index.d.ts.map +1 -1
  71. package/dist/Actions/index.js +5 -0
  72. package/dist/Actions/index.js.map +1 -1
  73. package/dist/Actions/services/action-explorer-state.service.d.ts +104 -0
  74. package/dist/Actions/services/action-explorer-state.service.d.ts.map +1 -0
  75. package/dist/Actions/services/action-explorer-state.service.js +352 -0
  76. package/dist/Actions/services/action-explorer-state.service.js.map +1 -0
  77. package/dist/Communication/communication-dashboard.component.d.ts +2 -6
  78. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  79. package/dist/Communication/communication-dashboard.component.js +142 -93
  80. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  81. package/dist/Communication/communication-logs-resource.component.d.ts +10 -4
  82. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  83. package/dist/Communication/communication-logs-resource.component.js +253 -121
  84. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  85. package/dist/Communication/communication-monitor-resource.component.d.ts +38 -3
  86. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  87. package/dist/Communication/communication-monitor-resource.component.js +431 -157
  88. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  89. package/dist/Communication/communication-providers-resource.component.d.ts +16 -5
  90. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  91. package/dist/Communication/communication-providers-resource.component.js +229 -118
  92. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  93. package/dist/Communication/communication-runs-resource.component.d.ts +4 -2
  94. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  95. package/dist/Communication/communication-runs-resource.component.js +155 -149
  96. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  97. package/dist/Communication/communication-templates-resource.component.d.ts +43 -0
  98. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -0
  99. package/dist/Communication/communication-templates-resource.component.js +371 -0
  100. package/dist/Communication/communication-templates-resource.component.js.map +1 -0
  101. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +69 -267
  102. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  103. package/dist/ComponentStudio/component-studio-dashboard.component.js +698 -1802
  104. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  105. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +68 -0
  106. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -0
  107. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +401 -0
  108. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -0
  109. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts +44 -0
  110. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -0
  111. package/dist/ComponentStudio/components/browser/component-browser.component.js +636 -0
  112. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -0
  113. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts +35 -0
  114. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -0
  115. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +380 -0
  116. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -0
  117. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +24 -0
  118. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -0
  119. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +221 -0
  120. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -0
  121. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts +28 -0
  122. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -0
  123. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +263 -0
  124. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -0
  125. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts +34 -0
  126. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -0
  127. package/dist/ComponentStudio/components/editors/spec-editor.component.js +307 -0
  128. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -0
  129. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts +29 -0
  130. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -0
  131. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +159 -0
  132. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -0
  133. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts +20 -0
  134. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -0
  135. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +192 -0
  136. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -0
  137. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +57 -0
  138. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -0
  139. package/dist/ComponentStudio/components/workspace/component-preview.component.js +342 -0
  140. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -0
  141. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +15 -0
  142. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -0
  143. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +144 -0
  144. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -0
  145. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +203 -0
  146. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -0
  147. package/dist/ComponentStudio/services/component-studio-state.service.js +651 -0
  148. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -0
  149. package/dist/ComponentStudio/services/component-version.service.d.ts +120 -0
  150. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -0
  151. package/dist/ComponentStudio/services/component-version.service.js +394 -0
  152. package/dist/ComponentStudio/services/component-version.service.js.map +1 -0
  153. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +1 -1
  154. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  155. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  156. package/dist/Credentials/components/credentials-list-resource.component.d.ts +1 -1
  157. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  158. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  159. package/dist/Credentials/components/credentials-types-resource.component.d.ts +1 -1
  160. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  161. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  162. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  163. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +72 -0
  164. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -0
  165. package/dist/MCP/components/mcp-connection-dialog.component.js +529 -0
  166. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -0
  167. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +77 -0
  168. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -0
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js +535 -0
  170. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -0
  171. package/dist/MCP/components/mcp-server-dialog.component.d.ts +77 -0
  172. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -0
  173. package/dist/MCP/components/mcp-server-dialog.component.js +437 -0
  174. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -0
  175. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +271 -0
  176. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -0
  177. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1300 -0
  178. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -0
  179. package/dist/MCP/index.d.ts +11 -0
  180. package/dist/MCP/index.d.ts.map +1 -0
  181. package/dist/MCP/index.js +15 -0
  182. package/dist/MCP/index.js.map +1 -0
  183. package/dist/MCP/mcp-dashboard.component.d.ts +409 -0
  184. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -0
  185. package/dist/MCP/mcp-dashboard.component.js +2486 -0
  186. package/dist/MCP/mcp-dashboard.component.js.map +1 -0
  187. package/dist/MCP/mcp-resource.component.d.ts +20 -0
  188. package/dist/MCP/mcp-resource.component.d.ts.map +1 -0
  189. package/dist/MCP/mcp-resource.component.js +55 -0
  190. package/dist/MCP/mcp-resource.component.js.map +1 -0
  191. package/dist/MCP/mcp.module.d.ts +27 -0
  192. package/dist/MCP/mcp.module.d.ts.map +1 -0
  193. package/dist/MCP/mcp.module.js +122 -0
  194. package/dist/MCP/mcp.module.js.map +1 -0
  195. package/dist/MCP/services/mcp-tools.service.d.ts +109 -0
  196. package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -0
  197. package/dist/MCP/services/mcp-tools.service.js +222 -0
  198. package/dist/MCP/services/mcp-tools.service.js.map +1 -0
  199. package/dist/Scheduling/components/index.d.ts +5 -8
  200. package/dist/Scheduling/components/index.d.ts.map +1 -1
  201. package/dist/Scheduling/components/index.js +6 -9
  202. package/dist/Scheduling/components/index.js.map +1 -1
  203. package/dist/Scheduling/components/job-slideout.component.d.ts +45 -0
  204. package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -0
  205. package/dist/Scheduling/components/job-slideout.component.js +458 -0
  206. package/dist/Scheduling/components/job-slideout.component.js.map +1 -0
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +19 -0
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -0
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js +51 -0
  210. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -0
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts +71 -0
  212. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -0
  213. package/dist/Scheduling/components/scheduling-activity.component.js +714 -0
  214. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -0
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +3 -4
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -7
  218. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +52 -34
  220. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  221. package/dist/Scheduling/components/scheduling-jobs.component.js +446 -261
  222. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +19 -0
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -0
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js +51 -0
  226. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -0
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts +43 -0
  228. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -0
  229. package/dist/Scheduling/components/scheduling-overview.component.js +595 -0
  230. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -0
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts +22 -32
  232. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  233. package/dist/Scheduling/scheduling-dashboard.component.js +175 -169
  234. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  235. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +49 -6
  236. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  237. package/dist/Scheduling/services/scheduling-instrumentation.service.js +218 -149
  238. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  239. package/dist/Testing/components/index.d.ts +7 -8
  240. package/dist/Testing/components/index.d.ts.map +1 -1
  241. package/dist/Testing/components/index.js +8 -9
  242. package/dist/Testing/components/index.js.map +1 -1
  243. package/dist/Testing/components/testing-analytics-resource.component.d.ts +0 -4
  244. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  245. package/dist/Testing/components/testing-analytics-resource.component.js +1 -7
  246. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  247. package/dist/Testing/components/testing-analytics.component.d.ts +52 -37
  248. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  249. package/dist/Testing/components/testing-analytics.component.js +1023 -569
  250. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  251. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +16 -0
  252. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -0
  253. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +47 -0
  254. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -0
  255. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +57 -0
  256. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -0
  257. package/dist/Testing/components/testing-dashboard-tab.component.js +649 -0
  258. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -0
  259. package/dist/{Scheduling/components/scheduling-types-resource.component.d.ts → Testing/components/testing-explorer-resource.component.d.ts} +5 -9
  260. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -0
  261. package/dist/Testing/components/testing-explorer-resource.component.js +47 -0
  262. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -0
  263. package/dist/Testing/components/testing-explorer.component.d.ts +193 -0
  264. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -0
  265. package/dist/Testing/components/testing-explorer.component.js +2212 -0
  266. package/dist/Testing/components/testing-explorer.component.js.map +1 -0
  267. package/dist/Testing/components/testing-review-resource.component.d.ts +16 -0
  268. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -0
  269. package/dist/Testing/components/testing-review-resource.component.js +47 -0
  270. package/dist/Testing/components/testing-review-resource.component.js.map +1 -0
  271. package/dist/Testing/components/testing-review.component.d.ts +60 -0
  272. package/dist/Testing/components/testing-review.component.d.ts.map +1 -0
  273. package/dist/Testing/components/testing-review.component.js +985 -0
  274. package/dist/Testing/components/testing-review.component.js.map +1 -0
  275. package/dist/Testing/components/testing-runs-resource.component.d.ts +16 -0
  276. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -0
  277. package/dist/Testing/components/testing-runs-resource.component.js +47 -0
  278. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -0
  279. package/dist/Testing/components/testing-runs.component.d.ts +82 -0
  280. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -0
  281. package/dist/Testing/components/testing-runs.component.js +1067 -0
  282. package/dist/Testing/components/testing-runs.component.js.map +1 -0
  283. package/dist/Testing/testing-dashboard.component.d.ts +12 -15
  284. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  285. package/dist/Testing/testing-dashboard.component.js +46 -68
  286. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  287. package/dist/module.d.ts +121 -104
  288. package/dist/module.d.ts.map +1 -1
  289. package/dist/module.js +185 -93
  290. package/dist/module.js.map +1 -1
  291. package/dist/public-api.d.ts +5 -3
  292. package/dist/public-api.d.ts.map +1 -1
  293. package/dist/public-api.js +23 -16
  294. package/dist/public-api.js.map +1 -1
  295. package/dist/shared/pipes/highlight-search.pipe.d.ts +17 -0
  296. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -0
  297. package/dist/shared/pipes/highlight-search.pipe.js +40 -0
  298. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -0
  299. package/dist/shared/pipes/index.d.ts +2 -0
  300. package/dist/shared/pipes/index.d.ts.map +1 -0
  301. package/dist/shared/pipes/index.js +2 -0
  302. package/dist/shared/pipes/index.js.map +1 -0
  303. package/dist/shared/shared-pipes.module.d.ts +11 -0
  304. package/dist/shared/shared-pipes.module.d.ts.map +1 -0
  305. package/dist/shared/shared-pipes.module.js +24 -0
  306. package/dist/shared/shared-pipes.module.js.map +1 -0
  307. package/package.json +39 -32
  308. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  309. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  310. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  311. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  312. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  313. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  314. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  315. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  316. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  317. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  318. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  319. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  320. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  321. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  322. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  323. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  324. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  325. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  326. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  327. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  328. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  329. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  330. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  331. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  332. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  333. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  334. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  335. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  336. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  337. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  338. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  339. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  340. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  341. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  342. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  343. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  344. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  345. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  346. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  347. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  348. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  349. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  350. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  351. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  352. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  353. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  354. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  355. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  356. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  357. package/dist/Testing/components/testing-execution.component.js +0 -845
  358. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  359. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  360. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  361. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  362. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  363. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  364. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  365. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  366. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  367. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  368. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  369. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  370. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  371. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  372. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  373. package/dist/Testing/components/testing-overview.component.js +0 -361
  374. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  375. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  376. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  377. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  378. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  379. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  380. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  381. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  382. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
@@ -0,0 +1,1300 @@
1
+ /**
2
+ * @fileoverview MCP Test Tool Slide-Out Panel Component
3
+ *
4
+ * Provides a beautiful UX for testing MCP tools with:
5
+ * - Server/Connection/Tool selection
6
+ * - Dynamic parameter input UI based on JSON Schema
7
+ * - Tool execution with results display
8
+ * - User settings caching via UserInfoEngine
9
+ * - Resizable slide-out panel with width persistence
10
+ */
11
+ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
12
+ import { Subject } from 'rxjs';
13
+ import { debounceTime, takeUntil } from 'rxjs/operators';
14
+ import { trigger, transition, style, animate } from '@angular/animations';
15
+ import { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';
16
+ import { UserInfoEngine } from '@memberjunction/core-entities';
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "@angular/common";
19
+ import * as i2 from "@angular/forms";
20
+ import * as i3 from "@progress/kendo-angular-buttons";
21
+ import * as i4 from "@progress/kendo-angular-dropdowns";
22
+ import * as i5 from "@progress/kendo-angular-inputs";
23
+ import * as i6 from "@memberjunction/ng-code-editor";
24
+ const _forTrack0 = ($index, $item) => $item.name;
25
+ function MCPTestToolDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
26
+ const _r1 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "div", 2);
28
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDialog()); });
29
+ i0.ɵɵelementEnd();
30
+ } }
31
+ function MCPTestToolDialogComponent_div_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
32
+ const _r4 = i0.ɵɵgetCurrentView();
33
+ i0.ɵɵelementStart(0, "div", 19);
34
+ i0.ɵɵlistener("mousedown", function MCPTestToolDialogComponent_div_1_Conditional_1_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onResizeStart($event)); });
35
+ i0.ɵɵelement(1, "div", 20);
36
+ i0.ɵɵelementEnd();
37
+ } if (rf & 2) {
38
+ const ctx_r1 = i0.ɵɵnextContext(2);
39
+ i0.ɵɵclassProp("active", ctx_r1.IsResizing);
40
+ } }
41
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_9_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "div", 37)(1, "span", 38);
43
+ i0.ɵɵtext(2);
44
+ i0.ɵɵelementEnd();
45
+ i0.ɵɵelementStart(3, "span", 39);
46
+ i0.ɵɵtext(4);
47
+ i0.ɵɵelementEnd()();
48
+ } if (rf & 2) {
49
+ const dataItem_r6 = ctx.$implicit;
50
+ i0.ɵɵadvance(2);
51
+ i0.ɵɵtextInterpolate(dataItem_r6.Name);
52
+ i0.ɵɵadvance();
53
+ i0.ɵɵclassMap("status-" + dataItem_r6.Status.toLowerCase());
54
+ i0.ɵɵadvance();
55
+ i0.ɵɵtextInterpolate1(" ", dataItem_r6.Status, " ");
56
+ } }
57
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_17_Conditional_3_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelementStart(0, "span", 40);
59
+ i0.ɵɵtext(1);
60
+ i0.ɵɵelementEnd();
61
+ } if (rf & 2) {
62
+ const dataItem_r7 = i0.ɵɵnextContext().$implicit;
63
+ i0.ɵɵadvance();
64
+ i0.ɵɵtextInterpolate(dataItem_r7.Description);
65
+ } }
66
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_17_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "div", 37)(1, "span", 38);
68
+ i0.ɵɵtext(2);
69
+ i0.ɵɵelementEnd();
70
+ i0.ɵɵtemplate(3, MCPTestToolDialogComponent_div_1_div_27_ng_template_17_Conditional_3_Template, 2, 1, "span", 40);
71
+ i0.ɵɵelementEnd();
72
+ } if (rf & 2) {
73
+ const dataItem_r7 = ctx.$implicit;
74
+ i0.ɵɵadvance(2);
75
+ i0.ɵɵtextInterpolate(dataItem_r7.Name);
76
+ i0.ɵɵadvance();
77
+ i0.ɵɵconditional(dataItem_r7.Description ? 3 : -1);
78
+ } }
79
+ function MCPTestToolDialogComponent_div_1_div_27_Conditional_18_Template(rf, ctx) { if (rf & 1) {
80
+ i0.ɵɵelementStart(0, "span", 31);
81
+ i0.ɵɵtext(1, "Select a server first");
82
+ i0.ɵɵelementEnd();
83
+ } }
84
+ function MCPTestToolDialogComponent_div_1_div_27_Conditional_19_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵelementStart(0, "span", 32);
86
+ i0.ɵɵelement(1, "i", 41);
87
+ i0.ɵɵtext(2);
88
+ i0.ɵɵelementEnd();
89
+ } if (rf & 2) {
90
+ const ctx_r1 = i0.ɵɵnextContext(3);
91
+ i0.ɵɵadvance(2);
92
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.NoConnectionsWarning, " ");
93
+ } }
94
+ function MCPTestToolDialogComponent_div_1_div_27_Conditional_20_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementStart(0, "span", 33);
96
+ i0.ɵɵelement(1, "i", 42);
97
+ i0.ɵɵtext(2, " Auto-selected (only connection available) ");
98
+ i0.ɵɵelementEnd();
99
+ } }
100
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_28_Template(rf, ctx) { if (rf & 1) {
101
+ i0.ɵɵtext(0);
102
+ } if (rf & 2) {
103
+ const dataItem_r8 = ctx.$implicit;
104
+ i0.ɵɵtextInterpolate1(" ", (dataItem_r8 == null ? null : dataItem_r8.ToolTitle) || (dataItem_r8 == null ? null : dataItem_r8.ToolName) || "Select a tool...", " ");
105
+ } }
106
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_29_Conditional_3_Template(rf, ctx) { if (rf & 1) {
107
+ i0.ɵɵelementStart(0, "span", 40);
108
+ i0.ɵɵtext(1);
109
+ i0.ɵɵelementEnd();
110
+ } if (rf & 2) {
111
+ const dataItem_r9 = i0.ɵɵnextContext().$implicit;
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵtextInterpolate(dataItem_r9.ToolDescription);
114
+ } }
115
+ function MCPTestToolDialogComponent_div_1_div_27_ng_template_29_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelementStart(0, "div", 43)(1, "span", 38);
117
+ i0.ɵɵtext(2);
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵtemplate(3, MCPTestToolDialogComponent_div_1_div_27_ng_template_29_Conditional_3_Template, 2, 1, "span", 40);
120
+ i0.ɵɵelementEnd();
121
+ } if (rf & 2) {
122
+ const dataItem_r9 = ctx.$implicit;
123
+ i0.ɵɵadvance(2);
124
+ i0.ɵɵtextInterpolate(dataItem_r9.ToolTitle || dataItem_r9.ToolName);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵconditional(dataItem_r9.ToolDescription ? 3 : -1);
127
+ } }
128
+ function MCPTestToolDialogComponent_div_1_div_27_Conditional_30_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "span", 31);
130
+ i0.ɵɵtext(1, "Select a server first");
131
+ i0.ɵɵelementEnd();
132
+ } }
133
+ function MCPTestToolDialogComponent_div_1_div_27_Template(rf, ctx) { if (rf & 1) {
134
+ const _r5 = i0.ɵɵgetCurrentView();
135
+ i0.ɵɵelementStart(0, "div", 21)(1, "div", 22)(2, "div", 23)(3, "label", 24);
136
+ i0.ɵɵelement(4, "i", 25);
137
+ i0.ɵɵtext(5, " Server ");
138
+ i0.ɵɵelementStart(6, "span", 26);
139
+ i0.ɵɵtext(7, "*");
140
+ i0.ɵɵelementEnd()();
141
+ i0.ɵɵelementStart(8, "kendo-dropdownlist", 27);
142
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ServerID, $event) || (ctx_r1.ServerID = $event); return i0.ɵɵresetView($event); });
143
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_valueChange_8_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onServerChange()); })("filterChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_filterChange_8_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onServerFilterChange($event)); });
144
+ i0.ɵɵtemplate(9, MCPTestToolDialogComponent_div_1_div_27_ng_template_9_Template, 5, 4, "ng-template", 28);
145
+ i0.ɵɵelementEnd()();
146
+ i0.ɵɵelementStart(10, "div", 23)(11, "label", 24);
147
+ i0.ɵɵelement(12, "i", 29);
148
+ i0.ɵɵtext(13, " Connection ");
149
+ i0.ɵɵelementStart(14, "span", 26);
150
+ i0.ɵɵtext(15, "*");
151
+ i0.ɵɵelementEnd()();
152
+ i0.ɵɵelementStart(16, "kendo-dropdownlist", 30);
153
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionID, $event) || (ctx_r1.ConnectionID = $event); return i0.ɵɵresetView($event); });
154
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_valueChange_16_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConnectionChange()); })("filterChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_filterChange_16_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConnectionFilterChange($event)); });
155
+ i0.ɵɵtemplate(17, MCPTestToolDialogComponent_div_1_div_27_ng_template_17_Template, 4, 2, "ng-template", 28);
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵtemplate(18, MCPTestToolDialogComponent_div_1_div_27_Conditional_18_Template, 2, 0, "span", 31)(19, MCPTestToolDialogComponent_div_1_div_27_Conditional_19_Template, 3, 1, "span", 32)(20, MCPTestToolDialogComponent_div_1_div_27_Conditional_20_Template, 3, 0, "span", 33);
158
+ i0.ɵɵelementEnd();
159
+ i0.ɵɵelementStart(21, "div", 23)(22, "label", 24);
160
+ i0.ɵɵelement(23, "i", 34);
161
+ i0.ɵɵtext(24, " Tool ");
162
+ i0.ɵɵelementStart(25, "span", 26);
163
+ i0.ɵɵtext(26, "*");
164
+ i0.ɵɵelementEnd()();
165
+ i0.ɵɵelementStart(27, "kendo-dropdownlist", 35);
166
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_ngModelChange_27_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ToolID, $event) || (ctx_r1.ToolID = $event); return i0.ɵɵresetView($event); });
167
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_valueChange_27_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onToolChange()); })("filterChange", function MCPTestToolDialogComponent_div_1_div_27_Template_kendo_dropdownlist_filterChange_27_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onToolFilterChange($event)); });
168
+ i0.ɵɵtemplate(28, MCPTestToolDialogComponent_div_1_div_27_ng_template_28_Template, 1, 1, "ng-template", 36)(29, MCPTestToolDialogComponent_div_1_div_27_ng_template_29_Template, 4, 2, "ng-template", 28);
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵtemplate(30, MCPTestToolDialogComponent_div_1_div_27_Conditional_30_Template, 2, 0, "span", 31);
171
+ i0.ɵɵelementEnd()()();
172
+ } if (rf & 2) {
173
+ const ctx_r1 = i0.ɵɵnextContext(2);
174
+ i0.ɵɵadvance(8);
175
+ i0.ɵɵproperty("data", ctx_r1.DisplayServers)("textField", "Name")("valueField", "ID")("valuePrimitive", true);
176
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ServerID);
177
+ i0.ɵɵproperty("filterable", true);
178
+ i0.ɵɵadvance(8);
179
+ i0.ɵɵproperty("data", ctx_r1.DisplayConnections)("textField", "Name")("valueField", "ID")("valuePrimitive", true);
180
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ConnectionID);
181
+ i0.ɵɵproperty("disabled", !ctx_r1.ServerID || ctx_r1.NoConnectionsWarning !== null)("filterable", true);
182
+ i0.ɵɵadvance(2);
183
+ i0.ɵɵconditional(!ctx_r1.ServerID ? 18 : -1);
184
+ i0.ɵɵadvance();
185
+ i0.ɵɵconditional(ctx_r1.NoConnectionsWarning ? 19 : -1);
186
+ i0.ɵɵadvance();
187
+ i0.ɵɵconditional(ctx_r1.FilteredConnections.length === 1 && ctx_r1.ConnectionID ? 20 : -1);
188
+ i0.ɵɵadvance(7);
189
+ i0.ɵɵproperty("data", ctx_r1.DisplayTools)("textField", "ToolTitle")("valueField", "ID")("valuePrimitive", true);
190
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ToolID);
191
+ i0.ɵɵproperty("disabled", !ctx_r1.ServerID)("filterable", true);
192
+ i0.ɵɵadvance(3);
193
+ i0.ɵɵconditional(!ctx_r1.ServerID ? 30 : -1);
194
+ } }
195
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_6_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelementStart(0, "p", 47);
197
+ i0.ɵɵtext(1);
198
+ i0.ɵɵelementEnd();
199
+ } if (rf & 2) {
200
+ const ctx_r1 = i0.ɵɵnextContext(3);
201
+ i0.ɵɵadvance();
202
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedTool == null ? null : ctx_r1.SelectedTool.ToolDescription);
203
+ } }
204
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_14_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "div", 50);
206
+ i0.ɵɵelement(1, "i", 52);
207
+ i0.ɵɵelementStart(2, "p");
208
+ i0.ɵɵtext(3, "This tool requires no parameters.");
209
+ i0.ɵɵelementEnd()();
210
+ } }
211
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
212
+ i0.ɵɵelementStart(0, "span", 26);
213
+ i0.ɵɵtext(1, "*");
214
+ i0.ɵɵelementEnd();
215
+ } }
216
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
217
+ i0.ɵɵelementStart(0, "p", 57);
218
+ i0.ɵɵtext(1);
219
+ i0.ɵɵelementEnd();
220
+ } if (rf & 2) {
221
+ const config_r10 = i0.ɵɵnextContext().$implicit;
222
+ i0.ɵɵadvance();
223
+ i0.ɵɵtextInterpolate(config_r10.description);
224
+ } }
225
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
226
+ const _r11 = i0.ɵɵgetCurrentView();
227
+ i0.ɵɵelementStart(0, "kendo-dropdownlist", 61);
228
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_5_Template_kendo_dropdownlist_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.ParameterValues[config_r10.name], $event) || (ctx_r1.ParameterValues[config_r10.name] = $event); return i0.ɵɵresetView($event); });
229
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_5_Template_kendo_dropdownlist_valueChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onParameterChange(config_r10.name, $event)); });
230
+ i0.ɵɵelementEnd();
231
+ } if (rf & 2) {
232
+ const config_r10 = i0.ɵɵnextContext().$implicit;
233
+ const ctx_r1 = i0.ɵɵnextContext(4);
234
+ i0.ɵɵproperty("data", config_r10.enumValues)("valuePrimitive", true);
235
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ParameterValues[config_r10.name]);
236
+ } }
237
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
238
+ const _r12 = i0.ɵɵgetCurrentView();
239
+ i0.ɵɵelementStart(0, "div", 59)(1, "input", 62);
240
+ i0.ɵɵlistener("change", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_6_Template_input_change_1_listener($event) { i0.ɵɵrestoreView(_r12); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onParameterChange(config_r10.name, $event.target.checked)); });
241
+ i0.ɵɵelementEnd();
242
+ i0.ɵɵelementStart(2, "label", 63);
243
+ i0.ɵɵtext(3, "Enabled");
244
+ i0.ɵɵelementEnd()();
245
+ } if (rf & 2) {
246
+ const config_r10 = i0.ɵɵnextContext().$implicit;
247
+ const ctx_r1 = i0.ɵɵnextContext(4);
248
+ i0.ɵɵadvance();
249
+ i0.ɵɵproperty("id", "param-" + config_r10.name)("checked", ctx_r1.ParameterValues[config_r10.name]);
250
+ i0.ɵɵadvance();
251
+ i0.ɵɵproperty("for", "param-" + config_r10.name);
252
+ } }
253
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_7_Template(rf, ctx) { if (rf & 1) {
254
+ const _r13 = i0.ɵɵgetCurrentView();
255
+ i0.ɵɵelementStart(0, "kendo-numerictextbox", 64);
256
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_7_Template_kendo_numerictextbox_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.ParameterValues[config_r10.name], $event) || (ctx_r1.ParameterValues[config_r10.name] = $event); return i0.ɵɵresetView($event); });
257
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_7_Template_kendo_numerictextbox_valueChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onParameterChange(config_r10.name, $event)); });
258
+ i0.ɵɵelementEnd();
259
+ } if (rf & 2) {
260
+ const config_r10 = i0.ɵɵnextContext().$implicit;
261
+ const ctx_r1 = i0.ɵɵnextContext(4);
262
+ i0.ɵɵproperty("format", config_r10.type === "integer" ? "n0" : "n")("step", config_r10.type === "integer" ? 1 : 0.1);
263
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ParameterValues[config_r10.name]);
264
+ } }
265
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
266
+ const _r14 = i0.ɵɵgetCurrentView();
267
+ i0.ɵɵelementStart(0, "textarea", 65);
268
+ i0.ɵɵlistener("input", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_8_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r14); const config_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onTextareaChange(config_r10.name, $event.target.value, config_r10)); });
269
+ i0.ɵɵelementEnd();
270
+ i0.ɵɵelementStart(1, "span", 31);
271
+ i0.ɵɵtext(2, "Enter valid JSON");
272
+ i0.ɵɵelementEnd();
273
+ } if (rf & 2) {
274
+ const config_r10 = i0.ɵɵnextContext().$implicit;
275
+ const ctx_r1 = i0.ɵɵnextContext(4);
276
+ i0.ɵɵpropertyInterpolate1("placeholder", "Enter JSON ", config_r10.type, "...");
277
+ i0.ɵɵproperty("value", ctx_r1.getTextareaValue(config_r10.name));
278
+ } }
279
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_0_Template(rf, ctx) { if (rf & 1) {
280
+ const _r15 = i0.ɵɵgetCurrentView();
281
+ i0.ɵɵelementStart(0, "textarea", 68);
282
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_0_Template_textarea_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r15); const config_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.ParameterValues[config_r10.name], $event) || (ctx_r1.ParameterValues[config_r10.name] = $event); return i0.ɵɵresetView($event); });
283
+ i0.ɵɵlistener("input", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_0_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r15); const config_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onParameterChange(config_r10.name, $event.target.value)); });
284
+ i0.ɵɵelementEnd();
285
+ } if (rf & 2) {
286
+ const config_r10 = i0.ɵɵnextContext(2).$implicit;
287
+ const ctx_r1 = i0.ɵɵnextContext(4);
288
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ParameterValues[config_r10.name]);
289
+ i0.ɵɵproperty("placeholder", config_r10.description || "Enter value...");
290
+ } }
291
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_1_Template(rf, ctx) { if (rf & 1) {
292
+ const _r16 = i0.ɵɵgetCurrentView();
293
+ i0.ɵɵelementStart(0, "kendo-textbox", 69);
294
+ i0.ɵɵtwoWayListener("ngModelChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_1_Template_kendo_textbox_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r16); const config_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.ParameterValues[config_r10.name], $event) || (ctx_r1.ParameterValues[config_r10.name] = $event); return i0.ɵɵresetView($event); });
295
+ i0.ɵɵlistener("valueChange", function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_1_Template_kendo_textbox_valueChange_0_listener($event) { i0.ɵɵrestoreView(_r16); const config_r10 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onParameterChange(config_r10.name, $event)); });
296
+ i0.ɵɵelementEnd();
297
+ } if (rf & 2) {
298
+ const config_r10 = i0.ɵɵnextContext(2).$implicit;
299
+ const ctx_r1 = i0.ɵɵnextContext(4);
300
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ParameterValues[config_r10.name]);
301
+ i0.ɵɵproperty("placeholder", config_r10.description || "Enter value...");
302
+ } }
303
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Template(rf, ctx) { if (rf & 1) {
304
+ i0.ɵɵtemplate(0, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_0_Template, 1, 2, "textarea", 66)(1, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Conditional_1_Template, 1, 2, "kendo-textbox", 67);
305
+ } if (rf & 2) {
306
+ const config_r10 = i0.ɵɵnextContext().$implicit;
307
+ const ctx_r1 = i0.ɵɵnextContext(4);
308
+ i0.ɵɵconditional(ctx_r1.isTextarea(config_r10) ? 0 : 1);
309
+ } }
310
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Template(rf, ctx) { if (rf & 1) {
311
+ i0.ɵɵelementStart(0, "div", 55)(1, "label", 56);
312
+ i0.ɵɵtext(2);
313
+ i0.ɵɵtemplate(3, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_3_Template, 2, 0, "span", 26);
314
+ i0.ɵɵelementEnd();
315
+ i0.ɵɵtemplate(4, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_4_Template, 2, 1, "p", 57)(5, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_5_Template, 1, 3, "kendo-dropdownlist", 58)(6, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_6_Template, 4, 3, "div", 59)(7, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_7_Template, 1, 3, "kendo-numerictextbox", 60)(8, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_8_Template, 3, 3)(9, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Conditional_9_Template, 2, 1);
316
+ i0.ɵɵelementEnd();
317
+ } if (rf & 2) {
318
+ const config_r10 = ctx.$implicit;
319
+ i0.ɵɵclassProp("required", config_r10.required);
320
+ i0.ɵɵadvance(2);
321
+ i0.ɵɵtextInterpolate1(" ", config_r10.name, " ");
322
+ i0.ɵɵadvance();
323
+ i0.ɵɵconditional(config_r10.required ? 3 : -1);
324
+ i0.ɵɵadvance();
325
+ i0.ɵɵconditional(config_r10.description ? 4 : -1);
326
+ i0.ɵɵadvance();
327
+ i0.ɵɵconditional(config_r10.enumValues.length > 0 ? 5 : config_r10.type === "boolean" ? 6 : config_r10.type === "number" || config_r10.type === "integer" ? 7 : config_r10.type === "array" || config_r10.type === "object" ? 8 : 9);
328
+ } }
329
+ function MCPTestToolDialogComponent_div_1_div_28_Conditional_15_Template(rf, ctx) { if (rf & 1) {
330
+ i0.ɵɵelementStart(0, "div", 51)(1, "h4", 53);
331
+ i0.ɵɵtext(2, "Parameters");
332
+ i0.ɵɵelementEnd();
333
+ i0.ɵɵrepeaterCreate(3, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_For_4_Template, 10, 6, "div", 54, _forTrack0);
334
+ i0.ɵɵelementEnd();
335
+ } if (rf & 2) {
336
+ const ctx_r1 = i0.ɵɵnextContext(3);
337
+ i0.ɵɵadvance(3);
338
+ i0.ɵɵrepeater(ctx_r1.ParameterConfigs);
339
+ } }
340
+ function MCPTestToolDialogComponent_div_1_div_28_Template(rf, ctx) { if (rf & 1) {
341
+ i0.ɵɵelementStart(0, "div", 21)(1, "div", 44)(2, "div", 45)(3, "h3", 46);
342
+ i0.ɵɵelement(4, "i", 34);
343
+ i0.ɵɵtext(5);
344
+ i0.ɵɵelementEnd();
345
+ i0.ɵɵtemplate(6, MCPTestToolDialogComponent_div_1_div_28_Conditional_6_Template, 2, 1, "p", 47);
346
+ i0.ɵɵelementEnd();
347
+ i0.ɵɵelementStart(7, "div", 48)(8, "span", 49);
348
+ i0.ɵɵelement(9, "i", 25);
349
+ i0.ɵɵtext(10);
350
+ i0.ɵɵelementEnd();
351
+ i0.ɵɵelementStart(11, "span", 49);
352
+ i0.ɵɵelement(12, "i", 29);
353
+ i0.ɵɵtext(13);
354
+ i0.ɵɵelementEnd()()();
355
+ i0.ɵɵtemplate(14, MCPTestToolDialogComponent_div_1_div_28_Conditional_14_Template, 4, 0, "div", 50)(15, MCPTestToolDialogComponent_div_1_div_28_Conditional_15_Template, 5, 0, "div", 51);
356
+ i0.ɵɵelementEnd();
357
+ } if (rf & 2) {
358
+ const ctx_r1 = i0.ɵɵnextContext(2);
359
+ i0.ɵɵadvance(5);
360
+ i0.ɵɵtextInterpolate1(" ", (ctx_r1.SelectedTool == null ? null : ctx_r1.SelectedTool.ToolTitle) || (ctx_r1.SelectedTool == null ? null : ctx_r1.SelectedTool.ToolName), " ");
361
+ i0.ɵɵadvance();
362
+ i0.ɵɵconditional((ctx_r1.SelectedTool == null ? null : ctx_r1.SelectedTool.ToolDescription) ? 6 : -1);
363
+ i0.ɵɵadvance(4);
364
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.SelectedServerName, " ");
365
+ i0.ɵɵadvance(3);
366
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.SelectedConnectionName, " ");
367
+ i0.ɵɵadvance();
368
+ i0.ɵɵconditional(ctx_r1.ParameterConfigs.length === 0 ? 14 : 15);
369
+ } }
370
+ function MCPTestToolDialogComponent_div_1_div_29_Conditional_3_Template(rf, ctx) { if (rf & 1) {
371
+ i0.ɵɵelement(0, "i", 52);
372
+ i0.ɵɵelementStart(1, "span", 80);
373
+ i0.ɵɵtext(2, "Execution Successful");
374
+ i0.ɵɵelementEnd();
375
+ } }
376
+ function MCPTestToolDialogComponent_div_1_div_29_Conditional_4_Template(rf, ctx) { if (rf & 1) {
377
+ i0.ɵɵelement(0, "i", 81);
378
+ i0.ɵɵelementStart(1, "span", 80);
379
+ i0.ɵɵtext(2, "Execution Failed");
380
+ i0.ɵɵelementEnd();
381
+ } }
382
+ function MCPTestToolDialogComponent_div_1_div_29_Conditional_5_Template(rf, ctx) { if (rf & 1) {
383
+ i0.ɵɵelementStart(0, "span", 73);
384
+ i0.ɵɵtext(1);
385
+ i0.ɵɵelementEnd();
386
+ } if (rf & 2) {
387
+ const ctx_r1 = i0.ɵɵnextContext(3);
388
+ i0.ɵɵadvance();
389
+ i0.ɵɵtextInterpolate1("", ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.DurationMs, "ms");
390
+ } }
391
+ function MCPTestToolDialogComponent_div_1_div_29_Conditional_22_Template(rf, ctx) { if (rf & 1) {
392
+ i0.ɵɵelementStart(0, "div", 78)(1, "h4");
393
+ i0.ɵɵelement(2, "i", 41);
394
+ i0.ɵɵtext(3, " Error");
395
+ i0.ɵɵelementEnd();
396
+ i0.ɵɵelementStart(4, "pre", 82);
397
+ i0.ɵɵtext(5);
398
+ i0.ɵɵelementEnd()();
399
+ } if (rf & 2) {
400
+ const ctx_r1 = i0.ɵɵnextContext(3);
401
+ i0.ɵɵadvance(5);
402
+ i0.ɵɵtextInterpolate(ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.ErrorMessage);
403
+ } }
404
+ function MCPTestToolDialogComponent_div_1_div_29_Conditional_23_Template(rf, ctx) { if (rf & 1) {
405
+ const _r17 = i0.ɵɵgetCurrentView();
406
+ i0.ɵɵelementStart(0, "div", 79)(1, "div", 83)(2, "h4");
407
+ i0.ɵɵelement(3, "i", 84);
408
+ i0.ɵɵtext(4, " Result");
409
+ i0.ɵɵelementEnd();
410
+ i0.ɵɵelementStart(5, "button", 85);
411
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_div_29_Conditional_23_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyResult()); });
412
+ i0.ɵɵelement(6, "i", 86);
413
+ i0.ɵɵelementEnd()();
414
+ i0.ɵɵelementStart(7, "div", 87);
415
+ i0.ɵɵelement(8, "mj-code-editor", 88);
416
+ i0.ɵɵelementEnd()();
417
+ } if (rf & 2) {
418
+ const ctx_r1 = i0.ɵɵnextContext(3);
419
+ i0.ɵɵadvance(8);
420
+ i0.ɵɵproperty("ngModel", ctx_r1.FormattedResult)("language", "json")("readonly", true);
421
+ } }
422
+ function MCPTestToolDialogComponent_div_1_div_29_Template(rf, ctx) { if (rf & 1) {
423
+ i0.ɵɵelementStart(0, "div", 70)(1, "div", 71)(2, "div", 72);
424
+ i0.ɵɵtemplate(3, MCPTestToolDialogComponent_div_1_div_29_Conditional_3_Template, 3, 0)(4, MCPTestToolDialogComponent_div_1_div_29_Conditional_4_Template, 3, 0)(5, MCPTestToolDialogComponent_div_1_div_29_Conditional_5_Template, 2, 1, "span", 73);
425
+ i0.ɵɵelementEnd();
426
+ i0.ɵɵelementStart(6, "div", 74)(7, "div", 75)(8, "span", 76);
427
+ i0.ɵɵtext(9, "Tool:");
428
+ i0.ɵɵelementEnd();
429
+ i0.ɵɵelementStart(10, "span", 77);
430
+ i0.ɵɵtext(11);
431
+ i0.ɵɵelementEnd()();
432
+ i0.ɵɵelementStart(12, "div", 75)(13, "span", 76);
433
+ i0.ɵɵtext(14, "Server:");
434
+ i0.ɵɵelementEnd();
435
+ i0.ɵɵelementStart(15, "span", 77);
436
+ i0.ɵɵtext(16);
437
+ i0.ɵɵelementEnd()();
438
+ i0.ɵɵelementStart(17, "div", 75)(18, "span", 76);
439
+ i0.ɵɵtext(19, "Connection:");
440
+ i0.ɵɵelementEnd();
441
+ i0.ɵɵelementStart(20, "span", 77);
442
+ i0.ɵɵtext(21);
443
+ i0.ɵɵelementEnd()()();
444
+ i0.ɵɵtemplate(22, MCPTestToolDialogComponent_div_1_div_29_Conditional_22_Template, 6, 1, "div", 78)(23, MCPTestToolDialogComponent_div_1_div_29_Conditional_23_Template, 9, 3, "div", 79);
445
+ i0.ɵɵelementEnd()();
446
+ } if (rf & 2) {
447
+ const ctx_r1 = i0.ɵɵnextContext(2);
448
+ i0.ɵɵadvance(2);
449
+ i0.ɵɵclassProp("success", ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.Success)("error", !(ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.Success));
450
+ i0.ɵɵadvance();
451
+ i0.ɵɵconditional((ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.Success) ? 3 : 4);
452
+ i0.ɵɵadvance(2);
453
+ i0.ɵɵconditional((ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.DurationMs) ? 5 : -1);
454
+ i0.ɵɵadvance(6);
455
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedToolName);
456
+ i0.ɵɵadvance(5);
457
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedServerName);
458
+ i0.ɵɵadvance(5);
459
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedConnectionName);
460
+ i0.ɵɵadvance();
461
+ i0.ɵɵconditional((ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.ErrorMessage) ? 22 : -1);
462
+ i0.ɵɵadvance();
463
+ i0.ɵɵconditional((ctx_r1.ExecutionResult == null ? null : ctx_r1.ExecutionResult.Result) ? 23 : -1);
464
+ } }
465
+ function MCPTestToolDialogComponent_div_1_Case_31_Template(rf, ctx) { if (rf & 1) {
466
+ const _r18 = i0.ɵɵgetCurrentView();
467
+ i0.ɵɵelementStart(0, "button", 89);
468
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_31_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.proceedToConfig()); });
469
+ i0.ɵɵelement(1, "i", 90);
470
+ i0.ɵɵtext(2, " Next ");
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(3, "button", 91);
473
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_31_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeDialog()); });
474
+ i0.ɵɵtext(4, "Cancel");
475
+ i0.ɵɵelementEnd();
476
+ } if (rf & 2) {
477
+ const ctx_r1 = i0.ɵɵnextContext(2);
478
+ i0.ɵɵproperty("disabled", !ctx_r1.CanProceedToConfig);
479
+ } }
480
+ function MCPTestToolDialogComponent_div_1_Case_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
481
+ i0.ɵɵelement(0, "i", 93);
482
+ i0.ɵɵtext(1, " Executing... ");
483
+ } }
484
+ function MCPTestToolDialogComponent_div_1_Case_32_Conditional_2_Template(rf, ctx) { if (rf & 1) {
485
+ i0.ɵɵelement(0, "i", 94);
486
+ i0.ɵɵtext(1, " Execute Tool ");
487
+ } }
488
+ function MCPTestToolDialogComponent_div_1_Case_32_Template(rf, ctx) { if (rf & 1) {
489
+ const _r19 = i0.ɵɵgetCurrentView();
490
+ i0.ɵɵelementStart(0, "button", 89);
491
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.executeTool()); });
492
+ i0.ɵɵtemplate(1, MCPTestToolDialogComponent_div_1_Case_32_Conditional_1_Template, 2, 0)(2, MCPTestToolDialogComponent_div_1_Case_32_Conditional_2_Template, 2, 0);
493
+ i0.ɵɵelementEnd();
494
+ i0.ɵɵelementStart(3, "button", 91);
495
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_32_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.goBack()); });
496
+ i0.ɵɵelement(4, "i", 92);
497
+ i0.ɵɵtext(5, " Back ");
498
+ i0.ɵɵelementEnd();
499
+ } if (rf & 2) {
500
+ const ctx_r1 = i0.ɵɵnextContext(2);
501
+ i0.ɵɵproperty("disabled", !ctx_r1.IsValid || ctx_r1.IsExecuting);
502
+ i0.ɵɵadvance();
503
+ i0.ɵɵconditional(ctx_r1.IsExecuting ? 1 : 2);
504
+ } }
505
+ function MCPTestToolDialogComponent_div_1_Case_33_Template(rf, ctx) { if (rf & 1) {
506
+ const _r20 = i0.ɵɵgetCurrentView();
507
+ i0.ɵɵelementStart(0, "button", 95);
508
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.runAgain()); });
509
+ i0.ɵɵelement(1, "i", 96);
510
+ i0.ɵɵtext(2, " Run Again ");
511
+ i0.ɵɵelementEnd();
512
+ i0.ɵɵelementStart(3, "button", 91);
513
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.goBack()); });
514
+ i0.ɵɵelement(4, "i", 92);
515
+ i0.ɵɵtext(5, " Edit Parameters ");
516
+ i0.ɵɵelementEnd();
517
+ i0.ɵɵelementStart(6, "button", 91);
518
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Case_33_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeDialog()); });
519
+ i0.ɵɵtext(7, "Close");
520
+ i0.ɵɵelementEnd();
521
+ } }
522
+ function MCPTestToolDialogComponent_div_1_Template(rf, ctx) { if (rf & 1) {
523
+ const _r3 = i0.ɵɵgetCurrentView();
524
+ i0.ɵɵelementStart(0, "div", 3);
525
+ i0.ɵɵtemplate(1, MCPTestToolDialogComponent_div_1_Conditional_1_Template, 2, 2, "div", 4);
526
+ i0.ɵɵelementStart(2, "div", 5)(3, "h2", 6);
527
+ i0.ɵɵelement(4, "i", 7);
528
+ i0.ɵɵtext(5, " Test MCP Tool ");
529
+ i0.ɵɵelementEnd();
530
+ i0.ɵɵelementStart(6, "button", 8);
531
+ i0.ɵɵlistener("click", function MCPTestToolDialogComponent_div_1_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDialog()); });
532
+ i0.ɵɵelement(7, "i", 9);
533
+ i0.ɵɵelementEnd()();
534
+ i0.ɵɵelementStart(8, "div", 10)(9, "div", 11)(10, "span", 12);
535
+ i0.ɵɵtext(11, "1");
536
+ i0.ɵɵelementEnd();
537
+ i0.ɵɵelementStart(12, "span", 13);
538
+ i0.ɵɵtext(13, "Select Tool");
539
+ i0.ɵɵelementEnd()();
540
+ i0.ɵɵelement(14, "div", 14);
541
+ i0.ɵɵelementStart(15, "div", 11)(16, "span", 12);
542
+ i0.ɵɵtext(17, "2");
543
+ i0.ɵɵelementEnd();
544
+ i0.ɵɵelementStart(18, "span", 13);
545
+ i0.ɵɵtext(19, "Configure");
546
+ i0.ɵɵelementEnd()();
547
+ i0.ɵɵelement(20, "div", 14);
548
+ i0.ɵɵelementStart(21, "div", 11)(22, "span", 12);
549
+ i0.ɵɵtext(23, "3");
550
+ i0.ɵɵelementEnd();
551
+ i0.ɵɵelementStart(24, "span", 13);
552
+ i0.ɵɵtext(25, "Results");
553
+ i0.ɵɵelementEnd()()();
554
+ i0.ɵɵelementStart(26, "div", 15);
555
+ i0.ɵɵtemplate(27, MCPTestToolDialogComponent_div_1_div_27_Template, 31, 24, "div", 16)(28, MCPTestToolDialogComponent_div_1_div_28_Template, 16, 5, "div", 16)(29, MCPTestToolDialogComponent_div_1_div_29_Template, 24, 11, "div", 17);
556
+ i0.ɵɵelementEnd();
557
+ i0.ɵɵelementStart(30, "div", 18);
558
+ i0.ɵɵtemplate(31, MCPTestToolDialogComponent_div_1_Case_31_Template, 5, 1)(32, MCPTestToolDialogComponent_div_1_Case_32_Template, 6, 2)(33, MCPTestToolDialogComponent_div_1_Case_33_Template, 8, 0);
559
+ i0.ɵɵelementEnd()();
560
+ } if (rf & 2) {
561
+ let tmp_16_0;
562
+ const ctx_r1 = i0.ɵɵnextContext();
563
+ i0.ɵɵstyleProp("width", ctx_r1.IsMobileMode ? null : ctx_r1.PanelWidth, "px");
564
+ i0.ɵɵclassProp("mobile", ctx_r1.IsMobileMode)("resizing", ctx_r1.IsResizing);
565
+ i0.ɵɵproperty("@slideIn", undefined);
566
+ i0.ɵɵadvance();
567
+ i0.ɵɵconditional(!ctx_r1.IsMobileMode ? 1 : -1);
568
+ i0.ɵɵadvance(8);
569
+ i0.ɵɵclassProp("active", ctx_r1.CurrentStep === "select")("completed", ctx_r1.CurrentStep !== "select");
570
+ i0.ɵɵadvance(5);
571
+ i0.ɵɵclassProp("completed", ctx_r1.CurrentStep !== "select");
572
+ i0.ɵɵadvance();
573
+ i0.ɵɵclassProp("active", ctx_r1.CurrentStep === "configure")("completed", ctx_r1.CurrentStep === "results");
574
+ i0.ɵɵadvance(5);
575
+ i0.ɵɵclassProp("completed", ctx_r1.CurrentStep === "results");
576
+ i0.ɵɵadvance();
577
+ i0.ɵɵclassProp("active", ctx_r1.CurrentStep === "results");
578
+ i0.ɵɵadvance(6);
579
+ i0.ɵɵproperty("ngIf", ctx_r1.CurrentStep === "select");
580
+ i0.ɵɵadvance();
581
+ i0.ɵɵproperty("ngIf", ctx_r1.CurrentStep === "configure");
582
+ i0.ɵɵadvance();
583
+ i0.ɵɵproperty("ngIf", ctx_r1.CurrentStep === "results");
584
+ i0.ɵɵadvance(2);
585
+ i0.ɵɵconditional((tmp_16_0 = ctx_r1.CurrentStep) === "select" ? 31 : tmp_16_0 === "configure" ? 32 : tmp_16_0 === "results" ? 33 : -1);
586
+ } }
587
+ /**
588
+ * GraphQL mutation for executing MCP tool
589
+ */
590
+ const ExecuteMCPToolMutation = gql `
591
+ mutation ExecuteMCPTool($input: ExecuteMCPToolInput!) {
592
+ ExecuteMCPTool(input: $input) {
593
+ Success
594
+ ErrorMessage
595
+ Result
596
+ DurationMs
597
+ }
598
+ }
599
+ `;
600
+ export class MCPTestToolDialogComponent {
601
+ cdr;
602
+ elementRef;
603
+ // ========================================
604
+ // Inputs
605
+ // ========================================
606
+ Visible = false;
607
+ Servers = [];
608
+ Connections = [];
609
+ Tools = [];
610
+ /** Pre-selected server ID */
611
+ SelectedServerID = null;
612
+ /** Pre-selected connection ID */
613
+ SelectedConnectionID = null;
614
+ /** Pre-selected tool ID */
615
+ SelectedToolID = null;
616
+ // ========================================
617
+ // Outputs
618
+ // ========================================
619
+ Close = new EventEmitter();
620
+ // ========================================
621
+ // State
622
+ // ========================================
623
+ /** Current step: 'select' | 'configure' | 'results' */
624
+ CurrentStep = 'select';
625
+ /** Selected IDs */
626
+ ServerID = null;
627
+ ConnectionID = null;
628
+ ToolID = null;
629
+ /** Filtered lists based on selection */
630
+ FilteredConnections = [];
631
+ FilteredTools = [];
632
+ /** Display lists for dropdowns (filtered by search) */
633
+ DisplayServers = [];
634
+ DisplayConnections = [];
635
+ DisplayTools = [];
636
+ /** No connections warning */
637
+ NoConnectionsWarning = null;
638
+ /** Selected tool details */
639
+ SelectedTool = null;
640
+ ParameterConfigs = [];
641
+ ParameterValues = {};
642
+ /** Execution state */
643
+ IsExecuting = false;
644
+ ExecutionResult = null;
645
+ ExecutionError = null;
646
+ /** User settings key prefix */
647
+ SETTINGS_PREFIX = 'mcp-tool-test/';
648
+ // ========================================
649
+ // Panel Width / Resize State
650
+ // ========================================
651
+ /** Panel width settings key */
652
+ PANEL_WIDTH_SETTING_KEY = 'mcp-test-tool-panel/width';
653
+ /** Panel width constraints */
654
+ MIN_PANEL_WIDTH = 320;
655
+ MAX_PANEL_WIDTH = 900;
656
+ DEFAULT_PANEL_WIDTH = 700;
657
+ MOBILE_BREAKPOINT = 768;
658
+ /** Current panel width in pixels */
659
+ PanelWidth = this.DEFAULT_PANEL_WIDTH;
660
+ /** Whether user is currently resizing */
661
+ IsResizing = false;
662
+ /** Whether panel should be full-width (mobile mode) */
663
+ get IsMobileMode() {
664
+ return typeof window !== 'undefined' && window.innerWidth <= this.MOBILE_BREAKPOINT;
665
+ }
666
+ /** Subject for debounced width persistence */
667
+ widthPersistSubject = new Subject();
668
+ destroy$ = new Subject();
669
+ gqlProvider = GraphQLDataProvider.Instance;
670
+ constructor(cdr, elementRef) {
671
+ this.cdr = cdr;
672
+ this.elementRef = elementRef;
673
+ // Debounce width persistence to avoid excessive writes
674
+ this.widthPersistSubject.pipe(debounceTime(500), takeUntil(this.destroy$)).subscribe(width => {
675
+ this.persistPanelWidth(width);
676
+ });
677
+ }
678
+ ngOnInit() {
679
+ // Load saved panel width
680
+ this.loadSavedPanelWidth();
681
+ // Initialize display arrays
682
+ this.DisplayServers = [...this.Servers];
683
+ // Apply pre-selected values
684
+ if (this.SelectedServerID) {
685
+ this.ServerID = this.SelectedServerID;
686
+ this.onServerChange();
687
+ }
688
+ if (this.SelectedConnectionID) {
689
+ this.ConnectionID = this.SelectedConnectionID;
690
+ this.onConnectionChange();
691
+ }
692
+ if (this.SelectedToolID) {
693
+ this.ToolID = this.SelectedToolID;
694
+ }
695
+ }
696
+ ngOnDestroy() {
697
+ this.destroy$.next();
698
+ this.destroy$.complete();
699
+ }
700
+ // ========================================
701
+ // Selection Handlers
702
+ // ========================================
703
+ onServerChange() {
704
+ this.NoConnectionsWarning = null;
705
+ // Filter connections by selected server
706
+ if (this.ServerID) {
707
+ this.FilteredConnections = this.Connections.filter(c => c.MCPServerID === this.ServerID && c.Status === 'Active');
708
+ // Filter tools by selected server
709
+ this.FilteredTools = this.Tools.filter(t => t.MCPServerID === this.ServerID && t.Status === 'Active');
710
+ // Check if server requires authentication
711
+ const server = this.Servers.find(s => s.ID === this.ServerID);
712
+ const serverRequiresAuth = server?.Status === 'Active'; // All servers currently need connections
713
+ // Auto-select connection logic
714
+ if (this.FilteredConnections.length === 0) {
715
+ this.ConnectionID = null;
716
+ if (serverRequiresAuth) {
717
+ this.NoConnectionsWarning = 'No active connections available for this server. Please create a connection first.';
718
+ }
719
+ }
720
+ else if (this.FilteredConnections.length === 1) {
721
+ // Auto-select the only connection
722
+ this.ConnectionID = this.FilteredConnections[0].ID;
723
+ }
724
+ else {
725
+ // Select the first connection by default
726
+ this.ConnectionID = this.FilteredConnections[0].ID;
727
+ }
728
+ }
729
+ else {
730
+ this.FilteredConnections = [];
731
+ this.FilteredTools = [];
732
+ this.ConnectionID = null;
733
+ }
734
+ // Update display arrays for filtering
735
+ this.DisplayConnections = [...this.FilteredConnections];
736
+ this.DisplayTools = [...this.FilteredTools];
737
+ // Reset tool selection
738
+ this.ToolID = null;
739
+ this.cdr.detectChanges();
740
+ }
741
+ onConnectionChange() {
742
+ // Connection changed - tools are filtered by server, not connection
743
+ this.cdr.detectChanges();
744
+ }
745
+ onToolChange() {
746
+ this.cdr.detectChanges();
747
+ }
748
+ // ========================================
749
+ // Dropdown Filter Handlers
750
+ // ========================================
751
+ /**
752
+ * Handle server dropdown filter change
753
+ */
754
+ onServerFilterChange(filter) {
755
+ const filterLower = (filter || '').toLowerCase();
756
+ this.DisplayServers = this.Servers.filter(s => s.Name.toLowerCase().includes(filterLower) ||
757
+ (s.Description?.toLowerCase().includes(filterLower) ?? false));
758
+ }
759
+ /**
760
+ * Handle connection dropdown filter change
761
+ */
762
+ onConnectionFilterChange(filter) {
763
+ const filterLower = (filter || '').toLowerCase();
764
+ this.DisplayConnections = this.FilteredConnections.filter(c => c.Name.toLowerCase().includes(filterLower) ||
765
+ (c.Description?.toLowerCase().includes(filterLower) ?? false));
766
+ }
767
+ /**
768
+ * Handle tool dropdown filter change
769
+ */
770
+ onToolFilterChange(filter) {
771
+ const filterLower = (filter || '').toLowerCase();
772
+ this.DisplayTools = this.FilteredTools.filter(t => t.ToolName.toLowerCase().includes(filterLower) ||
773
+ (t.ToolTitle?.toLowerCase().includes(filterLower) ?? false) ||
774
+ (t.ToolDescription?.toLowerCase().includes(filterLower) ?? false));
775
+ }
776
+ /**
777
+ * Can proceed to configuration step
778
+ */
779
+ get CanProceedToConfig() {
780
+ return this.ServerID != null && this.ConnectionID != null && this.ToolID != null;
781
+ }
782
+ /**
783
+ * Proceed to configuration step
784
+ */
785
+ async proceedToConfig() {
786
+ if (!this.CanProceedToConfig)
787
+ return;
788
+ this.SelectedTool = this.Tools.find(t => t.ID === this.ToolID) || null;
789
+ if (!this.SelectedTool)
790
+ return;
791
+ // Parse input schema and create parameter configs
792
+ this.parseInputSchema();
793
+ // Load cached parameter values
794
+ await this.loadCachedParameters();
795
+ this.CurrentStep = 'configure';
796
+ this.cdr.detectChanges();
797
+ }
798
+ /**
799
+ * Parse the tool's input schema to create parameter configurations
800
+ */
801
+ parseInputSchema() {
802
+ if (!this.SelectedTool?.InputSchema) {
803
+ this.ParameterConfigs = [];
804
+ return;
805
+ }
806
+ try {
807
+ const schema = JSON.parse(this.SelectedTool.InputSchema);
808
+ const properties = schema.properties || {};
809
+ const required = schema.required || [];
810
+ this.ParameterConfigs = Object.entries(properties).map(([name, prop]) => {
811
+ const propDef = prop;
812
+ return {
813
+ name,
814
+ type: this.normalizeType(propDef.type),
815
+ description: propDef.description || '',
816
+ required: required.includes(name),
817
+ defaultValue: propDef.default,
818
+ enumValues: propDef.enum || [],
819
+ format: propDef.format || null,
820
+ minimum: propDef.minimum,
821
+ maximum: propDef.maximum
822
+ };
823
+ });
824
+ // Sort: required first, then alphabetically
825
+ this.ParameterConfigs.sort((a, b) => {
826
+ if (a.required !== b.required)
827
+ return a.required ? -1 : 1;
828
+ return a.name.localeCompare(b.name);
829
+ });
830
+ // Initialize parameter values with defaults
831
+ this.ParameterValues = {};
832
+ for (const config of this.ParameterConfigs) {
833
+ if (config.defaultValue !== undefined) {
834
+ this.ParameterValues[config.name] = config.defaultValue;
835
+ }
836
+ else {
837
+ this.ParameterValues[config.name] = this.getDefaultForType(config.type);
838
+ }
839
+ }
840
+ }
841
+ catch (error) {
842
+ console.error('Failed to parse input schema:', error);
843
+ this.ParameterConfigs = [];
844
+ }
845
+ }
846
+ /**
847
+ * Normalize JSON Schema type to string
848
+ */
849
+ normalizeType(type) {
850
+ if (!type)
851
+ return 'string';
852
+ if (Array.isArray(type)) {
853
+ // Filter out 'null' and take first type
854
+ const nonNull = type.filter(t => t !== 'null');
855
+ return nonNull.length > 0 ? nonNull[0] : 'string';
856
+ }
857
+ return type;
858
+ }
859
+ /**
860
+ * Get default value for a type
861
+ */
862
+ getDefaultForType(type) {
863
+ switch (type) {
864
+ case 'string': return '';
865
+ case 'number':
866
+ case 'integer': return null;
867
+ case 'boolean': return false;
868
+ case 'array': return [];
869
+ case 'object': return {};
870
+ default: return '';
871
+ }
872
+ }
873
+ /**
874
+ * Load cached parameter values from UserInfoEngine
875
+ */
876
+ async loadCachedParameters() {
877
+ if (!this.SelectedTool)
878
+ return;
879
+ const settingKey = this.getSettingKey();
880
+ const engine = UserInfoEngine.Instance;
881
+ const cachedValue = engine.GetSetting(settingKey);
882
+ if (cachedValue) {
883
+ try {
884
+ const cached = JSON.parse(cachedValue);
885
+ // Merge cached values with defaults (cached takes precedence)
886
+ this.ParameterValues = { ...this.ParameterValues, ...cached };
887
+ }
888
+ catch (error) {
889
+ console.warn('Failed to parse cached parameters:', error);
890
+ }
891
+ }
892
+ }
893
+ /**
894
+ * Save current parameter values to cache
895
+ */
896
+ async saveCachedParameters() {
897
+ if (!this.SelectedTool)
898
+ return;
899
+ const settingKey = this.getSettingKey();
900
+ const engine = UserInfoEngine.Instance;
901
+ try {
902
+ await engine.SetSetting(settingKey, JSON.stringify(this.ParameterValues));
903
+ }
904
+ catch (error) {
905
+ console.warn('Failed to save cached parameters:', error);
906
+ }
907
+ }
908
+ /**
909
+ * Get the setting key for caching parameters
910
+ */
911
+ getSettingKey() {
912
+ return `${this.SETTINGS_PREFIX}${this.ServerID}/${this.ToolID}`;
913
+ }
914
+ // ========================================
915
+ // Parameter Input Helpers
916
+ // ========================================
917
+ /**
918
+ * Get input type for a parameter
919
+ */
920
+ getInputType(config) {
921
+ if (config.enumValues.length > 0)
922
+ return 'select';
923
+ if (config.format === 'date')
924
+ return 'date';
925
+ if (config.format === 'date-time')
926
+ return 'datetime-local';
927
+ if (config.format === 'email')
928
+ return 'email';
929
+ if (config.format === 'uri' || config.format === 'url')
930
+ return 'url';
931
+ switch (config.type) {
932
+ case 'boolean': return 'checkbox';
933
+ case 'integer':
934
+ case 'number': return 'number';
935
+ case 'array':
936
+ case 'object': return 'textarea';
937
+ default: return 'text';
938
+ }
939
+ }
940
+ /**
941
+ * Check if parameter should use textarea
942
+ */
943
+ isTextarea(config) {
944
+ return config.type === 'array' || config.type === 'object' ||
945
+ (config.description != null && config.description.length > 100);
946
+ }
947
+ /**
948
+ * Handle parameter value change
949
+ */
950
+ onParameterChange(name, value) {
951
+ this.ParameterValues[name] = value;
952
+ }
953
+ /**
954
+ * Get parameter value as string for textarea display
955
+ */
956
+ getTextareaValue(name) {
957
+ const value = this.ParameterValues[name];
958
+ if (value === null || value === undefined)
959
+ return '';
960
+ if (typeof value === 'object')
961
+ return JSON.stringify(value, null, 2);
962
+ return String(value);
963
+ }
964
+ /**
965
+ * Handle textarea change - parse JSON if needed
966
+ */
967
+ onTextareaChange(name, value, config) {
968
+ if (config.type === 'array' || config.type === 'object') {
969
+ try {
970
+ this.ParameterValues[name] = JSON.parse(value || (config.type === 'array' ? '[]' : '{}'));
971
+ }
972
+ catch {
973
+ // Keep as string if not valid JSON
974
+ this.ParameterValues[name] = value;
975
+ }
976
+ }
977
+ else {
978
+ this.ParameterValues[name] = value;
979
+ }
980
+ }
981
+ // ========================================
982
+ // Execution
983
+ // ========================================
984
+ /**
985
+ * Validate that all required parameters have values
986
+ */
987
+ get IsValid() {
988
+ for (const config of this.ParameterConfigs) {
989
+ if (config.required) {
990
+ const value = this.ParameterValues[config.name];
991
+ if (value === null || value === undefined || value === '') {
992
+ return false;
993
+ }
994
+ }
995
+ }
996
+ return true;
997
+ }
998
+ /**
999
+ * Execute the tool
1000
+ */
1001
+ async executeTool() {
1002
+ if (!this.IsValid || !this.ConnectionID || !this.ToolID)
1003
+ return;
1004
+ this.IsExecuting = true;
1005
+ this.ExecutionError = null;
1006
+ this.cdr.detectChanges();
1007
+ // Save parameters before execution
1008
+ await this.saveCachedParameters();
1009
+ // Build input arguments, filtering out empty optional values
1010
+ const inputArgs = {};
1011
+ for (const config of this.ParameterConfigs) {
1012
+ const value = this.ParameterValues[config.name];
1013
+ if (config.required || (value !== null && value !== undefined && value !== '')) {
1014
+ inputArgs[config.name] = value;
1015
+ }
1016
+ }
1017
+ try {
1018
+ const result = await this.gqlProvider.ExecuteGQL(ExecuteMCPToolMutation, {
1019
+ input: {
1020
+ ConnectionID: this.ConnectionID,
1021
+ ToolID: this.ToolID,
1022
+ ToolName: this.SelectedTool?.ToolName,
1023
+ InputArgs: JSON.stringify(inputArgs)
1024
+ }
1025
+ });
1026
+ this.ExecutionResult = result?.ExecuteMCPTool || {
1027
+ Success: false,
1028
+ ErrorMessage: 'No result returned from server'
1029
+ };
1030
+ this.CurrentStep = 'results';
1031
+ }
1032
+ catch (error) {
1033
+ this.ExecutionError = error instanceof Error ? error.message : String(error);
1034
+ this.ExecutionResult = {
1035
+ Success: false,
1036
+ ErrorMessage: this.ExecutionError
1037
+ };
1038
+ this.CurrentStep = 'results';
1039
+ }
1040
+ finally {
1041
+ this.IsExecuting = false;
1042
+ this.cdr.detectChanges();
1043
+ }
1044
+ }
1045
+ // ========================================
1046
+ // Results Helpers
1047
+ // ========================================
1048
+ /**
1049
+ * Format the result for display
1050
+ */
1051
+ get FormattedResult() {
1052
+ if (!this.ExecutionResult?.Result)
1053
+ return '';
1054
+ try {
1055
+ if (typeof this.ExecutionResult.Result === 'string') {
1056
+ // Try to parse as JSON for pretty printing
1057
+ const parsed = JSON.parse(this.ExecutionResult.Result);
1058
+ return JSON.stringify(parsed, null, 2);
1059
+ }
1060
+ return JSON.stringify(this.ExecutionResult.Result, null, 2);
1061
+ }
1062
+ catch {
1063
+ return String(this.ExecutionResult.Result);
1064
+ }
1065
+ }
1066
+ /**
1067
+ * Check if result is JSON
1068
+ */
1069
+ get IsResultJson() {
1070
+ if (!this.ExecutionResult?.Result)
1071
+ return false;
1072
+ try {
1073
+ if (typeof this.ExecutionResult.Result === 'string') {
1074
+ JSON.parse(this.ExecutionResult.Result);
1075
+ }
1076
+ return typeof this.ExecutionResult.Result === 'object';
1077
+ }
1078
+ catch {
1079
+ return false;
1080
+ }
1081
+ }
1082
+ /**
1083
+ * Copy result to clipboard
1084
+ */
1085
+ async copyResult() {
1086
+ if (!this.FormattedResult)
1087
+ return;
1088
+ try {
1089
+ await navigator.clipboard.writeText(this.FormattedResult);
1090
+ }
1091
+ catch (error) {
1092
+ console.error('Failed to copy to clipboard:', error);
1093
+ }
1094
+ }
1095
+ // ========================================
1096
+ // Navigation
1097
+ // ========================================
1098
+ /**
1099
+ * Go back to previous step
1100
+ */
1101
+ goBack() {
1102
+ if (this.CurrentStep === 'results') {
1103
+ this.CurrentStep = 'configure';
1104
+ }
1105
+ else if (this.CurrentStep === 'configure') {
1106
+ this.CurrentStep = 'select';
1107
+ }
1108
+ this.cdr.detectChanges();
1109
+ }
1110
+ /**
1111
+ * Run the tool again with same parameters
1112
+ */
1113
+ async runAgain() {
1114
+ this.CurrentStep = 'configure';
1115
+ this.ExecutionResult = null;
1116
+ this.ExecutionError = null;
1117
+ this.cdr.detectChanges();
1118
+ }
1119
+ /**
1120
+ * Close the dialog
1121
+ */
1122
+ closeDialog() {
1123
+ this.Close.emit();
1124
+ }
1125
+ // ========================================
1126
+ // Panel Resize Handlers
1127
+ // ========================================
1128
+ /**
1129
+ * Start resize operation
1130
+ */
1131
+ onResizeStart(event) {
1132
+ if (this.IsMobileMode)
1133
+ return; // No resize on mobile
1134
+ event.preventDefault();
1135
+ this.IsResizing = true;
1136
+ document.body.style.cursor = 'ew-resize';
1137
+ document.body.style.userSelect = 'none';
1138
+ }
1139
+ /**
1140
+ * Handle mouse move during resize
1141
+ */
1142
+ onMouseMove(event) {
1143
+ if (!this.IsResizing)
1144
+ return;
1145
+ // Calculate width from right edge of viewport to cursor
1146
+ const newWidth = window.innerWidth - event.clientX;
1147
+ // Clamp to bounds
1148
+ this.PanelWidth = Math.min(Math.max(newWidth, this.MIN_PANEL_WIDTH), Math.min(this.MAX_PANEL_WIDTH, window.innerWidth - 50) // Leave 50px margin
1149
+ );
1150
+ this.cdr.detectChanges();
1151
+ }
1152
+ /**
1153
+ * End resize operation
1154
+ */
1155
+ onMouseUp() {
1156
+ if (this.IsResizing) {
1157
+ this.IsResizing = false;
1158
+ document.body.style.cursor = '';
1159
+ document.body.style.userSelect = '';
1160
+ // Persist panel width (debounced)
1161
+ this.widthPersistSubject.next(this.PanelWidth);
1162
+ }
1163
+ }
1164
+ /**
1165
+ * Handle window resize for mobile mode
1166
+ */
1167
+ onWindowResize() {
1168
+ // In mobile mode, always use full width
1169
+ if (this.IsMobileMode) {
1170
+ this.PanelWidth = window.innerWidth;
1171
+ }
1172
+ else {
1173
+ // Ensure panel doesn't exceed viewport
1174
+ if (this.PanelWidth > window.innerWidth - 50) {
1175
+ this.PanelWidth = Math.max(this.MIN_PANEL_WIDTH, window.innerWidth - 50);
1176
+ }
1177
+ }
1178
+ this.cdr.detectChanges();
1179
+ }
1180
+ /**
1181
+ * Load saved panel width from user settings
1182
+ */
1183
+ loadSavedPanelWidth() {
1184
+ // In mobile mode, always use full width
1185
+ if (this.IsMobileMode) {
1186
+ this.PanelWidth = window.innerWidth;
1187
+ return;
1188
+ }
1189
+ try {
1190
+ const savedWidth = UserInfoEngine.Instance.GetSetting(this.PANEL_WIDTH_SETTING_KEY);
1191
+ if (savedWidth) {
1192
+ const width = parseInt(savedWidth, 10);
1193
+ if (!isNaN(width) && width >= this.MIN_PANEL_WIDTH && width <= this.MAX_PANEL_WIDTH) {
1194
+ this.PanelWidth = width;
1195
+ }
1196
+ }
1197
+ }
1198
+ catch (error) {
1199
+ console.warn('[MCPTestToolPanel] Failed to load saved panel width:', error);
1200
+ }
1201
+ }
1202
+ /**
1203
+ * Persist panel width to user settings
1204
+ */
1205
+ async persistPanelWidth(width) {
1206
+ try {
1207
+ await UserInfoEngine.Instance.SetSetting(this.PANEL_WIDTH_SETTING_KEY, String(width));
1208
+ }
1209
+ catch (error) {
1210
+ console.warn('[MCPTestToolPanel] Failed to persist panel width:', error);
1211
+ }
1212
+ }
1213
+ /**
1214
+ * Get display name for selected server
1215
+ */
1216
+ get SelectedServerName() {
1217
+ const server = this.Servers.find(s => s.ID === this.ServerID);
1218
+ return server?.Name || '';
1219
+ }
1220
+ /**
1221
+ * Get display name for selected connection
1222
+ */
1223
+ get SelectedConnectionName() {
1224
+ const connection = this.Connections.find(c => c.ID === this.ConnectionID);
1225
+ return connection?.Name || '';
1226
+ }
1227
+ /**
1228
+ * Get display name for selected tool
1229
+ */
1230
+ get SelectedToolName() {
1231
+ return this.SelectedTool?.ToolTitle || this.SelectedTool?.ToolName || '';
1232
+ }
1233
+ static ɵfac = function MCPTestToolDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPTestToolDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
1234
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPTestToolDialogComponent, selectors: [["mj-mcp-test-tool-dialog"]], hostBindings: function MCPTestToolDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
1235
+ i0.ɵɵlistener("mousemove", function MCPTestToolDialogComponent_mousemove_HostBindingHandler($event) { return ctx.onMouseMove($event); }, false, i0.ɵɵresolveDocument)("mouseup", function MCPTestToolDialogComponent_mouseup_HostBindingHandler() { return ctx.onMouseUp(); }, false, i0.ɵɵresolveDocument)("resize", function MCPTestToolDialogComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
1236
+ } }, inputs: { Visible: "Visible", Servers: "Servers", Connections: "Connections", Tools: "Tools", SelectedServerID: "SelectedServerID", SelectedConnectionID: "SelectedConnectionID", SelectedToolID: "SelectedToolID" }, outputs: { Close: "Close" }, decls: 2, vars: 2, consts: [[1, "panel-backdrop"], ["class", "slide-out-panel", 3, "width", "mobile", "resizing", 4, "ngIf"], [1, "panel-backdrop", 3, "click"], [1, "slide-out-panel"], ["title", "Drag to resize", 1, "resize-handle", 3, "active"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-flask"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "step-indicator"], [1, "step"], [1, "step-number"], [1, "step-label"], [1, "step-connector"], [1, "panel-content"], ["class", "step-content", 4, "ngIf"], ["class", "step-content results-step", 4, "ngIf"], [1, "panel-actions"], ["title", "Drag to resize", 1, "resize-handle", 3, "mousedown"], [1, "resize-grip"], [1, "step-content"], [1, "selection-form"], [1, "form-group"], [1, "form-label"], [1, "fa-solid", "fa-server"], [1, "required"], ["placeholder", "Select a server...", 3, "ngModelChange", "valueChange", "filterChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "filterable"], ["kendoDropDownListItemTemplate", ""], [1, "fa-solid", "fa-link"], ["placeholder", "Select a connection...", 3, "ngModelChange", "valueChange", "filterChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "disabled", "filterable"], [1, "field-hint"], [1, "field-error"], [1, "field-hint", "auto-selected"], [1, "fa-solid", "fa-wrench"], ["placeholder", "Select a tool...", 3, "ngModelChange", "valueChange", "filterChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "disabled", "filterable"], ["kendoDropDownListValueTemplate", ""], [1, "dropdown-item"], [1, "item-name"], [1, "item-status"], [1, "item-description"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-check"], [1, "dropdown-item", "tool-item"], [1, "tool-header"], [1, "tool-info"], [1, "tool-name"], [1, "tool-description"], [1, "tool-context"], [1, "context-item"], [1, "no-params"], [1, "parameters-form"], [1, "fa-solid", "fa-check-circle"], [1, "params-title"], [1, "param-group", 3, "required"], [1, "param-group"], [1, "param-label"], [1, "param-description"], [3, "data", "valuePrimitive", "ngModel"], [1, "checkbox-wrapper"], [3, "format", "step", "ngModel"], [3, "ngModelChange", "valueChange", "data", "valuePrimitive", "ngModel"], ["type", "checkbox", 3, "change", "id", "checked"], [3, "for"], [3, "ngModelChange", "valueChange", "format", "step", "ngModel"], ["rows", "4", 1, "json-input", 3, "input", "value", "placeholder"], ["rows", "3", 1, "text-input", 3, "ngModel", "placeholder"], [3, "ngModel", "placeholder"], ["rows", "3", 1, "text-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], [3, "ngModelChange", "valueChange", "ngModel", "placeholder"], [1, "step-content", "results-step"], [1, "results-container"], [1, "result-header"], [1, "duration"], [1, "execution-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "error-panel"], [1, "result-panel", "fill-space"], [1, "result-status"], [1, "fa-solid", "fa-times-circle"], [1, "error-message"], [1, "result-panel-header"], [1, "fa-solid", "fa-code"], ["kendoButton", "", "fillMode", "flat", "title", "Copy to clipboard", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "code-editor-container"], [3, "ngModel", "language", "readonly"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-right"], ["kendoButton", "", "fillMode", "flat", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fa-solid", "fa-redo"]], template: function MCPTestToolDialogComponent_Template(rf, ctx) { if (rf & 1) {
1237
+ i0.ɵɵtemplate(0, MCPTestToolDialogComponent_Conditional_0_Template, 1, 0, "div", 0)(1, MCPTestToolDialogComponent_div_1_Template, 34, 26, "div", 1);
1238
+ } if (rf & 2) {
1239
+ i0.ɵɵconditional(ctx.Visible ? 0 : -1);
1240
+ i0.ɵɵadvance();
1241
+ i0.ɵɵproperty("ngIf", ctx.Visible);
1242
+ } }, dependencies: [i1.NgIf, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.ItemTemplateDirective, i4.ValueTemplateDirective, i4.DropDownListComponent, i5.TextBoxComponent, i5.NumericTextBoxComponent, i6.CodeEditorComponent], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.slide-out-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: white;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing[_ngcontent-%COMP%] {\n user-select: none;\n transition: none;\n}\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: #ccc;\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-primary-color, #2196f3);\n}\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.close-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px 20px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.step[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n opacity: 0.5;\n transition: opacity 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%], \n.step.completed[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.step-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: #e0e0e0;\n color: #666;\n font-weight: 600;\n font-size: 13px;\n transition: all 0.2s ease;\n}\n\n.step.active[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.step.completed[_ngcontent-%COMP%] .step-number[_ngcontent-%COMP%] {\n background: #4caf50;\n color: white;\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.step-connector[_ngcontent-%COMP%] {\n width: 40px;\n height: 2px;\n background: #e0e0e0;\n margin: 0 10px;\n transition: background 0.2s ease;\n}\n\n.step-connector.completed[_ngcontent-%COMP%] {\n background: #4caf50;\n}\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.step-content[_ngcontent-%COMP%] {\n min-height: 100%;\n}\n\n.step-content.results-step[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n\n\n\n\n.selection-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.form-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.required[_ngcontent-%COMP%] {\n color: #f44336;\n font-weight: 600;\n}\n\n.field-hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n font-style: italic;\n margin-top: 4px;\n}\n\n.field-hint.auto-selected[_ngcontent-%COMP%] {\n color: #4caf50;\n font-style: normal;\n}\n\n.field-hint.auto-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.field-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #f44336;\n margin-top: 4px;\n padding: 8px 10px;\n background: rgba(244, 67, 54, 0.08);\n border-radius: 4px;\n border: 1px solid rgba(244, 67, 54, 0.2);\n}\n\n.field-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.dropdown-item.tool-item[_ngcontent-%COMP%] {\n max-width: 100%;\n}\n\n.item-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.item-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n.item-status[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.item-status.status-active[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.item-status.status-inactive[_ngcontent-%COMP%] {\n color: #9e9e9e;\n}\n\n\n\n\n\n.tool-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px;\n background: linear-gradient(135deg, rgba(33, 150, 243, 0.08), rgba(33, 150, 243, 0.02));\n border-radius: 8px;\n margin-bottom: 20px;\n border: 1px solid rgba(33, 150, 243, 0.15);\n}\n\n.tool-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.tool-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.5;\n}\n\n.tool-context[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: flex-end;\n flex-shrink: 0;\n}\n\n.context-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.context-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #999;\n}\n\n\n\n\n\n.no-params[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.no-params[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #4caf50;\n margin-bottom: 16px;\n}\n\n.no-params[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n}\n\n.params-title[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary-color, #666);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.parameters-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.param-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px;\n background: #fafafa;\n border-radius: 6px;\n border: 1px solid #e8e8e8;\n}\n\n.param-group.required[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-primary-color, #2196f3);\n}\n\n.param-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.param-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n}\n\n.checkbox-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.checkbox-wrapper[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.checkbox-wrapper[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-color, #333);\n cursor: pointer;\n}\n\n.json-input[_ngcontent-%COMP%], \n.text-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 13px;\n line-height: 1.5;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n resize: vertical;\n box-sizing: border-box;\n}\n\n.json-input[_ngcontent-%COMP%]:focus, \n.text-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1);\n}\n\n\n\n\n\n.results-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.result-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n font-weight: 600;\n}\n\n.result-header.success[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #388e3c;\n}\n\n.result-header.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #4caf50;\n}\n\n.result-header.error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #c62828;\n}\n\n.result-header.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #f44336;\n}\n\n.result-status[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 16px;\n}\n\n.duration[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: normal;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 8px;\n border-radius: 4px;\n}\n\n.error-panel[_ngcontent-%COMP%] {\n background: #fff5f5;\n border: 1px solid rgba(244, 67, 54, 0.2);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 14px;\n color: #c62828;\n}\n\n.error-message[_ngcontent-%COMP%] {\n margin: 0;\n padding: 12px;\n background: white;\n border-radius: 4px;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: #c62828;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.result-panel[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.result-panel.fill-space[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 200px;\n}\n\n.result-panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.result-panel-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.code-editor-container[_ngcontent-%COMP%] {\n height: 300px;\n min-height: 200px;\n max-height: 400px;\n overflow: hidden;\n}\n\n.result-panel.fill-space[_ngcontent-%COMP%] .code-editor-container[_ngcontent-%COMP%] {\n flex: 1;\n height: auto;\n max-height: none;\n}\n\n.code-editor-container[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.execution-info[_ngcontent-%COMP%] {\n padding: 16px;\n background: #fafafa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding: 6px 0;\n font-size: 13px;\n}\n\n.info-row[_ngcontent-%COMP%]:not(:last-child) {\n border-bottom: 1px solid #e8e8e8;\n}\n\n.info-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .slide-out-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .step-indicator[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .step-connector[_ngcontent-%COMP%] {\n width: 20px;\n margin: 0 6px;\n }\n\n .step-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .tool-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n }\n\n .tool-context[_ngcontent-%COMP%] {\n align-items: flex-start;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 80px;\n }\n}\n\n@media (max-width: 480px) {\n .panel-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .panel-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .step-number[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n font-size: 12px;\n }\n\n .tool-name[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n}"], data: { animation: [
1243
+ trigger('slideIn', [
1244
+ transition(':enter', [
1245
+ style({ transform: 'translateX(100%)', opacity: 0 }),
1246
+ animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))
1247
+ ]),
1248
+ transition(':leave', [
1249
+ animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
1250
+ ])
1251
+ ])
1252
+ ] } });
1253
+ }
1254
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPTestToolDialogComponent, [{
1255
+ type: Component,
1256
+ args: [{ selector: 'mj-mcp-test-tool-dialog', animations: [
1257
+ trigger('slideIn', [
1258
+ transition(':enter', [
1259
+ style({ transform: 'translateX(100%)', opacity: 0 }),
1260
+ animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))
1261
+ ]),
1262
+ transition(':leave', [
1263
+ animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
1264
+ ])
1265
+ ])
1266
+ ], template: "<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closeDialog()\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slide-out-panel\"\n *ngIf=\"Visible\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n\n <!-- Resize Handle (left edge) -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-flask\"></i>\n Test MCP Tool\n </h2>\n <button class=\"close-btn\" (click)=\"closeDialog()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Step Indicator -->\n <div class=\"step-indicator\">\n <div class=\"step\" [class.active]=\"CurrentStep === 'select'\" [class.completed]=\"CurrentStep !== 'select'\">\n <span class=\"step-number\">1</span>\n <span class=\"step-label\">Select Tool</span>\n </div>\n <div class=\"step-connector\" [class.completed]=\"CurrentStep !== 'select'\"></div>\n <div class=\"step\" [class.active]=\"CurrentStep === 'configure'\" [class.completed]=\"CurrentStep === 'results'\">\n <span class=\"step-number\">2</span>\n <span class=\"step-label\">Configure</span>\n </div>\n <div class=\"step-connector\" [class.completed]=\"CurrentStep === 'results'\"></div>\n <div class=\"step\" [class.active]=\"CurrentStep === 'results'\">\n <span class=\"step-number\">3</span>\n <span class=\"step-label\">Results</span>\n </div>\n </div>\n\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Step 1: Select Server, Connection, Tool -->\n <div class=\"step-content\" *ngIf=\"CurrentStep === 'select'\">\n <div class=\"selection-form\">\n <!-- Server Selection -->\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-server\"></i>\n Server\n <span class=\"required\">*</span>\n </label>\n <kendo-dropdownlist\n [data]=\"DisplayServers\"\n [textField]=\"'Name'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"ServerID\"\n (valueChange)=\"onServerChange()\"\n [filterable]=\"true\"\n (filterChange)=\"onServerFilterChange($event)\"\n placeholder=\"Select a server...\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"dropdown-item\">\n <span class=\"item-name\">{{ dataItem.Name }}</span>\n <span class=\"item-status\" [class]=\"'status-' + dataItem.Status.toLowerCase()\">\n {{ dataItem.Status }}\n </span>\n </div>\n </ng-template>\n </kendo-dropdownlist>\n </div>\n\n <!-- Connection Selection -->\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-link\"></i>\n Connection\n <span class=\"required\">*</span>\n </label>\n <kendo-dropdownlist\n [data]=\"DisplayConnections\"\n [textField]=\"'Name'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"ConnectionID\"\n (valueChange)=\"onConnectionChange()\"\n [disabled]=\"!ServerID || NoConnectionsWarning !== null\"\n [filterable]=\"true\"\n (filterChange)=\"onConnectionFilterChange($event)\"\n placeholder=\"Select a connection...\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"dropdown-item\">\n <span class=\"item-name\">{{ dataItem.Name }}</span>\n @if (dataItem.Description) {\n <span class=\"item-description\">{{ dataItem.Description }}</span>\n }\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (!ServerID) {\n <span class=\"field-hint\">Select a server first</span>\n }\n @if (NoConnectionsWarning) {\n <span class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ NoConnectionsWarning }}\n </span>\n }\n @if (FilteredConnections.length === 1 && ConnectionID) {\n <span class=\"field-hint auto-selected\">\n <i class=\"fa-solid fa-check\"></i>\n Auto-selected (only connection available)\n </span>\n }\n </div>\n\n <!-- Tool Selection -->\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n <span class=\"required\">*</span>\n </label>\n <kendo-dropdownlist\n [data]=\"DisplayTools\"\n [textField]=\"'ToolTitle'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"ToolID\"\n (valueChange)=\"onToolChange()\"\n [disabled]=\"!ServerID\"\n [filterable]=\"true\"\n (filterChange)=\"onToolFilterChange($event)\"\n placeholder=\"Select a tool...\">\n <ng-template kendoDropDownListValueTemplate let-dataItem>\n {{ dataItem?.ToolTitle || dataItem?.ToolName || 'Select a tool...' }}\n </ng-template>\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"dropdown-item tool-item\">\n <span class=\"item-name\">{{ dataItem.ToolTitle || dataItem.ToolName }}</span>\n @if (dataItem.ToolDescription) {\n <span class=\"item-description\">{{ dataItem.ToolDescription }}</span>\n }\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (!ServerID) {\n <span class=\"field-hint\">Select a server first</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Step 2: Configure Parameters -->\n <div class=\"step-content\" *ngIf=\"CurrentStep === 'configure'\">\n <div class=\"tool-header\">\n <div class=\"tool-info\">\n <h3 class=\"tool-name\">\n <i class=\"fa-solid fa-wrench\"></i>\n {{ SelectedTool?.ToolTitle || SelectedTool?.ToolName }}\n </h3>\n @if (SelectedTool?.ToolDescription) {\n <p class=\"tool-description\">{{ SelectedTool?.ToolDescription }}</p>\n }\n </div>\n <div class=\"tool-context\">\n <span class=\"context-item\">\n <i class=\"fa-solid fa-server\"></i>\n {{ SelectedServerName }}\n </span>\n <span class=\"context-item\">\n <i class=\"fa-solid fa-link\"></i>\n {{ SelectedConnectionName }}\n </span>\n </div>\n </div>\n\n @if (ParameterConfigs.length === 0) {\n <div class=\"no-params\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>This tool requires no parameters.</p>\n </div>\n } @else {\n <div class=\"parameters-form\">\n <h4 class=\"params-title\">Parameters</h4>\n @for (config of ParameterConfigs; track config.name) {\n <div class=\"param-group\" [class.required]=\"config.required\">\n <label class=\"param-label\">\n {{ config.name }}\n @if (config.required) {\n <span class=\"required\">*</span>\n }\n </label>\n @if (config.description) {\n <p class=\"param-description\">{{ config.description }}</p>\n }\n\n <!-- Enum/Select -->\n @if (config.enumValues.length > 0) {\n <kendo-dropdownlist\n [data]=\"config.enumValues\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"ParameterValues[config.name]\"\n (valueChange)=\"onParameterChange(config.name, $event)\">\n </kendo-dropdownlist>\n }\n <!-- Boolean -->\n @else if (config.type === 'boolean') {\n <div class=\"checkbox-wrapper\">\n <input type=\"checkbox\"\n [id]=\"'param-' + config.name\"\n [checked]=\"ParameterValues[config.name]\"\n (change)=\"onParameterChange(config.name, $any($event.target).checked)\">\n <label [for]=\"'param-' + config.name\">Enabled</label>\n </div>\n }\n <!-- Number/Integer -->\n @else if (config.type === 'number' || config.type === 'integer') {\n <kendo-numerictextbox\n [format]=\"config.type === 'integer' ? 'n0' : 'n'\"\n [step]=\"config.type === 'integer' ? 1 : 0.1\"\n [(ngModel)]=\"ParameterValues[config.name]\"\n (valueChange)=\"onParameterChange(config.name, $event)\">\n </kendo-numerictextbox>\n }\n <!-- Array/Object (Textarea with JSON) -->\n @else if (config.type === 'array' || config.type === 'object') {\n <textarea class=\"json-input\"\n rows=\"4\"\n [value]=\"getTextareaValue(config.name)\"\n (input)=\"onTextareaChange(config.name, $any($event.target).value, config)\"\n placeholder=\"Enter JSON {{ config.type }}...\"></textarea>\n <span class=\"field-hint\">Enter valid JSON</span>\n }\n <!-- String (default) -->\n @else {\n @if (isTextarea(config)) {\n <textarea class=\"text-input\"\n rows=\"3\"\n [(ngModel)]=\"ParameterValues[config.name]\"\n (input)=\"onParameterChange(config.name, $any($event.target).value)\"\n [placeholder]=\"config.description || 'Enter value...'\"></textarea>\n } @else {\n <kendo-textbox\n [(ngModel)]=\"ParameterValues[config.name]\"\n (valueChange)=\"onParameterChange(config.name, $event)\"\n [placeholder]=\"config.description || 'Enter value...'\">\n </kendo-textbox>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Step 3: Results -->\n <div class=\"step-content results-step\" *ngIf=\"CurrentStep === 'results'\">\n <div class=\"results-container\">\n <!-- Success/Error Header -->\n <div class=\"result-header\" [class.success]=\"ExecutionResult?.Success\" [class.error]=\"!ExecutionResult?.Success\">\n @if (ExecutionResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"result-status\">Execution Successful</span>\n } @else {\n <i class=\"fa-solid fa-times-circle\"></i>\n <span class=\"result-status\">Execution Failed</span>\n }\n @if (ExecutionResult?.DurationMs) {\n <span class=\"duration\">{{ ExecutionResult?.DurationMs }}ms</span>\n }\n </div>\n\n <!-- Executed Tool Info (moved to top) -->\n <div class=\"execution-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Tool:</span>\n <span class=\"info-value\">{{ SelectedToolName }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Server:</span>\n <span class=\"info-value\">{{ SelectedServerName }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Connection:</span>\n <span class=\"info-value\">{{ SelectedConnectionName }}</span>\n </div>\n </div>\n\n <!-- Error Message -->\n @if (ExecutionResult?.ErrorMessage) {\n <div class=\"error-panel\">\n <h4><i class=\"fa-solid fa-exclamation-triangle\"></i> Error</h4>\n <pre class=\"error-message\">{{ ExecutionResult?.ErrorMessage }}</pre>\n </div>\n }\n\n <!-- Result Data (fills remaining space) -->\n @if (ExecutionResult?.Result) {\n <div class=\"result-panel fill-space\">\n <div class=\"result-panel-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Result</h4>\n <button kendoButton fillMode=\"flat\" (click)=\"copyResult()\" title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @switch (CurrentStep) {\n @case ('select') {\n <button kendoButton themeColor=\"primary\" (click)=\"proceedToConfig()\" [disabled]=\"!CanProceedToConfig\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n Next\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"closeDialog()\">Cancel</button>\n }\n @case ('configure') {\n <button kendoButton themeColor=\"primary\" (click)=\"executeTool()\" [disabled]=\"!IsValid || IsExecuting\">\n @if (IsExecuting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Executing...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Execute Tool\n }\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back\n </button>\n }\n @case ('results') {\n <button kendoButton themeColor=\"primary\" (click)=\"runAgain()\">\n <i class=\"fa-solid fa-redo\"></i>\n Run Again\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"goBack()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Edit Parameters\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"closeDialog()\">Close</button>\n }\n }\n </div>\n</div>\n", styles: ["/* MCP Test Tool Slide-Out Panel Styles */\n\n/* ========================================\n Backdrop\n ======================================== */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========================================\n Slide-Out Panel\n ======================================== */\n.slide-out-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: white;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing {\n user-select: none;\n transition: none;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover,\n.resize-handle.active {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: #ccc;\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.resize-handle.active .resize-grip {\n opacity: 1;\n background: var(--mj-primary-color, #2196f3);\n}\n\n/* ========================================\n Panel Header\n ======================================== */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.panel-title i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.close-btn i {\n font-size: 18px;\n}\n\n/* ========================================\n Step Indicator\n ======================================== */\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px 20px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.step {\n display: flex;\n align-items: center;\n gap: 8px;\n opacity: 0.5;\n transition: opacity 0.2s ease;\n}\n\n.step.active,\n.step.completed {\n opacity: 1;\n}\n\n.step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: #e0e0e0;\n color: #666;\n font-weight: 600;\n font-size: 13px;\n transition: all 0.2s ease;\n}\n\n.step.active .step-number {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.step.completed .step-number {\n background: #4caf50;\n color: white;\n}\n\n.step-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.step-connector {\n width: 40px;\n height: 2px;\n background: #e0e0e0;\n margin: 0 10px;\n transition: background 0.2s ease;\n}\n\n.step-connector.completed {\n background: #4caf50;\n}\n\n/* ========================================\n Panel Content\n ======================================== */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.step-content {\n min-height: 100%;\n}\n\n.step-content.results-step {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ========================================\n Selection Form (Step 1)\n ======================================== */\n.selection-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.form-label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.form-label i {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.required {\n color: #f44336;\n font-weight: 600;\n}\n\n.field-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n font-style: italic;\n margin-top: 4px;\n}\n\n.field-hint.auto-selected {\n color: #4caf50;\n font-style: normal;\n}\n\n.field-hint.auto-selected i {\n font-size: 11px;\n}\n\n.field-error {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #f44336;\n margin-top: 4px;\n padding: 8px 10px;\n background: rgba(244, 67, 54, 0.08);\n border-radius: 4px;\n border: 1px solid rgba(244, 67, 54, 0.2);\n}\n\n.field-error i {\n font-size: 13px;\n}\n\n/* Dropdown Item Styling */\n.dropdown-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.dropdown-item.tool-item {\n max-width: 100%;\n}\n\n.item-name {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.item-description {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n.item-status {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.item-status.status-active {\n color: #4caf50;\n}\n\n.item-status.status-inactive {\n color: #9e9e9e;\n}\n\n/* ========================================\n Tool Header (Step 2)\n ======================================== */\n.tool-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px;\n background: linear-gradient(135deg, rgba(33, 150, 243, 0.08), rgba(33, 150, 243, 0.02));\n border-radius: 8px;\n margin-bottom: 20px;\n border: 1px solid rgba(33, 150, 243, 0.15);\n}\n\n.tool-info {\n flex: 1;\n min-width: 0;\n}\n\n.tool-name {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-description {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.5;\n}\n\n.tool-context {\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: flex-end;\n flex-shrink: 0;\n}\n\n.context-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.context-item i {\n font-size: 11px;\n color: #999;\n}\n\n/* ========================================\n Parameters Form (Step 2)\n ======================================== */\n.no-params {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.no-params i {\n font-size: 48px;\n color: #4caf50;\n margin-bottom: 16px;\n}\n\n.no-params p {\n margin: 0;\n font-size: 15px;\n}\n\n.params-title {\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary-color, #666);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.parameters-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.param-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px;\n background: #fafafa;\n border-radius: 6px;\n border: 1px solid #e8e8e8;\n}\n\n.param-group.required {\n border-left: 3px solid var(--mj-primary-color, #2196f3);\n}\n\n.param-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.param-description {\n margin: 0;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n}\n\n.checkbox-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.checkbox-wrapper input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.checkbox-wrapper label {\n font-size: 14px;\n color: var(--mj-text-color, #333);\n cursor: pointer;\n}\n\n.json-input,\n.text-input {\n width: 100%;\n padding: 10px 12px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 13px;\n line-height: 1.5;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n resize: vertical;\n box-sizing: border-box;\n}\n\n.json-input:focus,\n.text-input:focus {\n outline: none;\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1);\n}\n\n/* ========================================\n Results (Step 3)\n ======================================== */\n.results-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-height: 0;\n}\n\n.result-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n font-weight: 600;\n}\n\n.result-header.success {\n background: rgba(76, 175, 80, 0.1);\n color: #388e3c;\n}\n\n.result-header.success i {\n font-size: 24px;\n color: #4caf50;\n}\n\n.result-header.error {\n background: rgba(244, 67, 54, 0.1);\n color: #c62828;\n}\n\n.result-header.error i {\n font-size: 24px;\n color: #f44336;\n}\n\n.result-status {\n flex: 1;\n font-size: 16px;\n}\n\n.duration {\n font-size: 13px;\n font-weight: normal;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 8px;\n border-radius: 4px;\n}\n\n.error-panel {\n background: #fff5f5;\n border: 1px solid rgba(244, 67, 54, 0.2);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-panel h4 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 14px;\n color: #c62828;\n}\n\n.error-message {\n margin: 0;\n padding: 12px;\n background: white;\n border-radius: 4px;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: #c62828;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.result-panel {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.result-panel.fill-space {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 200px;\n}\n\n.result-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.result-panel-header h4 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.code-editor-container {\n height: 300px;\n min-height: 200px;\n max-height: 400px;\n overflow: hidden;\n}\n\n.result-panel.fill-space .code-editor-container {\n flex: 1;\n height: auto;\n max-height: none;\n}\n\n.code-editor-container mj-code-editor {\n width: 100%;\n height: 100%;\n}\n\n.execution-info {\n padding: 16px;\n background: #fafafa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n padding: 6px 0;\n font-size: 13px;\n}\n\n.info-row:not(:last-child) {\n border-bottom: 1px solid #e8e8e8;\n}\n\n.info-label {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n/* ========================================\n Panel Actions\n ======================================== */\n.panel-actions {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-actions button {\n min-width: 100px;\n}\n\n.panel-actions button i {\n margin-right: 6px;\n}\n\n/* ========================================\n Responsive / Mobile\n ======================================== */\n@media (max-width: 768px) {\n .slide-out-panel {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle {\n display: none;\n }\n\n .step-indicator {\n padding: 12px 16px;\n }\n\n .step-connector {\n width: 20px;\n margin: 0 6px;\n }\n\n .step-label {\n display: none;\n }\n\n .panel-content {\n padding: 16px;\n }\n\n .tool-header {\n flex-direction: column;\n gap: 12px;\n }\n\n .tool-context {\n align-items: flex-start;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n\n .panel-actions button {\n flex: 1;\n min-width: 80px;\n }\n}\n\n@media (max-width: 480px) {\n .panel-header {\n padding: 12px 16px;\n }\n\n .panel-title {\n font-size: 16px;\n }\n\n .step-number {\n width: 24px;\n height: 24px;\n font-size: 12px;\n }\n\n .tool-name {\n font-size: 16px;\n }\n}\n"] }]
1267
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { Visible: [{
1268
+ type: Input
1269
+ }], Servers: [{
1270
+ type: Input
1271
+ }], Connections: [{
1272
+ type: Input
1273
+ }], Tools: [{
1274
+ type: Input
1275
+ }], SelectedServerID: [{
1276
+ type: Input
1277
+ }], SelectedConnectionID: [{
1278
+ type: Input
1279
+ }], SelectedToolID: [{
1280
+ type: Input
1281
+ }], Close: [{
1282
+ type: Output
1283
+ }], onMouseMove: [{
1284
+ type: HostListener,
1285
+ args: ['document:mousemove', ['$event']]
1286
+ }], onMouseUp: [{
1287
+ type: HostListener,
1288
+ args: ['document:mouseup']
1289
+ }], onWindowResize: [{
1290
+ type: HostListener,
1291
+ args: ['window:resize']
1292
+ }] }); })();
1293
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPTestToolDialogComponent, { className: "MCPTestToolDialogComponent", filePath: "src/MCP/components/mcp-test-tool-dialog.component.ts", lineNumber: 138 }); })();
1294
+ /**
1295
+ * Tree-shaking prevention function
1296
+ */
1297
+ export function LoadMCPTestToolDialog() {
1298
+ // Ensures the component is not tree-shaken
1299
+ }
1300
+ //# sourceMappingURL=mcp-test-tool-dialog.component.js.map