@hotmeshio/long-tail 0.4.4 → 0.4.5

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 (295) hide show
  1. package/build/api/agent-subscriptions.js +14 -0
  2. package/build/lib/events/index.js +3 -0
  3. package/build/lib/events/nats.js +2 -0
  4. package/build/services/agent/index.js +14 -0
  5. package/build/services/agent/trigger-registry.d.ts +2 -0
  6. package/build/services/agent/trigger-registry.js +37 -8
  7. package/build/start/workers.js +3 -0
  8. package/build/types/events.d.ts +1 -1
  9. package/dashboard/dist/assets/AdminDashboard-ntLz5Pro.js +2 -0
  10. package/dashboard/dist/assets/{AdminDashboard-DISq0Tz8.js.map → AdminDashboard-ntLz5Pro.js.map} +1 -1
  11. package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js +16 -0
  12. package/dashboard/dist/assets/{AgentConfigPage-DqaJpB3K.js.map → AgentConfigPage-D27vWOI6.js.map} +1 -1
  13. package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js +4 -0
  14. package/dashboard/dist/assets/{AgentDetailPage-BPzPk2GC.js.map → AgentDetailPage-Cm2KFR4O.js.map} +1 -1
  15. package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js +2 -0
  16. package/dashboard/dist/assets/{AgentsPage-CLcxJWjC.js.map → AgentsPage-_ptA-0YO.js.map} +1 -1
  17. package/dashboard/dist/assets/AvailableEscalationsPage-bdPqEzbx.js +2 -0
  18. package/dashboard/dist/assets/{AvailableEscalationsPage-hOcjAAIj.js.map → AvailableEscalationsPage-bdPqEzbx.js.map} +1 -1
  19. package/dashboard/dist/assets/BotPicker-CYfFMpkY.js +2 -0
  20. package/dashboard/dist/assets/{BotPicker-DuAZgHbJ.js.map → BotPicker-CYfFMpkY.js.map} +1 -1
  21. package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js +2 -0
  22. package/dashboard/dist/assets/{CapabilitiesPage-PRel6TXd.js.map → CapabilitiesPage-M7-ZTFNV.js.map} +1 -1
  23. package/dashboard/dist/assets/CollapsibleSection-DU5KAtQ-.js +2 -0
  24. package/dashboard/dist/assets/{CollapsibleSection-DnoUFQVf.js.map → CollapsibleSection-DU5KAtQ-.js.map} +1 -1
  25. package/dashboard/dist/assets/ConfirmDeleteModal-_hW5Vc05.js +2 -0
  26. package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-_hW5Vc05.js.map} +1 -1
  27. package/dashboard/dist/assets/CopyableId-DiWqv41D.js +2 -0
  28. package/dashboard/dist/assets/{CopyableId-D0SQ39nR.js.map → CopyableId-DiWqv41D.js.map} +1 -1
  29. package/dashboard/dist/assets/CredentialsPage-CmbwypSF.js +2 -0
  30. package/dashboard/dist/assets/{CredentialsPage-CqedUU7b.js.map → CredentialsPage-CmbwypSF.js.map} +1 -1
  31. package/dashboard/dist/assets/CronLabel-nycfAefc.js +2 -0
  32. package/dashboard/dist/assets/{CronLabel-CPEjE-mH.js.map → CronLabel-nycfAefc.js.map} +1 -1
  33. package/dashboard/dist/assets/CustomDurationPicker-gNZRBaHg.js +2 -0
  34. package/dashboard/dist/assets/{CustomDurationPicker-BIQWzbv0.js.map → CustomDurationPicker-gNZRBaHg.js.map} +1 -1
  35. package/dashboard/dist/assets/DataTable-DGerT2ZM.js +2 -0
  36. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-DGerT2ZM.js.map} +1 -1
  37. package/dashboard/dist/assets/DropZone-vNcqMd05.js +2 -0
  38. package/dashboard/dist/assets/{DropZone-e5EOL5gC.js.map → DropZone-vNcqMd05.js.map} +1 -1
  39. package/dashboard/dist/assets/ElapsedCell-CdvQbtve.js +2 -0
  40. package/dashboard/dist/assets/{ElapsedCell-CzVjr74Y.js.map → ElapsedCell-CdvQbtve.js.map} +1 -1
  41. package/dashboard/dist/assets/EmptyState-DMldv8c5.js +2 -0
  42. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-DMldv8c5.js.map} +1 -1
  43. package/dashboard/dist/assets/EscalationsOverview-BNENCL_2.js +2 -0
  44. package/dashboard/dist/assets/{EscalationsOverview-Bcrb44xJ.js.map → EscalationsOverview-BNENCL_2.js.map} +1 -1
  45. package/dashboard/dist/assets/EventTable-BqDAyXyc.js +2 -0
  46. package/dashboard/dist/assets/{EventTable-CGfJU7e1.js.map → EventTable-BqDAyXyc.js.map} +1 -1
  47. package/dashboard/dist/assets/EventTopicPill-CnHFBglc.js +2 -0
  48. package/dashboard/dist/assets/{EventTopicPill-xJJnxvlP.js.map → EventTopicPill-CnHFBglc.js.map} +1 -1
  49. package/dashboard/dist/assets/FilterBar-TYiTtUgv.js +2 -0
  50. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-TYiTtUgv.js.map} +1 -1
  51. package/dashboard/dist/assets/HomePage-fterfLKH.js +2 -0
  52. package/dashboard/dist/assets/{HomePage-BIzUcGW9.js.map → HomePage-fterfLKH.js.map} +1 -1
  53. package/dashboard/dist/assets/ListToolbar-BO5Igi6v.js +2 -0
  54. package/dashboard/dist/assets/{ListToolbar-DNAGFe14.js.map → ListToolbar-BO5Igi6v.js.map} +1 -1
  55. package/dashboard/dist/assets/McpOverview-BQokGg0z.js +2 -0
  56. package/dashboard/dist/assets/{McpOverview-BpYk21es.js.map → McpOverview-BQokGg0z.js.map} +1 -1
  57. package/dashboard/dist/assets/McpQueryDetailPage-0WOp2n_j.js +5 -0
  58. package/dashboard/dist/assets/{McpQueryDetailPage-DlrZiSuL.js.map → McpQueryDetailPage-0WOp2n_j.js.map} +1 -1
  59. package/dashboard/dist/assets/McpQueryPage-DUey_h9J.js +2 -0
  60. package/dashboard/dist/assets/{McpQueryPage-COfPssO7.js.map → McpQueryPage-DUey_h9J.js.map} +1 -1
  61. package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js +2 -0
  62. package/dashboard/dist/assets/{McpRunDetailPage-Cra0nQSw.js.map → McpRunDetailPage-Cv4qyr91.js.map} +1 -1
  63. package/dashboard/dist/assets/McpRunsPage-B3R6KZ61.js +2 -0
  64. package/dashboard/dist/assets/{McpRunsPage-BlgcGN3k.js.map → McpRunsPage-B3R6KZ61.js.map} +1 -1
  65. package/dashboard/dist/assets/Modal-Qe8lW7gQ.js +2 -0
  66. package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-Qe8lW7gQ.js.map} +1 -1
  67. package/dashboard/dist/assets/OperatorDashboard-dldvzjcg.js +2 -0
  68. package/dashboard/dist/assets/{OperatorDashboard-BbO6cWzb.js.map → OperatorDashboard-dldvzjcg.js.map} +1 -1
  69. package/dashboard/dist/assets/PageHeader-DF4BeEm4.js +2 -0
  70. package/dashboard/dist/assets/{PageHeader-B_gV_jKk.js.map → PageHeader-DF4BeEm4.js.map} +1 -1
  71. package/dashboard/dist/assets/PageHeaderWithStats-BQZw6BgA.js +2 -0
  72. package/dashboard/dist/assets/{PageHeaderWithStats-D0I0nrnx.js.map → PageHeaderWithStats-BQZw6BgA.js.map} +1 -1
  73. package/dashboard/dist/assets/PriorityBadge-DMyB3WLZ.js +2 -0
  74. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-DMyB3WLZ.js.map} +1 -1
  75. package/dashboard/dist/assets/ProcessDetailPage-Beo-QVL-.js +2 -0
  76. package/dashboard/dist/assets/{ProcessDetailPage-s_iV8ICg.js.map → ProcessDetailPage-Beo-QVL-.js.map} +1 -1
  77. package/dashboard/dist/assets/ProcessesListPage-C_ars8gp.js +2 -0
  78. package/dashboard/dist/assets/{ProcessesListPage-MnLMnxAa.js.map → ProcessesListPage-C_ars8gp.js.map} +1 -1
  79. package/dashboard/dist/assets/RolePill-DrBZ7JJj.js +2 -0
  80. package/dashboard/dist/assets/{RolePill-BOBytzrP.js.map → RolePill-DrBZ7JJj.js.map} +1 -1
  81. package/dashboard/dist/assets/RolesPage-DgSXFFGL.js +2 -0
  82. package/dashboard/dist/assets/{RolesPage-BH7KASM7.js.map → RolesPage-DgSXFFGL.js.map} +1 -1
  83. package/dashboard/dist/assets/RowActions-QcakGbVA.js +2 -0
  84. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-QcakGbVA.js.map} +1 -1
  85. package/dashboard/dist/assets/RunAsSelector-CYMeZwrM.js +2 -0
  86. package/dashboard/dist/assets/{RunAsSelector-_QbJKhlo.js.map → RunAsSelector-CYMeZwrM.js.map} +1 -1
  87. package/dashboard/dist/assets/ServerName-D5NKD06M.js +2 -0
  88. package/dashboard/dist/assets/{ServerName-uqa4eBqm.js.map → ServerName-D5NKD06M.js.map} +1 -1
  89. package/dashboard/dist/assets/StatCard-PZQmmCHK.js +2 -0
  90. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-PZQmmCHK.js.map} +1 -1
  91. package/dashboard/dist/assets/StatusBadge-ME2R6a7K.js +2 -0
  92. package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-ME2R6a7K.js.map} +1 -1
  93. package/dashboard/dist/assets/StepIndicator-CDDVahOz.js +2 -0
  94. package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CDDVahOz.js.map} +1 -1
  95. package/dashboard/dist/assets/StickyPagination-Ddy93Q5I.js +2 -0
  96. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-Ddy93Q5I.js.map} +1 -1
  97. package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js +2 -0
  98. package/dashboard/dist/assets/{SwimlaneTimeline-og79Llvs.js.map → SwimlaneTimeline-CYYA8nd9.js.map} +1 -1
  99. package/dashboard/dist/assets/TagInput-B45Dm3IW.js +2 -0
  100. package/dashboard/dist/assets/{TagInput-D3f11sbM.js.map → TagInput-B45Dm3IW.js.map} +1 -1
  101. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js +2 -0
  102. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js.map +1 -0
  103. package/dashboard/dist/assets/TaskQueuePill-BJRUjVDv.js +2 -0
  104. package/dashboard/dist/assets/{TaskQueuePill-Bc45J7X1.js.map → TaskQueuePill-BJRUjVDv.js.map} +1 -1
  105. package/dashboard/dist/assets/TasksListPage-Czu08px3.js +2 -0
  106. package/dashboard/dist/assets/{TasksListPage-BYj3OqUi.js.map → TasksListPage-Czu08px3.js.map} +1 -1
  107. package/dashboard/dist/assets/TimeAgo-CJ56IUy6.js +2 -0
  108. package/dashboard/dist/assets/{TimeAgo-W7TdJpV-.js.map → TimeAgo-CJ56IUy6.js.map} +1 -1
  109. package/dashboard/dist/assets/TimestampCell-QtcYZ9Jx.js +2 -0
  110. package/dashboard/dist/assets/{TimestampCell-Bi2nc9Q_.js.map → TimestampCell-QtcYZ9Jx.js.map} +1 -1
  111. package/dashboard/dist/assets/ToolPill-DpDv3FwI.js +2 -0
  112. package/dashboard/dist/assets/{ToolPill-CuoXcmhv.js.map → ToolPill-DpDv3FwI.js.map} +1 -1
  113. package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js +2 -0
  114. package/dashboard/dist/assets/{ToolTestPanel-Dl3C53zb.js.map → ToolTestPanel-BzFOwzd_.js.map} +1 -1
  115. package/dashboard/dist/assets/TopicDetailPage-DwShZbh9.js +9 -0
  116. package/dashboard/dist/assets/{TopicDetailPage-CjaZn4WP.js.map → TopicDetailPage-DwShZbh9.js.map} +1 -1
  117. package/dashboard/dist/assets/TopicsPage-DKXlpZl_.js +2 -0
  118. package/dashboard/dist/assets/{TopicsPage-BfsJEC1p.js.map → TopicsPage-DKXlpZl_.js.map} +1 -1
  119. package/dashboard/dist/assets/UserName-zlR1so37.js +2 -0
  120. package/dashboard/dist/assets/{UserName-b4baWHM_.js.map → UserName-zlR1so37.js.map} +1 -1
  121. package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js +2 -0
  122. package/dashboard/dist/assets/{WorkflowExecutionPage-BGmJnXnk.js.map → WorkflowExecutionPage-BMNIxeJB.js.map} +1 -1
  123. package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js +2 -0
  124. package/dashboard/dist/assets/{WorkflowPill-Bg2-0Hkg.js.map → WorkflowPill-B5B3yGlh.js.map} +1 -1
  125. package/dashboard/dist/assets/WorkflowsDashboard-BlAPZbQZ.js +2 -0
  126. package/dashboard/dist/assets/{WorkflowsDashboard-BzH7jMRu.js.map → WorkflowsDashboard-BlAPZbQZ.js.map} +1 -1
  127. package/dashboard/dist/assets/WorkflowsOverview-NnPi6rwS.js +2 -0
  128. package/dashboard/dist/assets/{WorkflowsOverview-BcUgBvjD.js.map → WorkflowsOverview-NnPi6rwS.js.map} +1 -1
  129. package/dashboard/dist/assets/YamlWorkflowsPage-C4mZum6x.js +2 -0
  130. package/dashboard/dist/assets/{YamlWorkflowsPage-OhpCQJ0l.js.map → YamlWorkflowsPage-C4mZum6x.js.map} +1 -1
  131. package/dashboard/dist/assets/{agents-Ce3HmPz4.js → agents-B5wvILeV.js} +2 -2
  132. package/dashboard/dist/assets/{agents-Ce3HmPz4.js.map → agents-B5wvILeV.js.map} +1 -1
  133. package/dashboard/dist/assets/{bots-B0BomNnf.js → bots-BPlouRDm.js} +2 -2
  134. package/dashboard/dist/assets/{bots-B0BomNnf.js.map → bots-BPlouRDm.js.map} +1 -1
  135. package/dashboard/dist/assets/capabilities-DkvRG09b.js +2 -0
  136. package/dashboard/dist/assets/{capabilities-t-w5N9K9.js.map → capabilities-DkvRG09b.js.map} +1 -1
  137. package/dashboard/dist/assets/{controlplane-BrtAZnJM.js → controlplane-0m_rA-UW.js} +2 -2
  138. package/dashboard/dist/assets/{controlplane-BrtAZnJM.js.map → controlplane-0m_rA-UW.js.map} +1 -1
  139. package/dashboard/dist/assets/escalation-CfIAIUg2.js +2 -0
  140. package/dashboard/dist/assets/{escalation-DilnDxw2.js.map → escalation-CfIAIUg2.js.map} +1 -1
  141. package/dashboard/dist/assets/escalation-columns-CLIdxlbe.js +2 -0
  142. package/dashboard/dist/assets/{escalation-columns-C0slywOY.js.map → escalation-columns-CLIdxlbe.js.map} +1 -1
  143. package/dashboard/dist/assets/helpers-prGqC38M.js +2 -0
  144. package/dashboard/dist/assets/{helpers-BMvPqQr8.js.map → helpers-prGqC38M.js.map} +1 -1
  145. package/dashboard/dist/assets/index-4T7Z_gQ4.js +281 -0
  146. package/dashboard/dist/assets/index-4T7Z_gQ4.js.map +1 -0
  147. package/dashboard/dist/assets/index-BR3SwTNI.js +2 -0
  148. package/dashboard/dist/assets/{index-pIMl0mYp.js.map → index-BR3SwTNI.js.map} +1 -1
  149. package/dashboard/dist/assets/index-BWKIigEk.js +2 -0
  150. package/dashboard/dist/assets/{index-qNuxC8kX.js.map → index-BWKIigEk.js.map} +1 -1
  151. package/dashboard/dist/assets/index-BgVuyWhi.js +15 -0
  152. package/dashboard/dist/assets/{index-D_wqdvG_.js.map → index-BgVuyWhi.js.map} +1 -1
  153. package/dashboard/dist/assets/index-C0sDEKdo.js +2 -0
  154. package/dashboard/dist/assets/{index-30-pN97P.js.map → index-C0sDEKdo.js.map} +1 -1
  155. package/dashboard/dist/assets/index-C2MJzu6J.js +2 -0
  156. package/dashboard/dist/assets/{index-f-0Duls3.js.map → index-C2MJzu6J.js.map} +1 -1
  157. package/dashboard/dist/assets/index-CFoddJDr.js +6 -0
  158. package/dashboard/dist/assets/{index-Ck2QdJXT.js.map → index-CFoddJDr.js.map} +1 -1
  159. package/dashboard/dist/assets/index-CrMxD5Ib.js +6 -0
  160. package/dashboard/dist/assets/{index-DPW_i3fH.js.map → index-CrMxD5Ib.js.map} +1 -1
  161. package/dashboard/dist/assets/index-CuY5hPYB.js +2 -0
  162. package/dashboard/dist/assets/{index-DnsVYMMg.js.map → index-CuY5hPYB.js.map} +1 -1
  163. package/dashboard/dist/assets/index-CwkJBn87.js +2 -0
  164. package/dashboard/dist/assets/{index-Bl9wzQ8Q.js.map → index-CwkJBn87.js.map} +1 -1
  165. package/dashboard/dist/assets/index-DeL84Cag.js +2 -0
  166. package/dashboard/dist/assets/{index-DNmlrCAp.js.map → index-DeL84Cag.js.map} +1 -1
  167. package/dashboard/dist/assets/index-DqeLbz6j.js +2 -0
  168. package/dashboard/dist/assets/{index-BxOuF0hm.js.map → index-DqeLbz6j.js.map} +1 -1
  169. package/dashboard/dist/assets/index-P9huxx3-.js +2 -0
  170. package/dashboard/dist/assets/{index-H5TlloTk.js.map → index-P9huxx3-.js.map} +1 -1
  171. package/dashboard/dist/assets/{knowledge-D01NdF5h.js → knowledge-CUZxyRCO.js} +2 -2
  172. package/dashboard/dist/assets/{knowledge-D01NdF5h.js.map → knowledge-CUZxyRCO.js.map} +1 -1
  173. package/dashboard/dist/assets/{mcp-CjXjDZI0.js → mcp-B5VQPoF3.js} +2 -2
  174. package/dashboard/dist/assets/{mcp-CjXjDZI0.js.map → mcp-B5VQPoF3.js.map} +1 -1
  175. package/dashboard/dist/assets/{mcp-query-LlKQcWLJ.js → mcp-query-Ba5Zj3yg.js} +2 -2
  176. package/dashboard/dist/assets/{mcp-query-LlKQcWLJ.js.map → mcp-query-Ba5Zj3yg.js.map} +1 -1
  177. package/dashboard/dist/assets/{mcp-runs-C0C54hU6.js → mcp-runs-CAiEr5Fc.js} +2 -2
  178. package/dashboard/dist/assets/{mcp-runs-C0C54hU6.js.map → mcp-runs-CAiEr5Fc.js.map} +1 -1
  179. package/dashboard/dist/assets/namespaces-sVr5scma.js +2 -0
  180. package/dashboard/dist/assets/{namespaces-6qWDXXJV.js.map → namespaces-sVr5scma.js.map} +1 -1
  181. package/dashboard/dist/assets/{roles-Dtj0uabn.js → roles-E_bA4e0f.js} +2 -2
  182. package/dashboard/dist/assets/{roles-Dtj0uabn.js.map → roles-E_bA4e0f.js.map} +1 -1
  183. package/dashboard/dist/assets/{tasks-BevFBjZq.js → tasks-CL6Gv8jB.js} +2 -2
  184. package/dashboard/dist/assets/{tasks-BevFBjZq.js.map → tasks-CL6Gv8jB.js.map} +1 -1
  185. package/dashboard/dist/assets/{topics-BMG5tx2g.js → topics-DbtPHERP.js} +2 -2
  186. package/dashboard/dist/assets/{topics-BMG5tx2g.js.map → topics-DbtPHERP.js.map} +1 -1
  187. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  188. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  189. package/dashboard/dist/assets/{useEventHooks-CPyvFlVR.js → useEventHooks-C6c618cj.js} +2 -2
  190. package/dashboard/dist/assets/{useEventHooks-CPyvFlVR.js.map → useEventHooks-C6c618cj.js.map} +1 -1
  191. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
  192. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
  193. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
  194. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
  195. package/dashboard/dist/assets/{useYamlActivityEvents-Bll8NPNQ.js → useYamlActivityEvents-eK7kIUdh.js} +2 -2
  196. package/dashboard/dist/assets/{useYamlActivityEvents-Bll8NPNQ.js.map → useYamlActivityEvents-eK7kIUdh.js.map} +1 -1
  197. package/dashboard/dist/assets/{users-XZ349b0r.js → users-CCHSIAxt.js} +2 -2
  198. package/dashboard/dist/assets/{users-XZ349b0r.js.map → users-CCHSIAxt.js.map} +1 -1
  199. package/dashboard/dist/assets/{vendor-icons-B_Yla7iD.js → vendor-icons-D8-ZINAH.js} +2 -2
  200. package/dashboard/dist/assets/{vendor-icons-B_Yla7iD.js.map → vendor-icons-D8-ZINAH.js.map} +1 -1
  201. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  202. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  203. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  204. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  205. package/dashboard/dist/assets/{workflows-Do-Eiv8f.js → workflows-BNbocg_9.js} +2 -2
  206. package/dashboard/dist/assets/{workflows-Do-Eiv8f.js.map → workflows-BNbocg_9.js.map} +1 -1
  207. package/dashboard/dist/assets/{yaml-workflows-DolGRQ5f.js → yaml-workflows-Cu1FUwrc.js} +2 -2
  208. package/dashboard/dist/assets/{yaml-workflows-DolGRQ5f.js.map → yaml-workflows-Cu1FUwrc.js.map} +1 -1
  209. package/dashboard/dist/index.html +4 -4
  210. package/package.json +1 -1
  211. package/dashboard/dist/assets/AdminDashboard-DISq0Tz8.js +0 -2
  212. package/dashboard/dist/assets/AgentConfigPage-DqaJpB3K.js +0 -16
  213. package/dashboard/dist/assets/AgentDetailPage-BPzPk2GC.js +0 -4
  214. package/dashboard/dist/assets/AgentsPage-CLcxJWjC.js +0 -2
  215. package/dashboard/dist/assets/AvailableEscalationsPage-hOcjAAIj.js +0 -2
  216. package/dashboard/dist/assets/BotPicker-DuAZgHbJ.js +0 -2
  217. package/dashboard/dist/assets/CapabilitiesPage-PRel6TXd.js +0 -2
  218. package/dashboard/dist/assets/CollapsibleSection-DnoUFQVf.js +0 -2
  219. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
  220. package/dashboard/dist/assets/CopyableId-D0SQ39nR.js +0 -2
  221. package/dashboard/dist/assets/CredentialsPage-CqedUU7b.js +0 -2
  222. package/dashboard/dist/assets/CronLabel-CPEjE-mH.js +0 -2
  223. package/dashboard/dist/assets/CustomDurationPicker-BIQWzbv0.js +0 -2
  224. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
  225. package/dashboard/dist/assets/DropZone-e5EOL5gC.js +0 -2
  226. package/dashboard/dist/assets/ElapsedCell-CzVjr74Y.js +0 -2
  227. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  228. package/dashboard/dist/assets/EscalationsOverview-Bcrb44xJ.js +0 -2
  229. package/dashboard/dist/assets/EventTable-CGfJU7e1.js +0 -2
  230. package/dashboard/dist/assets/EventTopicPill-xJJnxvlP.js +0 -2
  231. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  232. package/dashboard/dist/assets/HomePage-BIzUcGW9.js +0 -2
  233. package/dashboard/dist/assets/ListToolbar-DNAGFe14.js +0 -2
  234. package/dashboard/dist/assets/McpOverview-BpYk21es.js +0 -2
  235. package/dashboard/dist/assets/McpQueryDetailPage-DlrZiSuL.js +0 -5
  236. package/dashboard/dist/assets/McpQueryPage-COfPssO7.js +0 -2
  237. package/dashboard/dist/assets/McpRunDetailPage-Cra0nQSw.js +0 -2
  238. package/dashboard/dist/assets/McpRunsPage-BlgcGN3k.js +0 -2
  239. package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
  240. package/dashboard/dist/assets/OperatorDashboard-BbO6cWzb.js +0 -2
  241. package/dashboard/dist/assets/PageHeader-B_gV_jKk.js +0 -2
  242. package/dashboard/dist/assets/PageHeaderWithStats-D0I0nrnx.js +0 -2
  243. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  244. package/dashboard/dist/assets/ProcessDetailPage-s_iV8ICg.js +0 -2
  245. package/dashboard/dist/assets/ProcessesListPage-MnLMnxAa.js +0 -2
  246. package/dashboard/dist/assets/RolePill-BOBytzrP.js +0 -2
  247. package/dashboard/dist/assets/RolesPage-BH7KASM7.js +0 -2
  248. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  249. package/dashboard/dist/assets/RunAsSelector-_QbJKhlo.js +0 -2
  250. package/dashboard/dist/assets/ServerName-uqa4eBqm.js +0 -2
  251. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  252. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
  253. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
  254. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  255. package/dashboard/dist/assets/SwimlaneTimeline-og79Llvs.js +0 -2
  256. package/dashboard/dist/assets/TagInput-D3f11sbM.js +0 -2
  257. package/dashboard/dist/assets/TaskDetailPage-DPV4ySd9.js +0 -2
  258. package/dashboard/dist/assets/TaskDetailPage-DPV4ySd9.js.map +0 -1
  259. package/dashboard/dist/assets/TaskQueuePill-Bc45J7X1.js +0 -2
  260. package/dashboard/dist/assets/TasksListPage-BYj3OqUi.js +0 -2
  261. package/dashboard/dist/assets/TimeAgo-W7TdJpV-.js +0 -2
  262. package/dashboard/dist/assets/TimestampCell-Bi2nc9Q_.js +0 -2
  263. package/dashboard/dist/assets/ToolPill-CuoXcmhv.js +0 -2
  264. package/dashboard/dist/assets/ToolTestPanel-Dl3C53zb.js +0 -2
  265. package/dashboard/dist/assets/TopicDetailPage-CjaZn4WP.js +0 -9
  266. package/dashboard/dist/assets/TopicsPage-BfsJEC1p.js +0 -2
  267. package/dashboard/dist/assets/UserName-b4baWHM_.js +0 -2
  268. package/dashboard/dist/assets/WorkflowExecutionPage-BGmJnXnk.js +0 -2
  269. package/dashboard/dist/assets/WorkflowPill-Bg2-0Hkg.js +0 -2
  270. package/dashboard/dist/assets/WorkflowsDashboard-BzH7jMRu.js +0 -2
  271. package/dashboard/dist/assets/WorkflowsOverview-BcUgBvjD.js +0 -2
  272. package/dashboard/dist/assets/YamlWorkflowsPage-OhpCQJ0l.js +0 -2
  273. package/dashboard/dist/assets/capabilities-t-w5N9K9.js +0 -2
  274. package/dashboard/dist/assets/escalation-DilnDxw2.js +0 -2
  275. package/dashboard/dist/assets/escalation-columns-C0slywOY.js +0 -2
  276. package/dashboard/dist/assets/helpers-BMvPqQr8.js +0 -2
  277. package/dashboard/dist/assets/index-30-pN97P.js +0 -2
  278. package/dashboard/dist/assets/index-Bl9wzQ8Q.js +0 -2
  279. package/dashboard/dist/assets/index-BxOuF0hm.js +0 -2
  280. package/dashboard/dist/assets/index-Ck2QdJXT.js +0 -6
  281. package/dashboard/dist/assets/index-DNmlrCAp.js +0 -2
  282. package/dashboard/dist/assets/index-DPW_i3fH.js +0 -6
  283. package/dashboard/dist/assets/index-DZX-E_3q.js +0 -63
  284. package/dashboard/dist/assets/index-DZX-E_3q.js.map +0 -1
  285. package/dashboard/dist/assets/index-D_wqdvG_.js +0 -15
  286. package/dashboard/dist/assets/index-DnsVYMMg.js +0 -2
  287. package/dashboard/dist/assets/index-H5TlloTk.js +0 -2
  288. package/dashboard/dist/assets/index-f-0Duls3.js +0 -2
  289. package/dashboard/dist/assets/index-pIMl0mYp.js +0 -2
  290. package/dashboard/dist/assets/index-qNuxC8kX.js +0 -2
  291. package/dashboard/dist/assets/namespaces-6qWDXXJV.js +0 -2
  292. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  293. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  294. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
  295. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-Bl9wzQ8Q.js","sources":["../../src/api/stream-messages.ts","../../src/pages/admin/streams/constants.ts","../../src/pages/admin/streams/StreamMessageDetail.tsx","../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport type StreamMessageStatus = 'pending' | 'claimed' | 'processed' | 'dead_lettered';\nexport type StreamMessageSource = 'engine' | 'worker';\n\nexport interface StreamMessage {\n id: string;\n source: StreamMessageSource;\n stream_name: string;\n message: string;\n status: StreamMessageStatus;\n created_at: string;\n reserved_at: string | null;\n reserved_by: string | null;\n expired_at: string | null;\n dead_lettered_at: string | null;\n priority: number;\n visible_at: string | null;\n retry_attempt: number;\n max_retry_attempts: number;\n workflow_name: string | null;\n jid: string | null;\n aid: string | null;\n dad: string | null;\n msg_type: string | null;\n topic: string | null;\n}\n\nexport interface StreamMessagesResponse {\n messages: StreamMessage[];\n total: number;\n}\n\nexport interface StreamMessagesParams {\n namespace: string;\n source: StreamMessageSource;\n limit?: number;\n offset?: number;\n sort_by?: string;\n order?: 'asc' | 'desc';\n status?: StreamMessageStatus | '';\n stream_name?: string;\n msg_type?: string;\n topic?: string;\n workflow_name?: string;\n jid?: string;\n aid?: string;\n}\n\n// ── Fetch ───────────────────────────────────────────────────────────────────\n\nfunction fetchStreamMessages(params: StreamMessagesParams) {\n const qs = new URLSearchParams();\n qs.set('namespace', params.namespace);\n qs.set('source', params.source);\n if (params.limit) qs.set('limit', String(params.limit));\n if (params.offset) qs.set('offset', String(params.offset));\n if (params.sort_by) qs.set('sort_by', params.sort_by);\n if (params.order) qs.set('order', params.order);\n if (params.status) qs.set('status', params.status);\n if (params.stream_name) qs.set('stream_name', params.stream_name);\n if (params.msg_type) qs.set('msg_type', params.msg_type);\n if (params.topic) qs.set('topic', params.topic);\n if (params.workflow_name) qs.set('workflow_name', params.workflow_name);\n if (params.jid) qs.set('jid', params.jid);\n if (params.aid) qs.set('aid', params.aid);\n return apiFetch<StreamMessagesResponse>(`/controlplane/stream-messages?${qs}`);\n}\n\n// ── Hook ────────────────────────────────────────────────────────────────────\n\nexport function useStreamMessages(params: StreamMessagesParams) {\n return useQuery({\n queryKey: ['controlplane', 'stream-messages', params],\n queryFn: () => fetchStreamMessages(params),\n enabled: !!params.namespace,\n staleTime: 15_000,\n });\n}\n","import type { StreamMessageStatus } from '../../../api/stream-messages';\n\nexport const STATUS_DOT: Record<StreamMessageStatus, string> = {\n pending: 'bg-text-tertiary',\n claimed: 'bg-status-warning',\n processed: 'bg-status-success',\n dead_lettered: 'bg-status-error',\n};\n\nexport const STATUS_LABEL: Record<StreamMessageStatus, string> = {\n pending: 'Pending',\n claimed: 'Claimed',\n processed: 'Processed',\n dead_lettered: 'Dead Lettered',\n};\n\nexport const SOURCE_BADGE =\n 'inline-block px-1.5 py-0.5 text-[10px] font-mono rounded bg-surface-sunken text-text-secondary';\n\nexport const STATUS_OPTIONS = [\n { value: 'pending', label: 'Pending' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'processed', label: 'Processed' },\n { value: 'dead_lettered', label: 'Dead Lettered' },\n];\n\nexport const SOURCE_OPTIONS = [\n { value: 'engine', label: 'Engine' },\n { value: 'worker', label: 'Worker' },\n];\n","import { Filter } from 'lucide-react';\nimport type { StreamMessage } from '../../../api/stream-messages';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { STATUS_DOT, STATUS_LABEL, SOURCE_BADGE } from './constants';\n\nfunction Timestamp({ label, value }: { label: string; value: string | null }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <div className=\"mt-0.5\">\n <DateValue date={value} format=\"datetime\" />\n </div>\n </div>\n );\n}\n\nfunction Field({ label, value }: { label: string; value: string | null | undefined }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <p className=\"text-xs text-text-primary font-mono break-all\">{value}</p>\n </div>\n );\n}\n\n/** A field value that can be clicked to filter the master list. */\nfunction FilterableField({ label, value, onFilter }: {\n label: string;\n value: string | null | undefined;\n onFilter?: (value: string) => void;\n}) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <button\n onClick={() => onFilter?.(value)}\n className=\"flex items-center gap-1 group text-left w-full\"\n title={`Filter by ${label.toLowerCase()}: ${value}`}\n >\n <p className=\"text-xs text-text-primary font-mono break-all group-hover:text-accent transition-colors\">{value}</p>\n <Filter className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n </div>\n );\n}\n\nexport interface StreamMessageDetailFilters {\n onFilterStatus?: (value: string) => void;\n onFilterStreamName?: (value: string) => void;\n onFilterMsgType?: (value: string) => void;\n onFilterTopic?: (value: string) => void;\n onFilterWorkflow?: (value: string) => void;\n onFilterJid?: (value: string) => void;\n onFilterAid?: (value: string) => void;\n}\n\n/**\n * Standard stream message detail view.\n *\n * This component is the canonical representation of a stream message.\n * Reuse it wherever stream messages need to be displayed — the layout,\n * timestamp formatting (via DateValue with ms/UTC/local tooltip), and\n * payload viewer are the standard.\n */\nexport function StreamMessageDetail({ message, filters }: {\n message: StreamMessage | null;\n filters?: StreamMessageDetailFilters;\n}) {\n if (!message) return null;\n\n return (\n <div className=\"space-y-5 text-[11px]\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[message.status]}`} />\n <FilterableField\n label=\"\"\n value={STATUS_LABEL[message.status]}\n onFilter={() => filters?.onFilterStatus?.(message.status)}\n />\n <span className={SOURCE_BADGE}>{message.source}</span>\n </div>\n <FilterableField\n label=\"\"\n value={message.stream_name}\n onFilter={() => filters?.onFilterStreamName?.(message.stream_name)}\n />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">ID: {message.id}</p>\n </div>\n\n {/* Timestamps */}\n <div className=\"space-y-2\">\n <SectionLabel>Timestamps</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <Timestamp label=\"Created\" value={message.created_at} />\n <Timestamp label=\"Reserved\" value={message.reserved_at} />\n <Timestamp label=\"Processed\" value={message.expired_at} />\n <Timestamp label=\"Dead-lettered\" value={message.dead_lettered_at} />\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"space-y-2\">\n <SectionLabel>Metadata</SectionLabel>\n <div className=\"grid grid-cols-2 gap-2\">\n <Field label=\"Priority\" value={String(message.priority)} />\n <Field label=\"Retries\" value={`${message.retry_attempt} / ${message.max_retry_attempts}`} />\n <Field label=\"Reserved by\" value={message.reserved_by} />\n </div>\n </div>\n\n {/* Job ID — available on both engine and worker streams */}\n {message.jid && (\n <div className=\"space-y-2\">\n <SectionLabel>Job</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Job ID\" value={message.jid} onFilter={filters?.onFilterJid} />\n </div>\n </div>\n )}\n\n {/* Worker-specific fields — clickable to filter */}\n {message.source === 'worker' && (\n <div className=\"space-y-2\">\n <SectionLabel>Worker Details</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Workflow\" value={message.workflow_name} onFilter={filters?.onFilterWorkflow} />\n <FilterableField label=\"Activity\" value={message.aid} onFilter={filters?.onFilterAid} />\n <Field label=\"Dimension\" value={message.dad} />\n <FilterableField label=\"Type\" value={message.msg_type} onFilter={filters?.onFilterMsgType} />\n <FilterableField label=\"Topic\" value={message.topic} onFilter={filters?.onFilterTopic} />\n </div>\n </div>\n )}\n\n {/* Message payload — fully expanded by default */}\n <div className=\"space-y-2\">\n <JsonViewer data={message.message} label=\"Payload\" defaultCollapsed={false} />\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useControlPlaneApps } from '../../../api/controlplane';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nexport function StreamMessagesPage() {\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: 'durable', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const { data: appsData } = useControlPlaneApps();\n const namespaceOptions = useMemo(\n () => (appsData?.apps ?? []).map((a) => ({ value: a.appId, label: a.appId })),\n [appsData],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || 'durable',\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/controlplane/stream-messages?namespace=${filters.namespace || 'durable'}&source=${filters.source || 'worker'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}${filters.stream_name ? `&stream_name=${filters.stream_name}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'jid', label: 'Job', value: filters.jid },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter`}\n >\n {f.label}: {f.value}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\n sort={sort}\n onSort={setSort}\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\n {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["fetchStreamMessages","params","qs","apiFetch","useStreamMessages","useQuery","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","STATUS_OPTIONS","SOURCE_OPTIONS","Timestamp","label","value","jsx","DateValue","Field","FilterableField","onFilter","jsxs","Filter","StreamMessageDetail","message","filters","_a","SectionLabel","JsonViewer","StreamMessagesPage","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","appsData","useControlPlaneApps","namespaceOptions","useMemo","a","data","isLoading","refetch","isFetching","messages","total","activeMessage","m","panelOpen","columns","row","TimestampCell","PageHeader","FilterBar","ListToolbar","FilterSelect","v","FilterInput","f","X","DataTable","StickyPagination","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"index-CwkJBn87.js","sources":["../../src/api/stream-messages.ts","../../src/pages/admin/streams/constants.ts","../../src/pages/admin/streams/StreamMessageDetail.tsx","../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport type StreamMessageStatus = 'pending' | 'claimed' | 'processed' | 'dead_lettered';\nexport type StreamMessageSource = 'engine' | 'worker';\n\nexport interface StreamMessage {\n id: string;\n source: StreamMessageSource;\n stream_name: string;\n message: string;\n status: StreamMessageStatus;\n created_at: string;\n reserved_at: string | null;\n reserved_by: string | null;\n expired_at: string | null;\n dead_lettered_at: string | null;\n priority: number;\n visible_at: string | null;\n retry_attempt: number;\n max_retry_attempts: number;\n workflow_name: string | null;\n jid: string | null;\n aid: string | null;\n dad: string | null;\n msg_type: string | null;\n topic: string | null;\n}\n\nexport interface StreamMessagesResponse {\n messages: StreamMessage[];\n total: number;\n}\n\nexport interface StreamMessagesParams {\n namespace: string;\n source: StreamMessageSource;\n limit?: number;\n offset?: number;\n sort_by?: string;\n order?: 'asc' | 'desc';\n status?: StreamMessageStatus | '';\n stream_name?: string;\n msg_type?: string;\n topic?: string;\n workflow_name?: string;\n jid?: string;\n aid?: string;\n}\n\n// ── Fetch ───────────────────────────────────────────────────────────────────\n\nfunction fetchStreamMessages(params: StreamMessagesParams) {\n const qs = new URLSearchParams();\n qs.set('namespace', params.namespace);\n qs.set('source', params.source);\n if (params.limit) qs.set('limit', String(params.limit));\n if (params.offset) qs.set('offset', String(params.offset));\n if (params.sort_by) qs.set('sort_by', params.sort_by);\n if (params.order) qs.set('order', params.order);\n if (params.status) qs.set('status', params.status);\n if (params.stream_name) qs.set('stream_name', params.stream_name);\n if (params.msg_type) qs.set('msg_type', params.msg_type);\n if (params.topic) qs.set('topic', params.topic);\n if (params.workflow_name) qs.set('workflow_name', params.workflow_name);\n if (params.jid) qs.set('jid', params.jid);\n if (params.aid) qs.set('aid', params.aid);\n return apiFetch<StreamMessagesResponse>(`/controlplane/stream-messages?${qs}`);\n}\n\n// ── Hook ────────────────────────────────────────────────────────────────────\n\nexport function useStreamMessages(params: StreamMessagesParams) {\n return useQuery({\n queryKey: ['controlplane', 'stream-messages', params],\n queryFn: () => fetchStreamMessages(params),\n enabled: !!params.namespace,\n staleTime: 15_000,\n });\n}\n","import type { StreamMessageStatus } from '../../../api/stream-messages';\n\nexport const STATUS_DOT: Record<StreamMessageStatus, string> = {\n pending: 'bg-text-tertiary',\n claimed: 'bg-status-warning',\n processed: 'bg-status-success',\n dead_lettered: 'bg-status-error',\n};\n\nexport const STATUS_LABEL: Record<StreamMessageStatus, string> = {\n pending: 'Pending',\n claimed: 'Claimed',\n processed: 'Processed',\n dead_lettered: 'Dead Lettered',\n};\n\nexport const SOURCE_BADGE =\n 'inline-block px-1.5 py-0.5 text-[10px] font-mono rounded bg-surface-sunken text-text-secondary';\n\nexport const STATUS_OPTIONS = [\n { value: 'pending', label: 'Pending' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'processed', label: 'Processed' },\n { value: 'dead_lettered', label: 'Dead Lettered' },\n];\n\nexport const SOURCE_OPTIONS = [\n { value: 'engine', label: 'Engine' },\n { value: 'worker', label: 'Worker' },\n];\n","import { Filter } from 'lucide-react';\nimport type { StreamMessage } from '../../../api/stream-messages';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { STATUS_DOT, STATUS_LABEL, SOURCE_BADGE } from './constants';\n\nfunction Timestamp({ label, value }: { label: string; value: string | null }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <div className=\"mt-0.5\">\n <DateValue date={value} format=\"datetime\" />\n </div>\n </div>\n );\n}\n\nfunction Field({ label, value }: { label: string; value: string | null | undefined }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <p className=\"text-xs text-text-primary font-mono break-all\">{value}</p>\n </div>\n );\n}\n\n/** A field value that can be clicked to filter the master list. */\nfunction FilterableField({ label, value, onFilter }: {\n label: string;\n value: string | null | undefined;\n onFilter?: (value: string) => void;\n}) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <button\n onClick={() => onFilter?.(value)}\n className=\"flex items-center gap-1 group text-left w-full\"\n title={`Filter by ${label.toLowerCase()}: ${value}`}\n >\n <p className=\"text-xs text-text-primary font-mono break-all group-hover:text-accent transition-colors\">{value}</p>\n <Filter className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n </div>\n );\n}\n\nexport interface StreamMessageDetailFilters {\n onFilterStatus?: (value: string) => void;\n onFilterStreamName?: (value: string) => void;\n onFilterMsgType?: (value: string) => void;\n onFilterTopic?: (value: string) => void;\n onFilterWorkflow?: (value: string) => void;\n onFilterJid?: (value: string) => void;\n onFilterAid?: (value: string) => void;\n}\n\n/**\n * Standard stream message detail view.\n *\n * This component is the canonical representation of a stream message.\n * Reuse it wherever stream messages need to be displayed — the layout,\n * timestamp formatting (via DateValue with ms/UTC/local tooltip), and\n * payload viewer are the standard.\n */\nexport function StreamMessageDetail({ message, filters }: {\n message: StreamMessage | null;\n filters?: StreamMessageDetailFilters;\n}) {\n if (!message) return null;\n\n return (\n <div className=\"space-y-5 text-[11px]\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[message.status]}`} />\n <FilterableField\n label=\"\"\n value={STATUS_LABEL[message.status]}\n onFilter={() => filters?.onFilterStatus?.(message.status)}\n />\n <span className={SOURCE_BADGE}>{message.source}</span>\n </div>\n <FilterableField\n label=\"\"\n value={message.stream_name}\n onFilter={() => filters?.onFilterStreamName?.(message.stream_name)}\n />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">ID: {message.id}</p>\n </div>\n\n {/* Timestamps */}\n <div className=\"space-y-2\">\n <SectionLabel>Timestamps</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <Timestamp label=\"Created\" value={message.created_at} />\n <Timestamp label=\"Reserved\" value={message.reserved_at} />\n <Timestamp label=\"Processed\" value={message.expired_at} />\n <Timestamp label=\"Dead-lettered\" value={message.dead_lettered_at} />\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"space-y-2\">\n <SectionLabel>Metadata</SectionLabel>\n <div className=\"grid grid-cols-2 gap-2\">\n <Field label=\"Priority\" value={String(message.priority)} />\n <Field label=\"Retries\" value={`${message.retry_attempt} / ${message.max_retry_attempts}`} />\n <Field label=\"Reserved by\" value={message.reserved_by} />\n </div>\n </div>\n\n {/* Job ID — available on both engine and worker streams */}\n {message.jid && (\n <div className=\"space-y-2\">\n <SectionLabel>Job</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Job ID\" value={message.jid} onFilter={filters?.onFilterJid} />\n </div>\n </div>\n )}\n\n {/* Worker-specific fields — clickable to filter */}\n {message.source === 'worker' && (\n <div className=\"space-y-2\">\n <SectionLabel>Worker Details</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Workflow\" value={message.workflow_name} onFilter={filters?.onFilterWorkflow} />\n <FilterableField label=\"Activity\" value={message.aid} onFilter={filters?.onFilterAid} />\n <Field label=\"Dimension\" value={message.dad} />\n <FilterableField label=\"Type\" value={message.msg_type} onFilter={filters?.onFilterMsgType} />\n <FilterableField label=\"Topic\" value={message.topic} onFilter={filters?.onFilterTopic} />\n </div>\n </div>\n )}\n\n {/* Message payload — fully expanded by default */}\n <div className=\"space-y-2\">\n <JsonViewer data={message.message} label=\"Payload\" defaultCollapsed={false} />\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useControlPlaneApps } from '../../../api/controlplane';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nexport function StreamMessagesPage() {\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: 'durable', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const { data: appsData } = useControlPlaneApps();\n const namespaceOptions = useMemo(\n () => (appsData?.apps ?? []).map((a) => ({ value: a.appId, label: a.appId })),\n [appsData],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || 'durable',\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/controlplane/stream-messages?namespace=${filters.namespace || 'durable'}&source=${filters.source || 'worker'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}${filters.stream_name ? `&stream_name=${filters.stream_name}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'jid', label: 'Job', value: filters.jid },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter`}\n >\n {f.label}: {f.value}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\n sort={sort}\n onSort={setSort}\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\n {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["fetchStreamMessages","params","qs","apiFetch","useStreamMessages","useQuery","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","STATUS_OPTIONS","SOURCE_OPTIONS","Timestamp","label","value","jsxDEV","DateValue","Field","FilterableField","onFilter","Filter","StreamMessageDetail","message","filters","_a","SectionLabel","JsonViewer","StreamMessagesPage","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","appsData","useControlPlaneApps","namespaceOptions","useMemo","a","data","isLoading","refetch","isFetching","messages","total","activeMessage","m","panelOpen","columns","row","TimestampCell","PageHeader","FilterBar","ListToolbar","FilterSelect","v","FilterInput","f","X","DataTable","StickyPagination","createPortal"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as s}from"./index-4T7Z_gQ4.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-BNbocg_9.js";import{D as g}from"./DataTable-DGerT2ZM.js";import{F as N,b as x}from"./FilterBar-TYiTtUgv.js";import{R as v,a as m}from"./RowActions-QcakGbVA.js";import{u as P}from"./useFilterParams-CGRYFw_A.js";import{P as W}from"./PageHeader-DF4BeEm4.js";import{T as y}from"./TaskQueuePill-BJRUjVDv.js";import{W as D}from"./WorkflowPill-B5B3yGlh.js";import{aa as E,ad as j,Y as q}from"./vendor-icons-D8-ZINAH.js";import{c as C}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-DMldv8c5.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-DeL84Cag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DNmlrCAp.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","jsxs","jsx","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
