@hotmeshio/long-tail 0.3.1 → 0.3.3

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 (259) hide show
  1. package/build/api/agents.d.ts +1 -1
  2. package/build/api/agents.js +1 -1
  3. package/build/api/controlplane.d.ts +33 -0
  4. package/build/api/controlplane.js +46 -0
  5. package/build/bin/ltc.js +16 -0
  6. package/build/lib/cli/commands/streams.d.ts +20 -0
  7. package/build/lib/cli/commands/streams.js +134 -0
  8. package/build/lib/db/schemas/001_schema.sql +3 -3
  9. package/build/lib/db/schemas/003_agents.sql +1 -2
  10. package/build/lib/db/schemas/004_agent_subscriptions.sql +1 -1
  11. package/build/lib/db/schemas/006_agent_sub_unique.sql +1 -0
  12. package/build/routes/agents.js +3 -3
  13. package/build/routes/controlplane.js +28 -0
  14. package/build/sdk/index.d.ts +1 -0
  15. package/build/sdk/index.js +1 -0
  16. package/build/services/agent/index.d.ts +2 -3
  17. package/build/services/agent/index.js +5 -12
  18. package/build/services/agent/sql.d.ts +3 -4
  19. package/build/services/agent/sql.js +16 -20
  20. package/build/services/agent/subscription-sql.d.ts +1 -1
  21. package/build/services/agent/subscription-sql.js +1 -1
  22. package/build/services/agent/trigger-registry.js +1 -1
  23. package/build/services/controlplane/index.d.ts +9 -1
  24. package/build/services/controlplane/index.js +39 -0
  25. package/build/services/controlplane/stream-messages-sql.d.ts +21 -0
  26. package/build/services/controlplane/stream-messages-sql.js +109 -0
  27. package/build/services/controlplane/types.d.ts +44 -0
  28. package/build/services/cron/index.js +5 -5
  29. package/build/services/export/post-process.js +14 -6
  30. package/build/services/mcp-runs/execution-builder.js +9 -4
  31. package/build/services/topics/index.js +1 -4
  32. package/build/services/topics/sql.d.ts +2 -2
  33. package/build/services/topics/sql.js +9 -2
  34. package/build/services/topics/system-topics.js +2 -3
  35. package/build/start/workers.js +11 -14
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/build/types/agent.d.ts +1 -1
  38. package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js → AdminDashboard-BBWJAsjl.js} +2 -2
  39. package/dashboard/dist/assets/{AdminDashboard-CbeSejVX.js.map → AdminDashboard-BBWJAsjl.js.map} +1 -1
  40. package/dashboard/dist/assets/{AgentConfigPage-CFJNOrlg.js → AgentConfigPage-Br2O6NDa.js} +3 -3
  41. package/dashboard/dist/assets/AgentConfigPage-Br2O6NDa.js.map +1 -0
  42. package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js +4 -0
  43. package/dashboard/dist/assets/AgentDetailPage-DjgOR62z.js.map +1 -0
  44. package/dashboard/dist/assets/AgentsPage-CASVGEvY.js +2 -0
  45. package/dashboard/dist/assets/AgentsPage-CASVGEvY.js.map +1 -0
  46. package/dashboard/dist/assets/AvailableEscalationsPage-Dl9ZmjKA.js +2 -0
  47. package/dashboard/dist/assets/{AvailableEscalationsPage-DdrzePy4.js.map → AvailableEscalationsPage-Dl9ZmjKA.js.map} +1 -1
  48. package/dashboard/dist/assets/{BotPicker-kKBifD1w.js → BotPicker-wEoqL3HR.js} +2 -2
  49. package/dashboard/dist/assets/{BotPicker-kKBifD1w.js.map → BotPicker-wEoqL3HR.js.map} +1 -1
  50. package/dashboard/dist/assets/CapabilitiesPage-DYkx5aa4.js +2 -0
  51. package/dashboard/dist/assets/{CapabilitiesPage-Ch5qY0I7.js.map → CapabilitiesPage-DYkx5aa4.js.map} +1 -1
  52. package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js → CollapsibleSection-DN1aF5HO.js} +2 -2
  53. package/dashboard/dist/assets/{CollapsibleSection-kYTBL7dT.js.map → CollapsibleSection-DN1aF5HO.js.map} +1 -1
  54. package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js → ConfirmDeleteModal-v8ufrnX5.js} +2 -2
  55. package/dashboard/dist/assets/{ConfirmDeleteModal-CcaAapMl.js.map → ConfirmDeleteModal-v8ufrnX5.js.map} +1 -1
  56. package/dashboard/dist/assets/{CopyableId-B4CL12pv.js → CopyableId-D94R2n6C.js} +2 -2
  57. package/dashboard/dist/assets/{CopyableId-B4CL12pv.js.map → CopyableId-D94R2n6C.js.map} +1 -1
  58. package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js → CredentialsPage-CSSjAEx6.js} +2 -2
  59. package/dashboard/dist/assets/{CredentialsPage-D1VAlwid.js.map → CredentialsPage-CSSjAEx6.js.map} +1 -1
  60. package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js → CronLabel-fYpkTnEd.js} +2 -2
  61. package/dashboard/dist/assets/{CronLabel-DRmO5rH0.js.map → CronLabel-fYpkTnEd.js.map} +1 -1
  62. package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js → CustomDurationPicker-CSarfbO1.js} +2 -2
  63. package/dashboard/dist/assets/{CustomDurationPicker-C06QDDir.js.map → CustomDurationPicker-CSarfbO1.js.map} +1 -1
  64. package/dashboard/dist/assets/{DataTable-J5R6mepB.js → DataTable-VKt4pvC-.js} +2 -2
  65. package/dashboard/dist/assets/{DataTable-J5R6mepB.js.map → DataTable-VKt4pvC-.js.map} +1 -1
  66. package/dashboard/dist/assets/{DropZone-DwNj3GiG.js → DropZone-Bl4j-AID.js} +2 -2
  67. package/dashboard/dist/assets/{DropZone-DwNj3GiG.js.map → DropZone-Bl4j-AID.js.map} +1 -1
  68. package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js → ElapsedCell-Y4UmrII0.js} +2 -2
  69. package/dashboard/dist/assets/{ElapsedCell-ChyMzl9n.js.map → ElapsedCell-Y4UmrII0.js.map} +1 -1
  70. package/dashboard/dist/assets/{EmptyState-BXGvOADa.js → EmptyState-Di6_NfbP.js} +2 -2
  71. package/dashboard/dist/assets/{EmptyState-BXGvOADa.js.map → EmptyState-Di6_NfbP.js.map} +1 -1
  72. package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js → EscalationsOverview-D0Ry84FE.js} +2 -2
  73. package/dashboard/dist/assets/{EscalationsOverview-DM6zmE4g.js.map → EscalationsOverview-D0Ry84FE.js.map} +1 -1
  74. package/dashboard/dist/assets/{EventTable-CvJ98E8s.js → EventTable-BzPleN3Y.js} +2 -2
  75. package/dashboard/dist/assets/{EventTable-CvJ98E8s.js.map → EventTable-BzPleN3Y.js.map} +1 -1
  76. package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js → EventTopicPill-DCqcr7N7.js} +2 -2
  77. package/dashboard/dist/assets/{EventTopicPill-CB_rIGlL.js.map → EventTopicPill-DCqcr7N7.js.map} +1 -1
  78. package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js → FilterBar-BoRQss2J.js} +2 -2
  79. package/dashboard/dist/assets/{FilterBar-Bdssa-Xn.js.map → FilterBar-BoRQss2J.js.map} +1 -1
  80. package/dashboard/dist/assets/HomePage-CGH_dYSo.js +2 -0
  81. package/dashboard/dist/assets/HomePage-CGH_dYSo.js.map +1 -0
  82. package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js → ListToolbar-BMWttsi2.js} +2 -2
  83. package/dashboard/dist/assets/{ListToolbar-jy8NL6ll.js.map → ListToolbar-BMWttsi2.js.map} +1 -1
  84. package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js → McpOverview-DpC-BbBV.js} +2 -2
  85. package/dashboard/dist/assets/{McpOverview-xkaKuHbX.js.map → McpOverview-DpC-BbBV.js.map} +1 -1
  86. package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js → McpQueryDetailPage-CZSzX-cI.js} +2 -2
  87. package/dashboard/dist/assets/{McpQueryDetailPage-D5ICn6cR.js.map → McpQueryDetailPage-CZSzX-cI.js.map} +1 -1
  88. package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js → McpQueryPage-B4KsvBGo.js} +2 -2
  89. package/dashboard/dist/assets/{McpQueryPage-C46fzfm5.js.map → McpQueryPage-B4KsvBGo.js.map} +1 -1
  90. package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js → McpRunDetailPage-_owlNUzp.js} +2 -2
  91. package/dashboard/dist/assets/{McpRunDetailPage-Znsl4Yc-.js.map → McpRunDetailPage-_owlNUzp.js.map} +1 -1
  92. package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js +2 -0
  93. package/dashboard/dist/assets/McpRunsPage-C3A1fU3h.js.map +1 -0
  94. package/dashboard/dist/assets/{Modal-C6k6_5KB.js → Modal-IsEbA4rW.js} +2 -2
  95. package/dashboard/dist/assets/{Modal-C6k6_5KB.js.map → Modal-IsEbA4rW.js.map} +1 -1
  96. package/dashboard/dist/assets/OperatorDashboard-B8MOtt_p.js +2 -0
  97. package/dashboard/dist/assets/{OperatorDashboard-e5N3_dVl.js.map → OperatorDashboard-B8MOtt_p.js.map} +1 -1
  98. package/dashboard/dist/assets/{PageHeader-COcgWWf-.js → PageHeader-C4DNgZKA.js} +2 -2
  99. package/dashboard/dist/assets/{PageHeader-COcgWWf-.js.map → PageHeader-C4DNgZKA.js.map} +1 -1
  100. package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js → PageHeaderWithStats-Fy6tGBaa.js} +2 -2
  101. package/dashboard/dist/assets/{PageHeaderWithStats-C0PCY3aJ.js.map → PageHeaderWithStats-Fy6tGBaa.js.map} +1 -1
  102. package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js → PriorityBadge-kSpsF-Zm.js} +2 -2
  103. package/dashboard/dist/assets/{PriorityBadge-BQCsYMpM.js.map → PriorityBadge-kSpsF-Zm.js.map} +1 -1
  104. package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js → ProcessDetailPage-CZjjs4jE.js} +2 -2
  105. package/dashboard/dist/assets/{ProcessDetailPage-C03LOgI0.js.map → ProcessDetailPage-CZjjs4jE.js.map} +1 -1
  106. package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js → ProcessesListPage-Ds7y71o8.js} +2 -2
  107. package/dashboard/dist/assets/{ProcessesListPage-iyPsmlhm.js.map → ProcessesListPage-Ds7y71o8.js.map} +1 -1
  108. package/dashboard/dist/assets/{RolePill-CHwys1f9.js → RolePill-DmdF9L9Q.js} +2 -2
  109. package/dashboard/dist/assets/{RolePill-CHwys1f9.js.map → RolePill-DmdF9L9Q.js.map} +1 -1
  110. package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js → RolesPage-CCmK38yn.js} +2 -2
  111. package/dashboard/dist/assets/{RolesPage-Bmc3XaUk.js.map → RolesPage-CCmK38yn.js.map} +1 -1
  112. package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js → RowActions-uGuPBEWb.js} +2 -2
  113. package/dashboard/dist/assets/{RowActions-Bs4PF-Gd.js.map → RowActions-uGuPBEWb.js.map} +1 -1
  114. package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js → RunAsSelector-BsO-uSh9.js} +2 -2
  115. package/dashboard/dist/assets/{RunAsSelector-DXzAr2WW.js.map → RunAsSelector-BsO-uSh9.js.map} +1 -1
  116. package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js → ServerName-BHl8nLOV.js} +2 -2
  117. package/dashboard/dist/assets/{ServerName-BIdLC1Ay.js.map → ServerName-BHl8nLOV.js.map} +1 -1
  118. package/dashboard/dist/assets/{StatCard-OKzRSSx4.js → StatCard-DI4ZQ-Zi.js} +2 -2
  119. package/dashboard/dist/assets/{StatCard-OKzRSSx4.js.map → StatCard-DI4ZQ-Zi.js.map} +1 -1
  120. package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js → StatusBadge-TV20Ulgl.js} +2 -2
  121. package/dashboard/dist/assets/{StatusBadge-CQlF46RR.js.map → StatusBadge-TV20Ulgl.js.map} +1 -1
  122. package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js → StepIndicator-ziIED3Pz.js} +2 -2
  123. package/dashboard/dist/assets/{StepIndicator-CP7eycjI.js.map → StepIndicator-ziIED3Pz.js.map} +1 -1
  124. package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js → StickyPagination-CXBDS1ka.js} +2 -2
  125. package/dashboard/dist/assets/{StickyPagination-CGk8VAKt.js.map → StickyPagination-CXBDS1ka.js.map} +1 -1
  126. package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js → SwimlaneTimeline-Dc_a4-D5.js} +2 -2
  127. package/dashboard/dist/assets/{SwimlaneTimeline-MEUPc3yJ.js.map → SwimlaneTimeline-Dc_a4-D5.js.map} +1 -1
  128. package/dashboard/dist/assets/{TagInput-BGxXKiWD.js → TagInput-BYEjEPsa.js} +2 -2
  129. package/dashboard/dist/assets/{TagInput-BGxXKiWD.js.map → TagInput-BYEjEPsa.js.map} +1 -1
  130. package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js → TaskDetailPage-Cu0XLEA4.js} +2 -2
  131. package/dashboard/dist/assets/{TaskDetailPage-pN5BXzYA.js.map → TaskDetailPage-Cu0XLEA4.js.map} +1 -1
  132. package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js → TaskQueuePill-yBqQ-piu.js} +2 -2
  133. package/dashboard/dist/assets/{TaskQueuePill-bw8ieKsf.js.map → TaskQueuePill-yBqQ-piu.js.map} +1 -1
  134. package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js → TasksListPage-Dl0quVgM.js} +2 -2
  135. package/dashboard/dist/assets/{TasksListPage-D1INzcrA.js.map → TasksListPage-Dl0quVgM.js.map} +1 -1
  136. package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js → TimeAgo-BAs-HL55.js} +2 -2
  137. package/dashboard/dist/assets/{TimeAgo-CywLVIBA.js.map → TimeAgo-BAs-HL55.js.map} +1 -1
  138. package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js → TimestampCell-zFm6ze1U.js} +2 -2
  139. package/dashboard/dist/assets/{TimestampCell-B4Pc6f3A.js.map → TimestampCell-zFm6ze1U.js.map} +1 -1
  140. package/dashboard/dist/assets/ToolPill-DiM3hgAB.js +2 -0
  141. package/dashboard/dist/assets/{ToolPill-DdLN3JOT.js.map → ToolPill-DiM3hgAB.js.map} +1 -1
  142. package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js → ToolTestPanel-C3vWUW2p.js} +2 -2
  143. package/dashboard/dist/assets/{ToolTestPanel-DusbUka5.js.map → ToolTestPanel-C3vWUW2p.js.map} +1 -1
  144. package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js +9 -0
  145. package/dashboard/dist/assets/TopicDetailPage-wjwRE5eI.js.map +1 -0
  146. package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js → TopicsPage-D3AONwHP.js} +2 -2
  147. package/dashboard/dist/assets/{TopicsPage-DbtrnQON.js.map → TopicsPage-D3AONwHP.js.map} +1 -1
  148. package/dashboard/dist/assets/{UserName-CLbusknU.js → UserName-0vrAWvND.js} +2 -2
  149. package/dashboard/dist/assets/{UserName-CLbusknU.js.map → UserName-0vrAWvND.js.map} +1 -1
  150. package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js → WorkflowExecutionPage-CBbWToVN.js} +2 -2
  151. package/dashboard/dist/assets/{WorkflowExecutionPage-C61R-3Gg.js.map → WorkflowExecutionPage-CBbWToVN.js.map} +1 -1
  152. package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js → WorkflowPill-C7jE0e1g.js} +2 -2
  153. package/dashboard/dist/assets/{WorkflowPill-7vt2F6wR.js.map → WorkflowPill-C7jE0e1g.js.map} +1 -1
  154. package/dashboard/dist/assets/WorkflowsDashboard-1GVHYLlw.js +2 -0
  155. package/dashboard/dist/assets/{WorkflowsDashboard-BWiUNvyl.js.map → WorkflowsDashboard-1GVHYLlw.js.map} +1 -1
  156. package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js → WorkflowsOverview-2POOJzat.js} +2 -2
  157. package/dashboard/dist/assets/{WorkflowsOverview-DA2ZOs7D.js.map → WorkflowsOverview-2POOJzat.js.map} +1 -1
  158. package/dashboard/dist/assets/YamlWorkflowsPage-BcRKxz3P.js +2 -0
  159. package/dashboard/dist/assets/{YamlWorkflowsPage-CLebf2eL.js.map → YamlWorkflowsPage-BcRKxz3P.js.map} +1 -1
  160. package/dashboard/dist/assets/{agents-Dga6NU7U.js → agents-Bd6SNUID.js} +2 -2
  161. package/dashboard/dist/assets/agents-Bd6SNUID.js.map +1 -0
  162. package/dashboard/dist/assets/{bots-CtU4i4OQ.js → bots-DEsg-T8t.js} +2 -2
  163. package/dashboard/dist/assets/{bots-CtU4i4OQ.js.map → bots-DEsg-T8t.js.map} +1 -1
  164. package/dashboard/dist/assets/{controlplane-BVoALhbL.js → controlplane-B3m1kIWb.js} +2 -2
  165. package/dashboard/dist/assets/{controlplane-BVoALhbL.js.map → controlplane-B3m1kIWb.js.map} +1 -1
  166. package/dashboard/dist/assets/{escalation-_N5GfuIi.js → escalation-CJQPC0gm.js} +2 -2
  167. package/dashboard/dist/assets/{escalation-_N5GfuIi.js.map → escalation-CJQPC0gm.js.map} +1 -1
  168. package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js → escalation-columns-DEE62U3_.js} +2 -2
  169. package/dashboard/dist/assets/{escalation-columns-CoTmTpHp.js.map → escalation-columns-DEE62U3_.js.map} +1 -1
  170. package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js → helpers-BveI_035.js} +2 -2
  171. package/dashboard/dist/assets/{helpers-Dz2U3Ctb.js.map → helpers-BveI_035.js.map} +1 -1
  172. package/dashboard/dist/assets/index-B7zv_NKJ.js +2 -0
  173. package/dashboard/dist/assets/index-B7zv_NKJ.js.map +1 -0
  174. package/dashboard/dist/assets/index-BVVdr9s0.js +2 -0
  175. package/dashboard/dist/assets/{index-6Kd78p_v.js.map → index-BVVdr9s0.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-D_H_Prht.js → index-BXIwxi_u.js} +2 -2
  177. package/dashboard/dist/assets/{index-D_H_Prht.js.map → index-BXIwxi_u.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-B9ealjkt.js → index-CEPo8tn_.js} +2 -2
  179. package/dashboard/dist/assets/{index-B9ealjkt.js.map → index-CEPo8tn_.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-BYwPVJv0.js → index-CTKfvoGj.js} +2 -2
  181. package/dashboard/dist/assets/{index-BYwPVJv0.js.map → index-CTKfvoGj.js.map} +1 -1
  182. package/dashboard/dist/assets/{index-Dpjguclc.js → index-CZVprWC6.js} +2 -2
  183. package/dashboard/dist/assets/{index-Dpjguclc.js.map → index-CZVprWC6.js.map} +1 -1
  184. package/dashboard/dist/assets/{index-CtbG3UN-.js → index-ChNwlMdo.js} +2 -2
  185. package/dashboard/dist/assets/{index-CtbG3UN-.js.map → index-ChNwlMdo.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-QicYdUsl.js → index-Cpq83bZq.js} +2 -2
  187. package/dashboard/dist/assets/{index-QicYdUsl.js.map → index-Cpq83bZq.js.map} +1 -1
  188. package/dashboard/dist/assets/{index-CS61sh5q.js → index-Csts1D-x.js} +2 -2
  189. package/dashboard/dist/assets/{index-CS61sh5q.js.map → index-Csts1D-x.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-dM-OgCY3.js → index-D4v-EUTe.js} +2 -2
  191. package/dashboard/dist/assets/{index-dM-OgCY3.js.map → index-D4v-EUTe.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-DWUunWxh.js → index-DI36hw6W.js} +2 -2
  193. package/dashboard/dist/assets/{index-DWUunWxh.js.map → index-DI36hw6W.js.map} +1 -1
  194. package/dashboard/dist/assets/{index-CCOSf1PY.js → index-MnRuwfHN.js} +59 -59
  195. package/dashboard/dist/assets/index-MnRuwfHN.js.map +1 -0
  196. package/dashboard/dist/assets/index-dp_Q2Hha.css +1 -0
  197. package/dashboard/dist/assets/{index-BWHDW_CF.js → index-wQaJXZYX.js} +2 -2
  198. package/dashboard/dist/assets/{index-BWHDW_CF.js.map → index-wQaJXZYX.js.map} +1 -1
  199. package/dashboard/dist/assets/{knowledge-DJlebU82.js → knowledge-krdvn5bg.js} +2 -2
  200. package/dashboard/dist/assets/{knowledge-DJlebU82.js.map → knowledge-krdvn5bg.js.map} +1 -1
  201. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js → mcp-BTZ2ex4x.js} +2 -2
  202. package/dashboard/dist/assets/{mcp-CsLJ5SRm.js.map → mcp-BTZ2ex4x.js.map} +1 -1
  203. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js → mcp-query-BzqJu709.js} +2 -2
  204. package/dashboard/dist/assets/{mcp-query-WNK1ItRV.js.map → mcp-query-BzqJu709.js.map} +1 -1
  205. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js → mcp-runs-BBUaY28a.js} +2 -2
  206. package/dashboard/dist/assets/{mcp-runs-DtTTsuPH.js.map → mcp-runs-BBUaY28a.js.map} +1 -1
  207. package/dashboard/dist/assets/{namespaces-iRejH3_A.js → namespaces-DJVfgGst.js} +2 -2
  208. package/dashboard/dist/assets/{namespaces-iRejH3_A.js.map → namespaces-DJVfgGst.js.map} +1 -1
  209. package/dashboard/dist/assets/{roles-3Jm5KtKc.js → roles-DogkRzK2.js} +2 -2
  210. package/dashboard/dist/assets/{roles-3Jm5KtKc.js.map → roles-DogkRzK2.js.map} +1 -1
  211. package/dashboard/dist/assets/{settings-DmN2I-c6.js → settings-D2sLRpie.js} +2 -2
  212. package/dashboard/dist/assets/{settings-DmN2I-c6.js.map → settings-D2sLRpie.js.map} +1 -1
  213. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js → tasks-CIuWkHLG.js} +2 -2
  214. package/dashboard/dist/assets/{tasks-Cc-QoITQ.js.map → tasks-CIuWkHLG.js.map} +1 -1
  215. package/dashboard/dist/assets/{topics-p8anbgi0.js → topics-DxMDwZFs.js} +2 -2
  216. package/dashboard/dist/assets/topics-DxMDwZFs.js.map +1 -0
  217. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js → useEventHooks-xXspN8_9.js} +2 -2
  218. package/dashboard/dist/assets/{useEventHooks-VaJ52jMm.js.map → useEventHooks-xXspN8_9.js.map} +1 -1
  219. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js → useYamlActivityEvents-2hdnnML7.js} +2 -2
  220. package/dashboard/dist/assets/{useYamlActivityEvents-BU4Uhksl.js.map → useYamlActivityEvents-2hdnnML7.js.map} +1 -1
  221. package/dashboard/dist/assets/{users-oXOlnold.js → users-DWQ-ojf9.js} +2 -2
  222. package/dashboard/dist/assets/{users-oXOlnold.js.map → users-DWQ-ojf9.js.map} +1 -1
  223. package/dashboard/dist/assets/{vendor-icons-CBOM6Es0.js → vendor-icons-YdqUbzg6.js} +110 -100
  224. package/dashboard/dist/assets/vendor-icons-YdqUbzg6.js.map +1 -0
  225. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js → workflows-BvGU8_fj.js} +2 -2
  226. package/dashboard/dist/assets/{workflows-Yq7cK-vR.js.map → workflows-BvGU8_fj.js.map} +1 -1
  227. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js → yaml-workflows-DNgb7krQ.js} +2 -2
  228. package/dashboard/dist/assets/{yaml-workflows-Ch53yD43.js.map → yaml-workflows-DNgb7krQ.js.map} +1 -1
  229. package/dashboard/dist/index.html +3 -3
  230. package/docs/agents.md +1 -1
  231. package/docs/api/http/agents.md +5 -7
  232. package/docs/api/http/controlplane.md +193 -0
  233. package/docs/api/sdk/agents.md +5 -5
  234. package/docs/api/sdk/controlplane.md +36 -0
  235. package/docs/dashboard.md +13 -0
  236. package/package.json +2 -2
  237. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +0 -1
  238. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +0 -4
  239. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +0 -1
  240. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +0 -2
  241. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js.map +0 -1
  242. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +0 -2
  243. package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +0 -2
  244. package/dashboard/dist/assets/HomePage-BuZkdXZt.js +0 -2
  245. package/dashboard/dist/assets/HomePage-BuZkdXZt.js.map +0 -1
  246. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +0 -2
  247. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js.map +0 -1
  248. package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +0 -2
  249. package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +0 -2
  250. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +0 -9
  251. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +0 -1
  252. package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +0 -2
  253. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +0 -2
  254. package/dashboard/dist/assets/agents-Dga6NU7U.js.map +0 -1
  255. package/dashboard/dist/assets/index-6Kd78p_v.js +0 -2
  256. package/dashboard/dist/assets/index-BIUHY2Jz.css +0 -1
  257. package/dashboard/dist/assets/index-CCOSf1PY.js.map +0 -1
  258. package/dashboard/dist/assets/topics-p8anbgi0.js.map +0 -1
  259. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-CCOSf1PY.js";import{a as N}from"./vendor-query-DLp59M9_.js";import{u as y,a as R,b as T,c as k}from"./mcp-CsLJ5SRm.js";import{E as L}from"./EmptyState-BXGvOADa.js";import{C as z}from"./ConfirmDeleteModal-CcaAapMl.js";import{P as V}from"./PageHeader-COcgWWf-.js";import{F,a as I,b as P}from"./FilterBar-Bdssa-Xn.js";import{S as _}from"./StickyPagination-CGk8VAKt.js";import{u as $}from"./useFilterParams-CGRYFw_A.js";import{u as q}from"./useExpandedRows-Cg9iq6Vy.js";import{T as A}from"./ToolTestPanel-DusbUka5.js";import{R as B,a as f}from"./RowActions-Bs4PF-Gd.js";import{S as H}from"./StatusBadge-CQlF46RR.js";import{T as G}from"./ToolPill-DdLN3JOT.js";import{S as O}from"./ServerName-BIdLC1Ay.js";import{l as U,ac as W,ad as J,D as K,m as Q,P as X}from"./vendor-icons-CBOM6Es0.js";import{c as Y}from"./vendor-react-Co3Y8ikm.js";import"./Modal-C6k6_5KB.js";import"./RunAsSelector-DXzAr2WW.js";import"./BotPicker-kKBifD1w.js";import"./bots-CtU4i4OQ.js";function Z(a){var s,t;return!!((s=a.metadata)!=null&&s.builtin)||!!((t=a.transport_config)!=null&&t.builtin)}function ee(a,s){var o;if(!s)return!0;const t=s.toLowerCase();return a.name.toLowerCase().includes(t)||(o=a.description)!=null&&o.toLowerCase().includes(t)||(a.tags??[]).some(n=>n.toLowerCase().includes(t))?!0:(a.tool_manifest??[]).some(n=>{var u;return n.name.toLowerCase().includes(t)||((u=n.description)==null?void 0:u.toLowerCase().includes(t))})}function se(a,s){if(!s)return a;const t=s.toLowerCase();return a.filter(m=>{var o;return m.name.toLowerCase().includes(t)||((o=m.description)==null?void 0:o.toLowerCase().includes(t))})}function re({server:a,expanded:s,onToggle:t,onEdit:m,onDelete:o,onTryTool:n,connect:u,disconnect:g,visibleTools:b}){const i=a.tool_manifest??[],v=Z(a),d=a.tags??[];return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:i.length>0?t:void 0,className:`group/row border-b border-surface-border/50 transition-colors duration-100 ${i.length>0?"cursor-pointer row-hover":""}`,children:[e.jsxDEV("td",{className:"px-6 py-2.5",children:e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${s?"rotate-90":""} ${i.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsxDEV(U,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:52,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:51,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(O,{name:a.name,serverId:a.id,short:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:55,columnNumber:15},this),i.length>0&&e.jsxDEV("sup",{className:"text-[9px] font-normal text-accent/70",children:i.length},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:57,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:54,columnNumber:13},this),d.length>0&&e.jsxDEV("div",{className:"flex gap-1 ml-auto shrink-0",children:[d.slice(0,3).map(l=>e.jsxDEV("span",{className:"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded",children:l},l,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:63,columnNumber:19},this)),d.length>3&&e.jsxDEV("span",{className:"text-[9px] text-text-quaternary",title:d.slice(3).join(", "),children:"…"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:68,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:61,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:50,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:49,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsxDEV(H,{status:a.status},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:77,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:76,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV(B,{children:[!v&&(a.status==="connected"?e.jsxDEV(f,{icon:W,title:"Disconnect server",onClick:()=>g.mutate(a.id)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:85,columnNumber:17},this):e.jsxDEV(f,{icon:J,title:"Connect server",onClick:()=>u.mutate(a.id),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:91,columnNumber:17},this)),e.jsxDEV(f,{icon:K,title:"Edit server",onClick:m},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:99,columnNumber:13},this),!v&&e.jsxDEV(f,{icon:Q,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:105,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:81,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:42,columnNumber:7},this),s&&b.map(l=>e.jsxDEV("tr",{onClick:()=>n(l),className:"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15",children:[e.jsxDEV("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsxDEV(G,{name:l.name,size:"md"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:125,columnNumber:13},this),l.description&&e.jsxDEV("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:l.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:127,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:124,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:132,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV("div",{className:"flex items-center justify-end",children:e.jsxDEV("button",{onClick:p=>{p.stopPropagation(),n(l)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsxDEV(X,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:142,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:137,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:136,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:135,columnNumber:11},this)]},l.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:118,columnNumber:9},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:40,columnNumber:5},this)}function je(){const a=Y(),{filters:s,setFilter:t,pagination:m}=$({filters:{status:"",search:"",tag:""}}),{data:o,isLoading:n}=y({status:s.status||void 0,search:s.search||void 0,tags:s.tag||void 0}),u=R(),g=T(),b=k(),[i,v]=N.useState(null),{expandedIds:d,toggle:l}=q("lt:expanded:mcp-servers"),[p,S]=N.useState(null),h=(o==null?void 0:o.servers)??[],D=(o==null?void 0:o.total)??0,M=N.useMemo(()=>{const r=new Set;for(const c of h)for(const E of c.tags??[])r.add(E);return[...r].sort().map(c=>({value:c,label:c}))},[h]),x=N.useMemo(()=>s.search?h.filter(r=>ee(r,s.search)):h,[h,s.search]);N.useEffect(()=>{if(!s.search)return;const r=s.search.toLowerCase();for(const c of x)(c.tool_manifest??[]).some(w=>{var j;return w.name.toLowerCase().includes(r)||((j=w.description)==null?void 0:j.toLowerCase().includes(r))})&&!d.has(c.id)&&l(c.id)},[s.search,x]);const C=()=>{i&&b.mutate(i.id,{onSuccess:()=>v(null)})};return n?e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:87,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((r,c)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:91,columnNumber:15},this)},c,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:90,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:88,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:86,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools",docsHash:"#docs:dashboard.md:mcp-server-tools",actions:e.jsxDEV("button",{onClick:()=>a("/mcp/servers/new"),className:"btn-primary text-xs",children:"Register Server"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:105,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:101,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:114,columnNumber:7},this),e.jsxDEV(F,{children:[e.jsxDEV(I,{label:"Search",value:s.search,onChange:r=>t("search",r),placeholder:"Server or tool name..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:119,columnNumber:9},this),e.jsxDEV(P,{label:"Tag",value:s.tag,onChange:r=>t("tag",r),options:M},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV(P,{label:"Status",value:s.status,onChange:r=>t("status",r),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:131,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:118,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0 ",children:[e.jsxDEV("div",{className:`${p?"flex-1 min-w-0":"w-full"} transition-all`,children:[x.length===0?e.jsxDEV(L,{title:"No servers found"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:148,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:153,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:156,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:159,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:152,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:151,columnNumber:15},this),e.jsxDEV("tbody",{children:x.map(r=>e.jsxDEV(re,{server:r,expanded:d.has(r.id),onToggle:()=>l(r.id),onEdit:()=>a(`/mcp/servers/${r.id}`),onDelete:()=>v(r),onTryTool:c=>S({serverId:r.id,serverName:r.name,tool:c}),connect:u,disconnect:g,visibleTools:se(r.tool_manifest??[],s.search)},r.id,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:164,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:150,columnNumber:13},this),e.jsxDEV(_,{page:m.page,totalPages:m.totalPages(D),onPageChange:m.setPage,total:D,pageSize:m.pageSize,onPageSizeChange:m.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:190,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:146,columnNumber:9},this),p&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(A,{serverId:p.serverId,serverName:p.serverName,tool:p.tool,onClose:()=>S(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:202,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:144,columnNumber:7},this),e.jsxDEV(z,{open:!!i,onClose:()=>v(null),onConfirm:C,title:"Delete MCP Server",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:i==null?void 0:i.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:222,columnNumber:13},this),"? This will remove the server registration."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:220,columnNumber:11},this),isPending:b.isPending,error:b.error},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:214,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:100,columnNumber:5},this)}export{je as McpServersPage};
2
- //# sourceMappingURL=index-QicYdUsl.js.map
1
+ import{j as e}from"./index-MnRuwfHN.js";import{a as N}from"./vendor-query-DLp59M9_.js";import{u as y,a as R,b as T,c as k}from"./mcp-BTZ2ex4x.js";import{E as L}from"./EmptyState-Di6_NfbP.js";import{C as z}from"./ConfirmDeleteModal-v8ufrnX5.js";import{P as V}from"./PageHeader-C4DNgZKA.js";import{F,a as I,b as P}from"./FilterBar-BoRQss2J.js";import{S as _}from"./StickyPagination-CXBDS1ka.js";import{u as $}from"./useFilterParams-CGRYFw_A.js";import{u as q}from"./useExpandedRows-Cg9iq6Vy.js";import{T as A}from"./ToolTestPanel-C3vWUW2p.js";import{R as B,a as f}from"./RowActions-uGuPBEWb.js";import{S as H}from"./StatusBadge-TV20Ulgl.js";import{T as G}from"./ToolPill-DiM3hgAB.js";import{S as K}from"./ServerName-BHl8nLOV.js";import{n as O,ag as U,ah as W,K as J,o as Q,P as X}from"./vendor-icons-YdqUbzg6.js";import{c as Y}from"./vendor-react-Co3Y8ikm.js";import"./Modal-IsEbA4rW.js";import"./RunAsSelector-BsO-uSh9.js";import"./BotPicker-wEoqL3HR.js";import"./bots-DEsg-T8t.js";function Z(a){var s,t;return!!((s=a.metadata)!=null&&s.builtin)||!!((t=a.transport_config)!=null&&t.builtin)}function ee(a,s){var o;if(!s)return!0;const t=s.toLowerCase();return a.name.toLowerCase().includes(t)||(o=a.description)!=null&&o.toLowerCase().includes(t)||(a.tags??[]).some(n=>n.toLowerCase().includes(t))?!0:(a.tool_manifest??[]).some(n=>{var u;return n.name.toLowerCase().includes(t)||((u=n.description)==null?void 0:u.toLowerCase().includes(t))})}function se(a,s){if(!s)return a;const t=s.toLowerCase();return a.filter(m=>{var o;return m.name.toLowerCase().includes(t)||((o=m.description)==null?void 0:o.toLowerCase().includes(t))})}function re({server:a,expanded:s,onToggle:t,onEdit:m,onDelete:o,onTryTool:n,connect:u,disconnect:g,visibleTools:b}){const i=a.tool_manifest??[],v=Z(a),d=a.tags??[];return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:i.length>0?t:void 0,className:`group/row border-b border-surface-border/50 transition-colors duration-100 ${i.length>0?"cursor-pointer row-hover":""}`,children:[e.jsxDEV("td",{className:"px-6 py-2.5",children:e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${s?"rotate-90":""} ${i.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsxDEV(O,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:52,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:51,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(K,{name:a.name,serverId:a.id,short:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:55,columnNumber:15},this),i.length>0&&e.jsxDEV("sup",{className:"text-[9px] font-normal text-accent/70",children:i.length},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:57,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:54,columnNumber:13},this),d.length>0&&e.jsxDEV("div",{className:"flex gap-1 ml-auto shrink-0",children:[d.slice(0,3).map(l=>e.jsxDEV("span",{className:"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded",children:l},l,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:63,columnNumber:19},this)),d.length>3&&e.jsxDEV("span",{className:"text-[9px] text-text-quaternary",title:d.slice(3).join(", "),children:"…"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:68,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:61,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:50,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:49,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsxDEV(H,{status:a.status},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:77,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:76,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV(B,{children:[!v&&(a.status==="connected"?e.jsxDEV(f,{icon:U,title:"Disconnect server",onClick:()=>g.mutate(a.id)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:85,columnNumber:17},this):e.jsxDEV(f,{icon:W,title:"Connect server",onClick:()=>u.mutate(a.id),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:91,columnNumber:17},this)),e.jsxDEV(f,{icon:J,title:"Edit server",onClick:m},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:99,columnNumber:13},this),!v&&e.jsxDEV(f,{icon:Q,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:105,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:81,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:42,columnNumber:7},this),s&&b.map(l=>e.jsxDEV("tr",{onClick:()=>n(l),className:"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15",children:[e.jsxDEV("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsxDEV(G,{name:l.name,size:"md"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:125,columnNumber:13},this),l.description&&e.jsxDEV("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:l.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:127,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:124,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:132,columnNumber:11},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV("div",{className:"flex items-center justify-end",children:e.jsxDEV("button",{onClick:p=>{p.stopPropagation(),n(l)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsxDEV(X,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:142,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:137,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:136,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:135,columnNumber:11},this)]},l.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:118,columnNumber:9},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/ServerRow.tsx",lineNumber:40,columnNumber:5},this)}function je(){const a=Y(),{filters:s,setFilter:t,pagination:m}=$({filters:{status:"",search:"",tag:""}}),{data:o,isLoading:n}=y({status:s.status||void 0,search:s.search||void 0,tags:s.tag||void 0}),u=R(),g=T(),b=k(),[i,v]=N.useState(null),{expandedIds:d,toggle:l}=q("lt:expanded:mcp-servers"),[p,S]=N.useState(null),h=(o==null?void 0:o.servers)??[],D=(o==null?void 0:o.total)??0,M=N.useMemo(()=>{const r=new Set;for(const c of h)for(const E of c.tags??[])r.add(E);return[...r].sort().map(c=>({value:c,label:c}))},[h]),x=N.useMemo(()=>s.search?h.filter(r=>ee(r,s.search)):h,[h,s.search]);N.useEffect(()=>{if(!s.search)return;const r=s.search.toLowerCase();for(const c of x)(c.tool_manifest??[]).some(w=>{var j;return w.name.toLowerCase().includes(r)||((j=w.description)==null?void 0:j.toLowerCase().includes(r))})&&!d.has(c.id)&&l(c.id)},[s.search,x]);const C=()=>{i&&b.mutate(i.id,{onSuccess:()=>v(null)})};return n?e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:87,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((r,c)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:91,columnNumber:15},this)},c,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:90,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:88,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:86,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"MCP Server Tools",docsHash:"#docs:dashboard.md:mcp-server-tools",actions:e.jsxDEV("button",{onClick:()=>a("/mcp/servers/new"),className:"btn-primary text-xs",children:"Register Server"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:105,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:101,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:114,columnNumber:7},this),e.jsxDEV(F,{children:[e.jsxDEV(I,{label:"Search",value:s.search,onChange:r=>t("search",r),placeholder:"Server or tool name..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:119,columnNumber:9},this),e.jsxDEV(P,{label:"Tag",value:s.tag,onChange:r=>t("tag",r),options:M},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV(P,{label:"Status",value:s.status,onChange:r=>t("status",r),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:131,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:118,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0 ",children:[e.jsxDEV("div",{className:`${p?"flex-1 min-w-0":"w-full"} transition-all`,children:[x.length===0?e.jsxDEV(L,{title:"No servers found"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:148,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:153,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:156,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:159,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:152,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:151,columnNumber:15},this),e.jsxDEV("tbody",{children:x.map(r=>e.jsxDEV(re,{server:r,expanded:d.has(r.id),onToggle:()=>l(r.id),onEdit:()=>a(`/mcp/servers/${r.id}`),onDelete:()=>v(r),onTryTool:c=>S({serverId:r.id,serverName:r.name,tool:c}),connect:u,disconnect:g,visibleTools:se(r.tool_manifest??[],s.search)},r.id,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:164,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:162,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:150,columnNumber:13},this),e.jsxDEV(_,{page:m.page,totalPages:m.totalPages(D),onPageChange:m.setPage,total:D,pageSize:m.pageSize,onPageSizeChange:m.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:190,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:146,columnNumber:9},this),p&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(A,{serverId:p.serverId,serverName:p.serverName,tool:p.tool,onClose:()=>S(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:203,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:202,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:144,columnNumber:7},this),e.jsxDEV(z,{open:!!i,onClose:()=>v(null),onConfirm:C,title:"Delete MCP Server",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:i==null?void 0:i.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:222,columnNumber:13},this),"? This will remove the server registration."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:220,columnNumber:11},this),isPending:b.isPending,error:b.error},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:214,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/McpServersPage.tsx",lineNumber:100,columnNumber:5},this)}export{je as McpServersPage};
2
+ //# sourceMappingURL=index-Cpq83bZq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-QicYdUsl.js","sources":["../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { ToolPill } from '../../../components/common/display/ToolPill';\nimport { ServerName } from '../../../components/common/display/ServerName';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n const tags = server.tags ?? [];\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b border-surface-border/50 transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\n <td className=\"px-6 py-2.5\">\n <div className=\"flex items-center gap-3\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <span className=\"flex items-center gap-1.5\">\n <ServerName name={server.name} serverId={server.id} short={false} />\n {allTools.length > 0 && (\n <sup className=\"text-[9px] font-normal text-accent/70\">{allTools.length}</sup>\n )}\n </span>\n {tags.length > 0 && (\n <div className=\"flex gap-1 ml-auto shrink-0\">\n {tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded\">\n {tag}\n </span>\n ))}\n {tags.length > 3 && (\n <span className=\"text-[9px] text-text-quaternary\" title={tags.slice(3).join(', ')}>&hellip;</span>\n )}\n </div>\n )}\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-2.5 w-16\">\n <RowActionGroup>\n {!builtin && (\n server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n {!builtin && (\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n )}\n </RowActionGroup>\n </td>\n </tr>\n\n {/* Expanded tool rows — real table rows for column alignment */}\n {expanded && visibleTools.map((tool) => (\n <tr\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15\"\n >\n {/* Tool name + description */}\n <td className=\"pl-14 pr-6 py-2.5\">\n <ToolPill name={tool.name} size=\"md\" />\n {tool.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{tool.description}</p>\n )}\n </td>\n\n {/* Status — empty for tools */}\n <td className=\"px-4 py-2.5 w-28\" />\n\n {/* Actions — play on hover */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n </td>\n </tr>\n ))}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../../hooks/useExpandedRows';\nimport { ToolTestPanel } from '../../../components/common/test/ToolTestPanel';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:mcp-servers');\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n for (const s of filteredServers) {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n const hasToolMatch = tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n if (hasToolMatch && !expandedIds.has(s.id)) {\n toggleExpand(s.id);\n }\n }\n }, [filters.search, filteredServers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Server Tools\"\n docsHash=\"#docs:dashboard.md:mcp-server-tools\"\n actions={\n <button\n onClick={() => navigate('/mcp/servers/new')}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name...\"\n />\n <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n <div className={`flex gap-0 ${tryTool ? '' : ''}`}>\n {/* Server list */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-16\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => navigate(`/mcp/servers/${server.id}`)}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Test panel — slides in from right */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["isBuiltIn","row","_a","_b","matchesSearch","server","search","q","t","filterTools","tools","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","tags","jsxDEV","Fragment","ChevronRight","ServerName","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","tool","ToolPill","e","Play","McpServersPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","confirmDelete","setConfirmDelete","useState","expandedIds","toggleExpand","useExpandedRows","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","s","filteredServers","useEffect","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ToolTestPanel","ConfirmDeleteModal"],"mappings":"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"}
1
+ {"version":3,"file":"index-Cpq83bZq.js","sources":["../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { ToolPill } from '../../../components/common/display/ToolPill';\nimport { ServerName } from '../../../components/common/display/ServerName';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n const tags = server.tags ?? [];\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b border-surface-border/50 transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\n <td className=\"px-6 py-2.5\">\n <div className=\"flex items-center gap-3\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <span className=\"flex items-center gap-1.5\">\n <ServerName name={server.name} serverId={server.id} short={false} />\n {allTools.length > 0 && (\n <sup className=\"text-[9px] font-normal text-accent/70\">{allTools.length}</sup>\n )}\n </span>\n {tags.length > 0 && (\n <div className=\"flex gap-1 ml-auto shrink-0\">\n {tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"inline-block px-1.5 py-0 text-[9px] text-text-tertiary bg-surface-sunken rounded\">\n {tag}\n </span>\n ))}\n {tags.length > 3 && (\n <span className=\"text-[9px] text-text-quaternary\" title={tags.slice(3).join(', ')}>&hellip;</span>\n )}\n </div>\n )}\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-2.5 w-28 whitespace-nowrap\">\n <StatusBadge status={server.status} />\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-2.5 w-16\">\n <RowActionGroup>\n {!builtin && (\n server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n {!builtin && (\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n )}\n </RowActionGroup>\n </td>\n </tr>\n\n {/* Expanded tool rows — real table rows for column alignment */}\n {expanded && visibleTools.map((tool) => (\n <tr\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15\"\n >\n {/* Tool name + description */}\n <td className=\"pl-14 pr-6 py-2.5\">\n <ToolPill name={tool.name} size=\"md\" />\n {tool.description && (\n <p className=\"text-[11px] leading-snug text-text-quaternary mt-0.5\">{tool.description}</p>\n )}\n </td>\n\n {/* Status — empty for tools */}\n <td className=\"px-4 py-2.5 w-28\" />\n\n {/* Actions — play on hover */}\n <td className=\"px-4 py-2.5 w-16\">\n <div className=\"flex items-center justify-end\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n </td>\n </tr>\n ))}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useExpandedRows } from '../../../hooks/useExpandedRows';\nimport { ToolTestPanel } from '../../../components/common/test/ToolTestPanel';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const { expandedIds, toggle: toggleExpand } = useExpandedRows('lt:expanded:mcp-servers');\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n for (const s of filteredServers) {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n const hasToolMatch = tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n if (hasToolMatch && !expandedIds.has(s.id)) {\n toggleExpand(s.id);\n }\n }\n }, [filters.search, filteredServers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Server Tools\"\n docsHash=\"#docs:dashboard.md:mcp-server-tools\"\n actions={\n <button\n onClick={() => navigate('/mcp/servers/new')}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the MCP Tool Designer.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name...\"\n />\n <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n <div className={`flex gap-0 ${tryTool ? '' : ''}`}>\n {/* Server list */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-16\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => navigate(`/mcp/servers/${server.id}`)}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Test panel — slides in from right */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["isBuiltIn","row","_a","_b","matchesSearch","server","search","q","t","filterTools","tools","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","tags","jsxDEV","Fragment","ChevronRight","ServerName","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","tool","ToolPill","e","Play","McpServersPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","data","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","confirmDelete","setConfirmDelete","useState","expandedIds","toggleExpand","useExpandedRows","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","s","filteredServers","useEffect","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ToolTestPanel","ConfirmDeleteModal"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-CCOSf1PY.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-Yq7cK-vR.js";import{D as g}from"./DataTable-J5R6mepB.js";import{F as N,b as x}from"./FilterBar-Bdssa-Xn.js";import{R as v,a as m}from"./RowActions-Bs4PF-Gd.js";import{u as P}from"./useFilterParams-CGRYFw_A.js";import{P as W}from"./PageHeader-COcgWWf-.js";import{T as y}from"./TaskQueuePill-bw8ieKsf.js";import{W as D}from"./WorkflowPill-7vt2F6wR.js";import{a6 as E,a8 as j,O as q}from"./vendor-icons-CBOM6Es0.js";import{c as C}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BXGvOADa.js";function B(){const a=C(),{data:u,isLoading:c}=b(),{filters:r,setFilter:i}=P({filters:{search:"",queue:""}}),[o,p]=l.useState(r.search);l.useEffect(()=>{if(o===r.search)return;const e=setTimeout(()=>i("search",o),300);return()=>clearTimeout(e)},[o,i,r.search]);const t=u??[],d=l.useMemo(()=>[...new Set(t.map(e=>e.task_queue).filter(Boolean))].sort(),[t]),f=l.useMemo(()=>{let e=t;if(r.search){const n=r.search.toLowerCase();e=e.filter(h=>h.name.toLowerCase().includes(n))}return r.queue&&(e=e.filter(n=>n.task_queue===r.queue)),e},[t,r]),k=[{key:"name",label:"Workflow",render:e=>s.jsxDEV(D,{type:e.name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:52,columnNumber:24},this)},{key:"task_queue",label:"Queue",render:e=>s.jsxDEV(y,{queue:e.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:57,columnNumber:24},this),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?s.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[s.jsxDEV(E,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:11},this):s.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:65,columnNumber:11},this),className:"whitespace-nowrap"},{key:"actions",label:"",render:e=>s.jsxDEV(v,{children:e.registered?s.jsxDEV(m,{icon:j,title:"View config",onClick:()=>a(`/workflows/registry/${encodeURIComponent(e.name)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:74,columnNumber:13},this):s.jsxDEV(m,{icon:q,title:"Register workflow",onClick:()=>a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:80,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:72,columnNumber:9},this),className:"w-16 text-right"}],w=e=>{e.registered?a(`/workflows/registry/${encodeURIComponent(e.name)}`):a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return s.jsxDEV("div",{children:[s.jsxDEV(W,{title:"Workers",docsHash:"#docs:dashboard.md:task-queues"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:102,columnNumber:7},this),s.jsxDEV(N,{children:[s.jsxDEV("input",{type:"text",placeholder:"Search workers...",value:o,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:105,columnNumber:9},this),s.jsxDEV(x,{label:"Queue",value:r.queue,onChange:e=>i("queue",e),options:d.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(g,{columns:k,data:f,keyFn:e=>e.name,onRowClick:w,isLoading:c,emptyMessage:"No active workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:120,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:101,columnNumber:5},this)}export{B as WorkersPage};
2
- //# sourceMappingURL=index-CS61sh5q.js.map
1
+ import{j as s}from"./index-MnRuwfHN.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-BvGU8_fj.js";import{D as g}from"./DataTable-VKt4pvC-.js";import{F as N,b as x}from"./FilterBar-BoRQss2J.js";import{R as v,a as m}from"./RowActions-uGuPBEWb.js";import{u as P}from"./useFilterParams-CGRYFw_A.js";import{P as W}from"./PageHeader-C4DNgZKA.js";import{T as y}from"./TaskQueuePill-yBqQ-piu.js";import{W as D}from"./WorkflowPill-C7jE0e1g.js";import{a9 as E,ac as j,Y as q}from"./vendor-icons-YdqUbzg6.js";import{c as C}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-Di6_NfbP.js";function B(){const a=C(),{data:u,isLoading:c}=b(),{filters:r,setFilter:i}=P({filters:{search:"",queue:""}}),[o,p]=l.useState(r.search);l.useEffect(()=>{if(o===r.search)return;const e=setTimeout(()=>i("search",o),300);return()=>clearTimeout(e)},[o,i,r.search]);const t=u??[],d=l.useMemo(()=>[...new Set(t.map(e=>e.task_queue).filter(Boolean))].sort(),[t]),f=l.useMemo(()=>{let e=t;if(r.search){const n=r.search.toLowerCase();e=e.filter(h=>h.name.toLowerCase().includes(n))}return r.queue&&(e=e.filter(n=>n.task_queue===r.queue)),e},[t,r]),k=[{key:"name",label:"Workflow",render:e=>s.jsxDEV(D,{type:e.name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:52,columnNumber:24},this)},{key:"task_queue",label:"Queue",render:e=>s.jsxDEV(y,{queue:e.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:57,columnNumber:24},this),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?s.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[s.jsxDEV(E,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:11},this):s.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:65,columnNumber:11},this),className:"whitespace-nowrap"},{key:"actions",label:"",render:e=>s.jsxDEV(v,{children:e.registered?s.jsxDEV(m,{icon:j,title:"View config",onClick:()=>a(`/workflows/registry/${encodeURIComponent(e.name)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:74,columnNumber:13},this):s.jsxDEV(m,{icon:q,title:"Register workflow",onClick:()=>a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:80,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:72,columnNumber:9},this),className:"w-16 text-right"}],w=e=>{e.registered?a(`/workflows/registry/${encodeURIComponent(e.name)}`):a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return s.jsxDEV("div",{children:[s.jsxDEV(W,{title:"Workers",docsHash:"#docs:dashboard.md:task-queues"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:102,columnNumber:7},this),s.jsxDEV(N,{children:[s.jsxDEV("input",{type:"text",placeholder:"Search workers...",value:o,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:105,columnNumber:9},this),s.jsxDEV(x,{label:"Queue",value:r.queue,onChange:e=>i("queue",e),options:d.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(g,{columns:k,data:f,keyFn:e=>e.name,onRowClick:w,isLoading:c,emptyMessage:"No active workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:120,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:101,columnNumber:5},this)}export{B as WorkersPage};
2
+ //# sourceMappingURL=index-Csts1D-x.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CS61sh5q.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" docsHash=\"#docs:dashboard.md:task-queues\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxDEV","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
1
+ {"version":3,"file":"index-Csts1D-x.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" docsHash=\"#docs:dashboard.md:task-queues\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxDEV","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}