@hotmeshio/long-tail 0.2.10 → 0.3.1

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 (241) hide show
  1. package/build/api/topics.d.ts +22 -0
  2. package/build/api/topics.js +104 -0
  3. package/build/index.d.ts +3 -1
  4. package/build/index.js +7 -2
  5. package/build/lib/db/schemas/007_topic_catalog.sql +27 -0
  6. package/build/routes/index.js +2 -0
  7. package/build/routes/topics.d.ts +2 -0
  8. package/build/routes/topics.js +90 -0
  9. package/build/services/topics/index.d.ts +77 -0
  10. package/build/services/topics/index.js +116 -0
  11. package/build/services/topics/sql.d.ts +10 -0
  12. package/build/services/topics/sql.js +80 -0
  13. package/build/services/topics/system-topics.d.ts +11 -0
  14. package/build/services/topics/system-topics.js +270 -0
  15. package/build/start/workers.js +5 -0
  16. package/build/system/mcp-servers/events.js +73 -1
  17. package/build/system/seed/tool-manifests-events.d.ts +75 -0
  18. package/build/system/seed/tool-manifests-events.js +27 -0
  19. package/build/tsconfig.tsbuildinfo +1 -1
  20. package/build/types/index.d.ts +2 -2
  21. package/build/types/startup.d.ts +27 -0
  22. package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +2 -0
  23. package/dashboard/dist/assets/{AdminDashboard-45Ya2uzl.js.map → AdminDashboard-CbeSejVX.js.map} +1 -1
  24. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +13 -0
  25. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +1 -0
  26. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +4 -0
  27. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js.map +1 -0
  28. package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js → AgentsPage-Bz61Nl-x.js} +2 -2
  29. package/dashboard/dist/assets/{AgentsPage--I4d5y9J.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
  30. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
  31. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js.map +1 -0
  32. package/dashboard/dist/assets/{BotPicker-DgbzCesR.js → BotPicker-kKBifD1w.js} +2 -2
  33. package/dashboard/dist/assets/{BotPicker-DgbzCesR.js.map → BotPicker-kKBifD1w.js.map} +1 -1
  34. package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js → CapabilitiesPage-Ch5qY0I7.js} +2 -2
  35. package/dashboard/dist/assets/{CapabilitiesPage-B2S8_Gsc.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
  36. package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js → CollapsibleSection-kYTBL7dT.js} +2 -2
  37. package/dashboard/dist/assets/{CollapsibleSection-4Eo3b5ha.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
  38. package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js → ConfirmDeleteModal-CcaAapMl.js} +2 -2
  39. package/dashboard/dist/assets/{ConfirmDeleteModal-Bac7RmDD.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
  40. package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js → CopyableId-B4CL12pv.js} +2 -2
  41. package/dashboard/dist/assets/{CopyableId-BhwdwAJN.js.map → CopyableId-B4CL12pv.js.map} +1 -1
  42. package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js → CredentialsPage-D1VAlwid.js} +2 -2
  43. package/dashboard/dist/assets/{CredentialsPage-CSEBaYx1.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
  44. package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js → CronLabel-DRmO5rH0.js} +2 -2
  45. package/dashboard/dist/assets/{CronLabel-DV2v2FlP.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
  46. package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
  47. package/dashboard/dist/assets/{CustomDurationPicker-B_Oxq_nK.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
  48. package/dashboard/dist/assets/{DataTable-etck0Zmp.js → DataTable-J5R6mepB.js} +2 -2
  49. package/dashboard/dist/assets/{DataTable-etck0Zmp.js.map → DataTable-J5R6mepB.js.map} +1 -1
  50. package/dashboard/dist/assets/{DropZone-BDpzHWsI.js → DropZone-DwNj3GiG.js} +2 -2
  51. package/dashboard/dist/assets/{DropZone-BDpzHWsI.js.map → DropZone-DwNj3GiG.js.map} +1 -1
  52. package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js → ElapsedCell-ChyMzl9n.js} +2 -2
  53. package/dashboard/dist/assets/{ElapsedCell-D35Z-HSJ.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
  54. package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js → EmptyState-BXGvOADa.js} +2 -2
  55. package/dashboard/dist/assets/{EmptyState-Bk3_P-b8.js.map → EmptyState-BXGvOADa.js.map} +1 -1
  56. package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js → EscalationsOverview-DM6zmE4g.js} +2 -2
  57. package/dashboard/dist/assets/{EscalationsOverview-Bt6gGFW4.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
  58. package/dashboard/dist/assets/{EventTable-BMk93q8A.js → EventTable-CvJ98E8s.js} +2 -2
  59. package/dashboard/dist/assets/{EventTable-BMk93q8A.js.map → EventTable-CvJ98E8s.js.map} +1 -1
  60. package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js → EventTopicPill-CB_rIGlL.js} +2 -2
  61. package/dashboard/dist/assets/{EventTopicPill-9LcMnLF0.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
  62. package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js → FilterBar-Bdssa-Xn.js} +2 -2
  63. package/dashboard/dist/assets/{FilterBar-CZGTOMoo.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
  64. package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js → HomePage-BuZkdXZt.js} +2 -2
  65. package/dashboard/dist/assets/{HomePage-Dtk7mgmf.js.map → HomePage-BuZkdXZt.js.map} +1 -1
  66. package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js → ListToolbar-jy8NL6ll.js} +2 -2
  67. package/dashboard/dist/assets/{ListToolbar-CJEzypCM.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
  68. package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js → McpOverview-xkaKuHbX.js} +2 -2
  69. package/dashboard/dist/assets/{McpOverview-ChUa4l3t.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
  70. package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js → McpQueryDetailPage-D5ICn6cR.js} +2 -2
  71. package/dashboard/dist/assets/{McpQueryDetailPage-04CTIN0v.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
  72. package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js → McpQueryPage-C46fzfm5.js} +2 -2
  73. package/dashboard/dist/assets/{McpQueryPage-DFnHFdbr.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
  74. package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
  75. package/dashboard/dist/assets/{McpRunDetailPage-B95c3bFw.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js → McpRunsPage-DT-armx5.js} +2 -2
  77. package/dashboard/dist/assets/{McpRunsPage-DS43YmLU.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
  78. package/dashboard/dist/assets/{Modal-EUrK2c_A.js → Modal-C6k6_5KB.js} +2 -2
  79. package/dashboard/dist/assets/{Modal-EUrK2c_A.js.map → Modal-C6k6_5KB.js.map} +1 -1
  80. package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js → OperatorDashboard-e5N3_dVl.js} +2 -2
  81. package/dashboard/dist/assets/{OperatorDashboard-DBF_AbRH.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
  82. package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js → PageHeader-COcgWWf-.js} +2 -2
  83. package/dashboard/dist/assets/{PageHeader-BuUnJ5NY.js.map → PageHeader-COcgWWf-.js.map} +1 -1
  84. package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js → PageHeaderWithStats-C0PCY3aJ.js} +2 -2
  85. package/dashboard/dist/assets/{PageHeaderWithStats-cQKaJBAM.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
  86. package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js → PriorityBadge-BQCsYMpM.js} +2 -2
  87. package/dashboard/dist/assets/{PriorityBadge-Bl0_pgex.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
  88. package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
  89. package/dashboard/dist/assets/{ProcessDetailPage-DgeXrHon.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
  90. package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js → ProcessesListPage-iyPsmlhm.js} +2 -2
  91. package/dashboard/dist/assets/{ProcessesListPage-BGiiH4dW.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
  92. package/dashboard/dist/assets/{RolePill-DsYF2JN9.js → RolePill-CHwys1f9.js} +2 -2
  93. package/dashboard/dist/assets/{RolePill-DsYF2JN9.js.map → RolePill-CHwys1f9.js.map} +1 -1
  94. package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js → RolesPage-Bmc3XaUk.js} +2 -2
  95. package/dashboard/dist/assets/{RolesPage-CQ7vPamb.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
  96. package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js → RowActions-Bs4PF-Gd.js} +2 -2
  97. package/dashboard/dist/assets/{RowActions-DBpvm3Jy.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
  98. package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js → RunAsSelector-DXzAr2WW.js} +2 -2
  99. package/dashboard/dist/assets/{RunAsSelector-ZLKGTYP_.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
  100. package/dashboard/dist/assets/{ServerName-B5-E7gZD.js → ServerName-BIdLC1Ay.js} +2 -2
  101. package/dashboard/dist/assets/{ServerName-B5-E7gZD.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
  102. package/dashboard/dist/assets/{StatCard-B7ySTryP.js → StatCard-OKzRSSx4.js} +2 -2
  103. package/dashboard/dist/assets/{StatCard-B7ySTryP.js.map → StatCard-OKzRSSx4.js.map} +1 -1
  104. package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js → StatusBadge-CQlF46RR.js} +2 -2
  105. package/dashboard/dist/assets/{StatusBadge-DNXTk01O.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
  106. package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js → StepIndicator-CP7eycjI.js} +2 -2
  107. package/dashboard/dist/assets/{StepIndicator-ftNmaJsu.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
  108. package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js → StickyPagination-CGk8VAKt.js} +2 -2
  109. package/dashboard/dist/assets/{StickyPagination-CI5AyVVd.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
  110. package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js → SwimlaneTimeline-MEUPc3yJ.js} +2 -2
  111. package/dashboard/dist/assets/{SwimlaneTimeline-BA4aFrHf.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
  112. package/dashboard/dist/assets/{TagInput-DfbVwc27.js → TagInput-BGxXKiWD.js} +2 -2
  113. package/dashboard/dist/assets/{TagInput-DfbVwc27.js.map → TagInput-BGxXKiWD.js.map} +1 -1
  114. package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js → TaskDetailPage-pN5BXzYA.js} +2 -2
  115. package/dashboard/dist/assets/{TaskDetailPage-A_kHjYRn.js.map → TaskDetailPage-pN5BXzYA.js.map} +1 -1
  116. package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js → TaskQueuePill-bw8ieKsf.js} +2 -2
  117. package/dashboard/dist/assets/{TaskQueuePill-Dtsa8CPO.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
  118. package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js → TasksListPage-D1INzcrA.js} +2 -2
  119. package/dashboard/dist/assets/{TasksListPage-Cw46VTuA.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
  120. package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js → TimeAgo-CywLVIBA.js} +2 -2
  121. package/dashboard/dist/assets/{TimeAgo-Cx1kK1id.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
  122. package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js → TimestampCell-B4Pc6f3A.js} +2 -2
  123. package/dashboard/dist/assets/{TimestampCell-VDp4nVn6.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
  124. package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js → ToolPill-DdLN3JOT.js} +2 -2
  125. package/dashboard/dist/assets/{ToolPill-BNaTJhu8.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
  126. package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js → ToolTestPanel-DusbUka5.js} +2 -2
  127. package/dashboard/dist/assets/{ToolTestPanel-BickLBjP.js.map → ToolTestPanel-DusbUka5.js.map} +1 -1
  128. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +9 -0
  129. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +1 -0
  130. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +2 -0
  131. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js.map +1 -0
  132. package/dashboard/dist/assets/{UserName-DCdb6xnk.js → UserName-CLbusknU.js} +2 -2
  133. package/dashboard/dist/assets/{UserName-DCdb6xnk.js.map → UserName-CLbusknU.js.map} +1 -1
  134. package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js → WorkflowExecutionPage-C61R-3Gg.js} +2 -2
  135. package/dashboard/dist/assets/{WorkflowExecutionPage-BZfxY1iB.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
  136. package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js → WorkflowPill-7vt2F6wR.js} +2 -2
  137. package/dashboard/dist/assets/{WorkflowPill-BzhfqGa-.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
  138. package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js → WorkflowsDashboard-BWiUNvyl.js} +2 -2
  139. package/dashboard/dist/assets/{WorkflowsDashboard-B7M8kPoH.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
  140. package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js → WorkflowsOverview-DA2ZOs7D.js} +2 -2
  141. package/dashboard/dist/assets/{WorkflowsOverview-1V8vQ-mo.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
  142. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
  143. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js.map +1 -0
  144. package/dashboard/dist/assets/{agents-SXs4tMLb.js → agents-Dga6NU7U.js} +2 -2
  145. package/dashboard/dist/assets/{agents-SXs4tMLb.js.map → agents-Dga6NU7U.js.map} +1 -1
  146. package/dashboard/dist/assets/{bots-Ci5aCzDK.js → bots-CtU4i4OQ.js} +2 -2
  147. package/dashboard/dist/assets/{bots-Ci5aCzDK.js.map → bots-CtU4i4OQ.js.map} +1 -1
  148. package/dashboard/dist/assets/{controlplane-BiPTCZeL.js → controlplane-BVoALhbL.js} +2 -2
  149. package/dashboard/dist/assets/{controlplane-BiPTCZeL.js.map → controlplane-BVoALhbL.js.map} +1 -1
  150. package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
  151. package/dashboard/dist/assets/escalation-_N5GfuIi.js.map +1 -0
  152. package/dashboard/dist/assets/{escalation-columns-Bpp7Sdbd.js → escalation-columns-CoTmTpHp.js} +2 -2
  153. package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js.map +1 -0
  154. package/dashboard/dist/assets/{helpers-CQZkvg6D.js → helpers-Dz2U3Ctb.js} +2 -2
  155. package/dashboard/dist/assets/{helpers-CQZkvg6D.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-C7FUIcaY.js → index-6Kd78p_v.js} +2 -2
  157. package/dashboard/dist/assets/{index-C7FUIcaY.js.map → index-6Kd78p_v.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-DOE7HCzb.js → index-B9ealjkt.js} +4 -4
  159. package/dashboard/dist/assets/{index-DOE7HCzb.js.map → index-B9ealjkt.js.map} +1 -1
  160. package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
  161. package/dashboard/dist/assets/{index-hfravTJF.js → index-BWHDW_CF.js} +2 -2
  162. package/dashboard/dist/assets/{index-hfravTJF.js.map → index-BWHDW_CF.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-DtbAmRkr.js → index-BYwPVJv0.js} +2 -2
  164. package/dashboard/dist/assets/{index-DtbAmRkr.js.map → index-BYwPVJv0.js.map} +1 -1
  165. package/dashboard/dist/assets/index-CCOSf1PY.js +281 -0
  166. package/dashboard/dist/assets/index-CCOSf1PY.js.map +1 -0
  167. package/dashboard/dist/assets/{index-DV0_tQW3.js → index-CS61sh5q.js} +2 -2
  168. package/dashboard/dist/assets/{index-DV0_tQW3.js.map → index-CS61sh5q.js.map} +1 -1
  169. package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
  170. package/dashboard/dist/assets/index-CtbG3UN-.js.map +1 -0
  171. package/dashboard/dist/assets/{index-CSsOukxa.js → index-DWUunWxh.js} +2 -2
  172. package/dashboard/dist/assets/{index-CSsOukxa.js.map → index-DWUunWxh.js.map} +1 -1
  173. package/dashboard/dist/assets/{index-COiEQlp9.js → index-D_H_Prht.js} +2 -2
  174. package/dashboard/dist/assets/{index-COiEQlp9.js.map → index-D_H_Prht.js.map} +1 -1
  175. package/dashboard/dist/assets/{index-q4T_i7zT.js → index-Dpjguclc.js} +2 -2
  176. package/dashboard/dist/assets/{index-q4T_i7zT.js.map → index-Dpjguclc.js.map} +1 -1
  177. package/dashboard/dist/assets/{index-OTsFiHXP.js → index-QicYdUsl.js} +2 -2
  178. package/dashboard/dist/assets/index-QicYdUsl.js.map +1 -0
  179. package/dashboard/dist/assets/{index-Bp5f2OWJ.js → index-dM-OgCY3.js} +2 -2
  180. package/dashboard/dist/assets/{index-Bp5f2OWJ.js.map → index-dM-OgCY3.js.map} +1 -1
  181. package/dashboard/dist/assets/{knowledge-D8osen1O.js → knowledge-DJlebU82.js} +2 -2
  182. package/dashboard/dist/assets/{knowledge-D8osen1O.js.map → knowledge-DJlebU82.js.map} +1 -1
  183. package/dashboard/dist/assets/{mcp-CUFhWTyT.js → mcp-CsLJ5SRm.js} +2 -2
  184. package/dashboard/dist/assets/{mcp-CUFhWTyT.js.map → mcp-CsLJ5SRm.js.map} +1 -1
  185. package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js → mcp-query-WNK1ItRV.js} +2 -2
  186. package/dashboard/dist/assets/{mcp-query-n1t4sNm7.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
  187. package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js → mcp-runs-DtTTsuPH.js} +2 -2
  188. package/dashboard/dist/assets/{mcp-runs-BkRnXbcq.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
  189. package/dashboard/dist/assets/{namespaces-CacF05ft.js → namespaces-iRejH3_A.js} +2 -2
  190. package/dashboard/dist/assets/{namespaces-CacF05ft.js.map → namespaces-iRejH3_A.js.map} +1 -1
  191. package/dashboard/dist/assets/{roles-CjLCgM_6.js → roles-3Jm5KtKc.js} +2 -2
  192. package/dashboard/dist/assets/{roles-CjLCgM_6.js.map → roles-3Jm5KtKc.js.map} +1 -1
  193. package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
  194. package/dashboard/dist/assets/settings-DmN2I-c6.js.map +1 -0
  195. package/dashboard/dist/assets/{tasks-BLCzIHol.js → tasks-Cc-QoITQ.js} +2 -2
  196. package/dashboard/dist/assets/{tasks-BLCzIHol.js.map → tasks-Cc-QoITQ.js.map} +1 -1
  197. package/dashboard/dist/assets/topics-p8anbgi0.js +2 -0
  198. package/dashboard/dist/assets/topics-p8anbgi0.js.map +1 -0
  199. package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js → useEventHooks-VaJ52jMm.js} +2 -2
  200. package/dashboard/dist/assets/{useEventHooks-AwwZnweF.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
  201. package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
  202. package/dashboard/dist/assets/{useYamlActivityEvents-9Zs0PXY6.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
  203. package/dashboard/dist/assets/{users-BtLRzvZE.js → users-oXOlnold.js} +2 -2
  204. package/dashboard/dist/assets/{users-BtLRzvZE.js.map → users-oXOlnold.js.map} +1 -1
  205. package/dashboard/dist/assets/{vendor-icons-1qQ3NKfa.js → vendor-icons-CBOM6Es0.js} +99 -94
  206. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
  207. package/dashboard/dist/assets/{workflows-B9xdIsfM.js → workflows-Yq7cK-vR.js} +2 -2
  208. package/dashboard/dist/assets/{workflows-B9xdIsfM.js.map → workflows-Yq7cK-vR.js.map} +1 -1
  209. package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js → yaml-workflows-Ch53yD43.js} +2 -2
  210. package/dashboard/dist/assets/{yaml-workflows-xOJxyEsQ.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
  211. package/dashboard/dist/index.html +3 -3
  212. package/docs/agents.md +6 -0
  213. package/docs/api/http/topics.md +164 -0
  214. package/docs/api/sdk/topics.md +204 -0
  215. package/docs/dashboard.md +22 -0
  216. package/docs/events.md +7 -0
  217. package/docs/sdk.md +15 -0
  218. package/docs/topics.md +154 -0
  219. package/package.json +2 -2
  220. package/dashboard/dist/assets/AdminDashboard-45Ya2uzl.js +0 -2
  221. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js +0 -13
  222. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js.map +0 -1
  223. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js +0 -4
  224. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js.map +0 -1
  225. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js +0 -2
  226. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js.map +0 -1
  227. package/dashboard/dist/assets/CustomDurationPicker-B_Oxq_nK.js +0 -2
  228. package/dashboard/dist/assets/McpRunDetailPage-B95c3bFw.js +0 -2
  229. package/dashboard/dist/assets/ProcessDetailPage-DgeXrHon.js +0 -2
  230. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js +0 -2
  231. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js.map +0 -1
  232. package/dashboard/dist/assets/escalation-D-zr9D9G.js +0 -2
  233. package/dashboard/dist/assets/escalation-D-zr9D9G.js.map +0 -1
  234. package/dashboard/dist/assets/escalation-columns-Bpp7Sdbd.js.map +0 -1
  235. package/dashboard/dist/assets/index-BciXgS35.css +0 -1
  236. package/dashboard/dist/assets/index-Da8R5Fn_.js +0 -281
  237. package/dashboard/dist/assets/index-Da8R5Fn_.js.map +0 -1
  238. package/dashboard/dist/assets/index-DzL5pT70.js +0 -5
  239. package/dashboard/dist/assets/index-DzL5pT70.js.map +0 -1
  240. package/dashboard/dist/assets/index-OTsFiHXP.js.map +0 -1
  241. package/dashboard/dist/assets/vendor-icons-1qQ3NKfa.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage-Dtk7mgmf.js","sources":["../../src/pages/home/HomePage.tsx"],"sourcesContent":["import { useState, useRef, useCallback, useEffect } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n AlertCircle, Inbox, ListChecks, Wand2, Layers, Radio, ExternalLink, BookOpen, ChevronDown,\n} from 'lucide-react';\nimport { useEscalations } from '../../api/escalations';\nimport { useJobs } from '../../api/workflows';\nimport { useMcpRuns } from '../../api/mcp-runs';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { useProcesses } from '../../api/tasks';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationStatsEvents, useWorkflowListEvents, useProcessListEvents } from '../../hooks/useEventHooks';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { EventTopicPill } from '../../components/common/display/EventTopicPill';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\n\nconst STATUS_DOT: Record<string, string> = {\n completed: 'bg-status-success',\n active: 'bg-status-active',\n running: 'bg-status-active',\n pending: 'bg-status-pending',\n error: 'bg-status-error',\n failed: 'bg-status-error',\n};\nfunction statusDotClass(status: string): string {\n return STATUS_DOT[status] ?? 'bg-text-tertiary';\n}\n\n// ── Event colors ────────────────────────────────────────────────────────────\n\n\n// ── Live Feed ───────────────────────────────────────────────────────────────\n\ninterface FeedEvent { id: number; type: string; timestamp: string; label: string; data: Record<string, unknown>; }\nlet feedCounter = 0;\n\nfunction useLiveFeed(maxItems = 5) {\n const [events, setEvents] = useState<FeedEvent[]>([]);\n const [pulse, setPulse] = useState(false);\n const pulseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handler = useCallback((event: any) => {\n if (event.type?.startsWith('mesh.')) return;\n const label = event.activityName || event.workflowName || event.data?.domain || event.workflowId?.slice(0, 16) || '';\n setEvents((prev) => [{ id: ++feedCounter, type: event.type, timestamp: event.timestamp, label, data: event }, ...prev].slice(0, maxItems));\n setPulse(true);\n if (pulseTimer.current) clearTimeout(pulseTimer.current);\n pulseTimer.current = setTimeout(() => setPulse(false), 2000);\n }, [maxItems]);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, handler);\n return { events, pulse };\n}\n\n// ── Section header ──────────────────────────────────────────────────────────\n\nfunction SectionHeader({ icon: Icon, color, docsHash, children, actions }: { icon: React.ElementType; color?: string; docsHash?: string; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-4 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4.5 h-4.5 ${color || 'text-accent/60'}`} strokeWidth={1.5} />\n <h2 className=\"text-sm font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n <div className=\"flex items-center gap-2\">\n {docsHash && (\n <button onClick={() => { window.location.hash = docsHash; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Docs\">\n <BookOpen className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n )}\n {actions}\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel({ icon: Icon, text }: { icon: React.ElementType; text: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-10 text-center\">\n <Icon className=\"w-6 h-6 text-text-quaternary/50 mb-2\" strokeWidth={1} />\n <p className=\"text-xs text-text-quaternary\">{text}</p>\n </div>\n );\n}\n\n/** Middle-ellipsis: keep first N and last N chars with ... in between */\nfunction midEllipsis(s: string, maxLen = 37): string {\n if (!s || s.length <= maxLen) return s;\n const keep = Math.floor((maxLen - 3) / 2);\n return `${s.slice(0, keep)}...${s.slice(-keep)}`;\n}\n\n/** Consistent row for all execution lists in row 1 */\nfunction ExecutionRow({ dot, pill, id, date, onClick }: {\n dot: string;\n pill: React.ReactNode;\n id: string;\n date: string;\n onClick: () => void;\n}) {\n return (\n <button onClick={onClick} className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${dot}`} />\n <span className=\"text-[12px] text-text-primary font-mono truncate max-w-[60%]\">{midEllipsis(id)}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap\"><DateValue date={date} /></span>\n </div>\n <div className=\"pl-3.5 flex items-center gap-1 overflow-hidden\">{pill}</div>\n </button>\n );\n}\n\nfunction NavIcon({ to, icon: Icon, title }: { to: string; icon: React.ElementType; title: string }) {\n const navigate = useNavigate();\n return (\n <button\n onClick={() => navigate(to)}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title={title}\n >\n <Icon className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n );\n}\n\n// ── Namespace Picker ────────────────────────────────────────────────────────\n\nfunction AppPicker({ appIds, selected, onSelect }: {\n appIds: string[];\n selected: string;\n onSelect: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (appIds.length <= 1) return null;\n\n return (\n <div className=\"relative mb-3 -mt-2\" ref={ref}>\n <button\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors\"\n >\n {selected}\n <svg className={`w-2.5 h-2.5 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]\">\n {appIds.map((id) => (\n <button\n key={id}\n onClick={() => { onSelect(id); setOpen(false); }}\n className={`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${\n selected === id ? 'text-accent bg-accent/5' : 'text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {id}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Event stream row (expandable) ───────────────────────────────────────────\n\nfunction EventStreamRow({ event }: { event: FeedEvent }) {\n const [expanded, setExpanded] = useState(false);\n return (\n <div>\n <button onClick={() => setExpanded(!expanded)} className=\"w-full text-left px-1 py-2 hover:bg-surface-hover/50 rounded-md transition-colors flex items-center gap-2\">\n <ChevronDown className={`w-2.5 h-2.5 text-text-quaternary shrink-0 transition-transform ${expanded ? 'rotate-0' : '-rotate-90'}`} />\n <EventTopicPill topic={event.type} />\n <span className=\"text-[11px] text-text-secondary font-mono truncate flex-1\">{event.label || '—'}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0\"><DateValue date={event.timestamp} format=\"time\" /></span>\n </button>\n {expanded && (\n <div className=\"pl-5 pb-2\">\n <JsonViewer data={event.data} defaultCollapsed={false} />\n </div>\n )}\n </div>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function HomePage() {\n const navigate = useNavigate();\n const { user } = useAuth();\n const [searchParams, setSearchParams] = useSearchParams();\n const pipelineNs = searchParams.get('pipelinenamespace') || 'longtail';\n const durableNs = searchParams.get('durablenamespace') || 'durable';\n const setNs = useCallback((key: string, ns: string) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(key, ns);\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n useEscalationStatsEvents();\n useWorkflowListEvents();\n useProcessListEvents();\n\n const procQ = useProcesses({ limit: 5 });\n const jobsQ = useJobs({ limit: 5, sort_by: 'updated_at', order: 'desc', namespace: durableNs });\n const { data: cpData } = useControlPlaneApps();\n const allAppIds = (cpData?.apps ?? []).map((a: any) => a.appId);\n const durableAppIds = allAppIds;\n const pipelineAppIds = allAppIds;\n const mcpQ = useMcpRuns({ limit: 5, app_id: pipelineNs, sort_by: 'updated_at', order: 'desc' });\n const allEscQ = useEscalations({ status: 'pending', limit: 5, sort_by: 'updated_at', order: 'desc' });\n const myEscQ = useEscalations({ assigned_to: user?.userId, status: 'pending', limit: 5, sort_by: 'updated_at', order: 'desc' });\n const { events: liveEvents, pulse } = useLiveFeed();\n\n const processes = procQ.data?.processes ?? [];\n const jobs = jobsQ.data?.jobs ?? [];\n const mcpRuns = (mcpQ.data as any)?.jobs ?? [];\n const allEscalations = allEscQ.data?.escalations ?? [];\n const myEscalations = myEscQ.data?.escalations ?? [];\n\n return (\n <div>\n <h1 className=\"text-3xl font-light text-text-primary mb-10\">Recent Activity</h1>\n\n {/* ── Row 1: Processes | Durable Executions | Pipeline Executions ──── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-14\">\n\n {/* Col 1: Processes */}\n <div>\n <SectionHeader icon={Layers} color=\"text-emerald-400\" docsHash=\"#docs:dashboard.md:processes-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => procQ.refetch()} isFetching={procQ.isFetching} apiPath=\"/tasks/processes?limit=5\" />\n <NavIcon to=\"/processes/all\" icon={ExternalLink} title=\"All processes\" />\n </div>\n }>\n Certified Processes\n </SectionHeader>\n <div className=\"mb-3 -mt-2\">\n <span className=\"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest\">all namespaces</span>\n </div>\n {processes.length === 0 ? (\n <EmptyPanel icon={Layers} text=\"No recent processes\" />\n ) : (\n <div className=\"space-y-1\">\n {processes.map((p: any) => (\n <ExecutionRow\n key={p.origin_id}\n dot={(p.task_count ?? 0) > 0 && (p.completed ?? 0) >= (p.task_count ?? 0) ? 'bg-status-success' : (p.escalated ?? 0) > 0 ? 'border border-status-error' : 'bg-status-active'}\n pill={<>{(p.workflow_types ?? [p.workflow_type]).filter(Boolean).map((wt: string) => <WorkflowPill key={wt} type={wt} size=\"xs\" />)}</>}\n id={p.origin_id}\n date={p.last_activity ?? p.started_at}\n onClick={() => navigate(`/processes/detail/${p.origin_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Durable Executions */}\n <div>\n <SectionHeader icon={ListChecks} color=\"text-blue-400\" docsHash=\"#docs:dashboard.md:durable-executions\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => jobsQ.refetch()} isFetching={jobsQ.isFetching} apiPath={`/workflow-states/jobs?namespace=${durableNs}&limit=5`} />\n <NavIcon to=\"/workflows/executions\" icon={ExternalLink} title=\"All durable executions\" />\n </div>\n }>\n Durable Executions\n </SectionHeader>\n <AppPicker appIds={durableAppIds} selected={durableNs} onSelect={(ns) => setNs('durablenamespace', ns)} />\n {jobs.length === 0 ? (\n <EmptyPanel icon={ListChecks} text=\"No recent executions\" />\n ) : (\n <div className=\"space-y-1\">\n {jobs.map((job: any) => (\n <ExecutionRow\n key={job.workflow_id}\n dot={statusDotClass(job.status)}\n pill={<WorkflowPill type={job.entity || job.type || 'workflow'} size=\"xs\" />}\n id={job.workflow_id}\n date={job.updated_at ?? job.created_at}\n onClick={() => navigate(`/workflows/executions/${job.workflow_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 3: Pipeline Executions */}\n <div>\n <SectionHeader icon={Wand2} color=\"text-violet-400\" docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => mcpQ.refetch()} isFetching={mcpQ.isFetching} apiPath={`/mcp-runs?app_id=${pipelineNs}&limit=5`} />\n <NavIcon to=\"/mcp/executions\" icon={ExternalLink} title=\"All pipeline executions\" />\n </div>\n }>\n Pipeline Executions\n </SectionHeader>\n <AppPicker appIds={pipelineAppIds} selected={pipelineNs} onSelect={(ns) => setNs('pipelinenamespace', ns)} />\n {mcpRuns.length === 0 ? (\n <EmptyPanel icon={Wand2} text=\"No recent pipeline runs\" />\n ) : (\n <div className=\"space-y-1\">\n {mcpRuns.map((run: any) => (\n <ExecutionRow\n key={run.workflow_id}\n dot={statusDotClass(run.status)}\n pill={<WorkflowPill type={run.entity || run.workflow_name || 'pipeline'} variant=\"pipeline\" size=\"xs\" />}\n id={run.workflow_id}\n date={run.updated_at ?? run.created_at}\n onClick={() => navigate(`/mcp/executions/${run.workflow_id}?namespace=${pipelineNs}`)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Row 2: All Escalations | My Escalations | Event Stream ──────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14\">\n\n {/* Col 1: All Escalations */}\n <div>\n <SectionHeader icon={AlertCircle} color=\"text-amber-400\" docsHash=\"#docs:dashboard.md:all-escalations\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => allEscQ.refetch()} isFetching={allEscQ.isFetching} apiPath=\"/escalations?status=pending&limit=5&sort_by=priority&order=asc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All available escalations\" />\n </div>\n }>\n All Escalations\n </SectionHeader>\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={AlertCircle} text=\"No pending escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {allEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: My Escalations */}\n <div>\n <SectionHeader icon={Inbox} color=\"text-orange-400\" docsHash=\"#docs:dashboard.md:escalations-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => myEscQ.refetch()} isFetching={myEscQ.isFetching} apiPath={`/escalations?assigned_to=${user?.userId ?? ''}&status=pending&limit=5`} />\n <NavIcon to=\"/escalations/queue\" icon={ExternalLink} title=\"My escalation queue\" />\n </div>\n }>\n My Escalations\n </SectionHeader>\n {myEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No assigned escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {myEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 3: Event Stream */}\n <div>\n <SectionHeader icon={Radio} color=\"text-emerald-400\"\n actions={\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${pulse ? 'bg-emerald-400' : 'bg-zinc-600'}`} />\n <button\n onClick={() => { const btn = document.querySelector('[title=\"Fullscreen\"]') as HTMLButtonElement; btn?.click(); }}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"View all events\"\n >\n <ExternalLink className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n </div>\n }\n >\n Event Stream\n </SectionHeader>\n {liveEvents.length === 0 ? (\n <EmptyPanel icon={Radio} text=\"Events appear here in real time\" />\n ) : (\n <div className=\"divide-y divide-surface-border/20\">\n {liveEvents.map((ev) => (\n <EventStreamRow key={ev.id} event={ev} />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["STATUS_DOT","statusDotClass","status","feedCounter","useLiveFeed","maxItems","events","setEvents","useState","pulse","setPulse","pulseTimer","useRef","handler","useCallback","event","_a","label","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","SectionHeader","Icon","color","docsHash","children","actions","jsxDEV","BookOpen","EmptyPanel","text","midEllipsis","s","maxLen","keep","ExecutionRow","dot","pill","id","date","onClick","DateValue","NavIcon","to","title","navigate","useNavigate","AppPicker","appIds","selected","onSelect","open","setOpen","ref","useEffect","e","v","EventStreamRow","expanded","setExpanded","ChevronDown","EventTopicPill","JsonViewer","HomePage","user","useAuth","searchParams","setSearchParams","useSearchParams","pipelineNs","durableNs","setNs","key","ns","next","useEscalationStatsEvents","useWorkflowListEvents","useProcessListEvents","procQ","useProcesses","jobsQ","useJobs","cpData","useControlPlaneApps","allAppIds","a","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useEscalations","myEscQ","liveEvents","processes","jobs","mcpRuns","allEscalations","_d","myEscalations","_e","Layers","ListToolbar","ExternalLink","p","wt","WorkflowPill","ListChecks","job","Wand2","run","AlertCircle","esc","RolePill","Inbox","Radio","btn","ev"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage-BuZkdXZt.js","sources":["../../src/pages/home/HomePage.tsx"],"sourcesContent":["import { useState, useRef, useCallback, useEffect } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n AlertCircle, Inbox, ListChecks, Wand2, Layers, Radio, ExternalLink, BookOpen, ChevronDown,\n} from 'lucide-react';\nimport { useEscalations } from '../../api/escalations';\nimport { useJobs } from '../../api/workflows';\nimport { useMcpRuns } from '../../api/mcp-runs';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { useProcesses } from '../../api/tasks';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationStatsEvents, useWorkflowListEvents, useProcessListEvents } from '../../hooks/useEventHooks';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { EventTopicPill } from '../../components/common/display/EventTopicPill';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\n\nconst STATUS_DOT: Record<string, string> = {\n completed: 'bg-status-success',\n active: 'bg-status-active',\n running: 'bg-status-active',\n pending: 'bg-status-pending',\n error: 'bg-status-error',\n failed: 'bg-status-error',\n};\nfunction statusDotClass(status: string): string {\n return STATUS_DOT[status] ?? 'bg-text-tertiary';\n}\n\n// ── Event colors ────────────────────────────────────────────────────────────\n\n\n// ── Live Feed ───────────────────────────────────────────────────────────────\n\ninterface FeedEvent { id: number; type: string; timestamp: string; label: string; data: Record<string, unknown>; }\nlet feedCounter = 0;\n\nfunction useLiveFeed(maxItems = 5) {\n const [events, setEvents] = useState<FeedEvent[]>([]);\n const [pulse, setPulse] = useState(false);\n const pulseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handler = useCallback((event: any) => {\n if (event.type?.startsWith('mesh.')) return;\n const label = event.activityName || event.workflowName || event.data?.domain || event.workflowId?.slice(0, 16) || '';\n setEvents((prev) => [{ id: ++feedCounter, type: event.type, timestamp: event.timestamp, label, data: event }, ...prev].slice(0, maxItems));\n setPulse(true);\n if (pulseTimer.current) clearTimeout(pulseTimer.current);\n pulseTimer.current = setTimeout(() => setPulse(false), 2000);\n }, [maxItems]);\n\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.>`, handler);\n return { events, pulse };\n}\n\n// ── Section header ──────────────────────────────────────────────────────────\n\nfunction SectionHeader({ icon: Icon, color, docsHash, children, actions }: { icon: React.ElementType; color?: string; docsHash?: string; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-4 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4.5 h-4.5 ${color || 'text-accent/60'}`} strokeWidth={1.5} />\n <h2 className=\"text-sm font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n <div className=\"flex items-center gap-2\">\n {docsHash && (\n <button onClick={() => { window.location.hash = docsHash; }} className=\"text-text-quaternary hover:text-accent transition-colors\" title=\"Docs\">\n <BookOpen className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n )}\n {actions}\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel({ icon: Icon, text }: { icon: React.ElementType; text: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-10 text-center\">\n <Icon className=\"w-6 h-6 text-text-quaternary/50 mb-2\" strokeWidth={1} />\n <p className=\"text-xs text-text-quaternary\">{text}</p>\n </div>\n );\n}\n\n/** Middle-ellipsis: keep first N and last N chars with ... in between */\nfunction midEllipsis(s: string, maxLen = 37): string {\n if (!s || s.length <= maxLen) return s;\n const keep = Math.floor((maxLen - 3) / 2);\n return `${s.slice(0, keep)}...${s.slice(-keep)}`;\n}\n\n/** Consistent row for all execution lists in row 1 */\nfunction ExecutionRow({ dot, pill, id, date, onClick }: {\n dot: string;\n pill: React.ReactNode;\n id: string;\n date: string;\n onClick: () => void;\n}) {\n return (\n <button onClick={onClick} className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${dot}`} />\n <span className=\"text-[12px] text-text-primary font-mono truncate max-w-[60%]\">{midEllipsis(id)}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap\"><DateValue date={date} /></span>\n </div>\n <div className=\"pl-3.5 flex items-center gap-1 overflow-hidden\">{pill}</div>\n </button>\n );\n}\n\nfunction NavIcon({ to, icon: Icon, title }: { to: string; icon: React.ElementType; title: string }) {\n const navigate = useNavigate();\n return (\n <button\n onClick={() => navigate(to)}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title={title}\n >\n <Icon className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n );\n}\n\n// ── Namespace Picker ────────────────────────────────────────────────────────\n\nfunction AppPicker({ appIds, selected, onSelect }: {\n appIds: string[];\n selected: string;\n onSelect: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (appIds.length <= 1) return null;\n\n return (\n <div className=\"relative mb-3 -mt-2\" ref={ref}>\n <button\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1 px-2 py-0.5 text-[10px] rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors\"\n >\n {selected}\n <svg className={`w-2.5 h-2.5 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-30 py-1 min-w-[120px]\">\n {appIds.map((id) => (\n <button\n key={id}\n onClick={() => { onSelect(id); setOpen(false); }}\n className={`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${\n selected === id ? 'text-accent bg-accent/5' : 'text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {id}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Event stream row (expandable) ───────────────────────────────────────────\n\nfunction EventStreamRow({ event }: { event: FeedEvent }) {\n const [expanded, setExpanded] = useState(false);\n return (\n <div>\n <button onClick={() => setExpanded(!expanded)} className=\"w-full text-left px-1 py-2 hover:bg-surface-hover/50 rounded-md transition-colors flex items-center gap-2\">\n <ChevronDown className={`w-2.5 h-2.5 text-text-quaternary shrink-0 transition-transform ${expanded ? 'rotate-0' : '-rotate-90'}`} />\n <EventTopicPill topic={event.type} />\n <span className=\"text-[11px] text-text-secondary font-mono truncate flex-1\">{event.label || '—'}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0\"><DateValue date={event.timestamp} format=\"time\" /></span>\n </button>\n {expanded && (\n <div className=\"pl-5 pb-2\">\n <JsonViewer data={event.data} defaultCollapsed={false} />\n </div>\n )}\n </div>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function HomePage() {\n const navigate = useNavigate();\n const { user } = useAuth();\n const [searchParams, setSearchParams] = useSearchParams();\n const pipelineNs = searchParams.get('pipelinenamespace') || 'longtail';\n const durableNs = searchParams.get('durablenamespace') || 'durable';\n const setNs = useCallback((key: string, ns: string) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(key, ns);\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n useEscalationStatsEvents();\n useWorkflowListEvents();\n useProcessListEvents();\n\n const procQ = useProcesses({ limit: 5 });\n const jobsQ = useJobs({ limit: 5, sort_by: 'updated_at', order: 'desc', namespace: durableNs });\n const { data: cpData } = useControlPlaneApps();\n const allAppIds = (cpData?.apps ?? []).map((a: any) => a.appId);\n const durableAppIds = allAppIds;\n const pipelineAppIds = allAppIds;\n const mcpQ = useMcpRuns({ limit: 5, app_id: pipelineNs, sort_by: 'updated_at', order: 'desc' });\n const allEscQ = useEscalations({ status: 'pending', limit: 5, sort_by: 'updated_at', order: 'desc' });\n const myEscQ = useEscalations({ assigned_to: user?.userId, status: 'pending', limit: 5, sort_by: 'updated_at', order: 'desc' });\n const { events: liveEvents, pulse } = useLiveFeed();\n\n const processes = procQ.data?.processes ?? [];\n const jobs = jobsQ.data?.jobs ?? [];\n const mcpRuns = (mcpQ.data as any)?.jobs ?? [];\n const allEscalations = allEscQ.data?.escalations ?? [];\n const myEscalations = myEscQ.data?.escalations ?? [];\n\n return (\n <div>\n <h1 className=\"text-3xl font-light text-text-primary mb-10\">Recent Activity</h1>\n\n {/* ── Row 1: Processes | Durable Executions | Pipeline Executions ──── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-14\">\n\n {/* Col 1: Processes */}\n <div>\n <SectionHeader icon={Layers} color=\"text-emerald-400\" docsHash=\"#docs:dashboard.md:processes-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => procQ.refetch()} isFetching={procQ.isFetching} apiPath=\"/tasks/processes?limit=5\" />\n <NavIcon to=\"/processes/all\" icon={ExternalLink} title=\"All processes\" />\n </div>\n }>\n Certified Processes\n </SectionHeader>\n <div className=\"mb-3 -mt-2\">\n <span className=\"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest\">all namespaces</span>\n </div>\n {processes.length === 0 ? (\n <EmptyPanel icon={Layers} text=\"No recent processes\" />\n ) : (\n <div className=\"space-y-1\">\n {processes.map((p: any) => (\n <ExecutionRow\n key={p.origin_id}\n dot={(p.task_count ?? 0) > 0 && (p.completed ?? 0) >= (p.task_count ?? 0) ? 'bg-status-success' : (p.escalated ?? 0) > 0 ? 'border border-status-error' : 'bg-status-active'}\n pill={<>{(p.workflow_types ?? [p.workflow_type]).filter(Boolean).map((wt: string) => <WorkflowPill key={wt} type={wt} size=\"xs\" />)}</>}\n id={p.origin_id}\n date={p.last_activity ?? p.started_at}\n onClick={() => navigate(`/processes/detail/${p.origin_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Durable Executions */}\n <div>\n <SectionHeader icon={ListChecks} color=\"text-blue-400\" docsHash=\"#docs:dashboard.md:durable-executions\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => jobsQ.refetch()} isFetching={jobsQ.isFetching} apiPath={`/workflow-states/jobs?namespace=${durableNs}&limit=5`} />\n <NavIcon to=\"/workflows/executions\" icon={ExternalLink} title=\"All durable executions\" />\n </div>\n }>\n Durable Executions\n </SectionHeader>\n <AppPicker appIds={durableAppIds} selected={durableNs} onSelect={(ns) => setNs('durablenamespace', ns)} />\n {jobs.length === 0 ? (\n <EmptyPanel icon={ListChecks} text=\"No recent executions\" />\n ) : (\n <div className=\"space-y-1\">\n {jobs.map((job: any) => (\n <ExecutionRow\n key={job.workflow_id}\n dot={statusDotClass(job.status)}\n pill={<WorkflowPill type={job.entity || job.type || 'workflow'} size=\"xs\" />}\n id={job.workflow_id}\n date={job.updated_at ?? job.created_at}\n onClick={() => navigate(`/workflows/executions/${job.workflow_id}`)}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Col 3: Pipeline Executions */}\n <div>\n <SectionHeader icon={Wand2} color=\"text-violet-400\" docsHash=\"#docs:dashboard.md:mcp-pipeline-tools\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => mcpQ.refetch()} isFetching={mcpQ.isFetching} apiPath={`/mcp-runs?app_id=${pipelineNs}&limit=5`} />\n <NavIcon to=\"/mcp/executions\" icon={ExternalLink} title=\"All pipeline executions\" />\n </div>\n }>\n Pipeline Executions\n </SectionHeader>\n <AppPicker appIds={pipelineAppIds} selected={pipelineNs} onSelect={(ns) => setNs('pipelinenamespace', ns)} />\n {mcpRuns.length === 0 ? (\n <EmptyPanel icon={Wand2} text=\"No recent pipeline runs\" />\n ) : (\n <div className=\"space-y-1\">\n {mcpRuns.map((run: any) => (\n <ExecutionRow\n key={run.workflow_id}\n dot={statusDotClass(run.status)}\n pill={<WorkflowPill type={run.entity || run.workflow_name || 'pipeline'} variant=\"pipeline\" size=\"xs\" />}\n id={run.workflow_id}\n date={run.updated_at ?? run.created_at}\n onClick={() => navigate(`/mcp/executions/${run.workflow_id}?namespace=${pipelineNs}`)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Row 2: All Escalations | My Escalations | Event Stream ──────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14\">\n\n {/* Col 1: All Escalations */}\n <div>\n <SectionHeader icon={AlertCircle} color=\"text-amber-400\" docsHash=\"#docs:dashboard.md:all-escalations\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => allEscQ.refetch()} isFetching={allEscQ.isFetching} apiPath=\"/escalations?status=pending&limit=5&sort_by=priority&order=asc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All available escalations\" />\n </div>\n }>\n All Escalations\n </SectionHeader>\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={AlertCircle} text=\"No pending escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {allEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: My Escalations */}\n <div>\n <SectionHeader icon={Inbox} color=\"text-orange-400\" docsHash=\"#docs:dashboard.md:escalations-overview\" actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar onRefresh={() => myEscQ.refetch()} isFetching={myEscQ.isFetching} apiPath={`/escalations?assigned_to=${user?.userId ?? ''}&status=pending&limit=5`} />\n <NavIcon to=\"/escalations/queue\" icon={ExternalLink} title=\"My escalation queue\" />\n </div>\n }>\n My Escalations\n </SectionHeader>\n {myEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No assigned escalations\" />\n ) : (\n <div className=\"space-y-1\">\n {myEscalations.map((esc: any) => (\n <button\n key={esc.id}\n onClick={() => navigate(`/escalations/detail/${esc.id}`)}\n className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-[9px] text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-[12px] text-text-primary truncate flex-1 max-w-[65%]\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-auto\"><DateValue date={esc.updated_at ?? esc.created_at} /></span>\n </div>\n <div className=\"flex items-center gap-2 pl-5\">\n <WorkflowPill type={esc.type || 'unknown'} size=\"xs\" />\n <span className=\"flex-1\" />\n <RolePill role={esc.role} />\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 3: Event Stream */}\n <div>\n <SectionHeader icon={Radio} color=\"text-emerald-400\"\n actions={\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${pulse ? 'bg-emerald-400' : 'bg-zinc-600'}`} />\n <button\n onClick={() => { const btn = document.querySelector('[title=\"Fullscreen\"]') as HTMLButtonElement; btn?.click(); }}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"View all events\"\n >\n <ExternalLink className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n </div>\n }\n >\n Event Stream\n </SectionHeader>\n {liveEvents.length === 0 ? (\n <EmptyPanel icon={Radio} text=\"Events appear here in real time\" />\n ) : (\n <div className=\"divide-y divide-surface-border/20\">\n {liveEvents.map((ev) => (\n <EventStreamRow key={ev.id} event={ev} />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["STATUS_DOT","statusDotClass","status","feedCounter","useLiveFeed","maxItems","events","setEvents","useState","pulse","setPulse","pulseTimer","useRef","handler","useCallback","event","_a","label","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","SectionHeader","Icon","color","docsHash","children","actions","jsxDEV","BookOpen","EmptyPanel","text","midEllipsis","s","maxLen","keep","ExecutionRow","dot","pill","id","date","onClick","DateValue","NavIcon","to","title","navigate","useNavigate","AppPicker","appIds","selected","onSelect","open","setOpen","ref","useEffect","e","v","EventStreamRow","expanded","setExpanded","ChevronDown","EventTopicPill","JsonViewer","HomePage","user","useAuth","searchParams","setSearchParams","useSearchParams","pipelineNs","durableNs","setNs","key","ns","next","useEscalationStatsEvents","useWorkflowListEvents","useProcessListEvents","procQ","useProcesses","jobsQ","useJobs","cpData","useControlPlaneApps","allAppIds","a","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useEscalations","myEscQ","liveEvents","processes","jobs","mcpRuns","allEscalations","_d","myEscalations","_e","Layers","ListToolbar","ExternalLink","p","wt","WorkflowPill","ListChecks","job","Wand2","run","AlertCircle","esc","RolePill","Inbox","Radio","btn","ev"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as o,G as N}from"./index-Da8R5Fn_.js";import{a as x}from"./vendor-query-DLp59M9_.js";import{H as c,ay as h,az as f,am as T}from"./vendor-icons-1qQ3NKfa.js";function j({onRefresh:u,isFetching:n=!1,apiPath:e}){const[l,i]=x.useState(null),m=(s,t)=>{navigator.clipboard.writeText(s).then(()=>{i(t),setTimeout(()=>i(null),2e3)})},d=()=>{if(!e)return;const s=`${window.location.origin}/api${e}`;m(s,"url")},b=()=>{if(!e)return;const s=`${window.location.origin}/api${e}`,t=N(),p=t?`curl -H "Authorization: Bearer ${t}" "${s}"`:`curl "${s}"`;m(p,"curl")},r="p-1 text-text-quaternary hover:text-accent transition-colors rounded",a="w-2.5 h-2.5";return o.jsxDEV("div",{className:"flex items-center gap-0.5",children:[e&&o.jsxDEV(o.Fragment,{children:[o.jsxDEV("button",{onClick:d,className:r,title:"Copy API URL",children:l==="url"?o.jsxDEV(c,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:33},this):o.jsxDEV(h,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:87},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:51,columnNumber:11},this),o.jsxDEV("button",{onClick:b,className:r,title:"Copy curl (includes auth token)",children:l==="curl"?o.jsxDEV(c,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:34},this):o.jsxDEV(f,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:88},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:54,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:50,columnNumber:9},this),o.jsxDEV("button",{onClick:u,disabled:n,className:`${r} disabled:opacity-50`,title:"Refresh",children:o.jsxDEV(T,{className:`${a} ${n?"animate-spin":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:60,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:48,columnNumber:5},this)}export{j as L};
