@hotmeshio/long-tail 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/build/api/agent-subscriptions.js +14 -0
  2. package/build/api/settings.js +4 -0
  3. package/build/lib/db/index.d.ts +1 -7
  4. package/build/lib/db/schemas/008_capability_reaction.sql +12 -0
  5. package/build/lib/db/schemas/009_file_topic_category.sql +10 -0
  6. package/build/lib/events/index.d.ts +9 -0
  7. package/build/lib/events/index.js +18 -0
  8. package/build/lib/events/nats.d.ts +15 -1
  9. package/build/lib/events/nats.js +46 -2
  10. package/build/lib/events/publish.d.ts +10 -0
  11. package/build/lib/events/publish.js +28 -0
  12. package/build/modules/config.d.ts +1 -7
  13. package/build/services/agent/index.js +14 -0
  14. package/build/services/agent/subscription-sql.d.ts +3 -3
  15. package/build/services/agent/subscription-sql.js +7 -5
  16. package/build/services/agent/subscriptions.d.ts +3 -1
  17. package/build/services/agent/subscriptions.js +6 -0
  18. package/build/services/agent/trigger-registry.d.ts +2 -0
  19. package/build/services/agent/trigger-registry.js +55 -8
  20. package/build/services/topics/system-topics.js +29 -0
  21. package/build/services/yaml-workflow/deployer.d.ts +1 -1
  22. package/build/services/yaml-workflow/deployer.js +2 -2
  23. package/build/services/yaml-workflow/invoke.d.ts +2 -0
  24. package/build/services/yaml-workflow/invoke.js +5 -1
  25. package/build/start/adapters.js +11 -9
  26. package/build/start/config.js +4 -0
  27. package/build/start/workers.js +15 -3
  28. package/build/system/index.js +16 -0
  29. package/build/system/mcp-servers/file-storage.js +18 -0
  30. package/build/system/workflows/capability-invoke/activities.d.ts +12 -0
  31. package/build/system/workflows/capability-invoke/activities.js +14 -0
  32. package/build/system/workflows/capability-invoke/index.d.ts +14 -0
  33. package/build/system/workflows/capability-invoke/index.js +74 -0
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/events.d.ts +13 -1
  36. package/build/types/startup.d.ts +7 -0
  37. package/dashboard/dist/assets/AdminDashboard-ntLz5Pro.js +2 -0
  38. package/dashboard/dist/assets/{AdminDashboard-Dr5wTIZT.js.map → AdminDashboard-ntLz5Pro.js.map} +1 -1
  39. package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js +16 -0
  40. package/dashboard/dist/assets/AgentConfigPage-D27vWOI6.js.map +1 -0
  41. package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js +4 -0
  42. package/dashboard/dist/assets/AgentDetailPage-Cm2KFR4O.js.map +1 -0
  43. package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js +2 -0
  44. package/dashboard/dist/assets/AgentsPage-_ptA-0YO.js.map +1 -0
  45. package/dashboard/dist/assets/AvailableEscalationsPage-bdPqEzbx.js +2 -0
  46. package/dashboard/dist/assets/{AvailableEscalationsPage-UzjXcO3W.js.map → AvailableEscalationsPage-bdPqEzbx.js.map} +1 -1
  47. package/dashboard/dist/assets/BotPicker-CYfFMpkY.js +2 -0
  48. package/dashboard/dist/assets/{BotPicker-CM-_u73k.js.map → BotPicker-CYfFMpkY.js.map} +1 -1
  49. package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js +2 -0
  50. package/dashboard/dist/assets/CapabilitiesPage-M7-ZTFNV.js.map +1 -0
  51. package/dashboard/dist/assets/CollapsibleSection-DU5KAtQ-.js +2 -0
  52. package/dashboard/dist/assets/{CollapsibleSection-CnPKa7df.js.map → CollapsibleSection-DU5KAtQ-.js.map} +1 -1
  53. package/dashboard/dist/assets/ConfirmDeleteModal-_hW5Vc05.js +2 -0
  54. package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-_hW5Vc05.js.map} +1 -1
  55. package/dashboard/dist/assets/CopyableId-DiWqv41D.js +2 -0
  56. package/dashboard/dist/assets/CopyableId-DiWqv41D.js.map +1 -0
  57. package/dashboard/dist/assets/CredentialsPage-CmbwypSF.js +2 -0
  58. package/dashboard/dist/assets/{CredentialsPage-CImIzra4.js.map → CredentialsPage-CmbwypSF.js.map} +1 -1
  59. package/dashboard/dist/assets/CronLabel-nycfAefc.js +2 -0
  60. package/dashboard/dist/assets/CronLabel-nycfAefc.js.map +1 -0
  61. package/dashboard/dist/assets/CustomDurationPicker-gNZRBaHg.js +2 -0
  62. package/dashboard/dist/assets/{CustomDurationPicker-5JzEgS7I.js.map → CustomDurationPicker-gNZRBaHg.js.map} +1 -1
  63. package/dashboard/dist/assets/DataTable-DGerT2ZM.js +2 -0
  64. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-DGerT2ZM.js.map} +1 -1
  65. package/dashboard/dist/assets/DropZone-vNcqMd05.js +2 -0
  66. package/dashboard/dist/assets/{DropZone-BEW3jBzf.js.map → DropZone-vNcqMd05.js.map} +1 -1
  67. package/dashboard/dist/assets/ElapsedCell-CdvQbtve.js +2 -0
  68. package/dashboard/dist/assets/{ElapsedCell-B79BF5Mj.js.map → ElapsedCell-CdvQbtve.js.map} +1 -1
  69. package/dashboard/dist/assets/EmptyState-DMldv8c5.js +2 -0
  70. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-DMldv8c5.js.map} +1 -1
  71. package/dashboard/dist/assets/EscalationsOverview-BNENCL_2.js +2 -0
  72. package/dashboard/dist/assets/{EscalationsOverview-QvWvbpx3.js.map → EscalationsOverview-BNENCL_2.js.map} +1 -1
  73. package/dashboard/dist/assets/EventTable-BqDAyXyc.js +2 -0
  74. package/dashboard/dist/assets/{EventTable-DAclQwfr.js.map → EventTable-BqDAyXyc.js.map} +1 -1
  75. package/dashboard/dist/assets/EventTopicPill-CnHFBglc.js +2 -0
  76. package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js.map → EventTopicPill-CnHFBglc.js.map} +1 -1
  77. package/dashboard/dist/assets/FilterBar-TYiTtUgv.js +2 -0
  78. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-TYiTtUgv.js.map} +1 -1
  79. package/dashboard/dist/assets/HomePage-fterfLKH.js +2 -0
  80. package/dashboard/dist/assets/{HomePage-DVOi7rR1.js.map → HomePage-fterfLKH.js.map} +1 -1
  81. package/dashboard/dist/assets/ListToolbar-BO5Igi6v.js +2 -0
  82. package/dashboard/dist/assets/{ListToolbar-Bntl2hex.js.map → ListToolbar-BO5Igi6v.js.map} +1 -1
  83. package/dashboard/dist/assets/McpOverview-BQokGg0z.js +2 -0
  84. package/dashboard/dist/assets/{McpOverview-B-xSYPJj.js.map → McpOverview-BQokGg0z.js.map} +1 -1
  85. package/dashboard/dist/assets/McpQueryDetailPage-0WOp2n_j.js +5 -0
  86. package/dashboard/dist/assets/{McpQueryDetailPage-Cq71BzjB.js.map → McpQueryDetailPage-0WOp2n_j.js.map} +1 -1
  87. package/dashboard/dist/assets/McpQueryPage-DUey_h9J.js +2 -0
  88. package/dashboard/dist/assets/{McpQueryPage-Dfz87aZF.js.map → McpQueryPage-DUey_h9J.js.map} +1 -1
  89. package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js +2 -0
  90. package/dashboard/dist/assets/McpRunDetailPage-Cv4qyr91.js.map +1 -0
  91. package/dashboard/dist/assets/McpRunsPage-B3R6KZ61.js +2 -0
  92. package/dashboard/dist/assets/{McpRunsPage-MUYvUYqz.js.map → McpRunsPage-B3R6KZ61.js.map} +1 -1
  93. package/dashboard/dist/assets/Modal-Qe8lW7gQ.js +2 -0
  94. package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-Qe8lW7gQ.js.map} +1 -1
  95. package/dashboard/dist/assets/OperatorDashboard-dldvzjcg.js +2 -0
  96. package/dashboard/dist/assets/{OperatorDashboard-Rih1SZrn.js.map → OperatorDashboard-dldvzjcg.js.map} +1 -1
  97. package/dashboard/dist/assets/PageHeader-DF4BeEm4.js +2 -0
  98. package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js.map → PageHeader-DF4BeEm4.js.map} +1 -1
  99. package/dashboard/dist/assets/PageHeaderWithStats-BQZw6BgA.js +2 -0
  100. package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js.map → PageHeaderWithStats-BQZw6BgA.js.map} +1 -1
  101. package/dashboard/dist/assets/PriorityBadge-DMyB3WLZ.js +2 -0
  102. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-DMyB3WLZ.js.map} +1 -1
  103. package/dashboard/dist/assets/ProcessDetailPage-Beo-QVL-.js +2 -0
  104. package/dashboard/dist/assets/{ProcessDetailPage-BMkWCjqD.js.map → ProcessDetailPage-Beo-QVL-.js.map} +1 -1
  105. package/dashboard/dist/assets/ProcessesListPage-C_ars8gp.js +2 -0
  106. package/dashboard/dist/assets/{ProcessesListPage-vZjUSc7S.js.map → ProcessesListPage-C_ars8gp.js.map} +1 -1
  107. package/dashboard/dist/assets/RolePill-DrBZ7JJj.js +2 -0
  108. package/dashboard/dist/assets/{RolePill-BDzPFQUv.js.map → RolePill-DrBZ7JJj.js.map} +1 -1
  109. package/dashboard/dist/assets/RolesPage-DgSXFFGL.js +2 -0
  110. package/dashboard/dist/assets/{RolesPage-kjeAsj3_.js.map → RolesPage-DgSXFFGL.js.map} +1 -1
  111. package/dashboard/dist/assets/RowActions-QcakGbVA.js +2 -0
  112. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-QcakGbVA.js.map} +1 -1
  113. package/dashboard/dist/assets/RunAsSelector-CYMeZwrM.js +2 -0
  114. package/dashboard/dist/assets/{RunAsSelector-DC4SLtTq.js.map → RunAsSelector-CYMeZwrM.js.map} +1 -1
  115. package/dashboard/dist/assets/ServerName-D5NKD06M.js +2 -0
  116. package/dashboard/dist/assets/{ServerName-CEOFF7UG.js.map → ServerName-D5NKD06M.js.map} +1 -1
  117. package/dashboard/dist/assets/StatCard-PZQmmCHK.js +2 -0
  118. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-PZQmmCHK.js.map} +1 -1
  119. package/dashboard/dist/assets/StatusBadge-ME2R6a7K.js +2 -0
  120. package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-ME2R6a7K.js.map} +1 -1
  121. package/dashboard/dist/assets/StepIndicator-CDDVahOz.js +2 -0
  122. package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CDDVahOz.js.map} +1 -1
  123. package/dashboard/dist/assets/StickyPagination-Ddy93Q5I.js +2 -0
  124. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-Ddy93Q5I.js.map} +1 -1
  125. package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js +2 -0
  126. package/dashboard/dist/assets/SwimlaneTimeline-CYYA8nd9.js.map +1 -0
  127. package/dashboard/dist/assets/TagInput-B45Dm3IW.js +2 -0
  128. package/dashboard/dist/assets/{TagInput-VBY0xIwb.js.map → TagInput-B45Dm3IW.js.map} +1 -1
  129. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js +2 -0
  130. package/dashboard/dist/assets/TaskDetailPage-CoZFkJ6d.js.map +1 -0
  131. package/dashboard/dist/assets/TaskQueuePill-BJRUjVDv.js +2 -0
  132. package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js.map → TaskQueuePill-BJRUjVDv.js.map} +1 -1
  133. package/dashboard/dist/assets/TasksListPage-Czu08px3.js +2 -0
  134. package/dashboard/dist/assets/{TasksListPage-69ZWCaCP.js.map → TasksListPage-Czu08px3.js.map} +1 -1
  135. package/dashboard/dist/assets/TimeAgo-CJ56IUy6.js +2 -0
  136. package/dashboard/dist/assets/{TimeAgo-CttiZG0k.js.map → TimeAgo-CJ56IUy6.js.map} +1 -1
  137. package/dashboard/dist/assets/TimestampCell-QtcYZ9Jx.js +2 -0
  138. package/dashboard/dist/assets/{TimestampCell-CYFbEhqc.js.map → TimestampCell-QtcYZ9Jx.js.map} +1 -1
  139. package/dashboard/dist/assets/ToolPill-DpDv3FwI.js +2 -0
  140. package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js.map → ToolPill-DpDv3FwI.js.map} +1 -1
  141. package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js +2 -0
  142. package/dashboard/dist/assets/ToolTestPanel-BzFOwzd_.js.map +1 -0
  143. package/dashboard/dist/assets/TopicDetailPage-DwShZbh9.js +9 -0
  144. package/dashboard/dist/assets/{TopicDetailPage-Aq4-6GLl.js.map → TopicDetailPage-DwShZbh9.js.map} +1 -1
  145. package/dashboard/dist/assets/TopicsPage-DKXlpZl_.js +2 -0
  146. package/dashboard/dist/assets/{TopicsPage-BYFKjRY_.js.map → TopicsPage-DKXlpZl_.js.map} +1 -1
  147. package/dashboard/dist/assets/UserName-zlR1so37.js +2 -0
  148. package/dashboard/dist/assets/{UserName-C4_T5-rI.js.map → UserName-zlR1so37.js.map} +1 -1
  149. package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js +2 -0
  150. package/dashboard/dist/assets/WorkflowExecutionPage-BMNIxeJB.js.map +1 -0
  151. package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js +2 -0
  152. package/dashboard/dist/assets/WorkflowPill-B5B3yGlh.js.map +1 -0
  153. package/dashboard/dist/assets/WorkflowsDashboard-BlAPZbQZ.js +2 -0
  154. package/dashboard/dist/assets/{WorkflowsDashboard-_LMWc-OC.js.map → WorkflowsDashboard-BlAPZbQZ.js.map} +1 -1
  155. package/dashboard/dist/assets/WorkflowsOverview-NnPi6rwS.js +2 -0
  156. package/dashboard/dist/assets/{WorkflowsOverview-DFrfw554.js.map → WorkflowsOverview-NnPi6rwS.js.map} +1 -1
  157. package/dashboard/dist/assets/YamlWorkflowsPage-C4mZum6x.js +2 -0
  158. package/dashboard/dist/assets/{YamlWorkflowsPage-CZzGwfol.js.map → YamlWorkflowsPage-C4mZum6x.js.map} +1 -1
  159. package/dashboard/dist/assets/{agents-CsKILVSU.js → agents-B5wvILeV.js} +2 -2
  160. package/dashboard/dist/assets/{agents-CsKILVSU.js.map → agents-B5wvILeV.js.map} +1 -1
  161. package/dashboard/dist/assets/{bots-BzEs6Q9L.js → bots-BPlouRDm.js} +2 -2
  162. package/dashboard/dist/assets/{bots-BzEs6Q9L.js.map → bots-BPlouRDm.js.map} +1 -1
  163. package/dashboard/dist/assets/capabilities-DkvRG09b.js +2 -0
  164. package/dashboard/dist/assets/capabilities-DkvRG09b.js.map +1 -0
  165. package/dashboard/dist/assets/{controlplane-COYEIIAz.js → controlplane-0m_rA-UW.js} +2 -2
  166. package/dashboard/dist/assets/{controlplane-COYEIIAz.js.map → controlplane-0m_rA-UW.js.map} +1 -1
  167. package/dashboard/dist/assets/escalation-CfIAIUg2.js +2 -0
  168. package/dashboard/dist/assets/{escalation-BZjS2202.js.map → escalation-CfIAIUg2.js.map} +1 -1
  169. package/dashboard/dist/assets/escalation-columns-CLIdxlbe.js +2 -0
  170. package/dashboard/dist/assets/{escalation-columns-DtRVmPSB.js.map → escalation-columns-CLIdxlbe.js.map} +1 -1
  171. package/dashboard/dist/assets/helpers-prGqC38M.js +2 -0
  172. package/dashboard/dist/assets/{helpers-BngVEys5.js.map → helpers-prGqC38M.js.map} +1 -1
  173. package/dashboard/dist/assets/index-4T7Z_gQ4.js +281 -0
  174. package/dashboard/dist/assets/index-4T7Z_gQ4.js.map +1 -0
  175. package/dashboard/dist/assets/index-BPxglOYm.css +1 -0
  176. package/dashboard/dist/assets/index-BR3SwTNI.js +2 -0
  177. package/dashboard/dist/assets/{index-COgyD_H2.js.map → index-BR3SwTNI.js.map} +1 -1
  178. package/dashboard/dist/assets/index-BWKIigEk.js +2 -0
  179. package/dashboard/dist/assets/{index-Byp8BDPs.js.map → index-BWKIigEk.js.map} +1 -1
  180. package/dashboard/dist/assets/index-BgVuyWhi.js +15 -0
  181. package/dashboard/dist/assets/{index-DykjJxzr.js.map → index-BgVuyWhi.js.map} +1 -1
  182. package/dashboard/dist/assets/index-C0sDEKdo.js +2 -0
  183. package/dashboard/dist/assets/{index-DxMNiFPS.js.map → index-C0sDEKdo.js.map} +1 -1
  184. package/dashboard/dist/assets/index-C2MJzu6J.js +2 -0
  185. package/dashboard/dist/assets/{index-ByxH4qQ-.js.map → index-C2MJzu6J.js.map} +1 -1
  186. package/dashboard/dist/assets/index-CFoddJDr.js +6 -0
  187. package/dashboard/dist/assets/{index-BCsShN2l.js.map → index-CFoddJDr.js.map} +1 -1
  188. package/dashboard/dist/assets/index-CrMxD5Ib.js +6 -0
  189. package/dashboard/dist/assets/index-CrMxD5Ib.js.map +1 -0
  190. package/dashboard/dist/assets/index-CuY5hPYB.js +2 -0
  191. package/dashboard/dist/assets/{index-Bq5MSkCL.js.map → index-CuY5hPYB.js.map} +1 -1
  192. package/dashboard/dist/assets/index-CwkJBn87.js +2 -0
  193. package/dashboard/dist/assets/{index-R61-yG56.js.map → index-CwkJBn87.js.map} +1 -1
  194. package/dashboard/dist/assets/index-DeL84Cag.js +2 -0
  195. package/dashboard/dist/assets/{index-xgl431mG.js.map → index-DeL84Cag.js.map} +1 -1
  196. package/dashboard/dist/assets/index-DqeLbz6j.js +2 -0
  197. package/dashboard/dist/assets/{index-ABsZZf_U.js.map → index-DqeLbz6j.js.map} +1 -1
  198. package/dashboard/dist/assets/index-P9huxx3-.js +2 -0
  199. package/dashboard/dist/assets/{index-BwivT39P.js.map → index-P9huxx3-.js.map} +1 -1
  200. package/dashboard/dist/assets/{knowledge-DhCbDgy4.js → knowledge-CUZxyRCO.js} +2 -2
  201. package/dashboard/dist/assets/{knowledge-DhCbDgy4.js.map → knowledge-CUZxyRCO.js.map} +1 -1
  202. package/dashboard/dist/assets/{mcp-xh7T0I-f.js → mcp-B5VQPoF3.js} +2 -2
  203. package/dashboard/dist/assets/{mcp-xh7T0I-f.js.map → mcp-B5VQPoF3.js.map} +1 -1
  204. package/dashboard/dist/assets/{mcp-query-il3CfU3U.js → mcp-query-Ba5Zj3yg.js} +2 -2
  205. package/dashboard/dist/assets/{mcp-query-il3CfU3U.js.map → mcp-query-Ba5Zj3yg.js.map} +1 -1
  206. package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js → mcp-runs-CAiEr5Fc.js} +2 -2
  207. package/dashboard/dist/assets/{mcp-runs-4fyRpegc.js.map → mcp-runs-CAiEr5Fc.js.map} +1 -1
  208. package/dashboard/dist/assets/namespaces-sVr5scma.js +2 -0
  209. package/dashboard/dist/assets/{namespaces-BBTvHnRF.js.map → namespaces-sVr5scma.js.map} +1 -1
  210. package/dashboard/dist/assets/{roles-D7bx5FAM.js → roles-E_bA4e0f.js} +2 -2
  211. package/dashboard/dist/assets/{roles-D7bx5FAM.js.map → roles-E_bA4e0f.js.map} +1 -1
  212. package/dashboard/dist/assets/{tasks-BgxRbhVM.js → tasks-CL6Gv8jB.js} +2 -2
  213. package/dashboard/dist/assets/{tasks-BgxRbhVM.js.map → tasks-CL6Gv8jB.js.map} +1 -1
  214. package/dashboard/dist/assets/{topics-CTtCboHe.js → topics-DbtPHERP.js} +2 -2
  215. package/dashboard/dist/assets/{topics-CTtCboHe.js.map → topics-DbtPHERP.js.map} +1 -1
  216. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  217. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  218. package/dashboard/dist/assets/useEventHooks-C6c618cj.js +2 -0
  219. package/dashboard/dist/assets/useEventHooks-C6c618cj.js.map +1 -0
  220. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
  221. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
  222. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
  223. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
  224. package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js → useYamlActivityEvents-eK7kIUdh.js} +2 -2
  225. package/dashboard/dist/assets/{useYamlActivityEvents-CSMX9He5.js.map → useYamlActivityEvents-eK7kIUdh.js.map} +1 -1
  226. package/dashboard/dist/assets/{users-CyF-5WLI.js → users-CCHSIAxt.js} +2 -2
  227. package/dashboard/dist/assets/{users-CyF-5WLI.js.map → users-CCHSIAxt.js.map} +1 -1
  228. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js → vendor-icons-D8-ZINAH.js} +3 -3
  229. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js.map → vendor-icons-D8-ZINAH.js.map} +1 -1
  230. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  231. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  232. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  233. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  234. package/dashboard/dist/assets/{workflows-Bf4_w24H.js → workflows-BNbocg_9.js} +2 -2
  235. package/dashboard/dist/assets/{workflows-Bf4_w24H.js.map → workflows-BNbocg_9.js.map} +1 -1
  236. package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js → yaml-workflows-Cu1FUwrc.js} +2 -2
  237. package/dashboard/dist/assets/{yaml-workflows-Cp1N0NMK.js.map → yaml-workflows-Cu1FUwrc.js.map} +1 -1
  238. package/dashboard/dist/index.html +5 -5
  239. package/docs/agents.md +9 -9
  240. package/docs/api/http/agents.md +12 -10
  241. package/docs/api/http/settings.md +4 -0
  242. package/docs/api/sdk/agents.md +4 -2
  243. package/docs/api/sdk/settings.md +2 -1
  244. package/docs/dashboard.md +1 -1
  245. package/package.json +2 -2
  246. package/dashboard/dist/assets/AdminDashboard-Dr5wTIZT.js +0 -2
  247. package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js +0 -13
  248. package/dashboard/dist/assets/AgentConfigPage-D52KyJY-.js.map +0 -1
  249. package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js +0 -4
  250. package/dashboard/dist/assets/AgentDetailPage-Cbo_qrYF.js.map +0 -1
  251. package/dashboard/dist/assets/AgentsPage-CvuF8--H.js +0 -2
  252. package/dashboard/dist/assets/AgentsPage-CvuF8--H.js.map +0 -1
  253. package/dashboard/dist/assets/AvailableEscalationsPage-UzjXcO3W.js +0 -2
  254. package/dashboard/dist/assets/BotPicker-CM-_u73k.js +0 -2
  255. package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js +0 -2
  256. package/dashboard/dist/assets/CapabilitiesPage-D1QEHMKw.js.map +0 -1
  257. package/dashboard/dist/assets/CollapsibleSection-CnPKa7df.js +0 -2
  258. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
  259. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
  260. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js.map +0 -1
  261. package/dashboard/dist/assets/CredentialsPage-CImIzra4.js +0 -2
  262. package/dashboard/dist/assets/CronLabel-5HPAmciI.js +0 -2
  263. package/dashboard/dist/assets/CronLabel-5HPAmciI.js.map +0 -1
  264. package/dashboard/dist/assets/CustomDurationPicker-5JzEgS7I.js +0 -2
  265. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
  266. package/dashboard/dist/assets/DropZone-BEW3jBzf.js +0 -2
  267. package/dashboard/dist/assets/ElapsedCell-B79BF5Mj.js +0 -2
  268. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  269. package/dashboard/dist/assets/EscalationsOverview-QvWvbpx3.js +0 -2
  270. package/dashboard/dist/assets/EventTable-DAclQwfr.js +0 -2
  271. package/dashboard/dist/assets/EventTopicPill-By-6sXDp.js +0 -2
  272. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  273. package/dashboard/dist/assets/HomePage-DVOi7rR1.js +0 -2
  274. package/dashboard/dist/assets/ListToolbar-Bntl2hex.js +0 -2
  275. package/dashboard/dist/assets/McpOverview-B-xSYPJj.js +0 -2
  276. package/dashboard/dist/assets/McpQueryDetailPage-Cq71BzjB.js +0 -5
  277. package/dashboard/dist/assets/McpQueryPage-Dfz87aZF.js +0 -2
  278. package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js +0 -2
  279. package/dashboard/dist/assets/McpRunDetailPage-CXXRgMmJ.js.map +0 -1
  280. package/dashboard/dist/assets/McpRunsPage-MUYvUYqz.js +0 -2
  281. package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
  282. package/dashboard/dist/assets/OperatorDashboard-Rih1SZrn.js +0 -2
  283. package/dashboard/dist/assets/PageHeader-Bo0SpcCK.js +0 -2
  284. package/dashboard/dist/assets/PageHeaderWithStats-7K5BdhOj.js +0 -2
  285. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  286. package/dashboard/dist/assets/ProcessDetailPage-BMkWCjqD.js +0 -2
  287. package/dashboard/dist/assets/ProcessesListPage-vZjUSc7S.js +0 -2
  288. package/dashboard/dist/assets/RolePill-BDzPFQUv.js +0 -2
  289. package/dashboard/dist/assets/RolesPage-kjeAsj3_.js +0 -2
  290. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  291. package/dashboard/dist/assets/RunAsSelector-DC4SLtTq.js +0 -2
  292. package/dashboard/dist/assets/ServerName-CEOFF7UG.js +0 -2
  293. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  294. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
  295. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
  296. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  297. package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js +0 -2
  298. package/dashboard/dist/assets/SwimlaneTimeline-MUUXgT3o.js.map +0 -1
  299. package/dashboard/dist/assets/TagInput-VBY0xIwb.js +0 -2
  300. package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js +0 -2
  301. package/dashboard/dist/assets/TaskDetailPage-C0AlG_2t.js.map +0 -1
  302. package/dashboard/dist/assets/TaskQueuePill-DZykFijh.js +0 -2
  303. package/dashboard/dist/assets/TasksListPage-69ZWCaCP.js +0 -2
  304. package/dashboard/dist/assets/TimeAgo-CttiZG0k.js +0 -2
  305. package/dashboard/dist/assets/TimestampCell-CYFbEhqc.js +0 -2
  306. package/dashboard/dist/assets/ToolPill-RP2Tvlrx.js +0 -2
  307. package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js +0 -2
  308. package/dashboard/dist/assets/ToolTestPanel-CY_PLZSe.js.map +0 -1
  309. package/dashboard/dist/assets/TopicDetailPage-Aq4-6GLl.js +0 -9
  310. package/dashboard/dist/assets/TopicsPage-BYFKjRY_.js +0 -2
  311. package/dashboard/dist/assets/UserName-C4_T5-rI.js +0 -2
  312. package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js +0 -2
  313. package/dashboard/dist/assets/WorkflowExecutionPage-DUSTBasv.js.map +0 -1
  314. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js +0 -2
  315. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js.map +0 -1
  316. package/dashboard/dist/assets/WorkflowsDashboard-_LMWc-OC.js +0 -2
  317. package/dashboard/dist/assets/WorkflowsOverview-DFrfw554.js +0 -2
  318. package/dashboard/dist/assets/YamlWorkflowsPage-CZzGwfol.js +0 -2
  319. package/dashboard/dist/assets/escalation-BZjS2202.js +0 -2
  320. package/dashboard/dist/assets/escalation-columns-DtRVmPSB.js +0 -2
  321. package/dashboard/dist/assets/helpers-BngVEys5.js +0 -2
  322. package/dashboard/dist/assets/index-ABsZZf_U.js +0 -2
  323. package/dashboard/dist/assets/index-BCsShN2l.js +0 -6
  324. package/dashboard/dist/assets/index-Bq5MSkCL.js +0 -2
  325. package/dashboard/dist/assets/index-BwivT39P.js +0 -2
  326. package/dashboard/dist/assets/index-Byp8BDPs.js +0 -2
  327. package/dashboard/dist/assets/index-ByxH4qQ-.js +0 -2
  328. package/dashboard/dist/assets/index-COgyD_H2.js +0 -2
  329. package/dashboard/dist/assets/index-DXEYynKO.css +0 -1
  330. package/dashboard/dist/assets/index-DcpCR9c_.js +0 -63
  331. package/dashboard/dist/assets/index-DcpCR9c_.js.map +0 -1
  332. package/dashboard/dist/assets/index-DuPY59Yu.js +0 -5
  333. package/dashboard/dist/assets/index-DuPY59Yu.js.map +0 -1
  334. package/dashboard/dist/assets/index-DxMNiFPS.js +0 -2
  335. package/dashboard/dist/assets/index-DykjJxzr.js +0 -15
  336. package/dashboard/dist/assets/index-R61-yG56.js +0 -2
  337. package/dashboard/dist/assets/index-xgl431mG.js +0 -2
  338. package/dashboard/dist/assets/namespaces-BBTvHnRF.js +0 -2
  339. package/dashboard/dist/assets/settings-nt6qyR1S.js +0 -2
  340. package/dashboard/dist/assets/settings-nt6qyR1S.js.map +0 -1
  341. package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js +0 -2
  342. package/dashboard/dist/assets/useEventHooks-CkJOmbF-.js.map +0 -1
  343. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  344. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  345. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
  346. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EventTable-DAclQwfr.js","sources":["../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","useState","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","prev","next","allExpanded","toggleAll","jsxs","jsx","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