1
+ {"version":3,"file":"index-DeL84Cag.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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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-4T7Z_gQ4.js";import{a as v}from"./vendor-query-DLp59M9_.js";import{d as B,e as H,f as $,g as O}from"./mcp-B5VQPoF3.js";import{S as U}from"./StepIndicator-CDDVahOz.js";import{P as z}from"./PageHeader-DF4BeEm4.js";import{T as J}from"./TagInput-B45Dm3IW.js";import{X as Y,H as q,aj as K,ak as X}from"./vendor-icons-D8-ZINAH.js";import{e as G,c as W,f as Q}from"./vendor-react-Co3Y8ikm.js";const _={name:"",description:"",mode:"network",transport_type:"sse",command:"",args:"",env_vars:"{}",url:"",auto_connect:!1,tags:[],compile_hints:"",credential_providers:[],discovered_tools:null};function Z(s){const a=s.transport_config??{},t=!!a.builtin;let r="network";return t?r="in-process":s.transport_type==="stdio"&&(r="local-process"),{name:s.name,description:s.description??"",mode:r,transport_type:s.transport_type,command:a.command??"",args:(a.args??[]).join(", "),env_vars:a.env?JSON.stringify(a.env,null,2):"{}",url:a.url??"",auto_connect:s.auto_connect,tags:s.tags??[],compile_hints:s.compile_hints??"",credential_providers:s.credential_providers??[],discovered_tools:s.tool_manifest??null}}function R(s){let a={};return s.mode==="local-process"?a={command:s.command.trim(),args:s.args.split(",").map(t=>t.trim()).filter(Boolean),env:s.env_vars.trim()?JSON.parse(s.env_vars):void 0}:s.mode==="network"&&(a={url:s.url.trim()}),{name:s.name.trim(),description:s.description.trim()||void 0,transport_type:s.mode==="local-process"?"stdio":s.transport_type,transport_config:a,auto_connect:s.auto_connect,tags:s.tags,compile_hints:s.compile_hints.trim()||void 0,credential_providers:s.credential_providers.length>0?s.credential_providers:void 0}}const P=["Transport","Discovery","Test","Review"];function C(s,a){return s===1?!(!a.name.trim()||a.mode==="network"&&!a.url.trim()||a.mode==="local-process"&&!a.command.trim()):!0}const p="label",N="hint",ee=[{value:"in-process",label:"In-Process",hint:"Built-in server running inside the app"},{value:"network",label:"Network Service",hint:"Remote server via SSE or Streamable HTTP"},{value:"local-process",label:"Local Process",hint:"Spawn a local command via stdio"}];function se({form:s,set:a,isBuiltin:t}){return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Connection Mode"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-3 gap-3 mt-1",children:ee.map(r=>{const n=s.mode===r.value,l=t&&r.value!=="in-process";return e.jsxDEV("button",{type:"button",disabled:l,onClick:()=>{a("mode",r.value),r.value==="local-process"&&a("transport_type","stdio"),r.value==="network"&&a("transport_type","sse")},className:`text-left p-3 rounded-md border transition-colors ${n?"border-accent bg-accent/5":l?"border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed":"border-surface-border hover:border-text-tertiary cursor-pointer"}`,children:[e.jsxDEV("span",{className:`text-xs font-medium ${n?"text-accent":"text-text-primary"}`,children:r.label},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:44,columnNumber:17},this),e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5",children:r.hint},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:47,columnNumber:17},this)]},r.value,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:27,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:57,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.name,onChange:r=>a("name",r.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full",disabled:t},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:56,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:68,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:s.description,onChange:r=>a("description",r.target.value),placeholder:"Optional description",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:55,columnNumber:7},this),s.mode==="in-process"&&e.jsxDEV("div",{children:e.jsxDEV("p",{className:N,children:"This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:82,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:81,columnNumber:9},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Server URL"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.url,onChange:r=>a("url",r.target.value),placeholder:"https://mcp-server.example.com/sse",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:93,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:91,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Transport Protocol"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:102,columnNumber:13},this),e.jsxDEV("div",{className:"flex gap-2 mt-1",children:["sse","streamable-http"].map(r=>e.jsxDEV("button",{type:"button",onClick:()=>a("transport_type",r),className:`px-3 py-1.5 text-xs rounded-md border transition-colors ${s.transport_type===r?"border-accent bg-accent/5 text-accent font-medium":"border-surface-border text-text-secondary hover:border-text-tertiary"}`,children:r==="sse"?"SSE":"Streamable HTTP"},r,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:105,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:103,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:101,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:90,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Command"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:127,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.command,onChange:r=>a("command",r.target.value),placeholder:"e.g., npx",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:128,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:126,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Arguments (comma-separated)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:137,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:s.args,onChange:r=>a("args",r.target.value),placeholder:"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:138,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:136,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Environment Variables (JSON)"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:147,columnNumber:13},this),e.jsxDEV("textarea",{value:s.env_vars,onChange:r=>a("env_vars",r.target.value),className:"input-json w-full",rows:3,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:148,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:125,columnNumber:9},this),e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.auto_connect,onChange:r=>a("auto_connect",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:161,columnNumber:9},this),e.jsxDEV("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:167,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:160,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TransportStep.tsx",lineNumber:18,columnNumber:5},this)}function ae({form:s,set:a}){const[t,r]=v.useState(""),n=i=>{const c=i.trim().toLowerCase();c&&!s.credential_providers.includes(c)&&a("credential_providers",[...s.credential_providers,c]),r("")},l=i=>{a("credential_providers",s.credential_providers.filter(c=>c!==i))},d=i=>{i.key==="Enter"||i.key===","?(i.preventDefault(),n(t)):i.key==="Backspace"&&!t&&s.credential_providers.length>0&&l(s.credential_providers[s.credential_providers.length-1])};return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:40,columnNumber:9},this),e.jsxDEV(J,{tags:s.tags,onChange:i=>a("tags",i),placeholder:"Add tag (e.g., database, analytics)..."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:41,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:39,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Compile Hints"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:53,columnNumber:9},this),e.jsxDEV("textarea",{value:s.compile_hints,onChange:i=>a("compile_hints",i.target.value),placeholder:"Guidance for the workflow compiler when generating YAML from this server's tools...",className:"input text-xs w-full leading-relaxed",rows:4,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:62,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:52,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:69,columnNumber:9},this),e.jsxDEV("div",{className:"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary",children:[s.credential_providers.map(i=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[i,e.jsxDEV("button",{type:"button",onClick:()=>l(i),className:"hover:text-status-error transition-colors",children:e.jsxDEV(Y,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:82,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:77,columnNumber:15},this)]},i,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:72,columnNumber:13},this)),e.jsxDEV("input",{type:"text",value:t,onChange:i=>r(i.target.value),onKeyDown:d,onBlur:()=>{t.trim()&&n(t)},placeholder:s.credential_providers.length===0?"Add provider (e.g., github, slack)...":"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:86,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:70,columnNumber:9},this),e.jsxDEV("p",{className:N,children:"IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:96,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:68,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/DiscoveryStep.tsx",lineNumber:37,columnNumber:5},this)}function re({form:s,set:a}){const t=B(),r=s.mode==="in-process",n=()=>{const i=R(s);t.mutate({transport_type:i.transport_type,transport_config:i.transport_config},{onSuccess:c=>{c.success&&a("discovered_tools",c.tools)}})},l=t.data,d=s.discovered_tools??(l==null?void 0:l.tools)??[];return e.jsxDEV("div",{className:"space-y-5",children:r?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"In-process servers connect lazily on first tool call. No connection test needed."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:37,columnNumber:11},this),s.discovered_tools&&s.discovered_tools.length>0&&e.jsxDEV("div",{className:"mt-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:[s.discovered_tools.length," tool",s.discovered_tools.length!==1?"s":""," cached from last connection"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:42,columnNumber:15},this),e.jsxDEV(k,{tools:s.discovered_tools},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:45,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:41,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:36,columnNumber:9},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("button",{type:"button",onClick:n,disabled:t.isPending,className:"btn-primary text-xs",children:t.isPending?e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(q,{className:"w-3 h-3 animate-spin"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:60,columnNumber:19},this),"Connecting..."]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:59,columnNumber:17},this):"Test Connection"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:52,columnNumber:13},this),(l==null?void 0:l.success)&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-success",children:[e.jsxDEV(K,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:69,columnNumber:17},this),"Connected — ",d.length," tool",d.length!==1?"s":""," discovered"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:68,columnNumber:15},this),l&&!l.success&&e.jsxDEV("span",{className:"flex items-center gap-1 text-xs text-status-error",children:[e.jsxDEV(X,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:75,columnNumber:17},this),l.error||"Connection failed"]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:74,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:51,columnNumber:11},this),d.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-2",children:"Discovered tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:83,columnNumber:15},this),e.jsxDEV(k,{tools:d},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:84,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:82,columnNumber:13},this),e.jsxDEV("p",{className:N,children:"Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:50,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:34,columnNumber:5},this)}function k({tools:s}){return e.jsxDEV("div",{className:"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border",children:s.map(a=>e.jsxDEV("div",{className:"px-3 py-2",children:[e.jsxDEV("span",{className:"text-xs font-medium text-text-primary font-mono",children:a.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:102,columnNumber:11},this),a.description&&e.jsxDEV("span",{className:"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2",children:a.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:104,columnNumber:13},this)]},a.name,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:101,columnNumber:9},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/TestStep.tsx",lineNumber:99,columnNumber:5},this)}const te={"in-process":"In-Process",network:"Network Service","local-process":"Local Process"},ie={stdio:"stdio",sse:"SSE","streamable-http":"Streamable HTTP"};function le({form:s}){const a=s.discovered_tools??[];return e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV(m,{label:"Name",value:s.name},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:25,columnNumber:7},this),s.description&&e.jsxDEV(m,{label:"Description",value:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:26,columnNumber:28},this),e.jsxDEV(m,{label:"Mode",value:te[s.mode]??s.mode},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:27,columnNumber:7},this),s.mode==="network"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Transport",value:ie[s.transport_type]??s.transport_type},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:31,columnNumber:11},this),e.jsxDEV(m,{label:"URL",value:s.url,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:30,columnNumber:9},this),s.mode==="local-process"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV(m,{label:"Command",value:s.command,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:37,columnNumber:11},this),s.args&&e.jsxDEV(m,{label:"Args",value:s.args,mono:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:38,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV(m,{label:"Auto-connect",value:s.auto_connect?"Yes":"No"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:42,columnNumber:7},this),s.tags.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Tags"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:46,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.tags.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:49,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:45,columnNumber:9},this),s.credential_providers.length>0&&e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:"Credential Providers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:59,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-1",children:s.credential_providers.map(t=>e.jsxDEV("span",{className:"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:t},t,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:62,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:58,columnNumber:9},this),s.compile_hints&&e.jsxDEV(m,{label:"Compile Hints",value:s.compile_hints},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:70,columnNumber:30},this),a.length>0&&e.jsxDEV(m,{label:"Discovered Tools",value:`${a.length} tool${a.length!==1?"s":""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:73,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:24,columnNumber:5},this)}function m({label:s,value:a,mono:t}){return e.jsxDEV("div",{children:[e.jsxDEV("label",{className:p,children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:82,columnNumber:7},this),e.jsxDEV("p",{className:`text-xs text-text-primary mt-0.5 ${t?"font-mono":""}`,children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:83,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/ReviewStep.tsx",lineNumber:81,columnNumber:5},this)}function be(){var y,T,w;const{serverId:s}=G(),a=!s,t=W(),{data:r,isLoading:n}=H(s??""),l=$(),d=O(),[i,c]=v.useState(_),[f,S]=v.useState(!1),[M,D]=v.useState(""),[L,E]=Q(),o=parseInt(L.get("step")||"1",10),x=v.useCallback(u=>{E(b=>{const h=new URLSearchParams(b);return h.set("step",String(u)),h},{replace:!1})},[E]);v.useEffect(()=>{if(!f){if(a){c(_),S(!0);return}r&&(c(Z(r)),S(!0))}},[r,a,f]);const g=(u,b)=>c(h=>({...h,[u]:b})),I=!!((y=r==null?void 0:r.transport_config)!=null&&y.builtin),A=()=>{D("");const u=R(i);r?d.mutate({id:r.id,...u},{onSuccess:()=>t("/mcp/servers")}):l.mutate(u,{onSuccess:()=>t("/mcp/servers"),onError:b=>D(b.message)})};if(!a&&n)return e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV("div",{className:"h-60 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:83,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:81,columnNumber:7},this);if(!a&&!r&&!n)return e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"Server not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:89,columnNumber:12},this);const F=o===P.length,j=l.isPending||d.isPending,V=M||((T=l.error)==null?void 0:T.message)||((w=d.error)==null?void 0:w.message);return e.jsxDEV("div",{children:[e.jsxDEV(z,{title:a?"Register MCP Server":(r==null?void 0:r.name)??""},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:98,columnNumber:7},this),e.jsxDEV("div",{className:"max-w-3xl",children:[e.jsxDEV(U,{steps:P,currentStep:o-1,onStepClick:u=>x(u+1)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:101,columnNumber:9},this),e.jsxDEV("div",{className:"min-h-[360px] py-2",children:[o===1&&e.jsxDEV(se,{form:i,set:g,isBuiltin:I},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:104,columnNumber:26},this),o===2&&e.jsxDEV(ae,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:105,columnNumber:26},this),o===3&&e.jsxDEV(re,{form:i,set:g},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:106,columnNumber:26},this),o===4&&e.jsxDEV(le,{form:i},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:107,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:103,columnNumber:9},this),V&&e.jsxDEV("p",{className:"text-xs text-status-error mt-4",children:V},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:111,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsxDEV("div",{children:o>1&&e.jsxDEV("button",{onClick:()=>x(o-1),className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:118,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:116,columnNumber:11},this),e.jsxDEV("div",{className:"flex gap-3",children:[e.jsxDEV("button",{onClick:()=>t("/mcp/servers"),className:"btn-ghost text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:124,columnNumber:13},this),F?e.jsxDEV("button",{onClick:A,disabled:!C(o,i)||j,className:"btn-primary text-xs",children:j?"Saving...":r?"Save":"Register"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:128,columnNumber:15},this):e.jsxDEV("button",{onClick:()=>x(o+1),disabled:!C(o,i),className:"btn-primary text-xs",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:136,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:123,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:115,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:100,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/servers/detail/McpServerDetailPage.tsx",lineNumber:97,columnNumber:5},this)}export{be as McpServerDetailPage};
2
+ //# sourceMappingURL=index-DqeLbz6j.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BxOuF0hm.js","sources":["../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n transport_config = { url: form.url.trim() };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'label';\nexport const hintCls = 'hint';\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-[10px] text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Environment Variables (JSON)</label>\n <textarea\n value={form.env_vars}\n onChange={(e) => set('env_vars', e.target.value)}\n className=\"input-json w-full\"\n rows={3}\n spellCheck={false}\n />\n </div>\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","STEP_LABELS","isStepValid","step","labelCls","hintCls","modes","TransportStep","set","jsxs","jsx","m","active","disabled","e","Fragment","t","DiscoveryStep","cpInput","setCpInput","useState","addProvider","raw","v","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","label","value","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader","StepIndicator","i"],"mappings":"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"}
1
+ {"version":3,"file":"index-DqeLbz6j.js","sources":["../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n transport_config = { url: form.url.trim() };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'label';\nexport const hintCls = 'hint';\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-[10px] text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Environment Variables (JSON)</label>\n <textarea\n value={form.env_vars}\n onChange={(e) => set('env_vars', e.target.value)}\n className=\"input-json w-full\"\n rows={3}\n spellCheck={false}\n />\n </div>\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","STEP_LABELS","isStepValid","step","labelCls","hintCls","modes","TransportStep","set","jsxDEV","m","active","disabled","e","Fragment","t","DiscoveryStep","cpInput","setCpInput","useState","addProvider","raw","v","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","label","value","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader","StepIndicator","i"],"mappings":"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"}