2
- //# sourceMappingURL=ListToolbar-CJEzypCM.js.map
1
+ import{j as o,E as N}from"./index-CCOSf1PY.js";import{a as x}from"./vendor-query-DLp59M9_.js";import{H as c,ay as h,az as f,am as T}from"./vendor-icons-CBOM6Es0.js";function E({onRefresh:u,isFetching:n=!1,apiPath:e}){const[l,i]=x.useState(null),m=(s,t)=>{navigator.clipboard.writeText(s).then(()=>{i(t),setTimeout(()=>i(null),2e3)})},d=()=>{if(!e)return;const s=`${window.location.origin}/api${e}`;m(s,"url")},b=()=>{if(!e)return;const s=`${window.location.origin}/api${e}`,t=N(),p=t?`curl -H "Authorization: Bearer ${t}" "${s}"`:`curl "${s}"`;m(p,"curl")},r="p-1 text-text-quaternary hover:text-accent transition-colors rounded",a="w-2.5 h-2.5";return o.jsxDEV("div",{className:"flex items-center gap-0.5",children:[e&&o.jsxDEV(o.Fragment,{children:[o.jsxDEV("button",{onClick:d,className:r,title:"Copy API URL",children:l==="url"?o.jsxDEV(c,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:33},this):o.jsxDEV(h,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:52,columnNumber:87},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:51,columnNumber:11},this),o.jsxDEV("button",{onClick:b,className:r,title:"Copy curl (includes auth token)",children:l==="curl"?o.jsxDEV(c,{className:`${a} text-status-success`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:34},this):o.jsxDEV(f,{className:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:55,columnNumber:88},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:54,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:50,columnNumber:9},this),o.jsxDEV("button",{onClick:u,disabled:n,className:`${r} disabled:opacity-50`,title:"Refresh",children:o.jsxDEV(T,{className:`${a} ${n?"animate-spin":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:60,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/ListToolbar.tsx",lineNumber:48,columnNumber:5},this)}export{E as L};
2
+ //# sourceMappingURL=ListToolbar-jy8NL6ll.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-CJEzypCM.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN = 'p-1 text-text-quaternary hover:text-accent transition-colors rounded';\n const ICON = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n <>\n <button onClick={handleCopyUrl} className={BTN} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON} text-status-success`} /> : <Link2 className={ICON} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON} text-status-success`} /> : <Terminal className={ICON} />}\n </button>\n </>\n )}\n <button onClick={onRefresh} disabled={isFetching} className={`${BTN} disabled:opacity-50`} title=\"Refresh\">\n <RefreshCw className={`${ICON} ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","handleCopyCurl","token","getToken","cmd","BTN","ICON","jsxDEV","Fragment","Check","Link2","Terminal","RefreshCw"],"mappings":"qKAiBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,GAA6B,CACxF,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACP,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GACnDI,EAAgBI,EAAK,KAAK,CAC5B,EAEMC,EAAiB,IAAM,CAC3B,GAAI,CAACT,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GAC7CU,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMF,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBQ,EAAK,MAAM,CAC7B,EAEMC,EAAM,uEACNC,EAAO,cAEb,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAf,GACCe,EAAAA,OAAAC,WAAA,CACE,SAAA,CAAAD,SAAC,SAAA,CAAO,QAASR,EAAe,UAAWM,EAAK,MAAM,eACnD,SAAAZ,IAAW,MAAQc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiD,EAAKC,EAAAA,OAACG,EAAA,CAAM,UAAWJ,CAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwB,CAAA,EADpG,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAC,SAAC,SAAA,CAAO,QAASN,EAAgB,UAAWI,EAAK,MAAM,kCACpD,SAAAZ,IAAW,OAASc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiD,EAAKC,EAAAA,OAACI,EAAA,CAAS,UAAWL,CAAA,EAArB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EADxG,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,EAEFC,EAAAA,OAAC,UAAO,QAASjB,EAAW,SAAUC,EAAY,UAAW,GAAGc,CAAG,uBAAwB,MAAM,UAC/F,SAAAE,EAAAA,OAACK,GAAU,UAAW,GAAGN,CAAI,IAAIf,EAAa,eAAiB,EAAE,EAAA,EAAjE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqE,CAAA,EADvE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ"}
1
+ {"version":3,"file":"ListToolbar-jy8NL6ll.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN = 'p-1 text-text-quaternary hover:text-accent transition-colors rounded';\n const ICON = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n <>\n <button onClick={handleCopyUrl} className={BTN} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON} text-status-success`} /> : <Link2 className={ICON} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON} text-status-success`} /> : <Terminal className={ICON} />}\n </button>\n </>\n )}\n <button onClick={onRefresh} disabled={isFetching} className={`${BTN} disabled:opacity-50`} title=\"Refresh\">\n <RefreshCw className={`${ICON} ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","handleCopyCurl","token","getToken","cmd","BTN","ICON","jsxDEV","Fragment","Check","Link2","Terminal","RefreshCw"],"mappings":"qKAiBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,GAA6B,CACxF,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACP,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GACnDI,EAAgBI,EAAK,KAAK,CAC5B,EAEMC,EAAiB,IAAM,CAC3B,GAAI,CAACT,EAAS,OACd,MAAMQ,EAAM,GAAG,OAAO,SAAS,MAAM,OAAOR,CAAO,GAC7CU,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMF,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBQ,EAAK,MAAM,CAC7B,EAEMC,EAAM,uEACNC,EAAO,cAEb,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAf,GACCe,EAAAA,OAAAC,WAAA,CACE,SAAA,CAAAD,SAAC,SAAA,CAAO,QAASR,EAAe,UAAWM,EAAK,MAAM,eACnD,SAAAZ,IAAW,MAAQc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiD,EAAKC,EAAAA,OAACG,EAAA,CAAM,UAAWJ,CAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwB,CAAA,EADpG,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAC,SAAC,SAAA,CAAO,QAASN,EAAgB,UAAWI,EAAK,MAAM,kCACpD,SAAAZ,IAAW,OAASc,EAAAA,OAACE,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiD,EAAKC,EAAAA,OAACI,EAAA,CAAS,UAAWL,CAAA,EAArB,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EADxG,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,EAEFC,EAAAA,OAAC,UAAO,QAASjB,EAAW,SAAUC,EAAY,UAAW,GAAGc,CAAG,uBAAwB,MAAM,UAC/F,SAAAE,EAAAA,OAACK,GAAU,UAAW,GAAGN,CAAI,IAAIf,EAAa,eAAiB,EAAE,EAAA,EAAjE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqE,CAAA,EADvE,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-Da8R5Fn_.js";import{a as m}from"./vendor-query-DLp59M9_.js";import{u as T}from"./mcp-CUFhWTyT.js";import{u as L}from"./mcp-runs-BkRnXbcq.js";import{u as P}from"./yaml-workflows-xOJxyEsQ.js";import{u as _}from"./namespaces-CacF05ft.js";import{P as R}from"./PageHeader-BuUnJ5NY.js";import{S as N}from"./StatCard-B7ySTryP.js";import{b as F,c as A}from"./vendor-icons-1qQ3NKfa.js";import{c as z}from"./vendor-react-Co3Y8ikm.js";const y=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function I(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function f({value:r,colorClass:o,onClick:g}){return r===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:53,columnNumber:12},this):e.jsxDEV("button",{onClick:g,className:`${o} hover:underline tabular-nums font-medium`,children:r},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:56,columnNumber:5},this)}function X(){const r=z(),[o,g]=m.useState("24h"),[u,C]=m.useState("longtail"),{data:p}=_(),{data:n}=L({limit:500,app_id:u}),{data:w,isLoading:k}=T(),{data:M,isLoading:S}=P({limit:200}),j=m.useMemo(()=>((p==null?void 0:p.namespaces)??[]).map(s=>s.name),[p==null?void 0:p.namespaces]),b=(w==null?void 0:w.servers)??[],v=(M==null?void 0:M.workflows)??[],E=m.useMemo(()=>b.reduce((s,i)=>s+(Array.isArray(i.tool_manifest)?i.tool_manifest.length:0),0),[b]),O=m.useMemo(()=>new Set(v.map(i=>i.app_id)).size,[v]),V=m.useMemo(()=>{const s=y.find(i=>i.label===o);return Date.now()-s.ms},[o]),c=m.useMemo(()=>((n==null?void 0:n.jobs)??[]).filter(s=>new Date(s.created_at).getTime()>=V),[n==null?void 0:n.jobs,V]),D=m.useMemo(()=>{const s=new Map;for(const a of c){const t=s.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(t.total++,a.status==="running"&&t.running++,a.status==="completed"){t.completed++;const h=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();h>0&&t.durations.push(h)}a.status==="failed"&&t.failed++,s.set(a.entity,t)}const i=[];for(const[a,t]of s)i.push({pipeline:a,...t,avgDuration:t.durations.length>0?t.durations.reduce((h,$)=>h+$,0)/t.durations.length:null});return i.sort((a,t)=>t.total-a.total)},[c]),x=m.useMemo(()=>({total:c.length,running:c.filter(s=>s.status==="running").length,completed:c.filter(s=>s.status==="completed").length,failed:c.filter(s=>s.status==="failed").length}),[c]),l=(s,i)=>{const a=new URLSearchParams;u!=="longtail"&&a.set("namespace",u),s&&a.set("entity",s),i&&a.set("status",i);const t=a.toString();r(`/mcp/executions${t?`?${t}`:""}`)},d="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(R,{title:"Discovered"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:155,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-4 mb-6",children:[e.jsxDEV("div",{className:"flex items-center gap-1",children:y.map(s=>e.jsxDEV("button",{onClick:()=>g(s.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===s.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:s.label},s.label,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:161,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:159,columnNumber:9},this),j.length>1&&e.jsxDEV("select",{value:u,onChange:s=>C(s.target.value),className:"select text-xs py-1 px-2",children:j.map(s=>e.jsxDEV("option",{value:s,children:s},s,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:181,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:175,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:158,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(N,{label:"Total Runs",value:x.total,onClick:()=>l()},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:189,columnNumber:9},this),e.jsxDEV(N,{label:"Running",value:x.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:190,columnNumber:9},this),e.jsxDEV(N,{label:"Completed",value:x.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:191,columnNumber:9},this),e.jsxDEV(N,{label:"Failed",value:x.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:192,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:188,columnNumber:7},this),D.length>0&&e.jsxDEV("table",{className:"w-full text-left mb-10",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:d,children:"Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:200,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Total"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:201,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Running"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:202,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-24`,children:"Completed"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:203,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Failed"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:204,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-28`,children:"Avg Duration"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:205,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:199,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:198,columnNumber:11},this),e.jsxDEV("tbody",{children:D.map(s=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>l(s.pipeline),className:"hover:text-accent hover:underline",children:s.pipeline},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:212,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:211,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.total,colorClass:"text-text-secondary",onClick:()=>l(s.pipeline)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:220,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:219,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.running,colorClass:"text-status-active",onClick:()=>l(s.pipeline,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:223,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:222,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.completed,colorClass:"text-status-success",onClick:()=>l(s.pipeline,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:226,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:225,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.failed,colorClass:"text-status-error",onClick:()=>l(s.pipeline,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:229,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:228,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:s.avgDuration!==null?I(s.avgDuration):"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:231,columnNumber:17},this)]},s.pipeline,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:210,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:208,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:197,columnNumber:9},this),D.length===0&&e.jsxDEV("div",{className:"py-12 text-center mb-8",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No MCP tool activity in the last ",o]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:242,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:241,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxDEV("button",{onClick:()=>r("/mcp/servers"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-3 mb-3",children:[e.jsxDEV(F,{size:16,className:"text-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:255,columnNumber:13},this),e.jsxDEV("span",{className:"text-sm font-medium text-text-primary",children:"Tool Servers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:256,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:254,columnNumber:11},this),e.jsxDEV("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[k?"—":b.length,e.jsxDEV("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["server",b.length!==1?"s":""," · ",E," tool",E!==1?"s":""]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:260,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:258,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed mt-2",children:"Built-in and external MCP servers. Each server exposes tools that workflows and agents can call."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:264,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:250,columnNumber:9},this),e.jsxDEV("button",{onClick:()=>r("/mcp/workflows"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-3 mb-3",children:[e.jsxDEV(A,{size:16,className:"text-purple-400 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:274,columnNumber:13},this),e.jsxDEV("span",{className:"text-sm font-medium text-text-primary",children:"Pipeline Registry"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:275,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:273,columnNumber:11},this),e.jsxDEV("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[S?"—":v.length,e.jsxDEV("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["workflow",v.length!==1?"s":""," · ",O," server",O!==1?"s":""]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:279,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:277,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed mt-2",children:"Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:283,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:269,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:249,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:154,columnNumber:5},this)}export{X as McpOverview};
2
- //# sourceMappingURL=McpOverview-ChUa4l3t.js.map
1
+ import{j as e}from"./index-CCOSf1PY.js";import{a as m}from"./vendor-query-DLp59M9_.js";import{u as T}from"./mcp-CsLJ5SRm.js";import{u as L}from"./mcp-runs-DtTTsuPH.js";import{u as P}from"./yaml-workflows-Ch53yD43.js";import{u as _}from"./namespaces-iRejH3_A.js";import{P as R}from"./PageHeader-COcgWWf-.js";import{S as N}from"./StatCard-OKzRSSx4.js";import{b as F,c as A}from"./vendor-icons-CBOM6Es0.js";import{c as z}from"./vendor-react-Co3Y8ikm.js";const y=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function I(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function f({value:r,colorClass:o,onClick:g}){return r===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:53,columnNumber:12},this):e.jsxDEV("button",{onClick:g,className:`${o} hover:underline tabular-nums font-medium`,children:r},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:56,columnNumber:5},this)}function X(){const r=z(),[o,g]=m.useState("24h"),[u,C]=m.useState("longtail"),{data:p}=_(),{data:n}=L({limit:500,app_id:u}),{data:w,isLoading:k}=T(),{data:M,isLoading:S}=P({limit:200}),j=m.useMemo(()=>((p==null?void 0:p.namespaces)??[]).map(s=>s.name),[p==null?void 0:p.namespaces]),b=(w==null?void 0:w.servers)??[],v=(M==null?void 0:M.workflows)??[],E=m.useMemo(()=>b.reduce((s,i)=>s+(Array.isArray(i.tool_manifest)?i.tool_manifest.length:0),0),[b]),O=m.useMemo(()=>new Set(v.map(i=>i.app_id)).size,[v]),V=m.useMemo(()=>{const s=y.find(i=>i.label===o);return Date.now()-s.ms},[o]),c=m.useMemo(()=>((n==null?void 0:n.jobs)??[]).filter(s=>new Date(s.created_at).getTime()>=V),[n==null?void 0:n.jobs,V]),D=m.useMemo(()=>{const s=new Map;for(const a of c){const t=s.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(t.total++,a.status==="running"&&t.running++,a.status==="completed"){t.completed++;const h=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();h>0&&t.durations.push(h)}a.status==="failed"&&t.failed++,s.set(a.entity,t)}const i=[];for(const[a,t]of s)i.push({pipeline:a,...t,avgDuration:t.durations.length>0?t.durations.reduce((h,$)=>h+$,0)/t.durations.length:null});return i.sort((a,t)=>t.total-a.total)},[c]),x=m.useMemo(()=>({total:c.length,running:c.filter(s=>s.status==="running").length,completed:c.filter(s=>s.status==="completed").length,failed:c.filter(s=>s.status==="failed").length}),[c]),l=(s,i)=>{const a=new URLSearchParams;u!=="longtail"&&a.set("namespace",u),s&&a.set("entity",s),i&&a.set("status",i);const t=a.toString();r(`/mcp/executions${t?`?${t}`:""}`)},d="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(R,{title:"Discovered"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:155,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-4 mb-6",children:[e.jsxDEV("div",{className:"flex items-center gap-1",children:y.map(s=>e.jsxDEV("button",{onClick:()=>g(s.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===s.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:s.label},s.label,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:161,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:159,columnNumber:9},this),j.length>1&&e.jsxDEV("select",{value:u,onChange:s=>C(s.target.value),className:"select text-xs py-1 px-2",children:j.map(s=>e.jsxDEV("option",{value:s,children:s},s,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:181,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:175,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:158,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(N,{label:"Total Runs",value:x.total,onClick:()=>l()},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:189,columnNumber:9},this),e.jsxDEV(N,{label:"Running",value:x.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:190,columnNumber:9},this),e.jsxDEV(N,{label:"Completed",value:x.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:191,columnNumber:9},this),e.jsxDEV(N,{label:"Failed",value:x.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:192,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:188,columnNumber:7},this),D.length>0&&e.jsxDEV("table",{className:"w-full text-left mb-10",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:d,children:"Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:200,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Total"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:201,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Running"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:202,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-24`,children:"Completed"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:203,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Failed"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:204,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-28`,children:"Avg Duration"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:205,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:199,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:198,columnNumber:11},this),e.jsxDEV("tbody",{children:D.map(s=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>l(s.pipeline),className:"hover:text-accent hover:underline",children:s.pipeline},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:212,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:211,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.total,colorClass:"text-text-secondary",onClick:()=>l(s.pipeline)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:220,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:219,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.running,colorClass:"text-status-active",onClick:()=>l(s.pipeline,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:223,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:222,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.completed,colorClass:"text-status-success",onClick:()=>l(s.pipeline,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:226,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:225,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(f,{value:s.failed,colorClass:"text-status-error",onClick:()=>l(s.pipeline,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:229,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:228,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:s.avgDuration!==null?I(s.avgDuration):"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:231,columnNumber:17},this)]},s.pipeline,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:210,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:208,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:197,columnNumber:9},this),D.length===0&&e.jsxDEV("div",{className:"py-12 text-center mb-8",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No MCP tool activity in the last ",o]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:242,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:241,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxDEV("button",{onClick:()=>r("/mcp/servers"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-3 mb-3",children:[e.jsxDEV(F,{size:16,className:"text-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:255,columnNumber:13},this),e.jsxDEV("span",{className:"text-sm font-medium text-text-primary",children:"Tool Servers"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:256,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:254,columnNumber:11},this),e.jsxDEV("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[k?"—":b.length,e.jsxDEV("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["server",b.length!==1?"s":""," · ",E," tool",E!==1?"s":""]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:260,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:258,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed mt-2",children:"Built-in and external MCP servers. Each server exposes tools that workflows and agents can call."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:264,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:250,columnNumber:9},this),e.jsxDEV("button",{onClick:()=>r("/mcp/workflows"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-3 mb-3",children:[e.jsxDEV(A,{size:16,className:"text-purple-400 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:274,columnNumber:13},this),e.jsxDEV("span",{className:"text-sm font-medium text-text-primary",children:"Pipeline Registry"},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:275,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:273,columnNumber:11},this),e.jsxDEV("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[S?"—":v.length,e.jsxDEV("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["workflow",v.length!==1?"s":""," · ",O," server",O!==1?"s":""]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:279,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:277,columnNumber:11},this),e.jsxDEV("p",{className:"text-[11px] text-text-tertiary leading-relaxed mt-2",children:"Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs."},void 0,!1,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:283,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:269,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:249,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/mcp/McpOverview.tsx",lineNumber:154,columnNumber:5},this)}export{X as McpOverview};
2
+ //# sourceMappingURL=McpOverview-xkaKuHbX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpOverview-ChUa4l3t.js","sources":["../../src/pages/mcp/McpOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Server, Workflow } from 'lucide-react';\nimport { useMcpServers } from '../../api/mcp';\nimport { useMcpRuns } from '../../api/mcp-runs';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport type { McpToolManifest } from '../../api/types';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface PipelineStats {\n pipeline: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Reusable components ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function McpOverview() {\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n const [namespace, setNamespace] = useState('longtail');\n\n const { data: nsData } = useNamespaces();\n const { data: allRuns } = useMcpRuns({ limit: 500, app_id: namespace });\n const { data: serverData, isLoading: serversLoading } = useMcpServers();\n const { data: yamlData, isLoading: yamlLoading } = useYamlWorkflows({ limit: 200 });\n\n const namespaces = useMemo(\n () => (nsData?.namespaces ?? []).map((ns) => ns.name),\n [nsData?.namespaces],\n );\n\n // ── Server counts ────────────────────────────────────────────\n const servers = serverData?.servers ?? [];\n const yamlWorkflows = yamlData?.workflows ?? [];\n\n const serverToolCount = useMemo(\n () => servers.reduce((sum, s) => sum + (Array.isArray(s.tool_manifest) ? (s.tool_manifest as McpToolManifest[]).length : 0), 0),\n [servers],\n );\n\n const workflowServerCount = useMemo(() => {\n const appIds = new Set(yamlWorkflows.map((wf) => wf.app_id));\n return appIds.size;\n }, [yamlWorkflows]);\n\n // ── Run stats ──────────────────────────────────────────────────\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const runs = useMemo(\n () => (allRuns?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allRuns?.jobs, cutoff],\n );\n\n const byPipeline = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of runs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: PipelineStats[] = [];\n for (const [pipeline, stats] of map) {\n result.push({\n pipeline,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [runs]);\n\n const totals = useMemo(() => ({\n total: runs.length,\n running: runs.filter((j) => j.status === 'running').length,\n completed: runs.filter((j) => j.status === 'completed').length,\n failed: runs.filter((j) => j.status === 'failed').length,\n }), [runs]);\n\n const goToRuns = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (namespace !== 'longtail') params.set('namespace', namespace);\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/mcp/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Discovered\" />\n\n {/* ── Duration tabs + namespace ────────────────────────── */}\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n {namespaces.length > 1 && (\n <select\n value={namespace}\n onChange={(e) => setNamespace(e.target.value)}\n className=\"select text-xs py-1 px-2\"\n >\n {namespaces.map((ns) => (\n <option key={ns} value={ns}>{ns}</option>\n ))}\n </select>\n )}\n </div>\n\n {/* ── Summary cards ────────────────────────────────────── */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total Runs\" value={totals.total} onClick={() => goToRuns()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToRuns(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(undefined, 'failed')} />\n </div>\n\n {/* ── By-pipeline table ────────────────────────────────── */}\n {byPipeline.length > 0 && (\n <table className=\"w-full text-left mb-10\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Tool</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byPipeline.map((row) => (\n <tr key={row.pipeline} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToRuns(row.pipeline)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.pipeline}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToRuns(row.pipeline)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToRuns(row.pipeline, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(row.pipeline, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(row.pipeline, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byPipeline.length === 0 && (\n <div className=\"py-12 text-center mb-8\">\n <p className=\"text-sm text-text-tertiary\">\n No MCP tool activity in the last {duration}\n </p>\n </div>\n )}\n\n {/* ── Server inventory (compact cards) ─────────────────── */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <button\n onClick={() => navigate('/mcp/servers')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Server size={16} className=\"text-accent shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Tool Servers</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {serversLoading ? '—' : servers.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n server{servers.length !== 1 ? 's' : ''} · {serverToolCount} tool{serverToolCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Built-in and external MCP servers. Each server exposes tools that workflows and agents can call.\n </p>\n </button>\n\n <button\n onClick={() => navigate('/mcp/workflows')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Workflow size={16} className=\"text-purple-400 shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Pipeline Registry</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {yamlLoading ? '—' : yamlWorkflows.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n workflow{yamlWorkflows.length !== 1 ? 's' : ''} · {workflowServerCount} server{workflowServerCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs.\n </p>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsxDEV","McpOverview","navigate","useNavigate","duration","setDuration","useState","namespace","setNamespace","nsData","useNamespaces","allRuns","useMcpRuns","serverData","serversLoading","useMcpServers","yamlData","yamlLoading","useYamlWorkflows","namespaces","useMemo","ns","servers","yamlWorkflows","serverToolCount","sum","s","workflowServerCount","wf","cutoff","d","runs","j","byPipeline","map","entry","dur","result","pipeline","stats","a","b","totals","goToRuns","entity","status","params","qs","thCls","PageHeader","e","StatCard","row","Server","Workflow"],"mappings":"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"}
1
+ {"version":3,"file":"McpOverview-xkaKuHbX.js","sources":["../../src/pages/mcp/McpOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Server, Workflow } from 'lucide-react';\nimport { useMcpServers } from '../../api/mcp';\nimport { useMcpRuns } from '../../api/mcp-runs';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport type { McpToolManifest } from '../../api/types';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface PipelineStats {\n pipeline: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Reusable components ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function McpOverview() {\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n const [namespace, setNamespace] = useState('longtail');\n\n const { data: nsData } = useNamespaces();\n const { data: allRuns } = useMcpRuns({ limit: 500, app_id: namespace });\n const { data: serverData, isLoading: serversLoading } = useMcpServers();\n const { data: yamlData, isLoading: yamlLoading } = useYamlWorkflows({ limit: 200 });\n\n const namespaces = useMemo(\n () => (nsData?.namespaces ?? []).map((ns) => ns.name),\n [nsData?.namespaces],\n );\n\n // ── Server counts ────────────────────────────────────────────\n const servers = serverData?.servers ?? [];\n const yamlWorkflows = yamlData?.workflows ?? [];\n\n const serverToolCount = useMemo(\n () => servers.reduce((sum, s) => sum + (Array.isArray(s.tool_manifest) ? (s.tool_manifest as McpToolManifest[]).length : 0), 0),\n [servers],\n );\n\n const workflowServerCount = useMemo(() => {\n const appIds = new Set(yamlWorkflows.map((wf) => wf.app_id));\n return appIds.size;\n }, [yamlWorkflows]);\n\n // ── Run stats ──────────────────────────────────────────────────\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const runs = useMemo(\n () => (allRuns?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allRuns?.jobs, cutoff],\n );\n\n const byPipeline = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of runs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: PipelineStats[] = [];\n for (const [pipeline, stats] of map) {\n result.push({\n pipeline,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [runs]);\n\n const totals = useMemo(() => ({\n total: runs.length,\n running: runs.filter((j) => j.status === 'running').length,\n completed: runs.filter((j) => j.status === 'completed').length,\n failed: runs.filter((j) => j.status === 'failed').length,\n }), [runs]);\n\n const goToRuns = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (namespace !== 'longtail') params.set('namespace', namespace);\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/mcp/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Discovered\" />\n\n {/* ── Duration tabs + namespace ────────────────────────── */}\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n {namespaces.length > 1 && (\n <select\n value={namespace}\n onChange={(e) => setNamespace(e.target.value)}\n className=\"select text-xs py-1 px-2\"\n >\n {namespaces.map((ns) => (\n <option key={ns} value={ns}>{ns}</option>\n ))}\n </select>\n )}\n </div>\n\n {/* ── Summary cards ────────────────────────────────────── */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total Runs\" value={totals.total} onClick={() => goToRuns()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToRuns(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(undefined, 'failed')} />\n </div>\n\n {/* ── By-pipeline table ────────────────────────────────── */}\n {byPipeline.length > 0 && (\n <table className=\"w-full text-left mb-10\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Tool</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byPipeline.map((row) => (\n <tr key={row.pipeline} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToRuns(row.pipeline)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.pipeline}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToRuns(row.pipeline)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToRuns(row.pipeline, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(row.pipeline, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(row.pipeline, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byPipeline.length === 0 && (\n <div className=\"py-12 text-center mb-8\">\n <p className=\"text-sm text-text-tertiary\">\n No MCP tool activity in the last {duration}\n </p>\n </div>\n )}\n\n {/* ── Server inventory (compact cards) ─────────────────── */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <button\n onClick={() => navigate('/mcp/servers')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Server size={16} className=\"text-accent shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Tool Servers</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {serversLoading ? '—' : servers.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n server{servers.length !== 1 ? 's' : ''} · {serverToolCount} tool{serverToolCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Built-in and external MCP servers. Each server exposes tools that workflows and agents can call.\n </p>\n </button>\n\n <button\n onClick={() => navigate('/mcp/workflows')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Workflow size={16} className=\"text-purple-400 shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Pipeline Registry</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {yamlLoading ? '—' : yamlWorkflows.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n workflow{yamlWorkflows.length !== 1 ? 's' : ''} · {workflowServerCount} server{workflowServerCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs.\n </p>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsxDEV","McpOverview","navigate","useNavigate","duration","setDuration","useState","namespace","setNamespace","nsData","useNamespaces","allRuns","useMcpRuns","serverData","serversLoading","useMcpServers","yamlData","yamlLoading","useYamlWorkflows","namespaces","useMemo","ns","servers","yamlWorkflows","serverToolCount","sum","s","workflowServerCount","wf","cutoff","d","runs","j","byPipeline","map","entry","dur","result","pipeline","stats","a","b","totals","goToRuns","entity","status","params","qs","thCls","PageHeader","e","StatCard","row","Server","Workflow"],"mappings":"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"}