1
+ {"version":3,"file":"EventTable-BqDAyXyc.js","sources":["../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","useState","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","prev","next","allExpanded","toggleAll","jsxDEV","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-4T7Z_gQ4.js";import{R as i}from"./vendor-icons-D8-ZINAH.js";const a={task:"text-blue-400",workflow:"text-accent",escalation:"text-amber-400",activity:"text-cyan-400",knowledge:"text-violet-400",agent:"text-emerald-400",app:"text-rose-400",milestone:"text-violet-400"};function c({topic:t}){const o=t.split(".")[0],s=a[o]??"text-text-quaternary",n=t.split(".").slice(-2).join(".");return e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[e.jsxDEV(i,{className:`w-2.5 h-2.5 shrink-0 ${s}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:31,columnNumber:7},this),n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:30,columnNumber:5},this)}export{c as E};
2
+ //# sourceMappingURL=EventTopicPill-CnHFBglc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventTopicPill-By-6sXDp.js","sources":["../../src/components/common/display/EventTopicPill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\n/**\n * Universal event topic display — Radio icon + monotype text.\n * Used everywhere an event subscription topic is rendered.\n * No border, no background — matches CronLabel's simplicity.\n */\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'text-blue-400',\n workflow: 'text-accent',\n escalation: 'text-amber-400',\n activity: 'text-cyan-400',\n knowledge: 'text-violet-400',\n agent: 'text-emerald-400',\n app: 'text-rose-400',\n milestone: 'text-violet-400',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const category = topic.split('.')[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n const shortTopic = topic.split('.').slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n"],"names":["CATEGORY_COLORS","EventTopicPill","topic","category","iconColor","shortTopic","jsxs","jsx","Radio"],"mappings":"8FAQA,MAAMA,EAA0C,CAC9C,KAAY,gBACZ,SAAY,cACZ,WAAY,iBACZ,SAAY,gBACZ,UAAY,kBACZ,MAAY,mBACZ,IAAY,gBACZ,UAAY,iBACd,EAMO,SAASC,EAAe,CAAE,MAAAC,GAA8B,CAC7D,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAAE,CAAC,EAC7BE,EAAYJ,EAAgBG,CAAQ,GAAK,uBACzCE,EAAaH,EAAM,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,EAEtD,OACEI,EAAAA,KAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAC,MAACC,GAAM,UAAW,wBAAwBJ,CAAS,GAAI,YAAa,IAAK,EACxEC,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"EventTopicPill-CnHFBglc.js","sources":["../../src/components/common/display/EventTopicPill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\n/**\n * Universal event topic display — Radio icon + monotype text.\n * Used everywhere an event subscription topic is rendered.\n * No border, no background — matches CronLabel's simplicity.\n */\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'text-blue-400',\n workflow: 'text-accent',\n escalation: 'text-amber-400',\n activity: 'text-cyan-400',\n knowledge: 'text-violet-400',\n agent: 'text-emerald-400',\n app: 'text-rose-400',\n milestone: 'text-violet-400',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const category = topic.split('.')[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n const shortTopic = topic.split('.').slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n"],"names":["CATEGORY_COLORS","EventTopicPill","topic","category","iconColor","shortTopic","jsxDEV","Radio"],"mappings":"uFAQA,MAAMA,EAA0C,CAC9C,KAAY,gBACZ,SAAY,cACZ,WAAY,iBACZ,SAAY,gBACZ,UAAY,kBACZ,MAAY,mBACZ,IAAY,gBACZ,UAAY,iBACd,EAMO,SAASC,EAAe,CAAE,MAAAC,GAA8B,CAC7D,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAAE,CAAC,EAC7BE,EAAYJ,EAAgBG,CAAQ,GAAK,uBACzCE,EAAaH,EAAM,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,EAEtD,OACEI,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,EAAAA,OAACC,GAAM,UAAW,wBAAwBH,CAAS,GAAI,YAAa,KAApE,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,EACxEC,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-4T7Z_gQ4.js";import{a as m}from"./vendor-query-DLp59M9_.js";function p({children:r,actions:t}){return e.jsxDEV("div",{className:"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50",children:e.jsxDEV("div",{className:"flex items-center gap-2 flex-wrap",children:[r,t&&e.jsxDEV("div",{className:"ml-auto flex items-center gap-2",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:13,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:11,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:10,columnNumber:5},this)}function x({label:r,value:t,onChange:l,options:n,required:i,placeholder:s}){return e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("select",{value:t,onChange:a=>l(a.target.value),className:"select text-[11px] py-1 px-2",children:[!i&&e.jsxDEV("option",{value:"",children:s||"All"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:38,columnNumber:23},this),n.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:40,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:33,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:31,columnNumber:5},this)}function b({label:r,value:t,onChange:l,placeholder:n}){const[i,s]=m.useState(t),a=m.useRef(void 0);m.useEffect(()=>{s(t)},[t]);const c=o=>{s(o),clearTimeout(a.current),a.current=setTimeout(()=>l(o),300)};return m.useEffect(()=>()=>clearTimeout(a.current),[]),e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:n,className:"input text-[11px] py-1 px-2 w-48 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:75,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:73,columnNumber:5},this)}export{p as F,b as a,x as b};
2
+ //# sourceMappingURL=FilterBar-TYiTtUgv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar-Ck4K4rzu.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxs","jsx","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"sDAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,aACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWE,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAF,CAAA,CAAQ,CAAA,CAAA,CACxE,CAAA,CACF,CAEJ,CAYO,SAASG,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACER,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,EAAM,EACzDH,EAAAA,KAAC,SAAA,CACC,MAAAI,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,MAAC,SAAA,CAAO,MAAM,GAAI,YAAe,MAAM,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,IAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,KAEjB,CACD,CAAA,CAAA,CAAA,CACH,EACF,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDf,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,EAAM,EAC3EF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,CAAA,CACZ,EACF,CAEJ"}
1
+ {"version":3,"file":"FilterBar-TYiTtUgv.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxDEV","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"uFAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,gBACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,OAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWC,EAAAA,OAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAD,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA0D,CAAA,CAAA,EAFxE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,CAEJ,CAYO,SAASE,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACEP,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,CAAA,EAAnD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACzDF,EAAAA,OAAC,SAAA,CACC,MAAAG,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAI,YAAe,OAAjC,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,OAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,MAAjB,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,CAAA,EAVH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAWA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDd,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,CAAA,EAArE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2E,EAC3EF,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,EALZ,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{k as Z,s as I,j as e,d as P,c as ee,N as se,J as ae}from"./index-4T7Z_gQ4.js";import{a as c}from"./vendor-query-DLp59M9_.js";import{b as oe}from"./workflows-BNbocg_9.js";import{u as te}from"./mcp-runs-CAiEr5Fc.js";import{a as re}from"./controlplane-0m_rA-UW.js";import{u as ie}from"./tasks-CL6Gv8jB.js";import{e as me,b as le,u as ne}from"./useEventHooks-C6c618cj.js";import{R as T}from"./RolePill-DrBZ7JJj.js";import{W as x}from"./WorkflowPill-B5B3yGlh.js";import{L as f}from"./ListToolbar-BO5Igi6v.js";import{E as ce}from"./EventTopicPill-CnHFBglc.js";import{t as z,a3 as p,L as B,W as M,C as Q,I as J,R as O,B as de,i as pe}from"./vendor-icons-D8-ZINAH.js";import{c as G,f as ue}from"./vendor-react-Co3Y8ikm.js";const he={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function U(a){return he[a]??"bg-text-tertiary"}let be=0;function Ne(a=5){const[o,t]=c.useState([]),[r,i]=c.useState(!1),n=c.useRef(null),m=c.useCallback(l=>{var d,N,v;if((d=l.type)!=null&&d.startsWith("mesh."))return;const b=l.activityName||l.workflowName||((N=l.data)==null?void 0:N.domain)||((v=l.workflowId)==null?void 0:v.slice(0,16))||"";t(D=>[{id:++be,type:l.type,timestamp:l.timestamp,label:b,data:l},...D].slice(0,a)),i(!0),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>i(!1),2e3)},[a]);return ee(`${se}.>`,m),{events:o,pulse:r}}function u({icon:a,color:o,docsHash:t,children:r,actions:i}){return e.jsxDEV("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(a,{className:`w-4.5 h-4.5 ${o||"text-accent/60"}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:66,columnNumber:9},this),e.jsxDEV("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:r},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:65,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[t&&e.jsxDEV("button",{onClick:()=>{window.location.hash=t},className:"text-text-quaternary hover:text-accent transition-colors",title:"Docs",children:e.jsxDEV(de,{className:"w-2.5 h-2.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:72,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:71,columnNumber:11},this),i]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:69,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:64,columnNumber:5},this)}function h({icon:a,text:o}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsxDEV(a,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:84,columnNumber:7},this),e.jsxDEV("p",{className:"text-xs text-text-quaternary",children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:85,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:83,columnNumber:5},this)}function xe(a,o=37){if(!a||a.length<=o)return a;const t=Math.floor((o-3)/2);return`${a.slice(0,t)}...${a.slice(-t)}`}function y({dot:a,pill:o,id:t,date:r,onClick:i}){return e.jsxDEV("button",{onClick:i,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxDEV("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${a}`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:108,columnNumber:9},this),e.jsxDEV("span",{className:"text-[12px] text-text-primary font-mono truncate max-w-[60%]",children:xe(t)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:109,columnNumber:9},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap",children:e.jsxDEV(P,{date:r},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:110,columnNumber:95},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:110,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:107,columnNumber:7},this),e.jsxDEV("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:112,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:106,columnNumber:5},this)}function g({to:a,icon:o,title:t}){const r=G();return e.jsxDEV("button",{onClick:()=>r(a),className:"text-text-quaternary hover:text-accent transition-colors",title:t,children:e.jsxDEV(o,{className:"w-2.5 h-2.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:125,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:120,columnNumber:5},this)}function X({appIds:a,selected:o,onSelect:t}){const[r,i]=c.useState(!1),n=c.useRef(null);return c.useEffect(()=>{if(!r)return;const m=l=>{n.current&&!n.current.contains(l.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[r]),a.length<=1?null:e.jsxDEV("div",{className:"relative mb-3 -mt-2",ref:n,children:[e.jsxDEV("button",{onClick:()=>i(m=>!m),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",children:[o,e.jsxDEV("svg",{className:`w-2.5 h-2.5 transition-transform ${r?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:159,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:158,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:153,columnNumber:7},this),r&&e.jsxDEV("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]",children:a.map(m=>e.jsxDEV("button",{onClick:()=>{t(m),i(!1)},className:`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${o===m?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:m},m,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:165,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:163,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:152,columnNumber:5},this)}function fe({event:a}){const[o,t]=c.useState(!1);return e.jsxDEV("div",{children:[e.jsxDEV("button",{onClick:()=>t(!o),className:"w-full text-left px-1 py-2 hover:bg-surface-hover/50 rounded-md transition-colors flex items-center gap-2",children:[e.jsxDEV(pe,{className:`w-2.5 h-2.5 text-text-quaternary shrink-0 transition-transform ${o?"rotate-0":"-rotate-90"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:188,columnNumber:9},this),e.jsxDEV(ce,{topic:a.type},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:189,columnNumber:9},this),e.jsxDEV("span",{className:"text-[11px] text-text-secondary font-mono truncate flex-1",children:a.label||"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:190,columnNumber:9},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary shrink-0",children:e.jsxDEV(P,{date:a.timestamp,format:"time"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:191,columnNumber:69},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:191,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:187,columnNumber:7},this),o&&e.jsxDEV("div",{className:"pl-5 pb-2",children:e.jsxDEV(ae,{data:a.data,defaultCollapsed:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:195,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:194,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:186,columnNumber:5},this)}function Se(){var $,q,A,F,L;const a=G(),{user:o}=Z(),[t,r]=ue(),i=t.get("pipelinenamespace")||"hmsh",n=t.get("durablenamespace")||"durable",m=c.useCallback((s,E)=>{r(Y=>{const W=new URLSearchParams(Y);return W.set(s,E),W},{replace:!1})},[r]);me(),le(),ne();const l=ie({limit:5}),b=oe({limit:5,sort_by:"updated_at",order:"desc",namespace:n}),{data:d}=re(),N=((d==null?void 0:d.apps)??[]).map(s=>s.appId),v=N,D=N,H=te({limit:5,app_id:i,sort_by:"updated_at",order:"desc"}),j=I({status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),V=I({assigned_to:o==null?void 0:o.userId,status:"pending",limit:5,sort_by:"updated_at",order:"desc"}),{events:w,pulse:K}=Ne(),k=(($=l.data)==null?void 0:$.processes)??[],_=((q=b.data)==null?void 0:q.jobs)??[],C=((A=H.data)==null?void 0:A.jobs)??[],S=((F=j.data)==null?void 0:F.escalations)??[],R=((L=V.data)==null?void 0:L.escalations)??[];return e.jsxDEV("div",{children:[e.jsxDEV("h1",{className:"text-3xl font-light text-text-primary mb-10",children:"Recent Activity"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:240,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-14",children:[e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:z,color:"text-emerald-400",docsHash:"#docs:dashboard.md:processes-overview",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(f,{onRefresh:()=>l.refetch(),isFetching:l.isFetching,apiPath:"/tasks/processes?limit=5"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:249,columnNumber:15},this),e.jsxDEV(g,{to:"/processes/all",icon:p,title:"All processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:250,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:248,columnNumber:13},this),children:"Certified Processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:247,columnNumber:11},this),e.jsxDEV("div",{className:"mb-3 -mt-2",children:e.jsxDEV("span",{className:"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest",children:"all namespaces"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:256,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:255,columnNumber:11},this),k.length===0?e.jsxDEV(h,{icon:z,text:"No recent processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:259,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-1",children:k.map(s=>e.jsxDEV(y,{dot:(s.task_count??0)>0&&(s.completed??0)>=(s.task_count??0)?"bg-status-success":(s.escalated??0)>0?"border border-status-error":"bg-status-active",pill:e.jsxDEV(e.Fragment,{children:(s.workflow_types??[s.workflow_type]).filter(Boolean).map(E=>e.jsxDEV(x,{type:E,size:"xs"},E,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:266,columnNumber:104},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:266,columnNumber:25},this),id:s.origin_id,date:s.last_activity??s.started_at,onClick:()=>a(`/processes/detail/${s.origin_id}`)},s.origin_id,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:263,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:261,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:246,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:B,color:"text-blue-400",docsHash:"#docs:dashboard.md:durable-executions",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(f,{onRefresh:()=>b.refetch(),isFetching:b.isFetching,apiPath:`/workflow-states/jobs?namespace=${n}&limit=5`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:280,columnNumber:15},this),e.jsxDEV(g,{to:"/workflows/executions",icon:p,title:"All durable executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:281,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:279,columnNumber:13},this),children:"Durable Executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:278,columnNumber:11},this),e.jsxDEV(X,{appIds:v,selected:n,onSelect:s=>m("durablenamespace",s)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:286,columnNumber:11},this),_.length===0?e.jsxDEV(h,{icon:B,text:"No recent executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:288,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-1",children:_.map(s=>e.jsxDEV(y,{dot:U(s.status),pill:e.jsxDEV(x,{type:s.entity||s.type||"workflow",size:"xs"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:295,columnNumber:25},this),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>a(`/workflows/executions/${s.workflow_id}`)},s.workflow_id,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:292,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:290,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:277,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:M,color:"text-violet-400",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(f,{onRefresh:()=>H.refetch(),isFetching:H.isFetching,apiPath:`/mcp-runs?app_id=${i}&limit=5`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:309,columnNumber:15},this),e.jsxDEV(g,{to:"/mcp/executions",icon:p,title:"All pipeline executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:310,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:308,columnNumber:13},this),children:"Pipeline Executions"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:307,columnNumber:11},this),e.jsxDEV(X,{appIds:D,selected:i,onSelect:s=>m("pipelinenamespace",s)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:315,columnNumber:11},this),C.length===0?e.jsxDEV(h,{icon:M,text:"No recent pipeline runs"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:317,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-1",children:C.map(s=>e.jsxDEV(y,{dot:U(s.status),pill:e.jsxDEV(x,{type:s.entity||s.workflow_name||"pipeline",variant:"pipeline",size:"xs"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:324,columnNumber:25},this),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>a(`/mcp/executions/${s.workflow_id}?namespace=${i}`)},s.workflow_id,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:321,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:319,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:306,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:243,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14",children:[e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:Q,color:"text-amber-400",docsHash:"#docs:dashboard.md:all-escalations",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(f,{onRefresh:()=>j.refetch(),isFetching:j.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=priority&order=asc"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:342,columnNumber:15},this),e.jsxDEV(g,{to:"/escalations/available",icon:p,title:"All available escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:343,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:341,columnNumber:13},this),children:"All Escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:340,columnNumber:11},this),S.length===0?e.jsxDEV(h,{icon:Q,text:"No pending escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:349,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-1",children:S.map(s=>e.jsxDEV("button",{onClick:()=>a(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxDEV("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:359,columnNumber:21},this),e.jsxDEV("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:360,columnNumber:21},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsxDEV(P,{date:s.updated_at??s.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:361,columnNumber:89},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:361,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:358,columnNumber:19},this),e.jsxDEV("div",{className:"flex items-center gap-2 pl-5",children:[e.jsxDEV(x,{type:s.type||"unknown",size:"xs"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:364,columnNumber:21},this),e.jsxDEV("span",{className:"flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:365,columnNumber:21},this),e.jsxDEV(T,{role:s.role},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:366,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:363,columnNumber:19},this)]},s.id,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:353,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:351,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:339,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:J,color:"text-orange-400",docsHash:"#docs:dashboard.md:escalations-overview",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(f,{onRefresh:()=>V.refetch(),isFetching:V.isFetching,apiPath:`/escalations?assigned_to=${(o==null?void 0:o.userId)??""}&status=pending&limit=5`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:378,columnNumber:15},this),e.jsxDEV(g,{to:"/escalations/queue",icon:p,title:"My escalation queue"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:379,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:377,columnNumber:13},this),children:"My Escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:376,columnNumber:11},this),R.length===0?e.jsxDEV(h,{icon:J,text:"No assigned escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:385,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-1",children:R.map(s=>e.jsxDEV("button",{onClick:()=>a(`/escalations/detail/${s.id}`),className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxDEV("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:395,columnNumber:21},this),e.jsxDEV("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:396,columnNumber:21},this),e.jsxDEV("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsxDEV(P,{date:s.updated_at??s.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:397,columnNumber:89},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:397,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:394,columnNumber:19},this),e.jsxDEV("div",{className:"flex items-center gap-2 pl-5",children:[e.jsxDEV(x,{type:s.type||"unknown",size:"xs"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:400,columnNumber:21},this),e.jsxDEV("span",{className:"flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:401,columnNumber:21},this),e.jsxDEV(T,{role:s.role},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:402,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:399,columnNumber:19},this)]},s.id,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:389,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:387,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:375,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV(u,{icon:O,color:"text-emerald-400",actions:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${K?"bg-emerald-400":"bg-zinc-600"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:415,columnNumber:17},this),e.jsxDEV("button",{onClick:()=>{const s=document.querySelector('[title="Fullscreen"]');s==null||s.click()},className:"text-text-quaternary hover:text-accent transition-colors",title:"View all events",children:e.jsxDEV(p,{className:"w-2.5 h-2.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:421,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:416,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:414,columnNumber:15},this),children:"Event Stream"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:412,columnNumber:11},this),w.length===0?e.jsxDEV(h,{icon:O,text:"Events appear here in real time"},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:429,columnNumber:13},this):e.jsxDEV("div",{className:"divide-y divide-surface-border/20",children:w.map(s=>e.jsxDEV(fe,{event:s},s.id,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:433,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:431,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:411,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:336,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/home/HomePage.tsx",lineNumber:239,columnNumber:5},this)}export{Se as HomePage};
2
+ //# sourceMappingURL=HomePage-fterfLKH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage-DVOi7rR1.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') || 'hmsh';\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","jsxs","jsx","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-fterfLKH.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') || 'hmsh';\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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"}
@@ -0,0 +1,2 @@
1
+ import{j as o,G as N}from"./index-4T7Z_gQ4.js";import{a as x}from"./vendor-query-DLp59M9_.js";import{K as c,aC as h,aD as f,ar as T}from"./vendor-icons-D8-ZINAH.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-BO5Igi6v.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-Bntl2hex.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","jsxs","Fragment","jsx","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,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAf,GACCe,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,QAASV,EAAe,UAAWM,EAAK,MAAM,eACnD,aAAW,MAAQI,EAAAA,IAACC,GAAM,UAAW,GAAGJ,CAAI,sBAAA,CAAwB,QAAMK,EAAA,CAAM,UAAWL,EAAM,CAAA,CACpG,EACAG,EAAAA,IAAC,UAAO,QAASR,EAAgB,UAAWI,EAAK,MAAM,kCACpD,SAAAZ,IAAW,aAAUiB,EAAA,CAAM,UAAW,GAAGJ,CAAI,sBAAA,CAAwB,EAAKG,EAAAA,IAACG,EAAA,CAAS,UAAWN,CAAA,CAAM,CAAA,CACxG,CAAA,EACF,EAEFG,EAAAA,IAAC,UAAO,QAASnB,EAAW,SAAUC,EAAY,UAAW,GAAGc,CAAG,uBAAwB,MAAM,UAC/F,SAAAI,MAACI,EAAA,CAAU,UAAW,GAAGP,CAAI,IAAIf,EAAa,eAAiB,EAAE,EAAA,CAAI,CAAA,CACvE,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"ListToolbar-BO5Igi6v.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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-4T7Z_gQ4.js";import{a as m}from"./vendor-query-DLp59M9_.js";import{u as T}from"./mcp-B5VQPoF3.js";import{u as L}from"./mcp-runs-CAiEr5Fc.js";import{u as P}from"./yaml-workflows-Cu1FUwrc.js";import{u as _}from"./namespaces-sVr5scma.js";import{P as R}from"./PageHeader-DF4BeEm4.js";import{S as N}from"./StatCard-PZQmmCHK.js";import{b as F,c as A}from"./vendor-icons-D8-ZINAH.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-BQokGg0z.js.map